From e7403c57a75579c2843d470bd69fc47648cac0c9 Mon Sep 17 00:00:00 2001
From: Tianshu Qiu <tian.shu.qiu@intel.com>
Date: Wed, 30 Oct 2019 10:03:39 +0800
Subject: [PATCH] intel:ipu6: Add initial code

Add initial code in src/platform2/camera/hal/intel/ipu6
1.HAL code
2.3a header file

Change-Id: Ie8fbf5df647e72c2733a67c07d82f9d565b17d1a
Signed-off-by: Liang Yang <liang.l.yang@intel.com>
Signed-off-by: Tianshu Qiu <tian.shu.qiu@intel.com>
---
 camera/hal/intel/ipu6/BUILD.gn                     |   400 +
 camera/hal/intel/ipu6/aal/Camera3AMetadata.cpp     |   142 +
 camera/hal/intel/ipu6/aal/Camera3AMetadata.h       |    50 +
 camera/hal/intel/ipu6/aal/Camera3HAL.cpp           |   282 +
 camera/hal/intel/ipu6/aal/Camera3HAL.h             |    69 +
 camera/hal/intel/ipu6/aal/Camera3HALModule.cpp     |   233 +
 camera/hal/intel/ipu6/aal/Camera3Stream.cpp        |   407 +
 camera/hal/intel/ipu6/aal/Camera3Stream.h          |   139 +
 camera/hal/intel/ipu6/aal/HALv3Interface.h         |    32 +
 camera/hal/intel/ipu6/aal/HALv3Utils.cpp           |   138 +
 camera/hal/intel/ipu6/aal/HALv3Utils.h             |    72 +
 camera/hal/intel/ipu6/aal/IntelAEStateMachine.cpp  |   304 +
 camera/hal/intel/ipu6/aal/IntelAEStateMachine.h    |   135 +
 camera/hal/intel/ipu6/aal/IntelAFStateMachine.cpp  |   442 +
 camera/hal/intel/ipu6/aal/IntelAFStateMachine.h    |   145 +
 camera/hal/intel/ipu6/aal/IntelAWBStateMachine.cpp |   227 +
 camera/hal/intel/ipu6/aal/IntelAWBStateMachine.h   |   131 +
 camera/hal/intel/ipu6/aal/MetadataConvert.cpp      |  2166 +++
 camera/hal/intel/ipu6/aal/MetadataConvert.h        |   118 +
 camera/hal/intel/ipu6/aal/PostProcessor.cpp        |   196 +
 camera/hal/intel/ipu6/aal/PostProcessor.h          |    58 +
 camera/hal/intel/ipu6/aal/RequestManager.cpp       |   561 +
 camera/hal/intel/ipu6/aal/RequestManager.h         |   103 +
 camera/hal/intel/ipu6/aal/ResultProcessor.cpp      |   462 +
 camera/hal/intel/ipu6/aal/ResultProcessor.h        |   178 +
 camera/hal/intel/ipu6/aal/chrome/HALv3Header.h     |    20 +
 camera/hal/intel/ipu6/include/api/ICamera.h        |   574 +
 camera/hal/intel/ipu6/include/api/Parameters.h     |  2559 +++
 camera/hal/intel/ipu6/include/cameranvm.h          |   112 +
 camera/hal/intel/ipu6/include/gcss/GCSSParser.h    |    64 +
 camera/hal/intel/ipu6/include/gcss/gcss.h          |   279 +
 .../hal/intel/ipu6/include/gcss/gcss_aic_utils.h   |   325 +
 .../hal/intel/ipu6/include/gcss/gcss_isp_utils.h   |   148 +
 camera/hal/intel/ipu6/include/gcss/gcss_item.h     |   267 +
 camera/hal/intel/ipu6/include/gcss/gcss_keys.h     |   139 +
 camera/hal/intel/ipu6/include/gcss/gcss_utils.h    |   637 +
 .../intel/ipu6/include/gcss/graph_query_manager.h  |   152 +
 camera/hal/intel/ipu6/include/gcss/graph_utils.h   |   448 +
 .../hal/intel/ipu6/include/ia_cipf/ia_cipf_types.h |   409 +
 .../intel/ipu6/include/ia_cipf_css/ia_cipf_css.h   |  1009 ++
 camera/hal/intel/ipu6/include/ia_imaging/ia_aec.h  |    81 +
 .../intel/ipu6/include/ia_imaging/ia_aec_types.h   |   143 +
 .../intel/ipu6/include/ia_imaging/ia_aic_myriad.h  |   181 +
 camera/hal/intel/ipu6/include/ia_imaging/ia_aiq.h  |   621 +
 .../ipu6/include/ia_imaging/ia_aiq_deprecated.h    |   266 +
 .../intel/ipu6/include/ia_imaging/ia_aiq_types.h   |   909 ++
 .../intel/ipu6/include/ia_imaging/ia_aiqb_encode.h |    70 +
 .../intel/ipu6/include/ia_imaging/ia_aiqb_parser.h |   123 +
 .../hal/intel/ipu6/include/ia_imaging/ia_alloc.h   |   121 +
 .../hal/intel/ipu6/include/ia_imaging/ia_bcomp.h   |    89 +
 .../intel/ipu6/include/ia_imaging/ia_bcomp_types.h |    68 +
 camera/hal/intel/ipu6/include/ia_imaging/ia_ccat.h |   545 +
 .../intel/ipu6/include/ia_imaging/ia_ccat_types.h  |   225 +
 .../intel/ipu6/include/ia_imaging/ia_cmc_parser.h  |    47 +
 .../include/ia_imaging/ia_cmc_parser_deprecated.h  |    42 +
 .../intel/ipu6/include/ia_imaging/ia_cmc_types.h   |  1468 ++
 .../ipu6/include/ia_imaging/ia_configuration.h     |    61 +
 .../intel/ipu6/include/ia_imaging/ia_coordinate.h  |   149 +
 camera/hal/intel/ipu6/include/ia_imaging/ia_dpc.h  |   133 +
 camera/hal/intel/ipu6/include/ia_imaging/ia_dvs.h  |   286 +
 .../ipu6/include/ia_imaging/ia_dvs_deprecated.h    |    96 +
 .../intel/ipu6/include/ia_imaging/ia_dvs_types.h   |   304 +
 .../intel/ipu6/include/ia_imaging/ia_emd_decoder.h |    92 +
 .../intel/ipu6/include/ia_imaging/ia_emd_types.h   |   194 +
 camera/hal/intel/ipu6/include/ia_imaging/ia_exc.h  |   153 +
 .../ipu6/include/ia_imaging/ia_exc_deprecated.h    |   171 +
 .../intel/ipu6/include/ia_imaging/ia_intrinsics.h  |   138 +
 .../ipu6/include/ia_imaging/ia_intrinsics_types.h  |    58 +
 .../hal/intel/ipu6/include/ia_imaging/ia_isp_bxt.h |   916 ++
 .../include/ia_imaging/ia_isp_bxt_deprecated.h     |   641 +
 .../ia_imaging/ia_isp_bxt_statistics_types.h       |   192 +
 .../ipu6/include/ia_imaging/ia_isp_bxt_types.h     |   192 +
 .../intel/ipu6/include/ia_imaging/ia_isp_types.h   |    97 +
 camera/hal/intel/ipu6/include/ia_imaging/ia_lard.h |   150 +
 camera/hal/intel/ipu6/include/ia_imaging/ia_log.h  |    93 +
 camera/hal/intel/ipu6/include/ia_imaging/ia_ltm.h  |   146 +
 .../ipu6/include/ia_imaging/ia_ltm_deprecated.h    |   103 +
 .../intel/ipu6/include/ia_imaging/ia_ltm_types.h   |   151 +
 .../intel/ipu6/include/ia_imaging/ia_me_corner.h   |   142 +
 .../intel/ipu6/include/ia_imaging/ia_mkn_decoder.h |   138 +
 .../intel/ipu6/include/ia_imaging/ia_mkn_encoder.h |   167 +
 .../intel/ipu6/include/ia_imaging/ia_mkn_types.h   |   165 +
 camera/hal/intel/ipu6/include/ia_imaging/ia_nvm.h  |   172 +
 camera/hal/intel/ipu6/include/ia_imaging/ia_ob.h   |    92 +
 camera/hal/intel/ipu6/include/ia_imaging/ia_p2p.h  |  1979 +++
 .../intel/ipu6/include/ia_imaging/ia_p2p_types.h   |   221 +
 .../intel/ipu6/include/ia_imaging/ia_pal_exports.h |    27 +
 .../ipu6/include/ia_imaging/ia_pal_types_isp.h     |    43 +
 .../ia_imaging/ia_pal_types_isp_ids_autogen.h      |   360 +
 .../ia_pal_types_isp_parameters_autogen.h          | 16093 +++++++++++++++++++
 .../ipu6/include/ia_imaging/ia_statistics_types.h  |   111 +
 .../hal/intel/ipu6/include/ia_imaging/ia_types.h   |   309 +
 camera/hal/intel/ipu6/include/ia_imaging/ia_view.h |   163 +
 .../intel/ipu6/include/ia_imaging/ia_view_types.h  |   220 +
 .../ipu6/include/ia_imaging/pvl_blink_detection.h  |   213 +
 .../hal/intel/ipu6/include/ia_imaging/pvl_config.h |    88 +
 .../ipu6/include/ia_imaging/pvl_eye_detection.h    |   156 +
 .../ipu6/include/ia_imaging/pvl_face_detection.h   |   270 +
 .../ipu6/include/ia_imaging/pvl_face_recognition.h |   473 +
 .../ipu6/include/ia_imaging/pvl_image_montage.h    |   229 +
 .../include/ia_imaging/pvl_landmark_detection.h    |   135 +
 .../ipu6/include/ia_imaging/pvl_mouth_detection.h  |   154 +
 .../ipu6/include/ia_imaging/pvl_object_tracking.h  |   238 +
 .../intel/ipu6/include/ia_imaging/pvl_panorama.h   |   262 +
 .../include/ia_imaging/pvl_pedestrian_detection.h  |   222 +
 .../include/ia_imaging/pvl_perspective_control.h   |   408 +
 .../ipu6/include/ia_imaging/pvl_smile_detection.h  |   242 +
 .../hal/intel/ipu6/include/ia_imaging/pvl_types.h  |   172 +
 camera/hal/intel/ipu6/include/ia_tools/css_types.h |    57 +
 camera/hal/intel/ipu6/include/ia_tools/ia_list.h   |   111 +
 camera/hal/intel/ipu6/include/linux/ipu-isys.h     |    51 +
 camera/hal/intel/ipu6/include/utils/ScopedAtrace.h |    73 +
 .../intel/ipu6/modules/algowrapper/IntelAiq.cpp    |   136 +
 .../hal/intel/ipu6/modules/algowrapper/IntelAiq.h  |    53 +
 .../intel/ipu6/modules/algowrapper/IntelCmc.cpp    |    63 +
 .../hal/intel/ipu6/modules/algowrapper/IntelCmc.h  |    37 +
 .../intel/ipu6/modules/algowrapper/IntelDvs.cpp    |   190 +
 .../hal/intel/ipu6/modules/algowrapper/IntelDvs.h  |    57 +
 .../modules/algowrapper/IntelFaceDetection.cpp     |   149 +
 .../ipu6/modules/algowrapper/IntelFaceDetection.h  |    44 +
 .../modules/algowrapper/IntelIspParamAdaptor.cpp   |   139 +
 .../modules/algowrapper/IntelIspParamAdaptor.h     |    45 +
 .../intel/ipu6/modules/algowrapper/IntelLard.cpp   |    71 +
 .../hal/intel/ipu6/modules/algowrapper/IntelLard.h |    34 +
 .../intel/ipu6/modules/algowrapper/IntelLtm.cpp    |    65 +
 .../hal/intel/ipu6/modules/algowrapper/IntelLtm.h  |    33 +
 .../intel/ipu6/modules/algowrapper/IntelMkn.cpp    |    70 +
 .../hal/intel/ipu6/modules/algowrapper/IntelMkn.h  |    36 +
 .../ipu6/modules/algowrapper/IntelPGParam.cpp      |  1266 ++
 .../intel/ipu6/modules/algowrapper/IntelPGParam.h  |   247 +
 .../intel/ipu6/modules/algowrapper/StatsTypes.h    |    46 +
 .../modules/algowrapper/graph/GraphConfigImpl.cpp  |   876 +
 .../modules/algowrapper/graph/GraphConfigImpl.h    |   185 +
 .../modules/algowrapper/graph/GraphConfigPipe.cpp  |  2035 +++
 .../modules/algowrapper/graph/GraphConfigPipe.h    |   326 +
 .../intel/ipu6/modules/ia_cipr/include/css_types.h |    61 +
 .../intel/ipu6/modules/ia_cipr/include/ia_cipr.h   |   142 +
 .../ipu6/modules/ia_cipr/include/ia_cipr_alloc.h   |   152 +
 .../ipu6/modules/ia_cipr/include/ia_cipr_memory.h  |   210 +
 .../ia_cipr/include/ia_cipr_memory_device.h        |    56 +
 .../ipu6/modules/ia_cipr/include/ia_cipr_psys.h    |   495 +
 .../intel/ipu6/modules/ia_cipr/include/ipu-psys.h  |   112 +
 .../ia_cipr/src/common/ia_cipr_memory_common.cpp   |   511 +
 .../ia_cipr/src/common/ia_cipr_memory_common.h     |    34 +
 .../ia_cipr/src/common/ia_cipr_memory_device_ops.h |    38 +
 .../ipu6/modules/ia_cipr/src/common/ia_list.cpp    |   118 +
 .../ipu6/modules/ia_cipr/src/common/ia_list.h      |   111 +
 .../modules/ia_cipr/src/linux/ia_cipr_alloc.cpp    |    99 +
 .../modules/ia_cipr/src/linux/ia_cipr_psys.cpp     |   778 +
 .../modules/ia_css/ipu6/include/assert_support.h   |   210 +
 .../modules/ia_css/ipu6/include/cpu_mem_support.h  |   239 +
 .../modules/ia_css/ipu6/include/error_support.h    |   112 +
 .../modules/ia_css/ipu6/include/frame_support.h    |    63 +
 .../ia_css/ipu6/include/ia_css_base_types.h        |    55 +
 .../ipu6/include/ia_css_isa_parameter_defs.h       |   789 +
 .../ipu6/include/ia_css_isa_parameter_defs_dep.h   |   580 +
 .../ia_css/ipu6/include/ia_css_kernel_bitmap.h     |   262 +
 .../ipu6/include/ia_css_kernel_bitmap_impl.h       |   340 +
 .../include/ia_css_kernel_bitmap_storage_class.h   |    30 +
 .../ipu6/include/ia_css_kernel_user_param_types.h  |    88 +
 .../ipu6/include/ia_css_param_storage_class.h      |    30 +
 .../ipu6/include/ia_css_program_group_data.h       |   449 +
 .../ipu6/include/ia_css_program_group_data_defs.h  |   244 +
 .../ipu6/include/ia_css_program_group_data_impl.h  |   461 +
 .../ipu6/include/ia_css_program_group_param.h      |   295 +
 .../ipu6/include/ia_css_program_group_param.sim.h  |   155 +
 .../include/ia_css_program_group_param_private.h   |    85 +
 .../include/ia_css_program_group_param_types.h     |    66 +
 .../ia_css/ipu6/include/ia_css_psys_buffer_set.h   |   290 +
 .../ipu6/include/ia_css_psys_data_storage_class.h  |    30 +
 .../ia_css/ipu6/include/ia_css_psys_data_trace.h   |   104 +
 .../include/ia_css_psys_dynamic_storage_class.h    |    30 +
 .../ipu6/include/ia_css_psys_dynamic_trace.h       |   105 +
 .../ia_css/ipu6/include/ia_css_psys_kernel_trace.h |   105 +
 .../ipu6/include/ia_css_psys_manifest_types.h      |   108 +
 .../ia_css/ipu6/include/ia_css_psys_param_trace.h  |   104 +
 .../ipu6/include/ia_css_psys_private_pg_data.h     |    53 +
 .../ia_css/ipu6/include/ia_css_psys_process.h      |   395 +
 .../ipu6/include/ia_css_psys_process.hsys.kernel.h |   159 +
 .../ipu6/include/ia_css_psys_process.hsys.user.h   |    94 +
 .../ia_css/ipu6/include/ia_css_psys_process.psys.h |    54 +
 .../ipu6/include/ia_css_psys_process_group.h       |   487 +
 .../ia_css_psys_process_group.hsys.kernel.h        |   379 +
 .../include/ia_css_psys_process_group.hsys.user.h  |   224 +
 .../ipu6/include/ia_css_psys_process_group.psys.h  |    61 +
 .../include/ia_css_psys_process_group_cmd_impl.h   |   280 +
 .../ipu6/include/ia_css_psys_process_group_impl.h  |  1846 +++
 .../ia_css/ipu6/include/ia_css_psys_process_impl.h |   694 +
 .../include/ia_css_psys_process_private_types.h    |   135 +
 .../ipu6/include/ia_css_psys_process_types.h       |    98 +
 .../include/ia_css_psys_program_group_manifest.h   |   320 +
 .../ia_css_psys_program_group_manifest.hsys.user.h |    78 +
 .../ia_css_psys_program_group_manifest.sim.h       |   131 +
 .../ia_css_psys_program_group_manifest_impl.h      |   417 +
 .../include/ia_css_psys_program_group_private.h    |   278 +
 .../ipu6/include/ia_css_psys_program_manifest.h    |   679 +
 .../ia_css_psys_program_manifest.hsys.kernel.h     |   105 +
 .../ia_css_psys_program_manifest.hsys.user.h       |    41 +
 .../include/ia_css_psys_program_manifest.sim.h     |    65 +
 .../include/ia_css_psys_program_manifest_impl.h    |   577 +
 .../ipu6/include/ia_css_psys_sim_storage_class.h   |    30 +
 .../ia_css/ipu6/include/ia_css_psys_sim_trace.h    |    97 +
 .../include/ia_css_psys_static_storage_class.h     |    30 +
 .../ia_css/ipu6/include/ia_css_psys_static_trace.h |   105 +
 .../ia_css/ipu6/include/ia_css_psys_terminal.h     |   403 +
 .../ipu6/include/ia_css_psys_terminal.hsys.user.h  |   257 +
 .../ipu6/include/ia_css_psys_terminal_impl.h       |  2053 +++
 .../ipu6/include/ia_css_psys_terminal_manifest.h   |   621 +
 .../ia_css_psys_terminal_manifest.hsys.user.h      |    40 +
 .../include/ia_css_psys_terminal_manifest.sim.h    |    50 +
 .../include/ia_css_psys_terminal_manifest_impl.h   |   745 +
 .../include/ia_css_psys_terminal_private_types.h   |   102 +
 .../ia_css/ipu6/include/ia_css_psys_transport.h    |    96 +
 .../ipu6/include/ia_css_psys_transport_dep.h       |    66 +
 .../modules/ia_css/ipu6/include/ia_css_psysapi.h   |    25 +
 .../ipu6/include/ia_css_psysapi_fw_version.h       |    35 +
 .../ia_css/ipu6/include/ia_css_psysapi_trace.h     |    80 +
 .../ipu6/modules/ia_css/ipu6/include/ia_css_rbm.h  |   199 +
 .../modules/ia_css/ipu6/include/ia_css_rbm_impl.h  |   410 +
 .../ia_css/ipu6/include/ia_css_rbm_manifest.h      |   146 +
 .../ipu6/include/ia_css_rbm_manifest_types.h       |    96 +
 .../ia_css/ipu6/include/ia_css_rbm_storage_class.h |    38 +
 .../modules/ia_css/ipu6/include/ia_css_rbm_trace.h |    79 +
 .../modules/ia_css/ipu6/include/ia_css_terminal.h  |   187 +
 .../ipu6/include/ia_css_terminal_base_types.h      |    53 +
 .../ia_css/ipu6/include/ia_css_terminal_defs.h     |   209 +
 .../ia_css/ipu6/include/ia_css_terminal_impl.h     |   497 +
 .../ia_css/ipu6/include/ia_css_terminal_manifest.h |   233 +
 .../include/ia_css_terminal_manifest_base_types.h  |    75 +
 .../ipu6/include/ia_css_terminal_manifest_impl.h   |   391 +
 .../ipu6/include/ia_css_terminal_manifest_types.h  |   349 +
 .../ia_css/ipu6/include/ia_css_terminal_types.h    |   477 +
 .../modules/ia_css/ipu6/include/ia_css_trace.h     |  1002 ++
 .../ia_css/ipu6/include/ipu_device_acb_devices.h   |    58 +
 .../ia_css/ipu6/include/ipu_device_gp_devices.h    |   205 +
 .../modules/ia_css/ipu6/include/math_support.h     |   328 +
 .../modules/ia_css/ipu6/include/misc_support.h     |    78 +
 .../ipu6/include/pg_control_init_framework.h       |    78 +
 .../modules/ia_css/ipu6/include/platform_support.h |   194 +
 .../modules/ia_css/ipu6/include/print_support.h    |   121 +
 .../ia_css/ipu6/include/psys_system_global_impl.h  |   504 +
 .../modules/ia_css/ipu6/include/storage_class.h    |    55 +
 .../modules/ia_css/ipu6/include/type_support.h     |    82 +
 .../ia_css/ipu6/include/vied_nci_acb_route_type.h  |    41 +
 .../ipu6/include/vied_nci_psys_resource_model.h    |   380 +
 .../ipu6/include/vied_nci_psys_system_global.h     |   186 +
 .../modules/ia_css/ipu6/src/ia_css_kernel_bitmap.c |   151 +
 .../ia_css/ipu6/src/ia_css_program_group_data.c    |    28 +
 .../ia_css/ipu6/src/ia_css_program_group_param.c   |   769 +
 .../modules/ia_css/ipu6/src/ia_css_psys_process.c  |  1038 ++
 .../ia_css/ipu6/src/ia_css_psys_process_group.c    |   826 +
 .../ipu6/src/ia_css_psys_process_group_cmd_impl.c  |   137 +
 .../ipu6/src/ia_css_psys_program_group_manifest.c  |  1081 ++
 .../ia_css/ipu6/src/ia_css_psys_program_manifest.c |   972 ++
 .../modules/ia_css/ipu6/src/ia_css_psys_terminal.c |   534 +
 .../ipu6/src/ia_css_psys_terminal_manifest.c       |   776 +
 .../ipu6/modules/ia_css/ipu6/src/ia_css_rbm.c      |    19 +
 .../ipu6/modules/ia_css/ipu6/src/ia_css_terminal.c |    22 +
 .../ia_css/ipu6/src/ia_css_terminal_manifest.c     |    22 +
 .../modules/ia_css/ipu6/src/vied_nci_psys_system.c |    28 +
 .../modules/ia_css/ipu6se/include/assert_support.h |   210 +
 .../ia_css/ipu6se/include/cpu_mem_support.h        |   239 +
 .../modules/ia_css/ipu6se/include/error_support.h  |   112 +
 .../modules/ia_css/ipu6se/include/frame_support.h  |    63 +
 .../ia_css/ipu6se/include/ia_css_base_types.h      |    55 +
 .../ipu6se/include/ia_css_isa_parameter_defs.h     |   789 +
 .../ipu6se/include/ia_css_isa_parameter_defs_dep.h |   580 +
 .../ia_css/ipu6se/include/ia_css_kernel_bitmap.h   |   262 +
 .../ipu6se/include/ia_css_kernel_bitmap_impl.h     |   340 +
 .../include/ia_css_kernel_bitmap_storage_class.h   |    30 +
 .../include/ia_css_kernel_user_param_types.h       |    88 +
 .../ipu6se/include/ia_css_param_storage_class.h    |    30 +
 .../ipu6se/include/ia_css_program_group_data.h     |   449 +
 .../include/ia_css_program_group_data_defs.h       |   244 +
 .../include/ia_css_program_group_data_impl.h       |   461 +
 .../ipu6se/include/ia_css_program_group_param.h    |   295 +
 .../include/ia_css_program_group_param.sim.h       |   155 +
 .../include/ia_css_program_group_param_private.h   |    85 +
 .../include/ia_css_program_group_param_types.h     |    66 +
 .../ia_css/ipu6se/include/ia_css_psys_buffer_set.h |   290 +
 .../include/ia_css_psys_data_storage_class.h       |    30 +
 .../ia_css/ipu6se/include/ia_css_psys_data_trace.h |   104 +
 .../include/ia_css_psys_dynamic_storage_class.h    |    30 +
 .../ipu6se/include/ia_css_psys_dynamic_trace.h     |   105 +
 .../ipu6se/include/ia_css_psys_kernel_trace.h      |   105 +
 .../ipu6se/include/ia_css_psys_manifest_types.h    |   108 +
 .../ipu6se/include/ia_css_psys_param_trace.h       |   104 +
 .../ipu6se/include/ia_css_psys_private_pg_data.h   |    53 +
 .../ia_css/ipu6se/include/ia_css_psys_process.h    |   395 +
 .../include/ia_css_psys_process.hsys.kernel.h      |   159 +
 .../ipu6se/include/ia_css_psys_process.hsys.user.h |    94 +
 .../ipu6se/include/ia_css_psys_process.psys.h      |    54 +
 .../ipu6se/include/ia_css_psys_process_group.h     |   487 +
 .../ia_css_psys_process_group.hsys.kernel.h        |   379 +
 .../include/ia_css_psys_process_group.hsys.user.h  |   224 +
 .../include/ia_css_psys_process_group.psys.h       |    61 +
 .../include/ia_css_psys_process_group_cmd_impl.h   |   280 +
 .../include/ia_css_psys_process_group_impl.h       |  1846 +++
 .../ipu6se/include/ia_css_psys_process_impl.h      |   694 +
 .../include/ia_css_psys_process_private_types.h    |   135 +
 .../ipu6se/include/ia_css_psys_process_types.h     |    98 +
 .../include/ia_css_psys_program_group_manifest.h   |   320 +
 .../ia_css_psys_program_group_manifest.hsys.user.h |    78 +
 .../ia_css_psys_program_group_manifest.sim.h       |   131 +
 .../ia_css_psys_program_group_manifest_impl.h      |   417 +
 .../include/ia_css_psys_program_group_private.h    |   278 +
 .../ipu6se/include/ia_css_psys_program_manifest.h  |   679 +
 .../ia_css_psys_program_manifest.hsys.kernel.h     |   105 +
 .../ia_css_psys_program_manifest.hsys.user.h       |    41 +
 .../include/ia_css_psys_program_manifest.sim.h     |    65 +
 .../include/ia_css_psys_program_manifest_impl.h    |   577 +
 .../ipu6se/include/ia_css_psys_sim_storage_class.h |    30 +
 .../ia_css/ipu6se/include/ia_css_psys_sim_trace.h  |    97 +
 .../include/ia_css_psys_static_storage_class.h     |    30 +
 .../ipu6se/include/ia_css_psys_static_trace.h      |   105 +
 .../ia_css/ipu6se/include/ia_css_psys_terminal.h   |   403 +
 .../include/ia_css_psys_terminal.hsys.user.h       |   257 +
 .../ipu6se/include/ia_css_psys_terminal_impl.h     |  2053 +++
 .../ipu6se/include/ia_css_psys_terminal_manifest.h |   621 +
 .../ia_css_psys_terminal_manifest.hsys.user.h      |    40 +
 .../include/ia_css_psys_terminal_manifest.sim.h    |    50 +
 .../include/ia_css_psys_terminal_manifest_impl.h   |   745 +
 .../include/ia_css_psys_terminal_private_types.h   |   102 +
 .../ia_css/ipu6se/include/ia_css_psys_transport.h  |    96 +
 .../ipu6se/include/ia_css_psys_transport_dep.h     |    47 +
 .../modules/ia_css/ipu6se/include/ia_css_psysapi.h |    25 +
 .../ipu6se/include/ia_css_psysapi_fw_version.h     |    35 +
 .../ia_css/ipu6se/include/ia_css_psysapi_trace.h   |    80 +
 .../modules/ia_css/ipu6se/include/ia_css_rbm.h     |   199 +
 .../ia_css/ipu6se/include/ia_css_rbm_impl.h        |   410 +
 .../ia_css/ipu6se/include/ia_css_rbm_manifest.h    |   146 +
 .../ipu6se/include/ia_css_rbm_manifest_types.h     |    96 +
 .../ipu6se/include/ia_css_rbm_storage_class.h      |    38 +
 .../ia_css/ipu6se/include/ia_css_rbm_trace.h       |    79 +
 .../ia_css/ipu6se/include/ia_css_terminal.h        |   187 +
 .../ipu6se/include/ia_css_terminal_base_types.h    |    53 +
 .../ia_css/ipu6se/include/ia_css_terminal_defs.h   |   209 +
 .../ia_css/ipu6se/include/ia_css_terminal_impl.h   |   497 +
 .../ipu6se/include/ia_css_terminal_manifest.h      |   233 +
 .../include/ia_css_terminal_manifest_base_types.h  |    75 +
 .../ipu6se/include/ia_css_terminal_manifest_impl.h |   391 +
 .../include/ia_css_terminal_manifest_types.h       |   349 +
 .../ia_css/ipu6se/include/ia_css_terminal_types.h  |   477 +
 .../modules/ia_css/ipu6se/include/ia_css_trace.h   |  1002 ++
 .../ia_css/ipu6se/include/ipu_device_acb_devices.h |    39 +
 .../ia_css/ipu6se/include/ipu_device_gp_devices.h  |   195 +
 .../modules/ia_css/ipu6se/include/math_support.h   |   328 +
 .../modules/ia_css/ipu6se/include/misc_support.h   |    78 +
 .../ipu6se/include/pg_control_init_framework.h     |    78 +
 .../ia_css/ipu6se/include/platform_support.h       |   194 +
 .../modules/ia_css/ipu6se/include/print_support.h  |   121 +
 .../ipu6se/include/psys_system_global_impl.h       |   504 +
 .../modules/ia_css/ipu6se/include/storage_class.h  |    55 +
 .../modules/ia_css/ipu6se/include/type_support.h   |    82 +
 .../ipu6se/include/vied_nci_acb_route_type.h       |    41 +
 .../ipu6se/include/vied_nci_psys_resource_model.h  |   342 +
 .../ipu6se/include/vied_nci_psys_system_global.h   |   186 +
 .../ia_css/ipu6se/src/ia_css_kernel_bitmap.c       |   151 +
 .../ia_css/ipu6se/src/ia_css_program_group_data.c  |    28 +
 .../ia_css/ipu6se/src/ia_css_program_group_param.c |   769 +
 .../ia_css/ipu6se/src/ia_css_psys_process.c        |  1038 ++
 .../ia_css/ipu6se/src/ia_css_psys_process_group.c  |   826 +
 .../src/ia_css_psys_process_group_cmd_impl.c       |   137 +
 .../src/ia_css_psys_program_group_manifest.c       |  1081 ++
 .../ipu6se/src/ia_css_psys_program_manifest.c      |   972 ++
 .../ia_css/ipu6se/src/ia_css_psys_terminal.c       |   534 +
 .../ipu6se/src/ia_css_psys_terminal_manifest.c     |   776 +
 .../ipu6/modules/ia_css/ipu6se/src/ia_css_rbm.c    |    19 +
 .../modules/ia_css/ipu6se/src/ia_css_terminal.c    |    22 +
 .../ia_css/ipu6se/src/ia_css_terminal_manifest.c   |    22 +
 .../ia_css/ipu6se/src/vied_nci_psys_system.c       |    28 +
 .../ipu6/modules/memory/Camera3BufferPool.cpp      |   133 +
 .../intel/ipu6/modules/memory/Camera3BufferPool.h  |    51 +
 .../ipu6/modules/memory/chrome/Camera3Buffer.cpp   |   555 +
 .../ipu6/modules/memory/chrome/Camera3Buffer.h     |   169 +
 .../intel/ipu6/modules/sandboxing/IPCCommon.cpp    |   108 +
 .../hal/intel/ipu6/modules/sandboxing/IPCCommon.h  |   112 +
 .../ipu6/modules/sandboxing/IPCGraphConfig.cpp     |   495 +
 .../intel/ipu6/modules/sandboxing/IPCGraphConfig.h |   171 +
 .../intel/ipu6/modules/sandboxing/IPCIntelAiq.cpp  |  1167 ++
 .../intel/ipu6/modules/sandboxing/IPCIntelAiq.h    |   367 +
 .../intel/ipu6/modules/sandboxing/IPCIntelCmc.cpp  |   259 +
 .../intel/ipu6/modules/sandboxing/IPCIntelCmc.h    |    96 +
 .../intel/ipu6/modules/sandboxing/IPCIntelDvs.cpp  |   724 +
 .../intel/ipu6/modules/sandboxing/IPCIntelDvs.h    |   247 +
 .../intel/ipu6/modules/sandboxing/IPCIntelFD.cpp   |    63 +
 .../hal/intel/ipu6/modules/sandboxing/IPCIntelFD.h |    32 +
 .../intel/ipu6/modules/sandboxing/IPCIntelLard.cpp |   298 +
 .../intel/ipu6/modules/sandboxing/IPCIntelLard.h   |   103 +
 .../intel/ipu6/modules/sandboxing/IPCIntelLtm.cpp  |   337 +
 .../intel/ipu6/modules/sandboxing/IPCIntelLtm.h    |   118 +
 .../intel/ipu6/modules/sandboxing/IPCIntelMkn.cpp  |    81 +
 .../intel/ipu6/modules/sandboxing/IPCIntelMkn.h    |    64 +
 .../ipu6/modules/sandboxing/IPCIntelPGParam.cpp    |   478 +
 .../ipu6/modules/sandboxing/IPCIntelPGParam.h      |   160 +
 .../ipu6/modules/sandboxing/IPCIspParamAdaptor.cpp |   558 +
 .../ipu6/modules/sandboxing/IPCIspParamAdaptor.h   |   170 +
 .../modules/sandboxing/client/GraphConfigImpl.cpp  |   189 +
 .../modules/sandboxing/client/GraphConfigImpl.h    |    78 +
 .../ipu6/modules/sandboxing/client/IntelAiq.cpp    |   317 +
 .../ipu6/modules/sandboxing/client/IntelAiq.h      |    74 +
 .../modules/sandboxing/client/IntelAlgoClient.cpp  |   385 +
 .../modules/sandboxing/client/IntelAlgoClient.h    |   116 +
 .../modules/sandboxing/client/IntelAlgoCommon.cpp  |   125 +
 .../modules/sandboxing/client/IntelAlgoCommon.h    |    67 +
 .../ipu6/modules/sandboxing/client/IntelCmc.cpp    |   108 +
 .../ipu6/modules/sandboxing/client/IntelCmc.h      |    58 +
 .../ipu6/modules/sandboxing/client/IntelDvs.cpp    |   356 +
 .../ipu6/modules/sandboxing/client/IntelDvs.h      |    79 +
 .../sandboxing/client/IntelFaceDetection.cpp       |   121 +
 .../modules/sandboxing/client/IntelFaceDetection.h |    48 +
 .../sandboxing/client/IntelIspParamAdaptor.cpp     |   197 +
 .../sandboxing/client/IntelIspParamAdaptor.h       |    59 +
 .../ipu6/modules/sandboxing/client/IntelLard.cpp   |   138 +
 .../ipu6/modules/sandboxing/client/IntelLard.h     |    50 +
 .../ipu6/modules/sandboxing/client/IntelLtm.cpp    |   136 +
 .../ipu6/modules/sandboxing/client/IntelLtm.h      |    53 +
 .../ipu6/modules/sandboxing/client/IntelMkn.cpp    |   122 +
 .../ipu6/modules/sandboxing/client/IntelMkn.h      |    53 +
 .../modules/sandboxing/client/IntelPGParam.cpp     |   271 +
 .../ipu6/modules/sandboxing/client/IntelPGParam.h  |    69 +
 .../sandboxing/server/GraphConfigServer.cpp        |   164 +
 .../modules/sandboxing/server/GraphConfigServer.h  |    44 +
 .../modules/sandboxing/server/IntelAiqServer.cpp   |   337 +
 .../modules/sandboxing/server/IntelAiqServer.h     |    50 +
 .../modules/sandboxing/server/IntelAlgoServer.cpp  |   484 +
 .../modules/sandboxing/server/IntelAlgoServer.h    |   110 +
 .../modules/sandboxing/server/IntelCmcServer.cpp   |    92 +
 .../modules/sandboxing/server/IntelCmcServer.h     |    40 +
 .../modules/sandboxing/server/IntelDvsServer.cpp   |   317 +
 .../modules/sandboxing/server/IntelDvsServer.h     |    54 +
 .../modules/sandboxing/server/IntelFDServer.cpp    |    62 +
 .../ipu6/modules/sandboxing/server/IntelFDServer.h |    39 +
 .../modules/sandboxing/server/IntelLardServer.cpp  |   112 +
 .../modules/sandboxing/server/IntelLardServer.h    |    40 +
 .../modules/sandboxing/server/IntelLtmServer.cpp   |   108 +
 .../modules/sandboxing/server/IntelLtmServer.h     |    40 +
 .../modules/sandboxing/server/IntelMknServer.cpp   |   128 +
 .../modules/sandboxing/server/IntelMknServer.h     |    45 +
 .../sandboxing/server/IntelPGParamServer.cpp       |   215 +
 .../modules/sandboxing/server/IntelPGParamServer.h |    55 +
 .../sandboxing/server/IspParamAdaptorServer.cpp    |   158 +
 .../sandboxing/server/IspParamAdaptorServer.h      |    44 +
 camera/hal/intel/ipu6/src/3a/AiqCore.cpp           |   982 ++
 camera/hal/intel/ipu6/src/3a/AiqCore.h             |   213 +
 camera/hal/intel/ipu6/src/3a/AiqEngine.cpp         |   526 +
 camera/hal/intel/ipu6/src/3a/AiqEngine.h           |   151 +
 camera/hal/intel/ipu6/src/3a/AiqResult.cpp         |   176 +
 camera/hal/intel/ipu6/src/3a/AiqResult.h           |   106 +
 camera/hal/intel/ipu6/src/3a/AiqResultStorage.cpp  |   286 +
 camera/hal/intel/ipu6/src/3a/AiqResultStorage.h    |   246 +
 camera/hal/intel/ipu6/src/3a/AiqSetting.cpp        |   350 +
 camera/hal/intel/ipu6/src/3a/AiqSetting.h          |   149 +
 camera/hal/intel/ipu6/src/3a/AiqStatistics.cpp     |   147 +
 camera/hal/intel/ipu6/src/3a/AiqStatistics.h       |    58 +
 camera/hal/intel/ipu6/src/3a/AiqUnit.cpp           |   271 +
 camera/hal/intel/ipu6/src/3a/AiqUnit.h             |   157 +
 camera/hal/intel/ipu6/src/3a/AiqUtils.cpp          |   506 +
 camera/hal/intel/ipu6/src/3a/AiqUtils.h            |   179 +
 camera/hal/intel/ipu6/src/3a/Dvs.cpp               |   608 +
 camera/hal/intel/ipu6/src/3a/Dvs.h                 |   118 +
 camera/hal/intel/ipu6/src/3a/DvsResult.cpp         |   105 +
 camera/hal/intel/ipu6/src/3a/DvsResult.h           |    48 +
 camera/hal/intel/ipu6/src/3a/I3AControlFactory.cpp |    35 +
 camera/hal/intel/ipu6/src/3a/I3AControlFactory.h   |    44 +
 camera/hal/intel/ipu6/src/3a/ImagingControl.h      |    46 +
 camera/hal/intel/ipu6/src/3a/LensManager.cpp       |   101 +
 camera/hal/intel/ipu6/src/3a/LensManager.h         |    77 +
 camera/hal/intel/ipu6/src/3a/Ltm.cpp               |   550 +
 camera/hal/intel/ipu6/src/3a/Ltm.h                 |   185 +
 camera/hal/intel/ipu6/src/3a/MakerNote.cpp         |   139 +
 camera/hal/intel/ipu6/src/3a/MakerNote.h           |   129 +
 camera/hal/intel/ipu6/src/3a/SensorManager.cpp     |   327 +
 camera/hal/intel/ipu6/src/3a/SensorManager.h       |   111 +
 .../intel/ipu6/src/3a/intel3a/Intel3AParameter.cpp |   694 +
 .../intel/ipu6/src/3a/intel3a/Intel3AParameter.h   |   103 +
 .../intel/ipu6/src/3a/intel3a/Intel3AResult.cpp    |   172 +
 .../hal/intel/ipu6/src/3a/intel3a/Intel3AResult.h  |    45 +
 camera/hal/intel/ipu6/src/core/BufferQueue.cpp     |   286 +
 camera/hal/intel/ipu6/src/core/BufferQueue.h       |   206 +
 camera/hal/intel/ipu6/src/core/CameraBuffer.cpp    |   401 +
 camera/hal/intel/ipu6/src/core/CameraBuffer.h      |   169 +
 camera/hal/intel/ipu6/src/core/CameraDevice.cpp    |  1162 ++
 camera/hal/intel/ipu6/src/core/CameraDevice.h      |   284 +
 camera/hal/intel/ipu6/src/core/CameraEvent.cpp     |    83 +
 camera/hal/intel/ipu6/src/core/CameraEvent.h       |    50 +
 camera/hal/intel/ipu6/src/core/CameraEventType.h   |   110 +
 camera/hal/intel/ipu6/src/core/CameraStream.cpp    |   230 +
 camera/hal/intel/ipu6/src/core/CameraStream.h      |   118 +
 camera/hal/intel/ipu6/src/core/CaptureUnit.cpp     |   510 +
 camera/hal/intel/ipu6/src/core/CaptureUnit.h       |   196 +
 camera/hal/intel/ipu6/src/core/DeviceBase.cpp      |   441 +
 camera/hal/intel/ipu6/src/core/DeviceBase.h        |   171 +
 camera/hal/intel/ipu6/src/core/IspParamAdaptor.cpp |   850 +
 camera/hal/intel/ipu6/src/core/IspParamAdaptor.h   |   147 +
 camera/hal/intel/ipu6/src/core/IspSettings.h       |    46 +
 camera/hal/intel/ipu6/src/core/LensHw.cpp          |   159 +
 camera/hal/intel/ipu6/src/core/LensHw.h            |    63 +
 camera/hal/intel/ipu6/src/core/PSysProcessor.cpp   |   860 +
 camera/hal/intel/ipu6/src/core/PSysProcessor.h     |   129 +
 .../hal/intel/ipu6/src/core/ProcessorManager.cpp   |   125 +
 camera/hal/intel/ipu6/src/core/ProcessorManager.h  |    71 +
 camera/hal/intel/ipu6/src/core/RequestThread.cpp   |   537 +
 camera/hal/intel/ipu6/src/core/RequestThread.h     |   153 +
 camera/hal/intel/ipu6/src/core/SensorHwCtrl.cpp    |   331 +
 camera/hal/intel/ipu6/src/core/SensorHwCtrl.h      |    99 +
 camera/hal/intel/ipu6/src/core/SofSource.cpp       |   226 +
 camera/hal/intel/ipu6/src/core/SofSource.h         |    64 +
 camera/hal/intel/ipu6/src/core/StreamSource.h      |    49 +
 .../hal/intel/ipu6/src/core/SwImageProcessor.cpp   |   158 +
 camera/hal/intel/ipu6/src/core/SwImageProcessor.h  |    46 +
 camera/hal/intel/ipu6/src/core/SyncManager.cpp     |   198 +
 camera/hal/intel/ipu6/src/core/SyncManager.h       |    58 +
 .../intel/ipu6/src/core/psysprocessor/PGCommon.cpp |  1224 ++
 .../intel/ipu6/src/core/psysprocessor/PGCommon.h   |   238 +
 .../intel/ipu6/src/core/psysprocessor/PGUtils.cpp  |   194 +
 .../intel/ipu6/src/core/psysprocessor/PGUtils.h    |    86 +
 .../intel/ipu6/src/core/psysprocessor/PSysDAG.cpp  |   669 +
 .../intel/ipu6/src/core/psysprocessor/PSysDAG.h    |   147 +
 .../src/core/psysprocessor/PipeLiteExecutor.cpp    |  1116 ++
 .../ipu6/src/core/psysprocessor/PipeLiteExecutor.h |   193 +
 .../ipu6/src/core/psysprocessor/PolicyManager.cpp  |   168 +
 .../ipu6/src/core/psysprocessor/PolicyManager.h    |    79 +
 camera/hal/intel/ipu6/src/fd/FaceBase.h            |    80 +
 camera/hal/intel/ipu6/src/fd/FaceDetection.cpp     |   529 +
 camera/hal/intel/ipu6/src/fd/FaceDetection.h       |   118 +
 camera/hal/intel/ipu6/src/hal/CameraHal.cpp        |   270 +
 camera/hal/intel/ipu6/src/hal/CameraHal.h          |    85 +
 camera/hal/intel/ipu6/src/hal/ICamera.cpp          |   374 +
 .../intel/ipu6/src/image_process/IImageProcessor.h |    46 +
 .../ipu6/src/image_process/ImageConverter.cpp      |   798 +
 .../intel/ipu6/src/image_process/ImageConverter.h  |    59 +
 .../ipu6/src/image_process/PostProcessorBase.cpp   |   318 +
 .../ipu6/src/image_process/PostProcessorBase.h     |   118 +
 .../ipu6/src/image_process/PostProcessorCore.cpp   |   141 +
 .../ipu6/src/image_process/PostProcessorCore.h     |    68 +
 .../hal/intel/ipu6/src/image_process/ProcessType.h |    30 +
 .../image_process/chrome/ImageProcessorCore.cpp    |   234 +
 .../src/image_process/chrome/ImageProcessorCore.h  |    44 +
 camera/hal/intel/ipu6/src/iutils/CameraDump.cpp    |   409 +
 camera/hal/intel/ipu6/src/iutils/CameraDump.h      |   170 +
 camera/hal/intel/ipu6/src/iutils/CameraLog.cpp     |   270 +
 camera/hal/intel/ipu6/src/iutils/CameraLog.h       |   200 +
 camera/hal/intel/ipu6/src/iutils/Errors.h          |    65 +
 camera/hal/intel/ipu6/src/iutils/RWLock.h          |    98 +
 camera/hal/intel/ipu6/src/iutils/ScopedAtrace.cpp  |    63 +
 .../hal/intel/ipu6/src/iutils/SwImageConverter.cpp |   406 +
 .../hal/intel/ipu6/src/iutils/SwImageConverter.h   |    42 +
 camera/hal/intel/ipu6/src/iutils/Thread.cpp        |   222 +
 camera/hal/intel/ipu6/src/iutils/Thread.h          |   198 +
 camera/hal/intel/ipu6/src/iutils/Trace.cpp         |    54 +
 camera/hal/intel/ipu6/src/iutils/Trace.h           |   241 +
 camera/hal/intel/ipu6/src/iutils/Utils.cpp         |   740 +
 camera/hal/intel/ipu6/src/iutils/Utils.h           |   277 +
 camera/hal/intel/ipu6/src/jpeg/EXIFMaker.cpp       |   540 +
 camera/hal/intel/ipu6/src/jpeg/EXIFMaker.h         |    69 +
 camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.cpp    |    57 +
 camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.h      |    65 +
 camera/hal/intel/ipu6/src/jpeg/Exif.h              |   344 +
 camera/hal/intel/ipu6/src/jpeg/ExifCreater.cpp     |   604 +
 camera/hal/intel/ipu6/src/jpeg/ExifCreater.h       |   141 +
 camera/hal/intel/ipu6/src/jpeg/IJpegEncoder.h      |    76 +
 camera/hal/intel/ipu6/src/jpeg/JpegMaker.cpp       |   233 +
 camera/hal/intel/ipu6/src/jpeg/JpegMaker.h         |    58 +
 .../intel/ipu6/src/jpeg/chrome/JpegEncoderCore.cpp |    76 +
 .../intel/ipu6/src/jpeg/chrome/JpegEncoderCore.h   |    39 +
 .../hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.cpp   |   772 +
 camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.h  |   184 +
 .../hal/intel/ipu6/src/metadata/CameraMetadata.cpp |   435 +
 .../hal/intel/ipu6/src/metadata/CameraMetadata.h   |   200 +
 .../intel/ipu6/src/metadata/ParameterGenerator.cpp |   313 +
 .../intel/ipu6/src/metadata/ParameterGenerator.h   |   112 +
 .../intel/ipu6/src/metadata/ParameterHelper.cpp    |    84 +
 .../hal/intel/ipu6/src/metadata/ParameterHelper.h  |   142 +
 camera/hal/intel/ipu6/src/metadata/Parameters.cpp  |  1931 +++
 .../ipu6/src/metadata/icamera_metadata_base.cpp    |   976 ++
 .../ipu6/src/metadata/icamera_metadata_base.h      |   445 +
 .../ipu6/src/metadata/icamera_metadata_tag_info.c  |  2630 +++
 .../ipu6/src/metadata/icamera_metadata_tags.h      |   999 ++
 .../intel/ipu6/src/platformdata/AiqInitData.cpp    |   524 +
 .../hal/intel/ipu6/src/platformdata/AiqInitData.h  |   199 +
 .../intel/ipu6/src/platformdata/CameraParser.cpp   |  1939 +++
 .../hal/intel/ipu6/src/platformdata/CameraParser.h |   128 +
 .../hal/intel/ipu6/src/platformdata/CameraTypes.h  |   226 +
 .../hal/intel/ipu6/src/platformdata/ParserBase.cpp |   165 +
 .../hal/intel/ipu6/src/platformdata/ParserBase.h   |   102 +
 .../intel/ipu6/src/platformdata/PlatformData.cpp   |  1296 ++
 .../hal/intel/ipu6/src/platformdata/PlatformData.h |  1094 ++
 .../intel/ipu6/src/platformdata/PolicyParser.cpp   |   226 +
 .../hal/intel/ipu6/src/platformdata/PolicyParser.h |    73 +
 .../intel/ipu6/src/platformdata/gc/FormatUtils.cpp |   338 +
 .../intel/ipu6/src/platformdata/gc/FormatUtils.h   |    34 +
 .../intel/ipu6/src/platformdata/gc/GraphConfig.cpp |   192 +
 .../intel/ipu6/src/platformdata/gc/GraphConfig.h   |    87 +
 .../src/platformdata/gc/GraphConfigManager.cpp     |   179 +
 .../ipu6/src/platformdata/gc/GraphConfigManager.h  |    85 +
 .../intel/ipu6/src/platformdata/gc/GraphUtils.cpp  |   112 +
 .../intel/ipu6/src/platformdata/gc/GraphUtils.h    |    27 +
 .../hal/intel/ipu6/src/platformdata/gc/HalStream.h |    74 +
 .../intel/ipu6/src/platformdata/gc/IGraphConfig.h  |   199 +
 .../ipu6/src/platformdata/gc/IGraphConfigManager.h |    43 +
 .../ipu6/src/platformdata/gc/custom_gcss_keys.h    |    50 +
 camera/hal/intel/ipu6/src/v4l2/MediaControl.cpp    |  1116 ++
 camera/hal/intel/ipu6/src/v4l2/MediaControl.h      |   302 +
 camera/hal/intel/ipu6/src/v4l2/NodeInfo.cpp        |    53 +
 camera/hal/intel/ipu6/src/v4l2/NodeInfo.h          |    50 +
 camera/hal/intel/ipu6/src/v4l2/SysCall.cpp         |   212 +
 camera/hal/intel/ipu6/src/v4l2/SysCall.h           |    87 +
 .../hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.cpp  |   126 +
 camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.h |    61 +
 610 files changed, 180827 insertions(+)
 create mode 100644 camera/hal/intel/ipu6/BUILD.gn
 create mode 100644 camera/hal/intel/ipu6/aal/Camera3AMetadata.cpp
 create mode 100644 camera/hal/intel/ipu6/aal/Camera3AMetadata.h
 create mode 100644 camera/hal/intel/ipu6/aal/Camera3HAL.cpp
 create mode 100644 camera/hal/intel/ipu6/aal/Camera3HAL.h
 create mode 100644 camera/hal/intel/ipu6/aal/Camera3HALModule.cpp
 create mode 100644 camera/hal/intel/ipu6/aal/Camera3Stream.cpp
 create mode 100644 camera/hal/intel/ipu6/aal/Camera3Stream.h
 create mode 100644 camera/hal/intel/ipu6/aal/HALv3Interface.h
 create mode 100644 camera/hal/intel/ipu6/aal/HALv3Utils.cpp
 create mode 100644 camera/hal/intel/ipu6/aal/HALv3Utils.h
 create mode 100644 camera/hal/intel/ipu6/aal/IntelAEStateMachine.cpp
 create mode 100644 camera/hal/intel/ipu6/aal/IntelAEStateMachine.h
 create mode 100644 camera/hal/intel/ipu6/aal/IntelAFStateMachine.cpp
 create mode 100644 camera/hal/intel/ipu6/aal/IntelAFStateMachine.h
 create mode 100644 camera/hal/intel/ipu6/aal/IntelAWBStateMachine.cpp
 create mode 100644 camera/hal/intel/ipu6/aal/IntelAWBStateMachine.h
 create mode 100644 camera/hal/intel/ipu6/aal/MetadataConvert.cpp
 create mode 100644 camera/hal/intel/ipu6/aal/MetadataConvert.h
 create mode 100644 camera/hal/intel/ipu6/aal/PostProcessor.cpp
 create mode 100644 camera/hal/intel/ipu6/aal/PostProcessor.h
 create mode 100644 camera/hal/intel/ipu6/aal/RequestManager.cpp
 create mode 100644 camera/hal/intel/ipu6/aal/RequestManager.h
 create mode 100644 camera/hal/intel/ipu6/aal/ResultProcessor.cpp
 create mode 100644 camera/hal/intel/ipu6/aal/ResultProcessor.h
 create mode 100644 camera/hal/intel/ipu6/aal/chrome/HALv3Header.h
 create mode 100644 camera/hal/intel/ipu6/include/api/ICamera.h
 create mode 100644 camera/hal/intel/ipu6/include/api/Parameters.h
 create mode 100644 camera/hal/intel/ipu6/include/cameranvm.h
 create mode 100644 camera/hal/intel/ipu6/include/gcss/GCSSParser.h
 create mode 100644 camera/hal/intel/ipu6/include/gcss/gcss.h
 create mode 100644 camera/hal/intel/ipu6/include/gcss/gcss_aic_utils.h
 create mode 100644 camera/hal/intel/ipu6/include/gcss/gcss_isp_utils.h
 create mode 100644 camera/hal/intel/ipu6/include/gcss/gcss_item.h
 create mode 100644 camera/hal/intel/ipu6/include/gcss/gcss_keys.h
 create mode 100644 camera/hal/intel/ipu6/include/gcss/gcss_utils.h
 create mode 100644 camera/hal/intel/ipu6/include/gcss/graph_query_manager.h
 create mode 100644 camera/hal/intel/ipu6/include/gcss/graph_utils.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_cipf/ia_cipf_types.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_cipf_css/ia_cipf_css.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aec.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aec_types.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aic_myriad.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aiq.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_deprecated.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_types.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_encode.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_parser.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_alloc.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp_types.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_ccat.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_ccat_types.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser_deprecated.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_types.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_configuration.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_coordinate.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_dpc.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_dvs.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_deprecated.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_types.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_emd_decoder.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_emd_types.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_exc.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_exc_deprecated.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics_types.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_deprecated.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_statistics_types.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_types.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_isp_types.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_lard.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_log.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_ltm.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_deprecated.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_types.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_me_corner.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_decoder.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_encoder.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_types.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_nvm.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_ob.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_p2p.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_p2p_types.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_pal_exports.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_ids_autogen.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_parameters_autogen.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_statistics_types.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_types.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_view.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_view_types.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_blink_detection.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_config.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_eye_detection.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_face_detection.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_face_recognition.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_image_montage.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_landmark_detection.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_mouth_detection.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_object_tracking.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_panorama.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_pedestrian_detection.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_perspective_control.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_smile_detection.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_types.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_tools/css_types.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_tools/ia_list.h
 create mode 100644 camera/hal/intel/ipu6/include/linux/ipu-isys.h
 create mode 100644 camera/hal/intel/ipu6/include/utils/ScopedAtrace.h
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.h
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.h
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.h
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.h
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.h
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelLard.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelLard.h
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.h
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.h
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.h
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/StatsTypes.h
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.h
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/css_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_alloc.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_memory.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_memory_device.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_psys.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/ipu-psys.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_common.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_common.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_device_ops.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_list.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_list.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/linux/ia_cipr_alloc.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/linux/ia_cipr_psys.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/assert_support.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/cpu_mem_support.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/error_support.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/frame_support.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_base_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs_dep.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_storage_class.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_user_param_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_param_storage_class.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_defs.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.sim.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_private.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_buffer_set.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_storage_class.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_trace.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_storage_class.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_trace.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_kernel_trace.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_manifest_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_param_trace.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_private_pg_data.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.kernel.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.user.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.psys.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.kernel.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.user.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.psys.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_cmd_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_private_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.hsys.user.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.sim.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_private.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.kernel.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.user.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.sim.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_storage_class.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_trace.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_storage_class.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_trace.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.hsys.user.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.hsys.user.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.sim.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_private_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport_dep.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_fw_version.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_trace.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_storage_class.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_trace.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_base_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_defs.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_base_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_trace.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_acb_devices.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_gp_devices.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/math_support.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/misc_support.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/pg_control_init_framework.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/platform_support.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/print_support.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/psys_system_global_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/storage_class.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/type_support.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_acb_route_type.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_resource_model.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_system_global.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_kernel_bitmap.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_data.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_param.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group_cmd_impl.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_group_manifest.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_manifest.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal_manifest.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_rbm.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal_manifest.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/vied_nci_psys_system.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/assert_support.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/cpu_mem_support.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/error_support.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/frame_support.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_base_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs_dep.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_storage_class.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_user_param_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_param_storage_class.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_defs.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.sim.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_private.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_buffer_set.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_storage_class.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_trace.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_storage_class.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_trace.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_kernel_trace.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_manifest_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_param_trace.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_private_pg_data.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.kernel.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.user.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.psys.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.kernel.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.user.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.psys.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_cmd_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_private_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.hsys.user.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.sim.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_private.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.kernel.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.user.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.sim.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_storage_class.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_trace.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_storage_class.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_trace.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.hsys.user.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.hsys.user.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.sim.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_private_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport_dep.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_fw_version.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_trace.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_storage_class.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_trace.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_base_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_defs.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_base_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_trace.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_acb_devices.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_gp_devices.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/math_support.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/misc_support.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/pg_control_init_framework.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/platform_support.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/print_support.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/psys_system_global_impl.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/storage_class.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/type_support.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_acb_route_type.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_resource_model.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_system_global.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_kernel_bitmap.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_data.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_param.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group_cmd_impl.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_group_manifest.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_manifest.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal_manifest.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_rbm.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal_manifest.c
 create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/vied_nci_psys_system.c
 create mode 100644 camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.h
 create mode 100644 camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.h
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.h
 create mode 100644 camera/hal/intel/ipu6/src/3a/AiqCore.cpp
 create mode 100644 camera/hal/intel/ipu6/src/3a/AiqCore.h
 create mode 100644 camera/hal/intel/ipu6/src/3a/AiqEngine.cpp
 create mode 100644 camera/hal/intel/ipu6/src/3a/AiqEngine.h
 create mode 100644 camera/hal/intel/ipu6/src/3a/AiqResult.cpp
 create mode 100644 camera/hal/intel/ipu6/src/3a/AiqResult.h
 create mode 100644 camera/hal/intel/ipu6/src/3a/AiqResultStorage.cpp
 create mode 100644 camera/hal/intel/ipu6/src/3a/AiqResultStorage.h
 create mode 100644 camera/hal/intel/ipu6/src/3a/AiqSetting.cpp
 create mode 100644 camera/hal/intel/ipu6/src/3a/AiqSetting.h
 create mode 100644 camera/hal/intel/ipu6/src/3a/AiqStatistics.cpp
 create mode 100644 camera/hal/intel/ipu6/src/3a/AiqStatistics.h
 create mode 100644 camera/hal/intel/ipu6/src/3a/AiqUnit.cpp
 create mode 100644 camera/hal/intel/ipu6/src/3a/AiqUnit.h
 create mode 100644 camera/hal/intel/ipu6/src/3a/AiqUtils.cpp
 create mode 100644 camera/hal/intel/ipu6/src/3a/AiqUtils.h
 create mode 100644 camera/hal/intel/ipu6/src/3a/Dvs.cpp
 create mode 100644 camera/hal/intel/ipu6/src/3a/Dvs.h
 create mode 100644 camera/hal/intel/ipu6/src/3a/DvsResult.cpp
 create mode 100644 camera/hal/intel/ipu6/src/3a/DvsResult.h
 create mode 100644 camera/hal/intel/ipu6/src/3a/I3AControlFactory.cpp
 create mode 100644 camera/hal/intel/ipu6/src/3a/I3AControlFactory.h
 create mode 100644 camera/hal/intel/ipu6/src/3a/ImagingControl.h
 create mode 100644 camera/hal/intel/ipu6/src/3a/LensManager.cpp
 create mode 100644 camera/hal/intel/ipu6/src/3a/LensManager.h
 create mode 100644 camera/hal/intel/ipu6/src/3a/Ltm.cpp
 create mode 100644 camera/hal/intel/ipu6/src/3a/Ltm.h
 create mode 100644 camera/hal/intel/ipu6/src/3a/MakerNote.cpp
 create mode 100644 camera/hal/intel/ipu6/src/3a/MakerNote.h
 create mode 100644 camera/hal/intel/ipu6/src/3a/SensorManager.cpp
 create mode 100644 camera/hal/intel/ipu6/src/3a/SensorManager.h
 create mode 100644 camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.cpp
 create mode 100644 camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.h
 create mode 100644 camera/hal/intel/ipu6/src/3a/intel3a/Intel3AResult.cpp
 create mode 100644 camera/hal/intel/ipu6/src/3a/intel3a/Intel3AResult.h
 create mode 100644 camera/hal/intel/ipu6/src/core/BufferQueue.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/BufferQueue.h
 create mode 100644 camera/hal/intel/ipu6/src/core/CameraBuffer.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/CameraBuffer.h
 create mode 100644 camera/hal/intel/ipu6/src/core/CameraDevice.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/CameraDevice.h
 create mode 100644 camera/hal/intel/ipu6/src/core/CameraEvent.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/CameraEvent.h
 create mode 100644 camera/hal/intel/ipu6/src/core/CameraEventType.h
 create mode 100644 camera/hal/intel/ipu6/src/core/CameraStream.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/CameraStream.h
 create mode 100644 camera/hal/intel/ipu6/src/core/CaptureUnit.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/CaptureUnit.h
 create mode 100644 camera/hal/intel/ipu6/src/core/DeviceBase.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/DeviceBase.h
 create mode 100644 camera/hal/intel/ipu6/src/core/IspParamAdaptor.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/IspParamAdaptor.h
 create mode 100644 camera/hal/intel/ipu6/src/core/IspSettings.h
 create mode 100644 camera/hal/intel/ipu6/src/core/LensHw.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/LensHw.h
 create mode 100644 camera/hal/intel/ipu6/src/core/PSysProcessor.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/PSysProcessor.h
 create mode 100644 camera/hal/intel/ipu6/src/core/ProcessorManager.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/ProcessorManager.h
 create mode 100644 camera/hal/intel/ipu6/src/core/RequestThread.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/RequestThread.h
 create mode 100644 camera/hal/intel/ipu6/src/core/SensorHwCtrl.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/SensorHwCtrl.h
 create mode 100644 camera/hal/intel/ipu6/src/core/SofSource.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/SofSource.h
 create mode 100644 camera/hal/intel/ipu6/src/core/StreamSource.h
 create mode 100644 camera/hal/intel/ipu6/src/core/SwImageProcessor.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/SwImageProcessor.h
 create mode 100644 camera/hal/intel/ipu6/src/core/SyncManager.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/SyncManager.h
 create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.h
 create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.h
 create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.h
 create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.h
 create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.cpp
 create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.h
 create mode 100644 camera/hal/intel/ipu6/src/fd/FaceBase.h
 create mode 100644 camera/hal/intel/ipu6/src/fd/FaceDetection.cpp
 create mode 100644 camera/hal/intel/ipu6/src/fd/FaceDetection.h
 create mode 100644 camera/hal/intel/ipu6/src/hal/CameraHal.cpp
 create mode 100644 camera/hal/intel/ipu6/src/hal/CameraHal.h
 create mode 100644 camera/hal/intel/ipu6/src/hal/ICamera.cpp
 create mode 100644 camera/hal/intel/ipu6/src/image_process/IImageProcessor.h
 create mode 100644 camera/hal/intel/ipu6/src/image_process/ImageConverter.cpp
 create mode 100644 camera/hal/intel/ipu6/src/image_process/ImageConverter.h
 create mode 100644 camera/hal/intel/ipu6/src/image_process/PostProcessorBase.cpp
 create mode 100644 camera/hal/intel/ipu6/src/image_process/PostProcessorBase.h
 create mode 100644 camera/hal/intel/ipu6/src/image_process/PostProcessorCore.cpp
 create mode 100644 camera/hal/intel/ipu6/src/image_process/PostProcessorCore.h
 create mode 100644 camera/hal/intel/ipu6/src/image_process/ProcessType.h
 create mode 100644 camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.cpp
 create mode 100644 camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.h
 create mode 100644 camera/hal/intel/ipu6/src/iutils/CameraDump.cpp
 create mode 100644 camera/hal/intel/ipu6/src/iutils/CameraDump.h
 create mode 100644 camera/hal/intel/ipu6/src/iutils/CameraLog.cpp
 create mode 100644 camera/hal/intel/ipu6/src/iutils/CameraLog.h
 create mode 100644 camera/hal/intel/ipu6/src/iutils/Errors.h
 create mode 100644 camera/hal/intel/ipu6/src/iutils/RWLock.h
 create mode 100644 camera/hal/intel/ipu6/src/iutils/ScopedAtrace.cpp
 create mode 100644 camera/hal/intel/ipu6/src/iutils/SwImageConverter.cpp
 create mode 100644 camera/hal/intel/ipu6/src/iutils/SwImageConverter.h
 create mode 100644 camera/hal/intel/ipu6/src/iutils/Thread.cpp
 create mode 100644 camera/hal/intel/ipu6/src/iutils/Thread.h
 create mode 100644 camera/hal/intel/ipu6/src/iutils/Trace.cpp
 create mode 100644 camera/hal/intel/ipu6/src/iutils/Trace.h
 create mode 100644 camera/hal/intel/ipu6/src/iutils/Utils.cpp
 create mode 100644 camera/hal/intel/ipu6/src/iutils/Utils.h
 create mode 100644 camera/hal/intel/ipu6/src/jpeg/EXIFMaker.cpp
 create mode 100644 camera/hal/intel/ipu6/src/jpeg/EXIFMaker.h
 create mode 100644 camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.cpp
 create mode 100644 camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.h
 create mode 100644 camera/hal/intel/ipu6/src/jpeg/Exif.h
 create mode 100644 camera/hal/intel/ipu6/src/jpeg/ExifCreater.cpp
 create mode 100644 camera/hal/intel/ipu6/src/jpeg/ExifCreater.h
 create mode 100644 camera/hal/intel/ipu6/src/jpeg/IJpegEncoder.h
 create mode 100644 camera/hal/intel/ipu6/src/jpeg/JpegMaker.cpp
 create mode 100644 camera/hal/intel/ipu6/src/jpeg/JpegMaker.h
 create mode 100644 camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.cpp
 create mode 100644 camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.h
 create mode 100644 camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.cpp
 create mode 100644 camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.h
 create mode 100644 camera/hal/intel/ipu6/src/metadata/CameraMetadata.cpp
 create mode 100644 camera/hal/intel/ipu6/src/metadata/CameraMetadata.h
 create mode 100644 camera/hal/intel/ipu6/src/metadata/ParameterGenerator.cpp
 create mode 100644 camera/hal/intel/ipu6/src/metadata/ParameterGenerator.h
 create mode 100644 camera/hal/intel/ipu6/src/metadata/ParameterHelper.cpp
 create mode 100644 camera/hal/intel/ipu6/src/metadata/ParameterHelper.h
 create mode 100644 camera/hal/intel/ipu6/src/metadata/Parameters.cpp
 create mode 100644 camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.cpp
 create mode 100644 camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.h
 create mode 100644 camera/hal/intel/ipu6/src/metadata/icamera_metadata_tag_info.c
 create mode 100644 camera/hal/intel/ipu6/src/metadata/icamera_metadata_tags.h
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/AiqInitData.cpp
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/AiqInitData.h
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/CameraParser.cpp
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/CameraParser.h
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/CameraTypes.h
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/ParserBase.cpp
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/ParserBase.h
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/PlatformData.cpp
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/PlatformData.h
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/PolicyParser.cpp
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/PolicyParser.h
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.cpp
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.h
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.cpp
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.h
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.cpp
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.h
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.cpp
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.h
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/HalStream.h
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfig.h
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfigManager.h
 create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/custom_gcss_keys.h
 create mode 100644 camera/hal/intel/ipu6/src/v4l2/MediaControl.cpp
 create mode 100644 camera/hal/intel/ipu6/src/v4l2/MediaControl.h
 create mode 100644 camera/hal/intel/ipu6/src/v4l2/NodeInfo.cpp
 create mode 100644 camera/hal/intel/ipu6/src/v4l2/NodeInfo.h
 create mode 100644 camera/hal/intel/ipu6/src/v4l2/SysCall.cpp
 create mode 100644 camera/hal/intel/ipu6/src/v4l2/SysCall.h
 create mode 100644 camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.cpp
 create mode 100644 camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.h

diff --git a/camera/hal/intel/ipu6/BUILD.gn b/camera/hal/intel/ipu6/BUILD.gn
new file mode 100644
index 000000000000..69cd3e890b0c
--- /dev/null
+++ b/camera/hal/intel/ipu6/BUILD.gn
@@ -0,0 +1,402 @@
+#
+#  Copyright (C) 2019-2020 Intel Corporation
+#
+#  Licensed under the Apache License, Version 2.0 (the "License");
+#  you may not use this file except in compliance with the License.
+#  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+#
+
+group("all") {
+  deps = [
+    ":libcam_algo",
+    ":libcamhal",
+  ]
+}
+
+shared_library("libcamhal") {
+  sources = [
+    "aal/Camera3AMetadata.cpp",
+    "aal/Camera3HAL.cpp",
+    "aal/Camera3HALModule.cpp",
+    "aal/Camera3Stream.cpp",
+    "aal/HALv3Utils.cpp",
+    "aal/IntelAEStateMachine.cpp",
+    "aal/IntelAFStateMachine.cpp",
+    "aal/IntelAWBStateMachine.cpp",
+    "aal/MetadataConvert.cpp",
+    "aal/PostProcessor.cpp",
+    "aal/RequestManager.cpp",
+    "aal/ResultProcessor.cpp",
+    "modules/ia_cipr/src/common/ia_cipr_memory_common.cpp",
+    "modules/ia_cipr/src/common/ia_list.cpp",
+    "modules/ia_cipr/src/linux/ia_cipr_alloc.cpp",
+    "modules/ia_cipr/src/linux/ia_cipr_psys.cpp",
+    "modules/sandboxing/client/IntelAlgoClient.cpp",
+    "modules/sandboxing/client/IntelAlgoCommon.cpp",
+    "modules/sandboxing/client/IntelLard.cpp",
+    "modules/sandboxing/client/IntelFaceDetection.cpp",
+    "modules/sandboxing/client/GraphConfigImpl.cpp",
+    "modules/sandboxing/client/IntelCmc.cpp",
+    "modules/sandboxing/client/IntelMkn.cpp",
+    "modules/sandboxing/client/IntelLtm.cpp",
+    "modules/sandboxing/client/IntelAiq.cpp",
+    "modules/sandboxing/client/IntelDvs.cpp",
+    "modules/sandboxing/client/IntelIspParamAdaptor.cpp",
+    "modules/sandboxing/client/IntelPGParam.cpp",
+    "modules/sandboxing/IPCCommon.cpp",
+    "modules/sandboxing/IPCIntelLard.cpp",
+    "modules/sandboxing/IPCIntelFD.cpp",
+    "modules/sandboxing/IPCGraphConfig.cpp",
+    "modules/sandboxing/IPCIntelCmc.cpp",
+    "modules/sandboxing/IPCIntelMkn.cpp",
+    "modules/sandboxing/IPCIntelLtm.cpp",
+    "modules/sandboxing/IPCIntelAiq.cpp",
+    "modules/sandboxing/IPCIntelDvs.cpp",
+    "modules/sandboxing/IPCIspParamAdaptor.cpp",
+    "modules/sandboxing/IPCIntelPGParam.cpp",
+    "modules/memory/Camera3BufferPool.cpp",
+    "modules/memory/chrome/Camera3Buffer.cpp",
+    "src/3a/AiqCore.cpp",
+    "src/3a/AiqEngine.cpp",
+    "src/3a/AiqResult.cpp",
+    "src/3a/AiqResultStorage.cpp",
+    "src/3a/AiqSetting.cpp",
+    "src/3a/AiqStatistics.cpp",
+    "src/3a/AiqUnit.cpp",
+    "src/3a/AiqUtils.cpp",
+    "src/3a/I3AControlFactory.cpp",
+    "src/3a/DvsResult.cpp",
+    "src/3a/Dvs.cpp",
+    "src/3a/MakerNote.cpp",
+    "src/3a/LensManager.cpp",
+    "src/3a/Ltm.cpp",
+    "src/3a/SensorManager.cpp",
+    "src/3a/intel3a/Intel3AParameter.cpp",
+    "src/3a/intel3a/Intel3AResult.cpp",
+    "src/core/BufferQueue.cpp",
+    "src/core/CameraBuffer.cpp",
+    "src/core/CameraDevice.cpp",
+    "src/core/CameraEvent.cpp",
+    "src/core/CameraStream.cpp",
+    "src/core/CaptureUnit.cpp",
+    "src/core/DeviceBase.cpp",
+    "src/core/IspParamAdaptor.cpp",
+    "src/core/LensHw.cpp",
+    "src/core/PSysProcessor.cpp",
+    "src/core/ProcessorManager.cpp",
+    "src/core/RequestThread.cpp",
+    "src/core/SensorHwCtrl.cpp",
+    "src/core/SofSource.cpp",
+    "src/core/SwImageProcessor.cpp",
+    "src/core/SyncManager.cpp",
+    "src/core/psysprocessor/PGCommon.cpp",
+    "src/core/psysprocessor/PGUtils.cpp",
+    "src/core/psysprocessor/PSysDAG.cpp",
+    "src/core/psysprocessor/PipeLiteExecutor.cpp",
+    "src/core/psysprocessor/PolicyManager.cpp",
+    "src/fd/FaceDetection.cpp",
+    "src/hal/CameraHal.cpp",
+    "src/hal/ICamera.cpp",
+    "src/image_process/ImageConverter.cpp",
+    "src/image_process/PostProcessorBase.cpp",
+    "src/image_process/PostProcessorCore.cpp",
+    "src/image_process/chrome/ImageProcessorCore.cpp",
+    "src/iutils/CameraDump.cpp",
+    "src/iutils/CameraLog.cpp",
+    "src/iutils/ScopedAtrace.cpp",
+    "src/iutils/SwImageConverter.cpp",
+    "src/iutils/Thread.cpp",
+    "src/iutils/Trace.cpp",
+    "src/iutils/Utils.cpp",
+    "src/jpeg/EXIFMaker.cpp",
+    "src/jpeg/EXIFMetaData.cpp",
+    "src/jpeg/ExifCreater.cpp",
+    "src/jpeg/JpegMaker.cpp",
+    "src/jpeg/sw/SWJpegEncoder.cpp",  # TODO: Migrate to hardware JPEG encoding later
+    "src/metadata/CameraMetadata.cpp",
+    "src/metadata/ParameterGenerator.cpp",
+    "src/metadata/ParameterHelper.cpp",
+    "src/metadata/Parameters.cpp",
+    "src/metadata/icamera_metadata_base.cpp",
+    "src/platformdata/AiqInitData.cpp",
+    "src/platformdata/CameraParser.cpp",
+    "src/platformdata/ParserBase.cpp",
+    "src/platformdata/PlatformData.cpp",
+    "src/platformdata/PolicyParser.cpp",
+    "src/platformdata/gc/FormatUtils.cpp",
+    "src/platformdata/gc/GraphConfig.cpp",
+    "src/platformdata/gc/GraphConfigManager.cpp",
+    "src/platformdata/gc/GraphUtils.cpp",
+    "src/v4l2/MediaControl.cpp",
+    "src/v4l2/SysCall.cpp",
+    "src/v4l2/V4l2DeviceFactory.cpp",
+    "src/v4l2/NodeInfo.cpp",
+  ]
+  cflags_cc = [
+    "-fvisibility=default",
+  ]
+  include_dirs = [
+    ".",
+    "include",
+    "include/api",
+    "include/utils",
+    "include/linux",
+    "src",
+    "src/fd",
+    "src/platformdata",
+    "src/platformdata/gc",
+    "src/v4l2",
+    "src/iutils",
+    "src/core",
+    "src/core/psysprocessor",
+    "src/metadata",
+    "src/3a/intel3a",
+    "src/3a/external",
+    "src/3a",
+    "src/image_process",
+    "src/image_process/chrome",
+    "src/jpeg/",
+    "src/jpeg/sw",
+    "aal",
+    "aal/chrome",
+    "modules/ia_cipr/include",
+    "modules/ia_cipr/src/common",
+    "modules/ia_cipr/src/linux/linux",
+    "modules/memory",
+    "modules/memory/chrome",
+    "include/ia_imaging",
+    "include",
+    "include/gcss",
+  ]
+  defines = [
+    "CAL_BUILD",
+    "IPU_SYSVER_IPU6",
+    "USE_PG_LITE_PIPE",
+    "HAVE_LINUX_OS",
+    "__STDC_FORMAT_MACROS",
+    "HAVE_PTHREADS",
+    "HAVE_IA_TYPES",
+    "HAVE_PRCTL",
+    "SW_JPEG_ENCODE",
+    "CAMERA_HAL_DEBUG",
+    "DUMP_IMAGE",
+    "HAL_PIXEL_FORMAT_NV12_LINEAR_CAMERA_INTEL=0x10F",
+    "ENABLE_SANDBOXING",
+    "FACE_DETECTION",
+  ]
+  libs = [
+    "camera_client",
+    "camera_metadata",
+    "camera_common",
+    "cbm",
+    "jpeg",
+    "dl",
+  ]
+  pkg_deps = [
+    "cros-camera-android-headers",
+    "expat",
+    "libcab",
+    "libcamera_client",
+    "libcamera_common",
+    "libcamera_exif",
+    "libcamera_metadata",
+    "libcamera_v4l2_device",
+    "libcbm",
+    "libchrome-${libbase_ver}",
+    "libmojo-${libbase_ver}",
+    "libsync",
+    "libyuv",
+  ]
+  if (use.ipu6se) {
+    sources += [
+      "modules/ia_css/ipu6se/src/ia_css_program_group_param.c",
+      "modules/ia_css/ipu6se/src/ia_css_psys_process_group.c",
+      "modules/ia_css/ipu6se/src/ia_css_psys_program_group_manifest.c",
+      "modules/ia_css/ipu6se/src/ia_css_psys_terminal_manifest.c",
+      "modules/ia_css/ipu6se/src/ia_css_kernel_bitmap.c",
+      "modules/ia_css/ipu6se/src/ia_css_terminal_manifest.c",
+      "modules/ia_css/ipu6se/src/ia_css_psys_program_manifest.c",
+      "modules/ia_css/ipu6se/src/ia_css_psys_process.c",
+      "modules/ia_css/ipu6se/src/ia_css_psys_terminal.c",
+      "modules/ia_css/ipu6se/src/ia_css_psys_process_group_cmd_impl.c",
+      "modules/ia_css/ipu6se/src/vied_nci_psys_system.c",
+      "modules/ia_css/ipu6se/src/ia_css_terminal.c",
+      "modules/ia_css/ipu6se/src/ia_css_program_group_data.c",
+      "modules/ia_css/ipu6se/src/ia_css_rbm.c",
+    ]
+    include_dirs += [
+      "modules/ia_css/ipu6se/include",
+    ]
+    defines += [
+      "IPU_SYSVER_ipu6v3",
+    ]
+  } else {
+    sources += [
+      "modules/ia_css/ipu6/src/ia_css_program_group_param.c",
+      "modules/ia_css/ipu6/src/ia_css_psys_process_group.c",
+      "modules/ia_css/ipu6/src/ia_css_psys_program_group_manifest.c",
+      "modules/ia_css/ipu6/src/ia_css_psys_terminal_manifest.c",
+      "modules/ia_css/ipu6/src/ia_css_kernel_bitmap.c",
+      "modules/ia_css/ipu6/src/ia_css_terminal_manifest.c",
+      "modules/ia_css/ipu6/src/ia_css_psys_program_manifest.c",
+      "modules/ia_css/ipu6/src/ia_css_psys_process.c",
+      "modules/ia_css/ipu6/src/ia_css_psys_terminal.c",
+      "modules/ia_css/ipu6/src/ia_css_psys_process_group_cmd_impl.c",
+      "modules/ia_css/ipu6/src/vied_nci_psys_system.c",
+      "modules/ia_css/ipu6/src/ia_css_terminal.c",
+      "modules/ia_css/ipu6/src/ia_css_program_group_data.c",
+      "modules/ia_css/ipu6/src/ia_css_rbm.c",
+    ]
+    include_dirs += [
+      "modules/ia_css/ipu6/include",
+    ]
+  }
+  deps = [ "//camera/common/libcamera_ipc:libcamera_ipc_mojom" ]
+}
+
+shared_library("libcam_algo") {
+  sources = [
+    "src/3a/DvsResult.cpp",
+    "src/iutils/Utils.cpp",
+    "src/iutils/Trace.cpp",
+    "src/iutils/ScopedAtrace.cpp",
+    "src/iutils/Thread.cpp",
+    "src/iutils/CameraLog.cpp",
+    "src/platformdata/gc/FormatUtils.cpp",
+    "src/platformdata/gc/GraphUtils.cpp",
+    "src/core/psysprocessor/PGUtils.cpp",
+    "modules/sandboxing/IPCCommon.cpp",
+    "modules/sandboxing/IPCIntelLard.cpp",
+    "modules/sandboxing/IPCIntelFD.cpp",
+    "modules/sandboxing/IPCGraphConfig.cpp",
+    "modules/sandboxing/IPCIntelCmc.cpp",
+    "modules/sandboxing/IPCIntelMkn.cpp",
+    "modules/sandboxing/IPCIntelLtm.cpp",
+    "modules/sandboxing/IPCIntelAiq.cpp",
+    "modules/sandboxing/IPCIntelDvs.cpp",
+    "modules/sandboxing/IPCIspParamAdaptor.cpp",
+    "modules/sandboxing/IPCIntelPGParam.cpp",
+    "modules/sandboxing/server/IntelAlgoServer.cpp",
+    "modules/sandboxing/server/IntelLardServer.cpp",
+    "modules/sandboxing/server/IntelFDServer.cpp",
+    "modules/sandboxing/server/GraphConfigServer.cpp",
+    "modules/sandboxing/server/IntelCmcServer.cpp",
+    "modules/sandboxing/server/IntelMknServer.cpp",
+    "modules/sandboxing/server/IntelLtmServer.cpp",
+    "modules/sandboxing/server/IntelAiqServer.cpp",
+    "modules/sandboxing/server/IntelDvsServer.cpp",
+    "modules/sandboxing/server/IspParamAdaptorServer.cpp",
+    "modules/sandboxing/server/IntelPGParamServer.cpp",
+    "modules/algowrapper/IntelLard.cpp",
+    "modules/algowrapper/IntelFaceDetection.cpp",
+    "modules/algowrapper/graph/GraphConfigImpl.cpp",
+    "modules/algowrapper/graph/GraphConfigPipe.cpp",
+    "modules/algowrapper/IntelCmc.cpp",
+    "modules/algowrapper/IntelMkn.cpp",
+    "modules/algowrapper/IntelLtm.cpp",
+    "modules/algowrapper/IntelAiq.cpp",
+    "modules/algowrapper/IntelDvs.cpp",
+    "modules/algowrapper/IntelIspParamAdaptor.cpp",
+    "modules/algowrapper/IntelPGParam.cpp",
+    "src/3a/AiqUtils.cpp",
+  ]
+  cflags_cc = [
+    "-fvisibility=default",
+  ]
+  include_dirs = [
+    ".",
+    "include",
+    "include/api",
+    "include/utils",
+    "include/linux",
+    "src",
+    "src/fd",
+    "src/platformdata",
+    "src/platformdata/gc",
+    "src/v4l2",
+    "src/iutils",
+    "src/core",
+    "src/core/psysprocessor",
+    "src/metadata",
+    "src/3a/intel3a",
+    "src/3a/external",
+    "src/3a",
+    "src/image_process",
+    "src/image_process/chrome",
+    "src/jpeg/",
+    "src/jpeg/sw",
+    "aal",
+    "aal/chrome",
+    "modules/memory",
+    "modules/memory/chrome",
+    "include/ia_imaging",
+    "include",
+    "include/gcss",
+ ]
+  defines = [
+    "CAL_BUILD",
+    "IPU_SYSVER_IPU6",
+    "USE_PG_LITE_PIPE",
+    "HAVE_LINUX_OS",
+    "__STDC_FORMAT_MACROS",
+    "HAVE_PTHREADS",
+    "HAVE_IA_TYPES",
+    "HAVE_PRCTL",
+    "SW_JPEG_ENCODE",
+    "CAMERA_HAL_DEBUG",
+    "DUMP_IMAGE",
+    "HAL_PIXEL_FORMAT_NV12_LINEAR_CAMERA_INTEL=0x10F",
+    "ENABLE_SANDBOXING",
+    "FACE_DETECTION",
+  ]
+  libs = [
+    "ia_aiq",
+    "ia_cmc_parser",
+    "ia_exc",
+    "ia_log",
+    "ia_mkn",
+    "ia_ltm",
+    "ia_isp_bxt",
+    "ia_dvs",
+    "ia_lard",
+    "pvl_eye_detection",
+    "pvl_face_detection",
+    "pvl_mouth_detection",
+    "gcss",
+    "ia_aiqb_parser",
+  ]
+  pkg_deps = [
+    "cros-camera-android-headers",
+    "libcab",
+    "libmojo-${libbase_ver}",
+  ]
+  if (use.ipu6se) {
+    libs += [
+      "ipu6sepla",
+      "ia_p2p_ipu6sepla",
+    ]
+    defines += [
+      "IPU_SYSVER_ipu6v3",
+    ]
+    include_dirs += [
+      "modules/ia_css/ipu6se/include",
+    ]
+  } else {
+    libs += [
+      "ipu6",
+      "ia_p2p_ipu6",
+    ]
+    include_dirs += [
+      "modules/ia_css/ipu6/include",
+    ]
+  }
+  deps = [ "//camera/common/libcamera_ipc:libcamera_ipc_mojom" ]
+}
diff --git a/camera/hal/intel/ipu6/aal/Camera3AMetadata.cpp b/camera/hal/intel/ipu6/aal/Camera3AMetadata.cpp
new file mode 100644
index 000000000000..0d84a130f35a
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/Camera3AMetadata.cpp
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2018-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "Camera3AMetadata"
+
+#include "Utils.h"
+
+#include "HALv3Header.h"
+#include "HALv3Utils.h"
+#include "Camera3AMetadata.h"
+
+namespace camera3 {
+
+Camera3AMetadata::Camera3AMetadata(int cameraId) : mCameraId(cameraId)
+{
+    LOG1("@%s", __func__);
+
+    mIntelAFStateMachine = new IntelAFStateMachine(mCameraId);
+    mIntelAEStateMachine = new IntelAEStateMachine(mCameraId);
+    mIntelAWBStateMachine = new IntelAWBStateMachine(mCameraId);
+}
+
+Camera3AMetadata::~Camera3AMetadata()
+{
+    LOG1("@%s", __func__);
+
+    delete mIntelAFStateMachine;
+    delete mIntelAEStateMachine;
+    delete mIntelAWBStateMachine;
+}
+
+void Camera3AMetadata::process3Astate(const icamera::Parameters &parameter,
+                                      android::CameraMetadata &metadata)
+{
+    LOG2("@%s", __func__);
+
+    // get 3a info from metadata
+    uint8_t afTrigger = ANDROID_CONTROL_AF_TRIGGER_IDLE;
+    camera_metadata_entry entry = metadata.find(ANDROID_CONTROL_AF_TRIGGER);
+    if (entry.count == 1) {
+        afTrigger = entry.data.u8[0];
+    }
+
+    uint8_t afMode = ANDROID_CONTROL_AF_MODE_AUTO;
+    entry = metadata.find(ANDROID_CONTROL_AF_MODE);
+    if (entry.count == 1) {
+        afMode = entry.data.u8[0];
+    }
+
+    mIntelAFStateMachine->processTriggers(afTrigger, afMode);
+
+    // get AF state
+    icamera::camera_af_state_t afState = icamera::AF_STATE_IDLE;
+    parameter.getAfState(afState);
+
+    bool lensMoving = false;
+    parameter.getLensState(lensMoving);
+    mIntelAFStateMachine->processResult(afState, lensMoving, metadata);
+
+    AeControls aeControls = {
+        ANDROID_CONTROL_AE_MODE_ON,
+        ANDROID_CONTROL_AE_LOCK_OFF,
+        ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE,
+        ANDROID_CONTROL_SCENE_MODE_DISABLED,
+        0
+    };
+    uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
+    entry = metadata.find(ANDROID_CONTROL_MODE);
+    if (entry.count == 1) {
+        controlMode = entry.data.u8[0];
+    }
+
+    uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_DISABLED;
+    entry = metadata.find(ANDROID_CONTROL_SCENE_MODE);
+    if (entry.count == 1) {
+        sceneMode = entry.data.u8[0];
+    }
+
+    entry = metadata.find(ANDROID_CONTROL_AE_MODE);
+    if (entry.count == 1) {
+        aeControls.aeMode = entry.data.u8[0];
+    }
+
+    entry = metadata.find(ANDROID_CONTROL_AE_LOCK);
+    if (entry.count == 1) {
+        aeControls.aeLock = entry.data.u8[0];
+    }
+
+    entry = metadata.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER);
+    if (entry.count == 1) {
+        aeControls.aePreCaptureTrigger = entry.data.u8[0];
+    }
+
+    entry = metadata.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION);
+    if (entry.count == 1) {
+        aeControls.evCompensation = entry.data.i32[0];
+    }
+
+    mIntelAEStateMachine->processState(controlMode, sceneMode, aeControls);
+
+    // get AE state
+    icamera::camera_ae_state_t aeState = icamera::AE_STATE_NOT_CONVERGED;
+    parameter.getAeState(aeState);
+    mIntelAEStateMachine->processResult(aeState == icamera::AE_STATE_CONVERGED, metadata);
+
+    AwbControls awbControls = {
+        ANDROID_CONTROL_AWB_MODE_AUTO,
+        ANDROID_CONTROL_AWB_LOCK_OFF,
+        0, 0
+    };
+    entry = metadata.find(ANDROID_CONTROL_AWB_MODE);
+    if (entry.count == 1) {
+        awbControls.awbMode = entry.data.u8[0];
+    }
+
+    entry = metadata.find(ANDROID_CONTROL_AWB_LOCK);
+    if (entry.count == 1) {
+        awbControls.awbLock = entry.data.u8[0];
+    }
+
+    mIntelAWBStateMachine->processState(controlMode, sceneMode, awbControls);
+
+    // get AWB state
+    icamera::camera_awb_state_t awbState = icamera::AWB_STATE_NOT_CONVERGED;
+    parameter.getAwbState(awbState);
+    mIntelAWBStateMachine->processResult(awbState == icamera::AWB_STATE_CONVERGED, metadata);
+}
+
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/Camera3AMetadata.h b/camera/hal/intel/ipu6/aal/Camera3AMetadata.h
new file mode 100644
index 000000000000..0162ba083bec
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/Camera3AMetadata.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "IntelAFStateMachine.h"
+#include "IntelAEStateMachine.h"
+#include "IntelAWBStateMachine.h"
+
+namespace camera3 {
+
+/**
+ * \class Camera3AMetadata
+ *
+ * This class is used to handle 3A related metadata. It also returns
+ * 3A state.
+ */
+class Camera3AMetadata {
+
+public:
+    Camera3AMetadata(int cameraId);
+    ~Camera3AMetadata();
+
+    void process3Astate(const icamera::Parameters &parameter, android::CameraMetadata &metadata);
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(Camera3AMetadata);
+
+private:
+    int mCameraId;
+
+    IntelAFStateMachine *mIntelAFStateMachine;
+    IntelAEStateMachine *mIntelAEStateMachine;
+    IntelAWBStateMachine *mIntelAWBStateMachine;
+};
+
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/Camera3HAL.cpp b/camera/hal/intel/ipu6/aal/Camera3HAL.cpp
new file mode 100644
index 000000000000..5526428ac16c
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/Camera3HAL.cpp
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) 2017-2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "Camera3HAL"
+
+#include <memory>
+
+#include "Utils.h"
+#include "Errors.h"
+#include "ICamera.h"
+
+#include "Camera3HAL.h"
+#include "HALv3Utils.h"
+
+namespace camera3 {
+
+/******************************************************************************
+ *  C DEVICE INTERFACE IMPLEMENTATION WRAPPER
+ *****************************************************************************/
+
+//Common check before the function call
+#define FUNCTION_PREPARED_RETURN \
+    if (!dev)\
+        return -EINVAL;\
+    Camera3HAL* camera_priv = static_cast<Camera3HAL*>(dev->priv);
+
+static int
+hal_dev_initialize(const struct camera3_device * dev,
+                   const camera3_callback_ops_t *callback_ops)
+{
+    LOG1("@%s", __func__);
+
+    FUNCTION_PREPARED_RETURN
+
+    return camera_priv->initialize(callback_ops);
+}
+
+static int
+hal_dev_configure_streams(const struct camera3_device * dev,
+                          camera3_stream_configuration_t *stream_list)
+{
+    LOG1("@%s", __func__);
+
+    FUNCTION_PREPARED_RETURN
+
+    return camera_priv->configure_streams(stream_list);
+}
+
+static const camera_metadata_t*
+hal_dev_construct_default_request_settings(const struct camera3_device * dev,
+                                           int type)
+{
+    LOG1("@%s", __func__);
+
+    if (!dev)
+        return nullptr;
+    Camera3HAL* camera_priv = (Camera3HAL*)(dev->priv);
+
+    return camera_priv->construct_default_request_settings(type);
+}
+
+static int
+hal_dev_process_capture_request(const struct camera3_device * dev,
+                                camera3_capture_request_t *request)
+{
+    LOG1("@%s", __func__);
+
+    FUNCTION_PREPARED_RETURN
+
+    return camera_priv->process_capture_request(request);
+}
+
+static void
+hal_dev_dump(const struct camera3_device * dev, int fd)
+{
+    LOG1("@%s", __func__);
+
+    if (!dev)
+        return;
+
+    Camera3HAL* camera_priv = (Camera3HAL*)(dev->priv);
+
+    camera_priv->dump(fd);
+}
+
+static int
+hal_dev_flush(const struct camera3_device * dev)
+{
+    LOG1("@%s", __func__);
+
+    if (!dev)
+        return -EINVAL;
+
+    Camera3HAL* camera_priv = (Camera3HAL*)(dev->priv);
+    return camera_priv->flush();
+}
+
+static camera3_device_ops hal_dev_ops = {
+    .initialize                         = hal_dev_initialize,
+    .configure_streams                  = hal_dev_configure_streams,
+    .register_stream_buffers            = nullptr,
+    .construct_default_request_settings = hal_dev_construct_default_request_settings,
+    .process_capture_request            = hal_dev_process_capture_request,
+    .get_metadata_vendor_tag_ops        = nullptr,
+    .dump                               = hal_dev_dump,
+    .flush                              = hal_dev_flush,
+    .reserved                           = {0},
+};
+
+/******************************************************************************
+ *  C++ CLASS IMPLEMENTATION
+ *****************************************************************************/
+Camera3HAL::Camera3HAL(int cameraId, const hw_module_t* module) :
+    mCameraId(cameraId),
+    mInitialized(false)
+{
+    LOG1("@%s", __func__);
+
+    mDevice = {};
+    mDevice.common.tag = HARDWARE_DEVICE_TAG;
+    mDevice.common.version = CAMERA_DEVICE_API_VERSION_3_3;
+    mDevice.common.module = (hw_module_t *)(module);
+    // hal_dev_close is kept in the module for symmetry with dev_open
+    // it will be set there
+    mDevice.common.close = nullptr;
+    mDevice.ops = &hal_dev_ops;
+    mDevice.priv = this;
+
+    int ret = icamera::camera_hal_init();
+    CheckError(ret != icamera::OK, VOID_VALUE, "@%s, camera_hal_init fails, ret:%d", __func__, ret);
+
+    ret = icamera::camera_device_open(cameraId);
+    if (ret != icamera::OK) {
+        LOGE("@%s, camera_device_open fails, ret:%d", __func__, ret);
+
+        icamera::camera_device_close(cameraId);
+        icamera::camera_hal_deinit();
+
+        return;
+    }
+
+    mRequestManager = std::unique_ptr<RequestManager>(new RequestManager(cameraId));
+
+    mInitialized = true;
+}
+
+Camera3HAL::~Camera3HAL()
+{
+    LOG1("@%s", __func__);
+
+    if (mRequestManager) {
+        mRequestManager->flush();
+        mRequestManager->deinit();
+
+        mRequestManager.reset(); // mRequestManager must be released before device deinit
+    }
+
+    icamera::camera_device_close(mCameraId);
+    icamera::camera_hal_deinit();
+}
+
+/* *********************************************************************
+ * Camera3 device  APIs
+ * ********************************************************************/
+int Camera3HAL::initialize(const camera3_callback_ops_t *callback_ops)
+{
+    LOG1("@%s", __func__);
+    CheckError(!mInitialized, -ENODEV, "@%s, mInitialized is false", __func__);
+    int status = icamera::OK;
+
+    if (callback_ops == nullptr)
+        return -ENODEV;
+
+    status = mRequestManager->init(callback_ops);
+    if (status != icamera::OK) {
+        LOGE("Error register callback status = %d", status);
+        return -ENODEV;
+    }
+    return status;
+}
+
+int Camera3HAL::configure_streams(camera3_stream_configuration_t *stream_list)
+{
+    LOG1("@%s", __func__);
+    CheckError(!mInitialized, -EINVAL, "@%s, mInitialized is false", __func__);
+    CheckError(!stream_list, -EINVAL, "@%s, stream_list is nullptr", __func__);
+
+    if (!stream_list->streams || !stream_list->num_streams) {
+        LOGE("%s: Bad input! streams list ptr: %p, num %d", __func__,
+            stream_list->streams, stream_list->num_streams);
+        return -EINVAL;
+    }
+    int num = stream_list->num_streams;
+    LOG2("@%s, stream num:%d", __func__, num);
+    while (num--) {
+        if (!stream_list->streams[num]){
+            LOGE("%s: Bad input! streams (%d) 's ptr: %p", __func__,
+                num, stream_list->streams[num]);
+            return -EINVAL;
+        }
+    }
+
+    int status = mRequestManager->configureStreams(stream_list);
+    return (status == icamera::OK) ? 0 : -EINVAL;
+}
+
+const camera_metadata_t* Camera3HAL::construct_default_request_settings(int type)
+{
+    LOG1("@%s, type:%d", __func__, type);
+    CheckError(!mInitialized, nullptr, "@%s, mInitialized is false", __func__);
+
+    if (type < CAMERA3_TEMPLATE_PREVIEW || type >= CAMERA3_TEMPLATE_COUNT)
+        return nullptr;
+
+    const camera_metadata_t * meta = nullptr;
+    int status = mRequestManager->constructDefaultRequestSettings(type, &meta);
+    CheckError(status != icamera::OK, nullptr, "construct default request setting error");
+
+    return meta;
+}
+
+int Camera3HAL::process_capture_request(camera3_capture_request_t *request)
+{
+    LOG2("@%s", __func__);
+    CheckError(!mInitialized, -EINVAL, "@%s, mInitialized is false", __func__);
+
+    if (request == nullptr) {
+        LOGE("%s: request is null!", __func__);
+        return -EINVAL;
+    } else if (!request->num_output_buffers || request->output_buffers == nullptr) {
+        LOGE("%s: num_output_buffers %d, output_buffers %p", __func__,
+              request->num_output_buffers, request->output_buffers);
+        return -EINVAL;
+    } else if (request->output_buffers->stream == nullptr) {
+        LOGE("%s: output_buffers->stream is null!", __func__);
+        return -EINVAL;
+    } else if (request->output_buffers->stream->priv == nullptr) {
+        LOGE("%s: output_buffers->stream->priv is null!", __func__);
+        return -EINVAL;
+    } else if (request->output_buffers->buffer == nullptr
+          || *(request->output_buffers->buffer) == nullptr) {
+        LOGE("%s: output buffer is invalid", __func__);
+        return -EINVAL;
+    }
+
+    int status = mRequestManager->processCaptureRequest(request);
+    if (status == icamera::OK)
+        return icamera::OK;
+
+    return (status == icamera::BAD_VALUE) ? -EINVAL : -ENODEV;
+}
+
+void Camera3HAL::dump(int fd)
+{
+    LOG1("@%s", __func__);
+    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
+
+    mRequestManager->dump(fd);
+}
+
+int Camera3HAL::flush()
+{
+    LOG1("@%s", __func__);
+    CheckError(!mInitialized, icamera::UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
+
+    return mRequestManager->flush();
+}
+
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/Camera3HAL.h b/camera/hal/intel/ipu6/aal/Camera3HAL.h
new file mode 100644
index 000000000000..5a9f81ff7914
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/Camera3HAL.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2018-2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <hardware/camera3.h>
+
+#include <memory>
+
+#include "RequestManager.h"
+
+namespace camera3 {
+
+/**
+ * \class Camera3HAL
+ *
+ * This class represents a single HAL device instance. It has the following
+ * roles:
+ * - It implements the camera3_device_ops_t  API  defined by Android.
+ * - It instantiates RequestManager.
+ */
+class Camera3HAL : public camera3_device_ops_t {
+
+public:
+    Camera3HAL(int cameraId, const hw_module_t* module);
+    virtual ~Camera3HAL();
+    bool isInitialized() { return mInitialized; }
+    camera3_device_t* getDeviceStruct() { return &mDevice; }
+    int getCameraId() { return mCameraId; };
+
+    /**********************************************************************
+     * camera3_device_ops_t implementation
+     */
+    int initialize(const camera3_callback_ops_t *callback_ops);
+
+    int configure_streams(camera3_stream_configuration_t *stream_list);
+
+    const camera_metadata_t* construct_default_request_settings(int type);
+
+    int process_capture_request(camera3_capture_request_t *request);
+
+    void get_metadata_vendor_tag_ops(vendor_tag_query_ops_t *ops);
+
+    void dump(int fd);
+
+    int flush();
+
+private:
+    int mCameraId;
+    std::unique_ptr<RequestManager> mRequestManager;
+    camera3_device_t   mDevice;
+
+    bool mInitialized;
+};
+
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/Camera3HALModule.cpp b/camera/hal/intel/ipu6/aal/Camera3HALModule.cpp
new file mode 100644
index 000000000000..8416b93a00bb
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/Camera3HALModule.cpp
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define LOG_TAG "Camera3HALModule"
+
+#include <mutex>
+#include <hardware/camera3.h>
+#include <hardware/hardware.h>
+
+#include "iutils/CameraDump.h"
+#include "Utils.h"
+#include "ICamera.h"
+
+#include "MetadataConvert.h"
+#include "Camera3HAL.h"
+#include "HALv3Utils.h"
+
+namespace camera3 {
+
+#define MAX_CAMERAS 2
+
+/**
+ * \macro VISIBILITY_PUBLIC
+ *
+ * Controls the visibility of symbols in the shared library.
+ * In production builds all symbols in the shared library are hidden
+ * except the ones using this linker attribute.
+ */
+#define VISIBILITY_PUBLIC __attribute__ ((visibility ("default")))
+
+static int hal_dev_close(hw_device_t* device);
+
+/**********************************************************************
+ * Camera Module API (C API)
+ **********************************************************************/
+
+static bool sInstances[MAX_CAMERAS] = {false, false};
+static int sInstanceCount = 0;
+// sCameraMetadata buffer won't be free in CAL
+static android::CameraMetadata *sCameraMetadata[MAX_CAMERAS] = { nullptr };
+
+/**
+ * Global mutex used to protect sInstanceCount and sInstances
+ */
+static std::mutex sCameraHalMutex;
+
+int openCameraHardware(int id, const hw_module_t* module, hw_device_t** device)
+{
+    LOG1("@%s", __func__);
+
+    if (sInstances[id])
+        return 0;
+
+    Camera3HAL* halDev = new Camera3HAL(id, module);
+    if (!halDev->isInitialized()) {
+        LOGE("HAL initialization fail!");
+        delete halDev;
+        return -EINVAL;
+    }
+    camera3_device_t *cam3Device = halDev->getDeviceStruct();
+
+    cam3Device->common.close = hal_dev_close;
+    *device = &cam3Device->common;
+
+    sInstanceCount++;
+    sInstances[id] = true;
+
+    LOG1("@%s end", __func__);
+    return 0;
+}
+
+static int hal_get_number_of_cameras(void)
+{
+    LOG1("@%s", __func__);
+
+    return icamera::get_number_of_cameras();
+}
+
+static int hal_get_camera_info(int cameraId, struct camera_info *cameraInfo)
+{
+    LOG1("@%s", __func__);
+
+    if (cameraId < 0 || !cameraInfo ||
+          cameraId >= hal_get_number_of_cameras())
+        return -EINVAL;
+
+    icamera::camera_info_t info;
+    icamera::get_camera_info(cameraId, info);
+
+    if (sCameraMetadata[cameraId] == nullptr) {
+        sCameraMetadata[cameraId] = new android::CameraMetadata;
+        MetadataConvert::HALCapabilityToStaticMetadata(*(info.capability),
+                                                       sCameraMetadata[cameraId]);
+    }
+    int32_t tag = ANDROID_LENS_FACING;
+    camera_metadata_entry entry = sCameraMetadata[cameraId]->find(tag);
+    if (entry.count == 1) {
+        info.facing = entry.data.u8[0];
+    }
+    tag = ANDROID_SENSOR_ORIENTATION;
+    entry = sCameraMetadata[cameraId]->find(tag);
+    if (entry.count == 1) {
+        info.orientation = entry.data.u8[0];
+    }
+    memset(cameraInfo, 0, sizeof(camera_info));
+    cameraInfo->facing = info.facing ? CAMERA_FACING_BACK : CAMERA_FACING_FRONT;
+    cameraInfo->device_version = CAMERA_DEVICE_API_VERSION_3_3;
+    cameraInfo->orientation = info.orientation;
+    const camera_metadata_t *settings = sCameraMetadata[cameraId]->getAndLock();
+    cameraInfo->static_camera_characteristics = settings;
+    sCameraMetadata[cameraId]->unlock(settings);
+
+    return 0;
+}
+
+static int hal_set_callbacks(const camera_module_callbacks_t *callbacks)
+{
+    LOG1("@%s", __func__);
+
+    UNUSED(callbacks);
+    return 0;
+}
+
+static int hal_dev_open(const hw_module_t* module, const char* name,
+                        hw_device_t** device)
+{
+    icamera::Log::setDebugLevel();
+    icamera::CameraDump::setDumpLevel();
+
+    LOG1("@%s", __func__);
+
+    int status = -EINVAL;
+    int camera_id;
+
+    if (!name || !module || !device) {
+        LOGE("Camera name is nullptr");
+        return status;
+    }
+
+    LOG1("%s, camera id: %s", __func__, name);
+    camera_id = atoi(name);
+    if (camera_id < 0 || camera_id >= hal_get_number_of_cameras()) {
+        LOGE("%s: Camera id %d is out of bounds, num. of cameras (%d)",
+             __func__, camera_id, hal_get_number_of_cameras());
+        return -ENODEV;
+    }
+
+    std::lock_guard<std::mutex> l(sCameraHalMutex);
+
+    if (sInstanceCount > 0 && sInstances[camera_id]) {
+        LOGW("Camera already has been opened!");
+        return -EUSERS;
+    }
+
+    return openCameraHardware(camera_id, module, device);
+}
+
+static int hal_dev_close(hw_device_t* device)
+{
+    LOG1("@%s", __func__);
+
+    if (!device || sInstanceCount == 0) {
+        LOGW("hal close, instance count %d", sInstanceCount);
+        return -EINVAL;
+    }
+
+    camera3_device_t *camera3_dev = (struct camera3_device *)device;
+    Camera3HAL* camera_priv = static_cast<Camera3HAL*>(camera3_dev->priv);
+
+    if (camera_priv != nullptr) {
+        std::lock_guard<std::mutex> l(sCameraHalMutex);
+        int id = camera_priv->getCameraId();
+        delete camera_priv;
+        sInstanceCount--;
+        sInstances[id] = false;
+    }
+
+    LOG1("%s, instance count %d", __func__, sInstanceCount);
+
+    return 0;
+}
+
+static int hal_set_torch_mode (const char* camera_id, bool enabled){
+    LOG1("@%s", __func__);
+
+    UNUSED(camera_id);
+    UNUSED(enabled);
+    return -ENOSYS;
+}
+
+static struct hw_module_methods_t hal_module_methods = {
+    .open = hal_dev_open
+};
+
+static hw_module_t camera_common = {
+    .tag                = HARDWARE_MODULE_TAG,
+    .module_api_version = CAMERA_MODULE_API_VERSION_2_3,
+    .hal_api_version    = HARDWARE_HAL_API_VERSION,
+    .id                 = CAMERA_HARDWARE_MODULE_ID,
+    .name               = "Intel Camera3HAL Module",
+    .author             = "Intel",
+    .methods            = &hal_module_methods,
+    .dso                = nullptr,
+    .reserved           = {0}
+};
+
+extern "C" {
+camera_module_t VISIBILITY_PUBLIC HAL_MODULE_INFO_SYM = {
+    .common                = camera_common,
+    .get_number_of_cameras = hal_get_number_of_cameras,
+    .get_camera_info       = hal_get_camera_info,
+    .set_callbacks         = hal_set_callbacks,
+    .get_vendor_tag_ops    = nullptr,
+    .open_legacy           = nullptr,
+    .set_torch_mode        = hal_set_torch_mode,
+    .init                  = nullptr,
+    .reserved              = {0}
+};
+}
+
+} //namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/Camera3Stream.cpp b/camera/hal/intel/ipu6/aal/Camera3Stream.cpp
new file mode 100644
index 000000000000..178b616ba7bb
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/Camera3Stream.cpp
@@ -0,0 +1,407 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "Camera3Stream"
+
+#include "stdlib.h"
+
+#include "Errors.h"
+#include "Utils.h"
+#include "ICamera.h"
+
+#include "HALv3Utils.h"
+
+#include "MetadataConvert.h"
+#include "Camera3Stream.h"
+#include "CameraDump.h"
+#include "PlatformData.h"
+
+namespace camera3 {
+Camera3Stream::Camera3Stream(int cameraId, CallbackEventInterface *callback,
+                             uint32_t maxNumReqInProc, const icamera::stream_t &halStream,
+                             const camera3_stream_t &stream,
+                             const camera3_stream_t *inputStream) :
+    mCameraId(cameraId),
+    mEventCallback(callback),
+    mPostProcessType(icamera::POST_PROCESS_NONE),
+    mStreamState(false),
+    mHALStream(halStream),
+    mMaxNumReqInProc(maxNumReqInProc),
+    mPostProcessBufPool(nullptr),
+    mStream(stream),
+    mFaceDetection(nullptr),
+    mFDRunDefaultInterval(icamera::PlatformData::faceEngineRunningInterval(cameraId)),
+    mFDRunIntervalNoFace(icamera::PlatformData::faceEngineRunningIntervalNoFace(cameraId)),
+    mFDRunInterval(icamera::PlatformData::faceEngineRunningInterval(cameraId)),
+    mFrameCnt(0),
+    mInputPostProcessType(icamera::POST_PROCESS_NONE)
+{
+    LOG1("[%d]@%s, mMaxNumReqInProc:%d, inputStream:%p, stream:%dx%d, format:%d, type:%d",
+         mHALStream.id, __func__, mMaxNumReqInProc, inputStream,
+         mHALStream.width, mHALStream.height, mHALStream.format, mStream.stream_type);
+
+    mPostProcessor = std::unique_ptr<PostProcessor>(new PostProcessor(mCameraId, stream));
+    mPostProcessBufPool = std::unique_ptr<Camera3BufferPool>(new Camera3BufferPool());
+
+    if (inputStream) {
+        LOG2("@%s, inputStream: width:%d, height:%d, format:%d", __func__,
+             inputStream->width, inputStream->height, inputStream->format);
+
+        mInputPostProcessor = std::unique_ptr<PostProcessor>(new PostProcessor(mCameraId, stream));
+        mInputStream = std::unique_ptr<camera3_stream_t>(new camera3_stream_t);
+        *mInputStream = *inputStream;
+    }
+
+    LOG2("@%s, mFaceDetection:%p, mFDRunDefaultInterval:%d, mFDRunIntervalNoFace:%d",
+         __func__, mFaceDetection, mFDRunDefaultInterval, mFDRunIntervalNoFace);
+}
+
+Camera3Stream::~Camera3Stream()
+{
+    LOG1("[%d]@%s", mHALStream.id, __func__);
+
+    setActive(false);
+
+    for (auto& buf : mBuffers) {
+        buf.second->unlock();
+    }
+
+    mBuffers.clear();
+    std::lock_guard<std::mutex> l(mLock);
+    mCaptureResultVector.clear();
+}
+
+void Camera3Stream::sendEvent(const icamera::camera_msg_data_t &data) {
+    LOG2("@%s receive sof event: %ld", __func__, data.data.buffer_ready.timestamp);
+
+    std::lock_guard<std::mutex> sofLock(mSofLock);
+    mSofCondition.notify_one();
+}
+
+void Camera3Stream::handleSofAlignment() {
+    if (!icamera::PlatformData::swProcessingAlignWithIsp(mCameraId))
+        return;
+
+    std::unique_lock<std::mutex> sofLock(mSofLock);
+    std::cv_status ret = mSofCondition.wait_for(sofLock,
+        std::chrono::nanoseconds(kMaxDuration * SLOWLY_MULTIPLIER));
+
+    if (ret == std::cv_status::timeout) {
+        LOGW("%s, [%d] wait sof timeout, skip alignment this time", __func__, mHALStream.id);
+    }
+    LOG2("%s, [%d] running post processing align with sof event", __func__, mHALStream.id);
+}
+
+bool Camera3Stream::threadLoop()
+{
+    LOG1("[%d]@%s", mHALStream.id, __func__);
+
+    std::shared_ptr<CaptureResult> result = nullptr;
+    {
+    std::unique_lock<std::mutex> lock(mLock);
+    // check if there is buffer queued
+    if (mCaptureResultVector.empty()) {
+        std::cv_status ret = mBufferDoneCondition.wait_for(
+                lock,
+                std::chrono::nanoseconds(kMaxDuration * SLOWLY_MULTIPLIER));
+        if (ret == std::cv_status::timeout) {
+            LOGW("[%d]%s, wait request time out", mHALStream.id, __func__);
+        }
+
+        return true;
+    }
+    result = mCaptureResultVector.at(0);
+    }
+
+    // dequeue buffer from HAL
+    icamera::camera_buffer_t *buffer = nullptr;
+    icamera::Parameters parameter;
+
+    std::shared_ptr<Camera3Buffer> inputCam3Buf = result->inputCam3Buf;
+
+    if (!inputCam3Buf) {
+        int ret = icamera::camera_stream_dqbuf(mCameraId, mHALStream.id, &buffer, &parameter);
+        CheckError(ret != icamera::OK || !buffer,
+                   true, "[%d]failed to dequeue buffer, ret %d", mHALStream.id, ret);
+
+        LOG2("%s, buffer->timestamp:%lld", __func__, buffer->timestamp);
+    }
+
+    {
+    std::unique_lock<std::mutex> lock(mLock);
+    mCaptureResultVector.erase(mCaptureResultVector.begin());
+    }
+
+    buffer_handle_t handle = result->handle;
+    std::shared_ptr<Camera3Buffer> ccBuf = nullptr;
+    {
+    std::unique_lock<std::mutex> lock(mLock);
+    CheckError(mBuffers.find(handle) == mBuffers.end(), false, "can't find handle %p", handle);
+
+    ccBuf = mBuffers[handle];
+    mBuffers.erase(handle);
+    CheckError(ccBuf == nullptr, false, "ccBuf is nullptr");
+    }
+
+    int dumpOutputFmt = V4L2_PIX_FMT_NV12;
+    if (!inputCam3Buf && mHALStream.usage != icamera::CAMERA_STREAM_OPAQUE_RAW) {
+        LOG2("%s, hal buffer: %p, ccBuf address: %p", __func__, buffer->addr, ccBuf->data());
+        // handle normal postprocess
+        if (mPostProcessType != icamera::POST_PROCESS_NONE) {
+            LOG2("[%d]%s Post processing buffer.", mHALStream.id, __func__);
+
+            handleSofAlignment();
+            LOG2("%s, do software postProcessing for sequence: %ld", __func__, buffer->sequence);
+            std::shared_ptr<Camera3Buffer> inBuf = mPostProcessBufPool->findBuffer(buffer->addr);
+            CheckError(!inBuf, false, "failed to find the buffer in still pool");
+
+            icamera::status_t status = mPostProcessor->doPostProcessing(inBuf, parameter, ccBuf);
+            CheckError(status != icamera::OK, true, "@%s, doPostProcessing fails, mPostProcessType:%d",
+                  __func__, mPostProcessType);
+
+            // return internal buffer after post processing
+            LOG2("return buffer:%p add:%p after post processing", buffer, buffer->addr);
+            mPostProcessBufPool->returnBuffer(inBuf);
+        }
+        if (mPostProcessType & icamera::POST_PROCESS_JPEG_ENCODING) {
+            dumpOutputFmt = V4L2_PIX_FMT_JPEG;
+        }
+    } else if (inputCam3Buf) {
+        parameter = result->param;
+
+        inputCam3Buf->dumpImage(result->frameNumber, icamera::DUMP_AAL_INPUT, V4L2_PIX_FMT_NV12);
+        if (mInputPostProcessType != icamera::POST_PROCESS_NONE) {
+            icamera::status_t status = mInputPostProcessor->doPostProcessing(inputCam3Buf, parameter, ccBuf);
+            CheckError(status != icamera::OK, true, "@%s, doPostProcessing fails, mInputPostProcessType:%d",
+                  __func__, mInputPostProcessType);
+        } else {
+            MEMCPY_S(ccBuf->data(), ccBuf->size(), inputCam3Buf->data(), inputCam3Buf->size());
+        }
+
+        if (mInputPostProcessType & icamera::POST_PROCESS_JPEG_ENCODING) {
+            dumpOutputFmt = V4L2_PIX_FMT_JPEG;
+        }
+    }
+
+    faceRunningByCondition(ccBuf->getHalBuffer());
+
+    ccBuf->dumpImage(result->frameNumber, icamera::DUMP_AAL_OUTPUT, dumpOutputFmt);
+    ccBuf->unlock();
+    ccBuf->deinit();
+    ccBuf->getFence(&result->outputBuffer);
+
+    // notify shutter done
+    if (inputCam3Buf || mHALStream.usage == icamera::CAMERA_STREAM_OPAQUE_RAW) {
+        ShutterEvent shutterEvent = {result->frameNumber, inputCam3Buf ? 0 : buffer->timestamp};
+        mEventCallback->shutterDone(shutterEvent);
+    }
+
+    // notify frame done
+    BufferEvent bufferEvent = {};
+    bufferEvent.frameNumber = result->frameNumber;
+    if (!inputCam3Buf) {
+        bufferEvent.timestamp = buffer->timestamp;
+    }
+    bufferEvent.parameter = &parameter;
+    bufferEvent.outputBuffer = &result->outputBuffer;
+
+    mEventCallback->bufferDone(bufferEvent);
+
+    return true;
+}
+
+void Camera3Stream::faceRunningByCondition(const icamera::camera_buffer_t &buffer) {
+    if (!mFaceDetection)
+        return;
+
+    LOG2("[%d]@%s", mHALStream.id, __func__);
+
+    /*
+       FD runs 1 frame every mFDRunInterval frames.
+       And the default value of mFDRunInterval is mFDRunDefaultInterval
+    */
+    if (mFrameCnt % mFDRunInterval == 0) {
+        mFaceDetection->runFaceDetection(buffer);
+    }
+
+    /*
+       When face doesn't be detected during mFDRunIntervalNoFace's frame,
+       we may change FD running's interval frames.
+    */
+    if (mFDRunIntervalNoFace > mFDRunDefaultInterval) {
+        static unsigned int noFaceCnt = 0;
+        int faceNum = mFaceDetection->getFaceNum();
+
+        /*
+           The purpose of changing the value of the variable is to run FD immediately when face
+           is detected.
+        */
+        if (faceNum == 0) {
+            if (mFDRunInterval != mFDRunIntervalNoFace) {
+                noFaceCnt = ++noFaceCnt % mFDRunIntervalNoFace;
+                if (noFaceCnt == 0) {
+                    mFDRunInterval = mFDRunIntervalNoFace;
+                }
+            }
+        } else {
+           if (mFDRunInterval != mFDRunDefaultInterval) {
+                mFDRunInterval = mFDRunDefaultInterval;
+                mFrameCnt =  mFDRunInterval - 1;
+                noFaceCnt = 0;
+            }
+        }
+    }
+
+    mFrameCnt = ++mFrameCnt % mFDRunInterval;
+}
+
+void Camera3Stream::requestExit()
+{
+    LOG1("[%d]@%s", mHALStream.id, __func__);
+
+    icamera::Thread::requestExit();
+    std::lock_guard<std::mutex> l(mLock);
+    mBufferDoneCondition.notify_one();
+
+    if (mFaceDetection) {
+        icamera::FaceDetection::destoryInstance(mCameraId);
+        mFaceDetection = nullptr;
+    }
+}
+
+int Camera3Stream::processRequest(const std::shared_ptr<Camera3Buffer> &inputCam3Buf,
+                                  const camera3_stream_buffer_t &outputBuffer,
+                                  icamera::camera_buffer_t *buffer)
+{
+    LOG1("[%d]@%s", mHALStream.id, __func__);
+
+    std::shared_ptr<Camera3Buffer> ccBuf = std::make_shared<Camera3Buffer>();
+    buffer_handle_t handle = *outputBuffer.buffer;
+
+    {
+    std::unique_lock<std::mutex> lock(mLock);
+    CheckError(mBuffers.find(handle) != mBuffers.end(), icamera::BAD_VALUE,
+               "handle %p is duplicated!", handle);
+
+    mBuffers[handle] = ccBuf;
+    }
+
+    icamera::status_t status = ccBuf->init(&outputBuffer, mCameraId);
+    CheckError(status != icamera::OK, icamera::BAD_VALUE, "Failed to init CameraBuffer");
+    status = ccBuf->waitOnAcquireFence();
+    CheckError(status != icamera::OK, icamera::BAD_VALUE, "Failed to sync CameraBuffer");
+    status = ccBuf->lock();
+    CheckError(status != icamera::OK, icamera::BAD_VALUE, "Failed to lock buffer");
+
+    if (inputCam3Buf) {
+        return icamera::OK;
+    }
+
+    *buffer = ccBuf->getHalBuffer();
+    if (mPostProcessType != icamera::POST_PROCESS_NONE) {
+        std::shared_ptr<Camera3Buffer> buf = mPostProcessBufPool->acquireBuffer();
+        CheckError(buf == nullptr, icamera::BAD_VALUE, "no available internal buffer for still");
+
+        *buffer = buf->getHalBuffer();
+    }
+    LOG2("@%s [%d] buffer:%p addr: %p, fd: %d",
+         __func__, mHALStream.id, buffer, buffer->addr, buffer->dmafd);
+
+    // Fill the specific setting
+    buffer->s.usage = mHALStream.usage;
+    buffer->s.id = mHALStream.id;
+
+    return icamera::OK;
+}
+
+void Camera3Stream::queueBufferDone(uint32_t frameNumber,
+                                    const std::shared_ptr<Camera3Buffer> &inputCam3Buf,
+                                    const camera3_stream_buffer_t &outputBuffer,
+                                    const icamera::Parameters &param)
+{
+    LOG1("[%d]@%s, frameNumber:%d", mHALStream.id, __func__, frameNumber);
+
+    std::lock_guard<std::mutex> l(mLock);
+
+    std::shared_ptr<CaptureResult> result = std::make_shared<CaptureResult>();
+    result->frameNumber = frameNumber;
+    result->outputBuffer = outputBuffer;
+    result->handle = *outputBuffer.buffer;
+    result->outputBuffer.buffer = &result->handle;
+    result->inputCam3Buf = inputCam3Buf;
+    result->param = param;
+
+    mCaptureResultVector.push_back(result);
+    mBufferDoneCondition.notify_one();
+}
+
+int Camera3Stream::setActive(bool state)
+{
+    LOG1("[%d]@%s state %d", mHALStream.id, __func__, state);
+
+    if (!mStreamState && state) {
+        std::string threadName = "Cam3Stream-";
+        threadName += std::to_string(mHALStream.id);
+
+        // Run Camera3Stream thread
+        run(threadName);
+
+        if (mHALStream.usage != icamera::CAMERA_STREAM_OPAQUE_RAW) {
+            // configure the post processing.
+            // Note: the mHALStream may be changed after calling this function
+            mPostProcessor->configure(mStream, mHALStream);
+            mPostProcessType = mPostProcessor->getPostProcessType();
+            LOG2("@%s, mPostProcessType:%d", __func__, mPostProcessType);
+        }
+
+        // Allocate local buffer pool for post-processing
+        int ret = icamera::OK;
+        if (mPostProcessType != icamera::POST_PROCESS_NONE) {
+            ret = mPostProcessBufPool->createBufferPool(mCameraId, mMaxNumReqInProc, mHALStream);
+            CheckError(ret != icamera::OK, icamera::NO_MEMORY, "Failed to create buffer pool for post processor");
+        }
+
+        if (mInputPostProcessor) {
+            mInputPostProcessor->configure(mStream, *mInputStream.get());
+            mInputPostProcessType = mInputPostProcessor->getPostProcessType();
+        }
+    } else if (mStreamState && !state) {
+        if (mPostProcessType != icamera::POST_PROCESS_NONE) {
+            mPostProcessBufPool->destroyBufferPool();
+            mPostProcessType = icamera::POST_PROCESS_NONE;
+        }
+
+        if (mInputPostProcessor) {
+            mInputPostProcessType = icamera::POST_PROCESS_NONE;
+        }
+
+        // Exit Camera3Stream thread
+        requestExit();
+    }
+
+    mStreamState = state;
+
+    return icamera::OK;
+}
+
+void Camera3Stream::activateFaceDetection(unsigned int maxFaceNum)
+{
+    LOG1("[%d]@%s maxFaceNum %d, mCameraId %d", mHALStream.id, __func__, maxFaceNum, mCameraId);
+
+    mFaceDetection = icamera::FaceDetection::createInstance(mCameraId, maxFaceNum, mHALStream.id);
+}
+
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/Camera3Stream.h b/camera/hal/intel/ipu6/aal/Camera3Stream.h
new file mode 100644
index 000000000000..f90103c070dc
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/Camera3Stream.h
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <mutex>
+#include <vector>
+#include <map>
+#include <unordered_map>
+
+#include "FaceDetection.h"
+#include <hardware/camera3.h>
+#include "PostProcessor.h"
+#include "ResultProcessor.h"
+#include "Thread.h"
+#include "Camera3BufferPool.h"
+
+namespace camera3 {
+
+struct CaptureResult {
+    uint32_t frameNumber;
+    camera3_stream_buffer_t outputBuffer;
+    buffer_handle_t handle;
+    std::shared_ptr<Camera3Buffer> inputCam3Buf;
+    icamera::Parameters param;
+};
+
+/**
+ * \class InternalBufferPool
+ *
+ * This class is used to manage a local memory pool for still and post processing stream
+ * It needs to follow the calling sequence:
+ * allocBuffers -> acquireBuffer -> findBuffer -> returnBuffer
+ */
+class InternalBufferPool {
+
+public:
+    InternalBufferPool();
+    ~InternalBufferPool();
+
+    icamera::status_t allocBuffers(const icamera::stream_t &stream, uint32_t numBuffers, int cameraId);
+    void destroyBuffers();
+    std::shared_ptr<Camera3Buffer> acquireBuffer();
+    void returnBuffer(std::shared_ptr<Camera3Buffer> buffer);
+    std::shared_ptr<Camera3Buffer> findBuffer(void *memAddr);
+
+private:
+    std::unordered_map<std::shared_ptr<Camera3Buffer>, bool> mInterBuf; // first: camera3Buffer, second: busy
+    std::mutex  mLock;
+};
+
+/**
+ * \class Camera3Stream
+ *
+ * This class is used to handle requests. It has the following
+ * roles:
+ * - It instantiates PostProcessor.
+ */
+class Camera3Stream : public icamera::Thread {
+
+public:
+    Camera3Stream(int cameraId, CallbackEventInterface *callback,
+                  uint32_t maxNumReqInProc, const icamera::stream_t &halStream,
+                  const camera3_stream_t &stream,
+                  const camera3_stream_t *inputStream = nullptr);
+    virtual ~Camera3Stream();
+
+    virtual bool threadLoop();
+    virtual void requestExit();
+
+    int processRequest(const std::shared_ptr<Camera3Buffer> &inputCam3Buf,
+                       const camera3_stream_buffer_t &outputBuffer,
+                       icamera::camera_buffer_t *buffer);
+
+    void queueBufferDone(uint32_t frameNumber,
+                         const std::shared_ptr<Camera3Buffer> &inputCam3Buf,
+                         const camera3_stream_buffer_t &outputBuffer,
+                         const icamera::Parameters& param);
+    int setActive(bool state);
+    bool isActive() { return mStreamState; }
+    void activateFaceDetection(unsigned int maxFaceNum);
+    int getPostProcessType() { return mPostProcessType; }
+    void sendEvent(const icamera::camera_msg_data_t &data);
+
+ private:
+    void handleSofAlignment();
+
+private:
+    const uint64_t kMaxDuration = 2000000000; // 2000ms
+
+    int mCameraId;
+    std::condition_variable mBufferDoneCondition;
+    std::mutex mLock;
+
+    std::condition_variable mSofCondition;
+    std::mutex mSofLock;
+
+    CallbackEventInterface *mEventCallback;
+
+    int mPostProcessType;
+    std::unique_ptr<PostProcessor> mPostProcessor;
+
+    bool mStreamState;
+    icamera::stream_t  mHALStream;
+    uint32_t           mMaxNumReqInProc;
+    std::unique_ptr<Camera3BufferPool> mPostProcessBufPool;
+
+    camera3_stream_t mStream;
+
+    std::vector<std::shared_ptr<CaptureResult>> mCaptureResultVector;
+    std::map<buffer_handle_t, std::shared_ptr<Camera3Buffer>> mBuffers;
+
+    icamera::FaceDetection *mFaceDetection;
+    unsigned int mFDRunDefaultInterval; // FD running's interval frames.
+    unsigned int mFDRunIntervalNoFace; // FD running's interval frames without face.
+    unsigned int mFDRunInterval; // run 1 frame every mFDRunInterval frames.
+    unsigned int mFrameCnt; // from 0 to (mFDRunInterval - 1).
+
+    int mInputPostProcessType;
+    std::unique_ptr<PostProcessor> mInputPostProcessor;
+    std::unique_ptr<camera3_stream_t> mInputStream;
+
+    void faceRunningByCondition(const icamera::camera_buffer_t &buffer);
+};
+
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/HALv3Interface.h b/camera/hal/intel/ipu6/aal/HALv3Interface.h
new file mode 100644
index 000000000000..952542e2ac72
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/HALv3Interface.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+namespace camera3 {
+
+/**
+ * \brief An interface used to callback RequestManager.
+ */
+class RequestManagerCallback {
+public:
+    RequestManagerCallback() {}
+    virtual ~RequestManagerCallback() {}
+
+    virtual void returnRequestDone(uint32_t frameNumber) = 0;
+};
+
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/HALv3Utils.cpp b/camera/hal/intel/ipu6/aal/HALv3Utils.cpp
new file mode 100644
index 000000000000..a773c8866706
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/HALv3Utils.cpp
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "HalV3Utils"
+
+#include <linux/videodev2.h>
+#include "Utils.h"
+#include "Errors.h"
+#include "HALv3Utils.h"
+#include "PlatformData.h"
+
+namespace camera3 {
+namespace HalV3Utils {
+
+static const char* Camera3StreamTypes[] = {
+    "OUTPUT", // CAMERA3_STREAM_OUTPUT
+    "INPUT", // CAMERA3_STREAM_INPUT
+    "BIDIRECTIONAL", // CAMERA3_STREAM_BIDIRECTIONAL
+    "INVALID"
+};
+
+const char *getCamera3StreamType(int type)
+{
+    int num = sizeof(Camera3StreamTypes) / sizeof(Camera3StreamTypes[0]);
+    return (type >= 0 && type < num) ? Camera3StreamTypes[type] : Camera3StreamTypes[num - 1];
+}
+
+int HALFormatToV4l2Format(int cameraId, int halFormat)
+{
+    LOG1("@%s", __func__);
+
+    int format = -1;
+    switch (halFormat) {
+        case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
+        case HAL_PIXEL_FORMAT_YCbCr_420_888:
+        case HAL_PIXEL_FORMAT_BLOB:
+            format = V4L2_PIX_FMT_NV12;
+            break;
+        case HAL_PIXEL_FORMAT_RAW_OPAQUE:
+            format = icamera::PlatformData::getISysRawFormat(cameraId);
+            break;
+        default:
+            LOGW("unsupport format %d", halFormat);
+            break;
+    }
+
+    return format;
+}
+
+int getRotationDegrees(const camera3_stream_t &stream)
+{
+    LOG1("@%s", __func__);
+    if (stream.stream_type != CAMERA3_STREAM_OUTPUT) {
+        LOG2("%s, no need rotation for stream type %d", __func__, stream.stream_type);
+        return 0;
+    }
+#ifdef CAL_BUILD
+    switch (stream.crop_rotate_scale_degrees) {
+        case CAMERA3_STREAM_ROTATION_0:
+            return 0;
+        case CAMERA3_STREAM_ROTATION_90:
+            return 90;
+        case CAMERA3_STREAM_ROTATION_270:
+            return 270;
+        default:
+            LOGE("unsupport rotate degree: %d, the value must be (0,1,3)", stream.crop_rotate_scale_degrees);
+            return -1;
+    }
+#endif
+}
+
+int fillHALStreams(int cameraId, const camera3_stream_t &camera3Stream, icamera::stream_t *stream)
+{
+    LOG1("@%s, cameraId:%d", __func__, cameraId);
+
+    stream->format = HALFormatToV4l2Format(cameraId, camera3Stream.format);
+    CheckError(stream->format == -1, icamera::BAD_VALUE, "unsupported format %x", camera3Stream.format);
+
+    //  For rotation cases, aal needs to get the psl output which mapping to user requirement.
+    if (getRotationDegrees(camera3Stream) > 0) {
+        icamera::camera_resolution_t *psl =
+            icamera::PlatformData::getPslOutputForRotation(camera3Stream.width,
+                                                           camera3Stream.height,
+                                                           cameraId);
+
+        stream->width = psl ? psl->width : camera3Stream.height;
+        stream->height = psl ? psl->height : camera3Stream.width;
+        LOG1("%s, Use the psl output %dx%d to map user requirement: %dx%d", __func__,
+             stream->width, stream->height, camera3Stream.width, camera3Stream.height);
+    } else {
+        stream->width = camera3Stream.width;
+        stream->height = camera3Stream.height;
+    }
+
+    stream->field = 0;
+    stream->stride = icamera::CameraUtils::getStride(stream->format, stream->width);
+    stream->size = icamera::CameraUtils::getFrameSize(stream->format, stream->width, stream->height);
+    stream->memType = V4L2_MEMORY_USERPTR;
+    stream->streamType = icamera::CAMERA_STREAM_OUTPUT;
+    if (camera3Stream.usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) {
+        stream->usage = icamera::CAMERA_STREAM_VIDEO_CAPTURE;
+    } else if (camera3Stream.usage & GRALLOC_USAGE_HW_CAMERA_ZSL) {
+        stream->usage = icamera::CAMERA_STREAM_OPAQUE_RAW;
+    } else {
+        if (camera3Stream.format == HAL_PIXEL_FORMAT_BLOB) {
+            stream->usage = icamera::CAMERA_STREAM_STILL_CAPTURE;
+        } else if (camera3Stream.format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
+            // Check if it is YUV capture
+            int size = stream->width * stream->height;
+            stream->usage = (size > RESOLUTION_1080P_WIDTH * RESOLUTION_1080P_HEIGHT) ?
+                            icamera::CAMERA_STREAM_STILL_CAPTURE : icamera::CAMERA_STREAM_PREVIEW;
+        } else if (camera3Stream.format == HAL_PIXEL_FORMAT_RAW_OPAQUE) {
+            stream->usage = icamera::CAMERA_STREAM_OPAQUE_RAW;
+        } else {
+            stream->usage = icamera::CAMERA_STREAM_PREVIEW;
+        }
+    }
+
+    LOG2("@%s, stream: width:%d, height:%d, usage %d", __func__, stream->width, stream->height,
+         stream->usage);
+    return icamera::OK;
+}
+
+} // namespace HalV3Utils
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/HALv3Utils.h b/camera/hal/intel/ipu6/aal/HALv3Utils.h
new file mode 100644
index 000000000000..d9622a1df34a
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/HALv3Utils.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <hardware/camera3.h>
+#include "iutils/CameraLog.h"
+#include "Parameters.h"
+
+namespace camera3 {
+
+#undef LOG1
+#undef LOG2
+#undef LOGI
+#undef LOGW
+#undef LOGE
+#undef SLOWLY_MULTIPLIER
+
+#define SLOWLY_MULTIPLIER (icamera::gSlowlyRunRatio ? icamera::gSlowlyRunRatio : 1)
+
+#ifdef HAVE_LINUX_OS
+
+#define LOG1(format, args...) \
+    icamera::Log::print_log(icamera::gLogLevel & icamera::CAMERA_DEBUG_LOG_LEVEL1,\
+            LOG_TAG, icamera::CAMERA_DEBUG_LOG_LEVEL1, format, ##args)
+#define LOG2(format, args...) \
+    icamera::Log::print_log(icamera::gLogLevel & icamera::CAMERA_DEBUG_LOG_LEVEL2,\
+            LOG_TAG, icamera::CAMERA_DEBUG_LOG_LEVEL2, format, ##args)
+#define LOGFPS(format, args...) \
+    icamera::Log::print_log(icamera::gLogLevel & icamera::CAMERA_DEBUG_LOG_FPS,\
+            LOG_TAG, icamera::CAMERA_DEBUG_LOG_FPS, format, ##args)
+#define LOGI(format, args...) \
+    icamera::Log::print_log(true, LOG_TAG, icamera::CAMERA_DEBUG_LOG_INFO, format, ##args)
+#define LOGW(format, args...) \
+    icamera::Log::print_log(true, LOG_TAG, icamera::CAMERA_DEBUG_LOG_WARNING, format, ##args)
+#define LOGE(format, args...) \
+    icamera::Log::print_log(true, LOG_TAG, icamera::CAMERA_DEBUG_LOG_ERR, format, ##args)
+
+#else
+
+#define LOG1(...) icamera::__camera_hal_log(icamera::gLogLevel & icamera::CAMERA_DEBUG_LOG_LEVEL1,\
+                        ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
+#define LOG2(...) icamera::__camera_hal_log(icamera::gLogLevel & icamera::CAMERA_DEBUG_LOG_LEVEL2,\
+                        ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
+#define LOGFPS(...) icamera::__camera_hal_log(icamera::gLogLevel & icamera::CAMERA_DEBUG_LOG_FPS,\
+                        ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
+#define LOGI(...) icamera::__camera_hal_log(true, ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
+#define LOGW(...) icamera::__camera_hal_log(true, ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
+#define LOGE(...) icamera::__camera_hal_log(true, ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
+
+#endif
+namespace HalV3Utils {
+    const char *getCamera3StreamType(int type);
+    int HALFormatToV4l2Format(int cameraId, int halFormat);
+    int getRotationDegrees(const camera3_stream_t &stream);
+    int fillHALStreams(int cameraId, const camera3_stream_t &camera3Stream, icamera::stream_t *stream);
+}
+
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/IntelAEStateMachine.cpp b/camera/hal/intel/ipu6/aal/IntelAEStateMachine.cpp
new file mode 100644
index 000000000000..eeb38c18b43c
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/IntelAEStateMachine.cpp
@@ -0,0 +1,304 @@
+/*
+ * Copyright (C) 2015-2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelAEStateMachine"
+
+#include "Utils.h"
+#include "Errors.h"
+#include "HALv3Utils.h"
+
+#include "IntelAEStateMachine.h"
+
+namespace camera3 {
+
+IntelAEStateMachine::IntelAEStateMachine(int cameraId):
+        mCameraId(cameraId),
+        mLastControlMode(0),
+        mLastSceneMode(0),
+        mCurrentAeMode(NULL)
+{
+    LOG1("%s mCameraId %d", __func__, mCameraId);
+    mCurrentAeMode = &mAutoMode;
+    CLEAR(mLastAeControls);
+    mLastAeControls.aeMode = ANDROID_CONTROL_AE_MODE_ON;
+}
+
+IntelAEStateMachine::~IntelAEStateMachine()
+{
+    LOG1("%s mCameraId %d", __func__, mCameraId);
+}
+
+/**
+ * Process states in input stage before the AE is run.
+ * It is initializing the current state if input
+ * parameters have an influence.
+ *
+ * \param[IN] controlMode: control.controlMode
+ * \param[IN] sceneMode: control.sceneMode
+ * \param[IN] aeControls: set of control.<ae>
+ */
+int IntelAEStateMachine::processState(uint8_t controlMode, uint8_t sceneMode,
+                                      const AeControls &aeControls)
+{
+    if (controlMode == ANDROID_CONTROL_MODE_OFF) {
+        LOG2("%s: Set AE offMode: controlMode = %d, aeMode = %d", __func__,
+                        controlMode, aeControls.aeMode);
+        mCurrentAeMode = &mOffMode;
+    } else {
+        if (aeControls.aeMode == ANDROID_CONTROL_AE_MODE_OFF) {
+            mCurrentAeMode = &mOffMode;
+            LOG2("%s: Set AE offMode: controlMode = %d, aeMode = %d",
+                 __func__, controlMode, aeControls.aeMode);
+        } else {
+            LOG2("%s: Set AE AutoMode: controlMode = %d, aeMode = %d",
+                 __func__, controlMode, aeControls.aeMode);
+            mCurrentAeMode = &mAutoMode;
+        }
+    }
+
+    mLastAeControls = aeControls;
+    mLastSceneMode = sceneMode;
+    mLastControlMode = controlMode;
+
+    return mCurrentAeMode->processState(controlMode, sceneMode, aeControls);
+}
+
+/**
+ * Process results and define output state after the AE is run
+ *
+ * \param[IN] aeConverged: from the ae result
+ * \param[IN] results: cameraMetadata to write dynamic tags.
+ */
+int IntelAEStateMachine::processResult(bool aeConverged, android::CameraMetadata &result)
+{
+    if (CC_UNLIKELY(mCurrentAeMode == NULL)) {
+        LOGE("Invalid AE mode - this could not happen - BUG!");
+        return icamera::UNKNOWN_ERROR;
+    }
+
+    return mCurrentAeMode->processResult(aeConverged, result);
+}
+
+/******************************************************************************
+ * AE MODE   -  BASE
+ ******************************************************************************/
+IntelAEModeBase::IntelAEModeBase():
+    mLastControlMode(0),
+    mLastSceneMode(0),
+    mEvChanged(false),
+    mLastAeConvergedFlag(false),
+    mAeRunCount(0),
+    mAeConvergedCount(0),
+    mCurrentAeState(ANDROID_CONTROL_AE_STATE_INACTIVE)
+{
+    LOG1("%s", __func__);
+    CLEAR(mLastAeControls);
+}
+
+void IntelAEModeBase::updateResult(android::CameraMetadata &results)
+{
+    LOG2("%s: current AE state is: %d", __func__, mCurrentAeState);
+
+    //# METADATA_Dynamic control.aeMode done
+    results.update(ANDROID_CONTROL_AE_MODE, &mLastAeControls.aeMode, 1);
+    //# METADATA_Dynamic control.aeLock done
+    results.update(ANDROID_CONTROL_AE_LOCK, &mLastAeControls.aeLock, 1);
+    //# METADATA_Dynamic control.aePrecaptureTrigger done
+    results.update(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,
+                   &mLastAeControls.aePreCaptureTrigger, 1);
+    //# METADATA_Dynamic control.aeState done
+    results.update(ANDROID_CONTROL_AE_STATE, &mCurrentAeState, 1);
+}
+
+void IntelAEModeBase::resetState()
+{
+    LOG2("%s", __func__);
+
+    mCurrentAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
+    mLastAeConvergedFlag = false;
+    mAeRunCount = 0;
+    mAeConvergedCount = 0;
+}
+
+/******************************************************************************
+ * AE MODE   -  OFF
+ ******************************************************************************/
+
+IntelAEModeOff::IntelAEModeOff():IntelAEModeBase()
+{
+    LOG1("%s", __func__);
+}
+
+int IntelAEModeOff::processState(uint8_t controlMode, uint8_t sceneMode,
+                                 const AeControls &aeControls)
+{
+    LOG2("%s", __func__);
+
+    mLastAeControls = aeControls;
+    mLastSceneMode = sceneMode;
+    mLastControlMode = controlMode;
+
+    if (controlMode == ANDROID_CONTROL_MODE_OFF ||
+        aeControls.aeMode == ANDROID_CONTROL_AE_MODE_OFF) {
+        resetState();
+    } else {
+        LOGE("AE State machine should not be OFF! - Fix bug");
+        return icamera::UNKNOWN_ERROR;
+    }
+
+    return icamera::OK;
+}
+
+int
+IntelAEModeOff::processResult(bool aeConverged, android::CameraMetadata &result)
+{
+    UNUSED(aeConverged);
+    LOG2("%s", __func__);
+
+    mCurrentAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
+    updateResult(result);
+
+    return icamera::OK;
+}
+
+/******************************************************************************
+ * AE MODE   -  AUTO
+ ******************************************************************************/
+
+IntelAEModeAuto::IntelAEModeAuto():IntelAEModeBase()
+{
+    LOG1("%s", __func__);
+}
+
+int
+IntelAEModeAuto::processState(uint8_t controlMode, uint8_t sceneMode,
+                              const AeControls &aeControls)
+{
+    if(controlMode != mLastControlMode) {
+        LOG1("%s: control mode has changed %d -> %d, reset AE State",
+             __func__, controlMode, mLastControlMode);
+        resetState();
+    }
+
+    if (aeControls.aeLock == ANDROID_CONTROL_AE_LOCK_ON) {
+        // If ev compensation changes, we have to let the AE run until
+        // convergence. Thus we need to figure out changes in compensation and
+        // only change the state immediately to locked,
+        // IF the EV did not change.
+        if (mLastAeControls.evCompensation != aeControls.evCompensation)
+            mEvChanged = true;
+
+        if (!mEvChanged)
+            mCurrentAeState = ANDROID_CONTROL_AE_STATE_LOCKED;
+    } else if (aeControls.aeMode != mLastAeControls.aeMode ||
+               (controlMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE &&
+                sceneMode != mLastSceneMode)) {
+        resetState();
+    } else {
+        switch (mCurrentAeState) {
+            case ANDROID_CONTROL_AE_STATE_LOCKED:
+                mCurrentAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
+                break;
+            case ANDROID_CONTROL_AE_STATE_SEARCHING:
+            case ANDROID_CONTROL_AE_STATE_INACTIVE:
+            case ANDROID_CONTROL_AE_STATE_CONVERGED:
+            case ANDROID_CONTROL_AE_STATE_FLASH_REQUIRED:
+            case ANDROID_CONTROL_AE_STATE_PRECAPTURE:
+                if (aeControls.aePreCaptureTrigger ==
+                        ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_START)
+                    mCurrentAeState = ANDROID_CONTROL_AE_STATE_PRECAPTURE;
+
+                if (aeControls.aePreCaptureTrigger ==
+                        ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL)
+                    mCurrentAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
+                break;
+            default:
+                LOGE("Invalid AE state!, State set to INACTIVE");
+                mCurrentAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
+
+            break;
+        }
+    }
+    mLastAeControls = aeControls;
+    mLastSceneMode = sceneMode;
+    mLastControlMode = controlMode;
+    return icamera::OK;
+}
+
+int IntelAEModeAuto::processResult(bool aeConverged, android::CameraMetadata &result)
+{
+    switch (mCurrentAeState) {
+    case ANDROID_CONTROL_AE_STATE_LOCKED:
+        //do nothing
+        break;
+    case ANDROID_CONTROL_AE_STATE_INACTIVE:
+    case ANDROID_CONTROL_AE_STATE_SEARCHING:
+    case ANDROID_CONTROL_AE_STATE_CONVERGED:
+    case ANDROID_CONTROL_AE_STATE_FLASH_REQUIRED:
+        if (aeConverged) {
+            mEvChanged = false; // converged -> reset
+            if (mLastAeControls.aeLock) {
+                mCurrentAeState = ANDROID_CONTROL_AE_STATE_LOCKED;
+            } else {
+                mCurrentAeState = ANDROID_CONTROL_AE_STATE_CONVERGED;
+            }
+        } else {
+            mCurrentAeState = ANDROID_CONTROL_AE_STATE_SEARCHING;
+        }
+        break;
+    case ANDROID_CONTROL_AE_STATE_PRECAPTURE:
+        if (aeConverged) {
+            mEvChanged = false; // converged -> reset
+            if (mLastAeControls.aeLock) {
+                mCurrentAeState = ANDROID_CONTROL_AE_STATE_LOCKED;
+            } else {
+                mCurrentAeState = ANDROID_CONTROL_AE_STATE_CONVERGED;
+            }
+        } // here the else is staying at the same state.
+        break;
+    default:
+        LOGE("Invalid AE state!, State set to INACTIVE");
+        mCurrentAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
+        break;
+    }
+
+    if (aeConverged) {
+        if (mLastAeConvergedFlag == true) {
+            mAeConvergedCount++;
+            LOG2("%s: AE converged for %d frames", __func__, mAeConvergedCount);
+        } else {
+            mAeConvergedCount = 1;
+            LOG1("%s: AE converging -> converged, after running AE for %d times",
+                  __func__, mAeRunCount);
+        }
+    } else {
+        if (mLastAeConvergedFlag == true) {
+            LOG1("%s: AE Converged -> converging", __func__);
+            mAeRunCount = 1;
+            mAeConvergedCount = 0;
+        } else {
+            mAeRunCount++;
+            LOG2("%s: AE converging for %d frames", __func__, mAeRunCount);
+        }
+    }
+    mLastAeConvergedFlag = aeConverged;
+
+    updateResult(result);
+
+    return icamera::OK;
+}
+
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/IntelAEStateMachine.h b/camera/hal/intel/ipu6/aal/IntelAEStateMachine.h
new file mode 100644
index 000000000000..51b3bf2a76b5
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/IntelAEStateMachine.h
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2015-2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "HALv3Header.h"
+
+namespace camera3 {
+
+/**
+ * \struct AeControls
+ *
+ * Control Modes saved and passed back to control unit after reading
+ *
+ */
+struct AeControls {
+    uint8_t aeMode;                 /**< AE_MODE */
+    uint8_t aeLock;                 /**< AE_LOCK */
+    uint8_t aePreCaptureTrigger;    /**< PRECAPTURE_TRIGGER */
+    uint8_t sceneMode;              /**< SCENE_MODE */
+    int32_t evCompensation;         /**< AE_EXPOSURE_COMPENSATION */
+};
+
+/**
+ * \class IntelAEModeBase
+ *
+ * Base class for all the Autoexposure modes as defined by the Android
+ * camera device V3.x API.
+ * Each mode will follow certain state transitions. See documentation for
+ * android.control.aeState
+ *
+ */
+class IntelAEModeBase {
+public:
+    IntelAEModeBase();
+    virtual ~IntelAEModeBase() {};
+
+    virtual int processState(uint8_t controlMode, uint8_t sceneMode,
+                             const AeControls &aeControls) = 0;
+
+    virtual int processResult(bool aeConverged, android::CameraMetadata &results) = 0;
+
+    void resetState(void);
+    uint8_t getState() const { return mCurrentAeState; }
+protected:
+    void updateResult(android::CameraMetadata &results);
+protected:
+    AeControls  mLastAeControls;
+    uint8_t     mLastControlMode;
+    uint8_t     mLastSceneMode;
+    bool        mEvChanged; /**< set and kept to true when ev changes until
+                                 converged */
+
+    bool        mLastAeConvergedFlag;
+    uint8_t     mAeRunCount;
+    uint8_t     mAeConvergedCount;
+    uint8_t     mCurrentAeState;
+};
+
+/**
+ * \class IntelAEModeAuto
+ * Derived class from IntelAEModeBase for Auto mode
+ *
+ */
+class IntelAEModeAuto: public IntelAEModeBase {
+public:
+    IntelAEModeAuto();
+    virtual int processState(uint8_t controlMode, uint8_t sceneMode,
+                             const AeControls &aeControls);
+    virtual int processResult(bool aeConverged, android::CameraMetadata& result);
+};
+
+/**
+ * \class IntelAEModeOFF
+ * Derived class from IntelAEModeBase for OFF mode
+ *
+ */
+class IntelAEModeOff: public IntelAEModeBase {
+public:
+    IntelAEModeOff();
+    virtual int processState(uint8_t controlMode, uint8_t sceneMode,
+                             const AeControls &aeControls);
+    virtual int processResult(bool aeConverged, android::CameraMetadata& result);
+};
+
+/**
+ * \class IntelAEStateMachine
+ *
+ * This class adapts the Android V3 AE triggers and state transitions to
+ * the ones implemented by the Intel AIQ algorithm
+ * This class is platform independent. Platform specific behaviors should be
+ * implemented in derived classes from this one or from the IntelAEModeBase
+ *
+ */
+class IntelAEStateMachine {
+public:
+    IntelAEStateMachine(int cameraId);
+    virtual ~IntelAEStateMachine();
+
+    int processState(uint8_t controlMode, uint8_t sceneMode,
+                     const AeControls &aeControls);
+
+    int processResult(bool aeConverged, android::CameraMetadata &results);
+
+    uint8_t getState() const { return mCurrentAeMode->getState(); }
+private:
+    // prevent copy constructor and assignment operator
+    DISALLOW_COPY_AND_ASSIGN(IntelAEStateMachine);
+
+private: /* members*/
+    int mCameraId;
+    AeControls  mLastAeControls;
+    uint8_t     mLastControlMode;
+    uint8_t     mLastSceneMode;
+
+    IntelAEModeBase *mCurrentAeMode;
+
+    IntelAEModeOff mOffMode;
+    IntelAEModeAuto mAutoMode;
+};
+
+}  // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/IntelAFStateMachine.cpp b/camera/hal/intel/ipu6/aal/IntelAFStateMachine.cpp
new file mode 100644
index 000000000000..3c7ff5f08914
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/IntelAFStateMachine.cpp
@@ -0,0 +1,442 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelAFStateMachine"
+
+#include "Utils.h"
+#include "Errors.h"
+#include "HALv3Utils.h"
+
+#include "IntelAFStateMachine.h"
+
+namespace camera3 {
+
+/**
+ * AF timeouts. Together these will make:
+ * timeout if: [MIN_AF_TIMEOUT - MAX_AF_FRAME_COUNT_TIMEOUT - MAX_AF_TIMEOUT]
+ * which translates to 2-4 seconds with the current values. Actual timeout value
+ * will depend on the FPS. E.g. >30FPS = 2s, 20FPS = 3s, <15FPS = 4s.
+ */
+
+/**
+ * MAX_AF_TIMEOUT
+ * Maximum time we allow the AF to iterate without a result.
+ * This timeout is the last resort, for very low FPS operation.
+ * Units are in microseconds.
+ * 4 seconds is a compromise between CTS & ITS. ITS allows for 10 seconds for
+ * 3A convergence. CTS1 allows only 5, but it doesn't require convergence, just
+ * a conclusion. We reserve one second for latencies to be safe. This makes the
+ * timeout 5 (cts1) - 1 (latency safety) = 4 seconds = 4000000us.
+ */
+static const long int MAX_AF_TIMEOUT = 4000000;  // 4 seconds
+
+/**
+ * MIN_AF_TIMEOUT
+ * For very high FPS use cases, we want to anyway allow some time for moving the
+ * lens.
+ */
+static const long int MIN_AF_TIMEOUT = 2000000;  // 2 seconds
+
+/**
+ * MAX_AF_FRAME_COUNT_TIMEOUT
+ * Maximum time we allow the AF to iterate without a result.
+ * Based on frames, as the AF algorithm itself needs frames for its operation,
+ * not just time, and the FPS varies.
+ * This is the timeout for normal operation, and translates to 2 seconds
+ * if FPS is 30.
+ */
+static const int MAX_AF_FRAME_COUNT_TIMEOUT = 60;  // 2 seconds if 30fps
+
+#ifndef HONEST_AF
+// not-so-honest
+#define HONEST_AF 0
+#endif
+
+IntelAFStateMachine::IntelAFStateMachine(int cameraId) :
+        mCameraId(cameraId)
+{
+    LOG1("%s mCameraId %d", __func__, mCameraId);
+    mCurrentAfMode = &mAutoMode;
+    mLastAfControls = { ANDROID_CONTROL_AF_MODE_AUTO,
+                        ANDROID_CONTROL_AF_TRIGGER_IDLE };
+}
+
+IntelAFStateMachine::~IntelAFStateMachine()
+{
+    LOG1("%s mCameraId %d", __func__, mCameraId);
+}
+
+int IntelAFStateMachine::processTriggers(uint8_t afTrigger, uint8_t afMode)
+{
+    if (afMode != mLastAfControls.afMode) {
+        LOG1("Change of AF mode from %d to %d", mLastAfControls.afMode, afMode);
+
+        switch (afMode) {
+        case ANDROID_CONTROL_AF_MODE_AUTO:
+        case ANDROID_CONTROL_AF_MODE_MACRO:
+            mCurrentAfMode = &mAutoMode;
+            break;
+        case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO:
+        case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE:
+            mCurrentAfMode = &mContinuousPictureMode;
+            break;
+        case ANDROID_CONTROL_AF_MODE_OFF:
+            mCurrentAfMode = &mOffMode;
+            break;
+        default:
+            LOGE("INVALID AF mode requested defaulting to AUTO");
+            mCurrentAfMode = &mAutoMode;
+            break;
+        }
+        mCurrentAfMode->resetState();
+    }
+    mLastAfControls.afTrigger = afTrigger;
+    mLastAfControls.afMode = afMode;
+
+    LOG2("%s: afMode %d", __func__, mLastAfControls.afMode);
+    return mCurrentAfMode->processTriggers(afTrigger, afMode);
+}
+
+int IntelAFStateMachine::processResult(int afState, bool lensMoving,
+                                       android::CameraMetadata &result)
+{
+    if (CC_UNLIKELY(mCurrentAfMode == NULL)) {
+        LOGE("Invalid AF mode - this could not happen - BUG!");
+        return icamera::UNKNOWN_ERROR;
+    }
+
+    return mCurrentAfMode->processResult(afState, lensMoving, result);
+}
+
+/**
+ * updateDefaults
+ *
+ * Used in case of error in the algorithm or fixed focus sensor
+ * In case of fixed focus sensor we always report locked
+ */
+int IntelAFStateMachine::updateDefaults(android::CameraMetadata& result,
+                                        bool fixedFocus) const
+{
+
+    mCurrentAfMode->updateResult(result);
+    uint8_t defaultState = ANDROID_CONTROL_AF_STATE_INACTIVE;
+    if (fixedFocus)
+        defaultState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED;
+
+    result.update(ANDROID_CONTROL_AF_STATE, &defaultState, 1);
+
+    return icamera::OK;
+}
+
+/******************************************************************************
+ * AF MODE   -  BASE
+ ******************************************************************************/
+IntelAfModeBase::IntelAfModeBase():
+        mCurrentAfState(ANDROID_CONTROL_AF_STATE_INACTIVE),
+        mLensState(ANDROID_LENS_STATE_STATIONARY),
+        mLastActiveTriggerTime(0),
+        mFramesSinceTrigger(0)
+{
+    LOG1("%s", __func__);
+    mLastAfControls = { ANDROID_CONTROL_AF_MODE_AUTO,
+                        ANDROID_CONTROL_AF_TRIGGER_IDLE };
+}
+
+/**
+ * processTriggers
+ *
+ * This method is called BEFORE auto focus algorithm has RUN
+ * Input parameters are pre-filled by the Intel3APlus::fillAfInputParams()
+ * by parsing the request settings.
+ * Other parameters from the capture request settings not filled in the input
+ * params structure is passed as argument
+ */
+int IntelAfModeBase::processTriggers(uint8_t afTrigger, uint8_t afMode)
+{
+    LOG2("%s", __func__);
+
+    if (afTrigger == ANDROID_CONTROL_AF_TRIGGER_START) {
+        resetTrigger(icamera::CameraUtils::systemTime() / 1000);
+        LOG1("AF TRIGGER START");
+    } else if (afTrigger == ANDROID_CONTROL_AF_TRIGGER_CANCEL) {
+        LOG1("AF TRIGGER CANCEL");
+        resetTrigger(0);
+    }
+    mLastAfControls.afTrigger = afTrigger;
+    mLastAfControls.afMode = afMode;
+    return icamera::OK;
+}
+
+void
+IntelAfModeBase::updateResult(android::CameraMetadata& results)
+{
+    LOG2("%s", __func__);
+
+    LOG2("%s afMode = %d state = %d", __func__, mLastAfControls.afMode, mCurrentAfState);
+
+    results.update(ANDROID_CONTROL_AF_MODE, &mLastAfControls.afMode, 1);
+    //# METADATA_Dynamic control.afTrigger done
+    results.update(ANDROID_CONTROL_AF_TRIGGER, &mLastAfControls.afTrigger, 1);
+    //# METADATA_Dynamic control.afState done
+    results.update(ANDROID_CONTROL_AF_STATE, &mCurrentAfState, 1);
+    /**
+     * LENS STATE update
+     */
+    //# METADATA_Dynamic lens.state Done
+    results.update(ANDROID_LENS_STATE, &mLensState, 1);
+}
+
+void IntelAfModeBase::resetTrigger(usecs_t triggerTime)
+{
+    mLastActiveTriggerTime = triggerTime;
+    mFramesSinceTrigger = 0;
+}
+
+void IntelAfModeBase::resetState()
+{
+    mCurrentAfState = ANDROID_CONTROL_AF_STATE_INACTIVE;
+}
+
+void IntelAfModeBase::checkIfFocusTimeout()
+{
+     // give up if AF was iterating for too long
+    if (mLastActiveTriggerTime != 0) {
+        mFramesSinceTrigger++;
+        usecs_t now = icamera::CameraUtils::systemTime() / 1000;
+        usecs_t timeSinceTriggered = now - mLastActiveTriggerTime;
+        if (mCurrentAfState != ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED) {
+            /**
+             * Timeout IF either time has passed beyond MAX_AF_TIMEOUT
+             *                         OR
+             * Enough frames have been processed and time has passed beyond
+             * MIN_AF_TIMEOUT
+             */
+            if (timeSinceTriggered > MAX_AF_TIMEOUT ||
+                (mFramesSinceTrigger > MAX_AF_FRAME_COUNT_TIMEOUT &&
+                 timeSinceTriggered  > MIN_AF_TIMEOUT)) {
+                resetTrigger(0);
+                mCurrentAfState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED;
+            }
+        }
+    }
+}
+
+/******************************************************************************
+ * AF MODE   -  OFF
+ ******************************************************************************/
+
+IntelAFModeOff::IntelAFModeOff():IntelAfModeBase()
+{
+    LOG1("%s", __func__);
+}
+
+int IntelAFModeOff::processTriggers(uint8_t afTrigger, uint8_t afMode)
+{
+    LOG2("%s", __func__);
+
+    mLastAfControls.afTrigger = afTrigger;
+    mLastAfControls.afMode = afMode;
+    return icamera::OK;
+}
+
+int IntelAFModeOff::processResult(int afState, bool lensMoving, android::CameraMetadata& result) {
+    /**
+     * IN MANUAL and EDOF AF state never changes
+     */
+    LOG2("%s", __func__);
+
+    mCurrentAfState = ANDROID_CONTROL_AF_STATE_INACTIVE;
+    mLensState = lensMoving ? ANDROID_LENS_STATE_MOVING : ANDROID_LENS_STATE_STATIONARY;
+    updateResult(result);
+
+    return icamera::OK;
+}
+
+/******************************************************************************
+ * AF MODE   -  AUTO
+ ******************************************************************************/
+
+IntelAFModeAuto::IntelAFModeAuto():IntelAfModeBase()
+{
+    LOG1("%s", __func__);
+}
+
+int IntelAFModeAuto::processTriggers(uint8_t afTrigger, uint8_t afMode)
+{
+    LOG2("%s", __func__);
+
+    IntelAfModeBase::processTriggers(afTrigger, afMode);
+
+    // Override AF state if we just got an AF TRIGGER Start
+    // This is only valid for the AUTO/MACRO state machine
+    if (mLastAfControls.afTrigger == ANDROID_CONTROL_AF_TRIGGER_START) {
+        mCurrentAfState = ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN;
+        LOG2("@%s AF state ACTIVE_SCAN (trigger start)", __PRETTY_FUNCTION__);
+    } else if (mLastAfControls.afTrigger == ANDROID_CONTROL_AF_TRIGGER_CANCEL) {
+        mCurrentAfState = ANDROID_CONTROL_AF_STATE_INACTIVE;
+        LOG2("@%s AF state INACTIVE (trigger cancel)", __PRETTY_FUNCTION__);
+    }
+
+    return icamera::OK;
+}
+
+int IntelAFModeAuto::processResult(int afState, bool lensMoving, android::CameraMetadata& result) {
+    LOG2("%s", __func__);
+    mLensState = lensMoving ? ANDROID_LENS_STATE_MOVING : ANDROID_LENS_STATE_STATIONARY;
+
+    if (mLastActiveTriggerTime != 0 || !HONEST_AF) {
+        switch (afState) {
+        case icamera::AF_STATE_LOCAL_SEARCH:
+        case icamera::AF_STATE_EXTENDED_SEARCH:
+            LOG2("@%s AF state SCANNING", __PRETTY_FUNCTION__);
+            break;
+        case icamera::AF_STATE_SUCCESS:
+            mCurrentAfState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED;
+            resetTrigger(0);
+            LOG2("@%s AF state FOCUSED_LOCKED", __PRETTY_FUNCTION__);
+            break;
+        case icamera::AF_STATE_FAIL:
+            mCurrentAfState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED;
+            resetTrigger(0);
+            LOG2("@%s AF state NOT_FOCUSED_LOCKED", __PRETTY_FUNCTION__);
+            break;
+        default:
+        case icamera::AF_STATE_IDLE:
+            LOG2("@%s AF state INACTIVE", __PRETTY_FUNCTION__);
+            break;
+        }
+    }
+
+    checkIfFocusTimeout();
+
+    updateResult(result);
+
+    return icamera::OK;
+}
+
+/******************************************************************************
+ * AF MODE   -  CONTINUOUS PICTURE
+ ******************************************************************************/
+
+IntelAFModeContinuousPicture::IntelAFModeContinuousPicture():IntelAfModeBase()
+{
+    LOG1("%s", __func__);
+}
+
+int IntelAFModeContinuousPicture::processTriggers(uint8_t afTrigger, uint8_t afMode)
+{
+    LOG2("%s", __func__);
+
+    IntelAfModeBase::processTriggers(afTrigger, afMode);
+
+    // Override AF state if we just got an AF TRIGGER CANCEL
+    if (mLastAfControls.afTrigger == ANDROID_CONTROL_AF_TRIGGER_CANCEL) {
+        /* Scan is supposed to be restarted, which we try by triggering a new
+         * scan. (see IntelAFStateMachine::processTriggers)
+         * This however, doesn't do anything at all, because AIQ does not
+         * want to play ball, at least yet.
+         *
+         * We can skip state transitions when allowed by the state
+         * machine documentation, so skip INACTIVE, also skip PASSIVE_SCAN if
+         * possible and go directly to either PASSIVE_FOCUSED or UNFOCUSED
+         *
+         * TODO: Remove this switch-statement, once triggering a scan starts to
+         * work. We could go directly to PASSIVE_SCAN always then, because a
+         * scan is really happening. Now it is not.
+         */
+        switch (mCurrentAfState) {
+        case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
+        case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
+            mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED;
+            break;
+        case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
+            mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED;
+            break;
+        default:
+            mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN;
+            break;
+        }
+    }
+    /* Override AF state if we just got an AF TRIGGER START, this will stop
+     * the scan as intended in the state machine documentation (see
+     * IntelAFStateMachine::processTriggers)
+     */
+    if (mLastAfControls.afTrigger == ANDROID_CONTROL_AF_TRIGGER_START) {
+        if (mCurrentAfState == ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED)
+            mCurrentAfState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED;
+        else if (mCurrentAfState == ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED ||
+                 mCurrentAfState == ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN)
+            mCurrentAfState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED;
+    }
+
+    return icamera::OK;
+}
+
+int IntelAFModeContinuousPicture::processResult(int afState, bool lensMoving,
+                                                android::CameraMetadata& result)
+{
+    LOG2("%s", __func__);
+    mLensState = lensMoving ? ANDROID_LENS_STATE_MOVING : ANDROID_LENS_STATE_STATIONARY;
+
+    // state transition from locked state are only allowed via triggers, which
+    // are handled in the currentAFMode processTriggers() and below in this function.
+    if (mCurrentAfState != ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED &&
+        mCurrentAfState != ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED) {
+        switch (afState) {
+        case icamera::AF_STATE_LOCAL_SEARCH:
+        case icamera::AF_STATE_EXTENDED_SEARCH:
+            LOG2("@%s AF state SCANNING", __PRETTY_FUNCTION__);
+            mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN;
+            break;
+        case icamera::AF_STATE_SUCCESS:
+            if (mLastActiveTriggerTime == 0) {
+                mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED;
+                LOG2("@%s AF state PASSIVE_FOCUSED", __PRETTY_FUNCTION__);
+            } else {
+                resetTrigger(0);
+                mCurrentAfState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED;
+                LOG2("@%s AF state FOCUSED_LOCKED", __PRETTY_FUNCTION__);
+            }
+            break;
+        case icamera::AF_STATE_FAIL:
+            if (mLastActiveTriggerTime == 0) {
+                mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED;
+                LOG2("@%s AF state PASSIVE_UNFOCUSED", __PRETTY_FUNCTION__);
+            } else {
+                resetTrigger(0);
+                mCurrentAfState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED;
+                LOG2("@%s AF state NOT_FOCUSED_LOCKED", __PRETTY_FUNCTION__);
+            }
+            break;
+        default:
+        case icamera::AF_STATE_IDLE:
+            if (mCurrentAfState == ANDROID_CONTROL_AF_STATE_INACTIVE) {
+                mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED;
+                LOG2("@%s AF state PASSIVE_UNFOCUSED (idle)", __PRETTY_FUNCTION__);
+            }
+            break;
+        }
+    }
+
+    checkIfFocusTimeout();
+
+    updateResult(result);
+
+    return icamera::OK;
+}
+
+} // namespace camera3
+
diff --git a/camera/hal/intel/ipu6/aal/IntelAFStateMachine.h b/camera/hal/intel/ipu6/aal/IntelAFStateMachine.h
new file mode 100644
index 000000000000..06d94a597465
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/IntelAFStateMachine.h
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "HALv3Header.h"
+
+namespace camera3 {
+
+typedef int64_t usecs_t;
+
+/**
+ * \struct AfControls
+ *
+ * Control Modes saved and passed back to control unit after reading
+ *
+ */
+struct AfControls {
+    uint8_t afMode; /**< AF_MODE */
+    uint8_t afTrigger; /**< AF_TRIGGER */
+};
+
+/**
+ * \class IntelAfModeBase
+ *
+ * Base class for all the AutoFocus modes as defined by the Android
+ * camera device V3.x API.
+ * Each mode will follow certain state transitions. See documentation for
+ * android.control.afState
+ *
+ */
+class IntelAfModeBase {
+public:
+    IntelAfModeBase();
+    virtual ~IntelAfModeBase() {};
+
+    virtual int processTriggers(uint8_t afTrigger, uint8_t afMode) = 0;
+    virtual int processResult(int afState, bool lensMoving,
+                              android::CameraMetadata& result) =0 ;
+
+    void resetState(void);
+    void resetTrigger(usecs_t triggerTime);
+    int getState() { return mCurrentAfState; }
+    void updateResult(android::CameraMetadata& results);
+protected:
+    void checkIfFocusTimeout();
+protected:
+    AfControls mLastAfControls;
+    uint8_t mCurrentAfState;
+    uint8_t  mLensState;
+    usecs_t  mLastActiveTriggerTime;   /**< in useconds */
+    uint32_t mFramesSinceTrigger;
+};
+
+/**
+ * \class IntelAFModeAuto
+ * Derived class from IntelAFModeBase for Auto mode
+ *
+ */
+class IntelAFModeAuto: public IntelAfModeBase {
+public:
+    IntelAFModeAuto();
+    virtual int processTriggers(uint8_t afTrigger, uint8_t afMode);
+    virtual int processResult(int afState, bool lensMoving,
+                              android::CameraMetadata& result);
+};
+
+/**
+ * \class IntelAFModeContinuousPicture
+ * Derived class from IntelAFModeBase for Continuous AF mode
+ *
+ */
+class IntelAFModeContinuousPicture: public IntelAfModeBase {
+public:
+    IntelAFModeContinuousPicture();
+    virtual int processTriggers(uint8_t afTrigger, uint8_t afMode);
+    virtual int processResult(int afState, bool lensMoving,
+                              android::CameraMetadata& result);
+};
+
+/**
+ * \class IntelAFModeOff
+ * Derived class from IntelAFModeBase for OFF mode
+ *
+ */
+class IntelAFModeOff: public IntelAfModeBase {
+public:
+    IntelAFModeOff();
+    virtual int processTriggers(uint8_t afTrigger, uint8_t afMode);
+    virtual int processResult(int afState, bool lensMoving,
+                              android::CameraMetadata& result);
+};
+
+/**
+ * \class IntelAFStateMachine
+ *
+ * This class adapts the Android V3 AF triggers and state transitions to
+ * the ones implemented by the Intel AIQ algorithm
+ * This class is platform independent. Platform specific behaviors should be
+ * implemented in derived classes from this one or from the IntelAFModeBase
+ *
+ */
+class IntelAFStateMachine {
+public:
+    IntelAFStateMachine(int cameraId);
+    virtual ~IntelAFStateMachine();
+
+    int processTriggers(uint8_t afTrigger, uint8_t afMode);
+    int processResult(int afState, bool lensMoving,
+                      android::CameraMetadata& result);
+
+    int updateDefaults(android::CameraMetadata &result,
+                       bool fixedFocus = false) const;
+
+private:
+    // prevent copy constructor and assignment operator
+    DISALLOW_COPY_AND_ASSIGN(IntelAFStateMachine);
+
+private: /* members*/
+    int mCameraId;
+    AfControls      mLastAfControls;
+    IntelAfModeBase *mCurrentAfMode;
+
+    std::vector<uint8_t> mAvailableModes;
+
+    IntelAFModeOff mOffMode;
+    IntelAFModeAuto mAutoMode;
+
+    IntelAFModeContinuousPicture mContinuousPictureMode;
+};
+
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/IntelAWBStateMachine.cpp b/camera/hal/intel/ipu6/aal/IntelAWBStateMachine.cpp
new file mode 100644
index 000000000000..66f8d1c70bc4
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/IntelAWBStateMachine.cpp
@@ -0,0 +1,227 @@
+/*
+ * Copyright (C) 2015-2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelAWBStateMachine"
+
+#include "HALv3Utils.h"
+
+#include "Utils.h"
+#include "Errors.h"
+#include "IntelAWBStateMachine.h"
+
+namespace camera3 {
+
+IntelAWBStateMachine::IntelAWBStateMachine(int aCameraId):
+        mCameraId(aCameraId),
+        mLastControlMode(0),
+        mLastSceneMode(0),
+        mCurrentAwbMode(NULL)
+{
+    LOG1("%s mCameraId %d", __func__, mCameraId);
+    mCurrentAwbMode = &mAutoMode;
+    CLEAR(mLastAwbControls);
+    mLastAwbControls.awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
+}
+
+IntelAWBStateMachine::~IntelAWBStateMachine()
+{
+    LOG1("%s mCameraId %d", __func__, mCameraId);
+}
+
+int IntelAWBStateMachine::processState(uint8_t controlMode, uint8_t sceneMode,
+                                       const AwbControls &awbControls)
+{
+    if (controlMode == ANDROID_CONTROL_MODE_OFF) {
+        mCurrentAwbMode = &mOffMode;
+
+        if (controlMode != mLastControlMode)
+            LOG1("%s: Set AWB offMode: controlMode = %d, awbMode = %d",
+                        __func__, controlMode, awbControls.awbMode);
+    } else {
+        if (awbControls.awbMode == ANDROID_CONTROL_AWB_MODE_OFF) {
+            mCurrentAwbMode = &mOffMode;
+            if (awbControls.awbMode != mLastAwbControls.awbMode)
+                LOG1("%s: Set AWB offMode: controlMode = %d, awbMode = %d",
+                                __func__, controlMode, awbControls.awbMode);
+        } else {
+            mCurrentAwbMode = &mAutoMode;
+            if (awbControls.awbMode != mLastAwbControls.awbMode)
+                LOG1("%s: Set AWB autoMode: controlMode = %d, awbMode = %d",
+                                __func__, controlMode, awbControls.awbMode);
+        }
+    }
+
+    mLastAwbControls = awbControls;
+    mLastSceneMode = sceneMode;
+    mLastControlMode = controlMode;
+    return mCurrentAwbMode->processState(controlMode, sceneMode, awbControls);
+}
+
+int IntelAWBStateMachine::processResult(bool converged, android::CameraMetadata &result)
+{
+    if (CC_UNLIKELY(mCurrentAwbMode == NULL)) {
+        LOGE("Invalid AWB mode - this could not happen - BUG!");
+        return icamera::UNKNOWN_ERROR;
+    }
+
+    return mCurrentAwbMode->processResult(converged, result);
+}
+
+/******************************************************************************
+ * AWB MODE   -  BASE
+ ******************************************************************************/
+IntelAWBModeBase::IntelAWBModeBase():
+        mLastControlMode(0),
+        mLastSceneMode(0),
+        mCurrentAwbState(ANDROID_CONTROL_AWB_STATE_INACTIVE)
+{
+    LOG1("%s", __func__);
+
+    CLEAR(mLastAwbControls);
+}
+
+void IntelAWBModeBase::updateResult(android::CameraMetadata& results)
+{
+    LOG2("%s: current AWB state is: %d", __func__, mCurrentAwbState);
+
+    //# METADATA_Dynamic control.awbMode done
+    results.update(ANDROID_CONTROL_AWB_MODE, &mLastAwbControls.awbMode, 1);
+    //# METADATA_Dynamic control.awbLock done
+    results.update(ANDROID_CONTROL_AWB_LOCK, &mLastAwbControls.awbLock, 1);
+    //# METADATA_Dynamic control.awbState done
+    results.update(ANDROID_CONTROL_AWB_STATE, &mCurrentAwbState, 1);
+}
+
+void IntelAWBModeBase::resetState()
+{
+    LOG2("%s", __func__);
+
+    mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE;
+}
+
+/******************************************************************************
+ * AWB MODE   -  OFF
+ ******************************************************************************/
+
+IntelAWBModeOff::IntelAWBModeOff():IntelAWBModeBase()
+{
+    LOG1("%s", __func__);
+}
+
+int IntelAWBModeOff::processState(uint8_t controlMode, uint8_t sceneMode,
+                                  const AwbControls &awbControls)
+{
+    LOG2("%s", __func__);
+
+    int ret = icamera::OK;
+
+    mLastAwbControls = awbControls;
+    mLastSceneMode = sceneMode;
+    mLastControlMode = controlMode;
+
+    if (controlMode == ANDROID_CONTROL_MODE_OFF ||
+        awbControls.awbMode == ANDROID_CONTROL_AWB_MODE_OFF) {
+        resetState();
+    } else {
+        LOGE("AWB State machine should not be OFF! - Fix bug");
+        ret = icamera::UNKNOWN_ERROR;
+    }
+
+    return ret;
+}
+
+int IntelAWBModeOff::processResult(bool converged, android::CameraMetadata& result)
+{
+    UNUSED(converged);
+    LOG2("%s", __func__);
+
+    mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE;
+    updateResult(result);
+
+    return icamera::OK;
+}
+
+/******************************************************************************
+ * AWB MODE   -  AUTO
+ ******************************************************************************/
+
+IntelAWBModeAuto::IntelAWBModeAuto():IntelAWBModeBase()
+{
+    LOG1("%s", __func__);
+}
+
+int IntelAWBModeAuto::processState(uint8_t controlMode, uint8_t sceneMode,
+                                   const AwbControls &awbControls)
+{
+    if (controlMode != mLastControlMode) {
+        LOG1("%s: control mode has changed %d -> %d, reset AWB State", __func__,
+                mLastControlMode, controlMode);
+        resetState();
+    }
+
+    if (awbControls.awbLock == ANDROID_CONTROL_AWB_LOCK_ON) {
+        mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_LOCKED;
+    } else if (awbControls.awbMode != mLastAwbControls.awbMode ||
+               (controlMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE &&
+                sceneMode != mLastSceneMode)) {
+        resetState();
+    } else {
+        switch (mCurrentAwbState) {
+            case ANDROID_CONTROL_AWB_STATE_LOCKED:
+                mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE;
+                break;
+            case ANDROID_CONTROL_AWB_STATE_INACTIVE:
+            case ANDROID_CONTROL_AWB_STATE_SEARCHING:
+            case ANDROID_CONTROL_AWB_STATE_CONVERGED:
+                //do nothing
+                break;
+            default:
+                LOGE("Invalid AWB state!, State set to INACTIVE");
+                mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE;
+        }
+    }
+    mLastAwbControls = awbControls;
+    mLastSceneMode = sceneMode;
+    mLastControlMode = controlMode;
+    return icamera::OK;
+}
+
+int IntelAWBModeAuto::processResult(bool converged, android::CameraMetadata& result)
+{
+    switch (mCurrentAwbState) {
+        case ANDROID_CONTROL_AWB_STATE_LOCKED:
+        //do nothing
+            break;
+        case ANDROID_CONTROL_AWB_STATE_INACTIVE:
+        case ANDROID_CONTROL_AWB_STATE_SEARCHING:
+        case ANDROID_CONTROL_AWB_STATE_CONVERGED:
+            if (converged)
+                mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_CONVERGED;
+            else
+                mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_SEARCHING;
+            break;
+        default:
+            LOGE("invalid AWB state!, State set to INACTIVE");
+            mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE;
+    }
+
+    updateResult(result);
+
+    return icamera::OK;
+}
+
+} // namespace camera3
+
diff --git a/camera/hal/intel/ipu6/aal/IntelAWBStateMachine.h b/camera/hal/intel/ipu6/aal/IntelAWBStateMachine.h
new file mode 100644
index 000000000000..47f4c22f7f6c
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/IntelAWBStateMachine.h
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2015-2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "HALv3Header.h"
+
+namespace camera3 {
+
+/**
+ * \struct AwbControls
+ *
+ * Control Modes saved and passed back to control unit after reading
+ *
+ */
+struct AwbControls {
+    uint8_t awbMode;                        /**< AWB_MODE */
+    uint8_t awbLock;                        /**< AWB_LOCK */
+    uint8_t colorCorrectionMode;            /**< COLOR_CORRECTION_MODE */
+    uint8_t colorCorrectionAberrationMode;  /**< COLOR_CORRECTION_ABERRATION_MODE */
+};
+
+/**
+ * \class IntelAWBModeBase
+ *
+ * Base class for all the Auto white balance modes as defined by the Android
+ * camera device V3.x API.
+ * Each mode will follow certain state transitions. See documentation for
+ * android.control.awbState
+ *
+ */
+class IntelAWBModeBase {
+public:
+    IntelAWBModeBase();
+    virtual ~IntelAWBModeBase() {};
+
+    virtual int processState(uint8_t controlMode, uint8_t sceneMode,
+                             const AwbControls &awbControls) = 0;
+
+    virtual int processResult(bool converged, android::CameraMetadata &results) = 0;
+
+    void resetState(void);
+    uint8_t getState() const { return mCurrentAwbState; }
+protected:
+    void updateResult(android::CameraMetadata& results);
+protected:
+    AwbControls  mLastAwbControls;
+    uint8_t     mLastControlMode;
+    uint8_t     mLastSceneMode;
+
+    uint8_t     mCurrentAwbState;
+};
+
+/**
+ * \class IntelAWBModeAuto
+ * Derived class from IntelAWBModeBase for Auto mode
+ *
+ */
+class IntelAWBModeAuto: public IntelAWBModeBase {
+public:
+    IntelAWBModeAuto();
+    virtual int processState(uint8_t controlMode, uint8_t sceneMode,
+                             const AwbControls &awbControls);
+
+    virtual int processResult(bool converged, android::CameraMetadata &results);
+};
+
+/**
+ * \class IntelAWBModeOFF
+ * Derived class from IntelAWBModeBase for OFF mode
+ *
+ */
+class IntelAWBModeOff: public IntelAWBModeBase {
+public:
+    IntelAWBModeOff();
+    virtual int processState(uint8_t controlMode, uint8_t sceneMode,
+                             const AwbControls &awbControls);
+
+    virtual int processResult(bool converged, android::CameraMetadata &results);
+};
+
+/**
+ * \class IntelAWBStateMachine
+ *
+ * This class adapts the Android V3 AWB triggers and state transitions to
+ * the ones implemented by the Intel AIQ algorithm
+ * This class is platform independent. Platform specific behaviors should be
+ * implemented in derived classes from this one or from the IntelAWBModeBase
+ *
+ */
+class IntelAWBStateMachine {
+public:
+    IntelAWBStateMachine(int CameraId);
+    virtual ~IntelAWBStateMachine();
+
+    int processState(uint8_t controlMode, uint8_t sceneMode,
+                     const AwbControls &awbControls);
+
+    int processResult(bool converged, android::CameraMetadata &results);
+
+    uint8_t getState() const { return mCurrentAwbMode->getState(); }
+private:
+    // prevent copy constructor and assignment operator
+    DISALLOW_COPY_AND_ASSIGN(IntelAWBStateMachine);
+
+private: /* members*/
+    int mCameraId;
+    AwbControls  mLastAwbControls;
+    uint8_t     mLastControlMode;
+    uint8_t     mLastSceneMode;
+
+    IntelAWBModeBase *mCurrentAwbMode;
+
+    IntelAWBModeOff mOffMode;
+    IntelAWBModeAuto mAutoMode;
+};
+
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/MetadataConvert.cpp b/camera/hal/intel/ipu6/aal/MetadataConvert.cpp
new file mode 100644
index 000000000000..6fad7b3fc074
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/MetadataConvert.cpp
@@ -0,0 +1,2166 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "MetadataConvert"
+
+#include <cmath>
+#include <sstream>
+
+#include "Errors.h"
+#include "Utils.h"
+
+#include "HALv3Utils.h"
+#include "MetadataConvert.h"
+#include "ParameterHelper.h"
+
+namespace camera3 {
+
+#define NSEC_PER_SEC 1000000000LLU
+#define DEFAULT_FPS_RANGE_MIN 15
+#define DEFAULT_FPS_RANGE_MAX 30
+
+template<typename T>
+struct ValuePair {
+    int halValue;
+    T androidValue;
+};
+
+template<typename T>
+static int getAndroidValue(int halValue, const ValuePair<T>* table, int tableCount, T* androidValue)
+{
+    CheckError(!table, icamera::BAD_VALUE, "null table!");
+    CheckError(!androidValue, icamera::BAD_VALUE, "androidValue is nullptr!");
+
+    for (int i = 0; i < tableCount; i++) {
+        if (halValue == table[i].halValue) {
+            *androidValue = table[i].androidValue;
+            return icamera::OK;
+        }
+    }
+    return icamera::BAD_VALUE;
+}
+
+template<typename T>
+static int getHalValue(T androidValue, const ValuePair<T>* table, int tableCount, int* halValue)
+{
+    CheckError(!table, icamera::BAD_VALUE, "null table!");
+    CheckError(!halValue, icamera::BAD_VALUE, "halValue is nullptr!");
+
+    for (int i = 0; i < tableCount; i++) {
+        if (androidValue == table[i].androidValue) {
+            *halValue = table[i].halValue;
+            return icamera::OK;
+        }
+    }
+    return icamera::BAD_VALUE;
+}
+
+static const ValuePair<int32_t> testPatternTable[]= {
+    {icamera::TEST_PATTERN_OFF,        ANDROID_SENSOR_TEST_PATTERN_MODE_OFF},
+    {icamera::SOLID_COLOR,             ANDROID_SENSOR_TEST_PATTERN_MODE_SOLID_COLOR},
+    {icamera::COLOR_BARS,              ANDROID_SENSOR_TEST_PATTERN_MODE_COLOR_BARS},
+    {icamera::COLOR_BARS_FADE_TO_GRAY, ANDROID_SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY},
+    {icamera::PN9,                     ANDROID_SENSOR_TEST_PATTERN_MODE_PN9},
+    {icamera::TEST_PATTERN_CUSTOM1,    ANDROID_SENSOR_TEST_PATTERN_MODE_CUSTOM1},
+};
+
+static const ValuePair<uint8_t> antibandingModesTable[] = {
+    {icamera::ANTIBANDING_MODE_AUTO,  ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO},
+    {icamera::ANTIBANDING_MODE_50HZ,  ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ},
+    {icamera::ANTIBANDING_MODE_60HZ,  ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ},
+    {icamera::ANTIBANDING_MODE_OFF,   ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF},
+};
+
+static const ValuePair<uint8_t> aeModesTable[] = {
+    {icamera::AE_MODE_AUTO,   ANDROID_CONTROL_AE_MODE_ON},
+    {icamera::AE_MODE_MANUAL, ANDROID_CONTROL_AE_MODE_OFF},
+};
+
+static const ValuePair<uint8_t> awbModesTable[] = {
+    {icamera::AWB_MODE_AUTO,            ANDROID_CONTROL_AWB_MODE_AUTO},
+    {icamera::AWB_MODE_INCANDESCENT,    ANDROID_CONTROL_AWB_MODE_INCANDESCENT},
+    {icamera::AWB_MODE_FLUORESCENT,     ANDROID_CONTROL_AWB_MODE_FLUORESCENT},
+    {icamera::AWB_MODE_DAYLIGHT,        ANDROID_CONTROL_AWB_MODE_DAYLIGHT},
+    {icamera::AWB_MODE_FULL_OVERCAST,   ANDROID_CONTROL_AWB_MODE_TWILIGHT},
+    {icamera::AWB_MODE_PARTLY_OVERCAST, ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT},
+    {icamera::AWB_MODE_MANUAL_COLOR_TRANSFORM, ANDROID_CONTROL_AWB_MODE_OFF},
+};
+
+static const ValuePair<uint8_t> afModesTable[] = {
+    {icamera::AF_MODE_OFF,                ANDROID_CONTROL_AF_MODE_OFF},
+    {icamera::AF_MODE_AUTO,               ANDROID_CONTROL_AF_MODE_AUTO},
+    {icamera::AF_MODE_MACRO,              ANDROID_CONTROL_AF_MODE_MACRO},
+    {icamera::AF_MODE_CONTINUOUS_VIDEO,   ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO},
+    {icamera::AF_MODE_CONTINUOUS_PICTURE, ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE},
+};
+
+static const ValuePair<uint8_t> afTriggerTable[] = {
+    {icamera::AF_TRIGGER_START,  ANDROID_CONTROL_AF_TRIGGER_START},
+    {icamera::AF_TRIGGER_CANCEL, ANDROID_CONTROL_AF_TRIGGER_CANCEL},
+    {icamera::AF_TRIGGER_IDLE,   ANDROID_CONTROL_AF_TRIGGER_IDLE},
+};
+
+static const ValuePair<uint8_t> dvsModesTable[] = {
+    {icamera::VIDEO_STABILIZATION_MODE_OFF, ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF},
+    {icamera::VIDEO_STABILIZATION_MODE_ON,  ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_ON},
+};
+
+static const ValuePair<uint8_t> effectModesTable[] = {
+    {icamera::CAM_EFFECT_NONE,     ANDROID_CONTROL_EFFECT_MODE_OFF},
+    {icamera::CAM_EFFECT_MONO,     ANDROID_CONTROL_EFFECT_MODE_MONO},
+    {icamera::CAM_EFFECT_SEPIA,    ANDROID_CONTROL_EFFECT_MODE_SEPIA},
+    {icamera::CAM_EFFECT_NEGATIVE, ANDROID_CONTROL_EFFECT_MODE_NEGATIVE},
+};
+
+static const ValuePair<uint8_t> shadingModeTable[] = {
+    {icamera::SHADING_MODE_OFF,   ANDROID_SHADING_MODE_OFF},
+    {icamera::SHADING_MODE_FAST, ANDROID_SHADING_MODE_FAST},
+    {icamera::SHADING_MODE_HIGH_QUALITY, ANDROID_SHADING_MODE_HIGH_QUALITY},
+};
+
+static const ValuePair<uint8_t> lensShadingMapModeTable[] = {
+    {icamera::LENS_SHADING_MAP_MODE_OFF,   ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF},
+    {icamera::LENS_SHADING_MAP_MODE_ON, ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_ON},
+};
+
+static const ValuePair<uint8_t> tonemapModesTable[] = {
+    {icamera::TONEMAP_MODE_FAST,         ANDROID_TONEMAP_MODE_FAST},
+    {icamera::TONEMAP_MODE_HIGH_QUALITY, ANDROID_TONEMAP_MODE_HIGH_QUALITY},
+    {icamera::TONEMAP_MODE_GAMMA_VALUE,  ANDROID_TONEMAP_MODE_GAMMA_VALUE},
+    {icamera::TONEMAP_MODE_PRESET_CURVE, ANDROID_TONEMAP_MODE_PRESET_CURVE},
+};
+
+static const ValuePair<uint8_t> tonemapPresetCurvesTable[] = {
+    {icamera::TONEMAP_PRESET_CURVE_SRGB,   ANDROID_TONEMAP_PRESET_CURVE_SRGB},
+    {icamera::TONEMAP_PRESET_CURVE_REC709, ANDROID_TONEMAP_PRESET_CURVE_REC709},
+};
+
+MetadataConvert::MetadataConvert(int cameraId) :
+    mCameraId(cameraId)
+{
+    LOG1("@%s, mCameraId %d", __func__, mCameraId);
+}
+
+MetadataConvert::~MetadataConvert()
+{
+    LOG1("@%s", __func__);
+}
+
+int MetadataConvert::constructDefaultMetadata(android::CameraMetadata *settings)
+{
+    LOG1("@%s", __func__);
+
+    int maxRegions[3] = {1,0,1};
+    settings->update(ANDROID_CONTROL_MAX_REGIONS, maxRegions, 3);
+
+    // AE, AF region (AWB region is not supported)
+    int meteringRegion[5] = {0, 0, 0, 0, 0};
+    settings->update(ANDROID_CONTROL_AE_REGIONS, meteringRegion, 5);
+    settings->update(ANDROID_CONTROL_AF_REGIONS, meteringRegion, 5);
+
+    // Control AE, AF, AWB
+    uint8_t mode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO;
+    settings->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &mode, 1);
+    int32_t ev = 0;
+    settings->update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, &ev, 1);
+    uint8_t lock = ANDROID_CONTROL_AE_LOCK_OFF;
+    settings->update(ANDROID_CONTROL_AE_LOCK, &lock, 1);
+    mode = ANDROID_CONTROL_AE_MODE_ON;
+    settings->update(ANDROID_CONTROL_AE_MODE, &mode, 1);
+    mode = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE;
+    settings->update(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, &mode, 1);
+    mode = ANDROID_CONTROL_AE_STATE_INACTIVE;
+    settings->update(ANDROID_CONTROL_AE_STATE, &mode, 1);
+
+    mode = ANDROID_CONTROL_AF_MODE_OFF;
+    settings->update(ANDROID_CONTROL_AF_MODE, &mode, 1);
+    mode = ANDROID_CONTROL_AF_TRIGGER_IDLE;
+    settings->update(ANDROID_CONTROL_AF_TRIGGER, &mode, 1);
+    mode = ANDROID_CONTROL_AF_STATE_INACTIVE;
+    settings->update(ANDROID_CONTROL_AF_STATE, &mode, 1);
+
+    lock = ANDROID_CONTROL_AWB_LOCK_OFF;
+    settings->update(ANDROID_CONTROL_AWB_LOCK, &lock, 1);
+    mode = ANDROID_CONTROL_AWB_MODE_AUTO;
+    settings->update(ANDROID_CONTROL_AWB_MODE, &mode, 1);
+    mode = ANDROID_CONTROL_AWB_STATE_INACTIVE;
+    settings->update(ANDROID_CONTROL_AWB_STATE, &mode, 1);
+
+    // Control others
+    mode = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
+    settings->update(ANDROID_CONTROL_CAPTURE_INTENT, &mode, 1);
+    mode = ANDROID_CONTROL_EFFECT_MODE_OFF;
+    settings->update(ANDROID_CONTROL_EFFECT_MODE, &mode, 1);
+    mode = ANDROID_CONTROL_MODE_AUTO;
+    settings->update(ANDROID_CONTROL_MODE, &mode, 1);
+    mode = ANDROID_CONTROL_SCENE_MODE_DISABLED;
+    settings->update(ANDROID_CONTROL_SCENE_MODE, &mode, 1);
+    mode = ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF;
+    settings->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &mode, 1);
+
+    // Edge
+    mode = ANDROID_EDGE_MODE_OFF;
+    settings->update(ANDROID_EDGE_MODE, &mode, 1);
+
+    // Noise reduction
+    mode = ANDROID_NOISE_REDUCTION_MODE_OFF;
+    settings->update(ANDROID_NOISE_REDUCTION_MODE, &mode, 1);
+
+    // Flash
+    mode = ANDROID_FLASH_MODE_OFF;
+    settings->update(ANDROID_FLASH_MODE, &mode, 1);
+    mode = ANDROID_FLASH_STATE_READY;
+    settings->update(ANDROID_FLASH_STATE, &mode, 1);
+
+    // Hot pixel
+    mode = ANDROID_HOT_PIXEL_MODE_FAST;
+    settings->update(ANDROID_HOT_PIXEL_MODE, &mode, 1);
+
+    // Black level
+    lock = ANDROID_BLACK_LEVEL_LOCK_OFF;
+    settings->update(ANDROID_BLACK_LEVEL_LOCK, &lock, 1);
+
+    // Lens
+    camera_metadata_entry entry = settings->find(ANDROID_LENS_INFO_AVAILABLE_APERTURES);
+    if (entry.count >= 1) {
+        settings->update(ANDROID_LENS_APERTURE, &entry.data.f[0], 1);
+    }
+    entry = settings->find(CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
+    if (entry.count >= 1) {
+        settings->update(ANDROID_LENS_FOCAL_LENGTH, &entry.data.f[0], 1);
+    }
+    entry = settings->find(CAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE);
+    if (entry.count == 1) {
+        settings->update(ANDROID_LENS_FOCUS_DISTANCE, &entry.data.f[0], 1);
+    }
+
+    float filterDensity = 0.0f;
+    settings->update(ANDROID_LENS_FILTER_DENSITY, &filterDensity, 1);
+    mode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF;
+    settings->update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE, &mode, 1);
+
+    int64_t value_i64 = 0;
+    settings->update(ANDROID_SENSOR_ROLLING_SHUTTER_SKEW, &value_i64, 1);
+
+    // Sync
+    int64_t frameNumber = ANDROID_SYNC_FRAME_NUMBER_UNKNOWN;
+    settings->update(ANDROID_SYNC_FRAME_NUMBER, &frameNumber, 1);
+
+    // Request
+    mode = ANDROID_REQUEST_TYPE_CAPTURE;
+    settings->update(ANDROID_REQUEST_TYPE, &mode, 1);
+    mode = ANDROID_REQUEST_METADATA_MODE_NONE;
+    settings->update(ANDROID_REQUEST_METADATA_MODE, &mode, 1);
+
+    // Scale
+    int32_t region[] = {0, 0, 0, 0};
+    settings->update(ANDROID_SCALER_CROP_REGION, region, 4);
+
+    // Statistics
+    mode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
+    settings->update(ANDROID_STATISTICS_FACE_DETECT_MODE, &mode, 1);
+    mode = ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE_OFF;
+    settings->update(ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE, &mode, 1);
+    mode = ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF;
+    settings->update(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, &mode, 1);
+    mode = ANDROID_STATISTICS_SCENE_FLICKER_NONE;
+    settings->update(ANDROID_STATISTICS_SCENE_FLICKER, &mode, 1);
+
+    // Tonemap
+    mode = ANDROID_TONEMAP_MODE_FAST;
+    settings->update(ANDROID_TONEMAP_MODE, &mode, 1);
+
+    // Sensor
+    value_i64 = 0;
+    settings->update(ANDROID_SENSOR_EXPOSURE_TIME, &value_i64, 1);
+    int32_t sensitivity = 0;
+    settings->update(ANDROID_SENSOR_SENSITIVITY, &sensitivity, 1);
+    int64_t frameDuration = 33000000;
+    settings->update(ANDROID_SENSOR_FRAME_DURATION, &frameDuration, 1);
+    int32_t testPattern = ANDROID_SENSOR_TEST_PATTERN_MODE_OFF;
+    settings->update(ANDROID_SENSOR_TEST_PATTERN_MODE, &testPattern, 1);
+
+    // Jpeg
+    uint8_t quality = 95;
+    settings->update(ANDROID_JPEG_QUALITY, &quality, 1);
+    quality = 90;
+    settings->update(ANDROID_JPEG_THUMBNAIL_QUALITY, &quality, 1);
+
+    entry = settings->find(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
+    int32_t thumbSize[] = { 0, 0 };
+    if (entry.count >= 4) {
+        thumbSize[0] = entry.data.i32[2];
+        thumbSize[1] = entry.data.i32[3];
+    } else {
+        LOGE("Thumbnail size should have more than 2 resolutions: 0x0 and non zero size. Debug.");
+    }
+    settings->update(ANDROID_JPEG_THUMBNAIL_SIZE, thumbSize, 2);
+
+    entry = settings->find(ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES);
+    if (entry.count > 0) {
+        mode = entry.data.u8[0];
+        for (uint32_t i = 0; i < entry.count; i++) {
+            if (entry.data.u8[i] == ANDROID_TONEMAP_MODE_HIGH_QUALITY) {
+                mode = ANDROID_TONEMAP_MODE_HIGH_QUALITY;
+                break;
+            }
+        }
+        settings->update(ANDROID_TONEMAP_MODE, &mode, 1);
+    }
+
+    // Color correction
+    mode = ANDROID_COLOR_CORRECTION_MODE_FAST;
+    settings->update(ANDROID_COLOR_CORRECTION_MODE, &mode, 1);
+
+    float colorTransform[9] = {1.0, 0.0, 0.0,
+                               0.0, 1.0, 0.0,
+                               0.0, 0.0, 1.0};
+    camera_metadata_rational_t transformMatrix[9];
+    for (int i = 0; i < 9; i++) {
+        transformMatrix[i].numerator = colorTransform[i];
+        transformMatrix[i].denominator = 1.0;
+    }
+    settings->update(ANDROID_COLOR_CORRECTION_TRANSFORM, transformMatrix, 9);
+
+    float colorGains[4] = {1.0, 1.0, 1.0, 1.0};
+    settings->update(ANDROID_COLOR_CORRECTION_GAINS, colorGains, 4);
+
+    mode = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF;
+    settings->update(ANDROID_COLOR_CORRECTION_ABERRATION_MODE, &mode, 1);
+
+    return icamera::OK;
+}
+
+int MetadataConvert::updateDefaultRequestSettings(int type, android::CameraMetadata *settings)
+{
+    uint8_t intent =
+        (type == CAMERA3_TEMPLATE_PREVIEW)          ? ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW : \
+        (type == CAMERA3_TEMPLATE_STILL_CAPTURE)    ? ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE : \
+        (type == CAMERA3_TEMPLATE_VIDEO_RECORD)     ? ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD : \
+        (type == CAMERA3_TEMPLATE_VIDEO_SNAPSHOT)   ? ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT : \
+        (type == CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG) ? ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG : \
+        (type == CAMERA3_TEMPLATE_MANUAL)           ? ANDROID_CONTROL_CAPTURE_INTENT_MANUAL : \
+        ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM;
+    settings->update(ANDROID_CONTROL_CAPTURE_INTENT, &intent, 1);
+
+    uint8_t ctrlMode = ANDROID_CONTROL_MODE_AUTO;
+    uint8_t aeMode   = ANDROID_CONTROL_AE_MODE_ON;
+    uint8_t awbMode  = ANDROID_CONTROL_AWB_MODE_AUTO;
+    uint8_t afMode   = ANDROID_CONTROL_AF_MODE_OFF;
+
+    switch (type) {
+    case CAMERA3_TEMPLATE_MANUAL:
+        ctrlMode = ANDROID_CONTROL_MODE_OFF;
+        aeMode   = ANDROID_CONTROL_AE_MODE_OFF;
+        awbMode  = ANDROID_CONTROL_AWB_MODE_OFF;
+        afMode   = ANDROID_CONTROL_AF_MODE_OFF;
+        break;
+    case CAMERA3_TEMPLATE_STILL_CAPTURE:
+    case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
+    case CAMERA3_TEMPLATE_PREVIEW:
+        afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE;
+        break;
+    case CAMERA3_TEMPLATE_VIDEO_RECORD:
+    case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
+        afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO;
+        break;
+    default:
+        break;
+    }
+
+    // Check if AF mode is supported or not.
+    uint32_t tag = ANDROID_CONTROL_AF_AVAILABLE_MODES;
+    camera_metadata_entry entry = settings->find(tag);
+    bool found = false;
+    if (entry.count > 0) {
+       for (size_t i = 0; i < entry.count; i++) {
+           if (afMode == entry.data.u8[i]) found = true;
+       }
+    }
+    if (!found) afMode = ANDROID_CONTROL_AF_MODE_OFF;
+
+    LOG2("%s, type %d, ctrlMode %d, aeMode %d, awbMode %d, afMode %d",
+            __func__, type, ctrlMode, aeMode, awbMode, afMode);
+    settings->update(ANDROID_CONTROL_MODE,     &ctrlMode, 1);
+    settings->update(ANDROID_CONTROL_AE_MODE,  &aeMode,   1);
+    settings->update(ANDROID_CONTROL_AWB_MODE, &awbMode,  1);
+    settings->update(ANDROID_CONTROL_AF_MODE, &afMode,  1);
+
+    tag = ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES;
+    camera_metadata_entry fpsRangesEntry = settings->find(tag);
+    if ((fpsRangesEntry.count >= 2) && (fpsRangesEntry.count % 2 == 0)) {
+        int32_t delta = INT32_MAX;
+        int fpsRange[] = {DEFAULT_FPS_RANGE_MIN, DEFAULT_FPS_RANGE_MAX};
+
+        //choose closest (DEFAULT_FPS_RANGE_MIN, DEFAULT_FPS_RANGE_MAX) range
+        for (size_t i = 0; i < fpsRangesEntry.count; i += 2) {
+            int32_t diff = abs(fpsRangesEntry.data.i32[i] - DEFAULT_FPS_RANGE_MIN) +
+                           abs(fpsRangesEntry.data.i32[i + 1] - DEFAULT_FPS_RANGE_MAX);
+
+            if (delta > diff) {
+                fpsRange[0] = fpsRangesEntry.data.i32[i];
+                fpsRange[1] = fpsRangesEntry.data.i32[i + 1];
+                delta = diff;
+            }
+        }
+
+        if (type == CAMERA3_TEMPLATE_VIDEO_RECORD) {
+            // Stable range requried for video recording
+            fpsRange[0] = fpsRange[1];
+        }
+        settings->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, &fpsRange[0], 2);
+    } else {
+        LOGW("The fpsRanges isn't correct, please check the profiles file");
+    }
+
+    return icamera::OK;
+}
+
+int MetadataConvert::requestMetadataToHALMetadata(const android::CameraMetadata &settings,
+                                                  icamera::Parameters *parameter)
+{
+    LOG1("@%s: settings entry count %d", __func__, settings.entryCount());
+    CheckError(parameter == nullptr, icamera::BAD_VALUE, "%s, parameter is nullptr", __func__);
+
+    // ANDROID_COLOR_CORRECTION
+    convertColorCorrectionMetadata(settings, parameter);
+
+    // ANDROID_CONTROL
+    convertControlMetadata(settings, parameter);
+
+    // ANDROID_DEMOSAIC
+    // ANDROID_EDGE
+    // ANDROID_HOT_PIXEL
+    // ANDROID_NOISE_REDUCTION
+    // ANDROID_SHADING
+    // ANDROID_TONEMAP
+    convertTonemapMetadata(settings, parameter);
+    // ANDROID_BLACK_LEVEL
+    convertAdvancedFeatureMetadata(settings, parameter);
+    // ANDROID_FLASH
+
+    // ANDROID_JPEG
+    convertJpegMetadata(settings, parameter);
+
+    // ANDROID_LENS
+    convertLensMetadata(settings, parameter);
+
+    // ANDROID_SCALER
+
+    // ANDROID_SENSOR
+    convertSensorMetadata(settings, parameter);
+
+    // ANDROID_STATISTICS
+
+    // ANDROID_LED
+
+    // ANDROID_REPROCESS
+
+     return icamera::OK;
+}
+
+int MetadataConvert::HALMetadataToRequestMetadata(const icamera::Parameters &parameter,
+                                                  android::CameraMetadata *settings)
+{
+    LOG1("@%s", __func__);
+
+    CheckError(settings == nullptr, icamera::BAD_VALUE, "%s, settings is nullptr", __func__);
+
+    // ANDROID_COLOR_CORRECTION
+    convertColorCorrectionParameter(parameter, settings);
+
+    // ANDROID_CONTROL
+    convertControlParameter(parameter, settings);
+
+    // ANDROID_FLASH
+    // ANDROID_FLASH_INFO
+    convertFlashParameter(parameter, settings);
+
+    // ANDROID_JPEG
+
+    // ANDROID_LENS
+    // ANDROID_LENS_INFO
+    convertLensParameter(parameter, settings);
+
+    // ANDROID_QUIRKS
+
+    // ANDROID_REQUEST
+
+    // ANDROID_SCALER
+
+    // ANDROID_SENSOR
+    // ANDROID_SENSOR_INFO
+    convertSensorParameter(parameter, settings);
+
+    // ANDROID_STATISTICS
+    // ANDROID_STATISTICS_INFO
+    convertStatisticsParameter(parameter, settings);
+
+    // ANDROID_TONEMAP
+    convertTonemapParameter(parameter, settings);
+
+    // ANDROID_DEMOSAIC, ANDROID_EDGE, ANDROID_HOT_PIXEL, ANDROID_NOISE_REDUCTION
+    // ANDROID_SHADING, ANDROID_INFO, ANDROID_BLACK_LEVEL, ANDROID_SYNC
+    convertAdvancedFeatureParameter(parameter, settings);
+
+    // ANDROID_LED
+
+    // ANDROID_REPROCESS
+
+    // ANDROID_DEPTH
+
+    LOG1("@%s: convert entry count %d", __func__, settings->entryCount());
+    return icamera::OK;
+}
+
+int MetadataConvert::HALCapabilityToStaticMetadata(const icamera::Parameters &parameter,
+                                                   android::CameraMetadata *settings)
+{
+    LOG1("@%s", __func__);
+
+    CheckError(settings == nullptr, icamera::BAD_VALUE, "%s, settings is nullptr", __func__);
+
+    // ANDROID_COLOR_CORRECTION
+    uint8_t aberrationAvailable = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF;
+    settings->update(ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES, &aberrationAvailable, 1);
+
+    // ANDROID_CONTROL
+    fillControlStaticMetadata(parameter, settings);
+
+    // ANDROID_FLASH
+    // ANDROID_FLASH_INFO
+    uint8_t flashInfoAvailable = ANDROID_FLASH_INFO_AVAILABLE_FALSE;
+    settings->update(ANDROID_FLASH_INFO_AVAILABLE, &flashInfoAvailable, 1);
+
+    // ANDROID_JPEG
+    fillJpegStaticMetadata(parameter, settings);
+
+    // ANDROID_LENS
+    // ANDROID_LENS_INFO
+    fillLensStaticMetadata(parameter, settings);
+
+    // ANDROID_QUIRKS
+
+    // ANDROID_REQUEST
+    fillRequestStaticMetadata(parameter, settings);
+
+    // ANDROID_SCALER
+    fillScalerStaticMetadata(parameter, settings);
+
+    // ANDROID_SENSOR
+    // ANDROID_SENSOR_INFO
+    fillSensorStaticMetadata(parameter, settings);
+
+    // ANDROID_STATISTICS
+    // ANDROID_STATISTICS_INFO
+    fillStatisticsStaticMetadata(parameter, settings);
+
+    // ANDROID_TONEMAP
+    fillTonemapStaticMetadata(parameter, settings);
+
+    // ANDROID_LED
+    uint8_t availLeds = ANDROID_LED_AVAILABLE_LEDS_TRANSMIT;
+    settings->update(ANDROID_LED_AVAILABLE_LEDS, &availLeds, 1);
+
+    // ANDROID_REPROCESS
+
+    // ANDROID_DEPTH
+
+    fillAdvancedFeatureStaticMetadata(parameter, settings);
+
+    return icamera::OK;
+}
+
+void MetadataConvert::convertFaceDetectionMetadata(
+                                        const icamera::CVFaceDetectionAbstractResult &fdResult,
+                                        android::CameraMetadata *settings)
+{
+    CheckError(settings == nullptr, VOID_VALUE, "@%s, settings is nullptr", __func__);
+
+    camera_metadata_entry entry = settings->find(ANDROID_STATISTICS_FACE_DETECT_MODE);
+    CheckError(entry.count == 0, VOID_VALUE, "@%s: No face detection mode setting", __func__);
+
+    const uint8_t mode = entry.data.u8[0];
+    if (mode == ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) {
+        LOG2("%s: Face mode is off", __func__);
+        int faceIds[1] = {0};
+        settings->update(ANDROID_STATISTICS_FACE_IDS, faceIds, 1);
+        return;
+    } else if (mode == ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE) {
+        LOG2("%s: Face mode is simple", __func__);
+        // Face id is expected to be -1 for SIMPLE mode
+        if (fdResult.faceNum > 0) {
+            int faceIds[MAX_FACES_DETECTABLE];
+            for (int i = 0; i < fdResult.faceNum; i++) {
+                faceIds[i] = -1;
+            }
+            settings->update(ANDROID_STATISTICS_FACE_IDS, faceIds, fdResult.faceNum);
+        } else {
+            int faceIds[1] = {-1};
+            settings->update(ANDROID_STATISTICS_FACE_IDS, faceIds, 1);
+        }
+    } else if (mode == ANDROID_STATISTICS_FACE_DETECT_MODE_FULL) {
+        LOG2("%s: Face mode is full", __func__);
+        /*
+         * from the spec:
+         * SIMPLE mode must fill in android.statistics.faceRectangles and android.statistics.faceScores.
+         * FULL mode must also fill in android.statistics.faceIds, and android.statistics.faceLandmarks.
+         */
+        settings->update(ANDROID_STATISTICS_FACE_IDS, fdResult.faceIds, fdResult.faceNum);
+        settings->update(ANDROID_STATISTICS_FACE_LANDMARKS, fdResult.faceLandmarks, LM_SIZE * fdResult.faceNum);
+    }
+
+    settings->update(ANDROID_STATISTICS_FACE_RECTANGLES, fdResult.faceRect, RECT_SIZE * fdResult.faceNum);
+    settings->update(ANDROID_STATISTICS_FACE_SCORES, fdResult.faceScores, fdResult.faceNum);
+}
+
+int MetadataConvert::convertColorCorrectionMetadata(const android::CameraMetadata &settings,
+                                                    icamera::Parameters *parameter)
+{
+    uint32_t tag = ANDROID_COLOR_CORRECTION_TRANSFORM;
+    camera_metadata_ro_entry entry = settings.find(tag);
+    if (entry.count == 9) {
+        icamera::camera_color_transform_t transform;
+        for (size_t i = 0; i < entry.count; i++) {
+            transform.color_transform[i / 3][i % 3] =
+                    ((float)entry.data.r[i].numerator) / entry.data.r[i].denominator;
+        }
+        parameter->setColorTransform(transform);
+    }
+
+    tag = ANDROID_COLOR_CORRECTION_GAINS;
+    entry = settings.find(tag);
+    if (entry.count == 4) {
+        icamera::camera_color_gains_t gains;
+        for (size_t i = 0; i < entry.count; i++) {
+            gains.color_gains_rggb[i] = entry.data.f[i];
+        }
+        parameter->setColorGains(gains);
+    }
+
+    return icamera::OK;
+}
+
+int MetadataConvert::convertColorCorrectionParameter(const icamera::Parameters &parameter,
+                                                     android::CameraMetadata *settings)
+{
+    icamera::camera_color_transform_t transform;
+    if (parameter.getColorTransform(transform) == 0) {
+        camera_metadata_rational_t matrix[9];
+        for (int i = 0; i < 9; i++) {
+            matrix[i].numerator = round(transform.color_transform[i / 3][i % 3] * 1000);
+            matrix[i].denominator = 1000;
+        }
+        settings->update(ANDROID_COLOR_CORRECTION_TRANSFORM, &matrix[0], 9);
+    }
+
+    icamera::camera_color_gains_t colorGains;
+    if (parameter.getColorGains(colorGains) == 0) {
+        settings->update(ANDROID_COLOR_CORRECTION_GAINS, &colorGains.color_gains_rggb[0], 4);
+    }
+
+    uint8_t aberrationMode = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF;
+    settings->update(ANDROID_COLOR_CORRECTION_ABERRATION_MODE, &aberrationMode, 1);
+
+    return icamera::OK;
+}
+
+int MetadataConvert::convertControlMetadata(const android::CameraMetadata &settings,
+                                            icamera::Parameters *parameter)
+{
+    int ret = icamera::OK;
+    int mode = 0;
+    uint32_t tag = ANDROID_CONTROL_AE_MODE;
+    camera_metadata_ro_entry entry = settings.find(tag);
+    if (entry.count == 1) {
+        ret = getHalValue(entry.data.u8[0], aeModesTable, ARRAY_SIZE(aeModesTable), &mode);
+        if (ret == icamera::OK) {
+            parameter->setAeMode((icamera::camera_ae_mode_t)mode);
+        }
+    }
+
+    tag = ANDROID_STATISTICS_FACE_DETECT_MODE;
+    entry = settings.find(tag);
+    uint8_t fdValue = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
+    if ((entry.count == 1) && (entry.data.u8[0] == ANDROID_STATISTICS_FACE_DETECT_MODE_OFF)) {
+        int faceIds[1] = {0};
+        parameter->setFaceIds(faceIds, 1);
+    } else {
+        fdValue = entry.data.u8[0];
+    }
+    parameter->setFaceDetectMode(fdValue);
+
+    tag = ANDROID_CONTROL_AE_LOCK;
+    entry = settings.find(tag);
+    if (entry.count == 1) {
+        bool aeLock = (entry.data.u8[0] == ANDROID_CONTROL_AE_LOCK_ON);
+        parameter->setAeLock(aeLock);
+    }
+
+    tag = ANDROID_CONTROL_AE_REGIONS;
+    entry = settings.find(tag);
+    icamera::camera_window_list_t windows;
+    if (entry.count > 0) {
+        if (convertToHalWindow(entry.data.i32, entry.count, &windows) == 0) {
+            parameter->setAeRegions(windows);
+        }
+    }
+
+    tag = ANDROID_CONTROL_AE_TARGET_FPS_RANGE;
+    entry = settings.find(tag);
+    if (entry.count == 2) {
+        icamera::camera_range_t range;
+        range.min = entry.data.i32[0];
+        range.max = entry.data.i32[1];
+        parameter->setFpsRange(range);
+    }
+
+    tag = ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION;
+    entry = settings.find(tag);
+    if (entry.count == 1) {
+        parameter->setAeCompensation(entry.data.i32[0]);
+    }
+
+    tag = ANDROID_CONTROL_AE_ANTIBANDING_MODE;
+    entry = settings.find(tag);
+    if (entry.count == 1) {
+        ret = getHalValue(entry.data.u8[0], antibandingModesTable, ARRAY_SIZE(antibandingModesTable), &mode);
+        if (ret == icamera::OK) {
+            parameter->setAntiBandingMode((icamera::camera_antibanding_mode_t)mode);
+        }
+    }
+
+    tag = ANDROID_CONTROL_AF_MODE;
+    entry = settings.find(tag);
+    if (entry.count == 1) {
+        ret = getHalValue(entry.data.u8[0], afModesTable, ARRAY_SIZE(afModesTable), &mode);
+        if (ret == icamera::OK) {
+            parameter->setAfMode((icamera::camera_af_mode_t)mode);
+        }
+    }
+
+    tag = ANDROID_CONTROL_AF_TRIGGER;
+    entry = settings.find(tag);
+    if (entry.count == 1) {
+        ret = getHalValue(entry.data.u8[0], afTriggerTable, ARRAY_SIZE(afTriggerTable), &mode);
+        if (ret == icamera::OK) {
+            parameter->setAfTrigger((icamera::camera_af_trigger_t)mode);
+        }
+    }
+
+    tag = ANDROID_CONTROL_AF_REGIONS;
+    entry = settings.find(tag);
+    windows.clear();
+    if (entry.count > 0) {
+        if (convertToHalWindow(entry.data.i32, entry.count, &windows) == 0) {
+            parameter->setAfRegions(windows);
+        }
+    }
+
+    tag = ANDROID_CONTROL_AWB_MODE;
+    entry = settings.find(tag);
+    if (entry.count == 1) {
+        ret = getHalValue(entry.data.u8[0], awbModesTable, ARRAY_SIZE(awbModesTable), &mode);
+        if (ret == icamera::OK) {
+            parameter->setAwbMode((icamera::camera_awb_mode_t)mode);
+        }
+    }
+
+    tag = ANDROID_CONTROL_AWB_LOCK;
+    entry = settings.find(tag);
+    if (entry.count == 1) {
+        bool awbLock = (entry.data.u8[0] == ANDROID_CONTROL_AWB_LOCK_ON);
+        parameter->setAwbLock(awbLock);
+    }
+
+    tag = ANDROID_CONTROL_AWB_REGIONS;
+    entry = settings.find(tag);
+    windows.clear();
+    if (entry.count > 0) {
+        if (convertToHalWindow(entry.data.i32, entry.count, &windows) == 0) {
+            parameter->setAwbRegions(windows);
+        }
+    }
+
+    tag = ANDROID_CONTROL_VIDEO_STABILIZATION_MODE;
+    entry = settings.find(tag);
+    if (entry.count == 1) {
+        ret = getHalValue(entry.data.u8[0], dvsModesTable, ARRAY_SIZE(dvsModesTable), &mode);
+        if (ret == icamera::OK) {
+            parameter->setVideoStabilizationMode((icamera::camera_video_stabilization_mode_t)mode);
+        }
+    }
+
+    tag = ANDROID_CONTROL_EFFECT_MODE;
+    entry = settings.find(tag);
+    if (entry.count == 1) {
+        ret = getHalValue(entry.data.u8[0], effectModesTable, ARRAY_SIZE(effectModesTable), &mode);
+        if (ret == icamera::OK) {
+            parameter->setImageEffect((icamera::camera_effect_mode_t)mode);
+        }
+    }
+
+    return icamera::OK;
+}
+
+int MetadataConvert::convertControlParameter(const icamera::Parameters &parameter,
+                                             android::CameraMetadata *settings)
+{
+    int ret = icamera::OK;
+    uint8_t mode = 0;
+    icamera::camera_ae_mode_t aeMode;
+    if (parameter.getAeMode(aeMode) == 0) {
+        ret = getAndroidValue(aeMode,aeModesTable, ARRAY_SIZE(aeModesTable), &mode);
+        if (ret == icamera::OK) {
+            settings->update(ANDROID_CONTROL_AE_MODE, &mode, 1);
+        }
+    }
+
+    bool aeLock;
+    if (parameter.getAeLock(aeLock) == 0) {
+        uint8_t mode = aeLock ? ANDROID_CONTROL_AE_LOCK_ON
+                              : ANDROID_CONTROL_AE_LOCK_OFF;
+        settings->update(ANDROID_CONTROL_AE_LOCK, &mode, 1);
+    }
+
+    icamera::camera_window_list_t windows;
+    parameter.getAeRegions(windows);
+    int count = windows.size() * 5;
+    if (count > 0) {
+        int regions[count];
+        count = convertToMetadataRegion(windows, windows.size() * 5, regions);
+        if (count > 0) {
+            settings->update(ANDROID_CONTROL_AE_REGIONS, &regions[0], count);
+        }
+    }
+
+    icamera::camera_range_t range;
+    if (parameter.getFpsRange(range) == 0) {
+        int fps[2] = {(int)range.min, (int)range.max};
+        settings->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, &fps[0], 2);
+    }
+
+    int ev;
+    if (parameter.getAeCompensation(ev) == 0) {
+        settings->update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, &ev, 1);
+    }
+
+    icamera::camera_antibanding_mode_t antiMode;
+    if (parameter.getAntiBandingMode(antiMode) == 0) {
+        ret = getAndroidValue(antiMode, antibandingModesTable, ARRAY_SIZE(antibandingModesTable), &mode);
+        if (ret == icamera::OK) {
+            settings->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &mode, 1);
+        }
+    }
+
+    icamera::camera_af_mode_t afMode;
+    if (parameter.getAfMode(afMode) == 0) {
+        ret = getAndroidValue(afMode, afModesTable, ARRAY_SIZE(afModesTable), &mode);
+        if (ret == icamera::OK) {
+            settings->update(ANDROID_CONTROL_AF_MODE, &mode, 1);
+        }
+    }
+
+    windows.clear();
+    parameter.getAfRegions(windows);
+    count = windows.size() * 5;
+    if (count > 0) {
+        int regions[count];
+        count = convertToMetadataRegion(windows, windows.size() * 5, regions);
+        if (count > 0) {
+            settings->update(ANDROID_CONTROL_AF_REGIONS, &regions[0], count);
+        }
+    }
+
+    icamera::camera_awb_mode_t awbMode;
+    if (parameter.getAwbMode(awbMode) == 0) {
+        ret = getAndroidValue(awbMode, awbModesTable, ARRAY_SIZE(awbModesTable), &mode);
+        if (ret == icamera::OK) {
+            settings->update(ANDROID_CONTROL_AWB_MODE, &mode, 1);
+        }
+    }
+
+    bool awbLock;
+    if (parameter.getAwbLock(awbLock) == 0) {
+        uint8_t mode = awbLock ? ANDROID_CONTROL_AWB_LOCK_ON
+                               : ANDROID_CONTROL_AWB_LOCK_OFF;
+        settings->update(ANDROID_CONTROL_AWB_LOCK, &mode, 1);
+    }
+
+    windows.clear();
+    parameter.getAwbRegions(windows);
+    count = windows.size() * 5;
+    if (count > 0) {
+        int regions[count];
+        count = convertToMetadataRegion(windows, windows.size() * 5, regions);
+        if (count > 0) {
+            settings->update(ANDROID_CONTROL_AWB_REGIONS, &regions[0], count);
+        }
+    }
+
+    icamera::camera_video_stabilization_mode_t dvsMode;
+    if (parameter.getVideoStabilizationMode(dvsMode) == 0) {
+        ret = getAndroidValue(dvsMode, dvsModesTable, ARRAY_SIZE(dvsModesTable), &mode);
+        if (ret == icamera::OK) {
+            settings->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &mode, 1);
+        }
+    }
+
+    icamera::camera_effect_mode_t effectMode;
+    if (parameter.getImageEffect(effectMode) == 0) {
+        ret = getAndroidValue(effectMode, effectModesTable, ARRAY_SIZE(effectModesTable), &mode);
+        if (ret == icamera::OK) {
+            settings->update(ANDROID_CONTROL_EFFECT_MODE, &mode, 1);
+        }
+    }
+
+    return icamera::OK;
+}
+
+int MetadataConvert::convertJpegMetadata(const android::CameraMetadata &settings,
+                                         icamera::Parameters *parameter)
+{
+    uint32_t tag = ANDROID_JPEG_GPS_COORDINATES;
+    camera_metadata_ro_entry entry = settings.find(tag);
+    if (entry.count == 3) {
+        parameter->setJpegGpsCoordinates(entry.data.d);
+    }
+
+    tag = ANDROID_JPEG_GPS_PROCESSING_METHOD;
+    entry = settings.find(tag);
+    if (entry.count >= 1) {
+        char data[entry.count + 1];
+        MEMCPY_S(data, sizeof(data), entry.data.u8, entry.count);
+        data[entry.count] = 0;
+        parameter->setJpegGpsProcessingMethod(data);
+    }
+
+    tag = ANDROID_JPEG_GPS_TIMESTAMP;
+    entry = settings.find(tag);
+    if (entry.count == 1) {
+        parameter->setJpegGpsTimeStamp(entry.data.i64[0]);
+    }
+
+    tag = ANDROID_JPEG_ORIENTATION;
+    entry = settings.find(tag);
+    if (entry.count == 1) {
+        parameter->setJpegRotation(entry.data.i32[0]);
+    }
+
+    tag = ANDROID_JPEG_QUALITY;
+    entry = settings.find(tag);
+    if (entry.count == 1) {
+        int quality = entry.data.u8[0];
+        parameter->setJpegQuality(quality);
+    }
+
+    tag = ANDROID_JPEG_THUMBNAIL_QUALITY;
+    entry = settings.find(tag);
+    if (entry.count == 1) {
+        int quality = entry.data.u8[0];
+        parameter->setJpegThumbnailQuality(quality);
+    }
+
+    tag = ANDROID_JPEG_THUMBNAIL_SIZE;
+    entry = settings.find(tag);
+    if (entry.count == 2) {
+        icamera::camera_resolution_t size;
+        size.width  = entry.data.i32[0];
+        size.height = entry.data.i32[1];
+        parameter->setJpegThumbnailSize(size);
+    }
+
+    return icamera::OK;
+}
+
+int MetadataConvert::convertTonemapMetadata(const android::CameraMetadata &settings,
+                                            icamera::Parameters *parameter) {
+    int ret = icamera::OK;
+
+    camera_metadata_ro_entry entry = settings.find(ANDROID_TONEMAP_MODE);
+    if (entry.count == 1) {
+        int32_t mode = 0;
+        ret = getHalValue(entry.data.u8[0], tonemapModesTable,
+                          ARRAY_SIZE(tonemapModesTable), &mode);
+        if (ret == icamera::OK) {
+            parameter->setTonemapMode((icamera::camera_tonemap_mode_t)mode);
+        }
+    }
+
+    entry = settings.find(ANDROID_TONEMAP_PRESET_CURVE);
+    if (entry.count == 1) {
+        int32_t curve = 0;
+        ret = getHalValue(entry.data.u8[0], tonemapPresetCurvesTable,
+                          ARRAY_SIZE(tonemapPresetCurvesTable), &curve);
+        if (ret == icamera::OK) {
+            parameter->setTonemapPresetCurve((icamera::camera_tonemap_preset_curve_t)curve);
+        }
+    }
+
+    entry = settings.find(ANDROID_TONEMAP_GAMMA);
+    if (entry.count == 1) {
+        parameter->setTonemapGamma(entry.data.f[0]);
+    }
+
+    return icamera::OK;
+}
+
+int MetadataConvert::convertTonemapParameter(const icamera::Parameters &parameter,
+                                             android::CameraMetadata *settings) {
+    icamera::camera_tonemap_curves_t curves;
+    if (parameter.getTonemapCurves(curves) == 0) {
+        settings->update(ANDROID_TONEMAP_CURVE_RED, curves.rCurve, curves.rSize);
+        settings->update(ANDROID_TONEMAP_CURVE_BLUE, curves.bCurve, curves.bSize);
+        settings->update(ANDROID_TONEMAP_CURVE_GREEN, curves.gCurve, curves.gSize);
+    }
+
+    return icamera::OK;
+}
+
+int MetadataConvert::convertSensorMetadata(const android::CameraMetadata &settings,
+                                           icamera::Parameters *parameter)
+{
+    // get control ae mode
+    uint8_t manualAeMode = ANDROID_CONTROL_AE_MODE_ON;
+    uint32_t tag = ANDROID_CONTROL_AE_MODE;
+    camera_metadata_ro_entry entry = settings.find(tag);
+    if (entry.count == 1) {
+        manualAeMode = entry.data.u8[0];
+    }
+
+    // get control mode
+    uint8_t manualMode = ANDROID_CONTROL_MODE_AUTO;
+    tag = ANDROID_CONTROL_MODE;
+    entry = settings.find(tag);
+    if (entry.count == 1) {
+        manualMode = entry.data.u8[0];
+    }
+
+    if (manualAeMode == ANDROID_CONTROL_AE_MODE_OFF || manualMode == ANDROID_CONTROL_MODE_OFF) {
+        // manual exposure control
+        tag = ANDROID_SENSOR_EXPOSURE_TIME;
+        entry = settings.find(tag);
+        if (entry.count == 1) {
+            parameter->setExposureTime(entry.data.i64[0] / 1000); // ns -> us
+        }
+
+        // manual sensitivity control
+        tag = ANDROID_SENSOR_SENSITIVITY;
+        entry = settings.find(tag);
+        if (entry.count == 1) {
+            float sensitivity = log10(entry.data.i32[0]) * 20.0; // ISO -> db
+            parameter->setSensitivityGain(sensitivity);
+        }
+
+        // manual frame duration control
+        int64_t maxFrameDuration = 0;
+        entry = settings.find(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION);
+        if (entry.count == 1) {
+            maxFrameDuration = entry.data.i64[0];
+            LOG2("@%s, maxFrameDuration:%ld ns", __func__, maxFrameDuration);
+        }
+
+        tag = ANDROID_SENSOR_FRAME_DURATION;
+        entry = settings.find(tag);
+        if (entry.count == 1) {
+            int64_t frameDuration = entry.data.i64[0];
+            LOG2("@%s, frameDuration:%ld ns", __func__, frameDuration);
+            if (maxFrameDuration > 0 && frameDuration > maxFrameDuration) {
+                frameDuration = maxFrameDuration;
+            }
+
+            float fps = NSEC_PER_SEC / frameDuration;
+            parameter->setFrameRate(fps);
+        }
+    }
+
+    // Test Pattern Mode
+    tag = ANDROID_SENSOR_TEST_PATTERN_MODE;
+    entry = settings.find(tag);
+    if (entry.count == 1) {
+        int halTestPatternMode = icamera::TEST_PATTERN_OFF;
+        int ret = getHalValue(entry.data.i32[0], testPatternTable, ARRAY_SIZE(testPatternTable),
+                              &halTestPatternMode);
+        if (ret == icamera::OK) {
+            parameter->setTestPatternMode(static_cast<icamera::camera_test_pattern_mode_t>(halTestPatternMode));
+        }
+    }
+
+    return icamera::OK;
+}
+
+int MetadataConvert::convertSensorParameter(const icamera::Parameters &parameter,
+                                            android::CameraMetadata *settings)
+{
+    int64_t exposure;
+    if (parameter.getExposureTime(exposure) == 0) {
+        int64_t time = exposure * 1000; // us -> ns
+        settings->update(ANDROID_SENSOR_EXPOSURE_TIME, &time, 1);
+    }
+
+    float sensitivity;
+    if (parameter.getSensitivityGain(sensitivity) == 0) {
+        int32_t iso = round(pow(10, (sensitivity / 20))); // db -> ISO
+        settings->update(ANDROID_SENSOR_SENSITIVITY, &iso, 1);
+    }
+
+    float fps;
+    if (parameter.getFrameRate(fps) == icamera::OK) {
+        int64_t duration = NSEC_PER_SEC / fps;
+        settings->update(ANDROID_SENSOR_FRAME_DURATION, &duration, 1);
+    }
+
+    icamera::camera_test_pattern_mode_t halTestPatternMode = icamera::TEST_PATTERN_OFF;
+    if (parameter.getTestPatternMode(halTestPatternMode) == icamera::OK) {
+        int32_t androidPatternMode = ANDROID_SENSOR_TEST_PATTERN_MODE_OFF;
+        int ret = getAndroidValue(halTestPatternMode, testPatternTable, ARRAY_SIZE(testPatternTable),
+                                  &androidPatternMode);
+        if (ret == icamera::OK) {
+            settings->update(ANDROID_SENSOR_TEST_PATTERN_MODE, &androidPatternMode, 1);
+        }
+    }
+
+    return icamera::OK;
+}
+
+int MetadataConvert::convertLensMetadata(const android::CameraMetadata &settings,
+                                         icamera::Parameters *parameter)
+{
+    uint32_t tag = ANDROID_LENS_FOCAL_LENGTH;
+    camera_metadata_ro_entry entry = settings.find(tag);
+    if (entry.count == 1) {
+        parameter->setFocalLength(entry.data.f[0]);
+    }
+
+    tag = ANDROID_LENS_APERTURE;
+    entry = settings.find(tag);
+    if (entry.count == 1) {
+        parameter->setAperture(entry.data.f[0]);
+    }
+
+    tag = ANDROID_LENS_FOCUS_DISTANCE;
+    entry = settings.find(tag);
+    if (entry.count == 1) {
+        parameter->setFocusDistance(entry.data.f[0]);
+    }
+
+    return icamera::OK;
+}
+
+int MetadataConvert::convertLensParameter(const icamera::Parameters &parameter,
+                                          android::CameraMetadata *settings)
+{
+    icamera::CameraMetadata meta;
+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
+
+    uint32_t tag = CAMERA_LENS_INFO_AVAILABLE_APERTURES;
+    icamera_metadata_entry entry = meta.find(tag);
+    if (entry.count >= 1) {
+        settings->update(ANDROID_LENS_APERTURE, entry.data.f, 1);
+    }
+
+    float focal = 0.0f;
+    parameter.getFocalLength(focal);
+    if (focal < EPSILON) {
+        icamera_metadata_entry entry = meta.find(CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
+        if (entry.count >= 1) {
+            focal = entry.data.f[0];
+        }
+    }
+    settings->update(ANDROID_LENS_FOCAL_LENGTH, &focal, 1);
+
+    float focusDistanceDiopters = 0.0;
+    if (parameter.getFocusDistance(focusDistanceDiopters) == 0) {
+        settings->update(ANDROID_LENS_FOCUS_DISTANCE, &focusDistanceDiopters, 1);
+    }
+
+    icamera::camera_range_t focusRange = {};
+    if (parameter.getFocusRange(focusRange) == 0) {
+        float range[] = {focusRange.min, focusRange.max};
+        settings->update(ANDROID_LENS_FOCUS_RANGE, range, 2);
+    }
+
+    uint8_t mode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF;
+    settings->update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE, &mode, 1);
+    float filterDensity = 0.0;
+    settings->update(ANDROID_LENS_FILTER_DENSITY, &filterDensity, 1);
+
+    return icamera::OK;
+}
+
+int MetadataConvert::convertStatisticsParameter(const icamera::Parameters & /*parameter*/,
+                                                android::CameraMetadata *settings)
+{
+    uint8_t fdValue = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
+    settings->update(ANDROID_STATISTICS_FACE_DETECT_MODE, &fdValue, 1);
+
+    return icamera::OK;
+}
+
+int MetadataConvert::convertFlashParameter(const icamera::Parameters & /*parameter*/,
+                                           android::CameraMetadata *settings)
+{
+    uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
+    settings->update(ANDROID_FLASH_MODE, &flashMode, 1);
+
+    return icamera::OK;
+}
+
+int MetadataConvert::convertAdvancedFeatureMetadata(const android::CameraMetadata &settings,
+                                                    icamera::Parameters *parameter)
+{
+    int ret = icamera::OK;
+    // ANDROID_DEMOSAIC
+    // ANDROID_EDGE
+    // ANDROID_HOT_PIXEL
+    // ANDROID_NOISE_REDUCTION
+
+    // ANDROID_SHADING
+    int mode;
+    camera_metadata_ro_entry entry = settings.find(ANDROID_SHADING_MODE);
+    if (entry.count == 1) {
+        ret = getHalValue(entry.data.u8[0], shadingModeTable,
+                          ARRAY_SIZE(shadingModeTable), &mode);
+        if (ret == icamera::OK) {
+            parameter->setShadingMode((icamera::camera_shading_mode_t)mode);
+        }
+    }
+
+    entry = settings.find(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE);
+    if (entry.count == 1) {
+        ret = getHalValue(entry.data.u8[0], lensShadingMapModeTable,
+                          ARRAY_SIZE(lensShadingMapModeTable), &mode);
+        if (ret == icamera::OK) {
+            parameter->setLensShadingMapMode((icamera::camera_lens_shading_map_mode_type_t)mode);
+        }
+    }
+
+    // ANDROID_TONEMAP
+    // ANDROID_INFO
+    // ANDROID_BLACK_LEVEL
+
+    return icamera::OK;
+}
+
+int MetadataConvert::convertAdvancedFeatureParameter(const icamera::Parameters &parameter,
+                                                     android::CameraMetadata *settings)
+{
+    int ret = icamera::OK;
+    icamera::CameraMetadata meta;
+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
+
+    // ANDROID_DEMOSAIC
+
+    // ANDROID_EDGE
+    uint8_t edgeMode = ANDROID_EDGE_MODE_OFF;
+    settings->update(ANDROID_EDGE_MODE, &edgeMode, 1);
+
+    // ANDROID_HOT_PIXEL
+
+    // ANDROID_NOISE_REDUCTION
+    uint8_t nrMode = ANDROID_NOISE_REDUCTION_MODE_OFF;
+    settings->update(ANDROID_NOISE_REDUCTION_MODE, &nrMode, 1);
+
+    // ANDROID_SHADING
+    icamera::camera_shading_mode_t shadingMode;
+    uint8_t saMode;
+    if (parameter.getShadingMode(shadingMode) == icamera::OK) {
+        ret = getAndroidValue(shadingMode, shadingModeTable,
+                              ARRAY_SIZE(shadingModeTable), &saMode);
+        if (ret == icamera::OK) {
+            settings->update(ANDROID_SHADING_MODE, &saMode, 1);
+        }
+    }
+
+    icamera::camera_lens_shading_map_mode_type_t lensShadingMapMode;
+    uint8_t lesnSMMode;
+    ret = parameter.getLensShadingMapMode(lensShadingMapMode);
+    if (ret == icamera::OK) {
+        ret = getAndroidValue(lensShadingMapMode, shadingModeTable,
+                              ARRAY_SIZE(shadingModeTable), &lesnSMMode);
+        if (ret == icamera::OK) {
+             settings->update(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, &lesnSMMode, 1);
+        }
+    }
+
+    if (lensShadingMapMode == icamera::LENS_SHADING_MAP_MODE_ON) {
+        float lensShadingMap[MAX_LSC_GRID_SIZE * 4];
+        size_t lensShadingMapSize;
+        ret = parameter.getLensShadingMap(lensShadingMap, lensShadingMapSize);
+        if (ret == icamera::OK) {
+            settings->update(ANDROID_STATISTICS_LENS_SHADING_MAP,
+                             lensShadingMap, lensShadingMapSize);
+            if (saMode == ANDROID_SHADING_MODE_OFF) {
+                saMode = ANDROID_SHADING_MODE_FAST;
+                settings->update(ANDROID_SHADING_MODE, &saMode, 1);
+            }
+        }
+    }
+
+    // ANDROID_TONEMAP
+    // ANDROID_INFO
+    // ANDROID_BLACK_LEVEL
+    // ANDROID_SYNC
+
+    return icamera::OK;
+}
+
+void MetadataConvert::fillControlStaticMetadata(const icamera::Parameters &parameter,
+                                                android::CameraMetadata *settings)
+{
+    int ret = icamera::OK;
+    icamera::CameraMetadata meta;
+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
+
+    icamera_metadata_entry entry = meta.find(CAMERA_CONTROL_AVAILABLE_MODES);
+    if (entry.count != 0) {
+        settings->update(ANDROID_CONTROL_AVAILABLE_MODES, entry.data.u8, entry.count);
+    }
+
+    std::vector <icamera::camera_antibanding_mode_t> antibandingModes;
+    parameter.getSupportedAntibandingMode(antibandingModes);
+    if (antibandingModes.size() > 0) {
+        int size = antibandingModes.size();
+        uint8_t data[size];
+        int count = 0;
+        for (int i = 0; i < size; i++) {
+            ret = getAndroidValue(antibandingModes[i], antibandingModesTable, ARRAY_SIZE(antibandingModesTable), &data[count]);
+            if (ret == icamera::OK) {
+                count++;
+            }
+        }
+        if (count > 0) {
+            settings->update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, data, count);
+        }
+    } else {
+        LOGW("No antibanding modes provided!");
+    }
+
+    std::vector <icamera::camera_ae_mode_t> availAeModes;
+    parameter.getSupportedAeMode(availAeModes);
+    if (availAeModes.size() > 0) {
+        int size = availAeModes.size();
+        uint8_t data[size];
+        int count = 0;
+        for (int i = 0; i < size; i++) {
+            ret = getAndroidValue(availAeModes[i], aeModesTable, ARRAY_SIZE(aeModesTable), &data[count]);
+            if (ret == icamera::OK) {
+                count++;
+            }
+        }
+        if (count > 0) {
+            settings->update(ANDROID_CONTROL_AE_AVAILABLE_MODES, data, count);
+        }
+    } else {
+        LOGW("No ae modes provided!");
+    }
+
+    uint8_t aeLockAvailable = parameter.getAeLockAvailable() ? \
+            ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE : ANDROID_CONTROL_AE_LOCK_AVAILABLE_FALSE;
+    settings->update(ANDROID_CONTROL_AE_LOCK_AVAILABLE, &aeLockAvailable, 1);
+
+    icamera::camera_range_array_t fpsRanges;
+    if (parameter.getSupportedFpsRange(fpsRanges) == 0) {
+        int count = fpsRanges.size() * 2;
+        int32_t data[count];
+        for (size_t i = 0; i < fpsRanges.size(); i++) {
+            data[i * 2] = (int32_t)fpsRanges[i].min;
+            data[i * 2 + 1] = (int32_t)fpsRanges[i].max;
+        }
+        settings->update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, data, count);
+    } else {
+        LOGW("No fps ranges provided!");
+    }
+
+    icamera::camera_range_t aeCompensationRange;
+    if (parameter.getAeCompensationRange(aeCompensationRange) == 0) {
+        int32_t data[2];
+        data[0] = (int32_t)aeCompensationRange.min;
+        data[1] = (int32_t)aeCompensationRange.max;
+        settings->update(ANDROID_CONTROL_AE_COMPENSATION_RANGE, data, 2);
+    } else {
+        LOGW("No ae compensation range provided!");
+    }
+
+    icamera::camera_rational_t aeCompensationStep;
+    if (parameter.getAeCompensationStep(aeCompensationStep) == 0) {
+        camera_metadata_rational rational;
+        rational.numerator = aeCompensationStep.numerator;
+        rational.denominator = aeCompensationStep.denominator;
+        settings->update(ANDROID_CONTROL_AE_COMPENSATION_STEP, &rational, 1);
+    } else {
+        LOGW("No ae compensation step provided!");
+    }
+
+    std::vector <icamera::camera_af_mode_t> availAfModes;
+    parameter.getSupportedAfMode(availAfModes);
+    if (availAfModes.size() > 0) {
+        int size = availAfModes.size();
+        uint8_t data[size];
+        int count = 0;
+        for (int i = 0; i < size; i++) {
+            ret = getAndroidValue(availAfModes[i], afModesTable, ARRAY_SIZE(afModesTable), &data[count]);
+            if (ret == icamera::OK) {
+                count++;
+            }
+        }
+        if (count > 0) {
+            settings->update(ANDROID_CONTROL_AF_AVAILABLE_MODES, data, count);
+        }
+    } else {
+        LOGW("No af modes provided!");
+    }
+
+    uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
+    settings->update(ANDROID_CONTROL_AVAILABLE_EFFECTS, &effectMode, 1);
+
+    entry = meta.find(CAMERA_CONTROL_AVAILABLE_SCENE_MODES);
+    if (entry.count != 0) {
+        settings->update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, entry.data.u8, entry.count);
+    } else {
+        LOGW("No available scene modes");
+    }
+
+    icamera::camera_video_stabilization_list_t availDvsModes;
+    parameter.getSupportedVideoStabilizationMode(availDvsModes);
+    if (availDvsModes.size() > 0) {
+        int size = availDvsModes.size();
+        uint8_t data[size];
+        int count = 0;
+        for (int i = 0; i < size; i++) {
+            ret = getAndroidValue(availDvsModes[i], dvsModesTable, ARRAY_SIZE(dvsModesTable), &data[count]);
+            if (ret == icamera::OK) {
+                count++;
+            }
+        }
+        if (count > 0) {
+            settings->update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, data, count);
+        }
+    } else {
+        LOGW("No video stablization modes provided!");
+    }
+
+    std::vector <icamera::camera_awb_mode_t> availAwbModes;
+    parameter.getSupportedAwbMode(availAwbModes);
+    if (availAwbModes.size() > 0) {
+        int size = availAwbModes.size();
+        uint8_t data[size];
+        int count = 0;
+        for (int i = 0; i < size; i++) {
+            ret = getAndroidValue(availAwbModes[i], awbModesTable, ARRAY_SIZE(awbModesTable), &data[count]);
+            if (ret == icamera::OK) {
+                count++;
+            }
+        }
+        if (count > 0) {
+            settings->update(ANDROID_CONTROL_AWB_AVAILABLE_MODES, data, count);
+        }
+    } else {
+        LOGW("No awb modes provided!");
+    }
+
+    uint8_t awbLockAvailable = parameter.getAwbLockAvailable() ? \
+            ANDROID_CONTROL_AWB_LOCK_AVAILABLE_TRUE : ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;
+    settings->update(ANDROID_CONTROL_AWB_LOCK_AVAILABLE, &awbLockAvailable, 1);
+
+    int32_t rawSensitivity = 100;
+    settings->update(ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST, &rawSensitivity, 1);
+
+    int32_t rawSensitivityRange[2] = {100, 100};
+    settings->update(ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE, rawSensitivityRange, 2);
+
+    int maxRegions[3] = {1, 0, 1};
+    settings->update(ANDROID_CONTROL_MAX_REGIONS, maxRegions, 3);
+}
+
+void MetadataConvert::fillScalerStaticMetadata(const icamera::Parameters &parameter,
+                                               android::CameraMetadata *settings)
+{
+// stream configuration: fmt, w, h, type
+#define STREAM_CFG_SIZE 4
+// duration: fmt, w, h, ns
+#define DURATION_SIZE 4
+
+    float maxDigitalZoom = 1.0;
+    settings->update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, &maxDigitalZoom, 1);
+
+    uint8_t type = ANDROID_SCALER_CROPPING_TYPE_CENTER_ONLY;
+    settings->update(ANDROID_SCALER_CROPPING_TYPE, &type, 1);
+
+    icamera::CameraMetadata meta;
+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
+
+    uint32_t tag = CAMERA_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP;
+    icamera_metadata_entry entry = meta.find(tag);
+    if (entry.count > 0) {
+        settings->update(ANDROID_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP,
+                         entry.data.i32, entry.count);
+    }
+
+    tag = CAMERA_REPROCESS_MAX_CAPTURE_STALL;
+    entry = meta.find(tag);
+    if (entry.count > 0) {
+        settings->update(ANDROID_REPROCESS_MAX_CAPTURE_STALL, entry.data.i32, entry.count);
+    }
+
+    icamera::supported_stream_config_array_t configs;
+    parameter.getSupportedStreamConfig(configs);
+    if (configs.size() == 0) {
+        LOGW("No stream configs provided!");
+        return;
+    }
+
+    int rawConfigs = 0;
+    for (auto & cfg : configs) {
+        if (cfg.format == V4L2_PIX_FMT_SGRBG10) {
+            rawConfigs++;
+        }
+    }
+
+    int configNum = configs.size() + rawConfigs;
+    LOG2("%s, configs.size() %u, rawConfigs %d", __func__, configs.size(), rawConfigs);
+    int* cfgData = new int[configNum * 3 * STREAM_CFG_SIZE];
+    int64_t* durationData = new int64_t[configs.size() * 3 * DURATION_SIZE];
+    int64_t* stallDurationData = new int64_t[configs.size() * 3 * DURATION_SIZE];
+    unsigned int cfgCnt = 0;
+    unsigned int durationCnt = 0;
+    unsigned int stallDurationCnt = 0;
+    int cfgType = ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT;
+    int fmt = ANDROID_SCALER_AVAILABLE_FORMATS_YCbCr_420_888;
+
+    for (auto & cfg : configs) {
+        /*
+         * Filter out the items which width is less than height.
+         * These items are for rotation case, user doesn't need to know these.
+         */
+        if (cfg.width < cfg.height) {
+            LOG1("@%s skip cfg %dx%d which is for rotation", __func__, cfg.width, cfg.height);
+            continue;
+        }
+
+        if (cfg.streamType == icamera::CAMERA_STREAM_OUTPUT) {
+            cfgType = ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT;
+
+            // For implementation_defined
+            fmt = ANDROID_SCALER_AVAILABLE_FORMATS_IMPLEMENTATION_DEFINED;
+            cfgData[cfgCnt * STREAM_CFG_SIZE] = fmt;
+            cfgData[cfgCnt * STREAM_CFG_SIZE + 1] = cfg.width;
+            cfgData[cfgCnt * STREAM_CFG_SIZE + 2] = cfg.height;
+            cfgData[cfgCnt * STREAM_CFG_SIZE + 3] = cfgType;
+            cfgCnt++;
+            durationData[durationCnt * DURATION_SIZE] = fmt;
+            durationData[durationCnt * DURATION_SIZE + 1] = cfg.width;
+            durationData[durationCnt * DURATION_SIZE + 2] = cfg.height;
+            durationData[durationCnt * DURATION_SIZE + 3] = NSEC_PER_SEC/cfg.maxVideoFps;
+            durationCnt++;
+
+            // For ycbcr_420_888
+            fmt = ANDROID_SCALER_AVAILABLE_FORMATS_YCbCr_420_888;
+            cfgData[cfgCnt * STREAM_CFG_SIZE] = fmt;
+            cfgData[cfgCnt * STREAM_CFG_SIZE + 1] = cfg.width;
+            cfgData[cfgCnt * STREAM_CFG_SIZE + 2] = cfg.height;
+            cfgData[cfgCnt * STREAM_CFG_SIZE + 3] = cfgType;
+            cfgCnt++;
+            durationData[durationCnt * DURATION_SIZE] = fmt;
+            durationData[durationCnt * DURATION_SIZE + 1] = cfg.width;
+            durationData[durationCnt * DURATION_SIZE + 2] = cfg.height;
+            durationData[durationCnt * DURATION_SIZE + 3] = NSEC_PER_SEC/cfg.maxVideoFps;
+            durationCnt++;
+
+            // For blob
+            fmt = ANDROID_SCALER_AVAILABLE_FORMATS_BLOB;
+            cfgData[cfgCnt * STREAM_CFG_SIZE] = fmt;
+            cfgData[cfgCnt * STREAM_CFG_SIZE + 1] = cfg.width;
+            cfgData[cfgCnt * STREAM_CFG_SIZE + 2] = cfg.height;
+            cfgData[cfgCnt * STREAM_CFG_SIZE + 3] = cfgType;
+            cfgCnt++;
+            durationData[durationCnt * DURATION_SIZE] = fmt;
+            durationData[durationCnt * DURATION_SIZE + 1] = cfg.width;
+            durationData[durationCnt * DURATION_SIZE + 2] = cfg.height;
+            durationData[durationCnt * DURATION_SIZE + 3] = NSEC_PER_SEC/cfg.maxVideoFps;
+            durationCnt++;
+            stallDurationData[stallDurationCnt * DURATION_SIZE] = fmt;
+            stallDurationData[stallDurationCnt * DURATION_SIZE + 1] = cfg.width;
+            stallDurationData[stallDurationCnt * DURATION_SIZE + 2] = cfg.height;
+            stallDurationData[stallDurationCnt * DURATION_SIZE + 3] = NSEC_PER_SEC/cfg.maxCaptureFps;
+            stallDurationCnt++;
+        } else if (cfg.streamType == icamera::CAMERA_STREAM_INPUT) {
+            cfgType = ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT;
+            if (cfg.format == V4L2_PIX_FMT_NV12) {
+                fmt = ANDROID_SCALER_AVAILABLE_FORMATS_YCbCr_420_888;
+                cfgData[cfgCnt * STREAM_CFG_SIZE] = fmt;
+                cfgData[cfgCnt * STREAM_CFG_SIZE + 1] = cfg.width;
+                cfgData[cfgCnt * STREAM_CFG_SIZE + 2] = cfg.height;
+                cfgData[cfgCnt * STREAM_CFG_SIZE + 3] = cfgType;
+                cfgCnt++;
+            }
+        } else if (cfg.streamType == icamera::CAMERA_STREAM_BIDIRECTIONAL) {
+            if (cfg.format == V4L2_PIX_FMT_SGRBG10) {
+                cfgType = ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT;
+                fmt = ANDROID_SCALER_AVAILABLE_FORMATS_RAW_OPAQUE;
+                cfgData[cfgCnt * STREAM_CFG_SIZE] = fmt;
+                cfgData[cfgCnt * STREAM_CFG_SIZE + 1] = cfg.width;
+                cfgData[cfgCnt * STREAM_CFG_SIZE + 2] = cfg.height;
+                cfgData[cfgCnt * STREAM_CFG_SIZE + 3] = cfgType;
+                cfgCnt++;
+                cfgType = ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT;
+                cfgData[cfgCnt * STREAM_CFG_SIZE] = fmt;
+                cfgData[cfgCnt * STREAM_CFG_SIZE + 1] = cfg.width;
+                cfgData[cfgCnt * STREAM_CFG_SIZE + 2] = cfg.height;
+                cfgData[cfgCnt * STREAM_CFG_SIZE + 3] = cfgType;
+                cfgCnt++;
+                durationData[durationCnt * DURATION_SIZE] = fmt;
+                durationData[durationCnt * DURATION_SIZE + 1] = cfg.width;
+                durationData[durationCnt * DURATION_SIZE + 2] = cfg.height;
+                durationData[durationCnt * DURATION_SIZE + 3] = NSEC_PER_SEC/cfg.maxVideoFps;
+                durationCnt++;
+            }
+        }
+    }
+    settings->update(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
+                     cfgData, cfgCnt * STREAM_CFG_SIZE);
+    settings->update(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
+                     durationData, durationCnt * DURATION_SIZE);
+    settings->update(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS,
+                     stallDurationData, stallDurationCnt * DURATION_SIZE);
+
+    delete []cfgData;
+    delete []durationData;
+    delete []stallDurationData;
+}
+
+void MetadataConvert::fillTonemapStaticMetadata(const icamera::Parameters &parameter,
+                                                android::CameraMetadata *settings) {
+    int ret = icamera::OK;
+
+    int32_t maxPoint = 0;
+    if (parameter.getTonemapMaxCurvePoints(maxPoint) == 0) {
+        settings->update(ANDROID_TONEMAP_MAX_CURVE_POINTS, &maxPoint, 1);
+    }
+
+    std::vector <icamera::camera_tonemap_mode_t> tonemapModes;
+    parameter.getSupportedTonemapMode(tonemapModes);
+    if (tonemapModes.size() > 0) {
+        int size = tonemapModes.size();
+        uint8_t data[size];
+        int count = 0;
+        for (int i = 0; i < size; i++) {
+            ret = getAndroidValue(tonemapModes[i], tonemapModesTable, ARRAY_SIZE(tonemapModesTable), &data[count]);
+            if (ret == icamera::OK) {
+                count++;
+            }
+        }
+        if (count > 0) {
+            settings->update(ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES, data, count);
+        }
+    }
+}
+
+void MetadataConvert::fillSensorStaticMetadata(const icamera::Parameters &parameter,
+                                               android::CameraMetadata *settings)
+{
+    icamera::camera_range_t timeRange;
+    // Fill it if it is supported
+    if (parameter.getSupportedSensorExposureTimeRange(timeRange) == 0) {
+        int64_t range[2];
+        range[0] = timeRange.min * 1000LLU; // us -> ns
+        range[1] = timeRange.max * 1000LLU; // us -> ns
+        settings->update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, range, 2);
+        settings->update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, &(range[1]), 1);
+    } else {
+        LOGW("No SensorExposureTimeRange provided!");
+    }
+
+    icamera::camera_range_t sensitivityRange;
+    if (parameter.getSupportedSensorSensitivityRange(sensitivityRange) == 0) {
+        int32_t range[2];
+        range[0] = (int32_t)sensitivityRange.min;
+        range[1] = (int32_t)sensitivityRange.max;
+        settings->update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE, range, 2);
+    } else {
+        LOGW("No SensorSensitivityRange provided!");
+    }
+
+    icamera::CameraMetadata meta;
+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
+
+    uint32_t tag = CAMERA_SENSOR_INFO_ACTIVE_ARRAY_SIZE;
+    icamera_metadata_entry entry = meta.find(tag);
+    // Check if the count is correct
+    if (entry.count == 4) {
+        settings->update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, entry.data.i32, entry.count);
+    }
+
+    tag = CAMERA_SENSOR_OPAQUE_RAW_SIZE;
+    entry = meta.find(tag);
+    if (entry.count > 0) {
+        settings->update(ANDROID_SENSOR_OPAQUE_RAW_SIZE, entry.data.i32, entry.count);
+    }
+
+    tag = CAMERA_SENSOR_INFO_PIXEL_ARRAY_SIZE;
+    entry = meta.find(tag);
+    if (entry.count == 2) {
+        settings->update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, entry.data.i32, entry.count);
+    }
+
+    tag = CAMERA_SENSOR_INFO_PHYSICAL_SIZE;
+    entry = meta.find(tag);
+    if (entry.count == 2) {
+        settings->update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, entry.data.f, entry.count);
+    }
+
+    tag = CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT;
+    entry = meta.find(tag);
+    if (entry.count == 1) {
+        settings->update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, entry.data.u8, entry.count);
+    }
+
+    tag = CAMERA_SENSOR_AVAILABLE_TEST_PATTERN_MODES;
+    entry = meta.find(tag);
+    if (entry.count != 0) {
+        settings->update(ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES, entry.data.i32, entry.count);
+    }
+
+    int32_t whiteLevel = 0;
+    settings->update(ANDROID_SENSOR_INFO_WHITE_LEVEL, &whiteLevel, 1);
+
+    int32_t blackLevelPattern[4] = {0, 0, 0, 0};
+    settings->update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, blackLevelPattern, 4);
+
+    uint8_t timestampSource = ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN;
+    settings->update(ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE, &timestampSource, 1);
+
+    camera_metadata_rational_t baseGainFactor = {0, 1};
+    settings->update(ANDROID_SENSOR_BASE_GAIN_FACTOR, &baseGainFactor, 1);
+
+    int32_t maxAnalogSensitivity = 0;
+    settings->update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY, &maxAnalogSensitivity, 1);
+
+    int32_t orientation = 0;
+    tag = CAMERA_SENSOR_ORIENTATION;
+    entry = meta.find(tag);
+    if (entry.count == 1) {
+        orientation = entry.data.u8[0];
+    }
+    settings->update(ANDROID_SENSOR_ORIENTATION, &orientation, 1);
+
+    int32_t profileHueSatMapDimensions[3] = {0, 0, 0};
+    settings->update(ANDROID_SENSOR_PROFILE_HUE_SAT_MAP_DIMENSIONS, profileHueSatMapDimensions, 3);
+}
+
+void MetadataConvert::fillLensStaticMetadata(const icamera::Parameters &parameter,
+                                             android::CameraMetadata *settings)
+{
+    icamera::CameraMetadata meta;
+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
+
+    uint32_t tag = CAMERA_LENS_INFO_AVAILABLE_APERTURES;
+    icamera_metadata_entry entry = meta.find(tag);
+    if (entry.count >= 1) {
+        settings->update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, entry.data.f, entry.count);
+    }
+
+    tag = CAMERA_LENS_INFO_AVAILABLE_FILTER_DENSITIES;
+    entry = meta.find(tag);
+    if (entry.count >= 1) {
+        settings->update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, entry.data.f, entry.count);
+    }
+
+    tag = CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS;
+    entry = meta.find(tag);
+    if (entry.count >= 1) {
+        settings->update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, entry.data.f, entry.count);
+    }
+
+    tag = CAMERA_LENS_INFO_HYPERFOCAL_DISTANCE;
+    entry = meta.find(tag);
+    if (entry.count == 1) {
+        settings->update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, entry.data.f, entry.count);
+    }
+
+    tag = CAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE;
+    entry = meta.find(tag);
+    if (entry.count == 1) {
+        settings->update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, entry.data.f, entry.count);
+    }
+
+    tag = CAMERA_LENS_INFO_SHADING_MAP_SIZE;
+    entry = meta.find(tag);
+    if (entry.count >= 1) {
+        settings->update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, entry.data.i32, entry.count);
+    }
+
+    tag = CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION;
+    entry = meta.find(tag);
+    if (entry.count == 1) {
+        settings->update(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, entry.data.u8, entry.count);
+    }
+
+    tag = CAMERA_LENS_FACING;
+    entry = meta.find(tag);
+    uint8_t lensFacing = ANDROID_LENS_FACING_BACK;
+    if (entry.count == 1) {
+        lensFacing = entry.data.u8[0];
+    }
+    settings->update(ANDROID_LENS_FACING, &lensFacing, 1);
+
+    uint8_t availableOpticalStabilization = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF;
+    settings->update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, &availableOpticalStabilization, 1);
+}
+
+void MetadataConvert::fillRequestStaticMetadata(const icamera::Parameters &parameter,
+                                                android::CameraMetadata *settings)
+{
+    icamera::CameraMetadata meta;
+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
+
+    uint32_t tag = CAMERA_REQUEST_MAX_NUM_OUTPUT_STREAMS;
+    icamera_metadata_entry entry = meta.find(tag);
+    if (entry.count >= 1) {
+        settings->update(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS, entry.data.i32, entry.count);
+    }
+
+    tag = CAMERA_REQUEST_PIPELINE_MAX_DEPTH;
+    entry = meta.find(tag);
+    if (entry.count == 1) {
+        settings->update(ANDROID_REQUEST_PIPELINE_MAX_DEPTH, entry.data.u8, entry.count);
+    }
+
+    tag = CAMERA_REQUEST_AVAILABLE_CAPABILITIES;
+    entry = meta.find(tag);
+    if (entry.count >= 1) {
+        settings->update(ANDROID_REQUEST_AVAILABLE_CAPABILITIES, entry.data.u8, entry.count);
+    }
+
+    tag = CAMERA_REQUEST_MAX_NUM_INPUT_STREAMS;
+    entry = meta.find(tag);
+    if (entry.count >= 1) {
+        settings->update(ANDROID_REQUEST_MAX_NUM_INPUT_STREAMS, entry.data.i32, entry.count);
+    }
+
+    int32_t partialResultCount = 1;
+    settings->update(ANDROID_REQUEST_PARTIAL_RESULT_COUNT, &partialResultCount, 1);
+
+    int32_t requestKeysBasic[] = {
+        ANDROID_CONTROL_AE_LOCK,
+        ANDROID_CONTROL_AWB_LOCK,
+        ANDROID_BLACK_LEVEL_LOCK,
+        ANDROID_LENS_APERTURE,
+        ANDROID_LENS_FOCAL_LENGTH,
+        ANDROID_LENS_FOCUS_DISTANCE,
+        ANDROID_LENS_FILTER_DENSITY,
+        ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
+        ANDROID_SENSOR_FRAME_DURATION,
+        ANDROID_CONTROL_CAPTURE_INTENT,
+        ANDROID_REQUEST_ID,
+        ANDROID_REQUEST_TYPE,
+        ANDROID_TONEMAP_MODE,
+        ANDROID_TONEMAP_PRESET_CURVE,
+        ANDROID_TONEMAP_GAMMA
+    };
+    size_t requestKeysCnt =
+            sizeof(requestKeysBasic)/sizeof(requestKeysBasic[0]);
+    settings->update(ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS, requestKeysBasic, requestKeysCnt);
+
+    int32_t resultKeysBasic[] = {
+        ANDROID_REQUEST_ID,
+        ANDROID_REQUEST_TYPE,
+        ANDROID_BLACK_LEVEL_LOCK,
+        ANDROID_LENS_APERTURE,
+        ANDROID_LENS_FOCAL_LENGTH,
+        ANDROID_LENS_FOCUS_DISTANCE,
+        ANDROID_LENS_FILTER_DENSITY,
+        ANDROID_LENS_FOCUS_RANGE,
+        ANDROID_LENS_STATE,
+        ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
+        ANDROID_TONEMAP_CURVE_RED,
+        ANDROID_TONEMAP_CURVE_BLUE,
+        ANDROID_TONEMAP_CURVE_GREEN
+    };
+    size_t resultKeysCnt =
+            sizeof(resultKeysBasic)/sizeof(resultKeysBasic[0]);
+    settings->update(ANDROID_REQUEST_AVAILABLE_RESULT_KEYS,
+            resultKeysBasic, resultKeysCnt);
+
+    int32_t characteristicsKeysBasic[] = {
+        ANDROID_SENSOR_ORIENTATION,
+        ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
+        ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,
+        ANDROID_REQUEST_MAX_NUM_INPUT_STREAMS,
+        ANDROID_REQUEST_PIPELINE_MAX_DEPTH, ANDROID_REQUEST_AVAILABLE_CAPABILITIES,
+        ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS, ANDROID_REQUEST_AVAILABLE_RESULT_KEYS,
+        ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS,
+        ANDROID_CONTROL_AE_LOCK_AVAILABLE,
+        ANDROID_CONTROL_AWB_LOCK_AVAILABLE,
+        ANDROID_SENSOR_FRAME_DURATION,
+        ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,
+        ANDROID_TONEMAP_MAX_CURVE_POINTS,
+        ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES
+     };
+    settings->update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS,
+                      characteristicsKeysBasic,
+                      sizeof(characteristicsKeysBasic)/sizeof(int32_t));
+}
+
+void MetadataConvert::fillStatisticsStaticMetadata(const icamera::Parameters &parameter,
+                                                   android::CameraMetadata *settings)
+{
+    icamera::CameraMetadata meta;
+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
+
+    icamera_metadata_entry entry;
+    entry = meta.find(CAMERA_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES);
+    if (entry.count != 0) {
+        settings->update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, entry.data.u8, entry.count);
+    } else {
+        uint8_t availFaceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
+        settings->update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, &availFaceDetectMode, 1);
+    }
+
+    entry = meta.find(CAMERA_STATISTICS_INFO_MAX_FACE_COUNT);
+    if (entry.count != 0) {
+        settings->update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, entry.data.i32, entry.count);
+    } else {
+        int32_t maxFaceCount = 0;
+        settings->update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, &maxFaceCount, 1);
+    }
+
+    int32_t histogramBucketCount = 0;
+    settings->update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, &histogramBucketCount, 1);
+
+    int32_t maxHistogramCount = 0;
+    settings->update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, &maxHistogramCount, 1);
+
+    int32_t maxSharpnessMapValue = 0;
+    settings->update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, &maxSharpnessMapValue, 1);
+
+    int32_t sharpnessMapSize[2] = {0, 0};
+    settings->update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, sharpnessMapSize, 2);
+
+    uint8_t availableHotPixelMapModes = ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE_OFF;
+    settings->update(ANDROID_STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES, &availableHotPixelMapModes, 1);
+
+    uint8_t availableLensShadingMapModes = ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF;
+    settings->update(ANDROID_STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES, &availableLensShadingMapModes, 1);
+}
+
+void MetadataConvert::fillJpegStaticMetadata(const icamera::Parameters &parameter,
+                                             android::CameraMetadata *settings)
+{
+    icamera::CameraMetadata meta;
+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
+
+    uint32_t tag = CAMERA_JPEG_MAX_SIZE;
+    icamera_metadata_entry entry = meta.find(tag);
+    if (entry.count == 1) {
+        settings->update(ANDROID_JPEG_MAX_SIZE, entry.data.i32, entry.count);
+    }
+
+    tag = CAMERA_JPEG_AVAILABLE_THUMBNAIL_SIZES;
+    entry = meta.find(tag);
+    if (entry.count >= 2) {
+        settings->update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, entry.data.i32, entry.count);
+    }
+}
+
+void MetadataConvert::fillAdvancedFeatureStaticMetadata(const icamera::Parameters &parameter,
+                                                        android::CameraMetadata *settings)
+{
+    icamera::CameraMetadata meta;
+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
+
+    // ANDROID_DEMOSAIC
+
+    // ANDROID_EDGE
+    uint32_t tag = CAMERA_EDGE_AVAILABLE_EDGE_MODES;
+    icamera_metadata_entry entry = meta.find(tag);
+    if (entry.count >= 1) {
+        settings->update(ANDROID_EDGE_AVAILABLE_EDGE_MODES, entry.data.u8, entry.count);
+    }
+
+    // ANDROID_HOT_PIXEL
+    tag = CAMERA_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES;
+    entry = meta.find(tag);
+    if (entry.count >= 1) {
+        settings->update(ANDROID_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES, entry.data.u8, entry.count);
+    }
+
+    // ANDROID_NOISE_REDUCTION
+    tag = CAMERA_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES;
+    entry = meta.find(tag);
+    if (entry.count >= 1) {
+        settings->update(ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES, entry.data.u8, entry.count);
+    }
+
+    // ANDROID_SHADING
+
+    // ANDROID_TONEMAP
+    tag = CAMERA_TONEMAP_MAX_CURVE_POINTS;
+    entry = meta.find(tag);
+    if (entry.count == 1) {
+        settings->update(ANDROID_TONEMAP_MAX_CURVE_POINTS, entry.data.i32, entry.count);
+    }
+
+    tag = CAMERA_TONEMAP_AVAILABLE_TONE_MAP_MODES;
+    entry = meta.find(tag);
+    if (entry.count >= 1) {
+        settings->update(ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES, entry.data.u8, entry.count);
+    }
+
+    // ANDROID_INFO
+    tag = CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL;
+    entry = meta.find(tag);
+    if (entry.count == 1) {
+        settings->update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, entry.data.u8, entry.count);
+    }
+
+    // ANDROID_BLACK_LEVEL
+
+    // ANDROID_SYNC
+    tag = CAMERA_SYNC_MAX_LATENCY;
+    entry = meta.find(tag);
+    if (entry.count == 1) {
+        settings->update(ANDROID_SYNC_MAX_LATENCY, entry.data.i32, entry.count);
+    }
+}
+
+int MetadataConvert::convertToHalWindow(const int32_t* data, int dataCount,
+                                        icamera::camera_window_list_t* windows)
+{
+    windows->clear();
+    CheckError((!data), icamera::BAD_VALUE, "null data to convert hal window!");
+    CheckError((dataCount % 5 != 0), icamera::BAD_VALUE, "wrong data count %d!", dataCount);
+
+    icamera::camera_window_t window;
+    for (int i = 0; i < dataCount / 5; i+=5) {
+        window.left   = data[i];
+        window.top    = data[i + 1];
+        window.right  = data[i + 2];
+        window.bottom = data[i + 3];
+        window.weight = data[i + 4];
+        windows->push_back(window);
+    }
+    return icamera::OK;
+}
+
+int MetadataConvert::convertToMetadataRegion(const icamera::camera_window_list_t& windows,
+                                                 int dataCount, int32_t* data)
+{
+    size_t num = windows.size();
+    CheckError((!data), 0, "null data to convert Metadata region!");
+    CheckError(((unsigned int)dataCount < num * 5), 0, "small dataCount!");
+
+    for (size_t i = 0; i < windows.size(); i++) {
+        data[i * 5]     = windows[i].left;
+        data[i * 5 + 1] = windows[i].top;
+        data[i * 5 + 2] = windows[i].right;
+        data[i * 5 + 3] = windows[i].bottom;
+        data[i * 5 + 4] = windows[i].weight;
+    }
+
+    return num * 5;
+}
+
+void MetadataConvert::dumpMetadata(const camera_metadata_t *meta)
+{
+    if (!meta || !icamera::Log::isDebugLevelEnable(icamera::CAMERA_DEBUG_LOG_LEVEL2)) {
+        return;
+    }
+
+    LOG2("%s", __func__);
+    int entryCount = get_camera_metadata_entry_count(meta);
+
+    for (int i = 0; i < entryCount; i++) {
+        camera_metadata_entry_t entry;
+        if (get_camera_metadata_entry((camera_metadata_t *)meta, i, &entry)) {
+            continue;
+        }
+
+        // Print tag & type
+        const char *tagName, *tagSection;
+        tagSection = get_camera_metadata_section_name(entry.tag);
+        if (tagSection == nullptr) {
+            tagSection = "unknownSection";
+        }
+        tagName = get_camera_metadata_tag_name(entry.tag);
+        if (tagName == nullptr) {
+            tagName = "unknownTag";
+        }
+        const char *typeName;
+        if (entry.type >= NUM_TYPES) {
+            typeName = "unknown";
+        } else {
+            typeName = camera_metadata_type_names[entry.type];
+        }
+        LOG2("(%d)%s.%s (%05x): %s[%zu], type: %d",
+             i,
+             tagSection,
+             tagName,
+             entry.tag,
+             typeName,
+             entry.count,
+             entry.type);
+
+        // Print data
+        size_t j;
+        const uint8_t *u8;
+        const int32_t *i32;
+        const float   *f;
+        const int64_t *i64;
+        const double  *d;
+        const camera_metadata_rational_t *r;
+        std::ostringstream stringStream;
+        stringStream << "[";
+
+        switch (entry.type) {
+        case TYPE_BYTE:
+            u8 = entry.data.u8;
+            for (j = 0; j < entry.count; j++)
+                stringStream << (int32_t)u8[j] << " ";
+            break;
+        case TYPE_INT32:
+            i32 = entry.data.i32;
+            for (j = 0; j < entry.count; j++)
+                stringStream << " " << i32[j] << " ";
+            break;
+        case TYPE_FLOAT:
+            f = entry.data.f;
+            for (j = 0; j < entry.count; j++)
+                stringStream << " " << f[j] << " ";
+            break;
+        case TYPE_INT64:
+            i64 = entry.data.i64;
+            for (j = 0; j < entry.count; j++)
+                stringStream << " " << i64[j] << " ";
+            break;
+        case TYPE_DOUBLE:
+            d = entry.data.d;
+            for (j = 0; j < entry.count; j++)
+                stringStream << " " << d[j] << " ";
+            break;
+        case TYPE_RATIONAL:
+            r = entry.data.r;
+            for (j = 0; j < entry.count; j++)
+                stringStream << " (" << r[j].numerator << ", " << r[j].denominator << ") ";
+            break;
+        }
+        stringStream << "]";
+        std::string str = stringStream.str();
+        LOG2("%s", str.c_str());
+    }
+}
+
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/MetadataConvert.h b/camera/hal/intel/ipu6/aal/MetadataConvert.h
new file mode 100644
index 000000000000..d6d652c6f92a
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/MetadataConvert.h
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <hardware/camera3.h>
+#include "HALv3Header.h"
+
+#include "Parameters.h"
+#include "FaceDetection.h"
+
+namespace camera3 {
+
+/**
+ * \class MetadataConvert
+ *
+ * This class is used to convert application metadata to HAL metadata.
+ *
+ */
+class MetadataConvert {
+
+public:
+    MetadataConvert(int cameraId);
+    virtual ~MetadataConvert();
+
+    static int constructDefaultMetadata(android::CameraMetadata *settings);
+    static int updateDefaultRequestSettings(int type, android::CameraMetadata *settings);
+
+    static int requestMetadataToHALMetadata(const android::CameraMetadata &settings,
+                                            icamera::Parameters *parameter);
+    static int HALMetadataToRequestMetadata(const icamera::Parameters &parameter,
+                                            android::CameraMetadata *settings);
+    static int HALCapabilityToStaticMetadata(const icamera::Parameters &parameter,
+                                             android::CameraMetadata *settings);
+    static void dumpMetadata(const camera_metadata_t *meta);
+    static void convertFaceDetectionMetadata(
+                                    const icamera::CVFaceDetectionAbstractResult &fdResult,
+                                    android::CameraMetadata *settings);
+private:
+    DISALLOW_COPY_AND_ASSIGN(MetadataConvert);
+
+    // Parameters -> Android dynamic metadata
+    static int convertColorCorrectionParameter(const icamera::Parameters &parameter,
+                                               android::CameraMetadata *settings);
+    static int convertControlParameter(const icamera::Parameters &parameter,
+                                       android::CameraMetadata *settings);
+    static int convertSensorParameter(const icamera::Parameters &parameter,
+                                      android::CameraMetadata *settings);
+    static int convertLensParameter(const icamera::Parameters &parameter,
+                                      android::CameraMetadata *settings);
+    static int convertStatisticsParameter(const icamera::Parameters & /*parameter*/,
+                                          android::CameraMetadata *settings);
+    static int convertTonemapParameter(const icamera::Parameters &parameter,
+                                       android::CameraMetadata *settings);
+    static int convertFlashParameter(const icamera::Parameters & /*parameter*/,
+                                     android::CameraMetadata *settings);
+    static int convertAdvancedFeatureMetadata(const android::CameraMetadata &settings,
+                                              icamera::Parameters *parameter);
+    static int convertAdvancedFeatureParameter(const icamera::Parameters &parameter,
+                                               android::CameraMetadata *settings);
+
+    // Android control metadata -> parameters
+    static int convertColorCorrectionMetadata(const android::CameraMetadata &settings,
+                                              icamera::Parameters *parameter);
+    static int convertControlMetadata(const android::CameraMetadata &settings,
+                                      icamera::Parameters *parameter);
+    static int convertTonemapMetadata(const android::CameraMetadata &settings,
+                                      icamera::Parameters *parameter);
+    static int convertJpegMetadata(const android::CameraMetadata &settings,
+                                   icamera::Parameters *parameter);
+    static int convertSensorMetadata(const android::CameraMetadata &settings,
+                                     icamera::Parameters *parameter);
+    static int convertLensMetadata(const android::CameraMetadata &settings,
+                                   icamera::Parameters *parameter);
+
+    // Capabilities -> Android static metadata
+    static void fillControlStaticMetadata(const icamera::Parameters &parameter,
+                                          android::CameraMetadata *settings);
+    static void fillScalerStaticMetadata(const icamera::Parameters &parameter,
+                                         android::CameraMetadata *settings);
+    static void fillSensorStaticMetadata(const icamera::Parameters &parameter,
+                                         android::CameraMetadata *settings);
+    static void fillLensStaticMetadata(const icamera::Parameters &parameter,
+                                       android::CameraMetadata *settings);
+    static void fillRequestStaticMetadata(const icamera::Parameters &parameter,
+                                          android::CameraMetadata *settings);
+    static void fillStatisticsStaticMetadata(const icamera::Parameters &parameter,
+                                             android::CameraMetadata *settings);
+    static void fillTonemapStaticMetadata(const icamera::Parameters &parameter,
+                                          android::CameraMetadata *settings);
+    static void fillJpegStaticMetadata(const icamera::Parameters &parameter,
+                                       android::CameraMetadata *settings);
+    static void fillAdvancedFeatureStaticMetadata(const icamera::Parameters &parameter,
+                                                  android::CameraMetadata *settings);
+
+    static int convertToHalWindow(const int32_t* data, int dataCount,
+                                  icamera::camera_window_list_t* windows);
+    static int convertToMetadataRegion(const icamera::camera_window_list_t& windows,
+                                       int dataCount, int32_t* data);
+
+private:
+    int mCameraId;
+};
+
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/PostProcessor.cpp b/camera/hal/intel/ipu6/aal/PostProcessor.cpp
new file mode 100644
index 000000000000..7a33a7ac0434
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/PostProcessor.cpp
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "PostProcessor"
+
+#include "HALv3Utils.h"
+#include "PostProcessor.h"
+
+namespace camera3 {
+
+PostProcessor::PostProcessor(int cameraId, const camera3_stream_t &stream) :
+    mCameraId(cameraId),
+    mPostProcessType(icamera::POST_PROCESS_NONE),
+    mPostProcessorCore(std::unique_ptr<icamera::PostProcessorCore>(new icamera::PostProcessorCore(cameraId)))
+{
+    LOG1("@%s", __func__);
+}
+
+PostProcessor::~PostProcessor()
+{
+    LOG1("@%s", __func__);
+}
+
+icamera::status_t
+PostProcessor::configure(const camera3_stream_t &stream, const camera3_stream_t &srcStream)
+{
+    LOG1("@%s, stream: w:%d, h:%d, f:%d", __func__, stream.width, stream.height, stream.format);
+    LOG1("@%s, srcStream: w:%d, h:%d, f:%d", __func__, srcStream.width, srcStream.height, srcStream.format);
+
+    icamera::stream_t halStream;
+    int ret = camera3::HalV3Utils::fillHALStreams(mCameraId, srcStream, &halStream);
+    LOG1("@%s, halStream: w:%d, h:%d, f:%d, size:%d, stride:%d, ret:%d", __func__,
+         halStream.width, halStream.height, halStream.format, halStream.size, halStream.stride, ret);
+    CheckError(ret != icamera::OK, ret, "fillHALStreams fails, ret %d", ret);
+
+    return configure(stream, halStream);
+}
+
+/* configure
+ *
+ * Decide post-processing is needed based on user stream and hal stream.
+ * The default processing order is rotate -> crop -> scale -> convert -> encode.
+ */
+icamera::status_t
+PostProcessor::configure(const camera3_stream_t &stream, const icamera::stream_t &halStream)
+{
+    LOG1("@%s, stream: w:%d, h:%d, f:%d", __func__, stream.width, stream.height, stream.format);
+    LOG1("@%s, halStream: w:%d, h:%d, f:%d, size:%d, stride:%d", __func__,
+         halStream.width, halStream.height, halStream.format, halStream.size, halStream.stride);
+
+    icamera::PostProcessInfo info;
+    mPostProcessType = icamera::POST_PROCESS_NONE;
+    std::vector<icamera::PostProcessInfo> processingOrder;
+    int angle = HalV3Utils::getRotationDegrees(stream);
+
+    /* Fill the input/output information for the post processing unit.
+     * The input info of the current processing unit is the output info of last unit
+     */
+    icamera::stream_t inputStreamInfo = halStream;
+    if (angle > 0 && mPostProcessorCore->isPostProcessTypeSupported(icamera::POST_PROCESS_ROTATE)) {
+        mPostProcessType |= icamera::POST_PROCESS_ROTATE;
+        info.angle = angle;
+        info.type = icamera::POST_PROCESS_ROTATE;
+        info.inputInfo = inputStreamInfo;
+        info.outputInfo = inputStreamInfo;
+        info.outputInfo.width = inputStreamInfo.height;
+        info.outputInfo.height = inputStreamInfo.width;
+        info.outputInfo.stride = inputStreamInfo.height;
+        info.outputInfo.format = inputStreamInfo.format;
+        info.outputInfo.size = icamera::CameraUtils::getFrameSize(info.outputInfo.format,
+                                                                  info.outputInfo.width,
+                                                                  info.outputInfo.height);
+        LOG2("%s, Rotate: input %dx%d, output: %dx%d, angle: %d", __func__, inputStreamInfo.width,
+             inputStreamInfo.height, info.outputInfo.width, info.outputInfo.height, angle);
+
+        inputStreamInfo = info.outputInfo;
+        processingOrder.push_back(info);
+    }
+
+    // Crop
+    if (inputStreamInfo.width * stream.height != inputStreamInfo.height * stream.width
+        && mPostProcessorCore->isPostProcessTypeSupported(icamera::POST_PROCESS_CROP)) {
+        mPostProcessType |= icamera::POST_PROCESS_CROP;
+        info.type = icamera::POST_PROCESS_CROP;
+        info.inputInfo = inputStreamInfo;
+
+        // Caclulate the best crop size with same aspect ratio
+        if (inputStreamInfo.width * stream.height < inputStreamInfo.height * stream.width) {
+            info.outputInfo.width = info.inputInfo.width;
+            info.outputInfo.height = ALIGN(info.inputInfo.width * stream.height / stream.width, 2);
+        } else {
+            info.outputInfo.width = ALIGN(info.inputInfo.height * stream.width / stream.height, 2);
+            info.outputInfo.height = info.inputInfo.height;
+        }
+        info.outputInfo.format = inputStreamInfo.format;
+        info.outputInfo.stride = info.outputInfo.width;
+        info.outputInfo.size = icamera::CameraUtils::getFrameSize(info.outputInfo.format,
+                                                                  info.outputInfo.width,
+                                                                  info.outputInfo.height);
+        LOG2("%s, Crop: input %dx%d, output: %dx%d", __func__, inputStreamInfo.width,
+             inputStreamInfo.height, info.outputInfo.width, info.outputInfo.height);
+
+        inputStreamInfo = info.outputInfo;
+        processingOrder.push_back(info);
+    }
+
+    // Scale
+    if ((uint32_t)inputStreamInfo.width * inputStreamInfo.height != stream.width * stream.height
+        && mPostProcessorCore->isPostProcessTypeSupported(icamera::POST_PROCESS_SCALING)) {
+        mPostProcessType |= icamera::POST_PROCESS_SCALING;
+        info.type = icamera::POST_PROCESS_SCALING;
+        info.inputInfo = inputStreamInfo;
+        info.outputInfo.width = stream.width;
+        info.outputInfo.height = stream.height;
+        info.outputInfo.stride = stream.width;
+        info.outputInfo.format = inputStreamInfo.format;
+        info.outputInfo.size = icamera::CameraUtils::getFrameSize(info.outputInfo.format,
+                                                                  info.outputInfo.width,
+                                                                  info.outputInfo.height);
+        LOG2("%s, Scale: input %dx%d, output: %dx%d", __func__, inputStreamInfo.width,
+             inputStreamInfo.height, info.outputInfo.width, info.outputInfo.height);
+
+        inputStreamInfo = info.outputInfo;
+        processingOrder.push_back(info);
+    }
+
+    // Convert
+    if (inputStreamInfo.format != HalV3Utils::HALFormatToV4l2Format(mCameraId, stream.format)
+        && mPostProcessorCore->isPostProcessTypeSupported(icamera::POST_PROCESS_CONVERT)) {
+        mPostProcessType |= icamera::POST_PROCESS_CONVERT;
+        info.type = icamera::POST_PROCESS_CONVERT;
+        info.inputInfo = inputStreamInfo;
+        info.outputInfo.width = stream.width;
+        info.outputInfo.height = stream.height;
+        info.outputInfo.stride = stream.width;
+        info.outputInfo.format = HalV3Utils::HALFormatToV4l2Format(mCameraId, stream.format);
+        info.outputInfo.size = icamera::CameraUtils::getFrameSize(info.outputInfo.format,
+                                                                  info.outputInfo.width,
+                                                                  info.outputInfo.height);
+        LOG2("%s, Convert: input %dx%d, output: %dx%d", __func__, inputStreamInfo.width,
+             inputStreamInfo.height, info.outputInfo.width, info.outputInfo.height);
+
+        inputStreamInfo = info.outputInfo;
+        processingOrder.push_back(info);
+    }
+
+    // Encode
+    if (stream.format == HAL_PIXEL_FORMAT_BLOB &&
+        mPostProcessorCore->isPostProcessTypeSupported(icamera::POST_PROCESS_JPEG_ENCODING)) {
+        mPostProcessType |= icamera::POST_PROCESS_JPEG_ENCODING;
+        info.type = icamera::POST_PROCESS_JPEG_ENCODING;
+        info.inputInfo = inputStreamInfo;
+        info.outputInfo.width = stream.width;
+        info.outputInfo.height = stream.height;
+        info.outputInfo.stride = stream.width;
+        info.outputInfo.format = HalV3Utils::HALFormatToV4l2Format(mCameraId, stream.format);
+        info.outputInfo.size = icamera::CameraUtils::getFrameSize(info.outputInfo.format,
+                                                                  info.outputInfo.width,
+                                                                  info.outputInfo.height);
+        inputStreamInfo = info.outputInfo;
+        processingOrder.push_back(info);
+    }
+
+    if ((uint32_t)inputStreamInfo.width != stream.width ||
+        (uint32_t)inputStreamInfo.height != stream.height ||
+        inputStreamInfo.format != HalV3Utils::HALFormatToV4l2Format(mCameraId, stream.format)) {
+        LOGE("%s, output stream doesn't match with the requirement after post-processing", __func__);
+        return icamera::UNKNOWN_ERROR;
+    }
+    LOG1("@%s, camera id %d, mPostProcessType %d, processing unit number: %zu",
+         __func__, mCameraId, mPostProcessType, processingOrder.size());
+    mPostProcessorCore->configure(processingOrder);
+
+    return icamera::OK;
+}
+
+icamera::status_t PostProcessor::doPostProcessing(const std::shared_ptr<Camera3Buffer> &inBuf,
+                                                  const icamera::Parameters &parameter,
+                                                  std::shared_ptr<Camera3Buffer> &outBuf)
+{
+    return mPostProcessorCore->doPostProcessing(inBuf, parameter, outBuf);
+}
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/PostProcessor.h b/camera/hal/intel/ipu6/aal/PostProcessor.h
new file mode 100644
index 000000000000..a79f59c42d4f
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/PostProcessor.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <hardware/camera3.h>
+#include <memory>
+#include "ICamera.h"
+#include "Utils.h"
+#include "Errors.h"
+#include "PostProcessorCore.h"
+#include "Camera3Buffer.h"
+
+namespace camera3 {
+/**
+ * \class PostProcessor
+ *
+ * A wrapper based on PostProcessorCore for handling post-processing sequence, there are two main purposes of this class.
+ * 1. Provide the wrapper to implement post-processing feature.
+ * 2. Parsing the processing type and formulate the processing sequence
+ */
+class PostProcessor {
+
+public:
+    PostProcessor(int cameraId, const camera3_stream_t &stream);
+    virtual ~PostProcessor();
+
+    // the srcStream will convert to type icamera::stream_t and call the other configure() function
+    icamera::status_t configure(const camera3_stream_t &stream, const camera3_stream_t &srcStream);
+    icamera::status_t configure(const camera3_stream_t &stream, const icamera::stream_t &halStream);
+    int getPostProcessType() { return mPostProcessType; }
+    icamera::status_t doPostProcessing(const std::shared_ptr<Camera3Buffer> &inBuf,
+                                       const icamera::Parameters &parameter,
+                                       std::shared_ptr<Camera3Buffer> &outBuf);
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(PostProcessor);
+
+private:
+    int mCameraId;
+    int mPostProcessType;
+    std::unique_ptr<icamera::PostProcessorCore> mPostProcessorCore;
+};
+
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/RequestManager.cpp b/camera/hal/intel/ipu6/aal/RequestManager.cpp
new file mode 100644
index 000000000000..23d4c593bbea
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/RequestManager.cpp
@@ -0,0 +1,561 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "RequestManager"
+
+#include <math.h>
+#include <cstdlib>
+#include <hardware/gralloc.h>
+
+#include <linux/videodev2.h>
+
+#include "ICamera.h"
+#include "Parameters.h"
+#include "Utils.h"
+#include "Errors.h"
+
+#include "HALv3Utils.h"
+#include "MetadataConvert.h"
+#include "RequestManager.h"
+#include "PlatformData.h"
+
+namespace camera3 {
+RequestManager::RequestManager(int cameraId) :
+    mCameraId(cameraId),
+    mCallbackOps(nullptr),
+    mCameraDeviceStarted(false),
+    mResultProcessor(nullptr),
+    mRequestInProgress(0)
+{
+    LOG1("@%s", __func__);
+
+    CLEAR(mCameraBufferInfo);
+}
+
+RequestManager::~RequestManager()
+{
+    LOG1("@%s", __func__);
+
+    deleteStreams(false);
+
+    delete mResultProcessor;
+}
+
+int RequestManager::init(const camera3_callback_ops_t *callback_ops)
+{
+    LOG1("@%s", __func__);
+
+    // Update the default settings from camera HAL
+    icamera::Parameters parameter;
+    int ret = icamera::camera_get_parameters(mCameraId, parameter);
+    CheckError(ret != icamera::OK, ret, "failed to get parameters, ret %d", ret);
+
+    android::CameraMetadata defaultRequestSettings;
+    // Get static metadata
+    MetadataConvert::HALCapabilityToStaticMetadata(parameter, &defaultRequestSettings);
+
+    // Get defalut settings
+    MetadataConvert::constructDefaultMetadata(&defaultRequestSettings);
+    MetadataConvert::HALMetadataToRequestMetadata(parameter, &defaultRequestSettings);
+
+    mDefaultRequestSettings[CAMERA3_TEMPLATE_PREVIEW] = defaultRequestSettings;
+    MetadataConvert::updateDefaultRequestSettings(CAMERA3_TEMPLATE_PREVIEW,
+            &mDefaultRequestSettings[CAMERA3_TEMPLATE_PREVIEW]);
+
+    mResultProcessor = new ResultProcessor(mCameraId, callback_ops, this);
+    mCallbackOps = callback_ops;
+
+    // Register callback to icamera HAL
+    icamera::camera_callback_ops_t::notify = RequestManager::callbackNotify;
+    icamera::camera_callback_register(mCameraId,
+                                      static_cast<icamera::camera_callback_ops_t*>(this));
+
+    return icamera::OK;
+}
+
+int RequestManager::deinit()
+{
+    LOG1("@%s", __func__);
+
+    if (mCameraDeviceStarted) {
+        int ret = icamera::camera_device_stop(mCameraId);
+        CheckError(ret != icamera::OK, ret, "failed to stop camera device, ret %d", ret);
+        mCameraDeviceStarted = false;
+    }
+
+    mRequestInProgress = 0;
+    return icamera::OK;
+}
+
+void RequestManager::callbackNotify(const icamera::camera_callback_ops *cb,
+                                    const icamera::camera_msg_data_t &data) {
+    LOG2("@%s, type %d", __func__, data.type);
+    RequestManager *callback = const_cast<RequestManager*>(static_cast<const RequestManager*>(cb));
+
+    callback->mResultProcessor->callbackNotify(data);
+    callback->handleCallbackEvent(data);
+}
+
+void RequestManager::handleCallbackEvent(const icamera::camera_msg_data_t &data) {
+    LOG2("@%s, cameraId: %d", __func__, mCameraId);
+
+    if (!icamera::PlatformData::swProcessingAlignWithIsp(mCameraId))
+        return;
+
+    for (auto &stream : mCamera3StreamVector) {
+        if (stream->getPostProcessType() != icamera::POST_PROCESS_NONE) {
+            stream->sendEvent(data);
+        }
+    }
+}
+
+int RequestManager::configureStreams(camera3_stream_configuration_t *stream_list)
+{
+    LOG1("@%s", __func__);
+
+    int ret = checkStreamRotation(stream_list);
+
+    CheckError(ret != icamera::OK, icamera::BAD_VALUE, "Unsupport rotation degree!");
+
+    if (mCameraDeviceStarted) {
+        ret = icamera::camera_device_stop(mCameraId);
+        CheckError(ret != icamera::OK, ret, "failed to stop camera device, ret %d", ret);
+        mCameraDeviceStarted = false;
+    }
+
+    uint32_t streamsNum = stream_list->num_streams;
+    uint32_t operationMode = stream_list->operation_mode;
+    LOG1("@%s, streamsNum:%d, operationMode:%d", __func__, streamsNum, operationMode);
+    CheckError((operationMode != CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE &&
+          operationMode != CAMERA3_STREAM_CONFIGURATION_CONSTRAINED_HIGH_SPEED_MODE),
+          icamera::BAD_VALUE, "Unknown operation mode %d!", operationMode);
+
+    int inputStreamNum = 0;
+    int outStreamNum = 0;
+    camera3_stream_t *stream = nullptr;
+    for (uint32_t i = 0; i < streamsNum; i++) {
+        stream = stream_list->streams[i];
+        LOG1("@%s, Config stream (%s):%dx%d, fmt:%d, usage:%d, max buffers:%d, priv:%p", __func__,
+             HalV3Utils::getCamera3StreamType(stream->stream_type),
+             stream->width, stream->height, stream->format,
+             stream->usage, stream->max_buffers, stream->priv);
+        if (stream->stream_type == CAMERA3_STREAM_OUTPUT) {
+            outStreamNum++;
+        } else if (stream->stream_type == CAMERA3_STREAM_INPUT) {
+            inputStreamNum++;
+        } else if (stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
+            inputStreamNum++;
+            outStreamNum++;
+        } else {
+            LOGE("@%s, Unknown stream type %d!", __func__, stream->stream_type);
+            return icamera::BAD_VALUE;
+        }
+        CheckError(inputStreamNum > 1, icamera::BAD_VALUE, "Too many input streams : %d !", inputStreamNum);
+    }
+    CheckError(outStreamNum == 0, icamera::BAD_VALUE, "No output streams!");
+
+    /*
+     * Configure stream
+     */
+    int hwStreamNum = 0;
+    camera3_stream_t *inputStream = nullptr;
+    // Enable video pipe if yuv stream exists (for 3A stats data)
+    bool needAssignPreviewStream = true;
+    icamera::stream_t* yuvStream = nullptr;
+    for (uint32_t i = 0; i < streamsNum; i++) {
+        if (stream_list->streams[i]->stream_type == CAMERA3_STREAM_INPUT) {
+            if (stream_list->streams[i]->format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
+                inputStream = stream_list->streams[i];
+                LOG1("@%s, input stream: w:%d, h:%d, f:%d", __func__,
+                     inputStream->width, inputStream->height, inputStream->format);
+            }
+            stream_list->streams[i]->max_buffers = 1;
+            continue;
+        }
+
+        ret = HalV3Utils::fillHALStreams(mCameraId, *stream_list->streams[i], &mHALStream[hwStreamNum]);
+        CheckError(ret != icamera::OK, ret, "failed to fill mHALStream[%d], ret:%d", ret, i);
+
+        if (!yuvStream && (stream_list->streams[i]->format != HAL_PIXEL_FORMAT_BLOB &&
+            mHALStream[hwStreamNum].usage != icamera::CAMERA_STREAM_OPAQUE_RAW)) {
+            yuvStream = &mHALStream[hwStreamNum];
+        }
+        if (mHALStream[hwStreamNum].usage == icamera::CAMERA_STREAM_PREVIEW
+            || mHALStream[hwStreamNum].usage == icamera::CAMERA_STREAM_VIDEO_CAPTURE)
+            needAssignPreviewStream = false;
+
+        hwStreamNum++;
+    }
+    if (needAssignPreviewStream && yuvStream) {
+        yuvStream->usage = icamera::CAMERA_STREAM_PREVIEW;
+    }
+
+    icamera::stream_config_t streamCfg = {
+        hwStreamNum,
+        mHALStream,
+        icamera::camera_stream_configuration_mode_t::CAMERA_STREAM_CONFIGURATION_MODE_AUTO
+    };
+
+    for (int i = 0; i < hwStreamNum; i++) {
+        const icamera::stream_t& s = mHALStream[i];
+        LOG1("@%s, mHALStream[%d]: w:%d, h:%d, f:%d, u:%d", __func__, i, s.width, s.height,
+             s.format, s.usage);
+    }
+
+    // Mark all streams as NOT active
+    for (auto &stream : mCamera3StreamVector) {
+        stream->setActive(false);
+    }
+
+    int enableFDStreamNum = -1;
+    Camera3Stream *faceDetectionOwner = nullptr;
+    //Mark one camera3Stream run face detection
+    if (icamera::PlatformData::isFaceAeEnabled(mCameraId)) {
+        LOG1("Face detection is enable");
+        chooseStreamForFaceDetection(streamsNum, stream_list->streams, &enableFDStreamNum);
+    }
+
+    ret = icamera::camera_device_config_streams(mCameraId, &streamCfg);
+    CheckError(ret != icamera::OK, ret, "failed to configure stream, ret %d", ret);
+
+    // Create Stream for new streams
+    hwStreamNum = 0;
+    for (uint32_t i = 0; i < streamsNum; i++) {
+        camera3_stream_t *stream = stream_list->streams[i];
+        if (stream->stream_type == CAMERA3_STREAM_INPUT) {
+            continue;
+        }
+
+        if (stream->priv == nullptr) {
+            Camera3Stream *s = new Camera3Stream(mCameraId,
+                                                 mResultProcessor,
+                                                 mHALStream[hwStreamNum].max_buffers,
+                                                 mHALStream[hwStreamNum],
+                                                 *stream,
+                                                 inputStream);
+            s->setActive(true);
+            stream->priv = s;
+            stream->max_buffers = mHALStream[hwStreamNum].max_buffers;
+            stream->usage |= GRALLOC_USAGE_HW_CAMERA_WRITE | GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_NEVER;
+            if (mHALStream[hwStreamNum].usage == icamera::CAMERA_STREAM_OPAQUE_RAW) {
+                stream->usage |= GRALLOC_USAGE_HW_CAMERA_ZSL;
+            }
+            mCamera3StreamVector.push_back(s);
+        } else {
+            static_cast<Camera3Stream*> (stream->priv)->setActive(true);
+        }
+        hwStreamNum++;
+        LOGI("OUTPUT max buffer %d, usage %x, format %x", stream->max_buffers, stream->usage, stream->format);
+
+        if (enableFDStreamNum == i) {
+            faceDetectionOwner = static_cast<Camera3Stream*> (stream->priv);
+        }
+    }
+
+    // Remove useless Camera3Stream
+    deleteStreams(true);
+
+    if (faceDetectionOwner != nullptr) {
+        faceDetectionOwner->activateFaceDetection(MAX_FACES_DETECTABLE);
+    }
+
+    return icamera::OK;
+}
+
+void RequestManager::chooseStreamForFaceDetection(uint32_t streamsNum, camera3_stream_t **streams, int *enableFDStreamNum)
+{
+    LOG1("@%s", __func__);
+    camera3_stream_t *preStream = nullptr;
+    camera3_stream_t *yuvStream = nullptr;
+    int maxWidth = MAX_FACE_FRAME_WIDTH;
+    int maxHeight = MAX_FACE_FRAME_HEIGHT;
+    int preStreamNum = -1;
+    int yuvStreamNum = -1;
+
+    for (uint32_t i = 0; i < streamsNum; i++) {
+        camera3_stream_t *s = streams[i];
+        if (!s || s->stream_type != CAMERA3_STREAM_OUTPUT || s->width > maxWidth || s->height > maxHeight) {
+            continue;
+        }
+
+        LOG1("stream information:format=%d, width=%d, height=%d", s->format, s->width, s->height);
+        // We assume HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED stream is the
+        // preview stream and it's requested in every capture request.
+        // If there are two HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED streams,
+        // We pick the smaller stream due to performance concern.
+        if (s->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
+            if (preStream && preStream->width * preStream->height <= s->width * s->height) {
+                continue;
+            }
+            preStream = s;
+            preStreamNum = i;
+        }
+
+        if (s->format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
+            if (yuvStream && yuvStream->width * yuvStream->height <= s->width * s->height) {
+                continue;
+            }
+            yuvStream = s;
+            yuvStreamNum = i;
+        }
+    }
+
+    *enableFDStreamNum = -1;
+    if (preStreamNum >= 0) {
+        *enableFDStreamNum = preStreamNum;
+    } else if (yuvStreamNum >= 0) {
+        *enableFDStreamNum = yuvStreamNum;
+    }
+    LOG1("enableFDStreamNum %d", *enableFDStreamNum);
+}
+
+int RequestManager::constructDefaultRequestSettings(int type, const camera_metadata_t **meta)
+{
+    LOG1("@%s, type %d", __func__, type);
+
+    if (mDefaultRequestSettings.count(type) == 0) {
+        mDefaultRequestSettings[type] = mDefaultRequestSettings[CAMERA3_TEMPLATE_PREVIEW];
+        MetadataConvert::updateDefaultRequestSettings(type, &mDefaultRequestSettings[type]);
+    }
+    const camera_metadata_t *setting = mDefaultRequestSettings[type].getAndLock();
+    *meta = setting;
+    mDefaultRequestSettings[type].unlock(setting);
+
+    return icamera::OK;
+}
+
+int RequestManager::processCaptureRequest(camera3_capture_request_t *request)
+{
+    CheckError(!request, icamera::UNKNOWN_ERROR, "@%s, request is nullptr", __func__);
+    LOG1("@%s, frame_number:%d, input_buffer:%d, num_output_buffers:%d", __func__,
+         request->frame_number, request->input_buffer ? 1 : 0, request->num_output_buffers);
+
+    // Valid buffer and request
+    CheckError(request->num_output_buffers > kMaxStreamNum, icamera::BAD_VALUE,
+          "@%s, num_output_buffers:%d", __func__, request->num_output_buffers);
+
+    int ret = icamera::OK;
+
+    waitProcessRequest();
+
+    int index = -1;
+    for (int i = 0; i < kMaxProcessRequestNum; i++) {
+        if (!mCameraBufferInfo[i].frameInProcessing) {
+            index = i;
+        }
+    }
+    CheckError(index < 0, icamera::UNKNOWN_ERROR, "no empty CameraBufferInfo!");
+    CLEAR(mCameraBufferInfo[index]);
+
+    std::shared_ptr<Camera3Buffer> inputCam3Buf = nullptr;
+    icamera::sensor_raw_info_t opaqueRawInfo = { -1, 0 };
+    if (request->input_buffer) {
+        inputCam3Buf = std::make_shared<Camera3Buffer>();
+        icamera::status_t status = inputCam3Buf->init(request->input_buffer, mCameraId);
+        CheckError(status != icamera::OK, icamera::BAD_VALUE, "Failed to init CameraBuffer");
+        status = inputCam3Buf->waitOnAcquireFence();
+        CheckError(status != icamera::OK, icamera::BAD_VALUE, "Failed to sync CameraBuffer");
+        status = inputCam3Buf->lock();
+        CheckError(status != icamera::OK, icamera::BAD_VALUE, "Failed to lock buffer");
+
+        if (request->input_buffer->stream->format == HAL_PIXEL_FORMAT_RAW_OPAQUE) {
+            MEMCPY_S(&opaqueRawInfo, sizeof(opaqueRawInfo), inputCam3Buf->data(),
+                     inputCam3Buf->size());
+            LOG2("%s, sequence id %ld, timestamp %ld", __func__, opaqueRawInfo.sequence,
+                  opaqueRawInfo.timestamp);
+        }
+    }
+
+    icamera::Parameters param;
+    param.setMakernoteMode(icamera::MAKERNOTE_MODE_OFF);
+    if (request->settings) {
+        MetadataConvert::dumpMetadata(request->settings);
+        mLastSettings = request->settings;
+    } else if (mLastSettings.isEmpty()) {
+        LOGE("nullptr settings for the first reqeust!");
+        return icamera::BAD_VALUE;
+    }
+
+    icamera::camera_buffer_t *buffer[kMaxStreamNum] = {nullptr};
+    int numBuffers = request->num_output_buffers;
+    bool forceUpdate = false;
+    for (uint32_t i = 0; i < request->num_output_buffers; i++) {
+        camera3_stream_t *aStream = request->output_buffers[i].stream; // app stream
+        Camera3Stream    *lStream = static_cast<Camera3Stream*> (aStream->priv); // local stream
+        if (aStream->format == HAL_PIXEL_FORMAT_BLOB ||
+            aStream->format == HAL_PIXEL_FORMAT_RAW_OPAQUE) {
+            param.setMakernoteMode(icamera::MAKERNOTE_MODE_JPEG);
+            forceUpdate = true;
+        }
+        ret = lStream->processRequest(opaqueRawInfo.sequence >= 0 ? nullptr : inputCam3Buf,
+                                      request->output_buffers[i],
+                                      &mCameraBufferInfo[index].halBuffer[i]);
+        CheckError(ret != icamera::OK, ret, "Failed to process request, ret:%d", ret);
+
+        mCameraBufferInfo[index].halBuffer[i].sequence = opaqueRawInfo.sequence;
+        mCameraBufferInfo[index].halBuffer[i].timestamp = opaqueRawInfo.timestamp;
+        buffer[i] = &mCameraBufferInfo[index].halBuffer[i];
+    }
+
+    if (request->settings) {
+        // Convert metadata to Parameters
+        MetadataConvert::requestMetadataToHALMetadata(mLastSettings, &param);
+    }
+
+    if (!inputCam3Buf || opaqueRawInfo.sequence >= 0) {
+        ret = icamera::camera_stream_qbuf(mCameraId, buffer, numBuffers,
+                                          request->settings || forceUpdate ? &param : nullptr);
+        CheckError(ret != icamera::OK, ret, "@%s, camera_stream_qbuf fails,ret:%d", __func__, ret);
+    }
+
+    increaseRequestCount();
+
+    if (!mCameraDeviceStarted) {
+        ret = icamera::camera_device_start(mCameraId);
+        CheckError(ret != icamera::OK, ret, "failed to start device, ret %d", ret);
+
+        mCameraDeviceStarted = true;
+    }
+
+    for (uint32_t i = 0; i < request->num_output_buffers; i++) {
+        Camera3Stream* s = static_cast<Camera3Stream*>(request->output_buffers[i].stream->priv);
+        s->queueBufferDone(request->frame_number,
+                           opaqueRawInfo.sequence >= 0 ? nullptr : inputCam3Buf,
+                           request->output_buffers[i],
+                           param);
+    }
+    mCameraBufferInfo[index].frameInProcessing = true;
+    mCameraBufferInfo[index].frameNumber = request->frame_number;
+
+    mResultProcessor->registerRequest(request, inputCam3Buf);
+
+    return ret;
+}
+
+void RequestManager::dump(int fd)
+{
+    LOG1("@%s", __func__);
+}
+
+int RequestManager::flush()
+{
+    LOG1("@%s", __func__);
+
+    icamera::nsecs_t startTime = icamera::CameraUtils::systemTime();
+    icamera::nsecs_t interval = 0;
+    const icamera::nsecs_t ONE_SECOND = 1000000000;
+
+    // wait 1000ms at most while there are requests in the HAL
+    while (mRequestInProgress > 0 && interval <= ONE_SECOND) {
+        usleep(10000); //wait 10ms
+        interval = icamera::CameraUtils::systemTime() - startTime;
+    }
+
+    LOG2("@%s, line:%d, mRequestInProgress:%d, time spend:%ld us",
+          __func__, __LINE__, mRequestInProgress, interval / 1000);
+
+    // based on API, -ENODEV (NO_INIT) error should be returned.
+    CheckError(interval > ONE_SECOND, icamera::NO_INIT,
+          "flush() > 1s, timeout:%ld us", interval/1000);
+
+    return icamera::OK;
+}
+
+void RequestManager::deleteStreams(bool inactiveOnly)
+{
+    LOG1("@%s", __func__);
+
+    unsigned int i = 0;
+    while (i < mCamera3StreamVector.size()) {
+        Camera3Stream *s = mCamera3StreamVector.at(i);
+
+        if (!inactiveOnly || !s->isActive()) {
+            mCamera3StreamVector.erase(mCamera3StreamVector.begin() + i);
+            delete s;
+        } else {
+            ++i;
+        }
+    }
+}
+
+int RequestManager::waitProcessRequest()
+{
+    LOG1("@%s", __func__);
+
+    std::unique_lock<std::mutex> lock(mRequestLock);
+    // check if it is ready to process next request
+    while (mRequestInProgress >= mHALStream[0].max_buffers) {
+        std::cv_status ret = mRequestCondition.wait_for(
+                lock,
+                std::chrono::nanoseconds(kMaxDuration * SLOWLY_MULTIPLIER));
+        if (ret == std::cv_status::timeout) {
+            LOGW("%s, wait to process request time out", __func__);
+        }
+    }
+
+    return icamera::OK;
+}
+
+void RequestManager::increaseRequestCount()
+{
+    LOG1("@%s", __func__);
+
+    std::lock_guard<std::mutex> l(mRequestLock);
+    ++mRequestInProgress;
+}
+
+void RequestManager::returnRequestDone(uint32_t frameNumber)
+{
+    LOG1("@%s", __func__);
+
+    std::lock_guard<std::mutex> l(mRequestLock);
+
+    // Update mCameraBufferInfo based on frameNumber
+    for (int i = 0; i < kMaxProcessRequestNum; i++) {
+        if (mCameraBufferInfo[i].frameNumber == frameNumber) {
+            mCameraBufferInfo[i].frameInProcessing = false;
+        }
+    }
+    mRequestInProgress--;
+    mRequestCondition.notify_one();
+}
+
+int RequestManager::checkStreamRotation(camera3_stream_configuration_t *stream_list)
+{
+    int rotationDegree0 = -1, countOutputStream = 0;
+
+    for (size_t i = 0; i < stream_list->num_streams; i++) {
+        if (stream_list->streams[i]->stream_type != CAMERA3_STREAM_OUTPUT) {
+            continue;
+        }
+        countOutputStream++;
+
+        int rotationDegree = HalV3Utils::getRotationDegrees(*(stream_list->streams[i]));
+        CheckError(rotationDegree < 0, icamera::BAD_VALUE, "Unsupport rotation degree!");
+
+        if (countOutputStream == 1) {
+            rotationDegree0 = rotationDegree;
+        } else {
+            CheckError(rotationDegree0 != rotationDegree, icamera::BAD_VALUE,
+                   "rotationDegree0:%d, stream[%lu] rotationDegree:%d, not the same",
+                   rotationDegree0, i, rotationDegree);
+        }
+    }
+
+    return icamera::OK;
+}
+
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/RequestManager.h b/camera/hal/intel/ipu6/aal/RequestManager.h
new file mode 100644
index 000000000000..e479b529453f
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/RequestManager.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <vector>
+#include <mutex>
+
+#include <hardware/camera3.h>
+
+#include "HALv3Header.h"
+#include "HALv3Interface.h"
+#include "ResultProcessor.h"
+#include "Camera3Stream.h"
+
+namespace camera3 {
+
+struct Camera3Request {
+    uint32_t frameNumber;
+    android::CameraMetadata settings;
+};
+
+/**
+ * \class RequestManager
+ *
+ * This class is used to handle requests. It has the following
+ * roles:
+ * - It instantiates ResultProcessor.
+ */
+class RequestManager : public RequestManagerCallback, public icamera::camera_callback_ops_t {
+
+public:
+    RequestManager(int cameraId);
+    virtual ~RequestManager();
+
+    int init(const camera3_callback_ops_t *callback_ops);
+
+    int deinit();
+
+    int configureStreams(camera3_stream_configuration_t *stream_list);
+
+    int constructDefaultRequestSettings(int type, const camera_metadata_t **meta);
+
+    int processCaptureRequest(camera3_capture_request_t *request);
+
+    void dump(int fd);
+
+    int flush();
+
+    void returnRequestDone(uint32_t frameNumber);
+private:
+    void deleteStreams(bool inactiveOnly);
+    void increaseRequestCount();
+    int waitProcessRequest();
+    void chooseStreamForFaceDetection(uint32_t streamsNum, camera3_stream_t **streams, int *enableFDStreamNum);
+    int checkStreamRotation(camera3_stream_configuration_t *stream_list);
+
+    static void callbackNotify(const icamera::camera_callback_ops *cb,
+                               const icamera::camera_msg_data_t &data);
+    void handleCallbackEvent(const icamera::camera_msg_data_t &data);
+
+private:
+    static const int kMaxStreamNum = 4; // PREVIEW, VIDEO, STILL and POSTVIEW
+    const uint64_t kMaxDuration = 2000000000; // 2000ms
+
+    static const int kMaxProcessRequestNum = 10;
+    struct CameraBufferInfo {
+        icamera::camera_buffer_t halBuffer[kMaxStreamNum];
+        uint32_t frameNumber;
+        bool frameInProcessing;
+    };
+    struct CameraBufferInfo mCameraBufferInfo[kMaxProcessRequestNum];
+
+    int mCameraId;
+    const camera3_callback_ops_t *mCallbackOps;
+    bool mCameraDeviceStarted;
+    ResultProcessor *mResultProcessor;
+
+    std::map<int, android::CameraMetadata> mDefaultRequestSettings;
+    icamera::stream_t mHALStream[kMaxStreamNum]; // not include CAMERA3_STREAM_INPUT stream
+    std::vector<Camera3Stream*> mCamera3StreamVector;
+
+    std::condition_variable mRequestCondition;
+    // mRequestLock is used to protect mRequestInProgress
+    std::mutex mRequestLock;
+    uint32_t mRequestInProgress;
+    android::CameraMetadata mLastSettings;
+};
+
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/ResultProcessor.cpp b/camera/hal/intel/ipu6/aal/ResultProcessor.cpp
new file mode 100644
index 000000000000..aa349c5e80a2
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/ResultProcessor.cpp
@@ -0,0 +1,462 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "ResultProcessor"
+
+#include <mutex>
+
+#include "Errors.h"
+#include "Utils.h"
+
+#include "HALv3Utils.h"
+#include "MetadataConvert.h"
+#include "ResultProcessor.h"
+#include "PlatformData.h"
+
+namespace camera3 {
+
+#define META_ENTRY_COUNT 256
+#define META_DATA_COUNT  80000
+#define FPS_FRAME_COUNT  60  // the frame interval to print fps
+
+MetadataMemory::MetadataMemory() :
+    mMeta(META_ENTRY_COUNT, META_DATA_COUNT),
+    mMemory(nullptr)
+{
+}
+
+MetadataMemory::~MetadataMemory()
+{
+    // Return memory to metadata
+    getMetadata();
+}
+
+android::CameraMetadata* MetadataMemory::getMetadata()
+{
+    if (mMemory) {
+        mMeta.acquire(mMemory);
+        mMemory = nullptr;
+    }
+    return &mMeta;
+}
+
+camera_metadata_t* MetadataMemory::getMemory()
+{
+    if (!mMemory) {
+        mMemory = mMeta.release();
+    }
+    return mMemory;
+}
+
+void MetadataMemory::copyMetadata(const camera_metadata_t* src)
+{
+    getMemory();
+    // Clear old metadata
+    mMemory = place_camera_metadata(mMemory,
+                                    get_camera_metadata_size(mMemory),
+                                    get_camera_metadata_entry_capacity(mMemory),
+                                    get_camera_metadata_data_capacity(mMemory));
+    getMetadata();
+    mMeta.append(src);
+}
+
+ResultProcessor::ResultProcessor(int cameraId, const camera3_callback_ops_t *callback,
+                                 RequestManagerCallback *requestManagerCallback) :
+    mCameraId(cameraId),
+    mCallbackOps(callback),
+    mLastSettings(nullptr),
+    mRequestManagerCallback(requestManagerCallback)
+{
+    UNUSED(mCameraId);
+    LOG1("@%s, mCameraId %d", __func__, mCameraId);
+
+    mLastSettings = acquireMetadataMemory();
+
+    mResultThread = std::unique_ptr<ResultThread>(new ResultThread(this));
+
+    mCamera3AMetadata = new Camera3AMetadata(mCameraId);
+    gettimeofday(&mRequestTime, nullptr);
+    CLEAR(mLastParams);
+}
+
+ResultProcessor::~ResultProcessor()
+{
+    LOG1("@%s", __func__);
+
+    for (auto &item : mRequestStateVector) {
+        releaseMetadataMemory(item.metaResult);
+    }
+    mRequestStateVector.clear();
+
+    releaseMetadataMemory(mLastSettings);
+    while (mMetadataVector.size() > 0) {
+        LOG1("%s: release meta %p", __func__, mMetadataVector.back());
+        delete mMetadataVector.back();
+        mMetadataVector.pop_back();
+    }
+
+    delete mCamera3AMetadata;
+
+    mInputCam3Bufs.clear();
+}
+
+void ResultProcessor::callbackNotify(const icamera::camera_msg_data_t &data)
+{
+    LOG2("@%s, type %d", __func__, data.type);
+
+    mResultThread->sendEvent(data);
+}
+
+int ResultProcessor::registerRequest(const camera3_capture_request_t *request,
+                                     std::shared_ptr<Camera3Buffer> inputCam3Buf)
+{
+    LOG1("@%s frame_number:%u, inputCam3Buf:%p", __func__, request->frame_number, inputCam3Buf.get());
+
+    RequestState req;
+    req.frameNumber = request->frame_number;
+    req.buffersToReturn = request->num_output_buffers;
+    req.partialResultCount = 1;
+
+    std::lock_guard<std::mutex> l(mLock);
+    // Copy settings
+    if (request->settings) {
+        mLastSettings->copyMetadata(request->settings);
+    }
+
+    req.metaResult = acquireMetadataMemory();
+    req.metaResult->copyMetadata(mLastSettings->getMemory());
+
+    mRequestStateVector.push_back(req);
+
+    if (inputCam3Buf) {
+        mInputCam3Bufs[req.frameNumber] = inputCam3Buf;
+    }
+
+    return icamera::OK;
+}
+
+int ResultProcessor::shutterDone(const ShutterEvent &event)
+{
+    bool inputBuffer = false;
+    std::lock_guard<std::mutex> l(mLock);
+    for (uint32_t i = 0; i < mRequestStateVector.size(); i++) {
+        if (mInputCam3Bufs.find(event.frameNumber) != mInputCam3Bufs.end()) {
+            if (mRequestStateVector.at(i).frameNumber != event.frameNumber) {
+                continue;
+            } else {
+                inputBuffer = true;
+            }
+        } else if (mRequestStateVector.at(i).isShutterDone) {
+            continue;
+        }
+
+        camera3_notify_msg_t notifyMsg;
+        notifyMsg.type = CAMERA3_MSG_SHUTTER;
+        notifyMsg.message.shutter.frame_number = mRequestStateVector.at(i).frameNumber;
+        notifyMsg.message.shutter.timestamp = event.timestamp;
+
+        MetadataMemory *metaResult = mRequestStateVector[i].metaResult;
+        android::CameraMetadata *meta = metaResult->getMetadata();
+        if (!inputBuffer) {
+            meta->update(ANDROID_SENSOR_TIMESTAMP,
+                     reinterpret_cast<const int64_t*>(&event.timestamp), 1);
+        } else {
+            // update shutter timestamp if there is input stream
+            camera_metadata_entry entry = meta->find(ANDROID_SENSOR_TIMESTAMP);
+            if (entry.count == 1) {
+                notifyMsg.message.shutter.timestamp = entry.data.i64[0];
+            }
+        }
+
+        mCallbackOps->notify(mCallbackOps, &notifyMsg);
+        mRequestStateVector.at(i).isShutterDone = true;
+        LOG2("@%s, frame_number:%u, shutter timestamp:%lld", __func__,
+             notifyMsg.message.shutter.frame_number, notifyMsg.message.shutter.timestamp);
+        if (checkRequestDone(mRequestStateVector.at(i))) {
+            returnRequestDone(notifyMsg.message.shutter.frame_number);
+            releaseMetadataMemory(mRequestStateVector.at(i).metaResult);
+            mRequestStateVector.erase(mRequestStateVector.begin() + i);
+        }
+        return icamera::OK;
+    }
+
+    LOGW("@%s frame_number:%u wasn't found!", __func__, event.frameNumber);
+    return icamera::OK;
+}
+
+int ResultProcessor::bufferDone(const BufferEvent &event)
+{
+    camera3_capture_result_t result;
+    CLEAR(result);
+
+    MetadataMemory* metaMem = nullptr;
+    {
+        std::lock_guard<std::mutex> l(mLock);
+        for (auto &reqStat : mRequestStateVector) {
+            if (reqStat.frameNumber == event.frameNumber
+                && reqStat.partialResultReturned < reqStat.partialResultCount) {
+                reqStat.partialResultReturned = 1;
+                metaMem = reqStat.metaResult;
+            }
+        }
+    }
+
+    result.frame_number = event.frameNumber;
+    result.output_buffers = event.outputBuffer;
+    result.num_output_buffers = 1;
+    if (metaMem) {
+        if (mInputCam3Bufs.find(result.frame_number) == mInputCam3Bufs.end()) {
+            android::CameraMetadata* metaResult = metaMem->getMetadata();
+            MetadataConvert::HALMetadataToRequestMetadata(*(event.parameter), metaResult);
+            updateMetadata(*(event.parameter), metaResult);
+            mCamera3AMetadata->process3Astate(*(event.parameter), *metaResult);
+        }
+
+        result.result = metaMem->getMemory();
+
+        result.partial_result = 1;
+        LOG1("@%s frame_number:%u, timestamp:%lld, metadataDone", __func__, event.frameNumber, event.timestamp);
+    } else {
+        result.result = nullptr;
+        result.partial_result = 0;
+    }
+    mCallbackOps->process_capture_result(mCallbackOps, &result);
+
+    bool found = false;
+    std::lock_guard<std::mutex> l(mLock);
+    for (uint32_t i = 0; i < mRequestStateVector.size(); i++) {
+        if (mRequestStateVector.at(i).frameNumber == event.frameNumber) {
+            mRequestStateVector.at(i).buffersReturned++;
+            mRequestStateVector.at(i).partialResultReturned = 1;
+            if (checkRequestDone(mRequestStateVector.at(i))) {
+                returnInputBuffer(event.frameNumber);
+                returnRequestDone(event.frameNumber);
+                releaseMetadataMemory(mRequestStateVector.at(i).metaResult);
+                mRequestStateVector.erase(mRequestStateVector.begin() + i);
+            }
+            found = true;
+        }
+    }
+    if (!found) {
+        LOGW("%s, event.frameNumber %u wasn't found!", __func__, event.frameNumber);
+    } else {
+        LOG2("%s, event.frameNumber %u was returned", __func__, event.frameNumber);
+    }
+
+    return icamera::OK;
+}
+
+void ResultProcessor::updateMetadata(const icamera::Parameters &parameter,
+                                     android::CameraMetadata *settings) {
+    /*
+     *  if we support face ae and the face detection mode is not off,
+     *  set face detect metadata to the request metadata, then the face area will be drawn.
+     */
+    if (icamera::PlatformData::isFaceAeEnabled(mCameraId)) {
+        uint8_t faceDetectMode;
+        int ret = parameter.getFaceDetectMode(faceDetectMode);
+        if (ret == icamera::OK && faceDetectMode != icamera::FD_MODE_OFF) {
+            icamera::CVFaceDetectionAbstractResult faceResult;
+            ret = icamera::FaceDetection::getResult(mCameraId, &faceResult);
+            if (ret == icamera::OK) {
+                MetadataConvert::convertFaceDetectionMetadata(faceResult, settings);
+                LOG2("@%s, set face detection metadata, face number:%d",
+                        __func__, faceResult.faceNum);
+            }
+        }
+    }
+
+    int64_t exposure = 0;
+    float sensitivity = 0.0f;
+    parameter.getExposureTime(exposure);
+    parameter.getSensitivityGain(sensitivity);
+
+    uint8_t lockMode = ANDROID_BLACK_LEVEL_LOCK_OFF;
+    camera_metadata_entry entry = settings->find(ANDROID_BLACK_LEVEL_LOCK);
+    if (entry.count == 1 && (entry.data.u8[0] == ANDROID_BLACK_LEVEL_LOCK_ON)) {
+        lockMode = (exposure == mLastParams.sensorExposure
+                    && sensitivity == mLastParams.sensorIso) ?
+                    ANDROID_BLACK_LEVEL_LOCK_ON : ANDROID_BLACK_LEVEL_LOCK_OFF;
+    }
+    LOG2("@%s, the black level lock metadata: %d", __func__, lockMode);
+    settings->update(ANDROID_BLACK_LEVEL_LOCK, &lockMode, 1);
+
+    mLastParams.sensorExposure = exposure;
+    mLastParams.sensorIso = sensitivity;
+}
+
+// the input buffer must be returned as the last one buffer
+void ResultProcessor::returnInputBuffer(uint32_t frameNumber)
+{
+    if (mInputCam3Bufs.find(frameNumber) == mInputCam3Bufs.end()) {
+        return;
+    }
+
+    std::shared_ptr<Camera3Buffer> inBuf = mInputCam3Bufs[frameNumber];
+    if (!inBuf) {
+        return;
+    }
+
+    camera3_stream_t *s = inBuf->getStream();
+    if (s) {
+        LOG2("@%s, frame_number:%u, w:%d, h:%d, f:%d", __func__, frameNumber, s->width, s->height, s->format);
+    }
+
+    camera3_stream_buffer_t buf = {};
+    buf.stream = s;
+    buf.buffer = inBuf->getBufferHandle();
+    buf.status = inBuf->status();
+
+    inBuf->getFence(&buf);
+    inBuf->unlock();
+    inBuf->deinit();
+
+    camera3_capture_result_t result = {};
+    result.frame_number = frameNumber;
+    result.result = nullptr;
+    result.input_buffer = &buf;
+
+    LOG1("@%s, frame_number:%u, return the input buffer", __func__, frameNumber);
+    mCallbackOps->process_capture_result(mCallbackOps, &result);
+
+    mInputCam3Bufs.erase(frameNumber);
+}
+
+bool ResultProcessor::checkRequestDone(const RequestState &requestState)
+{
+    LOG1("@%s", __func__);
+
+    return (requestState.isShutterDone
+        && requestState.partialResultCount == requestState.partialResultReturned
+        && requestState.buffersToReturn == requestState.buffersReturned);
+}
+
+void ResultProcessor::returnRequestDone(uint32_t frameNumber)
+{
+    LOG2("@%s frame_number:%d", __func__, frameNumber);
+
+    if ((frameNumber % FPS_FRAME_COUNT == 0) &&
+        icamera::Log::isDebugLevelEnable(icamera::CAMERA_DEBUG_LOG_FPS)) {
+        struct timeval curTime;
+        gettimeofday(&curTime, nullptr);
+        int duration = static_cast<int>(curTime.tv_usec - mRequestTime.tv_usec
+                       + ((curTime.tv_sec - mRequestTime.tv_sec) * 1000000));
+        if (frameNumber == 0) {
+            LOGFPS("%s, time of launch to preview: %dms", __func__, (duration / 1000));
+        } else {
+            float curFps = static_cast<float>(1000000) /
+                           static_cast<float>(duration / FPS_FRAME_COUNT);
+            LOGFPS("@%s, fps: %02f", __func__, curFps);
+        }
+        gettimeofday(&mRequestTime, nullptr);
+    }
+
+    mRequestManagerCallback->returnRequestDone(frameNumber);
+}
+
+MetadataMemory* ResultProcessor::acquireMetadataMemory()
+{
+    MetadataMemory* metaMem = nullptr;
+    if (mMetadataVector.size() > 0) {
+        metaMem = mMetadataVector.back();
+        mMetadataVector.pop_back();
+    } else {
+        metaMem = new MetadataMemory();
+        LOG1("%s: allocate new one: %p", __func__, metaMem);
+    }
+
+    return metaMem;
+}
+
+void ResultProcessor::releaseMetadataMemory(MetadataMemory* metaMem)
+{
+    CheckError(metaMem == nullptr, VOID_VALUE, "%s: null metaMem!", __func__);
+    mMetadataVector.push_back(metaMem);
+}
+
+ResultProcessor::ResultThread::ResultThread(ResultProcessor *resultProcessor)
+    : mResultProcessor(resultProcessor)
+{
+    LOG1("@%s", __func__);
+
+    run("ResultThread");
+}
+
+ResultProcessor::ResultThread::~ResultThread()
+{
+    LOG1("@%s", __func__);
+
+    requestExit();
+    std::lock_guard<std::mutex> l(mEventQueueLock);
+    mEventCondition.notify_one();
+}
+
+void ResultProcessor::ResultThread::sendEvent(const icamera::camera_msg_data_t &data)
+{
+    LOG2("@%s", __func__);
+    std::lock_guard<std::mutex> l(mEventQueueLock);
+    mEventQueue.push(data);
+    mEventCondition.notify_one();
+}
+
+bool ResultProcessor::ResultThread::threadLoop()
+{
+    LOG2("@%s", __func__);
+
+    icamera::camera_msg_data_t data;
+    // mutex only protects mEventQueue
+    {
+        std::unique_lock<std::mutex> l(mEventQueueLock);
+        // check if there is event queued
+        if (mEventQueue.empty()) {
+            std::cv_status ret = mEventCondition.wait_for(l,
+                std::chrono::nanoseconds(kMaxDuration * SLOWLY_MULTIPLIER));
+
+            if (ret == std::cv_status::timeout) {
+                LOGW("%s, wait event timeout", __func__);
+            }
+
+            return true;
+        }
+
+        // parse event
+        data = std::move(mEventQueue.front());
+        mEventQueue.pop();
+    }
+
+    // handle message
+    switch (data.type) {
+        // Regards isp buffer ready as shutter event
+        case icamera::CAMERA_ISP_BUF_READY: {
+            ShutterEvent event = {
+                data.data.buffer_ready.frameNumber,
+                data.data.buffer_ready.timestamp
+            };
+            LOG2("@%s, frameNumber %d, timestamp %ld, mResultProcessor:%p", __func__,
+                 event.frameNumber, event.timestamp, mResultProcessor);
+            mResultProcessor->shutterDone(event);
+            break;
+        }
+        default: {
+            LOGW("unknown message type %d", data.type);
+            break;
+        }
+    }
+
+    return true;
+}
+
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/ResultProcessor.h b/camera/hal/intel/ipu6/aal/ResultProcessor.h
new file mode 100644
index 000000000000..ccc0d96662d6
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/ResultProcessor.h
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <sys/time.h>
+#include <hardware/camera3.h>
+
+#include <vector>
+#include <queue>
+#include <mutex>
+#include <unordered_map>
+
+#include "Parameters.h"
+#include "Thread.h"
+#include "HALv3Header.h"
+#include "HALv3Interface.h"
+#include "Camera3AMetadata.h"
+#include "Camera3Buffer.h"
+
+namespace camera3 {
+
+// Store metadata that are created by the AAL
+// To avoid continuous allocation/de-allocation of metadata buffers
+class MetadataMemory {
+public:
+    MetadataMemory();
+    ~MetadataMemory();
+
+    // Don't access to metadata and memory in parellel
+    // because metadata may reallocate memory when new entries are added.
+    android::CameraMetadata* getMetadata(); // For entries update
+    camera_metadata_t* getMemory();         // For metadata copy
+
+    // Helper function to avoid memory reallocation
+    void copyMetadata(const camera_metadata_t* src);
+
+private:
+    android::CameraMetadata mMeta; // May reallocate buffer if entries are added
+    camera_metadata_t* mMemory;
+};
+
+struct RequestState {
+    uint32_t frameNumber;
+
+    bool isShutterDone;
+
+    unsigned int partialResultReturned;
+    unsigned int partialResultCount;
+
+    unsigned int buffersReturned;
+    unsigned int buffersToReturn;
+
+    MetadataMemory* metaResult;
+
+    RequestState() {
+        frameNumber = 0;
+        isShutterDone = false;
+        partialResultReturned = 0;
+        partialResultCount = 0;
+        buffersReturned = 0;
+        buffersToReturn = 0;
+        metaResult = nullptr;
+    }
+};
+
+struct ShutterEvent {
+    uint32_t frameNumber;
+    uint64_t timestamp;
+};
+
+struct BufferEvent {
+    uint32_t frameNumber;
+    uint64_t timestamp;
+    const icamera::Parameters *parameter;
+    const camera3_stream_buffer_t *outputBuffer;
+};
+
+struct ReferenceParam {
+    int64_t sensorExposure;
+    float sensorIso;
+};
+
+/**
+ * \brief An interface used to callback buffer event.
+ */
+class CallbackEventInterface {
+public:
+    CallbackEventInterface() {}
+    virtual ~CallbackEventInterface() {}
+
+    virtual int bufferDone(const BufferEvent &event) = 0;
+    virtual int shutterDone(const ShutterEvent &event) = 0;
+};
+
+/**
+ * \class ResultProcessor
+ *
+ * This class is used to handle shutter done, buffer done and metadata done event.
+ *
+ */
+class ResultProcessor : public CallbackEventInterface {
+
+public:
+    ResultProcessor(int cameraId, const camera3_callback_ops_t *callback,
+                    RequestManagerCallback *requestManagerCallback);
+    virtual ~ResultProcessor();
+
+    int registerRequest(const camera3_capture_request_t *request,
+                        std::shared_ptr<Camera3Buffer> inputCam3Buf);
+
+    virtual int shutterDone(const ShutterEvent &event);
+    virtual int bufferDone(const BufferEvent &event);
+
+    void callbackNotify(const icamera::camera_msg_data_t &data);
+
+private:
+    bool checkRequestDone(const RequestState &requestState);
+    void returnRequestDone(uint32_t frameNumber);
+
+    MetadataMemory* acquireMetadataMemory();
+    void releaseMetadataMemory(MetadataMemory* metaMem);
+
+    void returnInputBuffer(uint32_t frameNumber);
+    void updateMetadata(const icamera::Parameters &parameter, android::CameraMetadata *settings);
+
+private:
+    class ResultThread : public icamera::Thread {
+    public:
+        ResultThread(ResultProcessor *resultProcessor);
+        ~ResultThread();
+
+        void sendEvent(const icamera::camera_msg_data_t &data);
+    private:
+        virtual bool threadLoop();
+
+    private:
+        const uint64_t kMaxDuration = 2000000000; // 2000ms
+        ResultProcessor *mResultProcessor;
+
+        std::condition_variable mEventCondition;
+        std::mutex mEventQueueLock;
+        std::queue<icamera::camera_msg_data_t> mEventQueue;
+    };
+    std::unique_ptr<ResultThread> mResultThread;
+
+    int mCameraId;
+    const camera3_callback_ops_t *mCallbackOps;
+
+    // mLock is used to protect mRequestStateVector
+    std::mutex mLock;
+    std::vector<RequestState> mRequestStateVector;
+    std::vector<MetadataMemory*> mMetadataVector;
+    MetadataMemory* mLastSettings;
+
+    RequestManagerCallback *mRequestManagerCallback;
+
+    Camera3AMetadata *mCamera3AMetadata;
+
+    std::unordered_map<int, std::shared_ptr<Camera3Buffer>> mInputCam3Bufs;
+    timeval mRequestTime;
+    ReferenceParam mLastParams;
+};
+
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/aal/chrome/HALv3Header.h b/camera/hal/intel/ipu6/aal/chrome/HALv3Header.h
new file mode 100644
index 000000000000..3fc2deff906b
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/chrome/HALv3Header.h
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+// metadata related header file
+#include <camera/camera_metadata.h>
diff --git a/camera/hal/intel/ipu6/include/api/ICamera.h b/camera/hal/intel/ipu6/include/api/ICamera.h
new file mode 100644
index 000000000000..6ecab9317a3a
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/api/ICamera.h
@@ -0,0 +1,574 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ * Filename: ICamera.h
+ *
+ * ------------------------------------------------------------------------------
+ * REVISION HISTORY
+ *******************************************************************************
+ *     Version        0.10       Initialize camera HAL API
+ *******************************************************************************
+ *     Version        0.20       Update for the device handle and stream handle
+ *                               Update for the coding style of the type
+ *******************************************************************************
+ *     Version        0.21       Remove API camera_device_set_param and camera_device_get_param
+ *                               Remove type define camera_stream_t
+ *******************************************************************************
+ *     Version        0.30       Remove API camera_device_del_stream
+ *                               Rename API camera_device_add_stream -> camera_device_config_streams
+ *                                   * All the streams are added at the same time
+ *                               Rename camera_device_init -> camera_hal_init
+ *                               Rename camera_device_deinit -> camera_hal_deinit
+ *                               Remove the typedef for struct camera_buffer
+ *******************************************************************************
+ *     Version        0.31       Remove duplicated camera_frame_info_t
+ *                               Cleanup the camera_buffer_t structure
+ *******************************************************************************
+ *     Version        0.40       Delete redundant query_frame_info
+ *                               Add assist API: get_frame_size
+ *******************************************************************************
+ *     Version        0.41       Add API camera_device_allocate_memory to enable mmap memory mode
+ *******************************************************************************
+ *     Version        0.42       Merge all the common types to Parameters.h
+ *******************************************************************************
+  *    Version        0.43       Add sensor description in camera_info_t
+ *******************************************************************************
+ *     Version        0.44       Change output parameter of get_frame_size
+ *******************************************************************************
+ *     Version        0.45       Add two parameters(number of buffers, parameters) for camera_stream_qbuf
+                                 Add one parameter(parameters) for camera_stream_dqbuf
+*******************************************************************************
+ *     Version        0.46       Add virtual channel camera number for camera_device_open
+                                 Add virtual channel information in camera_info_t
+ *******************************************************************************
+ *     Version        0.50       Support specifying input format (aka ISYS output format).
+ *******************************************************************************
+ *     Version        0.51       Support specifying inputConfig inlucding inputformat/resolution
+                                 Params int inputFmt changed to stream_t *inputConfig
+ *******************************************************************************
+ *     Version        0.60       Overload interface camera_stream_qbuf() with refined parameters
+                                 old camera_stream_qbuf() will be removed soon
+ *******************************************************************************
+ *     Version        0.61       Add API camera_callback_register() to notify event to AAL
+ * ------------------------------------------------------------------------------
+ *
+ */
+
+#pragma once
+
+#include "Parameters.h"
+
+#include <stdlib.h> // For including definition of NULL
+
+namespace icamera {
+
+/**
+ * \struct camera_info_t: Define each camera basic information
+ */
+typedef struct {
+    int facing;
+    int orientation;
+    int device_version;
+    const char* name; /**< Sensor name */
+    const char* description; /**< Sensor description */
+    const Parameters *capability; /**< camera capability */
+} camera_info_t;
+
+/**
+ * \brief
+ *   Get numbers of camera
+ *
+ * \note
+ *   This allows user to get the numbers of camera without init or open camera device.
+ *
+ * \return
+ *   >0 the numbers of camera
+ * \return
+ *   <= 0 failed to get camera numbers
+ *
+ * \par Sample code:
+ *
+ * \code
+ *   int num = get_number_of_cameras();
+ * \endcode
+ **/
+int get_number_of_cameras();
+
+/**
+ * \brief
+ *   Get camera info including camera capability.
+ *
+ * \note
+ *   It can be called before hal init
+ *
+ * \param[in]
+ *   int camera_id: ID of the camera
+ * \param[out]
+ *   camera_info_t info: Camera info filled by libcamhal
+ *
+ * \return
+ *   0 succeed to get camera info
+ * \return
+ *   <0 error code, failed to get camera info
+ *
+ * \par Sample code
+ *
+ * \code
+ *   int camera_id = 0;
+ *   camera_info_t info;
+ *   get_camera_info(camera_id, info);
+ *
+ * \endcode
+ *
+ **/
+int get_camera_info(int camera_id, camera_info_t& info);
+
+/**
+ * \brief
+ *   Initialize camera HAL
+ *
+ * \return
+ *   0 succeed to init camera HAL
+ * \return
+ *   <0 error code, failed to init camera HAL
+ *
+ * \par Sample code:
+ *
+ * \code
+ *   int ret = camera_hal_init();
+ * \endcode
+ **/
+int camera_hal_init();
+
+/**
+ * \brief
+ *   De-initialize camera HAL
+ *
+ * \return
+ *   0 succeed to deinit camera HAL
+ * \return
+ *   <0 error code, failed to deinit camera device
+ *
+ * \par Sample code:
+ *
+ * \code
+ *   int ret = camera_hal_deinit();
+ * \endcode
+ **/
+int camera_hal_deinit();
+
+/**
+ * \brief
+ *   Register callback function
+ *
+ * \param[in]
+ *   int camera_id: ID of the camera
+ * \param[in]
+ *   camera_callback_ops_t *callback: callback handle
+ *
+ **/
+void camera_callback_register(int camera_id, const camera_callback_ops_t *callback);
+
+/**
+ * \brief
+ *   Open camera device by camera ID
+ *
+ * \param[in]
+ *   int camera_id: ID of the camera
+ *
+ * \return
+ *   0 succeed to open camera device
+ * \return
+ *   <0 error code, failed to open camera device
+ *
+ * \par Sample code:
+ *
+ * \code
+ *   int camera_id = 0;
+ *   int ret = camera_device_open(camera_id);
+ * \endcode
+ **/
+int camera_device_open(int camera_id);
+
+/**
+ * \brief
+ *   Close camera device by camera ID
+ *
+ * \param[in]
+ *   int camera_id: ID of the camera
+ *
+ * \par Sample code:
+ *
+ * \code
+ *   int camera_id = 0;
+ *   int ret = camera_device_open(camera_id);
+ *   camera_device_close(camera_id);
+ * \endcode
+ **/
+void camera_device_close(int camera_id);
+
+/**
+ * \brief
+ *   Configure sensor input of camera device, it is not allowed to call this when camera is started.
+ *   Optional call.
+ *
+ * \note
+ *   1. To re-configure sensor input, camera device must be stopped first.
+ *   2. The new sensor configuration will overwrite the previous config.
+ *   3. The new "inputConfig" will be used for all the future operation until the device is closed.
+ *
+ * \param[in]
+ *   int camera_id: ID of the camera
+ * \param[in]
+ *   int inputConfig: Specify which input format, resolution(the output of ISYS) should be used.
+ *
+ * \return
+ *   0 succeed to configure streams
+ * \return
+ *   <0 error code, failed to configure stream
+ *
+ * \par Sample code:
+ *
+ * \code
+ *   int camera_id = 0;
+ *   stream_t input_config;
+ *   CLEAR(input_config);
+ *   input_config.format = V4L2_PIX_FMT_SGRBG8V32;
+ *   ret = camera_device_config_sensor_input(camera_id, &input_config);
+ * \endcode
+ **/
+int camera_device_config_sensor_input(int camera_id, const stream_t *inputConfig);
+
+/**
+ * \brief
+ *   Configure streams to camera device, it is not allowed to call this when camera is started.
+ *
+ * \note
+ *   1. To re-configure streams, camera device must be stopped first.
+ *   2. The new streams configuration will overwrite the previous streams.
+ *
+ * \param[in]
+ *   int camera_id: ID of the camera
+ * \param[in]
+ *   stream_config_t stream_list: stream configuration list, if success, stream id is filled in streams[]
+ *
+ * \return
+ *   0 succeed to configure streams
+ * \return
+ *   <0 error code, failed to configure stream
+ *
+ * \par Sample code:
+ *
+ * \code
+ *   int camera_id = 0;
+ *   stream_config_t stream_list;
+ *   stream_t streams[1];
+ *   streams[0].format = V4L2_PIX_FMT_SGRBG8;
+ *   streams[0].width = 1920;
+ *   streams[0].height = 1080;
+ *   streams[0].memType = V4L2_MEMORY_USERPTR;
+ *   stream_list.num_streams = 1;
+ *   stream_list.streams = streams;
+ *   ret = camera_device_config_streams(camera_id, &stream_list);
+ * \endcode
+ **/
+int camera_device_config_streams(int camera_id, stream_config_t *stream_list);
+
+/**
+ * \brief
+ *   Start camera device
+ *
+ * \param[in]
+ *   int camera_id: ID of the camera
+ *
+ * \return
+ *   0 succeed to start device
+ * \return
+ *   <0 error code, failed to start device
+ *
+ * \par Sample code:
+ *
+ * \code
+ *   int camera_id=0;
+ *   stream_config_t stream_list;
+ *   ...
+ *   ret = camera_device_config_streams(camera_id, &stream_list);
+ *   ret = camera_device_start(camera_id);
+ *   ... ...
+ *   ret = camera_device_stop(camera_id);
+ * \endcode
+ *
+ **/
+int camera_device_start(int camera_id);
+
+/**
+ * \brief
+ *   Stop camera device.
+ *
+ * \param[in]
+ *   int camera_id: ID of the camera
+ *
+ * \return
+ *   0 succeed to stop device
+ * \return
+ *   <0 error code, failed to stop device
+ *
+ * \see camera_device_start()
+ **/
+int camera_device_stop(int camera_id);
+
+/**
+ * \brief
+ *   Allocate memory for mmap & dma export io-mode
+ *
+ * \param[in]
+ *   int camera_id: ID of the camera
+ * \param[out]
+ *   camera_buffer_t buffer: in Mmap mode, mmaped address is filled in addr;
+ *   in DMA export mode, the dma fd is flled in dmafd.
+ *
+ * \return
+ *   0 succeed to allocate memory
+ * \return
+ *   <0 error code, failed to allocate memory
+ *
+ * \par Sample code:
+ *
+ * \code
+ *   camera_buffer_t *buffers = (camera_buffer_t *)malloc(sizeof(camera_buffer_t)*buffer_count);
+ *   camera_buffer_t *buf = buffers;
+ *   buf.s = stream;
+ *   for (int i = 0; i < buffer_count; i++, buf++) {
+ *     camera_device_allocate_memory(camera_id, buf):
+ *   }
+ *
+ *   buf = buffers;
+ *   for (int i = 0; i < buffer_count; i++, buf++) {
+ *       camera_stream_qbuf(camera_id, stream_id, buf);
+ *   }
+ *
+ *   camera_device_start(camera_id);
+ * \endcode
+ *
+ */
+int camera_device_allocate_memory(int camera_id, camera_buffer_t *buffer);
+
+/**
+ * \brief
+ *   Queue a buffer to device (deprecated, will be removed soon.)
+ *
+ * \param[in]
+ *   int camera_id: ID of the camera
+ * \param[in]
+ *   int stream_id: ID of stream
+ * \param[in]
+ *   camera_buffer_t buffer: buffer queued to device
+ * \param[in]
+ *   int num_buffers: indicates how many buffers need to be queued at the same time,
+                      and these buffers MUST be for different streams.
+                      And stream id in buffer MUST be filled correctly.
+ * \param[in]
+ *   Parameters settings: Settings used for this group of buffers.
+ *
+ * \return
+ *   0 succeed to queue buffers
+ * \return
+ *   <0 error code, failed to queue buffers
+ *
+ * \see camera_stream_dqbuf();
+ **/
+int camera_stream_qbuf(int camera_id, int stream_id, camera_buffer_t *buffer,
+                       int num_buffers = 1, const Parameters* settings = NULL);
+
+/**
+ * \brief
+ *   Queue one or serveral buffers to the camera device
+ *
+ * \param[in]
+ *   int camera_id: ID of the camera
+ * \param[in]
+ *   camera_buffer_t buffer: array of pointers to camera_buffer_t
+ *   buffer[i]->s MUST be filled before calling this API.
+ * \param[in]
+ *   int num_buffers: indicates how many buffers are in the buffer pointer array,
+ *                    and these buffers MUST be for different streams. Stream id is
+ *                    filled and give back to app when camera_device_config_streams()
+ *                    is called, HAL will do the mapping when parsing queued buffers
+ *                    according to num_buffers.
+ * \param[in]
+ *   Parameters settings: Settings used for this group of buffers.
+ *                        This is used for per-frame setting, which means the settings should be
+ *                        applied for the group of buffers.
+ *
+ * \return
+ *   0 succeed to queue buffers
+ * \return
+ *   <0 error code, failed to queue buffers
+ *
+ * \see camera_stream_qbuf();
+ **/
+int camera_stream_qbuf(int camera_id, camera_buffer_t **buffer,
+                       int num_buffers = 1, const Parameters* settings = NULL);
+
+/**
+ * \brief
+ *   Dequeue a buffer from device per stream id.
+ *
+ * \note
+ *   It's a block function, that means the caller will be blocked until buffer is ready.
+ *
+ * \param[in]
+ *   int camera_id: ID of the camera
+ * \param[in]
+ *   int stream_id: ID of stream
+ * \param[out]
+ *   camera_buffer_t buffer: buffer dqueued from device
+ * \param[out]
+ *   Parameters settings: Settings used for this buffer.
+ *
+ * \return
+ *   0 succeed to dqueue buffer
+ * \return
+ *   <0 error code, failed to dqueue buffer
+ *
+ * \par Sample code
+ *
+ * \code
+ *   const int buffer_count = 8;
+ *   int bpp = 0;
+ *   int buffer_size = get_frame_size(camera_id, V4L2_PIX_FMT_SGRBG8, 1920, 1080, V4L2_FIELD_ANY, &bpp);
+ *   camera_buffer_t buffers[buffer_count];
+ *   camera_buffer_t *buf = nullptr;
+ *   for (int i = 0; i < buffer_count; i++) {
+ *     buf = &buffers[i];
+ *     posix_memalign(&buf->addr, getpagesize(), buffer_size);
+ *     buf->s = stream; // stream here comes from parameter and result of camera_device_config_streams.
+ *   }
+ *
+ *   for (int i = 0; i < buffer_count; i++) {
+ *       buf = &buffers[i];
+ *       camera_stream_qbuf(camera_id, stream_id, &buf);
+ *   }
+ *
+ *   camera_device_start(camera_id);
+ *
+ *   for (int i = 0; i < buffer_count; i++) {
+ *       camera_stream_dqbuf(camera_id, stream_id, &buf);
+ *       // processing data with buf
+ *   }
+ * \endcode
+ *
+ **/
+int camera_stream_dqbuf(int camera_id, int stream_id, camera_buffer_t **buffer,
+                        Parameters* settings = NULL);
+
+/**
+ * \brief
+ *   Set a set of parameters to the gaven camera device.
+ *
+ * \note
+ *   It MUST be called after device opened, otherwise error will be returned.
+ *   Which buffer the paramters takes effect in is not guaranteed.
+ *
+ * \param[in]
+ *   int camera_id: ID of the camera
+ * \param[in]
+ *   Parameters param: A set of parameters.
+ *
+ * \return
+ *   0 succeed to set camera parameters
+ * \return
+ *   <0 error code, failed to set camera parameters
+ *
+ * \par Sample code
+ *
+ * \code
+ *   Parameters param;
+ *    camera_ae_mode_t aeMode = AE_MODE_MANUAL;
+ *    int64_t expTime = 10 * 1000;
+ *    param.setAeMode(aeMode);
+ *    param.setExposureTime(expTime);
+ *    param.setXXX(); // Set other parameters...
+ *
+ *   int ret = camera_set_parameters(camera_id, param);
+ *
+ * \endcode
+ *
+ **/
+int camera_set_parameters(int camera_id, const Parameters& param);
+
+/**
+ * \brief
+ *   Get parameter from the gaven camera device.
+ *
+ * \note
+ *   It MUST be called after device opened, otherwise error will be returned.
+ *
+ * \param[in]
+ *   int camera_id: ID of the camera
+ * \param[out]
+ *   Parameters param:  parameters need to be filled in
+ *
+ * \return
+ *   0 succeed to get camera parameters
+ * \return
+ *   <0 error code, failed to get camera parameters
+ *
+ * \par Sample code
+ *
+ * \code
+ *   Parameters param;
+ *   int ret = camera_get_parameters(camera_id, param);
+ *   camera_ae_mode_t aeMode = AE_MODE_MANUAL;
+ *   ret = param.getAeMode(aeMode);
+ *
+ * \endcode
+ *
+ **/
+int camera_get_parameters(int camera_id, Parameters& param);
+
+/**************************************Optional API ******************************
+ * The API defined in this section is optional.
+ */
+
+/**
+ * \brief
+ *   Return the size information of a frame.
+ *
+ * \note
+ *   It is used to assist the test cases to double confirm the final buffer size
+ *
+ * \param[in]
+ *   int camera_id: The camera device index
+ * \param[in]
+ *   int format: The v4l2 format of the frame
+ * \param[in]
+ *   int width: The width of the frame
+ * \param[in]
+ *   int height: The height of the frame
+ * \param[in]
+ *   int field: The interlace field of the frame
+ * \param[out]
+ *   int bpp: The bpp of the format
+ *
+ * \return
+ *   frame size.
+ **/
+int get_frame_size(int camera_id, int format, int width, int height, int field, int *bpp);
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/include/api/Parameters.h b/camera/hal/intel/ipu6/include/api/Parameters.h
new file mode 100644
index 000000000000..8faaddc95d0d
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/api/Parameters.h
@@ -0,0 +1,2559 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ * Filename: Parameters.h
+ *
+ * ------------------------------------------------------------------------------
+ * REVISION HISTORY
+ *     Version        0.1        Initialize camera parameters API
+ *     Version        0.2        Merge all the types to this file
+ *     Version        0.3        Add AE compensation related APIs.
+ *     Version        0.31       Add manual color matrix APIs.
+ *     Version        0.32       Add manual AE/AWB converge speed APIs.
+ *     Version        0.33       Add timestamp variable in camera_buffer_t
+ *     Version        0.34       Add AE window weight grid API
+ *     Version        0.40       Add Data Structure for HAL 3.3
+ *     Version        0.41       Add API getSupportedAeExposureTimeRange
+ *                               Add API getSupportedAeGainRange
+ *     Version        0.42       Add API updateDebugLevel
+ *     Version        0.43       Add API set and get deinterlace mode
+ *     Version        0.44       Add API set and get gps processing method
+ *                               Add API set and get focal length
+ *     Version        0.45       Add get supported static metadata APIs
+ *     Version        0.50       Support low level ISP feature control
+ *     Version        0.51       Support getting supported ISP control feature list
+ *     Version        0.52       Add API set and get awb result
+ *     Version        0.53       Add API to get/set enabled ISP control feature list
+ *     Version        0.54       Add API to get/set fisheye dewarping mode
+ *     Version        0.55       Add API to get/set LTM tuning data
+ *     Version        0.56       Add API to get/set LDC/RSC/digital zoom ratio
+ *     Version        0.58       Add API to get/set 3A state, and lens state.
+ *     Version        0.59       Add API to get/set AE/AWB lock
+ *     Version        0.61       Add API to support vertical and horizontal flip.
+ *     Version        0.62       Add API to support 3A cadence.
+ *     Version        0.63       Add API to enable/disable MONO Downscale feature.
+ *     Version        0.64       Add callback message definition.
+ *     Version        0.65       Add API to support OUTPUT/INPUT streams.
+ *     Version        0.66       modifies callback message definition.
+ *     Version        0.67       Add API to support lens.focusDistance and lens.focalLength
+ *     Version        0.68       Add API to support shading map.
+ *     Version        0.69       Add API to support statistics lens shading map control.
+ *     Version        0.70       Add API to support tonemap.
+ *     Version        0.71       Add API to support OPAQUE RAW usage for RAW reprocessing.
+ *     Version        0.72       Add streamType into supported_stream_config_t.
+ *
+ *
+ * ------------------------------------------------------------------------------
+ */
+
+#pragma once
+
+#include <vector>
+#include <set>
+#include <stdint.h>
+
+namespace icamera {
+
+/***************Start of Camera Basic Data Structure ****************************/
+/**
+ * Basic definition will be inherited by more complicated structure.
+ * MUST be all "int" in this structure.
+ */
+typedef struct {
+    int width;
+    int height;
+} camera_resolution_t;
+
+/**
+ * \struct stream_t: stream basic info
+ *
+ * \note
+ *   MUST use int if new member added.
+ */
+typedef struct {
+    int format;    /**< stream format refer to v4l2 definition https://linuxtv.org/downloads/v4l-dvb-apis/pixfmt.html */
+    int width;     /**< image width */
+    int height;    /**< image height */
+    int field;     /**< refer to v4l2 definition https://linuxtv.org/downloads/v4l-dvb-apis/field-order.html#v4l2-field */
+
+/*
+* The buffer geometry introduction.
+* The YUV image is formed with Y:Luma and UV:Chroma. And there are
+* two kinds of styles for YUV format: planar and packed.
+*
+*   YUV420:NV12
+*
+*            YUV420(720x480) sampling
+*
+*       |<----width+padding=alignedBpl----->|
+*     Y *-------*-------*-------*-------*....-----
+*       |                               |   :  ^
+*       |   # UV            #           |   :  |
+*       |                               |   :  |
+*       *-------*-------*-------*-------*....  |
+*       |                               |   :  |
+*       |   #               #           |   :  |
+*       |                               |   :  |
+*       *-------*-------*-------*-------*.... (height * 3 / 2)
+*       |                               |   :  |
+*       |   #               #           |   :  |
+*       |                               |   :  |
+*       *-------*-------*-------*-------*....  |
+*       |                               |   :  |
+*       |   #               #           |   :  |
+*       |                               |   :  v
+*       *-------*-------*-------*-------*....-----
+*
+*         The data stored in memory
+*          ____________w___________ .....
+*         |Y0|Y1                   |    :
+*         |                        |    :
+*         h                        h    :
+*         |                        |    :
+*         |                        |    :
+*         |________________________|....:
+*         |U|V|U|V                 |    :
+*        h/2                      h/2   :
+*         |____________w___________|....:
+*
+*       bpp = 12
+*       bpl = width;
+*       stride = align64(bpl):
+*
+*   YUV422:YUY2
+*
+*           YUV422(720x480) sampling
+*
+*       |<--(width*2)+padding=alignedBpl-->|
+*   YUV *#----*#-----*#-----*#-----*#....-----
+*       *#----*#-----*#-----*#-----*#....  |
+*       *#----*#-----*#-----*#-----*#....  |
+*       *#----*#-----*#-----*#-----*#....  |
+*       *#----*#-----*#-----*#-----*#.... (height)
+*       *#----*#-----*#-----*#-----*#....  |
+*       *#----*#-----*#-----*#-----*#....  |
+*       *#----*#-----*#-----*#-----*#....  |
+*       *#----*#-----*#-----*#-----*#....  |
+*       *#----*#-----*#-----*#-----*#....-----
+*
+*         The data stored in memory
+*          ____________w___________ .....
+*         |Y0|Cb|Y1|Cr             |    :
+*         |                        |    :
+*         |                        |    :
+*         |                        |    :
+*         h                        h    :
+*         |                        |    :
+*         |                        |    :
+*         |                        |    :
+*         |____________w___________|....:
+*
+*       bpp = 16
+*       bpl = width * bpp / 8 = width * 2;
+*       stride = align64(bpl):
+*
+*       Note: The stride defined in HAL is same as aligned bytes per line.
+*/
+    int stride;    /**< stride = aligned bytes per line */
+    int size;      /**< real buffer size */
+
+    int id;        /**< Id that is filled by HAL. */
+    int memType;   /**< buffer memory type filled by app, refer to https://linuxtv.org/downloads/v4l-dvb-apis/io.html */
+
+    /**
+     * The maximum number of buffers the HAL device may need to have dequeued at
+     * the same time. The HAL device may not have more buffers in-flight from
+     * this stream than this value.
+     */
+    uint32_t max_buffers;
+
+    int usage; /**<The usage of this stream defined in camera_stream_usage_t. */
+    int streamType; /**<The stream type of this stream defined in camera_stream_type_t. */
+} stream_t;
+
+typedef std::vector<stream_t> stream_array_t;
+
+/**
+ * \struct stream_config_t: stream configuration info
+ *
+ * Contains all streams info in this configuration.
+ */
+typedef struct {
+    int num_streams; /**< number of streams in this configuration */
+    stream_t    *streams; /**< streams list */
+    /**
+     * The operation mode of the streams in this configuration. It should be one of the value
+     * defined in camera_stream_configuration_mode_t.
+     * The HAL uses this mode as an indicator to set the stream property (e.g.,
+     * camera_stream->max_buffers) appropriately. For example, if the configuration is
+     * CAMERA_STREAM_CONFIGURATION_CONSTRAINED_HIGH_SPEED_MODE, the HAL may want to set aside more
+     * buffers for batch mode operation (see camera.control.availableHighSpeedVideoConfigurations
+     * for batch mode definition).
+     */
+    uint32_t operation_mode;
+} stream_config_t;
+
+/**
+ * \struct supported_stream_config_t: the supported stream configurations
+ *
+ * \note
+ *   MUST use int if new member added.
+ */
+typedef struct {
+    int format;    /**< stream format refer to v4l2 definition https://linuxtv.org/downloads/v4l-dvb-apis/pixfmt.html */
+    int width;     /**< image width */
+    int height;    /**< image height */
+    int field;     /**< refer to v4l2 definition https://linuxtv.org/downloads/v4l-dvb-apis/field-order.html#v4l2-field */
+
+    int stride;    /**< stride = aligned bytes per line */
+    int size;      /**< real buffer size */
+
+    int maxVideoFps;  /**<The max fps max fps when only this stream is configured for continuous streaming. */
+    int maxCaptureFps;  /**<The max fps max fps when only this stream is configured for high quality still capture. */
+
+    int streamType; /**< The type of the stream, one of the camera_stream_type_t values. */
+} supported_stream_config_t;
+
+typedef std::vector<supported_stream_config_t> supported_stream_config_array_t;
+
+/**
+ * \struct camera_buffer_flags_t: Specify a buffer's properties.
+ *
+ * The buffer's properties can be one of them or combined with some of them.
+ */
+typedef enum {
+    BUFFER_FLAG_DMA_EXPORT = 1<<0,
+    BUFFER_FLAG_INTERNAL = 1<<1,
+    BUFFER_FLAG_SW_READ = 1<<2,
+    BUFFER_FLAG_SW_WRITE = 1<<3,
+} camera_buffer_flags_t;
+
+/**
+ * \struct camera_buffer_t: camera buffer info
+ *
+ * camera buffer is used to carry device frames. Application allocate buffer structure,
+ * according to memory type to allocate memory and queue to device.
+ */
+typedef struct {
+    stream_t s;   /**< stream info */
+    void *addr;   /**< buffer addr for userptr and mmap memory mode */
+    int index;    /**< buffer index, filled by HAL. it is used for qbuf and dqbuf in order */
+    long sequence; /**< buffer sequence, filled by HAL, to record buffer dqueue sequence from device */
+    int dmafd;    /**< buffer dmafd for DMA import and export mode */
+    int flags;    /**< buffer flags, its type is camera_buffer_flags_t, used to specify buffer properties */
+    uint64_t timestamp; /**< buffer timestamp, it's a time reference measured in nanosecond */
+    int reserved; /**< reserved for future */
+} camera_buffer_t;
+
+/**
+ * camera_stream_type_t:
+ *
+ * The type of the camera stream, which defines whether the camera HAL device
+ * is the producer or the consumer for that stream, and how the buffers of that
+ * stream relate to the other streams.
+ */
+typedef enum {
+    /**
+     * This stream is an output stream; the camera HAL device will be responsible to
+     * fill the buffers of this stream with newly captured or reprocessed image data.
+     */
+    CAMERA_STREAM_OUTPUT = 0,
+
+    /**
+     * This stream is an input stream; the camera HAL device will be responsible
+     * to read buffers from this stream and to send them through the camera
+     * processing pipeline, as if the buffer was a newly captured image from
+     * the imager.
+     *
+     * The pixel format for an input stream can be any format reported by
+     * camera.scaler.availableInputOutputFormatsMap. The pixel format of the
+     * output stream used to produce the reprocessing data may be any format
+     * reported by camera.scaler.availableStreamConfigurations. The supported
+     * inputoutput stream combinations depends on the camera device capabilities.
+     * See camera.scaler.availableInputOutputFormatsMap for stream map details.
+     *
+     * This kind of stream is generally used to reprocess data into higher
+     * quality images (that otherwise would cause a frame rate performance loss),
+     * or to do off-line reprocessing.
+     * The typical use cases are OPAQUE (typically ZSL) and YUV reprocessing.
+     */
+    CAMERA_STREAM_INPUT = 1,
+
+    /**
+     * This stream can be used for input and output. Typically, the stream is
+     * used as an output stream, but occasionally one already-filled buffer may
+     * be sent back to the HAL device for reprocessing.
+     *
+     * This kind of stream is generally meant for Zero Shutter Lag (ZSL)
+     * features, where copying the captured image from the output buffer to the
+     * reprocessing input buffer would be expensive.
+     *
+     * Note that the HAL will always be reprocessing data it produced.
+     *
+     */
+    CAMERA_STREAM_BIDIRECTIONAL = 2,
+
+    /**
+     * Total number of framework-defined stream types
+     */
+    CAMERA_NUM_STREAM_TYPES
+
+} camera_stream_type_t;
+
+/**
+ * camera_stream_usage_t:
+ *
+ * The type of the camera stream, which defines whether the camera HAL device
+ * is the producer or the consumer for that stream, and how the buffers of that
+ * stream relate to the other streams.
+ */
+typedef enum {
+    /**
+     * This stream is an output stream for preview;
+     */
+    CAMERA_STREAM_PREVIEW = 0,
+
+    /**
+     * This stream is an output stream for VIDEO CAPTURE;
+     */
+    CAMERA_STREAM_VIDEO_CAPTURE,
+
+    /**
+     * This stream is an output stream for STILL IMAGE CAPTURE;
+     */
+    CAMERA_STREAM_STILL_CAPTURE,
+
+    /**
+     * This stream is an output stream for Application processing which is accessed by CPU;
+     */
+    CAMERA_STREAM_APP,
+
+    /**
+     * This stream is an output stream for Opaque RAW reprocess.
+     */
+    CAMERA_STREAM_OPAQUE_RAW,
+} camera_stream_usage_t;
+
+/**
+ * camera_stream_configuration_mode_t:
+ *
+ * This defines the general operation mode for the HAL (for a given stream configuration), where
+ * modes besides NORMAL have different semantics, and usually the generality of the APIs are
+ * limited in exchange for higher performance in some particular area.
+ */
+typedef enum {
+    /**
+     * Normal stream configuration operation mode.
+     * This is the default camera operation mode, where all semantics of HAL APIs and metadata
+     * controls apply.
+     */
+    CAMERA_STREAM_CONFIGURATION_MODE_NORMAL = 0,
+
+    /**
+     * CONSTRAINED_HIGH_SPEED is the special constrained high speed operation mode for devices
+     * that do not support high speed output in NORMAL mode.
+     * To support this configuration mode, camera.control.availableHighSpeedVideoConfigurations
+     * should be implemented and CONSTRAINED_HIGH_SPEED should be reported in
+     * camera.request.availableCapabilities.
+     * All streams in this configuration mode operate at high speed mode and have different
+     * characteristics and limitations to achieve high speed output. The NORMAL mode can also be
+     * used for high speed output, if the HAL supports high speed output while satisfying all the
+     * semantics of HAL APIs and metadata controls. It is recommended for the HAL to support high
+     * speed output in NORMAL mode (by advertising the high speed FPS ranges in
+     * camera.control.aeAvailableTargetFpsRanges) if possible.
+     *
+     * This mode has below limitations/requirements:
+     *
+     *   1. The HAL must support up to 2 streams with sizes reported by
+     *       camera.control.availableHighSpeedVideoConfigurations.
+     *   2. In this mode, the HAL is expected to output up to 120fps or higher. It must
+     *       support the targeted FPS range and resolution configurations reported by
+     *       camera.control.availableHighSpeedVideoConfigurations.
+     *   3. To achieve efficient high speed streaming, the HAL may have to aggregate multiple
+     *       frames together and send the batch to camera device for processing there the request
+     *       controls are same for all the frames in this batch (batch mode). The HAL must
+     *       support the max batch size. And the max batch size requirements are defined by
+     *       camera.control.availableHighSpeedVideoConfigurations.
+     *   4. The HAL will override {aeMode, awbMode, afMode} to {ON, ON, CONTINUOUS_VIDEO}.
+     *       All post-processing block mode controls must be overridden to be FAST. Therefore, no
+     *       manual control of capture and post-processing parameters is possible. All other
+     *       controls operate the same as when camera.control.mode == AUTO.
+     *       This means that all other camera.control.* fields must continue to work, such as
+     *           camera.control.aeTargetFpsRange
+     *           camera.control.aeExposureCompensation
+     *           camera.control.aeLock
+     *           camera.control.awbLock
+     *           camera.control.effectMode
+     *           camera.control.aeRegions
+     *           camera.control.afRegions
+     *           camera.control.awbRegions
+     *           camera.control.afTrigger
+     *           camera.control.aePrecaptureTrigger
+     *       Outside of camera.control.*, the following controls must work:
+     *           camera.flash.mode (TORCH mode only, automatic flash for still capture will not
+     *                                           work since aeMode is ON)
+     *           camera.lens.opticalStabilizationMode (if it is supported)
+     *           camera.scaler.cropRegion
+     *           camera.statistics.faceDetectMode (if it is supported)
+     *
+     * TODO: The high speed mode is not completely supported yet.
+     *       1) Now the HAL supports up to 60fps@1080p.
+     *       2) The static metadata camera.control.availableHighSpeedVideoConfigurations should be
+     *           implemented.
+     */
+    CAMERA_STREAM_CONFIGURATION_MODE_CONSTRAINED_HIGH_SPEED = 1,
+
+    /**
+     * CAMERA_STREAM_CONFIGURATION_MODE_AUTO is a configurable mode, but not a real
+     * mode in HAL. The user uses this mode to allow the HAL selects appropriate config mode
+     * internally, so it should NOT be regarded as specific ConfigMode, but operation mode only.
+     *
+     * TuningModes used in AUTO mode depends on ConfigMode the HAL selects.
+     */
+    CAMERA_STREAM_CONFIGURATION_MODE_AUTO,
+    /**
+     * CAMERA_STREAM_CONFIGURATION_MODE_HDR is used to select PSYS pipeline,
+     * TuningMode and MediaCtlConfig HDR pipe.
+     */
+    CAMERA_STREAM_CONFIGURATION_MODE_HDR,
+    /**
+     * CAMERA_STREAM_CONFIGURATION_MODE_ULL is used to select PSYS pipeline,
+     * TuningMode and MediaCtlConfig ULL pipe.
+     */
+    CAMERA_STREAM_CONFIGURATION_MODE_ULL,
+    /**
+     * CAMERA_STREAM_CONFIGURATION_MODE_HLC is used to select PSYS pipeline,
+     * TuningMode and MediaCtlConfig HLC pipe.
+     */
+    CAMERA_STREAM_CONFIGURATION_MODE_HLC,
+    /**
+     * CAMERA_STREAM_CONFIGURATION_MODE_CUSTOM_AIC is used to select PSYS pipeline,
+     * TuningMode and MediaCtlConfig CUSTOM_AIC pipe.
+     */
+    CAMERA_STREAM_CONFIGURATION_MODE_CUSTOM_AIC,
+
+    /**
+     * CAMERA_STREAM_CONFIGURATION_MODE_VIDEO_LL is used to select PSYS pipeline,
+     * TuningMode and MediaCtlConfig Video LL pipe.
+     */
+    CAMERA_STREAM_CONFIGURATION_MODE_VIDEO_LL,
+
+    /**
+     * CAMERA_STREAM_CONFIGURATION_MODE_STILL_CAPTURE is used to select PSYS pipeline,
+     * Create only still pipe
+     * TuningMode and MediaCtlConfig still pipe.
+     */
+    CAMERA_STREAM_CONFIGURATION_MODE_STILL_CAPTURE,
+
+    /**
+     * CAMERA_STREAM_CONFIGURATION_MODE_HDR2 is used to select PSYS pipeline,
+     * TuningMode and MediaCtlConfig HDR2 pipe.
+     */
+    CAMERA_STREAM_CONFIGURATION_MODE_HDR2,
+
+    CAMERA_STREAM_CONFIGURATION_MODE_END
+} camera_stream_configuration_mode_t;
+
+/***************End of Camera Basic Data Structure ****************************/
+
+/*******************Start of Camera Parameters Definition**********************/
+/**
+ * \enum camera_features: camera supportted features.
+ */
+typedef enum {
+    MANUAL_EXPOSURE,       /**< Allow user to controll exposure time and ISO manually */
+    MANUAL_WHITE_BALANCE,  /**< Allow user to controll AWB mode, cct range, and gain */
+    IMAGE_ENHANCEMENT,     /**< Sharpness, Brightness, Contrast, Hue, Saturation */
+    NOISE_REDUCTION,       /**< Allow user to control NR mode and NR level */
+    SCENE_MODE,            /**< Allow user to control scene mode */
+    WEIGHT_GRID_MODE,      /**< Allow user to control custom weight grid mode */
+    PER_FRAME_CONTROL,     /**< Allow user to control most of parameters for each frame */
+    ISP_CONTROL,           /**< Allow user to control low level ISP features */
+    INVALID_FEATURE
+} camera_features;
+typedef std::vector<camera_features> camera_features_list_t;
+
+/**
+ * \struct camera_range_t: Used to specify the range info for something like FPS.
+ */
+typedef struct {
+    float min;
+    float max;
+} camera_range_t;
+typedef std::vector<camera_range_t> camera_range_array_t;
+
+/**
+ * \enum camera_ae_mode_t: Used to control how AE works.
+ */
+typedef enum {
+    AE_MODE_AUTO,   /**< */
+    AE_MODE_MANUAL, /**< */
+    AE_MODE_MAX     /**< Invalid AE mode, any new mode should be added before this */
+} camera_ae_mode_t;
+
+typedef enum {
+    AE_STATE_NOT_CONVERGED,
+    AE_STATE_CONVERGED
+} camera_ae_state_t;
+
+/**
+ * \enum camera_antibanding_mode_t: Used to control antibanding mode.
+ */
+typedef enum {
+    ANTIBANDING_MODE_AUTO, /**< Auto detect the flicker frequency. */
+    ANTIBANDING_MODE_50HZ, /**< Specify the flicker frequency to 50Hz. */
+    ANTIBANDING_MODE_60HZ, /**< Specify the flicker frequency to 60Hz. */
+    ANTIBANDING_MODE_OFF,  /**< Do not try to remove the flicker. */
+} camera_antibanding_mode_t;
+
+/**
+ * \enum camera_scene_mode_t: Used to control scene mode.
+ *
+ * Different scene mode may have different WB effects or different exposure behavior.
+ */
+typedef enum {
+    SCENE_MODE_AUTO,
+    SCENE_MODE_HDR,
+    SCENE_MODE_ULL,
+    SCENE_MODE_HLC,
+    SCENE_MODE_NORMAL,
+    SCENE_MODE_CUSTOM_AIC,
+    SCENE_MODE_VIDEO_LL,
+    SCENE_MODE_STILL_CAPTURE,
+    SCENE_MODE_HDR2,
+    SCENE_MODE_MAX
+} camera_scene_mode_t;
+
+/**
+ * \struct camera_ae_exposure_time_range_t: Provide supported exposure time range info per scene mode.
+ */
+typedef struct {
+    camera_scene_mode_t scene_mode;
+    camera_range_t et_range; /**< The exposure time range whose unit is us. */
+} camera_ae_exposure_time_range_t;
+
+/**
+ * \struct camera_ae_gain_range_t: Provide supported gain range info per scene mode.
+ */
+typedef struct {
+    camera_scene_mode_t scene_mode;
+    camera_range_t gain_range; /**< The available sensor gain range whose unit is db. */
+} camera_ae_gain_range_t;
+
+/*
+ * \enum camera_weight_grid_mode_t: Use to select which customized weight grid should be used.
+ */
+typedef enum {
+    WEIGHT_GRID_AUTO,
+    CUSTOM_WEIGHT_GRID_1,
+    CUSTOM_WEIGHT_GRID_2,
+    CUSTOM_WEIGHT_GRID_3,
+    CUSTOM_WEIGHT_GRID_4,
+    CUSTOM_WEIGHT_GRID_5,
+    CUSTOM_WEIGHT_GRID_6,
+    CUSTOM_WEIGHT_GRID_7,
+    CUSTOM_WEIGHT_GRID_8,
+    CUSTOM_WEIGHT_GRID_9,
+    CUSTOM_WEIGHT_GRID_10,
+    CUSTOM_WEIGHT_GRID_MAX
+} camera_weight_grid_mode_t;
+
+/**
+ * \enum camera_yuv_color_range_mode_t: Specify which YUV color range will be used.
+ */
+typedef enum {
+    CAMERA_FULL_MODE_YUV_COLOR_RANGE,       /*!< Full range (0 - 255) YUV data. */
+    CAMERA_REDUCED_MODE_YUV_COLOR_RANGE     /*!< Reduced range aka. BT.601 (16-235) YUV data range. */
+} camera_yuv_color_range_mode_t;
+
+/**
+ * \enum camera_awb_mode_t: Used to control AWB working mode.
+ */
+typedef enum {
+    AWB_MODE_AUTO,
+    AWB_MODE_INCANDESCENT,
+    AWB_MODE_FLUORESCENT,
+    AWB_MODE_DAYLIGHT,
+    AWB_MODE_FULL_OVERCAST,
+    AWB_MODE_PARTLY_OVERCAST,
+    AWB_MODE_SUNSET,
+    AWB_MODE_VIDEO_CONFERENCE,
+    AWB_MODE_MANUAL_CCT_RANGE,
+    AWB_MODE_MANUAL_WHITE_POINT,
+    AWB_MODE_MANUAL_GAIN,
+    AWB_MODE_MANUAL_COLOR_TRANSFORM,
+    AWB_MODE_MAX
+} camera_awb_mode_t;
+
+typedef enum {
+    AWB_STATE_NOT_CONVERGED,
+    AWB_STATE_CONVERGED
+} camera_awb_state_t;
+
+/**
+ * \enum camera_af_mode_t: Used to control af working mode.
+ *
+ * OFF:
+ * Af algo is disabled, len position is controlled by application if supported.
+ *
+ * AUTO:
+ * In this mode, the lens does not move unless the af trigger is activated.
+ * The af algo will update af state every frame, and lock lens position when action is
+ * completed.
+ * The af trigger can be activated repeatedly.
+ * Cancelling af trigger resets the lens position to default.
+ *
+ * MACRO:
+ * Similar to AUTO and focus on objects very close to the camera.
+ *
+ * CONTINUOUS_VIDEO:
+ * In this mode, the af algo modifies the lens position continually to
+ * attempt to provide a constantly-in-focus image stream.
+ * When the af trigger is activated,  af algo locks the lens position
+ * until a cancel AF trigger is received.
+ *
+ * CONTINUOUS_PICTURE:
+ * Similar to CONTINUOUS_VIDEO, except:
+ * When the af trigger is activated, af algo can finish the current scan
+ * before locking the lens position.
+ *
+ * Please refer to camera_af_trigger_t about how to trigger auto focus.
+ * Please refer to camera_af_state_t about how to get autofocus result.
+ */
+typedef enum {
+    AF_MODE_OFF,
+    AF_MODE_AUTO,
+    AF_MODE_MACRO,
+    AF_MODE_CONTINUOUS_VIDEO,
+    AF_MODE_CONTINUOUS_PICTURE,
+    AF_MODE_MAX,
+} camera_af_mode_t;
+
+/**
+ * \enum camera_af_trigger_t: Used trigger/cancel autofocus
+ *
+ * When af algo is enabled and it is changed to START, the HAL will
+ * trigger autofocus.
+ * When it is changed to CANCEL, the HAL will cancel any active trigger.
+ *
+ * Generally, applications should set it to START or CANCEL for only a
+ * single frame capture, and then return it to IDLE, to get ready for
+ * the next action.
+ */
+typedef enum {
+    AF_TRIGGER_IDLE,
+    AF_TRIGGER_START,
+    AF_TRIGGER_CANCEL,
+} camera_af_trigger_t;
+
+/**
+ * \enum camera_af_state_t: Used to return af state.
+ */
+typedef enum {
+    AF_STATE_IDLE,               /*!< Focus is idle */
+    AF_STATE_LOCAL_SEARCH,       /*!< Focus is in local search state */
+    AF_STATE_EXTENDED_SEARCH,    /*!< Focus is in extended search state */
+    AF_STATE_SUCCESS,            /*!< Focus has succeeded */
+    AF_STATE_FAIL                /*!< Focus has failed */
+} camera_af_state_t;
+
+/**
+ * \enum camera_awb_mode_t: Used to control which preset effect will be used.
+ */
+typedef enum {
+    CAM_EFFECT_NONE = 0,
+    CAM_EFFECT_MONO,
+    CAM_EFFECT_SEPIA,
+    CAM_EFFECT_NEGATIVE,
+    CAM_EFFECT_SKY_BLUE,
+    CAM_EFFECT_GRASS_GREEN,
+    CAM_EFFECT_SKIN_WHITEN_LOW,
+    CAM_EFFECT_SKIN_WHITEN,
+    CAM_EFFECT_SKIN_WHITEN_HIGH,
+    CAM_EFFECT_VIVID,
+} camera_effect_mode_t;
+
+/**
+ * \enum camera_test_pattern_mode_t: Use to control test pattern mode.
+ */
+typedef enum {
+    TEST_PATTERN_OFF = 0,
+    SOLID_COLOR,
+    COLOR_BARS,
+    COLOR_BARS_FADE_TO_GRAY,
+    PN9,
+    TEST_PATTERN_CUSTOM1,
+} camera_test_pattern_mode_t;
+
+/**
+ * \enum camera_tonemap_mode_t: Use to control tonemap mode.
+ */
+typedef enum {
+    TONEMAP_MODE_CONTRAST_CURVE,
+    TONEMAP_MODE_FAST,
+    TONEMAP_MODE_HIGH_QUALITY,
+    TONEMAP_MODE_GAMMA_VALUE,
+    TONEMAP_MODE_PRESET_CURVE,
+} camera_tonemap_mode_t;
+
+/**
+ * \enum camera_tonemap_preset_curve_t: Use to control preset curve type.
+ */
+typedef enum {
+    TONEMAP_PRESET_CURVE_SRGB,
+    TONEMAP_PRESET_CURVE_REC709,
+} camera_tonemap_preset_curve_t;
+
+typedef struct {
+    int32_t rSize;
+    int32_t bSize;
+    int32_t gSize;
+    const float* rCurve;
+    const float* bCurve;
+    const float* gCurve;
+} camera_tonemap_curves_t;
+
+/**
+ * \enum camera_msg_type_t: Use to indicate the type of message sent.
+ */
+typedef enum {
+    CAMERA_EVENT_NONE = 0,
+    CAMERA_ISP_BUF_READY,
+    CAMERA_DEVICE_ERROR,
+    CAMERA_IPC_ERROR,
+} camera_msg_type_t;
+
+/**
+ * \struct Sensor RAW data info for ZSL.
+ */
+typedef struct {
+    long sequence;
+    uint64_t timestamp;
+} sensor_raw_info_t;
+
+/**
+ * \struct isp_buffer_ready_t: Use to send isp buffer ready event data.
+ */
+typedef struct {
+    uint32_t frameNumber;
+    uint64_t timestamp;
+} isp_buffer_ready_t;
+
+/**
+ * \struct camera_msg_data_t: Use to specify msg data.
+ */
+typedef struct {
+    camera_msg_type_t type;
+    union {
+        isp_buffer_ready_t buffer_ready;
+    } data;
+} camera_msg_data_t;
+
+/**
+ * \struct camera_callback_ops_t
+ */
+typedef struct camera_callback_ops {
+    void (*notify)(const camera_callback_ops* cb, const camera_msg_data_t &data);
+} camera_callback_ops_t;
+
+/**
+ * \struct camera_awb_gains_t: Used to specify AWB gain and AWB gain shift.
+ */
+typedef struct {
+    int r_gain;
+    int g_gain;
+    int b_gain;
+} camera_awb_gains_t;
+
+/*!< camera_crop_region_t: Set crop region related parameters*/
+typedef struct {
+    int flag;
+    int x;
+    int y;
+} camera_crop_region_t;
+
+/**
+ * \struct camera_color_transform_t: Specify the color transform matrix.
+ */
+typedef struct {
+    float color_transform[3][3];
+} camera_color_transform_t;
+
+/**
+ * \struct camera_color_gains_t: Specify the color correction gains.
+ */
+typedef struct {
+    float color_gains_rggb[4];
+} camera_color_gains_t;
+
+/**
+ * \enum camera_nr_mode_t: Specify the noise reduction mode.
+ */
+typedef enum {
+    NR_MODE_OFF,
+    NR_MODE_AUTO,
+    NR_MODE_MANUAL_NORMAL,
+    NR_MODE_MANUAL_EXPERT,
+} camera_nr_mode_t;
+
+/**
+ * \struct camera_nr_level_t: Specify the noise reduction level.
+ */
+typedef struct {
+    int overall;
+    int spatial;
+    int temporal;
+} camera_nr_level_t;
+
+/**
+ * \enum camera_iris_mode_t: Specify the IRIS mode.
+ */
+typedef enum {
+    IRIS_MODE_AUTO,
+    IRIS_MODE_MANUAL,
+    IRIS_MODE_CUSTOMIZED,
+} camera_iris_mode_t;
+
+/**
+ * \enum camera_wdr_mode_t: Specify the WDR/HDR mode. (deprecated)
+ */
+typedef enum {
+    WDR_MODE_AUTO,
+    WDR_MODE_ON,
+    WDR_MODE_OFF,
+} camera_wdr_mode_t;
+
+/**
+ * \enum camera_blc_area_mode_t: Switch black area mode.
+ */
+typedef enum {
+    BLC_AREA_MODE_OFF,
+    BLC_AREA_MODE_ON,
+} camera_blc_area_mode_t;
+
+/**
+ * \struct camera_window_t: Used to specify AE/AWB weighted regions.
+ */
+typedef struct {
+    int left;
+    int top;
+    int right;
+    int bottom;
+    int weight;
+} camera_window_t;
+typedef std::vector<camera_window_t> camera_window_list_t;
+
+/**
+ * \struct camera_image_enhancement_t: Used to specify the image enhancement effect.
+ */
+typedef struct {
+    int sharpness;
+    int brightness;
+    int contrast;
+    int hue;
+    int saturation;
+} camera_image_enhancement_t;
+
+/**
+ * \struct camera_coordinate_t: The coordinate of a point in a specified coordinate system.
+ */
+typedef struct {
+    int x;
+    int y;
+} camera_coordinate_t;
+
+/**
+ * \struct camera_coordinate_system_t: Used to specify the coordinate system.
+ */
+typedef struct {
+    int left;   /*!< Left coordinate value in the coordinate system. */
+    int top;    /*!< Top coordinate value in the coordinate system. */
+    int right;  /*!< Right coordinate value in the coordinate system. */
+    int bottom; /*!< Bottom coordinate value in the coordinate system. */
+} camera_coordinate_system_t;
+
+/**
+ * \struct camera_rational_t: Used to present a rational.
+ */
+typedef struct {
+    int numerator;
+    int denominator;
+} camera_rational_t;
+
+/**
+ * \struct camera_awb_result_t: Present AWB result.
+ */
+typedef struct {
+    float r_per_g; /*!< Accurate White Point (R) for the image: relative value*/
+    float b_per_g; /*!< Accurate White Point (B) for the image. relative value*/
+} camera_awb_result_t;
+
+/**
+ * \enum camera_converge_speed_t: Used to control AE/AWB converge speed.
+ */
+typedef enum {
+    CONVERGE_NORMAL,
+    CONVERGE_MID,
+    CONVERGE_LOW,
+    CONVERGE_MAX
+} camera_converge_speed_t;
+
+/**
+ * \enum camera_converge_speed_mode_t: Used to control AE/AWB converge speed mode.
+ */
+typedef enum {
+    CONVERGE_SPEED_MODE_AIQ, /*!< Use AIQ Aglo to control converge speed. */
+    CONVERGE_SPEED_MODE_HAL  /*!< Implement converge speed control in HAL. */
+} camera_converge_speed_mode_t;
+
+/**
+ * \enum camera_ae_distribution_priority_t: Used to control exposure priority mode.
+ */
+typedef enum {
+    DISTRIBUTION_AUTO,    /*!< The AIQ Aglo decides completely */
+    DISTRIBUTION_SHUTTER, /*!< Shutter speed priority mode */
+    DISTRIBUTION_ISO,     /*!< ISO priority mode */
+    DISTRIBUTION_APERTURE /*!< Aperture priority mode */
+} camera_ae_distribution_priority_t;
+
+/**
+ * \enum camera_deinterlace_mode_t: Used to control the deinterlace mode.
+ */
+typedef enum {
+    DEINTERLACE_OFF,    /*!< Do not do any deinterlace */
+    DEINTERLACE_WEAVING /*!< Weave the two frame buffers into one. */
+} camera_deinterlace_mode_t;
+
+/**
+ * \enum camera_fisheye_dewarping_mode_t: Used to control the dewarping mode.
+ */
+typedef enum {
+    FISHEYE_DEWARPING_OFF,
+    FISHEYE_DEWARPING_REARVIEW,
+    FISHEYE_DEWARPING_HITCHVIEW
+} camera_fisheye_dewarping_mode_t;
+
+/**
+ * \enum camera_makernote_mode_t: Used to control makernote mode.
+ */
+typedef enum {
+    MAKERNOTE_MODE_OFF,
+    MAKERNOTE_MODE_JPEG,
+    MAKERNOTE_MODE_RAW
+} camera_makernote_mode_t;
+
+/**
+ * \enum camera_ldc_mode_t: Used to toggle lens distortion correction.
+ */
+typedef enum {
+    LDC_MODE_OFF,
+    LDC_MODE_ON
+} camera_ldc_mode_t;
+
+/**
+ * \enum camera_rsc_mode_t: Used to toggle rolling shutter correction.
+ */
+typedef enum {
+    RSC_MODE_OFF,
+    RSC_MODE_ON
+} camera_rsc_mode_t;
+
+/**
+ * \enum camera_flip_mode_t: Used to set output slip.
+ */
+typedef enum {
+    FLIP_MODE_NONE = 0,
+    FLIP_MODE_VFLIP,
+    FLIP_MODE_HFLIP,
+    FLIP_MODE_VHFLIP
+} camera_flip_mode_t;
+
+/**
+ * \enum camera_mono_downscale_mode_t: Used to enable/disable MONO Downscale.
+ */
+typedef enum {
+    MONO_DS_MODE_OFF,
+    MONO_DS_MODE_ON
+} camera_mono_downscale_mode_t;
+
+/**
+ * \enum camera_video_stabilization_mode_t: Used to control the video stabiliztion mode.
+ */
+typedef enum {
+    VIDEO_STABILIZATION_MODE_OFF,
+    VIDEO_STABILIZATION_MODE_ON
+} camera_video_stabilization_mode_t;
+typedef std::vector<camera_video_stabilization_mode_t> camera_video_stabilization_list_t;
+
+/**
+ * \enum camera_mount_type_t: camera mount type
+ */
+typedef enum {
+    WALL_MOUNTED,
+    CEILING_MOUNTED,
+} camera_mount_type_t;
+
+/**
+* \enum camera_shading_mode_t: camera shading mode type
+*/
+typedef enum {
+    SHADING_MODE_OFF,
+    SHADING_MODE_FAST,
+    SHADING_MODE_HIGH_QUALITY
+} camera_shading_mode_t;
+
+#define MAX_LSC_GRID_WIDTH 64
+#define MAX_LSC_GRID_HEIGHT 64
+#define MAX_LSC_GRID_SIZE (MAX_LSC_GRID_WIDTH * MAX_LSC_GRID_HEIGHT)
+
+/**
+* \enum camera_lens_shading_map_mode_type_t: camera lens shading map mode type
+*/
+typedef enum {
+    LENS_SHADING_MAP_MODE_OFF,
+    LENS_SHADING_MAP_MODE_ON
+} camera_lens_shading_map_mode_type_t;
+
+/**
+ * \class Parameters
+ *
+ * \brief
+ *   Manage parameter's data structure, and provide set and get parameters
+ *
+ * This class provides a thread safe management to internal parameter's data
+ * structure, and helps client to easily set parameters to and get parameters
+ * from camera device.
+ *
+ * \version 0.1
+ *
+ */
+class Parameters {
+public:
+    Parameters();
+    Parameters(const Parameters& other);
+    Parameters& operator=(const Parameters& other);
+    ~Parameters();
+    /**
+     * \brief Merge and update current parameter with other
+     *
+     * \param[in] Parameters other: parameter source
+     *
+     * \return void
+     */
+    void merge(const Parameters& other);
+
+    // Belows are camera capability related parameters operations
+    /**
+     * \brief Get supported fps range list
+     *
+     * \param[out] camera_range_array_t& ranges
+     *
+     * \return 0 if fps range supported, otherwise non-0 value is returned.
+     */
+    int getSupportedFpsRange(camera_range_array_t& ranges) const;
+
+    /**
+     * \brief Get supported Stream Config list
+     *
+     * \param[out] supported_stream_config_array_t& config
+     *
+     * \return 0 if Stream Configs supported, otherwise non-0 value is returned.
+     */
+    int getSupportedStreamConfig(supported_stream_config_array_t& config) const;
+
+    // Belows are camera capability related parameters operations
+    /**
+     * \brief Get supported sensor exposure time range (microsecond)
+     *
+     * \param[out] camera_range_t& range
+     *
+     * \return 0 if it is supported, otherwise non-0 value is returned.
+     */
+    int getSupportedSensorExposureTimeRange(camera_range_t& range) const;
+
+    // Belows are camera capability related parameters operations
+    /**
+     * \brief Get supported sensor sensitivity time range
+     *
+     * \param[out] camera_range_t& range
+     *
+     * \return 0 if it is supported, otherwise non-0 value is returned.
+     */
+    int getSupportedSensorSensitivityRange(camera_range_t& range) const;
+
+    /**
+     * \brief Get supported feature list.
+     *
+     * Camera application MUST check if the feature is supported before trying to enable it.
+     * Otherwise the behavior is undefined currently, HAL may just ignore the request.
+     *
+     * \param[out] camera_features_list_t& features: All supported feature will be filled in "features"
+     *
+     * \return: If no feature supported, features will be empty
+     */
+    int getSupportedFeatures(camera_features_list_t& features) const;
+
+    /**
+     * \brief Get ae compensation range supported by camera device
+     *
+     * \param[out] camera_range_t& evRange
+     *
+     * \return 0 if ae compensation supported, non-0 or evRange equals [0, 0] means ae compensation not supported.
+     */
+    int getAeCompensationRange(camera_range_t& evRange) const;
+
+    /**
+     * \brief Get ae compensation step supported by camera device
+     *
+     * Smallest step by which the exposure compensation can be changed.
+     * This is the unit for setAeCompensation. For example, if this key has
+     * a value of `1/2`, then a setting of `-2` for setAeCompensation means
+     * that the target EV offset for the auto-exposure routine is -1 EV.
+     *
+     * One unit of EV compensation changes the brightness of the captured image by a factor
+     * of two. +1 EV doubles the image brightness, while -1 EV halves the image brightness.
+     *
+     * \param[out] camera_rational_t& evStep
+     *
+     * \return 0 if ae compensation supported, non-0 means ae compensation not supported.
+     */
+    int getAeCompensationStep(camera_rational_t& evStep) const;
+
+    /**
+     * \brief Get supported manual exposure time range
+     *
+     * Different sensors or same sensor in different settings may have different supported exposure
+     * time range, so camera application needs to use this API to check if the user's settings is
+     * in the supported range, if application pass an out of exposure time, HAL will clip it
+     * according to this supported range.
+     *
+     * \param[out] vector<camera_ae_exposure_time_range_t>& etRanges
+     *
+     * \return 0 if exposure time range is filled by HAL.
+     */
+    int getSupportedAeExposureTimeRange(std::vector<camera_ae_exposure_time_range_t>& etRanges) const;
+
+    /**
+     * \brief Get supported manual sensor gain range
+     *
+     * Different sensors or same sensor in different settings may have different supported sensor
+     * gain range, so camera application needs to use this API to check if the user's settings is
+     * in the supported range, if application pass an out of range gain, HAL will clip it according
+     * to this supported range.
+     *
+     * \param[out] vector<camera_ae_gain_range_t>& gainRanges
+     *
+     * \return 0 if exposure time range is filled by HAL.
+     */
+    int getSupportedAeGainRange(std::vector<camera_ae_gain_range_t>& gainRanges) const;
+
+    // Belows are AE related parameters operations
+    /**
+     * \brief Set exposure mode(auto/manual).
+     *
+     * "auto" means 3a algorithm will control exposure time and gain automatically.
+     * "manual" means user can control exposure time or gain, or both of them.
+     * Under manual mode, if user only set one of exposure time or gain, then 3a algorithm
+     * will help to calculate the other one.
+     *
+     * \param[in] camera_ae_mode_t aeMode
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAeMode(camera_ae_mode_t aeMode);
+
+    /**
+     * \brief Get exposure mode
+     *
+     * \param[out] aeMode: Currently used ae mode will be set to aeMode if 0 is returned.
+     *
+     * \return 0 if exposure mode was set, otherwise non-0 value is returned.
+     */
+    int getAeMode(camera_ae_mode_t& aeMode) const;
+
+    /**
+     * \brief Set AE state.
+     *
+     * \param[in] camera_ae_state_t aeState
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAeState(camera_ae_state_t aeState);
+
+    /**
+     * \brief Get AE state
+     *
+     * \param[out] aeState: Currently AE state will be set to aeState if 0 is returned.
+     *
+     * \return 0 if AE state was set, otherwise non-0 value is returned.
+     */
+    int getAeState(camera_ae_state_t& aeState) const;
+
+    /**
+     * \brief Set ae lock
+     *
+     * \param[in] bool lock
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAeLock(bool lock);
+
+    /**
+     * \brief Get ae lock
+     *
+     * \param[out] bool lock
+     *
+     * \return 0 if lock was set, otherwise non-0 value is returned.
+     */
+    int getAeLock(bool& lock) const;
+
+    /**
+     * \brief Get supported video stabilization mode
+     *
+     * Camera application MUST check if the video stabilization mode is supported before trying
+     * to enable it. Otherwise one error occuring, HAL may just ignore the request.
+     *
+     * \param[out] supportedModes: All supported video stabilization mode will be filled in "supportedModes"
+     *
+     * \return: If no mode supported, supportedModes will be empty
+     */
+    int getSupportedVideoStabilizationMode(camera_video_stabilization_list_t &supportedModes) const;
+
+    /**
+     * \brief Get supported ae mode
+     *
+     * Camera application MUST check if the ae mode is supported before trying to enable it.
+     * Otherwise one error occuring, HAL may just ignore the request.
+     *
+     * \param[out] supportedAeModes: All supported ae mode will be filled in "supportedAeModes"
+     *
+     * \return: If no ae mode supported, supportedAeModes will be empty
+     */
+    int getSupportedAeMode(std::vector<camera_ae_mode_t> &supportedAeModes) const;
+
+    /**
+     * \brief Get supported awb mode
+     *
+     * Camera application MUST check if the awb mode is supported before trying to enable it.
+     * Otherwise one error occuring, HAL may just ignore the request.
+     *
+     * \param[out] supportedAwbModes: All supported awb mode will be filled in "supportedAwbModes"
+     *
+     * \return: If no awb mode supported, supportedAwbModes will be empty
+     */
+    int getSupportedAwbMode(std::vector<camera_awb_mode_t> &supportedAwbModes) const;
+
+    /**
+     * \brief Get supported af mode
+     *
+     * Camera application MUST check if the af mode is supported before trying to enable it.
+     * Otherwise one error occuring, HAL may just ignore the request.
+     *
+     * \param[out] supportedAfModes: All supported af mode will be filled in "supportedAfModes"
+     *
+     * \return: If no af mode supported, supportedAfModes will be empty
+     */
+    int getSupportedAfMode(std::vector<camera_af_mode_t> &supportedAfModes) const;
+
+    /**
+     * \brief Get supported scene mode
+     *
+     * Camera application MUST check if the scene mode is supported before trying to enable it.
+     * Otherwise one error occuring, HAL may just ignore the request.
+     *
+     * \param[out] supportedSceneModes: All supported scene mode will be filled in "supportedSceneModes"
+     *
+     * \return: If no scene mode supported, supportedSceneModes will be empty
+     */
+    int getSupportedSceneMode(std::vector<camera_scene_mode_t> &supportedSceneModes) const;
+
+    /**
+     * \brief Get supported antibanding mode
+     *
+     * Camera application MUST check if the antibanding mode is supported before trying to enable it.
+     * Otherwise one error occuring, HAL may just ignore the request.
+     *
+     * \param[out] supportedAntibindingModes: All supported scene mode will be filled in "supportedAntibindingModes"
+     *
+     * \return: If no antibanding mode supported, supportedAntibindingModes will be empty
+     */
+    int getSupportedAntibandingMode(std::vector<camera_antibanding_mode_t> &supportedAntibindingModes) const;
+
+    /**
+     * \brief Get if ae lock is available
+     *
+     * Camera application MUST check if ae lock is supported before trying to lock it.
+     * Otherwise one error occuring, HAL may just ignore the request.
+     *
+     * \return: true if lock is supported, false if not
+     */
+    bool getAeLockAvailable() const;
+
+    /**
+     * \brief Get if awb lock is available
+     *
+     * Camera application MUST check if awb lock is supported before trying to lock it.
+     * Otherwise one error occuring, HAL may just ignore the request.
+     *
+     * \return: true if lock is supported, false if not
+     */
+    bool getAwbLockAvailable() const;
+
+    /**
+     * \brief Set AE region
+     *
+     * Current only fisrt region can take effect when BLC mode is BLC_AREA_MODE_ON;
+     * if BLC_AREA_MODE_OFF, AE region function will be diabled.
+     *
+     * \param[in] camera_window_list_t aeRegions
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAeRegions(camera_window_list_t aeRegions);
+
+    /**
+     * \brief Get AE region
+     *
+     * \param[out] camera_window_list_t aeRegions
+     *
+     * \return 0 if aeRegions were set, otherwise non-0 value is returned.
+     */
+    int getAeRegions(camera_window_list_t& aeRegions) const;
+
+    /**
+     * \brief Set exposure time whose unit is microsecond(us).
+     *
+     * The exposure time only take effect when ae mode set to manual.
+     *
+     * \param[in] int64_t exposureTime
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setExposureTime(int64_t exposureTime);
+
+    /**
+     * \brief Get exposure time whose unit is microsecond(us).
+     *
+     * \param[out] int64_t& exposureTime: exposure time if be set in exposureTime if 0 is returned.
+     *
+     * \return 0 if exposure time was set, non-0 means no exposure time was set.
+     */
+    int getExposureTime(int64_t& exposureTime) const;
+
+    /**
+     * \brief Set sensor gain whose unit is db.
+     * The sensor gain only take effect when ae mode set to manual.
+     *
+     * \param[in] float gain
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setSensitivityGain(float gain);
+
+    /**
+     * \brief Get sensor gain whose unit is db.
+     *
+     * \param[out] float gain
+     *
+     * \return 0 if sensor gain was set, non-0 means no sensor gain was set.
+     */
+    int getSensitivityGain(float& gain) const;
+
+    /**
+     * \brief Set ae compensation whose unit is compensation step.
+     *
+     * The adjustment is measured as a count of steps, with the
+     * step size defined ae compensation step and the allowed range by ae compensation range.
+     *
+     * For example, if the exposure value (EV) step is 0.333, '6'
+     * will mean an exposure compensation of +2 EV; -3 will mean an
+     * exposure compensation of -1 EV. One EV represents a doubling of image brightness.
+     *
+     * In the event of exposure compensation value being changed, camera device
+     * may take several frames to reach the newly requested exposure target.
+     *
+     * \param[in] int ev
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAeCompensation(int ev);
+
+    /**
+     * \brief Get ae compensation whose unit is compensation step.
+     *
+     * \param[out] int ev
+     *
+     * \return 0 if ae compensation was set, non-0 means no ae compensation was set.
+     */
+    int getAeCompensation(int& ev) const;
+
+    /**
+     * \brief Set frame rate
+     *
+     * \param[in] float fps
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setFrameRate(float fps);
+
+    /**
+     * \brief Get frame rate
+     *
+     * \param[out] float& fps
+     *
+     * \return 0 if frame rate was set, otherwise non-0 value is returned.
+     */
+    int getFrameRate(float& fps) const;
+
+    /**
+     * \brief Set antibanding mode
+     *
+     * \param[in] camera_antibanding_mode_t bandingMode
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAntiBandingMode(camera_antibanding_mode_t bandingMode);
+
+    /**
+     * \brief Get antibanding mode
+     *
+     * \param[out] camera_antibanding_mode_t& bandingMode
+     *
+     * \return 0 if antibanding mode was set, otherwise non-0 value is returned.
+     */
+    int getAntiBandingMode(camera_antibanding_mode_t& bandingMode) const;
+
+    /**
+     * \brief Set AE distribution priority.
+     *
+     * \param[in] camera_ae_distribution_priority_t priority: the AE distribution priority to be set.
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAeDistributionPriority(camera_ae_distribution_priority_t priority);
+
+    /**
+     * \brief Get AE distribution priority.
+     *
+     * \param[out] camera_ae_distribution_priority_t priority: the AE distribution priority.
+     *
+     * \return 0 if get successfully, otherwise non-0 value is returned.
+     */
+    int getAeDistributionPriority(camera_ae_distribution_priority_t& priority) const;
+
+    /**
+     * \brief set exposure time range
+     *
+     * \param[in] camera_range_t: the exposure time range to be set.
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setExposureTimeRange(camera_range_t exposureTimeRange);
+
+    /**
+     * \brief get exposure time range
+     *
+     * \param[out] camera_range_t: the exposure time had been set.
+     *
+     * \return 0 if get successfully, otherwise non-0 value is returned.
+     */
+    int getExposureTimeRange(camera_range_t& exposureTimeRange) const;
+
+    /**
+     * \brief set sensitivity gain range
+     *
+     * \param[in] camera_range_t: the sensitivity gain range(the unit is db) to be set.
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setSensitivityGainRange(camera_range_t sensitivityGainRange);
+
+    /**
+     * \brief get sensitivity gain range
+     *
+     * \param[out] camera_range_t: the sensitivity gain(the unit is db) had been set.
+     *
+     * \return 0 if get successfully, otherwise non-0 value is returned.
+     */
+    int getSensitivityGainRange(camera_range_t& sensitivityGainRange) const;
+
+    /**
+     * \brief Set weight grid mode
+     *
+     * \param[in] camera_weight_grid_mode_t weightGridMode
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setWeightGridMode(camera_weight_grid_mode_t weightGridMode);
+
+    /**
+     * \brief Get weight grid mode
+     *
+     * \param[out] camera_weight_grid_mode_t& weightGridMode
+     *
+     * \return 0 if weight grid mode was set, otherwise non-0 value is returned.
+     */
+    int getWeightGridMode(camera_weight_grid_mode_t& weightGridMode) const;
+
+    /**
+     * \brief Set BLC (backlight compensation) area mode
+     *
+     * \param[in] camera_blc_area_mode_t blcAreaMode
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setBlcAreaMode(camera_blc_area_mode_t blcAreaMode);
+
+    /**
+     * \brief Get BLC (backlight compensation) area mode
+     *
+     * \param[out] camera_blc_area_mode_t& blcAreaMode
+     *
+     * \return 0 if BLC area mode was set, otherwise non-0 value is returned.
+     */
+    int getBlcAreaMode(camera_blc_area_mode_t& blcAreaMode) const;
+
+    int setFpsRange(camera_range_t fpsRange);
+    int getFpsRange(camera_range_t& fpsRange) const;
+
+    // Belows are AWB related parameters operations
+    /**
+     * \brief Set white balance mode
+     *
+     * White balance mode could be one of totally auto, preset cct range, customized cct range, customized
+     * white area, customize gains.
+     *
+     * \param[in] camera_awb_mode_t awbMode
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAwbMode(camera_awb_mode_t awbMode);
+
+    /**
+     * \brief Get white balance mode currently used.
+     *
+     * \param[out] camera_awb_mode_t& awbMode
+     *
+     * \return 0 if awb mode was set, non-0 means no awb mode was set.
+     */
+    int getAwbMode(camera_awb_mode_t& awbMode) const;
+
+    /**
+     * \brief Set AWB state.
+     *
+     * \param[in] camera_awb_state_t awbState
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAwbState(camera_awb_state_t awbState);
+
+    /**
+     * \brief Get AWB state
+     *
+     * \param[out] awbState: Currently AWB state will be set to awbState if 0 is returned.
+     *
+     * \return 0 if AWB state was set, otherwise non-0 value is returned.
+     */
+    int getAwbState(camera_awb_state_t& awbState) const;
+
+    /**
+     * \brief Set awb lock
+     *
+     * \param[in] bool lock
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAwbLock(bool lock);
+
+    /**
+     * \brief Get awb lock
+     *
+     * \param[out] bool lock
+     *
+     * \return 0 if lock was set, otherwise non-0 value is returned.
+     */
+    int getAwbLock(bool& lock) const;
+
+    /**
+     * \brief Set customized cct range.
+     *
+     * Customized cct range only take effect when awb mode is set to AWB_MODE_MANUAL_CCT_RANGE
+     *
+     * \param[in] camera_range_t cct range, which specify min and max cct for 3a algorithm to use.
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAwbCctRange(camera_range_t cct);
+
+    /**
+     * \brief Get customized cct range currently used.
+     *
+     * \param[out] camera_range_t& cct range
+     *
+     * \return 0 if cct range was set, non-0 means no cct range was set.
+     */
+    int getAwbCctRange(camera_range_t& cct) const;
+
+    /**
+     * \brief Set customized awb gains.
+     *
+     * Customized awb gains only take effect when awb mode is set to AWB_MODE_MANUAL_GAIN
+     *
+     * The range of each gain is (0, 255).
+     *
+     * \param[in] camera_awb_gains_t awb gains, which specify r,g,b gains for overriding awb result.
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAwbGains(camera_awb_gains_t awbGains);
+
+    /**
+     * \brief Get customized awb gains currently used.
+     *
+     * \param[out] camera_awb_gains_t& awb gains
+     *
+     * \return 0 if awb gain was set, non-0 means no awb gain was set.
+     */
+    int getAwbGains(camera_awb_gains_t& awbGains) const;
+
+    /**
+     * \brief Set awb gain shift.
+     *
+     * Customized awb gain shift only take effect when awb mode is NOT set to AWB_MODE_MANUAL_GAIN
+     *
+     * The range of each gain shift is (0, 255).
+     *
+     * \param[in] camera_awb_gains_t awb gain shift, which specify r,g,b gains for updating awb result.
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAwbGainShift(camera_awb_gains_t awbGainShift);
+
+    /**
+     * \brief Get customized awb gains shift currently used.
+     *
+     * \param[out] camera_awb_gains_t& awb gain shift
+     *
+     * \return 0 if awb gain shift was set, non-0 means no awb gain shift was set.
+     */
+    int getAwbGainShift(camera_awb_gains_t& awbGainShift) const;
+
+    /**
+     * \brief Set awb result.
+     *
+     * \param[in] data: The data used to override awb result.
+     *
+     * Note: data is allocated by the caller and NULL is for erasing the param.
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAwbResult(void *data);
+
+    /**
+     * \brief Get awb result currently used.
+     *
+     * \param[out] data: the awb result pointer to user
+     *
+     * Note: data is allocated by the caller and it must never be NULL.
+     *
+     * \return 0 if get successfully, otherwise non-0 value is returned.
+     */
+    int getAwbResult(void *data) const;
+
+    /**
+     * \brief Set manual white point coordinate.
+     *
+     * Only take effect when awb mode is set to AWB_MODE_MANUAL_WHITE_POINT.
+     * The coordinate system is based on frame which is currently displayed.
+     *
+     * \param[in] camera_coordinate_t white point
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAwbWhitePoint(camera_coordinate_t whitePoint);
+
+    /**
+     * \brief Get manual white point coordinate.
+     *
+     * \param[out] camera_coordinate_t& white point
+     *
+     * \return 0 if white point was set, non-0 means no white point was set.
+     */
+    int getAwbWhitePoint(camera_coordinate_t& whitePoint) const;
+
+    /**
+     * \brief Set customized color transform which is a 3x3 matrix.
+     *
+     *  Manual color transform only takes effect when awb mode set to AWB_MODE_MANUAL_COLOR_TRANSFORM.
+     *
+     * \param[in] camera_color_transform_t colorTransform: a 3x3 matrix for color convertion.
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setColorTransform(camera_color_transform_t colorTransform);
+
+    /**
+     * \brief Get color transform matrix currently used.
+     *
+     * \param[out] camera_color_transform_t& color transform matrix
+     *
+     * \return 0 if color transform matrix was set, non-0 means no color transform matrix was set.
+     */
+    int getColorTransform(camera_color_transform_t& colorTransform) const;
+
+    /**
+     * \brief Set customized color correction gains which is a 4 array.
+     *
+     *  Manual color correction gains only takes effect when awb mode set to AWB_MODE_MANUAL_COLOR_TRANSFORM.
+     *
+     * \param[in] camera_color_gains_t colorGains: a 4 array for color correction gains.
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setColorGains(camera_color_gains_t colorGains);
+    /**
+     * \brief Get color correction gains currently used.
+     *
+     * \param[out] camera_color_gains_t& color correction gains
+     *
+     * \return 0 if color correction gains was set, non-0 means no color correction gains was set.
+     */
+    int getColorGains(camera_color_gains_t& colorGains) const;
+
+    int setAwbRegions(camera_window_list_t awbRegions);
+    int getAwbRegions(camera_window_list_t& awbRegions) const;
+
+    // Belows are convergence speed related parameters operations
+    /**
+     * \brief Set customized Ae converge speed.
+     *
+     * \param[in] camera_converge_speed_t speed: the converge speed to be set.
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAeConvergeSpeed(camera_converge_speed_t speed);
+
+    /**
+     * \brief Get customized Ae converge speed.
+     *
+     * \param[out] camera_converge_speed_t& speed: the converge speed been set.
+     *
+     * \return 0 if get successfully, otherwise non-0 value is returned.
+     */
+    int getAeConvergeSpeed(camera_converge_speed_t& speed) const;
+
+    /**
+     * \brief Set customized Awb converge speed.
+     *
+     * \param[in] camera_converge_speed_t speed: the converge speed to be set.
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAwbConvergeSpeed(camera_converge_speed_t speed);
+
+    /**
+     * \brief Get customized Awb converge speed.
+     *
+     * \param[out] camera_converge_speed_t& speed: the converge speed been set.
+     *
+     * \return 0 if get successfully, otherwise non-0 value is returned.
+     */
+    int getAwbConvergeSpeed(camera_converge_speed_t& speed) const;
+
+    /**
+     * \brief Set customized Ae converge speed mode.
+     *
+     * \param[in] camera_converge_speed_mode_t mode: the converge speed mode to be set.
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAeConvergeSpeedMode(camera_converge_speed_mode_t mode);
+
+    /**
+     * \brief Get customized Ae converge speed mode.
+     *
+     * \param[out] camera_converge_speed_mode_t mode: the converge speed mode to be set.
+     *
+     * \return 0 if get successfully, otherwise non-0 value is returned.
+     */
+    int getAeConvergeSpeedMode(camera_converge_speed_mode_t& mode) const;
+
+    /**
+     * \brief Set customized Awb converge speed mode.
+     *
+     * \param[in] camera_converge_speed_mode_t mode: the converge speed mode to be set.
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAwbConvergeSpeedMode(camera_converge_speed_mode_t mode);
+
+    /**
+     * \brief Get customized Awb converge speed mode.
+     *
+     * \param[out] camera_converge_speed_mode_t mode: the converge speed mode to be set.
+     *
+     * \return 0 if get successfully, otherwise non-0 value is returned.
+     */
+    int getAwbConvergeSpeedMode(camera_converge_speed_mode_t& mode) const;
+
+    // Belows are ISP related parameters operations
+    int setNrMode(camera_nr_mode_t nrMode);
+    int getNrMode(camera_nr_mode_t& nrMode) const;
+
+    int setNrLevel(camera_nr_level_t level);
+    int getNrLevel(camera_nr_level_t& level) const;
+
+    /**
+     * \brief Set YUV color range mode
+     *
+     * \param[in] camera_yuv_color_range_mode_t colorRange: the YUV color range mode to be set.
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setYuvColorRangeMode(camera_yuv_color_range_mode_t colorRange);
+
+    /**
+     * \brief Get YUV color range mode
+     *
+     * \param[out] camera_yuv_color_range_mode_t colorRange: the YUV color range mode.
+     *
+     * \return 0 if get successfully, otherwise non-0 value is returned.
+     */
+    int getYuvColorRangeMode(camera_yuv_color_range_mode_t & colorRange) const;
+
+    /**
+     * \brief Set customized effects.
+     *
+     * One of sharpness, brightness, contrast, hue, saturation could be controlled by this API.
+     * Valid range should be [-128, 127]
+     *
+     * \param[in] camera_image_enhancement_t effects
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setImageEnhancement(camera_image_enhancement_t effects);
+
+    /**
+     * \brief Get customized effects.
+     *
+     * \param[out] effects
+     *
+     * \return 0 if effects was set, non-0 return value means no effects was set.
+     */
+    int getImageEnhancement(camera_image_enhancement_t& effects) const;
+
+    // Belows are other parameters operations
+    int setIrisMode(camera_iris_mode_t irisMode);
+    int getIrisMode(camera_iris_mode_t& irisMode);
+
+    int setIrisLevel(int level);
+    int getIrisLevel(int& level);
+
+    /**
+     * \brief Set WDR Level
+     *
+     * \param[in] uint8_t level
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setWdrLevel(uint8_t level);
+
+    /**
+     * \brief Get WDR level currently used.
+     *
+     * \param[out] uint8_t& level
+     *
+     * \return 0 if get WDR level, non-0 means error.
+     */
+    int getWdrLevel(uint8_t& level) const;
+
+    /**
+     * \brief Set effect scene mode
+     *
+     * \param[in] camera_scene_mode_t: scene mode
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setEffectSceneMode(camera_scene_mode_t sceneMode);
+
+    /**
+     * \brief Get effect scene mode based on runtime
+     *
+     * \param[out] camera_scene_mode_t&: scene mode
+     *
+     * \return 0 if get scene mode, non-0 means error.
+     */
+    int getEffectSceneMode(camera_scene_mode_t& sceneMode) const;
+
+    /**
+     * \brief Set scene mode
+     *
+     * \param[in] camera_scene_mode_t: scene mode
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setSceneMode(camera_scene_mode_t sceneMode);
+
+    /**
+     * \brief Get scene mode current set by user.
+     *
+     * \param[out] camera_scene_mode_t&: scene mode
+     *
+     * \return 0 if get scene mode, non-0 means error.
+     */
+    int getSceneMode(camera_scene_mode_t& sceneMode) const;
+
+    /**
+     * \brief Set deinterlace mode
+     *
+     * \param[in] camera_deinterlace_mode_t deinterlaceMode
+     *
+     * Setting deinterlace mode only takes effect before camera_device_config_streams called
+     * That's it cannot be changed after camera_device_config_streams.
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setDeinterlaceMode(camera_deinterlace_mode_t deinterlaceMode);
+
+    /**
+     * \brief Get deinterlace mode
+     *
+     * \param[out] camera_deinterlace_mode_t& deinterlaceMode
+     *
+     * \return 0 if deinterlace mode was set, non-0 means no deinterlace mode was set.
+     */
+    int getDeinterlaceMode(camera_deinterlace_mode_t &deinterlaceMode) const;
+
+    /**
+     * \brief Set Makernote Data
+     *
+     * \param[in] const void* data: the pointer of data.
+     * \param[in] unsigned int size: the size of the data.
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setMakernoteData(const void* data, unsigned int size);
+
+    /**
+     * \brief Get Makernote Data
+     *
+     * \param[out] void* data: the pointer of destination buffer.
+     * \param[in/out] in: the buffer size; out: the buffer used size.
+     *
+     * \return 0 if get successfully, otherwise non-0 value is returned.
+     */
+    int getMakernoteData(void* data, unsigned int* size) const;
+
+    /**
+     * \brief Set Custom Aic Param
+     *
+     * \param[in] const void* data: the pointer of data.
+     * \param[in] int length: the length of the data.
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setCustomAicParam(const void* data, unsigned int length);
+
+    /**
+     * \brief Get Custom Aic Param
+     *
+     * \param[out] void* data: the pointer of destination buffer.
+     * \param[in/out] in: the buffer size; out: the buffer used size.
+     *
+     * \return 0 if get successfully, otherwise non-0 value is returned.
+     */
+    int getCustomAicParam(void* data, unsigned int* length) const;
+
+    /**
+     * \brief Set makernote mode
+     *
+     * \param[in] camera_makernote_mode_t mode
+     *
+     * \return 0 if get successfully, otherwise non-0 value is returned.
+     */
+    int setMakernoteMode(camera_makernote_mode_t mode);
+
+    /**
+     * \brief get makernote mode
+     *
+     * \param[out] camera_makernote_mode_t &mode
+     *
+     * \return 0 if makernote mode was set, otherwise return non-0 value.
+     */
+    int getMakernoteMode(camera_makernote_mode_t &mode) const;
+
+    /**
+     * \brief Set digital zoom ratio
+     *
+     * \param[in] float ratio
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setDigitalZoomRatio(float ratio);
+
+    /**
+     * \brief Get digital zoom ratio
+     *
+     * \param[out] float& ratio
+     *
+     * \return 0 if find the corresponding data, otherwise non-0 value is returned.
+     */
+    int getDigitalZoomRatio(float& ratio) const;
+
+    /**
+     * \brief Set lens distortion correction mode
+     *
+     * \param[in] camera_ldc_mode_t mode
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setLdcMode(camera_ldc_mode_t mode);
+
+    /**
+     * \brief Get lens distortion correction mode
+     *
+     * \param[out] camera_ldc_mode_t& mode
+     *
+     * \return 0 if find the corresponding data, otherwise non-0 value is returned.
+     */
+    int getLdcMode(camera_ldc_mode_t &mode) const;
+
+    /**
+     * \brief Set rolling shutter correction mode
+     *
+     * \param[in] camera_rsc_mode_t mode
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setRscMode(camera_rsc_mode_t mode);
+
+    /**
+     * \brief Get rolling shutter correction mode
+     *
+     * \param[out] camera_rsc_mode_t& mode
+     *
+     * \return 0 if find the corresponding data, otherwise non-0 value is returned.
+     */
+    int getRscMode(camera_rsc_mode_t &mode) const;
+
+    /**
+     * \brief flip mode
+     *
+     * \param[in] camera_flip_mode_t mode
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setFlipMode(camera_flip_mode_t mode);
+
+    /**
+     * \brief Get flip mode
+     *
+     * \param[out] camera_flip_mode_t& mode
+     *
+     * \return 0 if find the corresponding data, otherwise non-0 value is returned.
+     */
+    int getFlipMode(camera_flip_mode_t &mode) const;
+
+    /**
+     * \brief set frame interval to run 3A
+     *
+     * \param[in] int cadence which is frame interval
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setRun3ACadence(int cadence);
+
+    /**
+     * \brief Get frame interval to run 3A
+     *
+     * \param[out] int& cadence which is frame interval
+     *
+     * \return 0 if find the corresponding data, otherwise non-0 value is returned.
+     */
+    int getRun3ACadence(int &cadence) const;
+
+    /**
+     * \brief mono downscale mode
+     *
+     * \param[in] camera_mono_downscale_mode_t mode
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setMonoDsMode(camera_mono_downscale_mode_t mode);
+
+    /**
+     * \brief Get mono downscale mode
+     *
+     * \param[out] camera_mono_downscale_mode_t& mode
+     *
+     * \return 0 if find the corresponding data, otherwise non-0 value is returned.
+     */
+    int getMonoDsMode(camera_mono_downscale_mode_t &mode) const;
+
+    /**
+     * \brief Set Fisheye Dewarping Mode
+     *
+     * \param[in] camera_fisheye_dewarping_mode_t dewarpingMode
+     *
+     * Setting dewarping mode only takes effect before camera_device_config_streams called
+     * That's it cannot be changed after camera_device_config_streams.
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setFisheyeDewarpingMode(camera_fisheye_dewarping_mode_t dewarpingMode);
+
+    /**
+     * \brief Get Fisheye Dewarping Mode
+     *
+     * \param[out] camera_fisheye_dewarping_mode_t &dewarpingMode
+     *
+     * \return 0 if dewarping mode was set, non-0 means no dewarping mode was set.
+     */
+    int getFisheyeDewarpingMode(camera_fisheye_dewarping_mode_t &dewarpingMode) const;
+
+    // Belows are Jpeg related parameters operations
+    int getJpegQuality(uint8_t *quality) const;
+    int setJpegQuality(uint8_t quality);
+
+    int getJpegThumbnailQuality(uint8_t *quality) const;
+    int setJpegThumbnailQuality(uint8_t quality);
+
+    int setJpegThumbnailSize(const camera_resolution_t& res);
+    int getJpegThumbnailSize(camera_resolution_t& res) const;
+
+    int getJpegRotation(int &rotation) const;
+    int setJpegRotation(int  rotation);
+
+    int setJpegGpsCoordinates(const double *coordinates);
+    int getJpegGpsLatitude(double &latitude) const;
+    int getJpegGpsLongitude(double &longitude) const;
+    int getJpegGpsAltitude(double &altiude) const;
+
+    int getJpegGpsTimeStamp(int64_t &timestamp) const;
+    int setJpegGpsTimeStamp(int64_t  timestamp);
+
+    int getJpegGpsProcessingMethod(int &processMethod) const;
+    int setJpegGpsProcessingMethod(int  processMethod);
+
+    int getJpegGpsProcessingMethod(int size, char* processMethod) const;
+    int setJpegGpsProcessingMethod(const char* processMethod);
+
+    int getImageEffect(camera_effect_mode_t &effect) const;
+    int setImageEffect(camera_effect_mode_t  effect);
+
+    int getVideoStabilizationMode(camera_video_stabilization_mode_t &mode) const;
+    int setVideoStabilizationMode(camera_video_stabilization_mode_t mode);
+
+    int getFocalLength(float &focal) const;
+    int setFocalLength(float focal);
+
+    /**
+     * \brief Get aperture value currently used
+     *
+     * \param[in] float& aperture
+     *
+     * \return 0 if aperture was set, non=0 means no aperture was set
+     */
+    int getAperture(float &aperture) const;
+    /**
+     * \brief Set aperture value
+     *
+     * \param[in] float aperture
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAperture(float aperture);
+
+    /**
+     * \brief Get focus distance value currently used
+     *
+     * \param[in] float& distance
+     *
+     * \return 0 if distance was set, non-0 means no focus distance was set
+     */
+    int getFocusDistance(float &distance) const;
+    /**
+     * \brief Set focus distance value
+     *
+     * \param[in] float distance
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setFocusDistance(float distance);
+
+    /**
+     * \brief Get focus range value currently used
+     *
+     * \param[in] camera_range_t& focusRange
+     *
+     * \return 0 if focus range was set, non-0 means no focus range was set
+     */
+    int getFocusRange(camera_range_t& focusRange) const;
+    /**
+     * \brief Set focus range value
+     *
+     * \param[in] camera_range_t focusRange
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setFocusRange(const camera_range_t& focusRange);
+
+    /**
+     * \brief Set af mode
+     *
+     * \param[in] camera_af_mode_t afMode
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAfMode(camera_af_mode_t afMode);
+
+    /**
+     * \brief Get af mode currently used.
+     *
+     * \param[out] camera_af_mode_t& afMode
+     *
+     * \return 0 if af mode was set, non-0 means no af mode was set.
+     */
+    int getAfMode(camera_af_mode_t& afMode) const;
+
+    /**
+     * \brief Trigger or cancel auto focus
+     *
+     * \param[in] camera_af_trigger_t afTrigger
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAfTrigger(camera_af_trigger_t afTrigger);
+
+    /**
+     * \brief Get auto focus trigger value
+     *
+     * \param[out] camera_af_trigger_t afTrigger
+     *
+     * \return 0 if af trigger was set, otherwise non-0 value is returned.
+     */
+    int getAfTrigger(camera_af_trigger_t& afTrigger) const;
+
+    /**
+     * \brief Set AF state.
+     *
+     * \param[in] camera_af_state_t afState
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAfState(camera_af_state_t afState);
+
+    /**
+     * \brief Get AF state
+     *
+     * \param[out] afState: Currently AF state will be set to afState if 0 is returned.
+     *
+     * \return 0 if AF state was set, otherwise non-0 value is returned.
+     */
+    int getAfState(camera_af_state_t& afState) const;
+
+    /**
+     * \brief Set lens state.
+     *
+     * \param[in] if lens is moving
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setLensState(bool lensMoving);
+
+    /**
+     * \brief Get lens state
+     *
+     * \param[out] isMoving: if lens is moving currently
+     *
+     * \return 0 if lens state was set, otherwise non-0 value is returned.
+     */
+    int getLensState(bool& lensMoving) const;
+
+    /**
+     * \brief Set af region
+     *
+     * \param[in] camera_window_list_t afRegions
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setAfRegions(camera_window_list_t afRegions);
+
+    /**
+     * \brief Get af region
+     *
+     * \param[out] camera_window_list_t afRegions
+     *
+     * \return 0 if afRegions were set, otherwise non-0 value is returned.
+     */
+    int getAfRegions(camera_window_list_t& afRegions) const;
+
+    /**
+     * \brief Get camera sensor mount type
+     *
+     * \param[out] sensorMountType sensor mount type: WALL_MOUNT or CEILING_MOUNT
+     *
+     * \return 0 if sensorMountType was set, otherwise non-0 value is returned.
+     */
+    int getSensorMountType(camera_mount_type_t& sensorMountType) const;
+
+    int updateDebugLevel();
+
+    /**
+     * \brief Set camera test pattern mode
+     *
+     * \param[in] mode: the camera device test pattern mode.
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setTestPatternMode(camera_test_pattern_mode_t mode);
+
+    /**
+     * \brief Get camera test pattern mode
+     *
+     * \param[out] mode: the camera device test pattern mode.
+     *
+     * \return 0 if test pattern mode was set, otherwise non-0 value is returned.
+     */
+    int getTestPatternMode(camera_test_pattern_mode_t& mode) const;
+
+    /**
+     * \brief Set crop region
+     *
+     * \param[in] cropRegion  the crop region related parameters
+     *
+     * \return 0 if successfully, otherwise non-0 value is returned.
+     */
+    int setCropRegion(camera_crop_region_t cropRegion);
+
+    /**
+     * \brief Get crop region
+     *
+     * \param[out] cropRegion  the crop related parameters
+     *
+     * \return 0 if successfully, otherwise non-0 value is returned.
+     */
+    int getCropRegion(camera_crop_region_t& cropRegion) const;
+
+    /**
+    * \brief Set control scene mode
+    *
+    * \param[in] sceneModeValue the control scene mode related parameters
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int setControlSceneMode(uint8_t sceneModeValue);
+
+    /**
+    * \brief Set face detect mode
+    *
+    * \param[in] faceDetectMode the face detect mode related parameters
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int setFaceDetectMode(uint8_t faceDetectMode);
+
+    /**
+    * \brief Get face detect mode
+    *
+    * \param[out] faceDetectMode the face detect mode related parameters, 0:OFF 1:SIMPLE 2:FULL
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int getFaceDetectMode(uint8_t& faceDetectMode) const;
+
+    /**
+    * \brief Set face id
+    *
+    * \param[in] int *faceIds, int faceNum
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int setFaceIds(int *faceIds, int faceNum);
+
+    /**
+     * Get sensor active array size
+     *
+     * \param[out] camera_coordinate_system_t& arraySize
+     * \return 0 if successfully, otherwise non-0 value is returned.
+     */
+    int getSensorActiveArraySize(camera_coordinate_system_t& arraySize) const;
+
+    /**
+    * \brief Set shading  mode
+    *
+    * \param[in] shadingMode the shading mode related parameters
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int setShadingMode(camera_shading_mode_t shadingMode);
+
+    /**
+    * \brief Get shading  mode
+    *
+    * \param[out] shadingMode the shading mode related parameters, 0:OFF 1:FAST 2:HIGH_QUALITY
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int getShadingMode(camera_shading_mode_t& shadingMode) const;
+
+    /**
+    * \brief Set statistics lens shading map mode
+    *
+    * \param[in] lensShadingMapMode the lens shading map mode related parameters
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int setLensShadingMapMode(camera_lens_shading_map_mode_type_t lensShadingMapMode);
+
+    /**
+    * \brief Get statistics lens shading map mode
+    *
+    * \param[out] lensShadingMapMode the lens shading map mode related parameters, 0:OFF 1:ON
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int getLensShadingMapMode(camera_lens_shading_map_mode_type_t &lensShadingMapMode) const;
+
+    /**
+    * \brief Set lens shading map
+    *
+    * \param[in] lensShadingMap the lens shading map
+    * \param[in] lensShadingMapSize lensShadingMap's size
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int setLensShadingMap(const float *lensShadingMap, size_t lensShadingMapSize);
+
+    /**
+    * \brief Get lens shading map
+    *
+    * \param[out] lensShadingMap the lens shading map
+    * \param[out] lensShadingMapSize the lens shading map's size
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int getLensShadingMap(float *lensShadingMap, size_t &lensShadingMapSize) const;
+
+    /**
+    * \brief Get lens shading map size
+    *
+    * \param[out] arraySize the lens shading map size related parameters
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int getLensInfoShadingMapSize(camera_coordinate_t &shadingMapSize) const;
+
+    /*
+    * \brief Set tonemap mode
+    *
+    * \param[in] camera_tonemap_mode_t& mode
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int setTonemapMode(camera_tonemap_mode_t mode);
+
+    /**
+    * \brief Get tonemap mode
+    *
+    * \param[out] camera_tonemap_mode_t& mode
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int getTonemapMode(camera_tonemap_mode_t& mode) const;
+
+    /**
+    * \brief Get supported tonemap modes
+    *
+    * \param[out] vector<camera_tonemap_mode_t>& tonemapModes
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int getSupportedTonemapMode(std::vector<camera_tonemap_mode_t>& tonemapModes) const;
+
+    /**
+    * \brief Set the type of tonemap preset curve
+    *
+    * \param[in] camera_tonemap_preset_curve_t type
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int setTonemapPresetCurve(camera_tonemap_preset_curve_t type);
+
+    /**
+    * \brief Get tonemap gamma
+    *
+    * \param[out] camera_tonemap_preset_curve_t& type
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int getTonemapPresetCurve(camera_tonemap_preset_curve_t& type) const;
+
+    /**
+    * \brief Set tonemap gamma
+    *
+    * \param[in] float gamma
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int setTonemapGamma(float gamma);
+
+    /**
+    * \brief Get tonemap gamma
+    *
+    * \param[out] float& gamma
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int getTonemapGamma(float& gamma) const;
+
+    /**
+    * \brief Get number of tonemap curve points
+    *
+    * \param[out] int32_t& number
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int getTonemapMaxCurvePoints(int32_t& number) const;
+
+    /**
+    * \brief Set tonemap curves
+    *
+    * \param[in] const camera_tonemap_curves_t& curve
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int setTonemapCurves(const camera_tonemap_curves_t& curves);
+
+    /**
+    * \brief Get tonemap curves
+    *
+    * \param[out] camera_tonemap_curves_t& curve
+    *
+    * \return 0 if successfully, otherwise non-0 value is returned.
+    */
+    int getTonemapCurves(camera_tonemap_curves_t& curves) const;
+
+private:
+    friend class ParameterHelper;
+    void* mData; // The internal data to save the all of the parameters.
+}; // class Parameters
+/*******************End of Camera Parameters Definition**********************/
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/include/cameranvm.h b/camera/hal/intel/ipu6/include/cameranvm.h
new file mode 100644
index 000000000000..64cbbf2af24d
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/cameranvm.h
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2012-2017 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file cameranvm.h
+ * \brief Definitions of NVM creator functions.
+*/
+
+#ifndef CAMERANVM_H_
+#define CAMERANVM_H_
+
+#include "ia_types.h"
+#include "ia_nvm.h"
+
+// macro for memcpy
+#ifndef MEMCPY_S
+#define NVM_MIN(a, b) ((a) < (b) ? (a) : (b))
+#define MEMCPY_S(dest, dmax, src, smax) memcpy((dest), (src), NVM_MIN((size_t)(dmax), (size_t)(smax)))
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*!
+ * \brief NVM parsing status codes.
+ */
+typedef enum
+{
+    nvm_error_none,            /*!< No error. */
+    nvm_error_internal,        /*!< Parser internal failure (not enough memory). */
+    nvm_error_no_data,         /*!< NULL pointer as input or not enough input data. */
+    nvm_error_af,              /*!< Error parsing AF parameters. */
+    nvm_error_lsc,             /*!< Error parsing AF parameters. (lsc dimensions, lsc data) */
+    nvm_error_awb,             /*!< Error parsing AWB parameters (sensitivities, n_lights). */
+    nvm_error_crc,             /*!< CRC check error. */
+    nvm_error_not_implemented, /*!< Parser for given data type has not been implemented. */
+    nvm_error_version,         /*!< invalid version. */
+    nvm_status_intel_format    /*!< The NVM data is in Intel default format. */
+} nvm_error;
+
+typedef struct
+{
+    int lsc_color_temperature;             /*!< color temperature of shading table calibrate. as ct/100 */
+    uint16_t *lsc_tables[IA_NVM_NUM_CHANNELS]; /*!< LSC table for Ch1, Ch2, Ch3 and Ch4. */
+} nvm_lsc;
+
+typedef struct
+{
+    uint8_t lsc_width;                         /*!< Width of LSC tables */
+    uint8_t lsc_height;                        /*!< Height of LSC tables. */
+    nvm_lsc *lsc[2];                           /*!< LSC tables 1. */
+} nvm_data;
+
+/*!
+ * \brief Creates Intel specified NVM data from various NVM data.
+ * Detection of NVM data is done based on camera ID string. Created NVM
+ * data buffer must be deleted with function cameranvm_delete.
+ * \param[in]     camera_name           String identifying NVM format from various cameras.
+ * \param[in]     input_nvm_data        NVM data from camera module.
+ * \param[in]     input_nvm_motor_data  NVM data from camera lens motor EEPROM.
+ * \param[out]    output_nvm_data       NVM data converted into Intel specified format.
+ * \return                              Error code from NVM creation.
+ */
+nvm_error
+cameranvm_create(const char *camera_name,
+                 const ia_binary_data *input_nvm_data,
+                 const ia_binary_data *input_motor_nvm_data,
+                 ia_binary_data **output_nvm_data);
+
+
+/*!
+ * \brief Creates Intel specified NVM data from NVM data in google format.
+ * Detection of NVM data is done based on camera ID string. NVM data in
+ * google format should be converted into Intel format, and Created NVM
+ * data buffer must be deleted with function cameranvm_delete.
+ * \param[in]     lsc  lsc tables in google format.
+ * \param[out]    output_nvm_data       NVM data converted into Intel specified format.
+ * \return                              Error code from NVM creation.
+ */
+nvm_error
+cameranvm_convert(const nvm_data *input_nvm_data,
+                 ia_binary_data **output_nvm_data);
+
+/*!
+ * \brief Deletes NVM data buffer created with function cameranvm_create.
+ * This function only frees the allocated buffer and clears the parameters
+ * in the given structure.
+ * \param[in] nvm_data  Previously created NVM data buffer.
+ */
+void
+cameranvm_delete(ia_binary_data *nvm_data);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CAMERANVM_H_ */
diff --git a/camera/hal/intel/ipu6/include/gcss/GCSSParser.h b/camera/hal/intel/ipu6/include/gcss/GCSSParser.h
new file mode 100644
index 000000000000..e7307b9fb8b8
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/gcss/GCSSParser.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GCSS_PARSER_H__
+#define __GCSS_PARSER_H__
+
+#include "gcss.h"
+#include "gcss_item.h"
+#include <expat.h>
+
+namespace GCSS {
+
+/**
+ * \class GCSSParser
+ *
+ * This class is used to parse the Graph Configuration Subsystem graph
+ * descriptor xml file. Uses the expat lib to do the parsing.
+ */
+class GCSSParser {
+public:
+    GCSSParser();
+    ~GCSSParser();
+    void parseGCSSXmlFile(const char*, IGraphConfig**);
+    void parseGCSSXmlData(char*, size_t, IGraphConfig**);
+
+private: /* Constants*/
+    static const int BUFFERSIZE = 4*1024;  // For xml file
+
+private: /* Methods */
+    GCSSParser(const GCSSParser& other);
+    GCSSParser& operator=(const GCSSParser& other);
+
+    static void startElement(void *userData, const char *name, const char **atts);
+    static void endElement(void *userData, const char *name);
+
+    void parseXML(XML_Parser &parser, const char* fileName, void* pBuf);
+#ifndef ZLIB_DISABLED
+    void parseGz(XML_Parser &parser, const char* filename, void* pBuf);
+#endif
+    void handleGraph(const char *name, const char **atts);
+    void handleNode(const char *name, const char **atts);
+    void checkField(GCSSParser *profiles, const char *name, const char **atts);
+
+private:  /* Members */
+
+    ia_uid mTopLevelNode;
+    std::string mVersion; /* save version number from the xml here */
+    GCSS::GraphConfigNode *mCurrentNode; /* TODO: these should be of GraphConfig-iface type */
+};
+} // namespace
+#endif
diff --git a/camera/hal/intel/ipu6/include/gcss/gcss.h b/camera/hal/intel/ipu6/include/gcss/gcss.h
new file mode 100644
index 000000000000..109c88698b67
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/gcss/gcss.h
@@ -0,0 +1,279 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef __GCSS_H__
+#define __GCSS_H__
+
+#include <ia_tools/css_types.h>
+#include <ia_cipf/ia_cipf_types.h>
+
+#ifdef __cplusplus
+
+#include <string>
+#include <map>
+#include <utility>
+#include <vector>
+
+namespace GCSS {
+
+/* For now there is no C API to GCSS so exposing the ItemUID and IGraphConfig
+ * here */
+class ItemUID
+{
+public:
+    static ia_uid str2key(const std::string&);
+    static const char* key2str(const ia_uid key);
+    static bool isInteger(const ia_uid key);
+    static ia_uid generateKey(const std::string&);
+    static void addCustomKeyMap(std::map<std::string, ia_uid> &osMap);
+
+    ItemUID(std::initializer_list<ia_uid> uids) {
+        mUids.insert(mUids.end(), uids.begin(), uids.end());
+    };
+    ItemUID (const std::string &itemName);
+    ItemUID() {};
+    void pop_back() { mUids.pop_back(); };
+    void push_back( const ia_uid& iuid) { mUids.push_back(iuid); };
+
+    bool operator == (const ItemUID& v) const {
+        return v.mUids == mUids;
+    }
+
+    std::string toString() const;
+
+    std::size_t size() const { return mUids.size(); };
+
+    ItemUID(const ItemUID &ref) { mUids = ref.mUids; };
+    ItemUID & operator=(const ItemUID &v) {
+        // check for self-assignment
+        if (&v == this)
+            return *this;
+
+        mUids = v.mUids;
+        return *this;
+    }
+
+    ia_uid& operator[](std::size_t idx) { return mUids[idx]; }
+    const ia_uid& operator[](std::size_t idx) const
+    { return mUids[idx]; }
+
+private:
+    friend bool operator<(const ItemUID &r, const ItemUID &l);
+    friend bool operator>(const ItemUID &r, const ItemUID &l);
+    std::vector<ia_uid> mUids;
+
+};
+
+class IGraphConfig
+{
+public:
+    virtual ~IGraphConfig() {}
+
+    /**
+     * Get root level node of the graph
+     *
+     * \ingroup gcss
+     *
+     * \return pointer to root node on success
+     * \return NULL if error
+     */
+    virtual IGraphConfig* getRoot(void) const = 0;
+    /*
+     * Get ancestor for the node
+     *
+     * \ingroup gcss
+     *
+     * \return pointer to ancestor node on success
+     * \return NULL if error
+     */
+    virtual IGraphConfig* getAncestor(void) const = 0;
+
+    virtual uint32_t getDescendantCount() const = 0;
+
+    /**
+     * Get descendant by GCSS_KEY
+     *
+     * \ingroup gcss
+     *
+     * \return pointer to the descendant if success
+     * \return NULL if error
+     */
+    virtual IGraphConfig* getDescendant(ia_uid) const = 0;
+
+    /**
+     * Get descendant by GCSS_KEY, or array of keys
+     *
+     * \ingroup gcss
+     *
+     * possible usages:
+     * getDescendant(GCSS_KEY_GRAPH);
+     * getDescendant({GCSS_KEY_GRAPH, GCSS_KEY_CONNECTION});
+     *
+     * \return pointer to the descendant if success
+     * \return NULL if error
+     */
+
+    virtual IGraphConfig* getDescendant(const ItemUID&) const = 0;
+    /**
+     * DEPRECATED
+     * Get descendant by string
+     *
+     * \ingroup gcss
+     *
+     * \return pointer to the descendant if success
+     * \return NULL if error
+     */
+    virtual IGraphConfig* getDescendantByString(const std::string &str) const = 0;
+
+    /**
+     * Get int value for an attribute given as GCSS_KEY
+     *
+     * \ingroup gcss
+     *
+     * \param[in] gcss key
+     * \param[out] int value
+     * \return css_err_none if success
+     */
+    virtual css_err_t getValue(ia_uid, int&) const = 0;
+    virtual css_err_t getValue(const ItemUID&, int&) const = 0;
+
+    /**
+     * Get str value for an attribute given as GCSS_KEY
+     *
+     * \ingroup gcss
+     *
+     * \param[in] gcss key
+     * \param[out] str value
+     * \return css_err_none if success
+     */
+    virtual css_err_t getValue(ia_uid, std::string&) const = 0;
+    virtual css_err_t getValue(const ItemUID&, std::string&) const = 0;
+
+    /**
+     * Set int value for an attribute given as GCSS_KEY
+     *
+     * \ingroup gcss
+     *
+     * \param[in] gcss key
+     * \param[in] int value
+     * \return css_err_none if success
+     */
+
+    virtual css_err_t setValue(ia_uid, int) = 0;
+    virtual css_err_t setValue(const ItemUID&, int) = 0;
+
+    /**
+     * Set str value for an attribute given as GCSS_KEY
+     *
+     * \ingroup gcss
+     *
+     * \param[in] gcss key
+     * \param[in] str value
+     * \return css_err_none if success
+     */
+    virtual css_err_t setValue(ia_uid, const std::string&) = 0;
+    virtual css_err_t setValue(const ItemUID&, const std::string&) = 0;
+
+    /* Helpers to get uid of the node. Either as a string or uint*/
+    virtual std::string getName()const = 0;
+    virtual ia_uid getUid() const = 0;
+
+    /**
+    * Check if node in the graph is of given type
+    *
+    * \ingroup gcss
+    *
+    * Check if node is, for example, sink, port, program group.
+    *
+    * \param[in] type to compare against as a gcss key
+    * \return true if type matches, false otherwise
+    */
+    virtual bool isType(ia_uid) const = 0;
+
+};
+
+/**
+* \class NodeIterator
+* \ingroup gcss
+* allows iteration of descendants by type, name or value
+*/
+class NodeIterator
+{
+public:
+    /**
+    * Iterator is constructed by givin pointer to the IGraphConfig object
+    * that is being iterated.
+    * \ingroup gcss
+    */
+    NodeIterator(const IGraphConfig *node) : mCurrentIndex(0), mTarget(node), mCurrentKey(0) {}
+
+    /**
+    * Iterates descendants of the node by their type
+    * \ingroup gcss
+    * \param[in] type           Gcss key of the type to iterate
+    * \return    IGraphConfig   As long as descendants found
+    * \return    NULL           When end reached
+    */
+    IGraphConfig* iterateByType(const ia_uid &type);
+
+    /**
+    * Iterates descendants of the node with a given uid
+    *
+    * \ingroup gcss
+    * \param[in] uid            Descendant uid as a gcss key
+    * \return    IGraphConfig   As long as matching descendants found
+    * \return    NULL           When end reached
+    */
+
+    IGraphConfig* iterateByUid(const ia_uid &name);
+
+    /**
+    * Iterates all descendants of the node
+    *
+    * \ingroup gcss
+    * \return    IGraphConfig   As long as matching descendants found
+    * \return    NULL           When end reached
+    */
+    IGraphConfig* iterateDescendants();
+private:
+    IGraphConfig* iterateNodes(const ia_uid &type, const std::string &str);
+    IGraphConfig* reset();
+    int32_t mCurrentIndex; /**< state of the iterator */
+    const IGraphConfig *mTarget;   /**< node being iterated */
+    // for caching key to string conversions
+    ia_uid mCurrentKey;
+    std::string mCurrentString;
+};
+} // namespace
+
+extern "C" {
+#endif
+
+#define GCSS_KEY(key, str) GCSS_KEY_##key,
+#define GCSS_KEY_SECTION_START(key, str, val) GCSS_KEY_##key = val,
+#define GCSS_KEY_SECTION_END(key, str, val) GCSS_KEY_##key = val,
+typedef enum _GraphConfigKey {
+    #include "gcss_keys.h"
+    GCSS_KEY_START_CUSTOM_KEYS = 0x8000,
+} GraphConfigKey;
+#undef GCSS_KEY
+#undef GCSS_KEY_SECTION_START
+#undef GCSS_KEY_SECTION_END
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/camera/hal/intel/ipu6/include/gcss/gcss_aic_utils.h b/camera/hal/intel/ipu6/include/gcss/gcss_aic_utils.h
new file mode 100644
index 000000000000..a6c1bab1dbef
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/gcss/gcss_aic_utils.h
@@ -0,0 +1,325 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef GCSS_AIC_UTILS_H_
+#define GCSS_AIC_UTILS_H_
+
+extern "C" {
+#include "ia_isp_bxt_types.h"
+#include "ia_view_types.h"
+}
+
+#include "gcss.h"
+#include "gcss_item.h"
+#include "graph_utils.h"
+#include "gcss_isp_utils.h"
+
+namespace GCSS {
+
+typedef std::map<GCSS::IGraphConfig*, ia_isp_bxt_resolution_info_t> portResHistoryMap;
+typedef std::vector<GCSS::IGraphConfig*> NodesVector;
+typedef std::vector<int32_t> StreamIdVector;
+/*
+* Map with the information for each stream id of the RBM for each PG
+* the key of the map is the stream id (60000, 60001, etc..)
+* the Values in the map is a vector with tuples that have the PG/CB id as integer
+* and the RBM as a string.
+*/
+typedef std::map<int32_t, std::vector<std::tuple<int32_t, std::string> > > GraphRoutingInfo;
+/*
+ * Maps the execution context id to index of the vector mKernels  where the
+ * pre-allocated arrays of ia_isp_bxt_run_kernels_t are stored. <exec_ctx_id, idx>
+ */
+typedef std::map<int32_t, uint32_t> ExecCtxIdsMap;
+/**
+* \class BxtAicUtils
+* GCSS AIC dependent utility functions
+* */
+class BxtAicUtils {
+public: /*  methods */
+    /**
+     * \param legacy true if stream id is used instead of execution context
+     */
+    BxtAicUtils(bool legacy = true);
+    ~BxtAicUtils();
+    /**
+     * Init aic utils
+     *
+     * Reserves memory, and creates kernel lists for each stream
+     *
+     * \ingroup gcss
+     *
+     * \param[in] GCHandle a handle to createGraph result
+     * \return css_err_none when successful
+     */
+    css_err_t initAicUtils(const IGraphConfig *GCHandle);
+
+    /**
+     * get the list of stream Ids available in the graph settings initialized
+     * in this object.
+     *
+     * \param[out] streamIds vector with the stream id's
+     * \param[in] active boolean to specify whether the list of stream ids will
+     *                   have all the stream ids in the graph or only the ones
+     *                   with valid settings. Those are considered as active
+     *                   streams
+     * \return css_err_none
+     */
+
+    css_err_t getStreamIds(std::vector<int32_t> &streamIds, bool active = false) const;
+
+    /**
+     * Get program group by stream id
+     *
+     * \ingroup gcss
+     *
+     * Returns pointer to program group struct, which is allocated as a
+     * member of this class. So the ownership of the memory remains in the instance
+     * of this class. The user does not need to free the memory.
+     *
+     * \param[in] stremId a stream id of the program group being requested
+     * \param[out] pg Reference to a program group struct being populated
+     */
+    void getProgramGroup(int32_t streamId, ia_isp_bxt_program_group &pg);
+
+    /**
+    * Returns the structure required by ia_isp (aka PAL) to run
+    *
+    * \ingroup gcss
+    * Unfortunate name, program group. This is the array of structures
+    * ia_isp_bxt_run_kernels_t that describes the input/output resolution for
+    * each kernel.
+    * This version of the API takes as input a concrete IGraphConfig node that
+    * represents a PG. The other API takes the stream-id and returns all the kernels
+    * in all the PG's that belong to them.
+    * In both cases the list of kernels is returned inside the AIC structure
+    * ia_isp_bxt_program_group.
+    * The memory allocated is owned by this instance. The user of this API must not
+    * de-allocate the pg.run_kernels pointer.
+    *
+    * NOTE: The current implementation only supports IPU6, not yet IPU5
+    *
+    * \param[in] pgNode IGraphConfig node representing a particular PG
+    * \param[out] pg Reference to a program group struct being populated
+    */
+    css_err_t getProgramGroup(const IGraphConfig* pgNode, ia_isp_bxt_program_group &pg);
+
+    /**
+     * Get cmc mode tag associated with the sensor
+     * \ingroup gcss
+     *
+     * This will be used to retieve the CMC section of a multi-tune file. This
+     * is done using ia_lard.
+     *
+     * \param[out] cmcTag
+     * \return css_err_none if everything goes ok
+     * \return css_err_internal if settigns do no thave sensor node
+     * \return css_err_data if sensor node does node have the attribure cmc_tag
+     */
+    css_err_t getSensorCmcId(std::string &cmcTag);
+
+    /* Get Information about the DOL mode of the sensor
+     * \ingroup gcss
+     *
+     * This will be used to retieve the conversion gain and the DOL mode from
+     * the settings of the sensor mode.
+     * if sensor mode does not have the attribute the method does not fail but
+     * returns gain 1 and mode none.
+     *
+     * TODO: Mode should come as an enum and not as string, this requires
+     * addition of dol mode in ia_isp_bxt
+     *
+     * \param[out] gain conversion gain
+     * \param[out] mode DOL mode, only 4 possible values
+     * \return css_err_none if everything goes ok
+     * \return css_err_internal if settigns do no thave sensor node or instance
+     *                          is not initialized
+     */
+    css_err_t getDolInfo(float &gain, std::string &mode);
+
+    /* Get MBR Tool data
+    * \ingroup gcss
+    *
+    * Retrieve the limits of MBR tool stored in the settings. This information
+    * is required for WFOV mode.
+    *
+    * \param[in] stream_id Value of the stream_id associated with the MBR limits
+    * \param[out] data Pointer to valid structure where to store the MBR limits
+    * \return css_err_none if everything goes ok
+    * \return css_err_data if settigns do not have enough data to fill the mbr limits structure
+    * \return css_err_internal if settigns do not have mbr limits data
+    *
+    */
+    css_err_t getMbrData(int32_t stream_id, ia_isp_bxt_gdc_limits *data);
+
+    /**
+     * Get the IGraphConfig root node that was used to initialize this utility
+     * class. This allows users to perform other queries to the IGraphConfig
+     * interface.
+     * \ingroup gcss
+     *
+     */
+    const IGraphConfig* getGraphConfig() { return mGCHandle; }
+
+    css_err_t getSourceResolutionHistory(ia_isp_bxt_resolution_info_t &history);
+
+    /**
+    * Retrieves the list of all the RBM's in all the stream-ids present in the
+    * settings. The RBM's are listed per PG/CB
+    * \see GraphRoutingInfo
+    * \ingroup gcss
+    *
+    */
+    css_err_t getRoutingInfo(GraphRoutingInfo &routingInfo);
+
+    /**
+     * Dumps the list of kernels for given stream
+     *
+     * \ingroup gcss
+     *
+     * \param[in] streamId
+     */
+    void dumpKernels(int32_t streamId);
+    /**
+     * Dumps the information from a list of kernels descriptors
+     *
+     * \ingroup gcss
+     *
+     * \param[in] streamId
+     */
+    static void dumpKernels(ia_isp_bxt_run_kernels_t *kernelList,
+                            uint32_t kernel_count);
+
+    static void dumpResInfo(ia_isp_bxt_run_kernels_t &kernelInfo);
+    static void dumpResHistory(ia_isp_bxt_resolution_info_t &resInfo,
+                               const char* name);
+private:
+    /* pair of execution context id and port */
+    typedef std::pair<int32_t, IGraphConfig*> StreamPort;
+    typedef ia_isp_bxt_resolution_info_t ResolutionInfo;
+
+    /* Helper classes to store sensor and kernel information */
+    struct Scaler: public ResolutionInfo {
+        Scaler() : num(1), denom(1) {} /**< avoid possible division by 0 */
+        int32_t num;  /**< scaling factor numerator */
+        int32_t denom; /**< scaling factor denominator */
+    };
+    struct Binner : public ResolutionInfo {
+        Binner() : hFactor(1), vFactor(1) {} /**< avoid possible division by 0 */
+        int32_t hFactor;  /**< horizontal binning factor */
+        int32_t vFactor; /**< Vertical binning factor */
+    };
+    struct SensorModeInfo {
+        ResolutionInfo pixelArray;
+        Binner binner;
+        Scaler scaler;
+    };
+    struct ResolutionMemPool {
+           std::vector<ResolutionInfo *> resHistorys;
+           std::vector<ResolutionInfo *> resInfos;
+    };
+    struct KernelGroupInfo {
+        KernelGroupInfo() : runKernels(nullptr), kernelCount(0) {}
+        KernelGroupInfo(uint32_t kCount) : runKernels(nullptr), kernelCount(kCount) {}
+        ia_isp_bxt_run_kernels_t *runKernels;
+        uint32_t kernelCount = 0;
+    };
+    // Storage for kernel info extensions to AIC requirements
+    struct KernelInfo {
+        int32_t rcb;
+        int32_t branchPoint;
+        int32_t sinkPortId;
+        int32_t restorePoint;
+        IGraphConfig *sinkPort;
+        IGraphConfig *srcPort;
+    };
+
+    css_err_t collectNodesIntAttribute(std::vector<int32_t> &pgsAttribute,
+                                       ia_uid attributeKey,
+                                       ia_uid nodeType) const;
+    int32_t getUpstreamStreamId(int32_t streamId,
+                                IGraphConfig **upstreamPort);
+
+    css_err_t createKernelListStructures();
+    css_err_t createPerPgKernelListStructures(const IGraphConfig *pg, uint32_t);
+    static css_err_t getSensorModeInfo(IGraphConfig &sensorNode, SensorModeInfo &sensorInfo);
+    static css_err_t sourceGetResolutionHistory(ResolutionInfo &history,
+                                                IGraphConfig &sourceNode);
+    static css_err_t  calculateSensorResolutionHistory(IGraphConfig &sensorNode,
+                                                       ResolutionInfo &history);
+    static css_err_t  calculateTPGResolutionHistory(IGraphConfig &sensorNode,
+                                                    ResolutionInfo &history);
+    static css_err_t calculateBufSrcResolutionHistory(IGraphConfig &tpgNode,
+                                                      ResolutionInfo &history);
+    static css_err_t getCsiDimensions(IGraphConfig &sensorNode,
+                                      ResolutionInfo &pixFormat);
+    css_err_t populateKernelArray(int32_t streamId,
+                                  ia_isp_bxt_run_kernels_t *kernelList,
+                                  uint32_t index,
+                                  portResHistoryMap &portResHistory);
+
+    css_err_t getStreamChains(std::map<int32_t, std::vector<StreamPort>> &streamChains);
+    css_err_t generateKernelListsForExecCtxs();
+
+    css_err_t getResHistoryForIntermediatePg(const IGraphConfig *pg,
+        ResolutionInfo &resolutionHistory,
+                                             portResHistoryMap &portResHistory);
+    css_err_t handleSinkPort(KernelInfo &kInfo, const IGraphConfig *pg, std::vector<int32_t> &, int32_t);
+    static css_err_t kernelGetValues(const GCSS::IGraphConfig *kernelNode,
+                                     int32_t *palUuid = NULL,
+                                     int32_t *kernelId = NULL,
+                                     uint32_t *metadata = NULL,
+                                     int32_t *enable = NULL,
+                                     int32_t *rcb = NULL,
+                                     int32_t *branchPoint = NULL,
+                                     int32_t *sinkPort = NULL,
+                                     int32_t *restorePoint = NULL);
+
+    static css_err_t kernelGetResolutions(const IGraphConfig *kernelNode,
+                                          std::map<std::string, ResolutionInfo> &resInfos);
+    static css_err_t kernelGetResolutions(const GCSS::IGraphConfig *kernelNode,
+        ResolutionInfo *resInfo);
+
+    static css_err_t kernelGetBppInfo(const IGraphConfig &kernelNode,
+                                      ia_isp_bxt_run_kernels_t &runKernel);
+    static void accumulateCrop(ia_rectangle &in, const ia_rectangle &toAccumulate,
+                                       int32_t scaleNum = 1, int32_t scaleDenom = 1);
+    css_err_t kernelIdSanityCheck(uint32_t checksum, uint32_t kernelCount);
+
+    // IPU6/7 new logic - start
+    bool nodesHaveKernelLinks();
+    bool detectNewGraphVersion();
+    // IPU6 new logic - end
+    static bool kernelHasResolutions(GCSS::IGraphConfig *kernelNode);
+    void deleteKernelInfo();
+    static void dumpPortResHistoryMap (portResHistoryMap &m);
+    static const char* resInfoToStr(ResolutionInfo &resInfo);
+    void applyKernelConfigs(const KernelConfigs &kernelConf,
+                            ia_isp_bxt_run_kernels_t &runKernels);
+    friend class GraphUtil;
+    ExecCtxIdsMap mExecCtxIds;
+    std::vector<ResolutionMemPool> mResMems;
+    std::map<const IGraphConfig*, KernelGroupInfo> mRunKernelsPerPg;
+    std::map<int32_t, KernelGroupInfo> mRunKernelsPerStream;
+    ResolutionInfo mSourceHistory;
+
+    const IGraphConfig *mGCHandle;
+    bool mUseStreamId;
+    GraphUtil mGraphUtil;
+    GdfVersion mGdfVersion;
+    std::shared_ptr<IspUtils> mISPUtils;
+};
+} // namespace
+#endif
diff --git a/camera/hal/intel/ipu6/include/gcss/gcss_isp_utils.h b/camera/hal/intel/ipu6/include/gcss/gcss_isp_utils.h
new file mode 100644
index 000000000000..647981542518
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/gcss/gcss_isp_utils.h
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef GCSS_ISP_UTILS_H_
+#define GCSS_ISP_UTILS_H_
+
+#include "gcss.h"
+#include "graph_utils.h"
+
+namespace GCSS {
+
+struct KernelConfigContainer {
+    int32_t overwriteMode = 0; /**< use this flag to tell which values to update */
+    uint32_t kernel_uuid;
+    int32_t enable;
+    uint32_t metadata[4];
+    ia_isp_bxt_bpp_info_t bpp_info;
+};
+
+/**
+* These modes are used to tell which kernel properties are to be overwritten
+*/
+enum OverwriteMode {
+    OVERWRITE_ENABLE   = 1 << 1,
+    OVERWRITE_BPP      = 1 << 2,
+    OVERWRITE_METADATA = 1 << 3
+};
+
+static const std::string IPU_VER_5("IPU5");
+static const std::string IPU_VER_6("IPU6");
+static const std::string IPU_VER_7("IPU7");
+/**
+ * Vector that is used to hold kernelConfig structs per kernel
+ */
+typedef std::vector<KernelConfigContainer> KernelConfigs;
+
+/** \class IspUtils
+ * Provides IPU specific utilities that can be accessed through
+ * the pointer constructed with the Factory method.
+ */
+class IspUtils {
+
+public:
+    virtual ~IspUtils() {}
+
+    /**
+    * Isp Utils Factory
+    *
+    * \ingroup gcss
+    *
+    * Returns pointer that allows access to common and IPU specific utilities.
+    * Ipu is automatically selected based on the version attribute in the
+    * graph descriptor.
+    *
+    * \param[in]  settings
+    * \return     pointer to one of the ipu specific implementations
+    */
+    static std::shared_ptr<IspUtils> Factory(const IGraphConfig *settings);
+
+    /**
+    * Is dvs enabled
+    *
+    * \ingroup gcss
+    *
+    * Returns true if dvs enabled in settings. False otherwise,
+    *
+    * \return true if dvs is enabled in the settings
+    * \return false if dvs disabled in the settings
+    */
+    virtual bool isDvsEnabled() = 0;
+
+    /**
+    * Get IPU version
+    *
+    * \ingroup gcss
+    *
+    * Returns ipu version as GdfVersion type
+    *
+    * \return GdfVersion
+    */
+    virtual GdfVersion getIpuVersion() = 0;
+
+    /**
+    * Get kernel configurations
+    *
+    * \ingroup gcss
+    *
+    * Returns map of runtime kernel configurations. KernelConfigurations map
+    * contains pal uuid and enable value for kernel. Use through ipu specific
+    * implementation.
+    *
+    * \param[out] KernelConfigContainer populated with kernel configs
+    * \return css_err_none on success
+    * \return css_err_nimpl if function not implemented
+    * \return css_err_general in case of error
+    */
+    virtual css_err_t getKernelConfigurations(KernelConfigs &kConfig) = 0;
+
+    /** Apply given format to output port
+    *
+    * \ingroup gcss
+    *
+    * Applies given format to the port that the sink is connected to.
+    * The given format has to be present in the options list of the pg where the
+    * port belongs to. If there is no options list for the pg, then no error is
+    * returned and no format applied.
+    *
+    * \param[in] sink    Pointer to the sink in the graph.
+    * \param[in] format  Name of the format that is being applied
+    * \return css_err_none   in case of success
+    * \return css_err_data   in case the given format is not in the options list
+    */
+    virtual css_err_t applyFormat(const IGraphConfig *sink,
+        const std::string &format) = 0;
+
+    /** Applies compression to full pipe and sets given format to output port
+    *
+    * \ingroup gcss
+    *
+    * Applies given format to the port that the sink is connected to.
+    * The given format has to be present in the options list of the pg where the
+    * port belongs to. If there is no options list for the pg, then no error is
+    * returned and no format applied. Applies compression also to PSA and to
+    * tnr ports if present.
+    *
+    * \param[in] sink    Pointer to the sink in the graph.
+    * \param[in] format  Name of the compressed format that is being applied
+    * \return css_err_none       in case of success
+    * \return css_err_argument   in case the given format is not compressed
+    * \return css_err_data       in case the given format is not in the options list
+    */
+    virtual css_err_t applyCompression(const IGraphConfig *sink,
+        const std::string &format) = 0;
+};
+} // namespace
+#endif
\ No newline at end of file
diff --git a/camera/hal/intel/ipu6/include/gcss/gcss_item.h b/camera/hal/intel/ipu6/include/gcss/gcss_item.h
new file mode 100644
index 000000000000..448e6e0498cd
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/gcss/gcss_item.h
@@ -0,0 +1,267 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef GCSS_ITEM_H_
+#define GCSS_ITEM_H_
+
+#include "gcss.h"
+namespace GCSS {
+
+class GraphQueryManager;
+
+/** RelayControl :
+* Controls of assigning GraphConfig container elements */
+namespace RelayControl {
+    typedef int8_t Rule;
+    const Rule RELAY_RULE_ADD_NODES = 0x1;
+    const Rule RELAY_RULE_HANDLE_OPTIONS = 1 << 1;
+    const Rule RELAY_RULE_PROPAGATE = 1 << 2;
+    const Rule RELAY_RULE_OVERWRITE = 1 << 3;
+}
+
+void getGcssKeys(std::map<std::string, ia_uid> &src);
+void copyGcssKeys(std::map<std::string, ia_uid> &src);
+
+/**
+ * Holds type of the item. It can be Node or Attribute (int or string)
+ */
+enum Type {
+    NA               = (1 << 0),
+    STR_ATTRIBUTE    = (1 << 1),
+    INT_ATTRIBUTE    = (1 << 2),
+    NODE             = (1 << 3)
+};
+/**
+ * \class GraphConfigItem
+ * Base class that holds attributes or nodes inside
+ */
+class GraphConfigItem
+{
+public:
+    typedef std::multimap<ia_uid, GraphConfigItem*> gcss_item_map;
+    typedef gcss_item_map::const_iterator const_iterator;
+
+    /** Getter for int value of attribute. Return error if getValue is being
+     * used directly or if child class doesn't implement getValue
+     * \param[out] value
+     */
+
+    virtual css_err_t getValue(int&) {return css_err_noentry;}
+    /** Getter for string value of attribute. Return error if getValue is being
+     * used directly or if child class doesn't implement getValue
+     * \param[out] value
+     */
+
+    virtual css_err_t getValue(std::string&) {return css_err_noentry;}
+    /** Setter for string value of attribute.
+     * \param[in] new value
+     */
+
+    virtual css_err_t setValue(const std::string&) {return css_err_noentry;}
+    /** Setter for int value of attribute.
+     * \param[in] new value
+     */
+    virtual css_err_t setValue(int) {return css_err_noentry;}
+
+    Type mType;
+    GraphConfigItem(Type type) : mType(type) {}
+
+    virtual ~GraphConfigItem() {}
+};
+
+
+inline bool operator<(const ItemUID &r, const ItemUID &l)
+{
+    return r.mUids < l.mUids;
+}
+
+inline bool operator>(const ItemUID &r, const ItemUID &l)
+{
+    return r.mUids > l.mUids;
+}
+
+/**
+ * \class GraphConfigAttribute
+ * Base class for graph config attributes
+ */
+class GraphConfigAttribute : public GraphConfigItem {
+public:
+    GraphConfigAttribute() : GraphConfigItem(NA){}
+    GraphConfigAttribute(Type t) : GraphConfigItem(t){}
+    ~GraphConfigAttribute() {}
+};
+
+/**
+ * \class GraphConfigIntAttribute
+ * Container for integer type attributes
+ */
+class GraphConfigIntAttribute : public GraphConfigAttribute
+{
+public:
+    GraphConfigIntAttribute() : GraphConfigAttribute(INT_ATTRIBUTE), mInteger(-1){}
+    GraphConfigIntAttribute* copy();
+    css_err_t getValue(int& intVal){intVal = mInteger; return css_err_none;}
+    css_err_t setValue(int intVal) { return insertInteger(intVal);}
+    ~GraphConfigIntAttribute() {};
+private:
+    css_err_t insertInteger(int);
+    int mInteger;
+};
+
+/**
+ * \class GraphConfigStrAttribute
+ * Container for string type attributes
+ */
+class GraphConfigStrAttribute : public GraphConfigAttribute
+{
+public:
+    GraphConfigStrAttribute() : GraphConfigAttribute(STR_ATTRIBUTE){}
+    GraphConfigStrAttribute* copy();
+    css_err_t getValue(std::string& str){str = mString; return css_err_none;}
+    css_err_t setValue(const std::string& str) { return insertString(str);}
+    ~GraphConfigStrAttribute() {};
+private:
+    css_err_t insertString(const std::string&);
+    std::string mString;
+};
+
+/**
+ * \class GraphConfigNode
+ * Provides methods for manipulating nodes in the graph
+ */
+class GraphConfigNode : public GraphConfigItem, public IGraphConfig
+{
+public:
+    GraphConfigNode(const GraphConfigNode&);
+    GraphConfigNode() : GraphConfigItem(NODE), mAncestor(NULL){};
+    ~GraphConfigNode();
+
+    GraphConfigNode* copy() const;
+    operator IGraphConfig*() { return this; }
+    static void dumpNodeTree(const GraphConfigNode*, int depth  = 0);
+    const_iterator begin() const { return mItem.begin(); }
+    const_iterator end() const { return mItem.end(); }
+
+    css_err_t insertDescendant(GraphConfigItem*, const ia_uid);
+    css_err_t removeDescendant(const ia_uid);
+    css_err_t createAttribute(const ItemUID& item, GraphConfigAttribute** ret);
+
+    css_err_t changeBaseNodeIntoNode(GraphConfigNode &configNode);
+
+    /**
+     * Helper function which iterates through given node and search for
+     * matching attribute. Return error if not found.
+     * \param attribute the ItemUID of attribute to search
+     * \param searchAttributeValue the value to search
+     * \param it iterator for the node to search
+     * \return css_err_t
+     */
+    template <typename T>
+    css_err_t iterateAttributes(ia_uid attribute,
+        const T& searchAttributeValue,
+        const const_iterator& it) const;
+
+    static css_err_t handleAttributeOptions(GraphConfigNode *node,
+        ia_uid attribute_key,
+        const std::string &newValue);
+
+    /** DEPRECATED public methods, use IGraphConfig implementations instead */
+    GraphConfigNode* getRootNode(void) const;
+    css_err_t getAncestor(GraphConfigNode**);
+    css_err_t getAttribute(const ia_uid iuid, GraphConfigAttribute** ret) const;
+    css_err_t getAttribute(const ItemUID& item, GraphConfigAttribute** ret) const;
+    css_err_t getDescendant(const ia_uid, GraphConfigNode**) const;
+    css_err_t getDescendant(const ia_uid attribute,
+        const int searchAttributeValue,
+        const_iterator& it,
+        GraphConfigNode** retNode) const;
+    css_err_t getDescendant(const ia_uid attribute,
+        const std::string& searchAttributeValue,
+        const_iterator& it,
+        GraphConfigNode** retNode) const;
+    css_err_t getDescendantByString(const std::string &str,
+        GraphConfigNode **retNode);
+private:
+    /* private methods */
+    GraphConfigNode & operator=(const GraphConfigNode &);
+
+    GraphConfigItem::const_iterator getNext(const_iterator& it){
+                                            return std::next(it, 1);}
+    GraphConfigItem::const_iterator getNextAttribute(
+            GraphConfigItem::const_iterator& it) const;
+
+    template <typename T>
+    css_err_t getAttrValue(const ia_uid& uid, T& val) const;
+
+    template <typename T>
+    css_err_t setAttrValue(const ia_uid& uid, T& val);
+
+    void dumpNode();
+
+    /* private members */
+    gcss_item_map mItem; /**< map that holds GraphConfigItem objects inside */
+    GraphConfigNode* mAncestor;
+
+
+    css_err_t setValueFromStr(const ItemUID &iuid, const std::string val);
+    virtual IGraphConfig* getGraphConfigItem(const ItemUID&) const;
+
+public: /* implements IGraphConfig */
+    virtual IGraphConfig* getRoot(void) const;
+    virtual IGraphConfig* getAncestor(void) const;
+    virtual IGraphConfig* getDescendant(ia_uid uid) const;
+    virtual IGraphConfig* getDescendant(const ItemUID&) const;
+    virtual IGraphConfig* getDescendantByString(const std::string &str) const;
+    virtual uint32_t getDescendantCount() const;
+    virtual css_err_t getValue(ia_uid, int&) const;
+    virtual css_err_t getValue(const ItemUID&, int&) const;
+
+    virtual css_err_t getValue(ia_uid, std::string&) const;
+    virtual css_err_t getValue(const ItemUID&, std::string&) const;
+
+    virtual css_err_t setValue(ia_uid, int);
+    virtual css_err_t setValue(const ItemUID&, int);
+
+    virtual css_err_t setValue(ia_uid, const std::string&);
+    virtual css_err_t setValue(const ItemUID&, const std::string&);
+    virtual std::string getName() const;
+    virtual ia_uid getUid() const;
+    virtual bool isType(ia_uid) const;
+
+    /* access not part of IGraphConfig */
+    bool hasItem(const ia_uid iuid) const;
+    css_err_t addValue(ia_uid uid, const std::string &val);
+    css_err_t addValue(ia_uid uid, int val);
+
+    // To silence possible compiler warning
+    using GraphConfigItem::getValue;
+    using GraphConfigItem::setValue;
+};
+/* class to expose GraphConfigNode internals to GraphQueryManager */
+class GraphQueryUtils : public GraphConfigNode {
+public:
+    static css_err_t addDescendantsFromNode(
+        GraphConfigNode *to,
+        GraphConfigNode *from,
+        RelayControl::Rule rr = RelayControl::RELAY_RULE_ADD_NODES
+        | RelayControl::RELAY_RULE_OVERWRITE);
+private:
+    static GraphConfigNode* getPortPeer(GraphConfigNode* portNode);
+    static void disableUnusedPorts(GraphConfigNode *gcNode);
+    static css_err_t disableNode(GraphConfigNode *);
+    friend GraphQueryManager;
+};
+} // namespace GCSS
+#endif /* GCSS_ITEM_H_ */
diff --git a/camera/hal/intel/ipu6/include/gcss/gcss_keys.h b/camera/hal/intel/ipu6/include/gcss/gcss_keys.h
new file mode 100644
index 000000000000..fc428b8a9cce
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/gcss/gcss_keys.h
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+GCSS_KEY_SECTION_START (NA, na, 0x0000)
+GCSS_KEY (AE_STATS_SINK, ae_stats_sink)
+GCSS_KEY (AF_STATS_SINK, af_stats_sink)
+GCSS_KEY (AWB_STATS_SINK, awb_stats_sink)
+GCSS_KEY (BASE_NODE, base_node)
+GCSS_KEY (BASE_TYPE, base_type)
+GCSS_KEY (BUFFER_SRC0, buffer_src0)
+GCSS_KEY (COMPUTE_BLOCK, compute_block)
+GCSS_KEY (CONNECTION, connection)
+GCSS_KEY (CONTENT_TYPE, content_type)
+GCSS_KEY (CONVERSION_GAIN, conversion_gain)
+GCSS_KEY (CMC_TAG, cmc_tag)
+GCSS_KEY (DEMUXER, demux)
+GCSS_KEY (DESTINATION, destination)
+GCSS_KEY (DOL_MODE, dol_mode)
+GCSS_KEY (FLOW, flow)
+GCSS_KEY (FORMAT, format)
+GCSS_KEY (GRAPH, graph)
+GCSS_KEY (GRAPHS, graphs)
+GCSS_KEY (GRAPH_DESCRIPTOR, graph_descriptor)
+GCSS_KEY (GRAPH_SETTINGS, graph_settings)
+GCSS_KEY (HW, hw)
+GCSS_KEY (INPUT, input)
+GCSS_KEY (KERNEL, kernel)
+GCSS_KEY (KERNEL_LINK, klink)
+GCSS_KEY (MBR_DATA, mbr_data)
+GCSS_KEY (METADATA, metadata)
+GCSS_KEY (MODE_ID, mode_id)
+GCSS_KEY (MUXER, mux)
+GCSS_KEY (NAME, name)
+GCSS_KEY (NODE, node)
+GCSS_KEY (NODES, nodes)
+GCSS_KEY (OUTPUT, output)
+GCSS_KEY (PEER, peer)
+GCSS_KEY (PORT, port)
+GCSS_KEY (PROGRAM_GROUP, program_group)
+GCSS_KEY (SENSOR, sensor)
+GCSS_KEY (SENSOR_MODES, sensor_modes)
+GCSS_KEY (PIXEL_ARRAY, pixel_array)
+GCSS_KEY (BINNER, binner)
+GCSS_KEY (SCALER, scaler)
+GCSS_KEY (CSI_BE, csi_be)
+GCSS_KEY (CSI_BE_DOL, csi_be_dol)
+GCSS_KEY (CSI_BE_SOC, csi_be_soc)
+GCSS_KEY (SENSOR_TYPE, sensor_type)
+GCSS_KEY (SETTINGS, settings)
+GCSS_KEY (SINK, sink)
+GCSS_KEY (SOURCE, source)
+GCSS_KEY (SPLITTER, split)
+GCSS_KEY (STATIC, static)
+GCSS_KEY (TARGET, target)
+GCSS_KEY (TYPE, type)
+GCSS_KEY (VALUE, value)
+GCSS_KEY (CIPF, cipf)
+GCSS_KEY (ATTRIBUTE, attribute)
+GCSS_KEY (OPTIONS, options)
+GCSS_KEY (APPLY, apply)
+GCSS_KEY (TPG, tpg)
+GCSS_KEY (SIMULATION, simulation)
+GCSS_KEY (VERSION, version)
+GCSS_KEY (FILE_NAME, file_name)
+GCSS_KEY (RBM, rbm)
+GCSS_KEY (DESCRIPTION, description)
+GCSS_KEY (VIDEO_BPP, video_bpp)
+GCSS_KEY (STILLS_BPP, stills_bpp)
+GCSS_KEY (EXTERNAL_STAGE, external_stage)
+GCSS_KEY (PDAF_TYPE, pdaf_type)
+GCSS_KEY (SUBSYSTEM, subsystem)
+GCSS_KEY (HW_BITMAPS, hw_bitmaps)
+GCSS_KEY (DEB, deb)
+GCSS_KEY (TEB, teb)
+GCSS_KEY (REB, reb)
+/* add new keys to this section above this line */
+GCSS_KEY_SECTION_END (GENERIC_KEYS_END, generic_keys_end, 0x0FFF)
+
+/* do not add keys here! */
+
+/* NUMERICAL KEY DEFINITIONS */
+GCSS_KEY_SECTION_START (NUMERICAL_START, num_start, 0x2000)
+GCSS_KEY (ACTIVE_INPUT, active_input)
+GCSS_KEY (ACTIVE_OUTPUTS, active_outputs)
+GCSS_KEY (ACTIVE_OUTPUT, active_output)
+GCSS_KEY (BINNING_H_FACTOR, h_factor)
+GCSS_KEY (BINNING_V_FACTOR, v_factor)
+GCSS_KEY (BOTTOM, bottom)
+GCSS_KEY (BPP, bpp)
+GCSS_KEY (BRANCH_POINT, branch_point)
+GCSS_KEY (BYTES_PER_LINE, bpl)
+GCSS_KEY (CONCURRENT, concurrent)
+GCSS_KEY (DIRECTION, direction)
+GCSS_KEY (DVS, dvs)
+GCSS_KEY (ENABLED, enabled)
+GCSS_KEY (EXEC_CTX_ID, exec_ctx_id)
+GCSS_KEY (FLIP_H, flip_h)
+GCSS_KEY (FLIP_V, flip_v)
+GCSS_KEY (FPS, fps)
+GCSS_KEY (FRAGMENT_COUNT, fragment_count)
+GCSS_KEY (HEIGHT, height)
+GCSS_KEY (ID, id)
+GCSS_KEY (KEY, key)
+GCSS_KEY (LEFT, left)
+GCSS_KEY (LINK_ID, link_id)
+GCSS_KEY (OPMODE, operation_mode)
+GCSS_KEY (PAL_UUID, pal_uuid)
+GCSS_KEY (PG_ID, pg_id)
+GCSS_KEY (POWER_FACTOR, power_factor)
+GCSS_KEY (PRIVATE, private)
+GCSS_KEY (PSYS_FREQ, psys_frequency)
+GCSS_KEY (RCB, rcb)
+GCSS_KEY (RESTORE_POINT, restore_point)
+GCSS_KEY (RIGHT, right)
+GCSS_KEY (SCALING_FACTOR_NUM, num_factor)
+GCSS_KEY (SCALING_FACTOR_DENOM, denom_factor)
+GCSS_KEY (SINK_PORT, sink_port)
+GCSS_KEY (STREAM_ID, stream_id)
+GCSS_KEY (TNR, tnr)
+GCSS_KEY (TOP, top)
+GCSS_KEY (TUNING_MODE, tuning_mode)
+GCSS_KEY (WIDTH, width)
+/* add new keys to this section above this line */
+GCSS_KEY_SECTION_END (NUMERICAL_END, num_end, 0x2FFF)
+
+/* do not add keys here, start a new section instead! */
diff --git a/camera/hal/intel/ipu6/include/gcss/gcss_utils.h b/camera/hal/intel/ipu6/include/gcss/gcss_utils.h
new file mode 100644
index 000000000000..f17b6df66337
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/gcss/gcss_utils.h
@@ -0,0 +1,637 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef GCSS_UTILS_H_
+#define GCSS_UTILS_H_
+
+#include "gcss.h"
+#include <set>
+#include <utility>
+#include <string>
+#include <limits>
+#include "gcss_item.h"
+
+namespace GCSS {
+/**
+ * \enum GdfVersion
+ * Enum to identify the different IPU versions
+ */
+enum GdfVersion {
+    GDF_VERSION_NONE,
+    GDF_VERSION_IPU4 = 4,
+    GDF_VERSION_IPU5,
+    GDF_VERSION_IPU6,
+    GDF_VERSION_IPU7
+};
+/**
+ * \class GraphCameraUtil
+ * Class that holds utility functions to derive information from
+ * GraphConfig container for Camera runtime.
+ *
+ * Utilities are separated from GraphConfig interface in order to
+ * specialize the XML-schema that Camera runtime is dependent of
+ * from the generic concept of graph information.
+ *
+ * These specializations include execCtxs, ports, execCtx edges
+ * as well as sensor and imaging kernel details that are nested
+ * in generic graph elements hierarchy.
+ */
+class GraphCameraUtil
+{
+public: // types
+   /**
+    * \struct PortDescriptor
+    * Information of a port from an XML graph node
+    */
+    struct PortDescriptor {
+        std::string    name;
+        std::string    pgName;
+        int32_t        direction;
+        int32_t        enabled;
+        uint32_t       terminalId; /**< Unique terminal id (is a fourcc code)
+                                         this is relevant only when the node
+                                         is a PG and then the port is a terminal */
+        uint32_t        width;    /**< Width of the frame in pixels */
+        uint32_t        height;   /**< Height of the frame in lines */
+        std::string     format;   /**< Frame format name, use gcss_format
+                                       utilities to query more information */
+    };
+
+public:
+    virtual ~GraphCameraUtil() {}
+
+    static const int32_t PORT_DIRECTION_INPUT = 0;
+    static const int32_t PORT_DIRECTION_OUTPUT = 1;
+    //pair of source and sink between either 2 pg, or 2 execution context.
+    typedef std::pair<std::string, std::string> StreamConnection;
+
+    /*
+     * Generic Dimensions prototype:
+     *
+     * Port-elements, kernels as well as sensor entities input and output
+     * elements reuse the common dimensions prototype including
+     *  GCSS_KEY_WIDTH, GCSS_KEY_HEIGHT, GCSS_KEY_BYTES_PER_LINE,
+     *  GCSS_KEY_LEFT, GCSS_KEY_TOP, GCSS_KEY_RIGHT, GCSS_KEY_BOTTOM
+     */
+
+    /**
+     * Get width, height, bpl and cropping values from the given element
+     *
+     * \ingroup gcss
+     *
+     * \param[in] node the node to read the values from
+     * \param[out] w width
+     * \param[out] h height
+     * \param[out] l left crop
+     * \param[out] t top crop
+     * \param[out] r right crop
+     * \param[out] b bottom crop
+     */
+    static css_err_t getDimensions(const IGraphConfig *node,
+                                   int32_t *w = NULL,
+                                   int32_t *h = NULL,
+                                   int32_t *l = NULL,
+                                   int32_t *t = NULL,
+                                   int32_t *r = NULL,
+                                   int32_t *b = NULL);
+
+    /*
+     * NODE-specialization
+     */
+    static IGraphConfig* nodeGetPortById(const IGraphConfig *node, int32_t id);
+
+    /*
+     * PORT-specialization
+     */
+
+    /**
+     * Check if port is at the edge
+     *
+     * \ingroup gcss
+     *
+     * A port is at the edge of the video execCtx (pipeline) if its peer is in a PG
+     * that has a different execCtxID (a.k.a. pipeline id) or if its peer is a
+     * virtual sink.
+     *
+     * Here we check for both conditions and return true if this port is at either
+     * edge of a pipeline
+     * \param[in] port Reference to port Graph node
+     * \return true if it is edge port
+     */
+    static bool isEdgePort(const IGraphConfig* port);
+
+    /**
+     * Check if port is virtual
+     *
+     * \ingroup gcss
+     *
+     * Check if the port is a virtual port. this is the end point
+     * of the graph. Virtual ports are the nodes of type sink.
+     *
+     * \param[in] port Reference to port Graph node
+     * \return true if it is a virtual port
+     * \return false if it is not a virtual port
+     */
+    static bool portIsVirtual(const IGraphConfig* port);
+    /**
+     * return child node full name, this is pg-name:child-name
+     *
+     * This makes the child name unique in the graph, because multiple
+     * nodes may have children named same way (ex: input)
+     *
+     * \ingroup gcss
+     *
+     * \param[in] port Reference to port Graph node
+     * \return string with the full name
+     */
+    static std::string getFullName(const IGraphConfig &child);
+
+    /**
+     * Return the port descriptor
+     *
+     * \ingroup gcss
+     *
+     * \param[in] port
+     * \param[out] descriptor
+     * \return 0 if it is an input port
+     * \return 1 if it is an output port
+     */
+    static css_err_t portGetDescriptor(const IGraphConfig* port,
+                                       PortDescriptor &desc);
+    /**
+     * Return the port direction
+     *
+     * \ingroup gcss
+     *
+     * \param[in] port
+     * \return 0 if it is an input port
+     * \return 1 if it is an output port
+     */
+    static int portGetDirection(const IGraphConfig* port);
+
+    /**
+     * For a given port node it constructs the fourCC code used in the connection
+     * object. This is constructed from the program group id.
+     *
+     * \ingroup gcss
+     *
+     * \param[in] portNode
+     * \param[out] stageId Fourcc code that describes the PG where this node is
+     *                     contained
+     * \param[out] terminalID Fourcc code that describes the port, in FW jargon,
+     *                        this is a PG terminal.
+     * \return css_err_none in case of no error
+     * \return css_err_argument in case some error is found
+     */
+    static css_err_t portGetFourCCInfo(const IGraphConfig *portNode,
+                                      ia_uid& stageId,
+                                      uint32_t& terminalId);
+
+    /**
+     * Retrieve the graph config node of the port that is connected to a given port.
+     *
+     * \ingroup gcss
+     *
+     * \param[in] port Node with the info of the port that we want to find its peer.
+     * \param[out] peer Pointer to a node where the peer node reference will be
+     *                  stored
+     * \return css_err_none
+     * \return css_err_argument if any of the graph settings is incorrect.
+     */
+    static css_err_t portGetPeer(const IGraphConfig* port, IGraphConfig** peer);
+
+    /**
+     * Finds the stream id of the program group that the port is in.
+     *
+     * \ingroup gcss
+     *
+     * \param[in] port The port whose stream id is being returned
+     * \return valid stream id, or -1 in case of error.
+     */
+    static int portGetStreamId(const IGraphConfig *port);
+    /**
+     * Finds the execCtx id of the program group that the port is in.
+     *
+     * \ingroup gcss
+     *
+     * \param[in] port The port whose execCtx is being returned
+     * \return valid execCtx id, or -1 in case of error.
+     */
+    static int portGetExecCtxId(const IGraphConfig *port);
+    static int getExecCtxIds(const IGraphConfig &setting,
+                             std::set<int32_t> &execCtxIds);
+    static int getExecCtxIdsTuningMap(const IGraphConfig &settings,
+                                      std::map<int32_t,int32_t> &execCtxIdsTuningMap);
+    static int portGetKey(const IGraphConfig *port, ia_uid uid);
+
+    /**
+    * Retrieves the basic information of a port. Uses the peer port (i.e. the
+    * port connected to this one) to get the information if not found from the
+    * given port.
+    *
+    * Returns an error if some of the information is missing unless it is a
+    * private port.
+    *
+    * \ingroup gcss
+    *
+    * \param[in] port        Port to query the format.
+    * \param[out] enabled    Passthrough, enabled or disabled status
+    * \param[out] terminalId Unique terminal id
+    */
+    static css_err_t portGetInfo(const GCSS::IGraphConfig *port,
+                                 uint32_t &enabled,
+                                 uint32_t &terminalId);
+
+    /**
+    * Retrieves the format information of a port. Uses the peer port (i.e. the
+    * port connected to this one) to get the information if not found from the
+    * given port.
+    *
+    * Returns an error if some of the information is missing unless it is a
+    * private port.
+    *
+    * \ingroup gcss
+    *
+    * \param[in] port        Port to query the format.
+    * \param[out] enabled    Passthrough, enabled or disabled status
+    * \param[out] terminalId Unique terminal id
+    * \param[out] width      Width of the frame in pixels
+    * \param[out] height     Height of the frame in lines
+    * \param[out] fourcc     Frame format
+    * \param[out] bpl        Bytes per line
+    * \param[out] bpp        Bits per pixel
+    */
+    static css_err_t portGetFormat(const GCSS::IGraphConfig *port,
+                                   uint32_t &enabled,
+                                   uint32_t &terminalId,
+                                   uint32_t &width,
+                                   uint32_t &height,
+                                   uint32_t &fourcc,
+                                   uint32_t &bpl,
+                                   uint32_t &bpp);
+
+    /** Apply given format to output port
+     *
+     * \ingroup gcss
+     *
+     * Applies given format to the port that the sink is connected to.
+     * The given format has to be present in the options list of the pg where the
+     * port belongs to. If there is no options list for the pg, then no error is
+     * returned and no format applied.
+     *
+     * \param[in] sink    Pointer to the sink in the graph.
+     * \param[in] format  Name of the format that is being applied
+     * \return css_err_none   in case of success
+     * \return css_err_data   in case the given format is not in the options list
+     */
+    static css_err_t applyFormat(const IGraphConfig *sink,
+                                 const std::string &format);
+
+    /**
+     * SENSOR-specialization
+     */
+
+    /**
+     * Get binning factor values from the given node
+     *
+     * \ingroup gcss
+     *
+     * \param[in] node the node to read the values from
+     * \param[out] hBin horizontal binning factor
+     * \param[out] vBin vertical binning factor
+     */
+    static css_err_t sensorGetBinningFactor(const IGraphConfig *node,
+                                           int &hBin, int &vBin);
+
+    /**
+     * Get scaling factor values from the given node
+     *
+     * \ingroup gcss
+     *
+     * \param[in] node the node to read the values from
+     * \param[out] scalingNum scaling ratio
+     * \param[out] scalingDenom scaling ratio
+     */
+    static css_err_t sensorGetScalingFactor(const IGraphConfig *node,
+                                           int &scalingNum,
+                                           int &scalingDenom);
+    /**
+    * sensorGetType
+    *
+    * Returns the sensor type as a string. Sensor types are typically
+    * BAYER, SVE, MD etc..
+    * The input is a valid graph settings (output of createGraph)
+    *
+    * \param[in] settings
+    * \param[out[ sensorType
+    * \return css_err_argument if the inputs arguments are invalid
+    * \return css_err_noentry if it could not find the sensor type
+    * \return css_err_none if everything went ok.
+    */
+    static css_err_t sensorGetType(const IGraphConfig *settings,
+                                   std::string &sensorType);
+
+    /**
+    * Get content type
+    *
+    * By default if content_type tag is not found will return pixel_data
+    *
+    * \ingroup gcss
+    *
+    * \param[in] node the node to read the values from
+    * \return content type string
+    */
+    static std::string portGetContentType(const IGraphConfig *node);
+
+    /**
+     * Analyse all connections between execution context.
+     * Generates 3 lists:
+     * - list of pair of names of inter-connections between execution contexts
+     * - list of input ports names associated with input streams
+     * - list of output ports names associated with output streams
+     *
+     * \ingroup gcss
+     *
+     * \param[in] graphHandle pointer to any node in the graph
+     * \param[out] connections set connections with edges pair
+     * \param[out] pixel_sources pixel data sources
+     * \param[out] pixel_sinks pixel data sinks
+     */
+    static css_err_t getExecCtxConnectionPorts(const IGraphConfig *graphHandle,
+                                               std::vector<StreamConnection> &connections,
+                                               std::vector<std::string> &pixel_sources,
+                                               std::vector<std::string> &pixel_sinks);
+    /**
+     * Finds input ports for the given execCtx or stream id
+     *
+     * \ingroup gcss
+     *
+     * \param[in] uid key identifying whether the next value is a stream id or
+     *                a exec ctx id.
+     * \param[in] execCtxId id of the execCtx OR stream id
+     * \param[in] graphHandle pointer to any node in the graph
+     * \param[out] ports reference to a vector of IGraphConfig where to store the
+     *                   found ports
+     * \param[in] computeKey GCSS key of compute element (usually PG or CB)
+     */
+    static css_err_t getInputPorts(ia_uid uid,
+                                   int32_t execCtxId,
+                                   const IGraphConfig &graphHandle,
+                                   std::vector<IGraphConfig *> &ports,
+                                   ia_uid computeKey = GCSS_KEY_PROGRAM_GROUP);
+    /**
+     * Finds output ports for the given execCtx or stream id
+     *
+     * \ingroup gcss
+     *
+     * \param[in] uid key identifying whether the next value is a stream id or
+     *                a exec ctx id.
+     * \param[in] execCtxId id of the execCtx OR stream id
+     * \param[in] graphHandle pointer to any node in the graph
+     * \param[out] ports reference to a vector of IGraphConfig where to store the
+     *                   found ports
+     * \param[in] computeKey GCSS key of compute element (usually PG or CB)
+     */
+    static css_err_t getOutputPorts(ia_uid uid,
+                                    int32_t execCtxId,
+                                    const IGraphConfig &graphHandle,
+                                    std::vector<IGraphConfig *> &ports,
+                                    ia_uid computeKey = GCSS_KEY_PROGRAM_GROUP);
+    /**
+     * Finds input port for the given execCtx or stream id
+     *
+     * \ingroup gcss
+     *
+     * \param[in] uid key identifying whether the next value is a stream id or
+     *                a exec ctx id.
+     * \param[in] execCtxId id of the execCtx OR stream id
+     * \param[in] graphHandle pointer to any node in the graph
+     * \param[out] port input port
+     * \param[in] computeKey GCSS key of compute element (usually PG or CB)
+     */
+    static css_err_t getInputPort(ia_uid uid,
+                                  int32_t execCtxId,
+                                  const IGraphConfig *graphHandle,
+                                  IGraphConfig **port,
+                                  ia_uid computeKey = GCSS_KEY_PROGRAM_GROUP);
+
+    /**
+     * getSubgraphPorts
+     *
+     * For a given subgraph, specified via stream id or exec-ctx id, retrieve the
+     * ports that cross subgraph boundaries.
+     *
+     * \ingroup gcss
+     * \param[in] uid Key to specify whether we are looking for stream id or exec ctx
+     *                ids input port. Possible values are GCSS_KEY_STREAM_ID or
+     *                GCSS_KEY_EXEC_CTX_ID
+     * \param[in] execCtxId Value of the stream/exec-ctx id
+     * \param[in] direction Either PORT_DIRECTION_INPUT or PORT_DIRECTION_OUTPUT
+     * \param[in] graphHandle Reference to the root node of the tree
+     * \param[in] computeKey
+     * \param[out] ports vector of pointers where to store the found port nodes.
+     *
+     * \return  css_err_argument in case of any of the input parameters being invalid
+     *                           or in case it did not find any port.
+     */
+    static css_err_t getSubgraphPorts(ia_uid uid,
+                                      int32_t execCtxId,
+                                      int32_t direction,
+                                      const IGraphConfig &graphHandle,
+                                      std::vector<IGraphConfig *> &ports,
+                                      ia_uid computeKey = GCSS_KEY_PROGRAM_GROUP);
+
+    /**
+     *
+     * Retrieve a list of program groups that belong to a given execCtx id or
+     * stream id.
+     * Iterates through the graph configuration storing the program groups
+     * that match this execCtx id into the provided vector.
+     *
+     * \param[in] uid Used to determine if we search the PG per stream-id or exec
+     *                ctx-id
+     * \param[in] value Depending on the key parameter this is the value of the
+     *                  stream-id or execCtx-id to match.
+     * \param[in] GCHandle Handle to get graph result.
+     * \param[out] programGroups Vector with the nodes that match the criteria.
+     */
+    static css_err_t getProgramGroups(ia_uid uid,
+                                     int32_t value,
+                                     const GCSS::IGraphConfig *GCHandle,
+                                     std::vector<IGraphConfig*> &pgs);
+
+    /**
+     * Retrieve the number of kernels inside a PG
+     *
+     * \param[in] pgNode Pointer to a IGraphConfig node that represents a PG.
+     * \param[out] kernelCount number of kernels found inside.
+     */
+    static css_err_t getKernelCountInPg(const GCSS::IGraphConfig *pgNode,
+                                        uint32_t &kernelCount);
+    /**
+     * Helper function to get values from the kernel settings
+     * \todo Moved to bxt aic utils, will be removed from here after hal has
+     *       adapted to changes.
+     * \ingroup gcss
+     *
+     * \param[in] kernelNode
+     * \param[out] palUuid
+     * \param[out] kernelId
+     * \param[out] metadata
+     * \param[out] enable
+     * \param[out] rcb
+     * \param[out] branchPoint
+     */
+    static css_err_t kernelGetValues(const IGraphConfig *kernelNode,
+                                    int32_t *palUuid = NULL,
+                                    int32_t *kernelId = NULL,
+                                    uint32_t *metadata = NULL,
+                                    int32_t *enable = NULL,
+                                    int32_t *rcb = NULL,
+                                    int32_t *branchPoint = NULL,
+                                    int32_t *sinkPort = NULL);
+
+    /**
+     * Return pointer to active source
+     *
+     * Graph descriptor may define multiple sources. This function returns
+     * pointer to source node that is set active.
+     *
+     * \ingroup gcss
+     *
+     * \param[in]  settings,   pointer to gc graph
+     * \param[out] sourceNode, vector of pointers to active sources
+     */
+    static css_err_t getSourceNode(const IGraphConfig *gcHandle,
+            std::vector<IGraphConfig*> &sourceNodes);
+
+
+    /**
+    * Retrieve all the sinks in the current graph configuration that match the
+    * input parameter string in their name attribute.
+    *
+    * If the name to match is empty it returns all the nodes of type sink
+    *
+    * \param[in] name String containing the name to match.
+    * \param[in] gcHandle pointer to the graph
+    * \param[out] sink List of sinks that match that name
+    * \return css_err_none in case of success
+    * \return css_err_noentry if no sinks were found in the graph config.
+    * \return css_err_argument if graph config handle is nullptr
+    */
+    static css_err_t graphGetSinksByName(const std::string &name,
+                                         const IGraphConfig *gcHandle,
+                                         std::vector<IGraphConfig*> &sinks);
+
+    /**
+     * Debug utils
+     */
+
+    /**
+     * Pretty print any recognized element: node, port, kernel
+     *
+     * \ingroup gcss
+     *
+     * \param[in] node of which name to print
+     */
+    static std::string print(const IGraphConfig *node);
+
+    /**
+     * Dumps the whole tree of nodes and attributes.
+     *
+     * \ingroup gcss
+     *
+     * \param node Node to dump
+     * \param depth Depth level of the dump. Default(whole tree) is 0
+     */
+    static void dumpNodeTree(const IGraphConfig* node, int depth = 0);
+
+    /**
+     * Convert string containing a number to a binary blob.
+     *
+     * \ingroup gcss
+     *
+     * \param[in] str String containing a number in decimal or hex (prefix "0x").
+     * \param[out] bytes Size of the new binary data in bytes.
+     *
+     * \return void* Pointer to the newly allocated binary data.
+     *               The format is little-endian, least significant bytes first.
+     *               Caller must free with IA_CIPR_FREE()
+     */
+    static void *numString2binary(const std::string &str, unsigned int *bytes = NULL);
+
+    /**
+     * Process the attribute overrides tags in the graph.
+     * The apply tag allows a graph to modify an attribute of a member node.
+     * The syntax is:
+     * <apply target="" value=""/>
+     * - Target is the fully qualified name of the  attribute we want to override.
+     *  By fully qualified we mean that it contains the names of all the nodes in the
+     *  hierarchy until the attribute. The names are separated by colon (:).
+     *   Ex, to change the attribute of a kernel the target  would be:
+     *   "node:kernel:attribute"
+     * - Value is the value to give the the attribute.
+     *
+     * Please note that this logic does not insert new attributes to a given node
+     * it just modifies an existing. The parsing of the graph will fail if
+     * the override tries to add a new attribute.
+     *
+     * This mechanism is useful to reduce the number of duplicated nodes that only
+     * differ in a few attributes. This is the case for example for the 8/10 bpp
+     * PSA node.
+     *
+     * \param[in] graphNode Node to the GDF graph
+     * \param[out] result Node to the resulting tree of combining the settings with
+     *                    the graph.
+     *
+     * \return css_err_none in case no error
+     *         css_err_data in case the node or attribute are not present in the
+     *                      current graph.
+     */
+    static css_err_t processGraphOverrides(GraphConfigNode& graphNode, GraphConfigNode& results);
+};
+
+/**
+ * \brief Rounds the given number up to the next power of 2
+ *
+ * Rounds given number up to the next power two. Up to number
+ * of bits in 'unsigned int' type.
+ *
+ * \returns Value of 'a' rounded up to the next power of two.
+ *          Zero in case of an overflow.
+*/
+inline unsigned ceil_pow2(unsigned a)
+{
+    // Maximum number of possible bit shifts, to avoid error situations
+    const int maxNumShifts = std::numeric_limits<unsigned>::digits - 1;
+
+    unsigned result = 1;
+    int shifts = 0;
+    while (result < a && shifts <= maxNumShifts) {
+        result <<= 1;
+        ++shifts;
+    }
+
+    if (shifts > maxNumShifts) {
+        // Overflow, return zero.
+        result = 0;
+    }
+
+    return result;
+}
+
+} // namespace GCSS
+
+#endif /* GCSS_UTILS_H_ */
diff --git a/camera/hal/intel/ipu6/include/gcss/graph_query_manager.h b/camera/hal/intel/ipu6/include/gcss/graph_query_manager.h
new file mode 100644
index 000000000000..092ce7f4dfb5
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/gcss/graph_query_manager.h
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef GRAPH_QUERY_MANAGER_H
+#define GRAPH_QUERY_MANAGER_H
+
+#include "gcss.h"
+#include "gcss_item.h"
+#include "gcss_utils.h"
+
+namespace GCSS {
+
+class GraphQueryManager
+{
+public:
+    GraphQueryManager() : mStrictQuery(true),
+                          mGS(nullptr),
+                          mGD(nullptr),
+                          mKey(-1){}
+    ~GraphQueryManager(){}
+
+    typedef std::map<ItemUID, std::string> GraphQuery;
+    typedef std::vector<IGraphConfig*> QueryResult;
+
+    /**
+    * isInitialized
+    *
+    * \ingroup gcss
+    *
+    * Returns true if the object has been initialized correctly with valid
+    * settings and descriptor
+    *
+    */
+    bool isInitialized() { return (mGS != nullptr && mGD != nullptr); };
+
+    /**
+     * Create graph
+     *
+     * \ingroup gcss
+     *
+     * Takes pointer to one of the settings found with queryGraphs and
+     * returns full graph combined with graph descriptor.
+     *
+     * \param[in] settings
+     * \param[out] result
+     */
+    css_err_t createGraph(IGraphConfig* settingsGraph, IGraphConfig** result);
+
+    /**
+     * Destroy graph
+     *
+     * \ingroup gcss
+     *
+     * Needs to be called for each graph created with createGraph
+     *
+     * \param[in] graph
+     *
+     */
+    static void destroyGraph(IGraphConfig* graph);
+
+    /**
+    * Query graphs
+    *
+    * \ingroup gcss
+    *
+    * Query graph settings file for settings that matches search terms in
+    * GraphQuery;
+    *
+    * \param[in] GraphQuery
+    * \param[out] QueryResult
+    * \param[optional | in] strict if true, all search terms has to match
+    */
+    css_err_t queryGraphs(const GraphQuery&,
+                          QueryResult&,
+                          bool strict = true);
+    css_err_t queryGraphs(const GraphQuery&,
+                          const QueryResult&,
+                          QueryResult&,
+                          bool strict = true);
+
+    /**
+     * Set graph settings
+     *
+     * \ingroup gcss
+     *
+     * Set parsed graph settings to graph query manager for later use.
+     *
+     * \param[in] settings
+     */
+    void setGraphSettings(const IGraphConfig* settings);
+
+    /**
+     * Set graph descriptor
+     *
+     * \ingroup gcss
+     *
+     * Set parsed graph descriptor to graph query manager for later use.
+     *
+     * \param[in] descriptor
+     */
+    void setGraphDescriptor(const IGraphConfig* descriptor);
+private:
+    css_err_t getGraph(GraphConfigNode*, GraphConfigNode*);
+    bool mStrictQuery; /**< true by default. True = every search item has to match
+                        false = at least one match */
+    // Store parsed data into these containers, instead of using a single node
+    const IGraphConfig *mGS; // graph settings
+    const IGraphConfig *mGD; // graph descriptor
+    int32_t mKey; // key of the selected setting
+
+    void goThroughSearchItems(const GraphQuery&, const IGraphConfig*, uint16_t&);
+
+    static css_err_t addSensorModeData(GraphConfigNode *sensorNode,
+                                      GraphConfigNode *sensorModesNode,
+                                      const std::string &sensorModeID);
+    css_err_t getConnectionData(const std::string& source_connection,
+                               const std::string& sink_connection,
+                               GraphConfigNode *settings,
+                               GraphConfigNode *ret_node);
+    css_err_t getStaticConnectionData(const std::string& source_connection,
+                                      const std::string& sink_connection,
+                                      GraphConfigNode *ret_node);
+    IGraphConfig *copyNodeToResult(IGraphConfig *descriptorNodes,
+                                   ia_uid nodeId,
+                                   GraphConfigNode* resultNode);
+    css_err_t propagateIntAttribute(IGraphConfig *srcNode,
+                                    IGraphConfig *dstNode,
+                                    ia_uid attributeId);
+    css_err_t propagateStrAttribute(IGraphConfig *srcNode,
+                                    IGraphConfig *dstNode,
+                                    ia_uid attributeId);
+    css_err_t validateSettingsAgainstDescriptor();
+    bool nodeHasBaseNode(IGraphConfig &graphNode, std::string &baseNodeName);
+    IGraphConfig* constructNodeFromBase(IGraphConfig *derivedNode,
+                                        std::string &baseName,
+                                        IGraphConfig *gdfNodesRoot);
+};
+} // namespace
+#endif
diff --git a/camera/hal/intel/ipu6/include/gcss/graph_utils.h b/camera/hal/intel/ipu6/include/gcss/graph_utils.h
new file mode 100644
index 000000000000..ca58af8afb7c
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/gcss/graph_utils.h
@@ -0,0 +1,448 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef IA_CAMERA_GCSS_GRAPH_UTILS_GRAPH_UTILS_H_
+#define IA_CAMERA_GCSS_GRAPH_UTILS_GRAPH_UTILS_H_
+
+#include <memory>
+#include <functional>
+#include <set>
+
+extern "C" {
+#include "ia_isp_bxt_types.h"
+}
+#include "gcss.h"
+#include "gcss_utils.h"
+
+namespace GCSS {
+
+
+/**
+ * \class GraphUtil
+ *
+ * This class implements similar functionality as BxtAicUtils. It is meant as
+ * a replacement for IPU6 graphs that contain more explicit graph information.
+ * It is then an internal implementation detail of BxtAicUtils that has more
+ * capabilities.
+ *
+ * This class analyses the graph settings and creates a representation
+ * of the graph and inner imaging graphs.
+ *
+ * This representation does not duplicate data, just stores it in a more
+ * convenient way to perform graph operations.
+ *
+ * We need to separate conceptually the XML data stored in IGraphConfig containers
+ * (that is also stored as a tree of nodes) from the actual graph that represents
+ * the information stored, the graph that represents an imaging system.
+ * For that we formalise the following concepts:
+ * - Container graph: This is the graph made out of IGraphConfig nodes. It is a
+ *   representation of the XML hierarchical structure. The information stored
+ *   in this graph is a 1:1 mapping with the XML data. IGraphConfig methods
+ *   helps us to traverse this graph and find information from the nodes (xml
+ *   tags) and xml attributes.
+ *
+ * - Camera Graph: this is the graph that represents a camera subsystem. The nodes
+ *   in this graph are sensor, buffer source/sinks and processing nodes like
+ *   Program Groups (FW).
+ *
+ * - Imaging Graph: This is the graph that represents the image processing
+ * nodes inside the camera graph processing nodes (ex: PG). The nodes of
+ * this graph are imaging kernels (PAL/ATE), routing elements (mux/demux/split)
+ * and also PG ports because one imaging graph may expand multiple PG's
+ *
+ * - Meta-graph: This is the graph made out of camera subgraphs. The Camera graph
+ * may group its nodes in two different ways:
+ *   - stream-id: this traditionally aligns with the video/still/IR pipes.
+ *   - execution context id: This grouping is done to split the nodes in separate
+ *   threads (execution contexts). Only used by CISU.
+ *
+ * Conceptually the last three graphs are nested, the metagraph is at the top,
+ * then the camera graph and finally the imaging graph.
+ *
+ * The imaging graphs are split per subgraph id because the structures given to
+ * PAL are also grouped by subgraph id, whatever this may be (stream-id or exec-ctx)
+ *
+ * The container graph is the data storage that is passed during the initialisation
+ * of this class, but the other three graphs are now represented by the
+ * following member variables of this class:
+ * - Camera Graph: mGraphNodes
+ * - MetaGraph : mSubGraphInfoMap
+ * - Imaging Graph: inside a a subgraph info map entry as imagingGraph.
+ *
+ * All the nodes of these three graphs derived from the same base struct that
+ * contains the needed fields to traverse those graphs in topological order.
+ * This is, a bi-directional adjacently list.
+ * With this representation it is very easy to perform any type of operation in
+ * topological order. We use the same algorithm (Graph Depth First) implemented
+ * in method traverseGraph with different visitor functions.
+ * Same scheme can be used at any of those 3 levels.
+ *
+ * At the moment the visitors are used for:
+ * - Dumping information in traces for each node (for the 3 graphs)
+ * - Calculating the resolution history of the imaging kernels
+ * - detecting subgraph boundaries at the camera graph
+ *
+ * Any new operation on the graph only requires a new visitor function at the
+ * correct level of detail (meta-graph, graph or imaging-graph)
+ *
+ */
+class GraphUtil
+{
+public:
+    GraphUtil();
+    ~GraphUtil();
+    /**
+     * Initialise the GraphUtils class.
+     * During this call the class will analyse the graph settings and create
+     * structures to store the information of the imaging kernels found.
+     * It creates
+     * \param[in] subgraphType either GCSS_KEY_STREAM_ID or GCSS_ID_EXEC_CTX
+     *                         It determines what type of subgraph will be used
+     *                         to group the kernels.
+     * \param[in] ipuVer IPU version
+     *
+     * \param[out] gcHandle Pointer to a IGraphConfig Object that represents
+     *                      some graph-settings.
+     * \return css_err_none if everything is fine
+     * \return css_err_no_memory if there is some problem allocating the new
+     *                           structures.
+     * \return css_err_internal if there is some problem with the graph settings
+     *                          being analysed
+     */
+    css_err_t init(ia_uid subgraphType, const IGraphConfig *gcHandle,
+                   GdfVersion ipuVer = GdfVersion::GDF_VERSION_IPU6);
+
+    /* Query methods */
+    /**
+     * isInitialized
+     * returns true if the class was initialised with some settings
+     */
+    inline bool isInitialized() { return (mGraphSettings != nullptr); }
+    /**
+     * Get program group by execution context Id or stream id
+     *
+     *
+     * Fills the provided structure with the relevant data for that subgraph
+     * id provided. This id needs to be align with the construction time parameter.
+     * i.e. you cannot construct this object with GCSS_KEY_STREAM_ID and then
+     * pass a execution ctx id to this method.
+     *
+     * The granularity of the subgraphs is different and it should match the
+     * granularity of the AIC execution.
+     *
+     * \param[in] subgraphId A stream id (or exec Ctx) of the program group
+     *                      being requested.
+     *                      The concrete value needs to be in sync with the input
+     *                      parameter during initialisation call.
+     * \param[out] pg reference to a program group struct being populated
+     *
+     * \return css_err_none if everything is fine.
+     * \return css_err_data if the subgraph does not contain any subgraphs with
+     *                      the requested id.
+     */
+    css_err_t getAicData(int32_t subgraphId, ia_isp_bxt_program_group &pg);
+
+    /**
+    * Get the AIC PG info from a IGraphConfig PG node.
+    * The PG node must be part of the settings that where used to initialize this
+    * instance.
+    *
+    * \param[in] pgNode A IGraphConfig Node that represents the PG whose kernels
+    *                   we want to retrieve.
+    * \param[out] pg reference to a program group struct being populated
+    *
+    * \return css_err_none if everything is fine.
+    * \return css_err_data if the PG is not in the settings used during initialization
+    */
+    css_err_t getPgAicData(const IGraphConfig *pgNode, ia_isp_bxt_program_group &pg);
+
+    css_err_t getSourceResolutionHistory(ia_isp_bxt_resolution_info_t &history) {
+        history = mSourceHistory;
+        return css_err_none;
+    };
+    /**
+     * Debugging tool to dump to error traces the AIC structures of the given
+     * subgraph id.
+     * \param[in] subgraphId
+     */
+    void dumpKernels(int32_t subgraphId);
+
+private: // types
+    /**
+     * \struct KernelInfoMemPool
+     * structure to associate the array of run kernel structs for each
+     * subgraph-id or PG,
+     * and the resolution info structures allocated for each kernel.
+     * Each kernel needs two, the size of these vector should
+     * match the number of kernels in a given subgraph-id.
+     * This struct is used only for memory management purposes (allocate/free).
+     * We need this for two reasons:
+     * - because the structure ia_isp_bxt_run_kernels_t has pointers to two
+     *   structures of type ia_isp_bxt_resolution_info_t that may be null.
+     * - because the interface of AIC requires a C-style array of run kernels
+     *   structures
+     */
+    struct KernelInfoMemPool {
+           ia_isp_bxt_run_kernels_t *runKernels;
+           size_t kernelCount;
+           std::vector<ia_isp_bxt_resolution_info_t *> resHistorys;
+           std::vector<ia_isp_bxt_resolution_info_t *> resInfos;
+    };
+    /**
+     * \enum
+     * Type of the inner graph nodes
+     */
+    enum ImagingNodeType {
+            IMAGING_NODE_KERNEL,
+            IMAGING_NODE_MUX,
+            IMAGING_NODE_DEMUX,
+            IMAGING_NODE_SPLIT,
+            IMAGING_NODE_PG_PORT_IN,
+            IMAGING_NODE_PG_PORT_OUT,
+            IMAGING_NODE_NONE
+    };
+    /**
+     * \struct BaseGraphNode
+     * Base structure that is used for the three types of nodes that
+     * the camera graph has at different levels
+     * Top level meta-graph made out of subgraphs
+     * Medium level graph made out of sources, PG's, sink etc..
+     * Inner graph that represent the imaging elements inside the Program Group
+     * nodes the inner graph is made out of kernels, mux/demux and ports of the
+     * PG's
+     * This structure has the basics to traverse the graph in any direction
+     * using standard graph traversal algorithms.
+     */
+
+    struct BaseGraphNode {
+        std::string name;
+        IGraphConfig* data;
+        bool visited;
+        std::map<BaseGraphNode*, std::string > parents;
+        std::map<BaseGraphNode*, std::string> children;
+        BaseGraphNode(): data(nullptr), visited(false) {}
+        void addParent(BaseGraphNode *p, std::string pinId) {
+            parents.insert(std::pair<BaseGraphNode*, std::string>(p, pinId));
+        }
+        void addChild(BaseGraphNode *c, std::string pinId) {
+            children.insert(std::pair<BaseGraphNode*, std::string>(c, pinId));
+        }
+        void removeChild(BaseGraphNode *c) {
+            auto it = children.find(c);
+            if (it != children.end()) {
+                children.erase(it);
+            }
+        }
+        void removeParent(BaseGraphNode *p) {
+            auto it = parents.find(p);
+            if (it != parents.end()) {
+                parents.erase(it);
+            }
+        }
+        void emanzipate() {
+            for (auto &p : parents) {
+                p.first->removeChild(this);
+            }
+            for (auto &c : children) {
+                c.first->removeParent(this);
+            }
+        }
+    };
+
+    struct GraphNode : public BaseGraphNode {
+        ia_uid type;    /**<GCSS_KEY_HW, GCSS_KEY_PROGRAM_GROUP, GCSS_KEY_SINK */
+        int32_t streamId;
+        int32_t exeCtxId;
+        GraphNode(): BaseGraphNode(),
+                     type(GCSS_KEY_PROGRAM_GROUP),
+                     streamId(-1),
+                     exeCtxId(-1){}
+    };
+    typedef std::shared_ptr<GraphNode> GraphNodePtr;
+
+    enum ImagingNodeFlags {
+        IMAGING_NODE_FLAG_NONE,
+        IMAGING_NODE_FLAG_RCB            = (0x1 << 0),      /*<! if this imaging node kernel is a Resolution Changing Block or not*/
+        IMAGING_NODE_FLAG_PRIVATE_PORT   = (0x1 << 1),
+        IMAGING_NODE_FLAG_DISABLED       = (0x1 << 2),  /*<! This flag has the same meaning as the kernel enabled field, but is generic for all types of imaging nodes */
+        IMAGING_NODE_FLAG_MAX            = (0x1 << 3)
+    };
+    /**
+     * \struct ImagingNode
+     * Node in the pipe of imaging elements (kernels)
+     * This struct is used to create a graph of nodes and perform operations
+     * in topological order, like the resolution history calculation.
+     * The information of the links is derived from kernel links(klink)
+     * The resolution history used for the run_kernel struct is usually filled
+     * from the parent. The modifications of the history from this node
+     * are stored in the member nextresolutionHistory. They are meant for the children
+     * nodes.
+     * In order to suport kernels with more than 1 child we have the resoltuion
+     * info and nextresolutionHistory as vectors, one per output klink
+     */
+    struct ImagingNode : public BaseGraphNode {
+        ImagingNodeType type;
+        int32_t flags;
+        std::map<std::string, ia_isp_bxt_resolution_info_t> resolutionInfo;  /*<! resolution info for each of the outputs of this kernel, key is kernel output pin name */
+        std::map<std::string, ia_isp_bxt_resolution_info_t> nextResolutionHistory; /*<! resolution history for the NEXT kernels (children nodes) ,  key is kernel output pin name*/
+        ia_isp_bxt_resolution_info_t currentHistory;
+        ia_isp_bxt_run_kernels_t kernelInfo; /*<! local copy used for temporary operations */
+        ia_isp_bxt_run_kernels_t *outKInfo; /*<! preallocated run_kernels for output towards AIC.*/
+        int32_t routingActivePath; /*<! In case this node is a routing element (mux/demux) this member stores the active input/output */
+        ImagingNode();
+    };
+    typedef std::shared_ptr<ImagingNode> ImagingNodePtr;
+
+    /**
+     * \struct SubGraphInfo
+     * Container for the information of a single subgraph.
+     * The type of subgraph can be stream-id or exec-ctx.
+     * It can be also considered a node of a meta-graph made out of subgraphs.
+     */
+    struct SubGraphInfo : public BaseGraphNode {
+        ia_uid subgraphType;  /**< gcss key for exec-ctx or stream-id */
+        int32_t id;           /**< id fo the subgraph */
+        /**< if the subgraph type is stream id this value is the same as id,
+         * if subgraph type is execution context then this value is the stream
+         * id of all the nodes inside the subgraph, there cannot be more than 1
+         **/
+        int32_t streamId;
+        uint32_t ispTuningMode;
+        std::vector<GraphNode*> nodes;
+        std::vector<IGraphConfig*> pgs;
+        std::vector<IGraphConfig*> inputPorts;
+        std::vector<IGraphConfig*> outputPorts;
+        size_t kernelCount;
+        ia_isp_bxt_run_kernels_t *kernelMemory;
+        std::map<std::string, ImagingNodePtr> imagingGraph;
+        SubGraphInfo() : BaseGraphNode(),
+                         subgraphType(GCSS_KEY_STREAM_ID),
+                         id(0), streamId(-1),
+                         ispTuningMode(0),kernelCount(0),
+                         kernelMemory(nullptr) {}
+    };
+    typedef std::shared_ptr<SubGraphInfo> SubGraphInfoPtr;
+
+    struct KernelLink {
+        KernelLink(IGraphConfig &kl);
+        bool isSrcAPort() { return srcPin.empty(); }
+        bool isDstAPort() { return dstPin.empty(); }
+        std::string toStr() { return srcNode + ":" + srcPin + "->" + dstNode + ":" + dstPin; }
+        std::string srcNode;
+        std::string srcPin;
+        std::string dstNode;
+        std::string dstPin;
+    };
+private: //methods
+    css_err_t analyzeGraphSettings();
+    css_err_t allocateAicData();
+    void deleteAicStructs();
+    css_err_t populateAicData();
+    css_err_t removeUnusedNodes();
+    css_err_t disableKernelsToDisabledTerminals(SubGraphInfo &sgInfo);
+    css_err_t analyzeSubGraphs(std::map<int32_t, SubGraphInfoPtr> &infoMap);
+    css_err_t addGraphNode(IGraphConfig &node);
+    css_err_t addGraphConnection(IGraphConfig &node);
+    css_err_t addImagingNode(SubGraphInfo& sgInfo, IGraphConfig& kernel, std::string pgName);
+    css_err_t addImagingLink(SubGraphInfo &ctxInfo, IGraphConfig &klink,
+                             IGraphConfig &pg);
+    css_err_t addRoutingNode(SubGraphInfo &sgInfo, IGraphConfig &routing,
+                             ImagingNodeType type, std::string pgName);
+    css_err_t collectPgInnerGraph(SubGraphInfo &sgi, IGraphConfig &pg);
+    css_err_t collectSourceInnerGraph(SubGraphInfo &sgi);
+    css_err_t collectInterPgConnections(SubGraphInfo &sgi);
+    css_err_t collectSubgraphConnections();
+    css_err_t traverseGraph(BaseGraphNode *item,
+                            std::function<css_err_t(BaseGraphNode*)> &f,
+                            bool forward = true);
+    css_err_t getDownstreamSubgraphs(IGraphConfig *src,
+                                    std::vector<int32_t> &subgraphIds);
+    css_err_t calculateSourceResHistory(SubGraphInfo &sgi,
+                                       ia_isp_bxt_resolution_info_t &resHistory);
+    css_err_t fillAicRunKernels(SubGraphInfo &sgi);
+    css_err_t getUpstreamResHistory(ImagingNode &portNode);
+    css_err_t getCrossSgInPorts(GraphNode &node,
+                                std::vector<IGraphConfig *> &ports);
+    css_err_t getParentHistory(ImagingNode &child,
+                               ia_isp_bxt_resolution_info_t &parentHistory);
+    css_err_t getKernelResolutionInfos(ImagingNode &kNode);
+    css_err_t disableDisconnectedKernels(SubGraphInfo &sgi);
+    void getAvailableSubgraphs(std::set<int32_t> &ids);
+    void resetGraph();
+    void resetInnerGraph(SubGraphInfo &sgi, bool reportUnvisited = true);
+    void resetMetaGraph();
+    css_err_t subgraphConnectionVisitor(BaseGraphNode *n);
+    css_err_t resHistoryCalcVisitor(BaseGraphNode *n);
+    css_err_t resHistoryINodeVisitor(BaseGraphNode *n);
+    css_err_t kernelDisableVisitor(BaseGraphNode *n, bool forward = false);
+    css_err_t kernelDisconectedVisitor(BaseGraphNode *n, bool forward = false);
+    css_err_t activeNodeVisitor(BaseGraphNode *n, std::vector<std::string> *nodes);
+    css_err_t getUnvisitedInputPortsPeers(SubGraphInfo &sgi, std::vector<ImagingNode*> &internalInputPeers);
+    // Debug utils
+    void dumpSubGraphInfos();
+    void dumpInnerGraph(int32_t id);
+    void dumpOuterGraph();
+    void dumpAicStructs();
+    static css_err_t dumpInnerNodeVisitor(BaseGraphNode *item, ImagingNodeType type);
+    static css_err_t printOuterNode(BaseGraphNode *item);
+private: // members
+    const IGraphConfig *mGraphSettings;
+    ia_uid mSubgraphType;   /**< GCSS_KEY_STREAM_ID, GCSS_KEY_EXEC_CTX_ID */
+    ia_isp_bxt_resolution_info_t mSourceHistory;
+
+    /**
+     * map with the Info for each subgraph, the key is the subgraph id.
+     * The concrete subrgraph type is passed in the constructor
+     * we can use stream-id or execution-context-id
+     * The inner graphs are stored in the SubgraphInfo structure
+     */
+    std::map<int32_t, SubGraphInfoPtr> mSubgraphInfoMap;
+
+    /**
+     * outer graph as represented by the lighter GraphNode structures.
+     * The key is the name of the node.
+     */
+    std::map<std::string, GraphNodePtr> mGraphNodes;
+    std::vector<IGraphConfig*> mConnections;
+    /**
+     * map used to store the memory for the AIC structs associated with a given
+     * subgraph id. The key of the map is the subgraph-id
+     * This map is used only for memory management (alloc/free).
+     * The arrays stored here are used via the SubgraphInfo::kernelMemory field
+     */
+    std::map<int32_t, KernelInfoMemPool> mKernelMemoryMap;
+    /**
+    * map used to store the memory for the AIC structs associated with a given
+    * PG id. The key of the map is the IGraphConfig Node address that represents
+    * each node.
+    * This map is used only for memory management (alloc/free).
+    */
+    std::map<const IGraphConfig*, KernelInfoMemPool> mPGKernelMemoryMap;
+    /**
+     * IPU version
+     */
+    GCSS::GdfVersion mIpuVer;
+    /**
+     * if IPU version is < than 7 the computeKey is GCSS_KEY_PROGRAM_GROUP
+     * in IPU7 the concept of PG was replace with compute blocks. in this
+     * case the mComputeKeyUid id GCSS_KEY_COMPUTE_BLOCK
+     */
+    ia_uid mComputeKeyUid;
+};
+
+} //namespace GCSS
+
+
+#endif /* IA_CAMERA_GCSS_GRAPH_UTILS_GRAPH_UTILS_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_cipf/ia_cipf_types.h b/camera/hal/intel/ipu6/include/ia_cipf/ia_cipf_types.h
new file mode 100644
index 000000000000..06b4f254c13f
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_cipf/ia_cipf_types.h
@@ -0,0 +1,409 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _IA_CIPF_TYPES_H_
+#define _IA_CIPF_TYPES_H_
+
+#include <ia_tools/ia_list.h>
+#include <ia_tools/css_types.h>
+
+/** \file ia_cipf_types.h
+ *
+ * Definitions for datatypes used with public CIPF interfaces
+ *
+ * \ingroup ia_cipf
+ *
+ * Includes opaque CIPF objects and types for data management
+ */
+
+/**
+ * \ingroup ia_cipf
+ */
+typedef struct _cipf_terminal ia_cipf_terminal_t;
+
+/**
+ * \ingroup ia_cipf
+ */
+typedef struct _cipf_container ia_cipf_container_t;
+
+/**
+ * \ingroup ia_cipf
+ */
+typedef struct _cipf_connection ia_cipf_connection_t;
+
+/**
+ * \ingroup ia_cipf
+ */
+typedef struct ia_cipf_registry ia_cipf_registry_t;
+
+/**
+ * \ingroup ia_cipf
+ */
+typedef struct _cipf_property ia_cipf_property_t;
+
+/**
+ * \ingroup ia_cipf
+ */
+typedef struct _cipf_stage ia_cipf_stage_t;
+
+/**
+ * \ingroup ia_cipf
+ */
+typedef css_err_t (*ia_cipf_stage_completion_op_t)(ia_cipf_stage_t*, void *priv);
+
+/** ia_cipf_iterator_t - context of single pipeline iteration
+ *
+ * \ingroup ia_cipf
+ *
+ * Iterator object holds accessors (<stage, container>-pairs called parcels)
+ * for pipeline components associated with single execution step. Amount of
+ * stages and terminals within single execution step may vary based on
+ * DAG definition.
+ */
+typedef struct ia_cipf_iterator ia_cipf_iterator_t;
+
+/**
+ * \ingroup ia_cipf
+ */
+typedef struct ia_cipf_pipe ia_cipf_pipe_t;
+
+/**
+ * \ingroup ia_cipf
+ */
+typedef uint32_t ia_uid;
+
+/**
+ * \ingroup ia_cipf
+ */
+#define ia_fourcc(a, b, c, d) ((uint32_t)(d) | ((uint32_t)(c) << 8) \
+                              | ((uint32_t)(b) << 16) | ((uint32_t)(a) << 24))
+
+ /**
+ * \ingroup ia_cipf
+ * macro used to print in traces the fourcc values
+ * firs macro is used to define the format.
+ */
+#define ia_fourcc_conv "%c%c%c%c"
+#define ia_fourcc_to_conv(fourcc) \
+        ((fourcc) >> 24) & 0x7f, ((fourcc) >> 16) & 0x7f,\
+        ((fourcc) >> 8) & 0x7f, (fourcc) & 0x7f
+
+typedef struct log_context log_context_t;
+
+/*
+ * \todo Add documentation where do the format definitions come from
+ * and/or how are they defined.
+ */
+
+/* Native UID definitions for fourcc pixel formats */
+#define ia_cipf_frame_fourcc_i420 ia_fourcc('V','4','2','0')
+#define ia_cipf_frame_fourcc_iyuv ia_fourcc('I','Y','U','V') /* YUV420 planar */
+#define ia_cipf_frame_fourcc_yv12 ia_fourcc('Y','V','1','2') /* YUV420 planar U and V reversed */
+#define ia_cipf_frame_fourcc_ciyuv ia_fourcc('C','I','Y','U') /* YUV420 planar 8bpe, compressed */
+#define ia_cipf_frame_fourcc_p01y ia_fourcc('P','0','1','Y') /* YUV420 planar 10bpp, compressed */
+#define ia_cipf_frame_fourcc_c420 ia_fourcc('C','4','2','0') /* YUV420 planar, 16bpe compressed */
+#define ia_cipf_frame_fourcc_m420 ia_fourcc('M','4','2','0') /* YUV420 semi-planar line interleaved */
+#define ia_cipf_frame_fourcc_nv12 ia_fourcc('N','V','1','2')
+#define ia_cipf_frame_fourcc_p412 ia_fourcc('P','4','1','2') /*YUV420 planar 12bpp */
+#define ia_cipf_frame_fourcc_cnv12_tnr ia_fourcc('C','T','1','2') /* Compressed planar NV12, for TNR input/output */
+#define ia_cipf_frame_fourcc_cnv12 ia_fourcc('C','N','1','2') /* Compressed semi-planar NV12,  */
+#define ia_cipf_frame_fourcc_pc10 ia_fourcc('P','C','1','0') /* Compressed semi-planar P010 MSB  */
+#define ia_cipf_frame_fourcc_pc12 ia_fourcc('P','C','1','2') /* Compressed semi-planar P012 MSB  */
+#define ia_cipf_frame_fourcc_nv21 ia_fourcc('N','V','2','1')
+#define ia_cipf_frame_fourcc_nv16 ia_fourcc('N','V','1','6')
+#define ia_cipf_frame_fourcc_yuy2 ia_fourcc('Y','U','Y','2')
+#define ia_cipf_frame_fourcc_ba10 ia_fourcc('B','A','1','0')
+#define ia_cipf_frame_fourcc_rg10 ia_fourcc('R','G','1','0')
+#define ia_cipf_frame_fourcc_bg10 ia_fourcc('B','G','1','0')
+#define ia_cipf_frame_fourcc_gb10 ia_fourcc('G','B','1','0')
+#define ia_cipf_frame_fourcc_gr08 ia_fourcc('G','R','0','8')
+#define ia_cipf_frame_fourcc_gr10 ia_fourcc('G','R','1','0')
+#define ia_cipf_frame_fourcc_grbg ia_fourcc('G','R','B','G')
+#define ia_cipf_frame_fourcc_rggb ia_fourcc('R','G','G','B')
+#define ia_cipf_frame_fourcc_bggr ia_fourcc('B','G','G','R')
+#define ia_cipf_frame_fourcc_gbrg ia_fourcc('G','B','R','G')
+#define ia_cipf_frame_fourcc_y800 ia_fourcc('Y','8','0','0')
+#define ia_cipf_frame_fourcc_tile ia_fourcc('T','I','L','E') /* NV12 tiled TileYUV420_8_SP */
+#define ia_cipf_frame_fourcc_cile ia_fourcc('C','I','L','E') /* NV12 tiled, compressed TileYUV420_8_SP_C */
+#define ia_cipf_frame_fourcc_bin8 ia_fourcc('B','I','N','8')
+#define ia_cipf_frame_fourcc_uyvy ia_fourcc('U','Y','V','Y')
+#define ia_cipf_frame_fourcc_srgb48 ia_fourcc('S','R','4','8')
+#define ia_cipf_frame_fourcc_yuv420_16_pl ia_fourcc('S','4','2','0')
+#define ia_cipf_frame_fourcc_yuv444_8_pl ia_fourcc('N','A','N','A')
+#define ia_cipf_frame_fourcc_yuv420_8_sp_c_tnr ia_fourcc('C','T','1','2')
+#define ia_cipf_frame_fourcc_yuv420_16_sp ia_fourcc('P','0','1','6')
+
+/* pdaf bayer formats */
+#define ia_cipf_frame_fourcc_pafn ia_fourcc('P','A','F','n')
+#define ia_cipf_frame_fourcc_pafi ia_fourcc('P','A','F','i')
+#define ia_cipf_frame_fourcc_paf_08 ia_fourcc('P','F','8','n')
+#define ia_cipf_frame_fourcc_paf_10 ia_fourcc('P','F','1','n')
+#define ia_cipf_frame_fourcc_paf_12 ia_fourcc('P','F','2','n')
+#define ia_cipf_frame_fourcc_paf_14 ia_fourcc('P','F','4','n')
+#define ia_cipf_frame_fourcc_paf_16 ia_fourcc('P','F','6','n')
+
+#define ia_cipf_frame_fourcc_paf_08i ia_fourcc('P','F','8','i')
+#define ia_cipf_frame_fourcc_paf_10i ia_fourcc('P','F','1','i')
+#define ia_cipf_frame_fourcc_paf_12i ia_fourcc('P','F','2','i')
+#define ia_cipf_frame_fourcc_paf_14i ia_fourcc('P','F','4','i')
+#define ia_cipf_frame_fourcc_paf_16i ia_fourcc('P','F','6','i')
+
+#define ia_cipf_frame_fourcc_ba12 ia_fourcc('B','A','1','2')
+
+/* CSS format fourcc codes for export */
+#define css_fourcc_raw                  ia_fourcc('C','S','B','A')
+
+/* Vectorized Bayer formats */
+#define css_fourcc_bggr_10_v32          ia_fourcc('b','V','0','E')
+#define css_fourcc_gbrg_10_v32          ia_fourcc('b','V','0','F')
+#define css_fourcc_grbg_10_v32          ia_fourcc('b','V','0','G')
+#define css_fourcc_rggb_10_v32          ia_fourcc('b','V','0','H')
+#define css_fourcc_bggr_12_v32          ia_fourcc('b','V','0','I')
+#define css_fourcc_gbrg_12_v32          ia_fourcc('b','V','0','J')
+#define css_fourcc_grbg_12_v32          ia_fourcc('b','V','0','K')
+#define css_fourcc_rggb_12_v32          ia_fourcc('b','V','0','L')
+
+/* Not actually raw interleaved format but 12 bit vectorized GRBG bayer. Wrong
+ * naming but is still used in HAL.
+ ** \todo Remove this definition once there are no more dependencies */
+#define css_fourcc_raw_interleaved      css_fourcc_grbg_12_v32
+
+/* Packed vectorized Bayer formats */
+#define css_fourcc_bggr_10_v32_p64      ia_fourcc('b','V','0','M')
+#define css_fourcc_gbrg_10_v32_p64      ia_fourcc('b','V','0','N')
+#define css_fourcc_grbg_10_v32_p64      ia_fourcc('b','V','0','O')
+#define css_fourcc_rggb_10_v32_p64      ia_fourcc('b','V','0','P')
+#define css_fourcc_bggr_12_v32_p64      ia_fourcc('b','V','0','Q')
+#define css_fourcc_gbrg_12_v32_p64      ia_fourcc('b','V','0','R')
+#define css_fourcc_grbg_12_v32_p64      ia_fourcc('b','V','0','S')
+#define css_fourcc_rggb_12_v32_p64      ia_fourcc('b','V','0','T')
+
+/* Packed Normal Bayer Formats */
+#define css_fourcc_bggr_14_p64          ia_fourcc('p','B','E','E')
+#define css_fourcc_gbrg_14_p64          ia_fourcc('p','G','E','E')
+#define css_fourcc_grbg_14_p64          ia_fourcc('p','g','E','E')
+#define css_fourcc_rggb_14_p64          ia_fourcc('p','R','E','E')
+#define css_fourcc_bggr_12_p64          ia_fourcc('p','B','C','C')
+#define css_fourcc_gbrg_12_p64          ia_fourcc('p','G','C','C')
+#define css_fourcc_grbg_12_p64          ia_fourcc('p','g','C','C')
+#define css_fourcc_rggb_12_p64          ia_fourcc('p','R','C','C')
+#define css_fourcc_bggr_10_p64          ia_fourcc('p','B','A','A')
+#define css_fourcc_gbrg_10_p64          ia_fourcc('p','G','A','A')
+#define css_fourcc_grbg_10_p64          ia_fourcc('p','g','A','A')
+#define css_fourcc_rggb_10_p64          ia_fourcc('p','R','A','A')
+
+/* Line interleaved formats */
+#define css_fourcc_bggr_10_li           ia_fourcc('C','S','L','0')
+#define css_fourcc_gbrg_10_li           ia_fourcc('C','S','L','1')
+#define css_fourcc_grbg_10_li           ia_fourcc('C','S','L','2')
+#define css_fourcc_rggb_10_li           ia_fourcc('C','S','L','3')
+#define css_fourcc_bggr_12_li           ia_fourcc('C','S','L','4')
+#define css_fourcc_gbrg_12_li           ia_fourcc('C','S','L','5')
+#define css_fourcc_grbg_12_li           ia_fourcc('C','S','L','6')
+#define css_fourcc_rggb_12_li           ia_fourcc('C','S','L','7')
+
+/* Compressed bayer formats */
+#define css_fourcc_bggr_8_c             ia_fourcc('B','G','8','C')
+#define css_fourcc_gbrg_8_c             ia_fourcc('G','B','8','C')
+#define css_fourcc_grbg_8_c             ia_fourcc('G','R','8','C')
+#define css_fourcc_rggb_8_c             ia_fourcc('R','G','8','C')
+#define css_fourcc_bggr_10_c            ia_fourcc('B','G','1','C')
+#define css_fourcc_gbrg_10_c            ia_fourcc('G','B','1','C')
+#define css_fourcc_grbg_10_c            ia_fourcc('G','R','1','C')
+#define css_fourcc_rggb_10_c            ia_fourcc('R','G','1','C')
+
+/* YUV formats */
+#define css_fourcc_internal_yuv_line    ia_fourcc('C','S','Y','C')
+#define css_fourcc_yyuv420_v32          ia_fourcc('y','0','3','2')
+#define css_fourcc_yyuv420_12_v32_p64   ia_fourcc('y','0','3','6')
+#define css_fourcc_yuv420_internal      ia_fourcc('C','S','Y','I') /* denotes all YUVs with bpe 8, for TNR, for example */
+#define css_fourcc_yplanar              ia_fourcc('C','S','Y','P')
+#define css_fourcc_yuv420_12_p64        ia_fourcc('C','S','4','2')
+#define css_fourcc_yuv420_10_p64        ia_fourcc('C','S','4','0')
+
+#define css_fourcc_p010                 ia_fourcc('P','0','1','0')
+#define css_fourcc_p010_lsb             ia_fourcc('P','0','1','L')
+/* Intel internal format: P010 Tile-Y (MSB) */
+#define css_fourcc_p010_msb_tile_y          ia_fourcc('T','0','1','0')  /* TileYUV420_10_SP */
+/* Intel internal format: P010 Tile-Y (MSB), compressed*/
+#define css_fourcc_p010_msb_cile_y          ia_fourcc('C','0','1','0') /* TileYUV420_10_SP_C */
+
+#define css_fourcc_p012                 ia_fourcc('P','0','1','2')
+#define css_fourcc_p012_lsb             ia_fourcc('P','L','1','2')
+/* Intel internal format: P012 Tile-Y (MSB) */
+#define css_fourcc_p012_msb_tile_y          ia_fourcc('T','0','1','2') /* TileYUV420_12_SP */
+/* Intel internal format: P012 Tile-Y (MSB), compressed*/
+#define css_fourcc_p012_msb_cile_y          ia_fourcc('C','0','1','2') /* TileYUV420_12_SP_C */
+
+#define css_fourcc_yuv420_12_pl          ia_fourcc('P','4','1','2')
+
+#define ia_cipf_frame_fourcc_ir16 ia_fourcc('I','R','1','6')
+
+/* Native object type reference UIDs */
+#define ia_cipf_pipeline_location_ref_uid   ia_fourcc('P','O','L','R')
+#define ia_cipf_platform_buffer_ref_uid     ia_fourcc('P','O','B','R')
+#define ia_cipf_platform_buffer_offset_uid  ia_fourcc('P','O','B','O')
+#define ia_cipf_platform_memory_ref_uid     ia_fourcc('P','O','M','R')
+#define ia_cipf_platform_memory_device_ref_uid ia_fourcc('P','O','M','D')
+
+/* Native type payload UIDs */
+#define ia_cipf_payload_uid_int32           ia_fourcc('D','A','$','0')
+#define ia_cipf_payload_uid_uint32          ia_fourcc('D','A','$','1')
+#define ia_cipf_payload_uid_resolution      ia_fourcc('D','A','$','2')
+#define ia_cipf_payload_uid_boolean         ia_fourcc('D','A','$','3')
+#define ia_cipf_payload_uid_uint64          ia_fourcc('D','A','$','4')
+#define ia_cipf_payload_uid_void_ref        ia_fourcc('D','R','$','0')
+#define ia_cipf_payload_uid_int32_ref       ia_fourcc('D','R','$','1')
+#define ia_cipf_payload_uid_uint32_ref      ia_fourcc('D','R','$','2')
+#define ia_cipf_payload_uid_resolution_ref  ia_fourcc('D','R','$','3')
+#define ia_cipf_payload_uid_string_ref      ia_fourcc('D','R','$','4')
+#define ia_cipf_payload_uid_uint64_ref      ia_fourcc('D','R','$','5')
+#define ia_cipf_payload_uid_offset_ref      ia_fourcc('D','O','$','0')
+
+/* Native payload for special unidentified property */
+#define ia_cipf_payload_uid_unidentified    ia_fourcc('U','I','P','R')
+
+/* Native property UIDs */
+#define ia_cipf_frame_format_uid ia_fourcc('P','X','F','M')
+#define ia_cipf_frame_uid ia_fourcc('F','R','A','M')
+#define ia_cipf_fragment_descriptor_uid ia_fourcc('F','R','D','S')
+#define ia_cipf_property_data_uid ia_fourcc('D','A','T','A')
+#define ia_cipf_tunneled_terminal_data_uid  ia_fourcc('A','U','T','O')
+
+#define IA_CIPF_PAYLOAD_STORAGE_SIZE 8
+
+/** Identifiable data payload type
+ *
+ * \ingroup ia_cipf
+ */
+typedef struct ia_cipf_payload {
+    ia_uid     uid;  /* data type identifier */
+    uint32_t   size; /* size in bytes allocated to data.cpu_ptr */
+    union {
+        void        *cpu_ptr;
+        uint32_t    offset;
+        uint32_t    handle;
+        uint8_t     raw[IA_CIPF_PAYLOAD_STORAGE_SIZE];
+        uint32_t    uvalue;
+        uint64_t    u64value;
+        int32_t     svalue;
+    } data;
+} ia_cipf_payload_t;
+
+/**
+ * \ingroup ia_cipf
+ */
+typedef struct ia_cipf_frame_format {
+    uint32_t        width;    /**< Width of the frame in pixels */
+    uint32_t        height;   /**< Height of the frame in lines */
+    uint32_t        fourcc;   /**< Frame format */
+    uint32_t        bpl;      /**< Bytes per line*/
+    uint32_t        bpp;      /**< Bits per pixel */
+} ia_cipf_frame_format_t;
+
+#define IA_CIPF_MAX_PLANES 6
+
+/**
+ * \ingroup ia_cipf
+ */
+typedef struct ia_cipf_timestamp {
+    uint64_t seconds; /**< Number of whole seconds */
+    uint64_t useconds; /**< Rest of the time in microseconds */
+} ia_cipf_timestamp_t;
+
+/**
+ * \ingroup ia_cipf
+ */
+typedef struct ia_cipf_frame {
+    ia_uid              uid;
+    uint32_t            id;
+    uint32_t            sequence;
+    ia_cipf_timestamp_t timestamp;
+    uint32_t            flags;
+    uint32_t            allocated;
+    uint32_t            planes;
+    ia_cipf_payload_t   payload[IA_CIPF_MAX_PLANES];
+} ia_cipf_frame_t;
+
+/**
+ * \ingroup ia_cipf
+ */
+typedef struct ia_cipf_buffer {
+    ia_cipf_payload_t    payload;
+} ia_cipf_buffer_t;
+
+/**
+ * \ingroup ia_cipf
+ */
+typedef enum ia_cipf_terminal_type {
+    ia_cipf_terminal_type_frame_input,
+    ia_cipf_terminal_type_frame_output,
+    ia_cipf_terminal_type_param_input,
+    ia_cipf_terminal_type_param_output
+} ia_cipf_terminal_type_t;
+
+/**
+ * \ingroup ia_cipf
+ */
+typedef enum ia_cipf_connection_type {
+    connection_type_push, /* data is pushed by source stage execute */
+    connection_type_pull  /* data is pulled by sink stage execute */
+} ia_cipf_connection_type_t;
+
+/**
+ * \ingroup ia_cipf
+ */
+typedef struct ia_cipf_point {
+    uint16_t x;
+    uint16_t y;
+} ia_cipf_point_t;
+
+/**
+ * \ingroup ia_cipf
+ */
+typedef struct ia_cipf_rect {
+    uint16_t x;
+    uint16_t y;
+    uint16_t width;
+    uint16_t height;
+} ia_cipf_rect_t;
+
+/**
+ * \ingroup ia_cipf
+ */
+typedef struct ia_cipf_resolution {
+    uint16_t width;
+    uint16_t height;
+} ia_cipf_resolution_t;
+
+/**
+ * \ingroup ia_cipf
+ */
+typedef struct ia_cipf_association {
+    ia_uid stage;
+    ia_uid terminal;
+    ia_uid property;
+} ia_cipf_association_t;
+
+/**
+ * \ingroup ia_cipf
+ */
+typedef struct ia_cipf_fragment_desc {
+    ia_cipf_resolution_t size;
+    ia_cipf_point_t start;
+} ia_cipf_fragment_desc_t;
+
+#endif /* _IA_CIPF_TYPES_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_cipf_css/ia_cipf_css.h b/camera/hal/intel/ipu6/include/ia_cipf_css/ia_cipf_css.h
new file mode 100644
index 000000000000..e4bfe4acc03a
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_cipf_css/ia_cipf_css.h
@@ -0,0 +1,1009 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _IA_CIPF_CSS_H_
+#define _IA_CIPF_CSS_H_
+
+#include <ia_cipf/ia_cipf_types.h>
+
+/* Note:
+ * PSYS Library is considered to query UIDs from binary releases
+ * or from other external definition (markup language?)
+ *
+ * Here we would define only the ones statically integrated
+ */
+
+#define psys_2401_vfpp_pg_uid       ia_fourcc('V','F','P','P')
+#define psys_2401_vfpp_in_uid       psys_2401_vfpp_pg_uid + 1
+#define psys_2401_vfpp_out_uid      psys_2401_vfpp_pg_uid + 2
+#define psys_2401_vfpp_params_uid   psys_2401_vfpp_pg_uid + 3
+
+#define psys_2401_preview_pg_uid     ia_fourcc('P','R','E','0')
+#define psys_2401_preview_in_uid     psys_2401_preview_pg_uid + 1
+#define psys_2401_preview_out_uid    psys_2401_preview_pg_uid + 2
+#define psys_2401_preview_params_uid psys_2401_preview_pg_uid + 3
+
+#define psys_2401_capture_pg_uid                ia_fourcc('P','R','I','0')
+#define psys_2401_capture_in_uid                psys_2401_capture_pg_uid + 1
+#define psys_2401_capture_params_uid            psys_2401_capture_pg_uid + 2
+#define psys_2401_capture_main_output_uid       psys_2401_capture_pg_uid + 3
+#define psys_2401_capture_vfpp_output_uid       psys_2401_capture_pg_uid + 4
+
+#define psys_2401_codec_uid               ia_fourcc('2','4','C','O')
+#define psys_2401_3A_grid_info_uid        psys_2401_codec_uid + 1
+#define psys_2401_3A_statistics_uid       psys_2401_codec_uid + 2
+
+#define psys_2401_lsc_table_uid         ia_fourcc('2','4','P','A')
+#define psys_2401_3A_statistics_hi_uid  psys_2401_lsc_table_uid + 1
+#define psys_2401_3A_statistics_lo_uid  psys_2401_lsc_table_uid + 2
+#define psys_2401_3A_histogram_uid      psys_2401_lsc_table_uid + 3
+
+/* 2600 UIDS */
+#define psys_2600_small_uid         ia_fourcc('S','M','A','0')
+#define psys_2600_small_input_uid   psys_2600_small_uid + 1
+#define psys_2600_small_output_uid  psys_2600_small_uid + 2
+#define psys_2600_small_param_uid   psys_2600_small_uid + 3
+#define psys_2600_small_secondary_output_uid psys_2600_small_uid + 4
+
+#define psys_2600_pg_uid(id) ia_fourcc(((id & 0xFF00) >> 8),id,'G','0')
+#define psys_2600_pg_id_from_uid(uid) ((uid & 0xFFFF0000) >> 16)
+#define is_psys_stage_uid(uid) ((uid & 0x0000FFFF) == psys_2600_pg_uid(0))
+
+#define psys_2600_4k60_pg_id        107
+#define psys_2600_4k60_uid          psys_2600_pg_uid(psys_2600_4k60_pg_id)
+#define psys_2600_4k60_param_uid    psys_2600_4k60_uid + 1
+#define psys_2600_4k60_input_uid    psys_2600_4k60_uid + 2
+#define psys_2600_4k60_output_uid   psys_2600_4k60_uid + 3
+#define psys_2600_4k60_secondary_output_uid psys_2600_4k60_uid + 4
+
+#define psys_2600_uvswap_pg_id        119
+#define psys_2600_uvswap_uid          psys_2600_pg_uid(psys_2600_uvswap_pg_id)
+#define psys_2600_uvswap_param_uid    psys_2600_uvswap_uid + 1
+#define psys_2600_uvswap_input_uid    psys_2600_uvswap_uid + 2
+#define psys_2600_uvswap_output_uid   psys_2600_uvswap_uid + 3
+
+#define psys_2600_popg_pg_id                201
+#define psys_2600_popg_uid                  psys_2600_pg_uid(psys_2600_popg_pg_id)
+#define psys_2600_popg_param_uid            psys_2600_popg_uid + 1
+#define psys_2600_popg_program_uid          psys_2600_popg_uid + 2
+#define psys_2600_popg_input_uid            psys_2600_popg_uid + 3
+#define psys_2600_popg_output_uid           psys_2600_popg_uid + 4
+#define psys_2600_popg_secondary_output_uid psys_2600_popg_uid + 5
+
+/* \todo Temporarily switched to use still post-gdc PG */
+#define psys_2600_post_gdc_pg_id                118
+#define psys_2600_post_gdc_uid                  psys_2600_pg_uid(psys_2600_post_gdc_pg_id)
+#define psys_2600_post_gdc_param_uid            psys_2600_post_gdc_uid + 1
+#define psys_2600_post_gdc_program_uid          psys_2600_post_gdc_uid + 2
+#define psys_2600_post_gdc_input_uid            psys_2600_post_gdc_uid + 3
+#define psys_2600_post_gdc_spatial_param_uid    psys_2600_post_gdc_uid + 4
+#define psys_2600_post_gdc_output_uid           psys_2600_post_gdc_uid + 5
+#define psys_2600_post_gdc_secondary_output_uid psys_2600_post_gdc_uid + 6
+#define psys_2600_post_gdc_third_output_uid     psys_2600_post_gdc_uid + 7
+
+#define psys_2600_video_post_gdc_pg_id                114
+#define psys_2600_video_post_gdc_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_pg_id)
+#define psys_2600_video_post_gdc_param_uid            psys_2600_video_post_gdc_uid + 1
+#define psys_2600_video_post_gdc_program_uid          psys_2600_video_post_gdc_uid + 2
+#define psys_2600_video_post_gdc_input_uid            psys_2600_video_post_gdc_uid + 3
+#define psys_2600_video_post_gdc_spatial_param_uid    psys_2600_video_post_gdc_uid + 4
+#define psys_2600_video_post_gdc_output_uid           psys_2600_video_post_gdc_uid + 5
+#define psys_2600_video_post_gdc_secondary_output_uid psys_2600_video_post_gdc_uid + 6
+#define psys_2600_video_post_gdc_third_output_uid     psys_2600_video_post_gdc_uid + 7
+#define psys_2600_video_post_gdc_tnr_input_uid        psys_2600_video_post_gdc_uid + 8
+#define psys_2600_video_post_gdc_tnr_output_uid       psys_2600_video_post_gdc_uid + 9
+
+#define psys_2600_video_post_gdc_v2_pg_id                129
+#define psys_2600_video_post_gdc_v2_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_v2_pg_id)
+#define psys_2600_video_post_gdc_v2_param_uid            psys_2600_video_post_gdc_v2_uid + 1
+#define psys_2600_video_post_gdc_v2_program_uid          psys_2600_video_post_gdc_v2_uid + 2
+#define psys_2600_video_post_gdc_v2_input_uid            psys_2600_video_post_gdc_v2_uid + 3
+#define psys_2600_video_post_gdc_v2_spatial_param_uid    psys_2600_video_post_gdc_v2_uid + 4
+#define psys_2600_video_post_gdc_v2_output_uid           psys_2600_video_post_gdc_v2_uid + 5
+#define psys_2600_video_post_gdc_v2_secondary_output_uid psys_2600_video_post_gdc_v2_uid + 6
+#define psys_2600_video_post_gdc_v2_third_output_uid     psys_2600_video_post_gdc_v2_uid + 7
+#define psys_2600_video_post_gdc_v2_tnr_input_uid        psys_2600_video_post_gdc_v2_uid + 8
+#define psys_2600_video_post_gdc_v2_tnr_output_uid       psys_2600_video_post_gdc_v2_uid + 9
+
+#define psys_2600_video_post_gdc_mbr_pg_id                132
+#define psys_2600_video_post_gdc_mbr_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_mbr_pg_id)
+#define psys_2600_video_post_gdc_mbr_param_uid            psys_2600_video_post_gdc_mbr_uid + 1
+#define psys_2600_video_post_gdc_mbr_program_uid          psys_2600_video_post_gdc_mbr_uid + 2
+#define psys_2600_video_post_gdc_mbr_input_uid            psys_2600_video_post_gdc_mbr_uid + 3
+#define psys_2600_video_post_gdc_mbr_spatial_param_uid    psys_2600_video_post_gdc_mbr_uid + 4
+#define psys_2600_video_post_gdc_mbr_output_uid           psys_2600_video_post_gdc_mbr_uid + 5
+#define psys_2600_video_post_gdc_mbr_secondary_output_uid psys_2600_video_post_gdc_mbr_uid + 6
+#define psys_2600_video_post_gdc_mbr_third_output_uid     psys_2600_video_post_gdc_mbr_uid + 7
+#define psys_2600_video_post_gdc_mbr_tnr_input_uid        psys_2600_video_post_gdc_mbr_uid + 8
+#define psys_2600_video_post_gdc_mbr_tnr_output_uid       psys_2600_video_post_gdc_mbr_uid + 9
+
+#define psys_2600_video_post_gdc_v2_mbr_pg_id                172
+#define psys_2600_video_post_gdc_v2_mbr_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_v2_mbr_pg_id)
+#define psys_2600_video_post_gdc_v2_mbr_param_uid            psys_2600_video_post_gdc_v2_mbr_uid + 1
+#define psys_2600_video_post_gdc_v2_mbr_program_uid          psys_2600_video_post_gdc_v2_mbr_uid + 2
+#define psys_2600_video_post_gdc_v2_mbr_input_uid            psys_2600_video_post_gdc_v2_mbr_uid + 3
+#define psys_2600_video_post_gdc_v2_mbr_spatial_param_uid    psys_2600_video_post_gdc_v2_mbr_uid + 4
+#define psys_2600_video_post_gdc_v2_mbr_output_uid           psys_2600_video_post_gdc_v2_mbr_uid + 5
+#define psys_2600_video_post_gdc_v2_mbr_secondary_output_uid psys_2600_video_post_gdc_v2_mbr_uid + 6
+#define psys_2600_video_post_gdc_v2_mbr_third_output_uid     psys_2600_video_post_gdc_v2_mbr_uid + 7
+#define psys_2600_video_post_gdc_v2_mbr_tnr_input_uid        psys_2600_video_post_gdc_v2_mbr_uid + 8
+#define psys_2600_video_post_gdc_v2_mbr_tnr_output_uid       psys_2600_video_post_gdc_v2_mbr_uid + 9
+
+#define psys_2600_video_pre_gdc_pg_id        116
+#define psys_2600_video_pre_gdc_uid          psys_2600_pg_uid(psys_2600_video_pre_gdc_pg_id)
+#define psys_2600_video_pre_gdc_param_uid    psys_2600_video_pre_gdc_uid + 1
+#define psys_2600_video_pre_gdc_program_uid  psys_2600_video_pre_gdc_uid + 2
+#define psys_2600_video_pre_gdc_input_uid    psys_2600_video_pre_gdc_uid + 3
+#define psys_2600_video_pre_gdc_output_uid   psys_2600_video_pre_gdc_uid + 4
+
+#define psys_2600_ipu5_video_pre_gdc_pg_id                  140
+#define psys_2600_ipu5_video_pre_gdc_uid                    psys_2600_pg_uid(psys_2600_ipu5_video_pre_gdc_pg_id)
+#define psys_2600_ipu5_video_pre_gdc_param_uid              psys_2600_ipu5_video_pre_gdc_uid + 1
+#define psys_2600_ipu5_video_pre_gdc_program_uid            psys_2600_ipu5_video_pre_gdc_uid + 2
+#define psys_2600_ipu5_video_pre_gdc_param_spatial_in_uid   psys_2600_ipu5_video_pre_gdc_uid + 3
+#define psys_2600_ipu5_video_pre_gdc_input_uid              psys_2600_ipu5_video_pre_gdc_uid + 4
+#define psys_2600_ipu5_video_pre_gdc_output_uid             psys_2600_ipu5_video_pre_gdc_uid + 5
+
+#define psys_ipu5_video_pre_gdc_vpless_pg_id                    167
+#define psys_ipu5_video_pre_gdc_vpless_uid                      psys_2600_pg_uid(psys_ipu5_video_pre_gdc_vpless_pg_id)
+#define psys_ipu5_video_pre_gdc_vpless_param_uid                psys_ipu5_video_pre_gdc_vpless_uid + 1
+#define psys_ipu5_video_pre_gdc_vpless_program_uid              psys_ipu5_video_pre_gdc_vpless_uid + 2
+#define psys_ipu5_video_pre_gdc_vpless_program_control_init_uid psys_ipu5_video_pre_gdc_vpless_uid + 3
+#define psys_ipu5_video_pre_gdc_vpless_input_uid                psys_ipu5_video_pre_gdc_vpless_uid + 4
+#define psys_ipu5_video_pre_gdc_vpless_output_uid               psys_ipu5_video_pre_gdc_vpless_uid + 5
+#define psys_ipu5_video_pre_gdc_gammastar_grid_uid              psys_ipu5_video_pre_gdc_vpless_uid + 6
+#define psys_ipu5_video_pre_gdc_dvs_mv_out_l0_uid               psys_ipu5_video_pre_gdc_vpless_uid + 7
+#define psys_ipu5_video_pre_gdc_dvs_mv_out_l1_uid               psys_ipu5_video_pre_gdc_vpless_uid + 8
+#define psys_ipu5_video_pre_gdc_dvs_mv_out_l2_uid               psys_ipu5_video_pre_gdc_vpless_uid + 9
+#define psys_ipu5_video_pre_gdc_dvs_fe_in_l0_uid                psys_ipu5_video_pre_gdc_vpless_uid + 10
+#define psys_ipu5_video_pre_gdc_dvs_fe_in_l1_uid                psys_ipu5_video_pre_gdc_vpless_uid + 11
+#define psys_ipu5_video_pre_gdc_dvs_fe_in_l2_uid                psys_ipu5_video_pre_gdc_vpless_uid + 12
+#define psys_ipu5_video_pre_gdc_dvs_fe_out_l0_uid               psys_ipu5_video_pre_gdc_vpless_uid + 13
+#define psys_ipu5_video_pre_gdc_dvs_fe_out_l1_uid               psys_ipu5_video_pre_gdc_vpless_uid + 14
+#define psys_ipu5_video_pre_gdc_dvs_fe_out_l2_uid               psys_ipu5_video_pre_gdc_vpless_uid + 15
+
+#define psys_2600_ipu6_lb_video_pg_id                  182
+#define psys_2600_ipu6_lb_video_uid                    psys_2600_pg_uid(psys_2600_ipu6_lb_video_pg_id)
+#define psys_2600_ipu6_lb_video_param_uid              psys_2600_ipu6_lb_video_uid + 1
+#define psys_2600_ipu6_lb_video_program_uid            psys_2600_ipu6_lb_video_uid + 2
+#define psys_2600_ipu6_lb_video_program_control_uid    psys_2600_ipu6_lb_video_uid + 3
+#define psys_2600_ipu6_lb_video_input_uid              psys_2600_ipu6_lb_video_uid + 4
+#define psys_2600_ipu6_lb_video_output_uid             psys_2600_ipu6_lb_video_uid + 5
+
+#define psys_ipu6_bb_pg_id                 189
+#define psys_ipu6_bb_uid                   psys_2600_pg_uid(psys_ipu6_bb_pg_id)
+#define psys_ipu6_bb_input_uid             (psys_ipu6_bb_uid + 1)
+#define psys_ipu6_bb_mp_uid                (psys_ipu6_bb_uid + 2)
+#define psys_ipu6_bb_dp_uid                (psys_ipu6_bb_uid + 3)
+#define psys_ipu6_bb_ppp_uid               (psys_ipu6_bb_uid + 4)
+#define psys_ipu6_bb_tnr_ref_in_uid        (psys_ipu6_bb_uid + 5)
+#define psys_ipu6_bb_tnr_recsim_in_uid     (psys_ipu6_bb_uid + 6)
+#define psys_ipu6_bb_tnr_ref_out_uid       (psys_ipu6_bb_uid + 7)
+#define psys_ipu6_bb_tnr_recsim_out_uid    (psys_ipu6_bb_uid + 8)
+#define psys_ipu6_bb_program_control_uid   (psys_ipu6_bb_uid + 9)
+#define psys_ipu6_bb_param_in_uid          (psys_ipu6_bb_uid + 10)
+#define psys_ipu6_bb_program_uid           (psys_ipu6_bb_uid + 11)
+
+#define psys_ipu6_lb_rbm_pg_id                183
+#define psys_ipu6_lb_rbm_uid                  psys_2600_pg_uid(psys_ipu6_lb_rbm_pg_id)
+#define psys_ipu6_lb_rbm_param_uid            (psys_ipu6_lb_rbm_uid + 1)
+#define psys_ipu6_lb_rbm_program_uid          (psys_ipu6_lb_rbm_uid + 2)
+#define psys_ipu6_lb_rbm_program_control_uid  (psys_ipu6_lb_rbm_uid + 3)
+#define psys_ipu6_lb_rbm_input_uid            (psys_ipu6_lb_rbm_uid + 4)
+#define psys_ipu6_lb_rbm_output_uid           (psys_ipu6_lb_rbm_uid + 5)
+#define psys_ipu6_lb_rbm_gammastar_grid_uid   (psys_ipu6_lb_rbm_uid + 6)
+#define psys_ipu6_lb_rbm_dvs_mv_out_l0_uid    (psys_ipu6_lb_rbm_uid + 7)
+#define psys_ipu6_lb_rbm_dvs_mv_out_l1_uid    (psys_ipu6_lb_rbm_uid + 8)
+#define psys_ipu6_lb_rbm_dvs_mv_out_l2_uid    (psys_ipu6_lb_rbm_uid + 9)
+#define psys_ipu6_lb_rbm_dvs_fe_in_l0_uid     (psys_ipu6_lb_rbm_uid + 10)
+#define psys_ipu6_lb_rbm_dvs_fe_in_l1_uid     (psys_ipu6_lb_rbm_uid + 11)
+#define psys_ipu6_lb_rbm_dvs_fe_in_l2_uid     (psys_ipu6_lb_rbm_uid + 12)
+#define psys_ipu6_lb_rbm_dvs_fe_out_l0_uid    (psys_ipu6_lb_rbm_uid + 13)
+#define psys_ipu6_lb_rbm_dvs_fe_out_l1_uid    (psys_ipu6_lb_rbm_uid + 14)
+#define psys_ipu6_lb_rbm_dvs_fe_out_l2_uid    (psys_ipu6_lb_rbm_uid + 15)
+
+#define psys_ipu6_isa_rbm_pg_id                185
+#define psys_ipu6_isa_rbm_uid                  psys_2600_pg_uid(psys_ipu6_isa_rbm_pg_id)
+#define psys_ipu6_isa_rbm_param_uid            (psys_ipu6_isa_rbm_uid + 1)
+#define psys_ipu6_isa_rbm_program_uid          (psys_ipu6_isa_rbm_uid + 2)
+#define psys_ipu6_isa_rbm_program_control_uid  (psys_ipu6_isa_rbm_uid + 3)
+#define psys_ipu6_isa_rbm_input_uid            (psys_ipu6_isa_rbm_uid + 4)
+#define psys_ipu6_isa_rbm_blc_input_uid        (psys_ipu6_isa_rbm_uid + 5)
+#define psys_ipu6_isa_rbm_lsc_input_uid        (psys_ipu6_isa_rbm_uid + 6)
+#define psys_ipu6_isa_rbm_output_bayer_uid     (psys_ipu6_isa_rbm_uid + 7)
+#define psys_ipu6_isa_rbm_output_yuv_a_uid     (psys_ipu6_isa_rbm_uid + 8)
+#define psys_ipu6_isa_rbm_output_yuv_b_uid     (psys_ipu6_isa_rbm_uid + 9)
+#define psys_ipu6_isa_rbm_output_full_uid      (psys_ipu6_isa_rbm_uid + 10)
+#define psys_ipu6_isa_rbm_output_ir_uid        (psys_ipu6_isa_rbm_uid + 11)
+#define psys_ipu6_isa_rbm_output_sis_a_uid     (psys_ipu6_isa_rbm_uid + 12)
+#define psys_ipu6_isa_rbm_output_sis_b_uid     (psys_ipu6_isa_rbm_uid + 13)
+#define psys_ipu6_isa_rbm_output_af_uid        (psys_ipu6_isa_rbm_uid + 14)
+#define psys_ipu6_isa_rbm_output_awb_uid       (psys_ipu6_isa_rbm_uid + 15)
+#define psys_ipu6_isa_rbm_output_paf_uid       (psys_ipu6_isa_rbm_uid + 16)
+#define psys_ipu6_isa_rbm_param_out_uid        (psys_ipu6_isa_rbm_uid + 17)
+#define psys_ipu6_isa_rbm_input_short_uid      (psys_ipu6_isa_rbm_uid + 18)
+#define psys_ipu6_isa_rbm_input_medium_uid     (psys_ipu6_isa_rbm_uid + 19)
+#define psys_ipu6_isa_rbm_input_paf_uid        (psys_ipu6_isa_rbm_uid + 20)
+
+#define psys_ipu6s_isa_pg_id                198
+#define psys_ipu6s_isa_uid                  psys_2600_pg_uid(psys_ipu6s_isa_pg_id)
+#define psys_ipu6s_isa_param_uid            (psys_ipu6s_isa_uid + 1)
+#define psys_ipu6s_isa_program_uid          (psys_ipu6s_isa_uid + 2)
+#define psys_ipu6s_isa_program_control_uid  (psys_ipu6s_isa_uid + 3)
+#define psys_ipu6s_isa_input_uid            (psys_ipu6s_isa_uid + 4)
+#define psys_ipu6s_isa_blc_input_uid        (psys_ipu6s_isa_uid + 5)
+#define psys_ipu6s_isa_lsc_input_uid        (psys_ipu6s_isa_uid + 6)
+#define psys_ipu6s_isa_output_bayer_uid     (psys_ipu6s_isa_uid + 7)
+#define psys_ipu6s_isa_output_yuv_a_uid     (psys_ipu6s_isa_uid + 8)
+#define psys_ipu6s_isa_output_yuv_b_uid     (psys_ipu6s_isa_uid + 9)
+#define psys_ipu6s_isa_output_full_uid      (psys_ipu6s_isa_uid + 10)
+#define psys_ipu6s_isa_output_af_uid        (psys_ipu6s_isa_uid + 11)
+#define psys_ipu6s_isa_output_awb_uid       (psys_ipu6s_isa_uid + 12)
+#define psys_ipu6s_isa_output_paf_uid       (psys_ipu6s_isa_uid + 13)
+
+#define psys_fake_ipu6s_isa_pg_id                199
+#define psys_fake_ipu6s_isa_uid                  psys_2600_pg_uid(psys_fake_ipu6s_isa_pg_id)
+#define psys_fake_ipu6s_isa_param_uid            (psys_fake_ipu6s_isa_uid + 1)
+#define psys_fake_ipu6s_isa_program_uid          (psys_fake_ipu6s_isa_uid + 2)
+#define psys_fake_ipu6s_isa_program_control_uid  (psys_fake_ipu6s_isa_uid + 3)
+#define psys_fake_ipu6s_isa_input_uid            (psys_fake_ipu6s_isa_uid + 4)
+#define psys_fake_ipu6s_isa_blc_input_uid        (psys_fake_ipu6s_isa_uid + 5)
+#define psys_fake_ipu6s_isa_lsc_input_uid        (psys_fake_ipu6s_isa_uid + 6)
+#define psys_fake_ipu6s_isa_output_bayer_uid     (psys_fake_ipu6s_isa_uid + 7)
+#define psys_fake_ipu6s_isa_output_yuv_a_uid     (psys_fake_ipu6s_isa_uid + 8)
+#define psys_fake_ipu6s_isa_output_yuv_b_uid     (psys_fake_ipu6s_isa_uid + 9)
+#define psys_fake_ipu6s_isa_output_full_uid      (psys_fake_ipu6s_isa_uid + 10)
+#define psys_fake_ipu6s_isa_output_af_uid        (psys_fake_ipu6s_isa_uid + 11)
+#define psys_fake_ipu6s_isa_output_awb_uid       (psys_fake_ipu6s_isa_uid + 12)
+#define psys_fake_ipu6s_isa_output_paf_uid       (psys_fake_ipu6s_isa_uid + 13)
+
+#ifndef IPU_SYSVER_ipu6v5
+#define psys_ipu6_isa_lb_pg_id                     187
+#define psys_ipu6_isa_lb_uid                       psys_2600_pg_uid(psys_ipu6_isa_lb_pg_id)
+#define psys_ipu6_isa_lb_param_in_uid              (psys_ipu6_isa_lb_uid + 1)
+#define psys_ipu6_isa_lb_program_uid               (psys_ipu6_isa_lb_uid + 2)
+#define psys_ipu6_isa_lb_program_control_init_uid  (psys_ipu6_isa_lb_uid + 3)
+#define psys_ipu6_isa_lb_input_high_uid            (psys_ipu6_isa_lb_uid + 4)
+#define psys_ipu6_isa_lb_blc_grid_uid              (psys_ipu6_isa_lb_uid + 5)
+#define psys_ipu6_isa_lb_lsc_grid_uid              (psys_ipu6_isa_lb_uid + 6)
+#define psys_ipu6_isa_lb_gammastar_grid_uid        (psys_ipu6_isa_lb_uid + 7)
+#define psys_ipu6_isa_lb_output_uid                (psys_ipu6_isa_lb_uid + 8)
+#define psys_ipu6_isa_lb_output_bayer_uid          (psys_ipu6_isa_lb_uid + 9)
+#define psys_ipu6_isa_lb_output_yuv_b_uid          (psys_ipu6_isa_lb_uid + 10)
+#define psys_ipu6_isa_lb_output_sis_a_uid          (psys_ipu6_isa_lb_uid + 11)
+#define psys_ipu6_isa_lb_output_sis_b_uid          (psys_ipu6_isa_lb_uid + 12)
+#define psys_ipu6_isa_lb_output_full_uid           (psys_ipu6_isa_lb_uid + 13)
+#define psys_ipu6_isa_lb_output_ir_depth_uid       (psys_ipu6_isa_lb_uid + 14)
+#define psys_ipu6_isa_lb_spt_af_uid                (psys_ipu6_isa_lb_uid + 15)
+#define psys_ipu6_isa_lb_spt_awb_uid               (psys_ipu6_isa_lb_uid + 16)
+#define psys_ipu6_isa_lb_spt_paf_uid               (psys_ipu6_isa_lb_uid + 17)
+#define psys_ipu6_isa_lb_dvs_mv_out_l0_uid         (psys_ipu6_isa_lb_uid + 18)
+#define psys_ipu6_isa_lb_dvs_mv_out_l1_uid         (psys_ipu6_isa_lb_uid + 19)
+#define psys_ipu6_isa_lb_dvs_mv_out_l2_uid         (psys_ipu6_isa_lb_uid + 20)
+#define psys_ipu6_isa_lb_ae_stat_uid               (psys_ipu6_isa_lb_uid + 21)
+#define psys_ipu6_isa_lb_dvs_fe_in_l0_uid          (psys_ipu6_isa_lb_uid + 22)
+#define psys_ipu6_isa_lb_dvs_fe_in_l1_uid          (psys_ipu6_isa_lb_uid + 23)
+#define psys_ipu6_isa_lb_dvs_fe_in_l2_uid          (psys_ipu6_isa_lb_uid + 24)
+#define psys_ipu6_isa_lb_dvs_fe_out_l0_uid         (psys_ipu6_isa_lb_uid + 25)
+#define psys_ipu6_isa_lb_dvs_fe_out_l1_uid         (psys_ipu6_isa_lb_uid + 26)
+#define psys_ipu6_isa_lb_dvs_fe_out_l2_uid         (psys_ipu6_isa_lb_uid + 27)
+#define psys_ipu6_isa_lb_input_short_uid           (psys_ipu6_isa_lb_uid + 28)
+#define psys_ipu6_isa_lb_input_medium_uid          (psys_ipu6_isa_lb_uid + 29)
+#define psys_ipu6_isa_lb_paf_uid                   (psys_ipu6_isa_lb_uid + 30)
+#else
+#define psys_ipu6_isa_lb_pg_id                     187
+#define psys_ipu6_isa_lb_uid                       psys_2600_pg_uid(psys_ipu6_isa_lb_pg_id)
+#define psys_ipu6_isa_lb_param_in_uid              (psys_ipu6_isa_lb_uid + 1)
+#define psys_ipu6_isa_lb_program_uid               (psys_ipu6_isa_lb_uid + 2)
+#define psys_ipu6_isa_lb_program_control_init_uid  (psys_ipu6_isa_lb_uid + 3)
+#define psys_ipu6_isa_lb_input_high_uid            (psys_ipu6_isa_lb_uid + 4)
+#define psys_ipu6_isa_lb_blc_grid_uid              (psys_ipu6_isa_lb_uid + 5)
+#define psys_ipu6_isa_lb_lsc_grid_uid              (psys_ipu6_isa_lb_uid + 6)
+#define psys_ipu6_isa_lb_gammastar_grid_uid        (psys_ipu6_isa_lb_uid + 7)
+#define psys_ipu6_isa_lb_output_uid                (psys_ipu6_isa_lb_uid + 8)
+#define psys_ipu6_isa_lb_output_bayer_uid          (psys_ipu6_isa_lb_uid + 9)
+#define psys_ipu6_isa_lb_output_sis_a_uid          (psys_ipu6_isa_lb_uid + 10)
+#define psys_ipu6_isa_lb_output_sis_b_uid          (psys_ipu6_isa_lb_uid + 11)
+#define psys_ipu6_isa_lb_output_full_uid           (psys_ipu6_isa_lb_uid + 12)
+#define psys_ipu6_isa_lb_output_ir_depth_uid       (psys_ipu6_isa_lb_uid + 13)
+#define psys_ipu6_isa_lb_spt_af_uid                (psys_ipu6_isa_lb_uid + 14)
+#define psys_ipu6_isa_lb_spt_awb_uid               (psys_ipu6_isa_lb_uid + 15)
+#define psys_ipu6_isa_lb_spt_paf_uid               (psys_ipu6_isa_lb_uid + 16)
+#define psys_ipu6_isa_lb_dvs_mv_out_l0_uid         (psys_ipu6_isa_lb_uid + 17)
+#define psys_ipu6_isa_lb_dvs_mv_out_l1_uid         (psys_ipu6_isa_lb_uid + 18)
+#define psys_ipu6_isa_lb_dvs_mv_out_l2_uid         (psys_ipu6_isa_lb_uid + 19)
+#define psys_ipu6_isa_lb_ae_stat_uid               (psys_ipu6_isa_lb_uid + 20)
+#define psys_ipu6_isa_lb_dvs_fe_in_l0_uid          (psys_ipu6_isa_lb_uid + 21)
+#define psys_ipu6_isa_lb_dvs_fe_in_l1_uid          (psys_ipu6_isa_lb_uid + 22)
+#define psys_ipu6_isa_lb_dvs_fe_in_l2_uid          (psys_ipu6_isa_lb_uid + 23)
+#define psys_ipu6_isa_lb_dvs_fe_out_l0_uid         (psys_ipu6_isa_lb_uid + 24)
+#define psys_ipu6_isa_lb_dvs_fe_out_l1_uid         (psys_ipu6_isa_lb_uid + 25)
+#define psys_ipu6_isa_lb_dvs_fe_out_l2_uid         (psys_ipu6_isa_lb_uid + 26)
+#define psys_ipu6_isa_lb_paf_uid                   (psys_ipu6_isa_lb_uid + 27)
+
+#endif
+
+
+#define psys_ipu6_bb_gdc_pg_id                 196
+#define psys_ipu6_bb_gdc_uid                   psys_2600_pg_uid(psys_ipu6_bb_gdc_pg_id)
+#define psys_ipu6_bb_gdc_input_uid             (psys_ipu6_bb_gdc_uid + 1)
+#define psys_ipu6_bb_gdc_mp_uid                (psys_ipu6_bb_gdc_uid + 2)
+#define psys_ipu6_bb_gdc_dp_uid                (psys_ipu6_bb_gdc_uid + 3)
+#define psys_ipu6_bb_gdc_ppp_uid               (psys_ipu6_bb_gdc_uid + 4)
+#define psys_ipu6_bb_gdc_program_control_uid   (psys_ipu6_bb_gdc_uid + 5)
+#define psys_ipu6_bb_gdc_param_in_uid          (psys_ipu6_bb_gdc_uid + 6)
+#define psys_ipu6_bb_gdc_program_uid           (psys_ipu6_bb_gdc_uid + 7)
+
+#define psys_2600_video_pre_gdc_hq_pg_id             122
+#define psys_2600_video_pre_gdc_hq_uid               psys_2600_pg_uid(psys_2600_video_pre_gdc_hq_pg_id)
+#define psys_2600_video_pre_gdc_hq_param_uid         psys_2600_video_pre_gdc_hq_uid + 1
+#define psys_2600_video_pre_gdc_hq_program_uid       psys_2600_video_pre_gdc_hq_uid + 2
+#define psys_2600_video_pre_gdc_hq_input_uid         psys_2600_video_pre_gdc_hq_uid + 3
+#define psys_2600_video_pre_gdc_hq_output_uid        psys_2600_video_pre_gdc_hq_uid + 4
+#define psys_2600_video_pre_gdc_hq_spatial_in_0_uid  psys_2600_video_pre_gdc_hq_uid + 5
+#define psys_2600_video_pre_gdc_hq_spatial_in_1_uid  psys_2600_video_pre_gdc_hq_uid + 6
+#define psys_2600_video_pre_gdc_hq_spatial_in_2_uid  psys_2600_video_pre_gdc_hq_uid + 7
+#define psys_2600_video_pre_gdc_hq_spatial_out_0_uid psys_2600_video_pre_gdc_hq_uid + 8
+#define psys_2600_video_pre_gdc_hq_spatial_out_1_uid psys_2600_video_pre_gdc_hq_uid + 9
+#define psys_2600_video_pre_gdc_hq_spatial_out_2_uid psys_2600_video_pre_gdc_hq_uid + 10
+
+#define psys_2600_video_pre_gdc_hq_vcr2_pg_id             148
+#define psys_2600_video_pre_gdc_hq_vcr2_uid               psys_2600_pg_uid(psys_2600_video_pre_gdc_hq_vcr2_pg_id)
+#define psys_2600_video_pre_gdc_hq_vcr2_param_uid         psys_2600_video_pre_gdc_hq_vcr2_uid + 1
+#define psys_2600_video_pre_gdc_hq_vcr2_program_uid       psys_2600_video_pre_gdc_hq_vcr2_uid + 2
+#define psys_2600_video_pre_gdc_hq_vcr2_input_uid         psys_2600_video_pre_gdc_hq_vcr2_uid + 3
+#define psys_2600_video_pre_gdc_hq_vcr2_output_uid        psys_2600_video_pre_gdc_hq_vcr2_uid + 4
+#define psys_2600_video_pre_gdc_hq_vcr2_spatial_in_0_uid  psys_2600_video_pre_gdc_hq_vcr2_uid + 5
+#define psys_2600_video_pre_gdc_hq_vcr2_spatial_in_1_uid  psys_2600_video_pre_gdc_hq_vcr2_uid + 6
+#define psys_2600_video_pre_gdc_hq_vcr2_spatial_in_2_uid  psys_2600_video_pre_gdc_hq_vcr2_uid + 7
+#define psys_2600_video_pre_gdc_hq_vcr2_spatial_out_0_uid psys_2600_video_pre_gdc_hq_vcr2_uid + 8
+#define psys_2600_video_pre_gdc_hq_vcr2_spatial_out_1_uid psys_2600_video_pre_gdc_hq_vcr2_uid + 9
+#define psys_2600_video_pre_gdc_hq_vcr2_spatial_out_2_uid psys_2600_video_pre_gdc_hq_vcr2_uid + 10
+
+#define psys_2600_ipu5_still_pre_gdc_pg_id        143
+#define psys_2600_ipu5_still_pre_gdc_uid          psys_2600_pg_uid(psys_2600_ipu5_still_pre_gdc_pg_id)
+#define psys_2600_ipu5_still_pre_gdc_param_uid    psys_2600_ipu5_still_pre_gdc_uid + 1
+#define psys_2600_ipu5_still_pre_gdc_program_uid  psys_2600_ipu5_still_pre_gdc_uid + 2
+#define psys_2600_ipu5_still_pre_gdc_gammstar_acc_ctrl_uid    psys_2600_ipu5_still_pre_gdc_uid + 3
+#define psys_2600_ipu5_still_pre_gdc_input_uid   psys_2600_ipu5_still_pre_gdc_uid + 4
+#define psys_2600_ipu5_still_pre_gdc_output_uid   psys_2600_ipu5_still_pre_gdc_uid + 5
+
+
+#define psys_2600_ipu5_still_pre_gdc_no_xnr_pg_id        144
+#define psys_2600_ipu5_still_pre_gdc_no_xnr_uid          psys_2600_pg_uid(psys_2600_ipu5_still_pre_gdc_no_xnr_pg_id)
+#define psys_2600_ipu5_still_pre_gdc_no_xnr_param_uid    psys_2600_ipu5_still_pre_gdc_no_xnr_uid + 1
+#define psys_2600_ipu5_still_pre_gdc_no_xnr_program_uid  psys_2600_ipu5_still_pre_gdc_no_xnr_uid + 2
+#define psys_2600_ipu5_still_pre_gdc_no_xnr_gammstar_acc_ctrl_uid    psys_2600_ipu5_still_pre_gdc_no_xnr_uid + 3
+#define psys_2600_ipu5_still_pre_gdc_no_xnr_input_uid    psys_2600_ipu5_still_pre_gdc_no_xnr_uid + 4
+#define psys_2600_ipu5_still_pre_gdc_no_xnr_output_uid   psys_2600_ipu5_still_pre_gdc_no_xnr_uid + 5
+
+#define psys_2600_ipu5_still_pre_gdc_vpless_pg_id                       168
+#define psys_2600_ipu5_still_pre_gdc_vpless_uid                         psys_2600_pg_uid(psys_2600_ipu5_still_pre_gdc_vpless_pg_id)
+#define psys_2600_ipu5_still_pre_gdc_vpless_param_uid                   psys_2600_ipu5_still_pre_gdc_vpless_uid + 1
+#define psys_2600_ipu5_still_pre_gdc_vpless_program_uid                 psys_2600_ipu5_still_pre_gdc_vpless_uid + 2
+#define psys_2600_ipu5_still_pre_gdc_vpless_gammstar_acc_ctrl_uid       psys_2600_ipu5_still_pre_gdc_vpless_uid + 3
+#define psys_2600_ipu5_still_pre_gdc_vpless_input_uid                   psys_2600_ipu5_still_pre_gdc_vpless_uid + 4
+#define psys_2600_ipu5_still_pre_gdc_vpless_output_uid                  psys_2600_ipu5_still_pre_gdc_vpless_uid + 5
+#define psys_2600_ipu5_still_pre_gdc_vpless_spt_gammstar_grid           psys_2600_ipu5_still_pre_gdc_vpless_uid + 6
+
+#define psys_ipu5_still_post_gdc_v4_pg_id                162
+#define psys_ipu5_still_post_gdc_v4_uid                  psys_2600_pg_uid(psys_ipu5_still_post_gdc_v4_pg_id)
+#define psys_ipu5_still_post_gdc_v4_param_uid            psys_ipu5_still_post_gdc_v4_uid + 1
+#define psys_ipu5_still_post_gdc_v4_program_uid          psys_ipu5_still_post_gdc_v4_uid + 2
+#define psys_ipu5_still_post_gdc_v4_input_uid            psys_ipu5_still_post_gdc_v4_uid + 3
+#define psys_ipu5_still_post_gdc_v4_spatial_param_uid    psys_ipu5_still_post_gdc_v4_uid + 4
+#define psys_ipu5_still_post_gdc_v4_output_uid           psys_ipu5_still_post_gdc_v4_uid + 5
+#define psys_ipu5_still_post_gdc_v4_secondary_output_uid psys_ipu5_still_post_gdc_v4_uid + 6
+#define psys_ipu5_still_post_gdc_v4_third_output_uid     psys_ipu5_still_post_gdc_v4_uid + 7
+
+#define psys_ipu5_video_post_gdc_pg_id                151
+#define psys_ipu5_video_post_gdc_uid                  psys_2600_pg_uid(psys_ipu5_video_post_gdc_pg_id)
+#define psys_ipu5_video_post_gdc_param_uid            psys_ipu5_video_post_gdc_uid + 1
+#define psys_ipu5_video_post_gdc_program_uid          psys_ipu5_video_post_gdc_uid + 2
+#define psys_ipu5_video_post_gdc_input_uid            psys_ipu5_video_post_gdc_uid + 3
+#define psys_ipu5_video_post_gdc_spatial_param_uid    psys_ipu5_video_post_gdc_uid + 4
+#define psys_ipu5_video_post_gdc_output_uid           psys_ipu5_video_post_gdc_uid + 5
+#define psys_ipu5_video_post_gdc_secondary_output_uid psys_ipu5_video_post_gdc_uid + 6
+#define psys_ipu5_video_post_gdc_third_output_uid     psys_ipu5_video_post_gdc_uid + 7
+#define psys_ipu5_video_post_gdc_tnr_input_uid        psys_ipu5_video_post_gdc_uid + 8
+#define psys_ipu5_video_post_gdc_tnr_output_uid       psys_ipu5_video_post_gdc_uid + 9
+
+#define psys_ipu5_video_post_gdc_v4_pg_id                169
+#define psys_ipu5_video_post_gdc_v4_uid                  psys_2600_pg_uid(psys_ipu5_video_post_gdc_v4_pg_id)
+#define psys_ipu5_video_post_gdc_v4_param_uid            psys_ipu5_video_post_gdc_v4_uid + 1
+#define psys_ipu5_video_post_gdc_v4_program_uid          psys_ipu5_video_post_gdc_v4_uid + 2
+#define psys_ipu5_video_post_gdc_v4_input_uid            psys_ipu5_video_post_gdc_v4_uid + 3
+#define psys_ipu5_video_post_gdc_v4_spatial_param_uid    psys_ipu5_video_post_gdc_v4_uid + 4
+#define psys_ipu5_video_post_gdc_v4_output_uid           psys_ipu5_video_post_gdc_v4_uid + 5
+#define psys_ipu5_video_post_gdc_v4_secondary_output_uid psys_ipu5_video_post_gdc_v4_uid + 6
+#define psys_ipu5_video_post_gdc_v4_third_output_uid     psys_ipu5_video_post_gdc_v4_uid + 7
+#define psys_ipu5_video_post_gdc_v4_tnr_input_uid        psys_ipu5_video_post_gdc_v4_uid + 8
+#define psys_ipu5_video_post_gdc_v4_tnr_output_uid       psys_ipu5_video_post_gdc_v4_uid + 9
+
+#define psys_ipu5_video_post_gdc_10bit_pg_id                193
+#define psys_ipu5_video_post_gdc_10bit_uid                  psys_2600_pg_uid(psys_ipu5_video_post_gdc_10bit_pg_id)
+#define psys_ipu5_video_post_gdc_10bit_param_uid            psys_ipu5_video_post_gdc_10bit_uid + 1
+#define psys_ipu5_video_post_gdc_10bit_program_uid          psys_ipu5_video_post_gdc_10bit_uid + 2
+#define psys_ipu5_video_post_gdc_10bit_input_uid            psys_ipu5_video_post_gdc_10bit_uid + 3
+#define psys_ipu5_video_post_gdc_10bit_spatial_param_uid    psys_ipu5_video_post_gdc_10bit_uid + 4
+#define psys_ipu5_video_post_gdc_10bit_output_uid           psys_ipu5_video_post_gdc_10bit_uid + 5
+#define psys_ipu5_video_post_gdc_10bit_secondary_output_uid psys_ipu5_video_post_gdc_10bit_uid + 6
+#define psys_ipu5_video_post_gdc_10bit_third_output_uid     psys_ipu5_video_post_gdc_10bit_uid + 7
+#define psys_ipu5_video_post_gdc_10bit_tnr_input_uid        psys_ipu5_video_post_gdc_10bit_uid + 8
+#define psys_ipu5_video_post_gdc_10bit_tnr_output_uid       psys_ipu5_video_post_gdc_10bit_uid + 9
+#define psys_ipu5_video_post_gdc_10bit_main_output_uid      psys_ipu5_video_post_gdc_10bit_uid + 10
+#define psys_ipu5_video_post_gdc_10bit_display_output_uid   psys_ipu5_video_post_gdc_10bit_uid + 11
+
+#define psys_ipu5_still_post_gdc_10bit_pg_id                197
+#define psys_ipu5_still_post_gdc_10bit_uid                  psys_2600_pg_uid(psys_ipu5_still_post_gdc_10bit_pg_id)
+#define psys_ipu5_still_post_gdc_10bit_param_uid            psys_ipu5_still_post_gdc_10bit_uid + 1
+#define psys_ipu5_still_post_gdc_10bit_program_uid          psys_ipu5_still_post_gdc_10bit_uid + 2
+#define psys_ipu5_still_post_gdc_10bit_input_uid            psys_ipu5_still_post_gdc_10bit_uid + 3
+#define psys_ipu5_still_post_gdc_10bit_spatial_param_uid    psys_ipu5_still_post_gdc_10bit_uid + 4
+#define psys_ipu5_still_post_gdc_10bit_output_uid           psys_ipu5_still_post_gdc_10bit_uid + 5
+#define psys_ipu5_still_post_gdc_10bit_secondary_output_uid psys_ipu5_still_post_gdc_10bit_uid + 6
+#define psys_ipu5_still_post_gdc_10bit_third_output_uid     psys_ipu5_still_post_gdc_10bit_uid + 7
+#define psys_ipu5_still_post_gdc_10bit_main_output_uid      psys_ipu5_still_post_gdc_10bit_uid + 8
+#define psys_ipu5_still_post_gdc_10bit_display_output_uid   psys_ipu5_still_post_gdc_10bit_uid + 9
+
+
+#ifdef _MSC_VER
+    #define psys_2600_still_pre_gdc_pg_id    136
+#else //_MSC_VER
+    #define psys_2600_still_pre_gdc_pg_id    131
+#endif
+#define psys_2600_still_pre_gdc_uid          psys_2600_pg_uid(psys_2600_still_pre_gdc_pg_id)
+#define psys_2600_still_pre_gdc_param_uid    psys_2600_still_pre_gdc_uid + 1
+#define psys_2600_still_pre_gdc_program_uid  psys_2600_still_pre_gdc_uid + 2
+#define psys_2600_still_pre_gdc_input_uid    psys_2600_still_pre_gdc_uid + 3
+#define psys_2600_still_pre_gdc_output_uid   psys_2600_still_pre_gdc_uid + 4
+
+#define psys_2600_still_pre_gdc_vcr2_pg_id        150
+#define psys_2600_still_pre_gdc_vcr2_uid          psys_2600_pg_uid(psys_2600_still_pre_gdc_vcr2_pg_id)
+#define psys_2600_still_pre_gdc_vcr2_param_uid    psys_2600_still_pre_gdc_vcr2_uid + 1
+#define psys_2600_still_pre_gdc_vcr2_program_uid  psys_2600_still_pre_gdc_vcr2_uid + 2
+#define psys_2600_still_pre_gdc_vcr2_input_uid    psys_2600_still_pre_gdc_vcr2_uid + 3
+#define psys_2600_still_pre_gdc_vcr2_output_uid   psys_2600_still_pre_gdc_vcr2_uid + 4
+
+/* \todo dummy definition for Windows only until we can sort out the conflict
+ * needed to continue patch porting, this allows the conflicts to only be present in this file
+ */
+#ifdef _MSC_VER
+    #define psys_2600_still_pre_gdc_v3_uid          ia_fourcc('D','U','M','Y') // DUMMY
+#else
+    #define psys_2600_still_pre_gdc_v3_pg_id        136
+    #define psys_2600_still_pre_gdc_v3_uid          psys_2600_pg_uid(psys_2600_still_pre_gdc_v3_pg_id)
+    #define psys_2600_still_pre_gdc_v3_param_uid    psys_2600_still_pre_gdc_v3_uid + 1
+    #define psys_2600_still_pre_gdc_v3_program_uid  psys_2600_still_pre_gdc_v3_uid + 2
+    #define psys_2600_still_pre_gdc_v3_input_uid    psys_2600_still_pre_gdc_v3_uid + 3
+    #define psys_2600_still_pre_gdc_v3_output_uid   psys_2600_still_pre_gdc_v3_uid + 4
+#endif
+
+#define psys_2600_still_post_gdc_pg_id                118
+#define psys_2600_still_post_gdc_uid                  psys_2600_pg_uid(psys_2600_still_post_gdc_pg_id)
+#define psys_2600_still_post_gdc_param_uid            psys_2600_still_post_gdc_uid + 1
+#define psys_2600_still_post_gdc_program_uid          psys_2600_still_post_gdc_uid + 2
+#define psys_2600_still_post_gdc_input_uid            psys_2600_still_post_gdc_uid + 3
+#define psys_2600_still_post_gdc_spatial_param_uid    psys_2600_still_post_gdc_uid + 4
+#define psys_2600_still_post_gdc_output_uid           psys_2600_still_post_gdc_uid + 5
+#define psys_2600_still_post_gdc_secondary_output_uid psys_2600_still_post_gdc_uid + 6
+#define psys_2600_still_post_gdc_third_output_uid     psys_2600_still_post_gdc_uid + 7
+
+#define psys_2600_still_post_gdc_v2_pg_id                128
+#define psys_2600_still_post_gdc_v2_uid                  psys_2600_pg_uid(psys_2600_still_post_gdc_v2_pg_id)
+#define psys_2600_still_post_gdc_v2_param_uid            psys_2600_still_post_gdc_v2_uid + 1
+#define psys_2600_still_post_gdc_v2_program_uid          psys_2600_still_post_gdc_v2_uid + 2
+#define psys_2600_still_post_gdc_v2_input_uid            psys_2600_still_post_gdc_v2_uid + 3
+#define psys_2600_still_post_gdc_v2_spatial_param_uid    psys_2600_still_post_gdc_v2_uid + 4
+#define psys_2600_still_post_gdc_v2_output_uid           psys_2600_still_post_gdc_v2_uid + 5
+#define psys_2600_still_post_gdc_v2_secondary_output_uid psys_2600_still_post_gdc_v2_uid + 6
+#define psys_2600_still_post_gdc_v2_third_output_uid     psys_2600_still_post_gdc_v2_uid + 7
+
+#define psys_2600_still_post_gdc_mbr_pg_id                133
+#define psys_2600_still_post_gdc_mbr_uid                  psys_2600_pg_uid(psys_2600_still_post_gdc_mbr_pg_id)
+#define psys_2600_still_post_gdc_mbr_param_uid            psys_2600_still_post_gdc_mbr_uid + 1
+#define psys_2600_still_post_gdc_mbr_program_uid          psys_2600_still_post_gdc_mbr_uid + 2
+#define psys_2600_still_post_gdc_mbr_input_uid            psys_2600_still_post_gdc_mbr_uid + 3
+#define psys_2600_still_post_gdc_mbr_spatial_param_uid    psys_2600_still_post_gdc_mbr_uid + 4
+#define psys_2600_still_post_gdc_mbr_output_uid           psys_2600_still_post_gdc_mbr_uid + 5
+#define psys_2600_still_post_gdc_mbr_secondary_output_uid psys_2600_still_post_gdc_mbr_uid + 6
+#define psys_2600_still_post_gdc_mbr_third_output_uid     psys_2600_still_post_gdc_mbr_uid + 7
+
+#define psys_2600_still_post_gdc_v2_mbr_pg_id                173
+#define psys_2600_still_post_gdc_v2_mbr_uid                  psys_2600_pg_uid(psys_2600_still_post_gdc_v2_mbr_pg_id)
+#define psys_2600_still_post_gdc_v2_mbr_param_uid            psys_2600_still_post_gdc_v2_mbr_uid + 1
+#define psys_2600_still_post_gdc_v2_mbr_program_uid          psys_2600_still_post_gdc_v2_mbr_uid + 2
+#define psys_2600_still_post_gdc_v2_mbr_input_uid            psys_2600_still_post_gdc_v2_mbr_uid + 3
+#define psys_2600_still_post_gdc_v2_mbr_spatial_param_uid    psys_2600_still_post_gdc_v2_mbr_uid + 4
+#define psys_2600_still_post_gdc_v2_mbr_output_uid           psys_2600_still_post_gdc_v2_mbr_uid + 5
+#define psys_2600_still_post_gdc_v2_mbr_secondary_output_uid psys_2600_still_post_gdc_v2_mbr_uid + 6
+#define psys_2600_still_post_gdc_v2_mbr_third_output_uid     psys_2600_still_post_gdc_v2_mbr_uid + 7
+
+#define psys_2600_video_isa_pg_id                127
+#define psys_2600_video_isa_uid                  psys_2600_pg_uid(psys_2600_video_isa_pg_id)
+#define psys_2600_video_isa_param_uid            psys_2600_video_isa_uid + 1
+#define psys_2600_video_isa_program_uid          psys_2600_video_isa_uid + 2
+#define psys_2600_video_isa_input_uid            psys_2600_video_isa_uid + 3
+#define psys_2600_video_isa_output_uid           psys_2600_video_isa_uid + 4
+#define psys_2600_video_isa_secondary_output_uid psys_2600_video_isa_uid + 5
+#define psys_2600_video_isa_ae_output_uid        psys_2600_video_isa_uid + 6
+#define psys_2600_video_isa_blc_type0_input_uid  psys_2600_video_isa_uid + 7
+#define psys_2600_video_isa_blc_type1_input_uid  psys_2600_video_isa_uid + 8
+#define psys_2600_video_isa_blc_type2_input_uid  psys_2600_video_isa_uid + 9
+#define psys_2600_video_isa_lsc_type0_input_uid  psys_2600_video_isa_uid + 10
+#define psys_2600_video_isa_lsc_type1_input_uid  psys_2600_video_isa_uid + 11
+#define psys_2600_video_isa_lsc_type2_input_uid  psys_2600_video_isa_uid + 12
+#define psys_2600_video_isa_awb_output_uid       psys_2600_video_isa_uid + 13
+#define psys_2600_video_isa_af_output_uid        psys_2600_video_isa_uid + 14
+
+#define psys_2600_video_rgbir_isa_pg_id                130
+#define psys_2600_video_rgbir_isa_uid                  psys_2600_pg_uid(psys_2600_video_rgbir_isa_pg_id)
+#define psys_2600_video_rgbir_isa_param_uid            psys_2600_video_rgbir_isa_uid + 1
+#define psys_2600_video_rgbir_isa_program_uid          psys_2600_video_rgbir_isa_uid + 2
+#define psys_2600_video_rgbir_isa_input_uid            psys_2600_video_rgbir_isa_uid + 3
+#define psys_2600_video_rgbir_isa_output_uid           psys_2600_video_rgbir_isa_uid + 4
+#define psys_2600_video_rgbir_isa_secondary_output_uid psys_2600_video_rgbir_isa_uid + 5
+#define psys_2600_video_rgbir_isa_ae_output_uid        psys_2600_video_rgbir_isa_uid + 6
+#define psys_2600_video_rgbir_isa_blc_type0_input_uid  psys_2600_video_rgbir_isa_uid + 7
+#define psys_2600_video_rgbir_isa_blc_type1_input_uid  psys_2600_video_rgbir_isa_uid + 8
+#define psys_2600_video_rgbir_isa_blc_type2_input_uid  psys_2600_video_rgbir_isa_uid + 9
+#define psys_2600_video_rgbir_isa_lsc_type0_input_uid  psys_2600_video_rgbir_isa_uid + 10
+#define psys_2600_video_rgbir_isa_lsc_type1_input_uid  psys_2600_video_rgbir_isa_uid + 11
+#define psys_2600_video_rgbir_isa_lsc_type2_input_uid  psys_2600_video_rgbir_isa_uid + 12
+#define psys_2600_video_rgbir_isa_awb_output_uid       psys_2600_video_rgbir_isa_uid + 13
+#define psys_2600_video_rgbir_isa_af_output_uid        psys_2600_video_rgbir_isa_uid + 14
+
+
+#define psys_2600_ipu5_video_isa_pg_id                141
+#define psys_2600_ipu5_video_isa_uid                  psys_2600_pg_uid(psys_2600_ipu5_video_isa_pg_id)
+#define psys_2600_ipu5_video_isa_param_uid            psys_2600_ipu5_video_isa_uid + 1
+#define psys_2600_ipu5_video_isa_program_uid          psys_2600_ipu5_video_isa_uid + 2
+#define psys_2600_ipu5_video_isa_input_uid            psys_2600_ipu5_video_isa_uid + 3
+#define psys_2600_ipu5_video_isa_output_uid           psys_2600_ipu5_video_isa_uid + 4
+#define psys_2600_ipu5_video_isa_secondary_output_uid psys_2600_ipu5_video_isa_uid + 5
+#define psys_2600_ipu5_video_isa_sis_output_uid       psys_2600_ipu5_video_isa_uid + 6
+#define psys_2600_ipu5_video_isa_ae_output_uid        psys_2600_ipu5_video_isa_uid + 7
+#define psys_2600_ipu5_video_isa_blc_type0_input_uid  psys_2600_ipu5_video_isa_uid + 8
+#define psys_2600_ipu5_video_isa_blc_type1_input_uid  psys_2600_ipu5_video_isa_uid + 9
+#define psys_2600_ipu5_video_isa_blc_type2_input_uid  psys_2600_ipu5_video_isa_uid + 10
+#define psys_2600_ipu5_video_isa_lsc_type0_input_uid  psys_2600_ipu5_video_isa_uid + 11
+#define psys_2600_ipu5_video_isa_lsc_type1_input_uid  psys_2600_ipu5_video_isa_uid + 12
+#define psys_2600_ipu5_video_isa_lsc_type2_input_uid  psys_2600_ipu5_video_isa_uid + 13
+#define psys_2600_ipu5_video_isa_awb_output_uid       psys_2600_ipu5_video_isa_uid + 14
+#define psys_2600_ipu5_video_isa_af_output_uid        psys_2600_ipu5_video_isa_uid + 15
+
+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id                174
+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_uid                  psys_2600_pg_uid(psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id)
+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_param_uid            psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 1
+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_program_uid          psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 2
+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_bayer_output_uid     psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 3
+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_sis_output_uid       psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 4
+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_ae_output_uid        psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 5
+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_blc_type0_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 6
+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_blc_type1_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 7
+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_blc_type2_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 8
+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_lsc_type0_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 9
+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_lsc_type1_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 10
+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_lsc_type2_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 11
+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_awb_output_uid       psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 12
+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_af_output_uid        psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 13
+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_gammastar_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 14
+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_input_uid            psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 15
+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_output_uid           psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 16
+
+#define psys_ipu5_isa_lb_pg_id                          194
+#define psys_ipu5_isa_lb_uid                            psys_2600_pg_uid(psys_ipu5_isa_lb_pg_id)
+#define psys_ipu5_isa_lb_param_uid                      psys_ipu5_isa_lb_uid + 1
+#define psys_ipu5_isa_lb_program_uid                    psys_ipu5_isa_lb_uid + 2
+#define psys_ipu5_isa_lb_program_control_init_uid       psys_ipu5_isa_lb_uid + 3
+#define psys_ipu5_isa_lb_input_uid                      psys_ipu5_isa_lb_uid + 4
+#define psys_ipu5_isa_lb_input_paf_uid                  psys_ipu5_isa_lb_uid + 5
+#define psys_ipu5_isa_lb_bayer_output_uid               psys_ipu5_isa_lb_uid + 6
+#define psys_ipu5_isa_lb_sis_output_uid                 psys_ipu5_isa_lb_uid + 7
+#define psys_ipu5_isa_lb_yuv_output_uid                 psys_ipu5_isa_lb_uid + 8
+#define psys_ipu5_isa_lb_cached_out_param_uid           psys_ipu5_isa_lb_uid + 9
+#define psys_ipu5_isa_lb_blc_type0_uid                  psys_ipu5_isa_lb_uid + 10
+#define psys_ipu5_isa_lb_blc_type1_uid                  psys_ipu5_isa_lb_uid + 11
+#define psys_ipu5_isa_lb_blc_type2_uid                  psys_ipu5_isa_lb_uid + 12
+#define psys_ipu5_isa_lb_lsc_type0_uid                  psys_ipu5_isa_lb_uid + 13
+#define psys_ipu5_isa_lb_lsc_type1_uid                  psys_ipu5_isa_lb_uid + 14
+#define psys_ipu5_isa_lb_lsc_type2_uid                  psys_ipu5_isa_lb_uid + 15
+#define psys_ipu5_isa_lb_3a_stat_awb_uid                psys_ipu5_isa_lb_uid + 16
+#define psys_ipu5_isa_lb_3a_stat_af_uid                 psys_ipu5_isa_lb_uid + 17
+#define psys_ipu5_isa_lb_3a_stat_paf_uid                psys_ipu5_isa_lb_uid + 18
+#define psys_ipu5_isa_lb_gammastar_grid_uid             psys_ipu5_isa_lb_uid + 19
+#define psys_ipu5_isa_lb_dvs_mv_out_l0_uid              psys_ipu5_isa_lb_uid + 20
+#define psys_ipu5_isa_lb_dvs_mv_out_l1_uid              psys_ipu5_isa_lb_uid + 21
+#define psys_ipu5_isa_lb_dvs_mv_out_l2_uid              psys_ipu5_isa_lb_uid + 22
+#define psys_ipu5_isa_lb_dvs_fe_in_l0_uid               psys_ipu5_isa_lb_uid + 23
+#define psys_ipu5_isa_lb_dvs_fe_in_l1_uid               psys_ipu5_isa_lb_uid + 24
+#define psys_ipu5_isa_lb_dvs_fe_in_l2_uid               psys_ipu5_isa_lb_uid + 25
+#define psys_ipu5_isa_lb_dvs_fe_out_l0_uid              psys_ipu5_isa_lb_uid + 26
+#define psys_ipu5_isa_lb_dvs_fe_out_l1_uid              psys_ipu5_isa_lb_uid + 27
+#define psys_ipu5_isa_lb_dvs_fe_out_l2_uid              psys_ipu5_isa_lb_uid + 28
+
+#define psys_ipu5_dfm_isl_ps_vpless_pg_id                          166
+#define psys_ipu5_dfm_isl_ps_vpless_uid                            psys_2600_pg_uid(psys_ipu5_dfm_isl_ps_vpless_pg_id)
+#define psys_ipu5_dfm_isl_ps_vpless_param_uid                      psys_ipu5_dfm_isl_ps_vpless_uid + 1
+#define psys_ipu5_dfm_isl_ps_vpless_program_uid                    psys_ipu5_dfm_isl_ps_vpless_uid + 2
+#define psys_ipu5_dfm_isl_ps_vpless_program_control_init_uid       psys_ipu5_dfm_isl_ps_vpless_uid + 3
+#define psys_ipu5_dfm_isl_ps_vpless_input_uid                      psys_ipu5_dfm_isl_ps_vpless_uid + 4
+#define psys_ipu5_dfm_isl_ps_vpless_input_paf_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 5
+#define psys_ipu5_dfm_isl_ps_vpless_yuv_output_uid                 psys_ipu5_dfm_isl_ps_vpless_uid + 6
+#define psys_ipu5_dfm_isl_ps_vpless_bayer_output_uid               psys_ipu5_dfm_isl_ps_vpless_uid + 7
+#define psys_ipu5_dfm_isl_ps_vpless_sis_output_uid                 psys_ipu5_dfm_isl_ps_vpless_uid + 8
+#define psys_ipu5_dfm_isl_ps_vpless_cached_out_param_uid           psys_ipu5_dfm_isl_ps_vpless_uid + 9
+#define psys_ipu5_dfm_isl_ps_vpless_blc_type0_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 10
+#define psys_ipu5_dfm_isl_ps_vpless_blc_type1_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 11
+#define psys_ipu5_dfm_isl_ps_vpless_blc_type2_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 12
+#define psys_ipu5_dfm_isl_ps_vpless_lsc_type0_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 13
+#define psys_ipu5_dfm_isl_ps_vpless_lsc_type1_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 14
+#define psys_ipu5_dfm_isl_ps_vpless_lsc_type2_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 15
+#define psys_ipu5_dfm_isl_ps_vpless_3a_stat_awb_uid                psys_ipu5_dfm_isl_ps_vpless_uid + 16
+#define psys_ipu5_dfm_isl_ps_vpless_3a_stat_af_uid                 psys_ipu5_dfm_isl_ps_vpless_uid + 17
+#define psys_ipu5_dfm_isl_ps_vpless_3a_stat_paf_uid                psys_ipu5_dfm_isl_ps_vpless_uid + 18
+
+#define psys_2600_video_isa_pre_gdc_pg_id               137
+#define psys_2600_video_isa_pre_gdc_uid                 psys_2600_pg_uid(psys_2600_video_isa_pre_gdc_pg_id)
+#define psys_2600_video_isa_pre_gdc_param_uid           psys_2600_video_isa_pre_gdc_uid + 1
+#define psys_2600_video_isa_pre_gdc_ae_output_uid       psys_2600_video_isa_pre_gdc_uid + 2
+#define psys_2600_video_isa_pre_gdc_program_uid         psys_2600_video_isa_pre_gdc_uid + 3
+#define psys_2600_video_isa_pre_gdc_input_uid           psys_2600_video_isa_pre_gdc_uid + 4
+#define psys_2600_video_isa_pre_gdc_output_uid          psys_2600_video_isa_pre_gdc_uid + 5
+#define psys_2600_video_isa_pre_gdc_blc_type0_input_uid psys_2600_video_isa_pre_gdc_uid + 6
+#define psys_2600_video_isa_pre_gdc_blc_type1_input_uid psys_2600_video_isa_pre_gdc_uid + 7
+#define psys_2600_video_isa_pre_gdc_blc_type2_input_uid psys_2600_video_isa_pre_gdc_uid + 8
+#define psys_2600_video_isa_pre_gdc_lsc_type0_input_uid psys_2600_video_isa_pre_gdc_uid + 9
+#define psys_2600_video_isa_pre_gdc_lsc_type1_input_uid psys_2600_video_isa_pre_gdc_uid + 10
+#define psys_2600_video_isa_pre_gdc_lsc_type2_input_uid psys_2600_video_isa_pre_gdc_uid + 11
+#define psys_2600_video_isa_pre_gdc_awb_output_uid      psys_2600_video_isa_pre_gdc_uid + 12
+#define psys_2600_video_isa_pre_gdc_af_output_uid       psys_2600_video_isa_pre_gdc_uid + 13
+#define psys_2600_video_isa_pre_gdc_dvs_in_0_uid        psys_2600_video_isa_pre_gdc_uid + 14
+#define psys_2600_video_isa_pre_gdc_dvs_in_1_uid        psys_2600_video_isa_pre_gdc_uid + 15
+#define psys_2600_video_isa_pre_gdc_dvs_in_2_uid        psys_2600_video_isa_pre_gdc_uid + 16
+#define psys_2600_video_isa_pre_gdc_dvs_out_0_uid       psys_2600_video_isa_pre_gdc_uid + 17
+#define psys_2600_video_isa_pre_gdc_dvs_out_1_uid       psys_2600_video_isa_pre_gdc_uid + 18
+#define psys_2600_video_isa_pre_gdc_dvs_out_2_uid       psys_2600_video_isa_pre_gdc_uid + 19
+
+#define psys_2600_video_isl_pre_gdc_hq_pg_id                156
+#define psys_2600_video_isl_pre_gdc_hq_uid                  psys_2600_pg_uid(psys_2600_video_isl_pre_gdc_hq_pg_id)
+#define psys_2600_video_isl_pre_gdc_hq_param_uid            psys_2600_video_isl_pre_gdc_hq_uid + 1
+#define psys_2600_video_isl_pre_gdc_hq_ae_output_uid        psys_2600_video_isl_pre_gdc_hq_uid + 2
+#define psys_2600_video_isl_pre_gdc_hq_program_uid          psys_2600_video_isl_pre_gdc_hq_uid + 3
+#define psys_2600_video_isl_pre_gdc_hq_input_uid            psys_2600_video_isl_pre_gdc_hq_uid + 4
+#define psys_2600_video_isl_pre_gdc_hq_output_uid           psys_2600_video_isl_pre_gdc_hq_uid + 5
+#define psys_2600_video_isl_pre_gdc_hq_blc_type0_input_uid  psys_2600_video_isl_pre_gdc_hq_uid + 6
+#define psys_2600_video_isl_pre_gdc_hq_blc_type1_input_uid  psys_2600_video_isl_pre_gdc_hq_uid + 7
+#define psys_2600_video_isl_pre_gdc_hq_blc_type2_input_uid  psys_2600_video_isl_pre_gdc_hq_uid + 8
+#define psys_2600_video_isl_pre_gdc_hq_lsc_type0_input_uid  psys_2600_video_isl_pre_gdc_hq_uid + 9
+#define psys_2600_video_isl_pre_gdc_hq_lsc_type1_input_uid  psys_2600_video_isl_pre_gdc_hq_uid + 10
+#define psys_2600_video_isl_pre_gdc_hq_lsc_type2_input_uid  psys_2600_video_isl_pre_gdc_hq_uid + 11
+#define psys_2600_video_isl_pre_gdc_hq_awb_output_uid       psys_2600_video_isl_pre_gdc_hq_uid + 12
+#define psys_2600_video_isl_pre_gdc_hq_af_output_uid        psys_2600_video_isl_pre_gdc_hq_uid + 13
+#define psys_2600_video_isl_pre_gdc_hq_dvs_in_0_uid         psys_2600_video_isl_pre_gdc_hq_uid + 14
+#define psys_2600_video_isl_pre_gdc_hq_dvs_in_1_uid         psys_2600_video_isl_pre_gdc_hq_uid + 15
+#define psys_2600_video_isl_pre_gdc_hq_dvs_in_2_uid         psys_2600_video_isl_pre_gdc_hq_uid + 16
+#define psys_2600_video_isl_pre_gdc_hq_dvs_out_0_uid        psys_2600_video_isl_pre_gdc_hq_uid + 17
+#define psys_2600_video_isl_pre_gdc_hq_dvs_out_1_uid        psys_2600_video_isl_pre_gdc_hq_uid + 18
+#define psys_2600_video_isl_pre_gdc_hq_dvs_out_2_uid        psys_2600_video_isl_pre_gdc_hq_uid + 19
+
+#define psys_2600_video_pre_gdc_hp_pg_id                 1002
+#define psys_2600_video_pre_gdc_hp_uid                   psys_2600_pg_uid(psys_2600_video_pre_gdc_hp_pg_id)
+#define psys_2600_video_pre_gdc_hp_param_uid             psys_2600_video_pre_gdc_hp_uid + 1
+#define psys_2600_video_pre_gdc_hp_program_uid           psys_2600_video_pre_gdc_hp_uid + 2
+#define psys_2600_video_pre_gdc_hp_input_uid             psys_2600_video_pre_gdc_hp_uid + 3
+#define psys_2600_video_pre_gdc_hp_output_uid            psys_2600_video_pre_gdc_hp_uid + 4
+#define psys_2600_video_pre_gdc_hp_ae_output_uid         psys_2600_video_pre_gdc_hp_uid + 5
+#define psys_2600_video_pre_gdc_hp_blc_type0_input_uid   psys_2600_video_pre_gdc_hp_uid + 6
+#define psys_2600_video_pre_gdc_hp_blc_type1_input_uid   psys_2600_video_pre_gdc_hp_uid + 7
+#define psys_2600_video_pre_gdc_hp_blc_type2_input_uid   psys_2600_video_pre_gdc_hp_uid + 8
+#define psys_2600_video_pre_gdc_hp_lsc_type0_input_uid   psys_2600_video_pre_gdc_hp_uid + 9
+#define psys_2600_video_pre_gdc_hp_lsc_type1_input_uid   psys_2600_video_pre_gdc_hp_uid + 10
+#define psys_2600_video_pre_gdc_hp_lsc_type2_input_uid   psys_2600_video_pre_gdc_hp_uid + 11
+#define psys_2600_video_pre_gdc_hp_hw3a_awb_output_uid   psys_2600_video_pre_gdc_hp_uid + 12
+#define psys_2600_video_pre_gdc_hp_hw3a_af_output_uid    psys_2600_video_pre_gdc_hp_uid + 13
+#define psys_2600_video_pre_gdc_hp_fw3a_rgby_uid         psys_2600_video_pre_gdc_hp_uid + 14
+#define psys_2600_video_pre_gdc_hp_fw3a_rgbs_uid         psys_2600_video_pre_gdc_hp_uid + 15
+#define psys_2600_video_pre_gdc_hp_fw3a_ydrc_uid         psys_2600_video_pre_gdc_hp_uid + 16
+#define psys_2600_video_pre_gdc_hp_drc_mapin_uid         psys_2600_video_pre_gdc_hp_uid + 17
+
+#define psys_2600_video_post_gdc_hp_pg_id                1003
+#define psys_2600_video_post_gdc_hp_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_hp_pg_id)
+#define psys_2600_video_post_gdc_hp_param_uid            psys_2600_video_post_gdc_hp_uid + 1
+#define psys_2600_video_post_gdc_hp_program_uid          psys_2600_video_post_gdc_hp_uid + 2
+#define psys_2600_video_post_gdc_hp_input_uid            psys_2600_video_post_gdc_hp_uid + 3
+#define psys_2600_video_post_gdc_hp_spatial_param_uid    psys_2600_video_post_gdc_hp_uid + 4
+#define psys_2600_video_post_gdc_hp_output_uid           psys_2600_video_post_gdc_hp_uid + 5
+#define psys_2600_video_post_gdc_hp_secondary_output_uid psys_2600_video_post_gdc_hp_uid + 6
+#define psys_2600_video_post_gdc_hp_third_output_uid     psys_2600_video_post_gdc_hp_uid + 7
+#define psys_2600_video_post_gdc_hp_tnr_input_uid        psys_2600_video_post_gdc_hp_uid + 8
+#define psys_2600_video_post_gdc_hp_tnr_sim_input_uid    psys_2600_video_post_gdc_hp_uid + 9
+#define psys_2600_video_post_gdc_hp_tnr_output_uid       psys_2600_video_post_gdc_hp_uid + 10
+#define psys_2600_video_post_gdc_hp_tnr_sim_output_uid   psys_2600_video_post_gdc_hp_uid + 11
+
+#define psys_2600_video_hdr_pre_proc_pg_id                1005
+#define psys_2600_video_hdr_pre_proc_uid                  psys_2600_pg_uid(psys_2600_video_hdr_pre_proc_pg_id)
+#define psys_2600_video_hdr_pre_proc_param_uid            psys_2600_video_hdr_pre_proc_uid + 1
+#define psys_2600_video_hdr_pre_proc_program_uid          psys_2600_video_hdr_pre_proc_uid + 2
+#define psys_2600_video_hdr_pre_proc_input_uid            psys_2600_video_hdr_pre_proc_uid + 3
+#define psys_2600_video_hdr_pre_proc_output_uid           psys_2600_video_hdr_pre_proc_uid + 4
+#define psys_2600_video_hdr_pre_proc_secondary_output_uid psys_2600_video_hdr_pre_proc_uid + 5
+#define psys_2600_video_hdr_pre_proc_ae_output_uid        psys_2600_video_hdr_pre_proc_uid + 6
+#define psys_2600_video_hdr_pre_proc_blc_type0_input_uid  psys_2600_video_hdr_pre_proc_uid + 7
+#define psys_2600_video_hdr_pre_proc_blc_type1_input_uid  psys_2600_video_hdr_pre_proc_uid + 8
+#define psys_2600_video_hdr_pre_proc_blc_type2_input_uid  psys_2600_video_hdr_pre_proc_uid + 9
+#define psys_2600_video_hdr_pre_proc_lsc_type0_input_uid  psys_2600_video_hdr_pre_proc_uid + 10
+#define psys_2600_video_hdr_pre_proc_lsc_type1_input_uid  psys_2600_video_hdr_pre_proc_uid + 11
+#define psys_2600_video_hdr_pre_proc_lsc_type2_input_uid  psys_2600_video_hdr_pre_proc_uid + 12
+#define psys_2600_video_hdr_pre_proc_hw3a_awb_output_uid  psys_2600_video_hdr_pre_proc_uid + 13
+#define psys_2600_video_hdr_pre_proc_hw3a_af_output_uid   psys_2600_video_hdr_pre_proc_uid + 14
+#define psys_2600_video_hdr_pre_proc_fw3a_rgby_uid        psys_2600_video_hdr_pre_proc_uid + 15
+#define psys_2600_video_hdr_pre_proc_fw3a_rgbs_uid        psys_2600_video_hdr_pre_proc_uid + 16
+#define psys_2600_video_hdr_pre_proc_fw3a_ydrc_uid        psys_2600_video_hdr_pre_proc_uid + 17
+#define psys_2600_video_hdr_pre_proc_drc_mapin_uid        psys_2600_video_hdr_pre_proc_uid + 18
+
+#define psys_2600_video_pre_gdc_hq_ns_pg_id                1007
+#define psys_2600_video_pre_gdc_hq_ns_uid                  psys_2600_pg_uid(psys_2600_video_pre_gdc_hq_ns_pg_id)
+#define psys_2600_video_pre_gdc_hq_ns_param_uid            psys_2600_video_pre_gdc_hq_ns_uid + 1
+#define psys_2600_video_pre_gdc_hq_ns_program_uid          psys_2600_video_pre_gdc_hq_ns_uid + 2
+#define psys_2600_video_pre_gdc_hq_ns_input_uid            psys_2600_video_pre_gdc_hq_ns_uid + 3
+#define psys_2600_video_pre_gdc_hq_ns_output_uid           psys_2600_video_pre_gdc_hq_ns_uid + 4
+#define psys_2600_video_pre_gdc_hq_ns_noise_output_uid     psys_2600_video_pre_gdc_hq_ns_uid + 5
+#define psys_2600_video_pre_gdc_hq_ns_dvs_in_l0_uid        psys_2600_video_pre_gdc_hq_ns_uid + 6
+#define psys_2600_video_pre_gdc_hq_ns_dvs_in_l1_uid        psys_2600_video_pre_gdc_hq_ns_uid + 7
+#define psys_2600_video_pre_gdc_hq_ns_dvs_in_l2_uid        psys_2600_video_pre_gdc_hq_ns_uid + 8
+#define psys_2600_video_pre_gdc_hq_ns_dvs_out_l0_uid       psys_2600_video_pre_gdc_hq_ns_uid + 9
+#define psys_2600_video_pre_gdc_hq_ns_dvs_out_l1_uid       psys_2600_video_pre_gdc_hq_ns_uid + 10
+#define psys_2600_video_pre_gdc_hq_ns_dvs_out_l2_uid       psys_2600_video_pre_gdc_hq_ns_uid + 11
+
+#define psys_2600_video_post_gdc_hq_ns_pg_id                1008
+#define psys_2600_video_post_gdc_hq_ns_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_hq_ns_pg_id)
+#define psys_2600_video_post_gdc_hq_ns_param_uid            psys_2600_video_post_gdc_hq_ns_uid + 1
+#define psys_2600_video_post_gdc_hq_ns_program_uid          psys_2600_video_post_gdc_hq_ns_uid + 2
+#define psys_2600_video_post_gdc_hq_ns_input_uid            psys_2600_video_post_gdc_hq_ns_uid + 3
+#define psys_2600_video_post_gdc_hq_ns_spatial_param_uid    psys_2600_video_post_gdc_hq_ns_uid + 4
+#define psys_2600_video_post_gdc_hq_ns_output_uid           psys_2600_video_post_gdc_hq_ns_uid + 5
+#define psys_2600_video_post_gdc_hq_ns_secondary_output_uid psys_2600_video_post_gdc_hq_ns_uid + 6
+#define psys_2600_video_post_gdc_hq_ns_third_output_uid     psys_2600_video_post_gdc_hq_ns_uid + 7
+#define psys_2600_video_post_gdc_hq_ns_tnr_input_uid        psys_2600_video_post_gdc_hq_ns_uid + 8
+#define psys_2600_video_post_gdc_hq_ns_tnr_output_uid       psys_2600_video_post_gdc_hq_ns_uid + 9
+#define psys_2600_video_post_gdc_hq_ns_tnr_sim_input_uid    psys_2600_video_post_gdc_hq_ns_uid + 10
+#define psys_2600_video_post_gdc_hq_ns_tnr_sim_output_uid   psys_2600_video_post_gdc_hq_ns_uid + 11
+#define psys_2600_video_post_gdc_hq_ns_input_ns_uid         psys_2600_video_post_gdc_hq_ns_uid + 12
+
+#define psys_2600_video_post_gdc_hq_4k_pg_id                1011
+#define psys_2600_video_post_gdc_hq_4k_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_hq_4k_pg_id)
+#define psys_2600_video_post_gdc_hq_4k_param_uid            psys_2600_video_post_gdc_hq_4k_uid + 1
+#define psys_2600_video_post_gdc_hq_4k_program_uid          psys_2600_video_post_gdc_hq_4k_uid + 2
+#define psys_2600_video_post_gdc_hq_4k_input_uid            psys_2600_video_post_gdc_hq_4k_uid + 3
+#define psys_2600_video_post_gdc_hq_4k_spatial_param_uid    psys_2600_video_post_gdc_hq_4k_uid + 4
+#define psys_2600_video_post_gdc_hq_4k_output_uid           psys_2600_video_post_gdc_hq_4k_uid + 5
+#define psys_2600_video_post_gdc_hq_4k_secondary_output_uid psys_2600_video_post_gdc_hq_4k_uid + 6
+#define psys_2600_video_post_gdc_hq_4k_third_output_uid     psys_2600_video_post_gdc_hq_4k_uid + 7
+#define psys_2600_video_post_gdc_hq_4k_tnr_input_uid        psys_2600_video_post_gdc_hq_4k_uid + 8
+#define psys_2600_video_post_gdc_hq_4k_tnr_output_uid       psys_2600_video_post_gdc_hq_4k_uid + 9
+#define psys_2600_video_post_gdc_hq_4k_tnr_sim_input_uid    psys_2600_video_post_gdc_hq_4k_uid + 10
+#define psys_2600_video_post_gdc_hq_4k_tnr_sim_output_uid   psys_2600_video_post_gdc_hq_4k_uid + 11
+#define psys_2600_video_post_gdc_hq_4k_input_ns_uid         psys_2600_video_post_gdc_hq_4k_uid + 12
+
+#define psys_2600_gaussian_pg_id          123
+#define psys_2600_gaussian_uid            psys_2600_pg_uid(psys_2600_gaussian_pg_id)
+#define psys_2600_gaussian_param_uid      psys_2600_gaussian_uid + 1
+#define psys_2600_gaussian_program_uid    psys_2600_gaussian_uid + 2
+#define psys_2600_gaussian_input_uid      psys_2600_gaussian_uid + 3
+#define psys_2600_gaussian_output_h_uid   psys_2600_gaussian_uid + 4
+#define psys_2600_gaussian_output_v_uid   psys_2600_gaussian_uid + 5
+
+#define psys_2600_video_isa_pre_gdc_hq_4k_pg_id         1012
+#define psys_2600_video_isa_pre_gdc_hq_4k_uid           psys_2600_pg_uid(psys_2600_video_isa_pre_gdc_hq_4k_pg_id)
+
+#define psys_2600_video_hdr_pre_gdc_hp_pg_id                 1015
+#define psys_2600_video_hdr_pre_gdc_hp_uid                   psys_2600_pg_uid(psys_2600_video_hdr_pre_gdc_hp_pg_id)
+#define psys_2600_video_hdr_pre_gdc_hp_isl_input_uid         psys_2600_video_hdr_pre_gdc_hp_uid + 4
+#define psys_2600_video_hdr_pre_gdc_hp_isl_output_uid        psys_2600_video_hdr_pre_gdc_hp_uid + 5
+
+#define psys_2600_video_pre_gdc_ll_pg_id                1004
+#define psys_2600_video_pre_gdc_ll_uid                  psys_2600_pg_uid(psys_2600_video_pre_gdc_ll_pg_id)
+#define psys_2600_video_pre_gdc_ll_param_uid            psys_2600_video_pre_gdc_ll_uid + 1
+#define psys_2600_video_pre_gdc_ll_program_uid          psys_2600_video_pre_gdc_ll_uid + 2
+#define psys_2600_video_pre_gdc_ll_input_uid            psys_2600_video_pre_gdc_ll_uid + 3
+#define psys_2600_video_pre_gdc_ll_output_uid           psys_2600_video_pre_gdc_ll_uid + 4
+
+//NCR mono-ds pg
+#define psys_2600_ncr_monods_gdc_pg_id                1150
+#define psys_2600_ncr_monods_gdc_uid                  psys_2600_pg_uid(psys_2600_ncr_monods_gdc_pg_id)
+#define psys_2600_ncr_monods_gdc_param_uid            psys_2600_ncr_monods_gdc_uid + 1
+#define psys_2600_ncr_monods_gdc_program_uid          psys_2600_ncr_monods_gdc_uid + 2
+#define psys_2600_ncr_monods_gdc_input_uid            psys_2600_ncr_monods_gdc_uid + 3
+#define psys_2600_ncr_monods_gdc_output_uid           psys_2600_ncr_monods_gdc_uid + 4
+#define psys_2600_ncr_monods_gdc_output_ds4_uid       psys_2600_ncr_monods_gdc_uid + 5
+#define psys_2600_ncr_monods_gdc_output_ds16_uid      psys_2600_ncr_monods_gdc_uid + 6
+
+#define psys_interleaved_code_uid     ia_fourcc('I','L','C','S')
+#define psys_interleaved_code_in_uid  psys_interleaved_code_uid + 1
+#define psys_interleaved_code_out_uid psys_interleaved_code_uid + 2
+
+#define psys_command_psys_frequency_uid ia_fourcc('P','S','C','F')
+#define psys_command_priority_uid       ia_fourcc('P','S','C','P')
+#define psys_command_timeout_ms_uid     ia_fourcc('P','S','C','T')
+#define psys_stage_operation_mode_uid   ia_fourcc('P','S','O','P')
+#define psys_stage_routing_bitmap_uid   ia_fourcc('R','B','M','0')
+
+#define psys_software_terminal_uid(pg_id)               ia_fourcc('P','S',((pg_id & 0xFF00) >> 8),pg_id)
+#define psys_software_terminal_uid_from_stage_uid(uid)  psys_software_terminal_uid(psys_2600_pg_id_from_uid(uid))
+#define is_psys_software_terminal_uid(uid)              ((uid & 0xFFFF0000) == psys_software_terminal_uid(0))
+
+#define is_post_gdc_uid(uid)    (uid == psys_2600_post_gdc_uid \
+                              || uid == psys_2600_video_post_gdc_uid \
+                              || uid == psys_2600_video_post_gdc_v2_uid \
+                              || uid == psys_2600_video_post_gdc_mbr_uid \
+                              || uid == psys_2600_video_post_gdc_v2_mbr_uid \
+                              || uid == psys_2600_video_post_gdc_hq_ns_uid \
+                              || uid == psys_2600_still_post_gdc_uid \
+                              || uid == psys_2600_still_post_gdc_v2_uid \
+                              || uid == psys_2600_still_post_gdc_mbr_uid \
+                              || uid == psys_2600_still_post_gdc_v2_mbr_uid \
+                              || uid == psys_ipu5_still_post_gdc_v4_uid \
+                              || uid == psys_ipu5_video_post_gdc_v4_uid \
+                              || uid == psys_ipu5_video_post_gdc_uid \
+                              || uid == psys_ipu6_bb_uid \
+                              || uid == psys_ipu6_bb_gdc_uid \
+                              || uid == psys_ipu5_video_post_gdc_10bit_uid \
+                              || uid == psys_ipu5_still_post_gdc_10bit_uid)
+
+#define is_pre_gdc_uid(uid)     (uid == psys_2600_video_pre_gdc_uid \
+                              || uid == psys_2600_video_pre_gdc_hq_uid \
+                              || uid == psys_2600_video_pre_gdc_hq_vcr2_uid \
+                              || uid == psys_2600_video_pre_gdc_ll_uid \
+                              || uid == psys_2600_ipu5_video_pre_gdc_uid \
+                              || uid == psys_2600_ipu6_lb_video_uid \
+                              || uid == psys_ipu6_lb_rbm_uid \
+                              || uid == psys_2600_still_pre_gdc_uid \
+                              || uid == psys_2600_still_pre_gdc_vcr2_uid \
+                              || uid == psys_2600_still_pre_gdc_v3_uid \
+                              || uid == psys_2600_ipu5_still_pre_gdc_uid \
+                              || uid == psys_2600_ipu5_still_pre_gdc_no_xnr_uid \
+                              || uid == psys_2600_ipu5_still_pre_gdc_vpless_uid)
+
+#define is_combined_pg_uid(uid) (uid == psys_2600_video_isa_pre_gdc_uid \
+                              || uid == psys_2600_video_isl_pre_gdc_hq_uid \
+                              || uid == psys_ipu5_dfm_isa_to_psa_yuv_vmem_uid \
+                              || uid == psys_ipu5_isa_lb_uid \
+                              || uid == psys_ipu6_isa_lb_uid)
+
+#define is_isl_pg_uid(uid)    (uid == psys_ipu6_isa_rbm_uid \
+                            || uid == psys_ipu6s_isa_uid \
+                            || uid == psys_fake_ipu6s_isa_uid \
+                            || uid == psys_ipu5_dfm_isl_ps_vpless_uid)
+
+#define is_gpu_stage_uid(uid) (uid == burstisp_stage_uid)
+
+/* COMMON CSS UIDS */
+#define css_program_group_params_uid        ia_fourcc('C','S','S','P')
+#define css_frame_descriptor_uid            ia_fourcc('C','S','S','F')
+#define css_sc_descriptor_uid               ia_fourcc('C','S','S','C')
+#define css_frame_max_resolution_uid        ia_fourcc('C','S','M','A')
+#define css_frame_min_resolution_uid        ia_fourcc('C','S','M','I')
+#define css_program_group_manifest_uid      ia_fourcc('C','S','S','M')
+#define css_process_group_uid               ia_fourcc('C','S','P','G')
+#define css_process_group_size_uid          ia_fourcc('C','S','P','S')
+#define css_cipr_context_uid                ia_fourcc('C','S','C','C')
+#define css_create_ppg_uid                  ia_fourcc('C','S','C','P')
+#define css_fragment_max_uid                ia_fourcc('C','S','F','<')
+#define css_fragment_min_uid                ia_fourcc('C','S','F','>')
+#define css_fragment_uid                    ia_fourcc('C','S','F','S')
+#define css_fragment_overlap_uid            ia_fourcc('C','S','F','O')
+#define css_fragment_count_uid              ia_fourcc('C','S','F','C')
+#define css_terminal_descriptor_uid         ia_fourcc('C','S','S','T')
+#define css_kernel_bitmap_uid               ia_fourcc('C','S','S','K')
+#define css_dynamic_kernel_bitmap_uid       ia_fourcc('C','S','S','D')
+#define css_fragment_grid_desc_uid          ia_fourcc('C','S','F','G')
+#define css_frame_grid_param_desc_uid       ia_fourcc('C','S','F','P')
+#define css_param_section_desc_uid          ia_fourcc('C','S','P','D')
+#define css_frag_param_section_desc_uid     ia_fourcc('C','S','F','D')
+#define css_kernel_disable_uid              ia_fourcc('C','S','K','D')
+#define css_terminal_link_id_uid            ia_fourcc('C','S','N','K')
+#define css_pg_manifest_uid                 ia_fourcc('C','S','M','F')
+#define css_terminal_connection_type_uid    ia_fourcc('C','S','C','T')
+#define css_terminal_stream2gen_buffer_size_uid    ia_fourcc('C','S','S','B')
+
+
+/* Encode 8bit vied_nci_resource_id_t into least significant byte of UID */
+#define css_vied_nci_kernel_id_uid_mask ia_fourcc(0xFF,0xFF,0xFF,0)
+#define css_vied_nci_kernel_id_uid(x)   ia_fourcc('K','I','#', x)
+
+/** PSYS stage operation modes
+ *
+ * Controllable via psys_stage_operation_mode_uid property
+ */
+typedef enum _psys_stage_opmode {
+    _psys_stage_opmode_na_,         /**< not set, defaults to raw */
+    _psys_stage_opmode_raw_,        /**< basic operation */
+    _psys_stage_opmode_coupled_,    /**< Couple stage with downstream.
+                                         Note: With coupling the IPU commands
+                                         of consequent stages can be re-ordered
+                                         for optimal scheduling with IPU
+                                         parallelism. Delay queues are added
+                                         between stages to sustain SDF.
+                                        */
+    _psys_stage_opmode_coupled_relay_, /**< Relay coupling towards downstream
+                                         Note: When more than 2 stages
+                                         participate in custom scheduling
+                                         discipline. Stages can be used to
+                                         relay the command-list (bundle) ahead
+                                         to stages in downstream.
+                                        */
+    _psys_stage_opmode_delay_only_,  /**< Delay outputs by one.
+                                         Note: Uses delays with default
+                                         scheduling discipline. Used to expose
+                                         aligned delay queue semantics as with
+                                         coupled mode but without changes to
+                                         command queueing.
+                                        */
+    _psys_stage_opmode_incomplete_  /**< no fragmenting and PG creation */
+} psys_stage_opmode_t;
+
+/*** User control utils for PSYS stage ***/
+
+/** Calculate sizeof unidentified PSYS stage property
+ *
+ * This function is intended for generalizing the calculus of stage property
+ * sizes when they need to be identified by user, but PSYS library provides
+ * helper utilities for the purpose.
+ *
+ * Property sizes may dependent on other configuration details of a stage. In
+ * such case the order of sequence needs to be derived from PSYS PG
+ * specification.
+ *
+ * Returns 0 when property cannot be identified or size calculus misses input.
+ * Note: value 0 cannot be set as size of property payload and hence the
+ * property identification loop will fail unless user handles the case.
+ *
+ * \param[in]   property    property object to identify
+ */
+uint32_t psys_library_control_sizeof_property(ia_cipf_property_t *property);
+
+/** Preset data of PSYS stage buffer
+ *
+ * This function is intended to be called when new buffers are allocated and
+ * registered for use of PSYS stage.
+ *
+ * In case of parameter buffers, this function can be expected to take care
+ * of setting the defaults when available.
+ *
+ * Buffer preset function may be dependent on other configuration details of
+ * a stage. This function can be expected to fetch the information from the
+ * stage that user has configured according to PSYS PG specification as a
+ * precondition (e.g terminal formats need to be configured).
+ *
+ * \param[in,out] buffer    buffer object to preset
+ */
+css_err_t psys_library_control_preset_buffer(ia_cipf_buffer_t *buffer);
+
+/** Preset parameter terminal buffer section sizes in Windows use case
+ *
+ * This function is intended to be called during identify loop to handle
+ * parameter terminal properties exposed from PSYS stage.
+ *
+ * This function will set buffer section sizes according to specification
+ * from manifest.
+ *
+ * \param[in,out] terminal    terminal object to preset
+ */
+css_err_t
+psys_library_control_preset_terminal_sections(ia_cipf_terminal_t *terminal);
+
+#endif
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aec.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aec.h
new file mode 100644
index 000000000000..a25d9b96c6b4
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aec.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+/*!
+ * \file ia_aec.h
+ * \brief Definitions and declarations of Intel AEC algorithm.
+ */
+
+#ifndef _IA_AEC_H_
+#define _IA_AEC_H_
+
+#include "ia_configuration.h"
+#include "ia_types.h"
+#include "ia_ccat.h"
+#include "ia_aec_types.h"
+#include "ia_cmc_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*!
+ * \brief Initialize IA_AEC
+ * This function must be called before any other function in the library. It allocates memories for all AEC algorithms based on input parameters
+ * given by the user. AIQB (from CPFF). Initialization returns a handle to the AEC instance, which is given as input parameter for all the
+ * subsequent calls to this library. Therefore, multiple instances of AEC can running simultaneously. For example one instance per camera.
+ *
+ * \param[in]     atbx              Analysis Toolbox handle. AEC will use it to get statistics analysis results.
+ * \param[in]     aiqb_data         Contains tuning parameters for AEC algorithms. NULL, if built-ion defaults are to be used.
+ * return                           IA_AEC handle. Use the returned handle as input parameter for the consequent IA_AEC calls.
+ */
+LIBEXPORT ia_aec*
+ia_aec_init(
+    ia_ccat *ccat,
+    const ia_binary_data *aiqb_data,
+    const ia_cmc_t *a_cmc_ptr);
+
+/*!
+ * \brief De-initialize IA_AEC and its submodules.
+ * All memory allocated by AEC algorithm is freed. AEC handle can no longer be used.
+ *
+ * \param[in] ia_aec                AEC instance handle.
+ */
+LIBEXPORT void
+ia_aec_deinit(ia_aec *ia_aec);
+
+/*!
+ * \brief AEC calculation based on input parameters and frame statistics.
+ * AE calculates new exposure parameters to be used for the next frame based on previously given statistics and user parameters.
+ *
+ * \param[in] ia_aec                 AEC instance handle.
+ * \param[in] aec_input_params       Input parameters for AEC calculations.
+ * \param[out] aec_results           Pointer where AEC results are stored. Client allocates this memory and AEC only fills it with next exposure parameters.
+ * \return                           Error code.
+ */
+LIBEXPORT ia_err
+ia_aec_run(
+    ia_aec *ia_aec,
+    const ia_aec_input_params *aec_input_params,
+    ia_aec_results *aec_results);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA_AEC_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aec_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aec_types.h
new file mode 100644
index 000000000000..ed54b294474f
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aec_types.h
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+/*!
+ * \file ia_aec.h
+ * \brief Definitions and declarations of Intel AEC algorithm.
+ */
+
+#ifndef _IA_AEC_TYPES_H_
+#define _IA_AEC_TYPES_H_
+
+#include "ia_configuration.h"
+#include "ia_types.h"
+#include "ia_aiq_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef IA_AEC_FEATURE_WEIGHT_GRID
+#define IA_AEC_WEIGHT_GRID_SIZE (IA_AEC_WEIGHT_GRID_WIDTH * IA_AEC_WEIGHT_GRID_HEIGHT)
+typedef struct
+{
+    unsigned int grid_width;
+    unsigned int grid_height;
+    unsigned char data[IA_AEC_WEIGHT_GRID_SIZE];
+} ia_aec_weight_grid;
+#endif
+
+typedef struct ia_aec_t ia_aec;
+
+/*!
+ * \brief Input parameter structure for AE algorithm.
+ * This structure can be initialized to zero values for basic functionality (disable or make features ineffective).
+ */
+typedef struct
+{
+    unsigned int num_exposures;                                                     /*!< The number of exposure outputs to have. One for LDR, two or more for HDR/exposure bracketing. */
+    ia_aiq_exposure_sensor_descriptor sensor_descriptor[IA_AEC_EXPOSURES_MAX_NUM];  /*!< Sensor specific descriptor and limits of the used sensor mode for target frame use. */
+    unsigned int num_sensor_descriptors;                                            /*!< The number of sensor descriptors given in the above pointer.
+                                                                                         Used to specify different sensor descriptors for each exposure. */
+    ia_aiq_ae_exposure_distribution_priority exposure_distribution_priority;        /*!< AEC exposure distribution priority mode. */
+    ia_aiq_ae_priority_mode priority_mode;                                          /*!< AEC priority mode. */
+    float manual_convergence_time;                                                  /*!< Manual AEC convergence speed in seconds.
+                                                                                        < 0.0   Use convergence speed from tunings.
+                                                                                         0.0    Convergence filters are bypassed. This is similar behavior as in previous API when using frame_use still
+                                                                                         > 0.0  Overrides convergence speed from tunings. */
+    ia_aiq_ae_manual_limits manual_limits[IA_AEC_EXPOSURES_MAX_NUM];                /*!< Manual limits which override limits defined in AEC tunings. If tunings are to be used, all values must be set to 0. */
+    unsigned int num_manual_limits;                                                 /*!< Number of limits to use. One, if same limits are used for all exposures, two or more if different limits for each exposure are used. */
+    float ev_shift;                                                                 /*!< Exposure Value shift [-4,4]. */
+#ifdef IA_AEC_FEATURE_FLASH
+    ia_aiq_flash_mode flash_mode;                                                   /*!< Manual flash mode. If AEC should make flash decision, set mode to ia_aiq_flash_mode_auto. */
+#endif
+#ifdef IA_AEC_FEATURE_WEIGHT_GRID
+    ia_aiq_ae_metering_mode metering_mode;                                          /*!< AEC metering mode. */
+#endif
+#ifdef IA_AEC_FEATURE_FLICKER_DETECTION
+    ia_aiq_ae_flicker_reduction flicker_reduction_mode;                             /*!< AEC flicker reduction mode. */
+#endif
+#ifdef IA_AEC_FEATURE_ROI_ENABLED
+    ia_rectangle exposure_window;                                                   /*!< Rectangle of area which AEC uses to to calculate new exposure parameters. If rectangle is not to be used, all values must be set to 0. */
+#endif
+#ifdef IA_AEC_FEATURE_APERTURE_CONTROL
+    float manual_aperture_fn;                                                       /*!< Manual f-number of aperture (e.g. 2.8), <= 0.0 for N/A. Used only with P iris. */
+#endif
+#ifdef IA_AEC_FEATURE_DC_IRIS
+    ia_aiq_aperture_control_dc_iris_command manual_dc_iris_command;                 /*!< Used only with DC iris. 0 (auto) for N/A. */
+#endif
+} ia_aec_input_params;
+
+/*!
+ *  \brief Gain structure defining gain value and type.
+ */
+typedef struct
+{
+    cmc_gain_type_t type;       /*!< Gain type (analog, digital, etc.). */
+    float value;                /*!< Gain value as a multiplier (e.g. 1.0). */
+} ia_aec_gain;
+
+/*!
+* \brief AEC results.
+*/
+typedef struct
+{
+    unsigned int exposure_time_us;           /*!< Exposure time in microseconds, -1 if N/A. */
+    ia_aec_gain gains[IA_CMC_GAINS_MAX_NUM]; /*!< Gain as multipliers (e.g. 1.0), -1.0f if N/A. */
+    unsigned int num_gains;                  /*!< The number of gains. */
+    int iso;                                 /*!< ISO value corresponding to the total gains. -1 if N/A. */
+    unsigned int total_target_exposure;      /*!< Total exposure ie. combination of Et, Total gains and Aperture gain, -1 if N/A. */
+} ia_aec_exposure_parameters;
+
+typedef struct
+{
+    unsigned int exposure_index;                                                    /*!< Exposure index which identifies the exposure. */
+    ia_aec_exposure_parameters exposure[IA_AEC_EXPOSURE_PLANS_NUM];                 /*!< Exposure parameters to be used in the next frame in generic format. */
+    ia_aiq_exposure_sensor_parameters sensor_exposure[IA_AEC_EXPOSURE_PLANS_NUM];   /*!< Exposure parameters to be used in the next frame in sensor specific format. */
+    unsigned int exposure_plan_ids[IA_AEC_EXPOSURE_PLANS_NUM];                      /*!< Exposure plan IDs. Used to identify and sync what parameters were changed in the exposure plan. */
+    float distance_from_convergence;                                                /*!< Distance of convergence as an EV shift value. Negative is underexposure, positive is overexposure */
+} ia_aec_exposure_result;
+
+typedef struct
+{
+    ia_aec_exposure_result exposures[IA_AEC_EXPOSURES_MAX_NUM];  /*!< Results for each exposure to be used in the next frame. */
+    unsigned int num_exposures;                                  /*!< The number of calculated exposures. */
+    float lux_level_estimate;                                    /*!< Lux level estimate. */
+    bool converged;                                              /*!< Indicates that AE has converged. */
+#ifdef IA_AEC_FEATURE_WEIGHT_GRID
+    ia_aec_weight_grid weight_grid;                              /*!< Weight map to be used in the next frame histogram calculation. */
+#endif
+#ifdef IA_AEC_FEATURE_FLASH
+    ia_aiq_flash_parameters flashes[IA_AEC_FLASHES_NUM];         /*!< Array of flash parameters for each flashes to be used in the next frame. */
+#endif
+#ifdef IA_AEC_FEATURE_FLICKER_DETECTION
+    ia_aiq_ae_flicker_reduction flicker_reduction_mode;          /*!< Flicker reduction mode proposed by the AEC algorithm */
+#endif
+#ifdef IA_AEC_FEATURE_MULTIFRAME_HINT
+    ia_aiq_bracket_mode multiframe;                              /*!< AEC may propose to use multiframe for optimal results. */
+#endif
+#ifdef IA_AEC_FEATURE_APERTURE_CONTROL
+    ia_aiq_aperture_control aperture_control;                    /*!< Aperture control parameters. */
+#endif
+} ia_aec_results;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA_AEC_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aic_myriad.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aic_myriad.h
new file mode 100644
index 000000000000..c90706685c3c
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aic_myriad.h
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_aic_myriad.h
+ * \brief ia_aic_myriad specific implementation.
+ *
+ * \mainpage
+ * \section main Automatic ISP (AIC) Configuration component for Myriad ISP
+ *
+ * AIC is stateless component, which purpose is to
+ * - Convert generic results into ISP specific format.
+ * - Adapt ISP tunings based on run-time changing parameters.
+ * - Convert ISP specific statistics into format that is used by 3A and control other algorithms.
+ *
+ * AIC consists of following components:
+ * - \ref gaic
+ *
+ * AIC API is defined in ia_aic_myriad.h file.
+ *
+ * See \ref integration for more detailed information about various integration details.
+ *
+ * \page aicparts AIC modules
+ * \section gaic Generic AIC (GAIC)
+ *
+ * GAIC implements generic adaptation of tunings (generated with IQ tools) as factor of run-time changing parameters. GAIC uses various interpolation
+ * schemes to calculate ISP parameters between distinct tunings.
+ *
+ * \page integration Integration notes
+ * \section AIC output buffer state
+ *
+ * AIC is stateless but instead state is stored inside output buffer. Naturally, if same output buffer is not given back to AIC in the next iteration
+ * AIC will recalculate all ISP parameters, thus maintaining backwards compatibility for systems that don't utilize buffer state.AIC determines if the given buffer
+ * is the same by compating if the first 8 bytes of the given buffer are always the same. If AIC client uses the same output buffer all the time, client should
+ * invalidate (by clearing the first 8 bytes of the) given AIC output buffer when any resolution (resolution_info or resolution_history) parameters change at any
+ * stage of the camera operation. Such changes include for example change in digital zoom, scaling and cropping.
+ *
+*/
+
+#ifndef IA_AIC_MYRIAD_H_
+#define IA_AIC_MYRIAD_H_
+
+#include "ia_aiq_types.h"
+#include "ia_types.h"
+#include "ipipe.h"
+#include "ia_statistics_types.h"
+//#include "ia_dvs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct ia_aic_myriad_t ia_aic_myriad;
+
+/*!
+ * \brief Initialize ia_aic_myriad.
+ * This function must be called before any other function in the library.
+ * Initialization returns a handle to the ISP instance, which is given as input parameter for all the ia_aic_myriad functions.
+ */
+
+LIBEXPORT ia_aic_myriad*
+ia_aic_myriad_init(void);
+
+LIBEXPORT void
+ia_aic_myriad_deinit(ia_aic_myriad *ia_aic_myriad);
+
+LIBEXPORT ia_err
+ia_aic_myriad_set_tuning(
+    ia_aic_myriad *aic_myriad,
+    const ia_binary_data *aiqb_data,
+    const ia_cmc_t *ia_cmc);
+
+/*!
+ *  \brief ia_aic_myriad parameter input structure.
+ */
+typedef struct
+{
+    unsigned long long timestamp;                    /*!< Mandatory. Current timestamp (is microseconds) when ia_aic_myriad_run function is called. AIC uses timestamp to decide what
+                                                                     calculations are done based on tunable run rate for each ISP configuration algorithm. */
+    unsigned int frame_width;
+    unsigned int frame_height;
+    ia_aiq_frame_params *sensor_frame_params;        /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
+    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
+    ia_aiq_gbce_results *gbce_results;               /*!< Mandatory. GBCE Gamma tables which are to be used to calculate next ISP parameters.*/
+    ia_aiq_ae_results *ae_results;                   /*!< Mandatory. Exposure results which are to be used to calculate next ISP parameters.
+                                                                     Currently only exposure times, analog and digital gains are used. For convenience reasons AIC takes
+                                                                     ae results and not only needed parameters. */
+    ia_aiq_pa_results_v1 *pa_results;                /*!< Mandatory. Parameter adaptor results from AIQ. */
+    ia_aiq_sa_results_v1 *sa_results;                /*!< Mandatory. Shading adaptor results from AIQ. */
+//    ia_dvs_image_transformation *gdc_transformation; /*!< Mandatory. Image transformation parameters for GDC5 ISP FW. This feature replaces the need for morph_table usage.*/
+} ia_aic_myriad_input_params;
+
+/*!
+ * \brief ISP configuration for the next frame
+ * Computes ISP parameters from input parameters and CPF values for the next image.
+ *
+ * \param[in] ia_aic_myriad                 Mandatory. ISP instance handle.
+ * \param[in] input_params                  Mandatory. Input parameters for ISP calculations.
+ * \param[in/out] output                    Mandatory. Output data structure. If output pointer is given, AIC writes the results to given buffer.
+ *                                                     Output is following ISP API format.
+ * \return                                  Error code.
+ */
+LIBEXPORT ia_err
+ia_aic_myriad_run(
+    ia_aic_myriad *ia_aic_myriad,
+    const ia_aic_myriad_input_params *input_params,
+    icIspConfig *output);
+
+/*!
+ * \brief Creates ISP parameters output buffer.
+ * This function can be used by AIC client to create AIC output buffer. This function's output can be
+ * passed ia_aic_myriad_run() function to fill the output_data structure.
+ *
+ * \return                         ISP configuration parameter structure.
+ */
+LIBEXPORT icIspConfig *
+ia_aic_myriad_create_output(void);
+
+LIBEXPORT void
+ia_aic_myriad_delete_output(icIspConfig *output);
+
+LIBEXPORT ia_err
+ia_aic_myriad_statistics_convert_rgbs_grid_v2(
+        const icIspConfig *isp_config,
+        ia_rgbs_grid *rgbs_grid);
+
+LIBEXPORT ia_err
+ia_aic_myriad_statistics_convert_rgbs_grid(
+    const icIspConfig *isp_config,
+    ia_aiq_rgbs_grid *rgbs_grid);
+
+/*!
+ * \brief Converts Myriad ISP specific convolution filter response grid statistics to CCAT format.
+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
+ * from various ISP formats into CCAT format.
+ * \param[in]  ia_aic_myriad Mandatory. ia_aic_myriad instance handle.
+ *
+ * \param[out] out_fr_grid   Mandatory.\n
+ *                           Pointer's to structure where converted statistics are stored.
+ *                           Converted af grid statistics.
+ * \return                   Error code.
+ */
+LIBEXPORT ia_err
+ia_aic_myriad_statistics_convert_fr_grid_v2(
+    const icIspConfig *isp_config,
+    ia_filter_response_grid *out_fr_grid);
+
+/*!
+ * \brief Converts Myriad ISP specific convolution filter response grid statistics to IA_AIQ format.
+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
+ * from various ISP formats into AIQ statistics format.
+ * \param[in]  ia_aic_myriad Mandatory. ia_aic_myriad instance handle.
+ *
+ * \param[out] out_fr_grid   Mandatory.\n
+ *                           Pointer's pointer where address of converted statistics are stored.
+ *                           Converted af grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+ *                           if the external buffer is provided in out_af_grid it will be used otherwise internal buffer is used.
+ * \return                   Error code.
+ */
+LIBEXPORT ia_err
+ia_aic_myriad_statistics_convert_fr_grid(
+    const icIspConfig *isp_config,
+    ia_aiq_af_grid *out_fr_grid);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* IA_AIC_MYRIAD_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq.h
new file mode 100644
index 000000000000..64c2170dc301
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq.h
@@ -0,0 +1,621 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \mainpage IA AIQ API documentation
+ *
+ * Browse Files and Classes tabs for details.
+ *
+ * \section general General info
+ *
+ * AIQ API has been designed to be re-entrant. Each algorithm function can be called multiple times per frame.
+ * Input parameters for the algorithms define what is the output ie. running an algorithm with same input parameters
+ * and same statistics produce the same output. For example one can run AE multiple times with different EV compensations
+ * to get parameters for exposure bracketing.
+ *
+ * AIQ (Algorithms and Image Quality) library contains several algorithm which are used to modify RAW image.
+ * Currently following features and algorithms are supported:
+ * - \ref aec (Automatic Exposure Control)
+ * - \ref awb (Automatic White Balance)
+ * - \ref af (Automatic Focus)
+ * - \ref sa (Shading Adaptor)
+ * - \ref pa (Parameter Adaptor)
+ * - \ref dsd (Discrete Scene Detection)
+ * - \ref gbce (Global Brightness and Contrast Enhancement)
+ *
+ * AIQ also supports calculation of parameters for multiframe bracketing cases:
+ * - \ref afbracket (Automatic Focus Bracket)
+ * - \ref aebracket (Automatic Exposure Bracket)
+ *
+ * Running AIQ algorithms requires following steps:
+ * - \ref init
+ * - \ref stats
+ * - \ref running
+ * - \ref deinit
+ *
+ * Some AIQ algorithms require coordinates as inputs to specify a certain area in the image. Coordinates are relative to
+ * the statistics thus not necessarily the whole sensor area. Coordinates are not absolute but relative. See \link ia_coordinate.h \endlink
+ * for detailed description of the used coordinate system.
+ * <br><hr><br>
+ *
+ * \section init Initialization of AIQ library
+ *
+ * \copybrief ia_aiq_init
+ * To create an instance of AIQ library one must call function:
+ * \code ia_aiq_init \endcode
+ * \copydetails ia_aiq_init
+ *
+ * <br><hr><br>
+ *
+ * \section stats Setting of frame statistics
+ *
+ * Algorithms depend on statistics collected from the RAW image. Some or all of the statistics are
+ * calculated by the ISP after RAW image capture from camera sensor. These statistics are always collected from
+ * captured image data. To convert statistics from ISP specific format to AIQ format, a helper function can be used:
+ * \code ia_isp_XXX_statistics_convert \endcode
+ * See ia_isp documentation for details.
+ *
+ * \copybrief ia_aiq_statistics_set
+ * To set statistics for algorithms AIQ library, one must call function:
+ * \code ia_aiq_statistics_set \endcode
+ * \copydetails ia_aiq_statistics_set
+ *
+ * Algorithms can also utilize external sensor data for making better decisions. For example external light sensor
+ * can be used by AEC to determine correct cold start exposure parameters when AEC is called the first time without
+ * statistics.
+ *
+ * \copybrief ia_aiq_sensor_events_set_v1
+ * To set external sensor data statistics for algorithms AIQ library, one must call function:
+ * \code ia_aiq_sensor_events_set_v1 \endcode
+ * \copydetails ia_aiq_sensor_events_set_v1
+ *
+ * <br><hr><br>
+ *
+ * \section running Running AIQ algorithms
+ *
+ * Once the AIQ instance is initialized and statistics are set, algorithms can be run in any order.
+ * \subsection af AF
+ * \copybrief ia_aiq_af_run
+ * \code ia_aiq_af_run \endcode
+ * \copydetails ia_aiq_af_run
+ *
+ * \subsection aec AEC
+ * \copybrief ia_aiq_ae_run
+ * \code ia_aiq_ae_run \endcode
+ * \copydetails ia_aiq_ae_run
+ *
+ * \subsection awb AWB
+ * \copybrief ia_aiq_awb_run
+ * \code ia_aiq_awb_run \endcode
+ * \copydetails ia_aiq_awb_run
+ *
+ * \subsection sa SA
+ * \copybrief ia_aiq_sa_run
+ * \code ia_aiq_sa_run \endcode
+ * \copydetails ia_aiq_sa_run
+ *
+ * \subsection pa PA
+ * \copybrief ia_aiq_pa_run
+ * \code ia_aiq_pa_run \endcode
+ * \copydetails ia_aiq_pa_run
+ *
+ * \subsection dsd DSD
+ * \copybrief ia_aiq_dsd_run
+ * \code ia_aiq_dsd_run \endcode
+ * \copydetails ia_aiq_dsd_run
+ *
+ * \subsection gbce GBCE
+ * \copybrief ia_aiq_gbce_run
+ * \code ia_aiq_gbce_run \endcode
+ * \copydetails ia_aiq_gbce_run
+ *
+ * \subsection afbracket AF Bracket
+ * \copybrief ia_aiq_af_bracket
+ * \code ia_aiq_af_bracket \endcode
+ * \copydetails ia_aiq_af_bracket
+ *
+ * \subsection aebracket AE Bracket & HDR
+ * AEC supports outputting of multiple exposure results. By setting the "num_exposures" parameter >1 in ia_aiq_ae_input_params, AEC determines
+ * the best exposure parameters to cover as much as possible of the sensor's dynamic range. AIQ's client can then queue the exposure parameters
+ * to the sensor for consecutive frames for best speed.
+ *
+ * HDR support in AEC works the same way. Client requests >1 "num_exposures" but also gives AIQ the resulting statistics from all requested
+ * exposures. AEC uses the given (multiple) statistics to calculate new exposure parameters.
+ *
+ *
+ * <br><hr><br>
+ *
+ * \section deinit De-initialization of AIQ library
+ *
+ * To de-initialize and free memory AIQ library instance has allocated, one must call function:
+ * \code
+ * ia_aiq_deinit
+ * \endcode
+ *
+ * After this call AIQ library instance is destroyed and can't be used.
+ */
+
+/*!
+ * \file ia_aiq.h
+ * \brief Definitions and declarations of Intel 3A library.
+ */
+
+#ifndef _IA_AIQ_H_
+#define _IA_AIQ_H_
+
+#include "ia_aiq_types.h"
+#include "ia_types.h"
+#include "ia_mkn_types.h"
+#include "ia_cmc_types.h"
+#include "ia_aiq_deprecated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*!
+ * \brief Initialize IA_AIQ and its submodules.
+ * This function must be called before any other function in the library. It allocates memories for all AIQ algorithms based on input parameters
+ * given by the user. AIQB (from CPFF) and NVM data are parsed and combined resulting camera module specific tuning parameters which the
+ * AIQ algorithms use. Initialization returns a handle to the AIQ instance, which is given as input parameter for all the
+ * algorithms. Therefore, multiple instances of AIQ library can running simultaneously. For example one instance per camera.
+ *
+ * \param[in]     aiqb_data         Mandatory although function will not return error, if it not given.\n
+ *                                  Contains tuning parameters for AIQ algorithms.
+ * \param[in]     nvm_data          Optional.\n
+ *                                  NVM (Non Volatile Memory) containing sensor unit specific calibration data.
+ *                                  AIC uses camera unit specific calibration data, if given.
+ * \param[in]     aiqd_data         Optional.\n
+ *                                  AIQ generic input data, provided by the host. Contains various AIQ related information, collected
+ *                                  during run-time and stored in a host file system. AIQ will parse this data in to internal storage.
+ * \param[in]     stats_max_width   Mandatory.\n
+ *                                  Maximum width of RGBS and AF statistics grids from ISP. Used to calculate size of
+ *                                  memory buffers for the IA_AIQ algorithms. The same maximum width will be used for all RGBS
+ *                                  and AF statistics grid allocations.
+ * \param[in]     stats_max_height  Mandatory.\n
+ *                                  Maximum height of RGBS and AF statistics grids from ISP. Used to calculate size of
+ *                                  memory buffers for the IA_AIQ algorithms. The same maximum height will be used for all RGBS
+ *                                  and AF statistics grid allocations.
+ * \param[in]     max_num_stats_in  Mandatory.\n
+ *                                  The maximum number of input statistics for one frame. Each statistics is related to different exposure.
+ *                                  Used especially for sensors that support two or more simultaneous exposures (HDR).
+ * \param[in]     ia_cmc            Mandatory.\n
+ *                                  Parsed camera module characterization structure. ia_cmc structure needs to be kept available by client for
+ *                                  the lifetime of AIQ component.
+ * \param[in,out] ia_mkn            Optional.\n
+ *                                  Makernote handle which can be initialized with ia_mkn library. If debug data from AIQ is needed
+ *                                  to be stored into EXIF, this parameter is needed. Algorithms will update records inside this makernote instance.
+ *                                  Client writes the data into Makernote section in EXIF.
+ * return                           IA_AIQ handle. Use the returned handle as input parameter for the consequent IA_AIQ calls.
+ */
+LIBEXPORT ia_aiq*
+ia_aiq_init(const ia_binary_data *aiqb_data,
+            const ia_binary_data *nvm_data,
+            const ia_binary_data *aiqd_data,
+            unsigned int stats_max_width,
+            unsigned int stats_max_height,
+            unsigned int max_num_stats_in,
+            ia_cmc_t *ia_cmc,
+            ia_mkn *ia_mkn);
+
+/*!
+ * \brief Set tuning to an existing AIQ instance.
+ * This function can be used to switch tunings on-the-fly in a way that 3A preserves its state and offers smooth transition from one tuning to another.
+ */
+LIBEXPORT ia_err
+ia_aiq_set_tuning(ia_aiq *ia_aiq,
+                  const ia_binary_data *aiqb_data);
+
+/*!
+ * \brief De-initialize IA_AIQ and its submodules.
+ * All memory allocated by AIQ algoriths are freed. AIQ handle can no longer be used.
+ *
+ * \param[in] ia_aiq                Mandatory.\n
+ *                                  AIQ instance handle.
+ */
+LIBEXPORT void
+ia_aiq_deinit(ia_aiq *ia_aiq);
+
+/*!
+ *  \brief Input parameter structure for AE algorithm.
+ */
+typedef struct
+{
+    unsigned int num_exposures;                                 /*!< Mandatory. The number of exposure outputs to have. Must be positive. One for LDR, two or more for HDR/exposure bracketing. */
+    ia_aiq_frame_use frame_use;                                 /*!< Mandatory. Target frame type of the AEC calculations (Preview, Still, video etc.). */
+    ia_aiq_flash_mode flash_mode;                               /*!< Mandatory. Manual flash mode. If AEC should make flash decision, set mode to ia_aiq_flash_mode_auto. */
+    ia_aiq_ae_operation_mode operation_mode;                    /*!< Mandatory. AEC operation mode. */
+    ia_aiq_ae_metering_mode metering_mode;                      /*!< Mandatory. AEC metering mode. */
+    ia_aiq_ae_priority_mode priority_mode;                      /*!< Mandatory. AEC priority mode. */
+    ia_aiq_ae_flicker_reduction flicker_reduction_mode;         /*!< Mandatory. AEC flicker reduction mode. */
+    ia_aiq_exposure_sensor_descriptor *sensor_descriptor;       /*!< Mandatory although function will not return error, if not given.
+                                                                     Sensor specific descriptor and limits of the used sensor mode for target frame use.
+                                                                     AEC will not limit and calculate sensor specific parameters, if not given */
+    unsigned int num_sensor_descriptors;                        /*!< Mandatory. The number of sensor descriptors given in the above pointer.
+                                                                     Used to specify different sensor descriptors for each exposure. */
+    ia_rectangle *exposure_window;                              /*!< Optional. Rectangle of area which AEC uses to to calculate new exposure parameters. */
+    ia_coordinate *exposure_coordinate;                         /*!< Optional. Coordinate for a point in which the exposure should be prioritized.
+                                                                     AEC increases weight of given point in final AEC results. */
+    float ev_shift;                                             /*!< Optional. Exposure Value shift [-4,4]. */
+    long *manual_exposure_time_us;                              /*!< Optional. Manual exposure time in microseconds. NULL if NA. Otherwise, array of values
+                                                                     of num_exposures length. Order of exposure times corresponds to exposure_index of ae_results,
+                                                                     e.g., manual_exposure_time_us[ae_results->exposures[0].exposure_index] = 33000; */
+    float *manual_analog_gain;                                  /*!< Optional. Manual analog gain. NULL if NA. Otherwise, array of values of num_exposures length.
+                                                                     Order of gain values corresponds to exposure_index of ae_results,
+                                                                     e.g., manual_analog_gain[ae_results->exposures[0].exposure_index] = 4.0f; */
+    short *manual_iso;                                          /*!< Optional. Manual ISO. Overrides manual_analog_gain. NULL if NA. Otherwise, array of values
+                                                                     of num_exposures length. Order of ISO values corresponds to exposure_index of ae_results,
+                                                                     e.g., manual_iso[ae_results->exposures[0].exposure_index] = 100; */
+    ia_aiq_ae_features *aec_features;                           /*!< Optional. AEC features in use when calculating new exposure parameters. */
+    ia_aiq_ae_manual_limits *manual_limits;                     /*!< Optional. Manual limits which override limits defined in AEC tunings. */
+    float manual_aperture_fn;                                   /*!< Optional. Manual f-number of aperture (e.g. 2.8), -1.0 for N/A. Used only with P iris. */
+    ia_aiq_aperture_control_dc_iris_command manual_dc_iris_command; /*!< Optional. Used only with DC iris. 0 (auto) for N/A. */
+    ia_aiq_ae_exposure_distribution_priority exposure_distribution_priority; /*!< Mandatory. AEC exposure distribution priority mode. */
+    float manual_convergence_time;                              /*!< Mandatory. Manual AEC convergence speed in seconds.
+                                                                     -1.0 if NA (uses tunings).
+                                                                     0.0  means convergence filters are bypassed, this is similar behavior as in previous API when using frame_use still
+                                                                     > 0.0  Overrides convergence speed from tunings. */
+} ia_aiq_ae_input_params_v1;
+
+/*!
+ * \brief AEC calculation based on input parameters and frame statistics.
+ * AE calculates new exposure parameters to be used for the next frame based on previously given statistics and user parameters.
+ *
+ * \param[in] ia_aiq                Mandatory.\n
+ *                                  AIQ instance handle.
+ * \param[in] ae_input_params       Mandatory.\n
+ *                                  Input parameters for AEC calculations.
+ * \param[out] ae_results           Mandatory.\n
+ *                                  Pointer's pointer where address of ISP parameters are stored.
+ *                                  Results from AEC calculations. Results can be used directly as input for AIC.
+ * \return                          Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_ae_run_v1(ia_aiq *ia_aiq,
+              const ia_aiq_ae_input_params_v1 *ae_input_params,
+              ia_aiq_ae_results **ae_results);
+
+/*!
+* \brief Get the AEC calculated histograms.
+* AE calculates histograms from the RGBS grid.
+*
+* \param[in] ia_aiq                Mandatory.\n
+*                                  AIQ instance handle.
+* \return                          Pointer to the calculated histograms.
+*/
+LIBEXPORT ia_aiq_histogram *
+ia_aiq_get_histograms_v1(ia_aiq *ia_aiq, unsigned int a_exposure_index);
+
+/*!
+ *  \brief Input parameter structure for AF algorithm.
+ */
+typedef struct
+{
+    ia_aiq_frame_use frame_use;                                 /*!< Mandatory. Target frame type of the AF calculations (Preview, Still, video etc.). */
+    int lens_position;                                          /*!< Mandatory. Current lens position. */
+    unsigned long long lens_movement_start_timestamp;           /*!< Mandatory. Lens movement start timestamp in us. Timestamp is compared against statistics timestamp
+                                                                     to determine if lens was moving during statistics collection. */
+    ia_aiq_af_operation_mode focus_mode;                        /*!< Mandatory. Focusing mode. */
+    ia_aiq_af_range focus_range;                                /*!< Mandatory. Focusing range. Only valid when focus_mode is ia_aiq_af_operation_mode_auto. */
+    ia_aiq_af_metering_mode focus_metering_mode;                /*!< Mandatory. Metering mode (multispot, touch). */
+    ia_aiq_flash_mode flash_mode;                               /*!< Mandatory. User setting for flash. */
+    ia_rectangle *focus_rect;                                   /*!< Optional. */
+    ia_aiq_manual_focus_parameters *manual_focus_parameters;    /*!< Optional. Manual focus parameters (manual lens position, manual focusing distance). Used only if
+                                                                     focus mode 'ia_aiq_af_operation_mode_manual' is used. */
+    bool trigger_new_search;                                    /*!< TRUE if new AF search is needed, FALSE otherwise. Host is responsible for flag cleaning. */
+} ia_aiq_af_input_params;
+
+/*!
+ * \brief AF calculation based on input parameters and frame statistics.
+ * AF calculates new lens position based on statistics and given input parameters.
+ *
+ * \param[in] ia_aiq                Mandatory.\n
+ *                                  AIQ instance handle.
+ * \param[in] af_input_params       Mandatory.\n
+ *                                  Input parameters for AF calculations.
+ * \param[out] af_results           Mandatory.\n
+ *                                  Pointer's pointer where address of AF results are stored.
+ *                                  Results from AF calculations.
+ * \return                          Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_af_run(ia_aiq *ia_aiq,
+              const ia_aiq_af_input_params *af_input_params,
+              ia_aiq_af_results **af_results);
+
+/*!
+ *  \brief Input parameter structure for AWB algorithm.
+ */
+typedef struct
+{
+    ia_aiq_awb_operation_mode scene_mode;             /*!< Mandatory. AWB scene mode. */
+    ia_aiq_awb_manual_cct_range *manual_cct_range;    /*!< Optional. Manual CCT range. Used only if AWB scene mode 'ia_aiq_awb_operation_manual_cct_range' is used. */
+    ia_coordinate *manual_white_coordinate;           /*!< Optional. Manual white point coordinate relative to the full FOV of the scene. Used only if AWB scene mode 'ia_aiq_awb_operation_manual_white' is used. */
+    float manual_convergence_time;                    /*!< Optional. Manual AWB convergence speed in seconds. -1.0 if NA. Overrides convergence speed from tunings. */
+} ia_aiq_awb_input_params_v1;
+
+/*!
+ * \brief AWB calculation based on input parameters and frame statistics.
+ *
+ * \param[in] ia_aiq                Mandatory.\n
+ *                                  AIQ instance handle.
+ * \param[in] awb_input_params      Mandatory.\n
+ *                                  Input parameters for AWB calculations.
+ * \param[out] awb_results          Mandatory.\n
+ *                                  Pointer's pointer where address of AWB results are stored.
+ *                                  Results from AWB calculations. Results can be used directly as input for ia_isp.
+ * \return                          Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_awb_run_v1(ia_aiq *ia_aiq,
+                  const ia_aiq_awb_input_params_v1 *awb_input_params,
+                  ia_aiq_awb_results **awb_results);
+
+
+/*!
+ *  \brief Input parameter structure for GBCE algorithm.
+ */
+typedef struct
+{
+    ia_aiq_gbce_level gbce_level;           /*!< Mandatory. GBCE level. -1 to use tuning defaults.*/
+    ia_aiq_tone_map_level tone_map_level;   /*!< Mandatory. Tone Map level. -1 to use tuning defaults.*/
+    ia_aiq_frame_use frame_use;             /*!< Deprecated. Not used. */
+    float ev_shift;                         /*!< Optional. Exposure Value shift [-4,4]. */
+} ia_aiq_gbce_input_params;
+
+/*!
+ * \brief GBCE calculation based on input parameters and frame statistics.
+ * Computes gamma
+ *
+ * \param[in] ia_aiq                        Mandatory.\n
+ *                                          AIQ instance handle.
+ * \param[in] gbce_input_params             Mandatory.\n
+ *                                          Input parameters for GBCE calculations.
+ * \param[out] gbce_results                 Mandatory.\n
+ *                                          Pointer's pointer where address of GBCE results are stored.
+ *                                          Results contain GBCE Gamma table. Results can be used directly as input for AIC.
+ * \return                                  Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_gbce_run(ia_aiq *ia_aiq,
+                const ia_aiq_gbce_input_params *gbce_input_params,
+                ia_aiq_gbce_results **gbce_results);
+
+/*!
+ *  \brief Input parameter structure for DSD algorithm.
+ */
+typedef struct
+{
+    ia_aiq_af_results *af_results;     /*!< Mandatory although function will not return error, if not given.
+                                            DSD will not return all scene modes, if not given. */
+    ia_aiq_scene_mode scene_modes_selection;  /*!<configure which scene modes should be detected by DSD*/
+} ia_aiq_dsd_input_params;
+
+/*!
+ * \brief DSD based on statistics analysis.
+ * Determine scene (DSD) the given image.
+ *
+ * \param[in] ia_aiq                Mandatory.\n
+ *                                  AIQ instance handle.
+ * \param[in] dsd_input_params      Mandatory.\n
+ *                                  Input parameters for DSD calculations.
+ * \param[out] dsd_scene            Mandatory.\n
+ *                                  Detected scene mode.
+ * \return                          Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_dsd_run(ia_aiq *ia_aiq,
+               const ia_aiq_dsd_input_params *dsd_input_params,
+               ia_aiq_scene_mode *dsd_scene);
+
+/*!
+*  \brief Input parameter structure for Parameter adaptor.
+*/
+typedef struct ia_aiq_pa_input_params
+{
+    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
+    ia_aiq_exposure_parameters *exposure_params;     /*!< Mandatory. Analog gain and exposure time. */
+    ia_aiq_color_channels *color_gains;              /*!< Optional. RGB gains for each color channels. These gain will be applied on top of RGB gains calculated from WB results. */
+} ia_aiq_pa_input_params;
+
+/*!
+* \brief Parameter adaptor calculations for the next frame.
+* Compute generic parameters (Color Correction Matrix and Black Level Correction),
+* which should be used to correct the next frame. Calculations are based on previously calculated AIQ algorithm results.
+* These generic results are converted to ISP specific parameters by ia_isp component.
+*
+* \param[in] ia_aiq                Mandatory.\n
+*                                  AIQ instance handle.
+* \param[in] pa_input_params       Mandatory.\n
+*                                  Input parameters for PA calculations.
+* \param[out] pa_results           Mandatory.\n
+*                                  Pointer's pointer where address of parameter adaptor results are stored.
+
+* \return                          Error code.
+*/
+LIBEXPORT ia_err
+ia_aiq_pa_run_v1(ia_aiq *ia_aiq,
+               const ia_aiq_pa_input_params *pa_input_params,
+               ia_aiq_pa_results_v1 **pa_results);
+
+/*!
+ * \brief Shading Adaptor calculations for the next frame.
+ * Compute shading correction parameters.
+ * which should be used to correct the next frame. Calculations are based on previously calculated AIQ algorithm results.
+ * These generic results are converted to ISP specific parameters by ia_isp component.
+ *
+ * \param[in] ia_aiq                Mandatory.\n
+ *                                  AIQ instance handle.
+ * \param[in] sa_input_params       Mandatory.\n
+ *                                  Input parameters for SA calculations.
+ * \param[out] sa_results           Mandatory.\n
+ *                                  Pointer's pointer where address of shading adaptor results are stored.
+
+ * \return                          Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_sa_run_v2(ia_aiq *ia_aiq,
+               const ia_aiq_sa_input_params_v1 *sa_input_params,
+               ia_aiq_sa_results_v1 **sa_results);
+
+/*!
+ *  \brief Input parameter structure for setting the statistics.
+ */
+typedef struct
+{
+    unsigned long long frame_id;                                /*!< The frame identifier which identifies to which frame the given statistics correspond. Must be positive. */
+    unsigned long long frame_timestamp;                         /*!< Mandatory although function will not return error, if not given.
+                                                                     Start of frame timestamp in microseconds. This value is used in conjunction with timestamps
+                                                                     provided in the AIQ algorithms function calls to calculate the convergence
+                                                                     speed of AIQ algorithms.
+                                                                     AEC, AWB and AF will not converge, if not given. */
+    const ia_aiq_ae_results *frame_ae_parameters;               /*!< Mandatory although function will not return error, if not given.
+                                                                     Exposure results from AEC which were used to capture this frame.
+                                                                     AEC depends on this parameters. AEC will return cold start values if not given.*/
+    const ia_aiq_af_results *frame_af_parameters;               /*!< Mandatory although function will not return error, if not given.
+                                                                     Focus results from AF which were used to capture this frame.
+                                                                     AEC with AF assist light and flash usage in macro functionalities depend on these parameters. */
+    const ia_aiq_rgbs_grid **rgbs_grids;                        /*!< Mandatory. Almost all AIQ algorithms require RGBS grid statistics. */
+    unsigned int num_rgbs_grids;                                /*!< The number of RGBS grids. */
+    const ia_aiq_hdr_rgbs_grid* hdr_rgbs_grid;                  /*!< Optional. HDR statistics grid. */
+    const ia_aiq_af_grid **af_grids;                            /*!< Mandatory although function will not return error, if not given.
+                                                                     AF will return a NULL pointer, if not given.
+                                                                     DSD will not return all scene modes, if not given. */
+    unsigned int num_af_grids;                                  /*!< The number of AF grids. */
+    const ia_aiq_histogram **external_histograms;               /*!< Optional. If ISP calculates histogram, if can be given. If external histogram is not given,
+                                                                     AIQ internally calculates the histogram from the RGBS grid statistics and given AWB parameters. */
+    unsigned int num_external_histograms;                       /*!< The number of external histograms. */
+    const ia_aiq_pa_results_v1 *frame_pa_parameters;               /*!< Optional (Mandatory if external_histogram is not given).
+                                                                     AWB results used in the frame from where the statistics are collected.
+                                                                     GBCE will give default gamma table if external histogram or AWB results are not available. */
+    const ia_atbx_face_state *faces;                            /*!< Mandatory although function will not return error, if not given.
+                                                                     Face coordinates from external face detector.
+                                                                     DSD will not return all scene modes, if not given.
+                                                                     AWB will not take face information into account, if not given. */
+    ia_aiq_camera_orientation camera_orientation;               /*!< The orientation of the camera. Currently unused. */
+
+    const ia_aiq_awb_results *awb_results;                      /*!< Optional. Estimated AWB results from the previous run of AWB */
+    const ia_aiq_sa_results_v1 *frame_sa_parameters;            /*!< Optional. LSC results used in the frame for statistics collected. */
+    const ia_aiq_depth_grid **depth_grids;                      /*!< Optional. Depth grid statistics */
+    unsigned int num_depth_grids;                               /*!< Optional. Number of depth grid statistics */
+    const ia_aiq_grid *ir_grid;                                 /*!< Optional. Ir grid statistics, if available. */
+} ia_aiq_statistics_input_params_v4;
+
+/*!
+ * \brief Set input statistics and information about the captured image.
+ * AIQ algorithms need various information about the conditions in which the frame and statistics were captured in order to
+ * calculate new parameters.
+ *
+ * \param[in] ia_aiq                        Mandatory.\n
+ *                                          AIQ instance handle.
+ * \param[in] statistics_input_params       Mandatory.\n
+ *                                          Input parameters containing statistics and information about a frame.
+ * \return                                  Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_statistics_set_v4(ia_aiq *ia_aiq,
+    const ia_aiq_statistics_input_params_v4 *statistics_input_params);
+
+/*!
+ * \brief Focus bracketing parameters.
+ */
+typedef struct
+{
+    unsigned char focus_positions;                     /*!< Number of focus positions */
+    ia_aiq_af_results af_results;                      /*!< Autofocus results */
+    ia_aiq_af_bracket_mode af_bracket_mode;            /*!< Focus bracketing mode */
+} ia_aiq_af_bracket_input_params;
+
+/*!
+ * \brief Calculates the list of lens positions for focus bracketing.
+ *
+ * \param[in]  ia_aiq                       Mandatory.\n
+ *                                          AIQ instance handle.
+ * \param[in]  af_bracket_input_params      Mandatory.\n
+ *                                          Autofocus bracketing parameters.
+ * \param[out] af_bracket_results           Mandatory.\n
+ *                                          Pointer's pointer where address of focus bracketing results are stored.
+ * \return                                  Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_af_bracket(ia_aiq *ia_aiq,
+                  const ia_aiq_af_bracket_input_params *af_bracket_input_params,
+                  ia_aiq_af_bracket_results **af_bracket_results);
+
+/*!
+ * \param[in]  ia_aiq               Mandatory.\n
+ *                                  AIQ instance handle.
+ * \param[out] out_ia_aiq_data      Mandatory.\n
+ *                                  Contains various AIQ related information, collected during run-time and subject to
+ *                                  be stored in a host file system. Host will copy this data, if ia_aiq_data->size > 0
+ *                                  and ia_aiq_data->data != NULL; AIQ is responsible to deallocate data buffer
+ *                                  during ia_aiq_deinit().
+ * \return                          Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_get_aiqd_data(ia_aiq *ia_aiq,
+                ia_binary_data *out_ia_aiq_data);
+
+
+
+/*!
+* \brief Data from external sensors
+*/
+typedef struct
+{
+    ia_aiq_sensor_data *accelerometer_events;                       /*!< The data holds information on the acceleration of the device in mg/sec (miligravity per second).
+                                                                         Acceleration = Gravity + Linear Acceleration*/
+    unsigned int num_accelerometer_events;                          /*!< Number of accelerometer events */
+    ia_aiq_sensor_data *gravity_events;                             /*!< The data holds information on the gravitation of the device in mg/sec (miligravity per second) */
+    unsigned int num_gravity_events;                                /*!< Number of gravity events */
+    ia_aiq_sensor_data *gyroscope_events;                           /*!< The data holds information on the angular velocity of the device in rad/sec */
+    unsigned int num_gyroscope_events;                              /*!< Number of gyroscope events */
+    ia_aiq_ambient_light_events_v1 *ambient_light_events;           /*!< The data holds information on the ambient light */
+    unsigned int num_ambient_light_events;                          /*!< Number of ambient light events */
+    ia_aiq_dmd_sensor_events *dmd_events;                           /*!< Device Movement Detector (DMD) virtual sensor */
+    unsigned int num_dmd_events;                                    /*!< Number of DMD sensor events */
+} ia_aiq_sensor_events_v1;
+
+/*!
+ * \brief Set event statistics.
+ * Some of the AIQ algorithms benefit from sensor information which tells about the conditions in which the device is in use
+ *
+ * \param[in] ia_aiq                        Mandatory.\n
+ *                                          AIQ instance handle.
+ * \param[in] sensor_events_input           Mandatory.\n
+ *                                          Sensor events input holds data from libsensorhub.
+ * \return                                  Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_sensor_events_set_v1(ia_aiq *ia_aiq,
+                            const ia_aiq_sensor_events_v1 *sensor_events_input);
+
+
+
+/*!
+ * \brief Get version.
+ * Get version from version header.
+ *
+ * \return                                  Version string.
+ */
+LIBEXPORT const char* ia_aiq_get_version(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA_AIQ_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_deprecated.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_deprecated.h
new file mode 100644
index 000000000000..e335dc40a22a
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_deprecated.h
@@ -0,0 +1,266 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_aiq_deprecated.h
+ * \brief Definitions and declarations of Intel 3A library.
+ */
+
+#ifndef _IA_AIQ_DEPRECATED_H_
+#define _IA_AIQ_DEPRECATED_H_
+
+#include "ia_aiq_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+  Forward declaration of struct declared in ia_aiq.h
+*/
+struct ia_aiq_pa_input_params;
+
+/*!
+* \brief Shading Adaptor results.
+*/
+typedef struct {
+    unsigned short* lsc_grid[4][4];                   /*!< Pointers to the LSC grid for all color channels. Invalid channels are set to NULL. */
+    unsigned short width;                             /*!< Width of LSC grid. */
+    unsigned short height;                            /*!< Height of LSC grid. */
+    unsigned int fraction_bits;                       /*!< Number of fraction bits for the shading table fix point representation. */
+    cmc_bayer_order color_order;                      /*!< Color channels order. */
+    bool lsc_update;                                  /*!< Indicates if LSC grid has been modified and shall be updated in ISP. false - no change, true - new LSC. */
+    light_source_t light_source[CMC_NUM_LIGHTSOURCES];/*!< Weights per light source type used in calculation of the LSC tables. */
+    float confidence;                                 /*!< Confidence in results. */
+    ia_aiq_frame_params frame_params;                 /*!< Frame parameters that describe cropped area size and its position under LSC grid. */
+} ia_aiq_sa_results;
+
+/*!
+* \brief Ambient Light EventsLIGHT_AMBIENTLIGHT
+* NOTE: This should always match to libsensorhub API
+*/
+typedef struct
+{
+    unsigned long long ts;  /*!< Time stamp in usec (microseconds) */
+    float data;             /*!< Ambient Light data ? */
+    float sensitivity;      /*!< Sensitivity of Ambient Light sensor */
+    unsigned long long fs;  /*!< Frame stamp in usec (microseconds) */
+} ia_aiq_ambient_light_events;
+
+/*!
+* \brief Data from external sensors
+*/
+typedef struct
+{
+    ia_aiq_sensor_data *accelerometer_events;                       /*!< The data holds information on the acceleration of the device in mg/sec (miligravity per second).
+                                                                    Acceleration = Gravity + Linear Acceleration*/
+    unsigned int num_accelerometer_events;                          /*!< Number of accelerometer events */
+    ia_aiq_sensor_data *gravity_events;                             /*!< The data holds information on the gravitation of the device in mg/sec (miligravity per second) */
+    unsigned int num_gravity_events;                                /*!< Number of gravity events */
+    ia_aiq_sensor_data *gyroscope_events;                           /*!< The data holds information on the angular velocity of the device in rad/sec */
+    unsigned int num_gyroscope_events;                              /*!< Number of gyroscope events */
+    ia_aiq_ambient_light_events *ambient_light_events;              /*!< The data holds information on the ambient light */
+    unsigned int num_ambient_light_events;                          /*!< Number of ambient light events */
+    ia_aiq_dmd_sensor_events *dmd_events;                           /*!< Device Movement Detector (DMD) virtual sensor */
+    unsigned int num_dmd_events;                                    /*!< Number of DMD sensor events */
+} ia_aiq_sensor_events;
+
+/*!
+* \brief Parameter adaptor calculations for the next frame.
+* Compute generic parameters (Color Correction Matrix and Black Level Correction),
+* which should be used to correct the next frame. Calculations are based on previously calculated AIQ algorithm results.
+* These generic results are converted to ISP specific parameters by ia_isp component.
+*
+* \param[in] ia_aiq                Mandatory.\n
+*                                  AIQ instance handle.
+* \param[in] pa_input_params       Mandatory.\n
+*                                  Input parameters for PA calculations.
+* \param[out] pa_results           Mandatory.\n
+*                                  Pointer's pointer where address of parameter adaptor results are stored.
+
+* \return                          Error code.
+*/
+LIBEXPORT ia_err
+ia_aiq_pa_run(ia_aiq *ia_aiq,
+     const struct ia_aiq_pa_input_params *pa_input_params,
+     ia_aiq_pa_results **pa_results);
+
+/*!
+ * \brief Set event statistics.
+ * Some of the AIQ algorithms benefit from sensor information which tells about the conditions in which the device is in use
+ *
+ * \param[in] ia_aiq                        Mandatory.\n
+ *                                          AIQ instance handle.
+ * \param[in] sensor_events_input           Mandatory.\n
+ *                                          Sensor events input holds data from libsensorhub.
+ * \return                                  Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_sensor_events_set(ia_aiq *ia_aiq, const ia_aiq_sensor_events *sensor_events_input);
+
+
+/*!
+ *  \brief Input parameter structure for AE algorithm.
+ */
+typedef struct
+{
+    unsigned int num_exposures;                                 /*!< Mandatory. The number of exposure outputs to have. Must be positive. One for LDR, two or more for HDR/exposure bracketing. */
+    ia_aiq_frame_use frame_use;                                 /*!< Mandatory. Target frame type of the AEC calculations (Preview, Still, video etc.). */
+    ia_aiq_flash_mode flash_mode;                               /*!< Mandatory. Manual flash mode. If AEC should make flash decision, set mode to ia_aiq_flash_mode_auto. */
+    ia_aiq_ae_operation_mode operation_mode;                    /*!< Mandatory. AEC operation mode. */
+    ia_aiq_ae_metering_mode metering_mode;                      /*!< Mandatory. AEC metering mode. */
+    ia_aiq_ae_priority_mode priority_mode;                      /*!< Mandatory. AEC priority mode. */
+    ia_aiq_ae_flicker_reduction flicker_reduction_mode;         /*!< Mandatory. AEC flicker reduction mode. */
+    ia_aiq_exposure_sensor_descriptor *sensor_descriptor;       /*!< Mandatory although function will not return error, if not given.
+                                                                     Sensor specific descriptor and limits of the used sensor mode for target frame use.
+                                                                     AEC will not limit and calculate sensor specific parameters, if not given */
+    unsigned int num_sensor_descriptors;                        /*!< Mandatory. The number of sensor descriptors given in the above pointer.
+                                                                     Used to specify different sensor descriptors for each exposure. */
+    ia_rectangle *exposure_window;                              /*!< Optional. Rectangle of area which AEC uses to to calculate new exposure parameters. */
+    ia_coordinate *exposure_coordinate;                         /*!< Optional. Coordinate for a point in which the exposure should be prioritized.
+                                                                     AEC increases weight of given point in final AEC results. */
+    float ev_shift;                                             /*!< Optional. Exposure Value shift [-4,4]. */
+    long *manual_exposure_time_us;                              /*!< Optional. Manual exposure time in microseconds. NULL if NA. Otherwise, array of values
+                                                                     of num_exposures length. Order of exposure times corresponds to exposure_index of ae_results,
+                                                                     e.g., manual_exposure_time_us[ae_results->exposures[0].exposure_index] = 33000; */
+    float *manual_analog_gain;                                  /*!< Optional. Manual analog gain. NULL if NA. Otherwise, array of values of num_exposures length.
+                                                                     Order of gain values corresponds to exposure_index of ae_results,
+                                                                     e.g., manual_analog_gain[ae_results->exposures[0].exposure_index] = 4.0f; */
+    short *manual_iso;                                          /*!< Optional. Manual ISO. Overrides manual_analog_gain. NULL if NA. Otherwise, array of values
+                                                                     of num_exposures length. Order of ISO values corresponds to exposure_index of ae_results,
+                                                                     e.g., manual_iso[ae_results->exposures[0].exposure_index] = 100; */
+    ia_aiq_ae_features *aec_features;                           /*!< Optional. AEC features in use when calculating new exposure parameters. */
+    ia_aiq_ae_manual_limits *manual_limits;                     /*!< Optional. Manual limits which override limits defined in AEC tunings. */
+    float manual_aperture_fn;                                   /*!< Optional. Manual f-number of aperture (e.g. 2.8), -1.0 for N/A. Used only with P iris. */
+    ia_aiq_aperture_control_dc_iris_command manual_dc_iris_command; /*!< Optional. Used only with DC iris. 0 (auto) for N/A. */
+    ia_aiq_ae_exposure_distribution_priority exposure_distribution_priority; /*!< Mandatory. AEC exposure distribution priority mode. */
+    float manual_convergence_time;                              /*!< Optional. Manual AEC convergence speed in seconds. -1.0 if NA. Overrides convergence speed from tunings. */
+} ia_aiq_ae_input_params;
+
+/*!
+ * \brief AEC calculation based on input parameters and frame statistics.
+ * AE calculates new exposure parameters to be used for the next frame based on previously given statistics and user parameters.
+ *
+ * \param[in] ia_aiq                Mandatory.\n
+ *                                  AIQ instance handle.
+ * \param[in] ae_input_params       Mandatory.\n
+ *                                  Input parameters for AEC calculations.
+ * \param[out] ae_results           Mandatory.\n
+ *                                  Pointer's pointer where address of ISP parameters are stored.
+ *                                  Results from AEC calculations. Results can be used directly as input for AIC.
+ * \return                          Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_ae_run(ia_aiq *ia_aiq,
+              const ia_aiq_ae_input_params *ae_input_params,
+              ia_aiq_ae_results **ae_results);
+
+/*!
+* \brief Get the AEC calculated histograms.
+* AE calculates histograms from the RGBS grid.
+*
+* \param[in] ia_aiq                Mandatory.\n
+*                                  AIQ instance handle.
+* \return                          Pointer to the calculated histograms.
+*/
+LIBEXPORT ia_aiq_histogram *
+ia_aiq_get_histograms(ia_aiq *ia_aiq);
+
+/*
+ *  \brief Input parameter structure for Shading Adaptor. DEPRECATED
+ */
+typedef struct
+{
+    ia_aiq_frame_use frame_use;                      /*!< Mandatory. Target frame type of the AIC calculations (Preview, Still, video etc.). */
+    ia_aiq_frame_params *sensor_frame_params;        /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
+    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
+} ia_aiq_sa_input_params;
+
+/*!
+ * \brief Shading Adaptor calculations for the next frame.
+ * Compute shading correction parameters.
+ * which should be used to correct the next frame. Calculations are based on previously calculated AIQ algorithm results.
+ * These generic results are converted to ISP specific parameters by ia_isp component.
+ * DEPRECATED
+ *
+ * \param[in] a_ia_aiq_ptr          Mandatory.\n
+ *                                  AIQ instance handle.
+ * \param[in] a_sa_input_params     Mandatory.\n
+ *                                  Input parameters for SA calculations.
+ * \param[out] a_sa_results         Mandatory.\n
+ *                                  Pointer's pointer where address of shading adaptor results are stored.
+ * \return                          Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_sa_run(ia_aiq *a_ia_aiq_ptr,
+                const ia_aiq_sa_input_params *a_sa_input_params,
+                ia_aiq_sa_results **a_sa_results);
+
+
+/*!
+* \brief Shading Adaptor calculations for the next frame.
+* Compute shading correction parameters.
+* which should be used to correct the next frame. Calculations are based on previously calculated AIQ algorithm results.
+* These generic results are converted to ISP specific parameters by ia_isp component.
+*
+* \param[in] a_ia_aiq_ptr          Mandatory.\n
+*                                  AIQ instance handle.
+* \param[in] a_sa_input_params     Mandatory.\n
+*                                  Input parameters for SA calculations.
+* \param[out] a_sa_results         Mandatory.\n
+*                                  Pointer's pointer where address of shading adaptor results are stored.
+* \return                          Error code.
+*/
+LIBEXPORT ia_err
+ia_aiq_sa_run_v1(ia_aiq *a_ia_aiq_ptr,
+                const ia_aiq_sa_input_params_v1 *a_sa_input_params,
+                ia_aiq_sa_results **a_sa_results);
+
+/*!
+*  \brief Input parameter structure for AWB algorithm.
+*/
+typedef struct
+{
+    ia_aiq_frame_use frame_use;                       /*!< Mandatory. Target frame type of the AWB calculations (Preview, Still, video etc.). */
+    ia_aiq_awb_operation_mode scene_mode;             /*!< Mandatory. AWB scene mode. */
+    ia_aiq_awb_manual_cct_range *manual_cct_range;    /*!< Optional. Manual CCT range. Used only if AWB scene mode 'ia_aiq_awb_operation_manual_cct_range' is used. */
+    ia_coordinate *manual_white_coordinate;           /*!< Optional. Manual white point coordinate relative to the full FOV of the scene. Used only if AWB scene mode 'ia_aiq_awb_operation_manual_white' is used. */
+    float manual_convergence_time;                    /*!< Optional. Manual AWB convergence speed in seconds. -1.0 if NA. Overrides convergence speed from tunings. */
+} ia_aiq_awb_input_params;
+
+/*!
+* \brief AWB calculation based on input parameters and frame statistics.
+*
+* \param[in] ia_aiq                Mandatory.\n
+*                                  AIQ instance handle.
+* \param[in] awb_input_params      Mandatory.\n
+*                                  Input parameters for AWB calculations.
+* \param[out] awb_results          Mandatory.\n
+*                                  Pointer's pointer where address of AWB results are stored.
+*                                  Results from AWB calculations. Results can be used directly as input for ia_isp.
+* \return                          Error code.
+*/
+LIBEXPORT ia_err
+ia_aiq_awb_run(ia_aiq *ia_aiq,
+const ia_aiq_awb_input_params *awb_input_params,
+ia_aiq_awb_results **awb_results);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA_AIQ_DEPRECATED_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_types.h
new file mode 100644
index 000000000000..108303f6902d
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_types.h
@@ -0,0 +1,909 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_aiq_types.h
+ * \brief Definitions of input/output structures of the Intel 3A library.
+ */
+
+#ifndef _IA_AIQ_TYPES_H_
+#define _IA_AIQ_TYPES_H_
+
+#include "ia_types.h"
+#include "ia_cmc_types.h"
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define IA_AIQ_MAX_NUM_EXPOSURES 10
+
+/*!
+ * \brief Maximum number of sensor events supported by AIQ lib.
+ */
+#define IA_AIQ_MAX_NUMBER_OF_SENSOR_EVENTS 20
+
+typedef struct ia_aiq_t ia_aiq;
+
+/*!
+ * \brief Target (frame use) for the analysis algorithms calculations.
+ */
+typedef enum
+{
+    ia_aiq_frame_use_preview,
+    ia_aiq_frame_use_still,
+    ia_aiq_frame_use_continuous,
+    ia_aiq_frame_use_video,
+} ia_aiq_frame_use;
+
+/*!
+ * \brief Camera orientations.
+ */
+typedef enum
+{
+    ia_aiq_camera_orientation_unknown,      /*!< Orientation not known. */
+    ia_aiq_camera_orientation_rotate_0,     /*!< Non-rotated landscape. */
+    ia_aiq_camera_orientation_rotate_90,    /*!< Portrait i.e. rotated 90 degrees clockwise. */
+    ia_aiq_camera_orientation_rotate_180,   /*!< Landscape (upside down) i.e. rotated 180 degrees clockwise. */
+    ia_aiq_camera_orientation_rotate_270    /*!< Portrait (upside down) i.e. rotated 270 degrees clockwise. */
+} ia_aiq_camera_orientation;
+
+/*!
+ * \brief AEC flicker reduction modes.
+ */
+typedef enum
+{
+    ia_aiq_ae_flicker_reduction_off,     /*!< Disables flicker detection and reduction. */
+    ia_aiq_ae_flicker_reduction_50hz,    /*!< Manual flicker reduction for 50Hz mains frequency. */
+    ia_aiq_ae_flicker_reduction_60hz,    /*!< Manual flicker reduction for 60Hz mains frequency. */
+    ia_aiq_ae_flicker_reduction_auto,    /*!< Detects flicker frequency and applies detected reduction. */
+    ia_aiq_ae_flicker_reduction_detect,  /*!< Detects only flicker frequency but doesn't apply reduction. */
+} ia_aiq_ae_flicker_reduction;
+
+/*!
+ * \brief AEC operation modes.
+ */
+typedef enum {
+    ia_aiq_ae_operation_mode_automatic,         /*!< Automatic mode. */
+    ia_aiq_ae_operation_mode_long_exposure,     /*!< AEC produces exposure parameters with long exposure (low light & static) scene. */
+    ia_aiq_ae_operation_mode_action,            /*!< AEC produces exposure parameters for fast moving scene. */
+    ia_aiq_ae_operation_mode_video_conference,  /*!< AEC produces exposure parameters which can be used in video conferencing scene. */
+    ia_aiq_ae_operation_mode_production_test,   /*!< AEC produces exposure parameters which are used in production test environment. */
+    ia_aiq_ae_operation_mode_ultra_low_light,   /*!< AEC produces exposure parameters which are used in ultra low light scene. */
+    ia_aiq_ae_operation_mode_fireworks,         /*!< AEC produces exposure parameters which are used in fireworks scene. */
+    ia_aiq_ae_operation_mode_hdr,               /*!< AEC produces exposure parameters which are used for HDR imaging (vHDR or exposure bracketing). */
+    ia_aiq_ae_operation_mode_custom_1,          /*!< AEC produces exposure parameters for a specialized custom scene 1. */
+    ia_aiq_ae_operation_mode_custom_2,          /*!< AEC produces exposure parameters for a specialized custom scene 2. */
+    ia_aiq_ae_operation_mode_custom_3,          /*!< AEC produces exposure parameters for a specialized custom scene 3. */
+} ia_aiq_ae_operation_mode;
+
+/*!
+ * \brief AEC metering modes.
+ */
+typedef enum {
+    ia_aiq_ae_metering_mode_evaluative,  /*!< Exposure is evaluated from the whole frame. */
+    ia_aiq_ae_metering_mode_center,      /*!< Exposure is evaluated center weighted. */
+} ia_aiq_ae_metering_mode;
+
+/*!
+ * \brief AEC priority modes.
+ */
+typedef enum {
+    ia_aiq_ae_priority_mode_normal,    /*!< All areas are equally important. */
+    ia_aiq_ae_priority_mode_highlight, /*!< Highlights must be preserved even if it means that dark parts become very dark. */
+    ia_aiq_ae_priority_mode_shadow,    /*!< Shadow areas are more important. */
+} ia_aiq_ae_priority_mode;
+
+/*!
+ * \brief Manual AEC limit parameters.
+ */
+typedef struct
+{
+    int manual_exposure_time_min;             /*!< Optional. Minimum exposure time in microseconds. -1 if NA. */
+    int manual_exposure_time_max;             /*!< Optional. Maximum exposure time in microseconds. -1 if NA. */
+    int manual_frame_time_us_min;             /*!< Optional. Manual minimum frame length in microseconds. Defines maximum frame rate -1 if NA. */
+    int manual_frame_time_us_max;             /*!< Optional. Manual maximum frame length in microseconds. Defines minimum frame rate. -1 if NA. */
+    int manual_iso_min;                       /*!< Optional. Manual minimum ISO. -1 if NA. */
+    int manual_iso_max;                       /*!< Optional. Manual maximum ISO. -1 if NA. */
+} ia_aiq_ae_manual_limits;
+
+/*!
+ * \brief AEC exposure distribution priority modes
+ *
+ * This enumeration values are used to control distribution of AEC exposure parameters. For example in some situation user may want to keep
+ * aperture at smallest value (in order to have large DOF) as long as possible in expense of motion blur (caused by long exposure time) and
+ * noise (caused by high ISO).
+ *
+ * Note. Manual priority modes as understood by SLRs are achieved by using manual exposure parameters when running AEC:
+ * Shutter priority: Set manual_exposure_time_us in ia_aiq_ae_input_params.
+ * ISO priority: Set manual_iso in ia_aiq_ae_input_params.
+ * Aperture priority: Set manual_aperture_fn in ia_aiq_ae_input_params.
+ */
+typedef enum
+{
+    ia_aiq_ae_exposure_distribution_auto,     /*!< AEC internally prioritizes between exposure time, aperture and ISO when calculating distribution. */
+    ia_aiq_ae_exposure_distribution_shutter,  /*!< AEC tries to keep the exposure time at minimum until ISO and aperture are at maximum. */
+    ia_aiq_ae_exposure_distribution_iso,      /*!< AEC tries to keep the ISO at minimum until exposure time and aperture are at maximum. */
+    ia_aiq_ae_exposure_distribution_aperture, /*!< AEC tries to keep the aperture at minimum until exposure time and ISO are at maximum. */
+} ia_aiq_ae_exposure_distribution_priority;
+
+/*!
+ * \brief AEC feature setting.
+ */
+typedef enum {
+    ia_aiq_ae_feature_setting_tuning,     /*!< Feature setting is taken from tuning data. */
+    ia_aiq_ae_feature_setting_disabled,   /*!< Feature setting is disabled. */
+    ia_aiq_ae_feature_setting_enabled,    /*!< Feature setting is enabled. */
+} ia_aiq_ae_feature_setting;
+
+
+/*!
+ * \brief Autofocus states
+ */
+typedef enum
+{
+    ia_aiq_af_status_idle,               /*!< Focus is idle */
+    ia_aiq_af_status_local_search,       /*!< Focus is in local search state */
+    ia_aiq_af_status_extended_search,    /*!< Focus is in extended search state */
+    ia_aiq_af_status_success,            /*!< Focus has succeeded */
+    ia_aiq_af_status_fail,               /*!< Focus has failed */
+    ia_aiq_af_status_depth_search        /*!< Focus in depth search mode */
+} ia_aiq_af_status;
+
+/*!
+ * \brief Action for the lens driver
+ */
+typedef enum
+{
+    ia_aiq_lens_driver_action_none,
+    ia_aiq_lens_driver_action_move_to_unit,
+    ia_aiq_lens_driver_action_move_by_units
+} ia_aiq_lens_driver_action;
+
+/*!
+ * \brief Autofocus modes
+ */
+typedef enum
+{
+    ia_aiq_af_operation_mode_auto,                 /*!< Auto mode */
+    ia_aiq_af_operation_mode_infinity,             /*!< Inifinity mode */
+    ia_aiq_af_operation_mode_hyperfocal,           /*!< Hyperfocal mode */
+    ia_aiq_af_operation_mode_manual,               /*!< Manual mode */
+    ia_aiq_af_operation_mode_production_test,      /*!< Production test mode. */
+    ia_aiq_af_operation_mode_depth_map,            /*!< Depth-map generation mode. */
+    ia_aiq_af_operation_mode_depth,                /*!< Automatic focusing based on depth measurements only. */
+    ia_aiq_af_operation_mode_contrast              /*!< Automatic focusing based on contrast measurements only. */
+} ia_aiq_af_operation_mode;
+
+/*!
+ * \brief Autofocus range
+ */
+typedef enum
+{
+    ia_aiq_af_range_normal,                        /*!< Normal range */
+    ia_aiq_af_range_macro,                         /*!< Macro range */
+    ia_aiq_af_range_extended,                      /*!< Extended/full range */
+} ia_aiq_af_range;
+
+
+/*!
+ * \brief Autofocus metering modes
+ */
+typedef enum
+{
+    ia_aiq_af_metering_mode_auto,                      /*!< Auto metering mode */
+    ia_aiq_af_metering_mode_touch                      /*!< Touch metering mode */
+} ia_aiq_af_metering_mode;
+
+/*!
+ * \brief Lens actuator status
+ */
+typedef enum
+{
+    ia_aiq_lens_status_stopped,                    /*!< Lens has not moved during the frame integration*/
+    ia_aiq_lens_status_moving                      /*!< Lens has been moving during the frame integration */
+} ia_aiq_lens_status;
+
+/*!
+ * \brief Action for the manual focus
+ */
+typedef enum
+{
+    ia_aiq_manual_focus_action_none,                /*!< No action for the manual focus is required */
+    ia_aiq_manual_focus_action_set_distance,        /*!< Set manual focus distance */
+    ia_aiq_manual_focus_action_set_lens_position,   /*!< Set manual lens position */
+    ia_aiq_manual_focus_action_set_focal_distance   /*!< Set manual focal distance in um (distance between the lens and the sensor plane, e.g. 4390) */
+} ia_aiq_manual_focus_action;
+
+/*!
+ * \brief Focus bracketing mode.
+ */
+typedef enum
+{
+    ia_aiq_af_bracket_mode_symmetric,        /*!< Symmetric focus bracketing around the reference lens position*/
+    ia_aiq_af_bracket_mode_towards_near,     /*!< One side focus bracketing. Images are taken towards NEAR end (macro) */
+    ia_aiq_af_bracket_mode_towards_far       /*!< One side focus bracketing. Images are taken towards FAR end (infinity)*/
+} ia_aiq_af_bracket_mode;
+
+/*!
+ * \brief Detected scene mode.
+ */
+typedef enum
+{
+    ia_aiq_scene_mode_none                = 0,
+    ia_aiq_scene_mode_close_up_portrait   = (1 << 0),
+    ia_aiq_scene_mode_portrait            = (1 << 1),
+    ia_aiq_scene_mode_lowlight_portrait   = (1 << 2),
+    ia_aiq_scene_mode_low_light           = (1 << 3),
+    ia_aiq_scene_mode_action              = (1 << 4),
+    ia_aiq_scene_mode_backlight           = (1 << 5),
+    ia_aiq_scene_mode_landscape           = (1 << 6),
+    ia_aiq_scene_mode_document            = (1 << 7),
+    ia_aiq_scene_mode_firework            = (1 << 8),
+    ia_aiq_scene_mode_lowlight_action     = (1 << 9),
+    ia_aiq_scene_mode_baby                = (1 << 10),
+    ia_aiq_scene_mode_barcode             = (1 << 11)
+} ia_aiq_scene_mode;
+
+/*!
+* \brief Mode for calculating AE bracketing.
+*/
+typedef enum
+{
+    ia_aiq_bracket_mode_none,             /*!< No bracketing used. */
+    ia_aiq_bracket_mode_ull  = (1 << 0),  /*!< Ultra Low Light bracketing used. */
+    ia_aiq_bracket_mode_hdr  = (1 << 1)   /*!< High Dynamic Range bracketing used. */
+} ia_aiq_bracket_mode;
+
+/*!
+ * \brief Manual focus parameters.
+ */
+typedef struct
+{
+    unsigned int manual_focus_distance;               /*!< Manual focus distance in mm*/
+    int manual_lens_position;                         /*!< Manual lens position */
+    unsigned int manual_focal_distance;               /*!< Manual focal_distance in um (e.g. 4390) */
+    ia_aiq_manual_focus_action manual_focus_action;   /*!< Manual focus action */
+} ia_aiq_manual_focus_parameters;
+
+/*!
+ *  Gain structure defining gain value and type.
+ */
+typedef struct
+{
+    cmc_gain_type_t type;       /*!< Gain type (analog, digital, etc.). */
+    float value;                /*!< Gain value as a multiplier (e.g. 1.0). */
+} ia_aiq_gain;
+
+/*!
+ * \brief Exposure parameters in terms of generic units.
+ * Structure can be used as input or output from AEC.
+ */
+typedef struct
+{
+    unsigned int exposure_time_us;          /*!< Exposure time in microseconds, -1 if N/A. */
+    float analog_gain;                      /*!< Deprecated. Analog gain as a multiplier (e.g. 1.0), -1.0 if N/A. */
+    float digital_gain;                     /*!< Deprecated. Digital gain as a multiplier (e.g. 1.0), -1.0 if N/A. */
+    float aperture_fn;                      /*!< f-number of aperture (e.g. 2.8), -1.0 for N/A. TODO: Move to ia_aiq_aperture_control structure. */
+    unsigned int total_target_exposure;     /*!< Total exposure ie. combination of ET, gains, Aperture gain and ND gain, -1 if N/A. */
+    bool nd_filter_enabled;                 /*!< true or false, false for N/A. */
+    int iso;                                /*!< ISO value corresponding to the analog gain. -1 if N/A. */
+    ia_aiq_gain gains[IA_CMC_GAINS_MAX_NUM];       /*!< Gain as multipliers (e.g. 1.0), -1.0f if N/A. */
+    unsigned int num_gains;                 /*!< The number of gains. */
+} ia_aiq_exposure_parameters;
+
+/*!
+ * \brief Exposure parameters in terms of sensor units.
+ * Structure can be used as input or output from AEC.
+ */
+typedef struct
+{
+    unsigned short fine_integration_time;         /*!< Integration time specified as a number of pixel clocks added on top of coarse_integration_time. */
+    unsigned short coarse_integration_time;       /*!< Integration time specified in multiples of pixel_periods_per_line.*/
+    unsigned short analog_gain_code_global;       /*!< Global analog gain code. */
+    unsigned short digital_gain_global;           /*!< Global digital gain code. */
+    unsigned short line_length_pixels;            /*!< The number of pixels in one row. This includes visible lines and horizontal blanking lines. */
+    unsigned short frame_length_lines;            /*!< The number of complete lines (rows) in the output frame. This includes visible lines and vertical blanking lines. */
+    unsigned short gain_codes[IA_CMC_GAINS_MAX_NUM];     /*!< Global gain codes. */
+} ia_aiq_exposure_sensor_parameters;
+
+/*!
+ * \brief Exposure related restrictions and constants in terms of sensor units.
+ * Camera driver fills and updates these parameters whenever they are changed (for example in mode change).
+ */
+typedef struct
+{
+    float pixel_clock_freq_mhz;                        /*!< Video timing pixel clock frequency. */
+    unsigned short pixel_periods_per_line;             /*!< The number of pixel clock periods in one line (row) time. This includes visible pixels and horizontal blanking time. */
+    unsigned short line_periods_per_field;             /*!< The number of complete lines (rows) in the output frame. This includes visible lines and vertical blanking lines. */
+    unsigned short line_periods_vertical_blanking;     /*!< Number of vertical blanking lines. Visible lines can be calculated using this and line_periods_per_field (above) value. */
+    unsigned short fine_integration_time_min;          /*!< The minimum allowed value for fine_integration_time in AEC outputs. */
+    unsigned short fine_integration_time_max_margin;   /*!< fine_integration_time_max = pixel_periods_per_line - fine_integration_time_max_margin. */
+    unsigned short coarse_integration_time_min;        /*!< The minimum allowed value for coarse_integration_time in AEC outputs. */
+    unsigned short coarse_integration_time_max_margin; /*!< coarse_integration_time_max = line_periods_per_field - coarse_integration_time_max_margin */
+    bool is_mono_ir_sensor;                                /*!< Judge if it is IR sensor, 1: IR sensor, 0: others*/
+} ia_aiq_exposure_sensor_descriptor;
+
+/*!
+ * AEC features.
+ * Parameters for enabling/disabling AEC features. Setting ia_aiq_ae_feature_setting_tuning takes feature definitions from CPF.
+ */
+typedef struct {
+
+    ia_aiq_ae_feature_setting motion_blur_control;          /*!< AEC modifies exposure time/analog gain ratio based on movement in the image. */
+    ia_aiq_ae_feature_setting backlight_compensation;       /*!< AEC analyzes and modifies exposure parameters based on backlight detection algorithm. */
+    ia_aiq_ae_feature_setting face_utilization;             /*!< AEC uses face coordinates in exposure calculations for next frame. */
+    ia_aiq_ae_feature_setting red_eye_reduction_flash;      /*!< AEC will propose flashes before pre-flashes to reduce red eye effect. */
+    ia_aiq_ae_feature_setting fill_in_flash;                /*!< AEC will propose flash in back light situations, where target is close enough. */
+    ia_aiq_ae_feature_setting continuous_flicker_detection; /*!< AEC runs the flicker detection algorithm continuously in the VF */
+} ia_aiq_ae_features;
+
+
+/*!
+ * \brief Flash modes from the user.
+ */
+typedef enum
+{
+    ia_aiq_flash_mode_auto,
+    ia_aiq_flash_mode_on,
+    ia_aiq_flash_mode_off,
+} ia_aiq_flash_mode;
+
+/*!
+ * \brief Flash status.
+ */
+typedef enum
+{
+    ia_aiq_flash_status_no,                /*!< No flash use. */
+    ia_aiq_flash_status_torch,             /*!< Torch flash use. */
+    ia_aiq_flash_status_pre,               /*!< Pre-flash use. */
+    ia_aiq_flash_status_main,              /*!< Main flash use. */
+    ia_aiq_flash_status_red_eye_reduction, /*!< Red Eye Reduction flash use. */
+} ia_aiq_flash_status;
+
+/*!
+ * \brief Depth data type.
+ */
+typedef enum
+{
+    ia_aiq_depth_data_type_vcm,     /*!< VCM units */
+    ia_aiq_depth_data_type_mm,      /*!< Distance to the object in mm */
+} ia_aiq_depth_data_type;
+
+/*!
+ * \brief Flash parameters.
+ * Structure can be used as input or output from AEC.
+ */
+typedef struct
+{
+    ia_aiq_flash_status status;  /*!< Flash status. */
+    char power_prc;              /*!< Flash power [0,100] value range maps 0% to 100%, 0 if off. */
+} ia_aiq_flash_parameters;
+
+
+/*!
+ * \brief Grid for weighted histograms.
+ * Pixel values of certain area can be weighted differently based of specified grid.
+ * Weight grid should be passed and used by the component which is calculating the histograms from the frame data. If no pixel accurate
+ * histograms are calculated, the weight map should be given back to AIQ library along with the statistics so that AIQ library can
+ * calculate the weighted histograms itself from the RGBS statistics.
+ * This structure is output as part of AEC results but it can be replaced with custom weight map.
+ */
+typedef struct
+{
+    unsigned short width;   /*!< Width of the weight grid. */
+    unsigned short height;  /*!< Height of the weight grid. */
+    unsigned char *weights; /*!< Multipliers (weight) of RGB values in the grid. Values range [0, 15]. */
+} ia_aiq_hist_weight_grid;
+
+/*!
+ * \brief Histogram.
+ * AIQ uses internally histogram, which are calculated from RGBS statistics:
+ * - "RAW" frame data i.e. RGBS statistics (corrected BLC + LSC).
+ * - "Color corrected" frame data (corrected BLC + LSC + CCM + WB)
+ * - "Color corrected and weighted" frame data (corrected BLC + LSC + CCM + WB + Weight Map)
+ * If histograms are calculated outside AIQ from frame pixel data (more accurate), it is expected to be "Color corrected and weighted".
+ * Size of histogram data arrays behind the pointers depends on value of num_bins variable in the structure.
+ */
+typedef struct
+{
+    unsigned int num_bins;            /*!< Number of histogram bins. */
+    unsigned int *r;                  /*!< R histogram. */
+    unsigned int *g;                  /*!< G (both Gr and Gb values) histogram. */
+    unsigned int *b;                  /*!< B histogram. */
+    unsigned int *rgb;                /*!< Combined RGB histogram (all pixel values of R, G and B together) TODO: Remove?. Used in percentile calculation but if GW AWB is done always, the same values are calculated. */
+    unsigned int *rgb_ch;             /*!< RGB channel-independent histogram where all channels are treated as grayscale intensities and combined into one histogram. */
+    unsigned int *y;                  /*!< Luminance histogram. */
+    unsigned int num_r_elements;      /*!< Number of elements in the R histogram. */
+    unsigned int num_g_elements;      /*!< Number of elements in the G histogram. */
+    unsigned int num_b_elements;      /*!< Number of elements in the B histogram. */
+    unsigned int num_rgb_elements;    /*!< Number of elements in the combined RGB histogram. */
+    unsigned int num_rgb_ch_elements; /*!< Number of elements in the RGB channel-independent histogram. */
+    unsigned int num_y_elements;      /*!< Number of elements in the luminance histogram. */
+} ia_aiq_histogram;
+
+/*!
+ * \brief Grid block
+ * As defined in the AIQ statistics specification.
+ * Ranges of all parameters are [0, 255].
+ */
+typedef struct
+{
+    unsigned char avg_gr; /*!< Average Gr value in the grid. */
+    unsigned char avg_r;  /*!< Average R value in the grid. */
+    unsigned char avg_b;  /*!< Average B value in the grid. */
+    unsigned char avg_gb; /*!< Average Gb value in the grid. */
+    unsigned char sat;    /*!< Percentage of saturated pixels in the block [0, 255]. */
+} rgbs_grid_block;
+
+/*!
+ * \brief R, G, B and Saturation grid block.
+ * As defined in the AIQ statistics specification.
+ * RGBS grid covers the full Field Of View (FOV) of the sensor.
+ */
+typedef struct
+{
+    rgbs_grid_block *blocks_ptr;  /*!< RGBS blocks. */
+    unsigned short grid_width;    /*!< Grid width. */
+    unsigned short grid_height;   /*!< Grid height. */
+    bool shading_correction;      /*!< Flag indicating if statistics was calculated using lens shading corrected data. */
+} ia_aiq_rgbs_grid;
+
+/*!
+* \brief Generic grid structure.
+*/
+typedef struct
+{
+    unsigned short *data;       /*!< Data of size width * height. */
+    unsigned short width;       /*!< Grid width. */
+    unsigned short height;      /*!< Grid height. */
+} ia_aiq_grid;
+
+/*!
+ * \brief Grid block for 32-bit HDR.
+ * As defined in the AIQ statistics specification.
+ * Ranges of all parameters are [0, 255].
+ */
+typedef struct
+{
+    unsigned int avg_gr; /*!< Average Gr value in the grid. */
+    unsigned int avg_r;  /*!< Average R value in the grid. */
+    unsigned int avg_b;  /*!< Average B value in the grid. */
+    unsigned int avg_gb; /*!< Average Gb value in the grid. */
+    unsigned int sat;    /*!< Percentage of saturated pixels in the block [0, 255]. */
+} hdr_rgbs_grid_block;
+
+/*!
+ * \brief R, G, B and Saturation grid block for 32-bit HDR statistics.
+ * As defined in the AIQ statistics specification.
+ * HDR RGBS grid covers the full Field Of View (FOV) of the sensor.
+ */
+typedef struct
+{
+    hdr_rgbs_grid_block *blocks_ptr;    /*!< HDR RGBS blocks. */
+    unsigned int grid_width;            /*!< Grid width. */
+    unsigned int grid_height;           /*!< Grid height. */
+    unsigned int grid_data_bit_depth;   /*!< Bit depth of data in channel data. */
+    bool shading_correction;            /*!< Flag indicating if statistics was calculated using lens shading corrected data. */
+} ia_aiq_hdr_rgbs_grid;
+
+/*!
+ * \brief AF statistics
+ * As defined in the AIQ statistics specification.
+ * AF grid covers the full Field Of View (FOV) of the sensor.
+ */
+typedef struct
+{
+    unsigned short grid_width;    /*!< Number of block elements horizontally in a grid. */
+    unsigned short grid_height;   /*!< Number of block elements vertically in a grid. */
+    unsigned short block_width;   /*!< Block width (bq per block element). */
+    unsigned short block_height;  /*!< Block height (bq per grid element). */
+    int *filter_response_1;       /*!< Filter response of filter 1 (e.g. low pass, used by auto focus). */
+    int *filter_response_2;       /*!< Filter response of filter 2 (e.g. high pass, used by auto focus). */
+} ia_aiq_af_grid;
+
+/*!
+ * \brief Depth grid statistics
+ */
+typedef struct
+{
+    ia_aiq_depth_data_type type;          /*!< Data type (VCM units/mm)*/
+    ia_rectangle *grid_rect;              /*!< ROI for the grid */
+    int *depth_data;                      /*!< Depth data (type of data is defined by ia_aiq_depth_data_type) */
+    unsigned char *confidence;            /*!< Confidence level */
+    unsigned short grid_width;            /*!< Number of grid elements horizontally */
+    unsigned short grid_height;           /*!< Number of grid elements vertically */
+} ia_aiq_depth_grid;
+
+/*!
+ * \brief AWB scene modes
+ * Used in AWB as input to restrict White Point between certain CCT range.
+ * Note that not in all cases only CCT range is used to restrict White Point but more intelligent estimation may be used.
+ */
+typedef enum
+{
+    ia_aiq_awb_operation_mode_auto,
+    ia_aiq_awb_operation_mode_daylight,           /*!< Restrict CCT range to [5000, 7000]. */
+    ia_aiq_awb_operation_mode_partly_overcast,    /*!< Restrict CCT range to [5500, 9000]. */
+    ia_aiq_awb_operation_mode_fully_overcast,     /*!< Restrict CCT range to [6000, 7000]. */
+    ia_aiq_awb_operation_mode_fluorescent,        /*!< Restrict CCT range to [2700, 5500]. */
+    ia_aiq_awb_operation_mode_incandescent,       /*!< Restrict CCT range to [2700, 3100]. */
+    ia_aiq_awb_operation_mode_sunset,
+    ia_aiq_awb_operation_mode_video_conference,
+    ia_aiq_awb_operation_mode_manual_cct_range,   /*!< Use given CCT range (see ia_aiq_awb_manual_cct_range). */
+    ia_aiq_awb_operation_mode_manual_white,       /*!< Use coordinate (see ia_coordinate) relative to full FOV which should be used as white point. */
+    ia_aiq_awb_operation_mode_production_test,
+    ia_aiq_awb_operation_mode_candlelight,
+    ia_aiq_awb_operation_mode_flash,
+    ia_aiq_awb_operation_mode_snow,
+    ia_aiq_awb_operation_mode_beach,
+} ia_aiq_awb_operation_mode;
+
+/*!
+ * \brief Manual CCT range
+ */
+typedef struct
+{
+    unsigned int min_cct;
+    unsigned int max_cct;
+} ia_aiq_awb_manual_cct_range;
+
+/*!
+ * \brief Frame parameters which describe cropping and scaling (need to be filled by AIQ client for every frame)
+ */
+typedef struct
+{
+    unsigned short horizontal_crop_offset;            /*!< Read out offset horizontal. */
+    unsigned short vertical_crop_offset;              /*!< Read out offset vertical. */
+    unsigned short cropped_image_width;               /*!< Width of cropped area in native resolution. */
+    unsigned short cropped_image_height;              /*!< Height of cropped area in native resolution. */
+    unsigned char horizontal_scaling_numerator;       /*!< Horizontal scaling factor applied to the cropped image. Horizontal scaling factor = horizontal_scaling_numerator / horizontal_scaling_denominator. */
+    unsigned char horizontal_scaling_denominator;     /*!< Horizontal scaling factor applied to the cropped image. Horizontal scaling factor = horizontal_scaling_numerator / horizontal_scaling_denominator. */
+    unsigned char vertical_scaling_numerator;         /*!< Vertical scaling factor applied to the cropped image. Vertical scaling factor = vertical_scaling_numerator / vertical_scaling_denominator. */
+    unsigned char vertical_scaling_denominator;       /*!< Vertical scaling factor applied to the cropped image. Vertical scaling factor = vertical_scaling_numerator / vertical_scaling_denominator. */
+} ia_aiq_frame_params;
+
+/*!
+ * \brief DC iris control.
+ * When using DC iris, there are no distinct aperture steps. Use these commands to increase or decrease aperture size.
+ */
+typedef enum
+{
+    ia_aiq_aperture_control_dc_iris_auto,  /*!< State of the iris is selected automatically. */
+    ia_aiq_aperture_control_dc_iris_hold,  /*!< Iris should hold current aperture. */
+    ia_aiq_aperture_control_dc_iris_open,  /*!< Iris should open. */
+    ia_aiq_aperture_control_dc_iris_close, /*!< Iris should close. */
+} ia_aiq_aperture_control_dc_iris_command;
+
+/*!
+ * \brief Aperture control parameters.
+ * Aperture controls for both P (where iris has discrete amount of apertures) and DC (where iris has indefinite amount of possible apertures) iris.
+ */
+typedef struct
+{
+    float aperture_fn;                                       /*!< f-number of aperture (e.g. 2.8), -1.0 for N/A. Used only with P iris. */
+    ia_aiq_aperture_control_dc_iris_command dc_iris_command; /*!< Used only with DC iris. */
+    int code;                                                /*!< Iris module HW register value. */
+} ia_aiq_aperture_control;
+
+/*!
+ * \brief Exposure data for all exposures.
+ */
+typedef struct
+{
+    unsigned int exposure_index;                        /*!< Exposure index which identifies the exposure. */
+    ia_aiq_exposure_parameters* exposure;               /*!< Exposure parameters to be used in the next frame in generic format. */
+    ia_aiq_exposure_sensor_parameters* sensor_exposure; /*!< Exposure parameters to be used in the next frame in sensor specific format. */
+    float distance_from_convergence;                    /*!< Distance of convergence as an EV shift value. Negative is underexposure, positive is overexposure */
+    bool converged;                                     /*!< Indicates that AE has converged. */
+    unsigned int num_exposure_plan;                     /*!< Size of the exposure plan. Indicates how many exposure and sensor_exposure parameter structures are in the arrays above. */
+    unsigned int *exposure_plan_ids;                    /*!< Exposure plan IDs. Used to identify and sync what parameters were changed in the exposure plan. */
+} ia_aiq_ae_exposure_result;
+
+/*!
+ * \brief AEC results.
+ */
+typedef struct
+{
+    ia_aiq_ae_exposure_result* exposures;               /*!< Results for each exposure to be used in the next frame. */
+    unsigned int num_exposures;                         /*!< The number of calculated exposures. */
+    ia_aiq_hist_weight_grid* weight_grid;               /*!< Weight map to be used in the next frame histogram calculation. */
+    ia_aiq_flash_parameters* flashes;                   /*!< Array of flash parameters for each flashes to be used in the next frame. */
+    unsigned int num_flashes;                           /*!< Number of independent flashes. */
+    float lux_level_estimate;                           /*!< Lux level estimate. */
+    ia_aiq_bracket_mode multiframe;                     /*!< AEC may propose to use multiframe for optimal results. */
+    ia_aiq_ae_flicker_reduction flicker_reduction_mode; /*!< Flicker reduction mode proposed by the AEC algorithm */
+    ia_aiq_aperture_control *aperture_control;          /*!< Aperture control parameters. */
+} ia_aiq_ae_results;
+
+/*!
+ * \brief Autofocus algorithm results
+ */
+typedef struct
+{
+    ia_aiq_af_status status;                           /*!< Focus status */
+    unsigned short current_focus_distance;             /*!< Current focusing distance [mm] between the lens and object plane */
+    int next_lens_position;                            /*!< Next lens position */
+    int next_focal_distance;                           /*!< Focal distance [um] between the sensor and lens corresponding to the next lens position */
+    ia_aiq_lens_driver_action lens_driver_action;      /*!< Lens driver action*/
+    bool use_af_assist;                                /*!< True if the af assist light is to be used at half press, false otherwise */
+    bool final_lens_position_reached;                  /*!< Lens has reached the final lens position */
+} ia_aiq_af_results;
+
+/*!
+ * \brief Results from AWB.
+ */
+typedef struct
+{
+    float accurate_r_per_g;           /*!< Accurate White Point for the image. */
+    float accurate_b_per_g;           /*!< Accurate White Point for the image. */
+    float final_r_per_g;              /*!< Final White Point, including color appearance modeling. */
+    float final_b_per_g;              /*!< Final White Point, including color appearance modeling.*/
+    unsigned int cct_estimate;        /*!< Correlated Color Temperature estimate calculated from the accurate WP. */
+    float distance_from_convergence;  /*!< Range [0.0f, 1.0f]. Distance from convergence. Value 0.0f means converged. */
+} ia_aiq_awb_results;
+
+/*!
+ * \brief GBCE level.
+ * Allows to override GBCE level defined in the tuning.
+ */
+typedef enum
+{
+    ia_aiq_gbce_level_use_tuning = -1, /*!< Use GBCE level defined in the tuning. */
+    ia_aiq_gbce_level_bypass = 0,      /*!< Use the default gamma table without stretching. This level should be used when manual AE parameters are set. */
+    ia_aiq_gbce_level_gamma_stretch,   /*!< Apply histogram stretching. */
+    ia_aiq_gbce_level_gamma_stretch_and_power_adaptation, /*!< Histogram stretching & gamma power adaptation. */
+} ia_aiq_gbce_level;
+
+/*!
+* \brief Tone Map level.
+* Allows to override Tone Map level defined in the tuning.
+*/
+
+typedef enum
+{
+    ia_aiq_tone_map_level_use_tuning = -1,  /*!< Use Tone Map level defined in the tuning. */
+    ia_aiq_tone_map_level_bypass = 0,       /*!< Bypass TM LUT (i.e. legacy GBCE behavior) */
+    ia_aiq_tone_map_level_default,          /*!< Separate tone mapping and Gamma */
+    ia_aiq_tone_map_level_dynamic,          /*!< Dynamically calculate the TM LUT */
+} ia_aiq_tone_map_level;
+
+/*!
+ * \brief Results from GBCE.
+ */
+typedef struct {
+    float* r_gamma_lut;             /*!< Gamma LUT for R channel. Range [0.0, 1.0]. */
+    float* b_gamma_lut;             /*!< Gamma LUT for B channel. Range [0.0, 1.0]. */
+    float* g_gamma_lut;             /*!< Gamma LUT for G channel. Range [0.0, 1.0]. */
+    unsigned int gamma_lut_size;    /*!< Number of elements in each gamma LUT. */
+    float* tone_map_lut;            /*!< Tone Mapping Gain LUT. Range [0.0 FLT_MAX] */
+    unsigned int tone_map_lut_size; /*!< Number of elements in tone mapping LUT. */
+} ia_aiq_gbce_results;
+
+/*!
+ * \brief Values used in various operations for each color channels.
+ * Value range depends on algorithm output.
+ */
+typedef struct
+{
+    float gr;               /*!< A value affecting Gr color channel. */
+    float r;                /*!< A value affecting R color channel. */
+    float b;                /*!< A value affecting B color channel. */
+    float gb;               /*!< A value affecting Gb color channel. */
+} ia_aiq_color_channels;
+
+/*!
+ * \brief LUTs for each color channel.
+ */
+typedef struct
+{
+    float *gr;              /*!< LUT for Gr color channel. Range [0.0, 1.0].*/
+    float *r;               /*!< LUT for R color channel. Range [0.0, 1.0]. */
+    float *b;               /*!< LUT for B color channel. Range [0.0, 1.0]. */
+    float *gb;              /*!< LUT for Gb color channel. Range [0.0, 1.0]. */
+    unsigned int size;      /*!< Number of elements in each LUT. */
+} ia_aiq_color_channels_lut;
+
+/*!
+ * \brief Shading Adaptor light source weight and its type.
+ */
+typedef struct {
+    float weight;
+    cmc_light_source source_type;
+} light_source_t;
+
+/*!
+* \brief Advanced Color Correction Matrix Structure Returned by Parameter Adaptor.
+*/
+typedef struct {
+    unsigned int sector_count;                                  /*!< Number of color matrix sectors. */
+    unsigned int *hue_of_sectors;                               /*!< Starting hues of sectors. */
+    float (*advanced_color_conversion_matrices)[3][3];          /*!< Advanced CC matrices. Array of color matrices. Each color matrix optimized using a certain sector. Array size is sector_count. */
+    cmc_color_space target_color_space;                         /*!< Target color space of the ACMs, also the color space for which ACMs have been tuned. See enum cmc_color_space. */
+} ia_aiq_advanced_ccm_t;
+
+
+
+/*!
+* \brief IR Weight Grid.
+*/
+typedef struct {
+    unsigned int width;                 /*!< IR Weight grid width */
+    unsigned int height;                /*!< IR Weight grid height */
+    unsigned short *ir_weight_grid_R;          /*!< Interpolated IR Weight for R channel */
+    unsigned short *ir_weight_grid_G;          /*!< Interpolated IR Weight for G channel */
+    unsigned short *ir_weight_grid_B;          /*!< Interpolated IR Weight for B channel */
+}
+ia_aiq_ir_weight_t;
+
+/*!
+ * \brief RGB IR model.
+ */
+typedef struct {
+    unsigned int width;    /*!< Width of model */
+    unsigned int height;   /*!< Height of model */
+    unsigned short sigma;  /*!< Sigma of model */
+    unsigned short offset; /*!< offset of model */
+    unsigned short max;    /*!< max value for model */
+    unsigned short base;   /*!< base value for model */
+} ia_aiq_rgbir_model_t;
+
+/*!
+ * \brief RGB IR.
+ */
+typedef struct {
+    int8_t grid_indices[16];      /*!< Grid indices */
+    unsigned int n_models;        /*!< Number of models */
+    ia_aiq_rgbir_model_t *models; /*!< Array of models */
+} ia_aiq_rgbir_t;
+
+/*!
+ *  \brief Input parameter structure for Shading Adaptor.
+ */
+typedef struct
+{
+    ia_aiq_frame_params *sensor_frame_params;        /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
+    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
+    float manual_convergence_time;                   /*!< Mandatory, in seconds. Allows override of tunings for LSC transition interval
+                                                     -1.0 if NA (uses tunings).
+                                                     0.0  forces update of LSC table, this is similar behavior as in previous API when using frame_use still
+                                                     > 0.0  Overrides convergence speed from tunings */
+} ia_aiq_sa_input_params_v1;
+
+/*!
+ * \brief Shading Adaptor results.
+ */
+typedef struct {
+    unsigned short* lsc_grid[4][4];                   /*!< Pointers to the LSC grid for all color channels. Invalid channels are set to NULL. */
+    unsigned short width;                             /*!< Width of LSC grid. */
+    unsigned short height;                            /*!< Height of LSC grid. */
+    unsigned int fraction_bits;                       /*!< Number of fraction bits for the shading table fix point representation. */
+    cmc_bayer_order color_order;                      /*!< Color channels order. */
+    bool lsc_update;                                  /*!< Indicates if LSC grid has been modified and shall be updated in ISP. false - no change, true - new LSC. */
+    light_source_t light_source[CMC_NUM_LIGHTSOURCES];/*!< Weights per light source type used in calculation of the LSC tables. */
+    float confidence;                                 /*!< Confidence in results. */
+    ia_aiq_frame_params frame_params;                 /*!< Frame parameters that describe cropped area size and its position under LSC grid. */
+    float luma_strength;                              /*!< Luma correction strength in image corners, which is percent (normalized to be between 0.0f and 1.0f) of
+                                                      brightness attenutation in corners against image center. Its parametric representation is a semi-sphere with
+                                                      max 1.0f in the centre and luma_strength (e.g. 0.80f for 80%) in corner of size width x height. luma_strength
+                                                      1.0f (see 100%) is a plane of 1.0f of size width x height. -1.0f states for invalid parameter. */
+} ia_aiq_sa_results_v1;
+
+/*!
+* \brief Results from Parameter Adaptor(Deprecated).
+*/
+typedef struct {
+    float color_conversion_matrix[3][3];              /*!< CC matrix. */
+    ia_aiq_color_channels black_level;                /*!< Black level coefficients of each Bayer channel (absolute level). */
+    ia_aiq_color_channels color_gains;                /*!< RGB gains for each color channels including given (in ia_aiq_pa_input_params) color gains and gains calculated from AWB results. */
+    ia_aiq_color_channels_lut linearization;          /*!< LUTs for linearization of each color channel after black level correction. */
+    float saturation_factor;                          /*!< Saturation factor to increase/decrease saturation.*/
+    float brightness_level;                           /*!< Range [0.0, 1.0]. Indicates level of brightness in the image. */
+    ia_aiq_advanced_ccm_t *preferred_acm;             /*!< Advanced CC matrix. */
+    ia_aiq_ir_weight_t *ir_weight;                    /*!< IR Weight. */
+    ia_aiq_rgbir_t *rgbir;                            /*!< RGB IR model. */
+} ia_aiq_pa_results;
+
+/*!
+* \brief Results from Parameter Adaptor.
+*/
+typedef struct {
+    float color_conversion_matrix[3][3];              /*!< CC matrix. */
+    float black_level_4x4[4][4];                    /*!< Black level coefficients of each Bayer channel (absolute level). */
+    ia_aiq_color_channels color_gains;                /*!< RGB gains for each color channels including given (in ia_aiq_pa_input_params) color gains and gains calculated from AWB results. */
+    ia_aiq_color_channels_lut linearization;          /*!< LUTs for linearization of each color channel after black level correction. */
+    float saturation_factor;                          /*!< Saturation factor to increase/decrease saturation.*/
+    float brightness_level;                           /*!< Range [0.0, 1.0]. Indicates level of brightness in the image. */
+    ia_aiq_advanced_ccm_t *preferred_acm;             /*!< Advanced CC matrix. */
+    ia_aiq_ir_weight_t *ir_weight;                    /*!< IR Weight. */
+    ia_aiq_rgbir_t *rgbir;                            /*!< RGB IR model. */
+} ia_aiq_pa_results_v1;
+
+/*!
+ * \brief Autofocus bracketing results
+ */
+typedef struct
+{
+    unsigned short *distances_bracketing;             /*!< Ordered array of distances in mm for focus bracketing. Distances are ordered from Infinity to close up.*/
+    int *lens_positions_bracketing;                   /*!< Ordered array of lens positions for focus bracketing. Order is from FAR and to NEAR end. */
+} ia_aiq_af_bracket_results;
+
+/*!
+ * \brief Accelerometer Events
+ *        Gravity Events
+ *        Gyroscope Events
+ */
+typedef struct
+{
+    unsigned long long ts;  /*!< Time stamp in usec (microseconds) */
+    float x;                /*!< Sensor Data in X direction depending on the type of the sensor */
+    float y;                /*!< Sensor Data in Y direction depending on the type of the sensor */
+    float z;                /*!< Sensor Data in Z direction depending on the type of the sensor */
+    float sensitivity;      /*!< Sensitivity of the sensor */
+    unsigned long long fs;  /*!< Frame stamp in usec (microseconds) */
+} ia_aiq_sensor_data;
+
+
+/*!
+ * \brief Ambient Light Sensor (ALS) events.
+  */
+typedef struct
+{
+    unsigned long long ts;  /*!< Time stamp in usec (microseconds) */
+    unsigned long long fs;  /*!< Frame stamp in usec (microseconds) */
+    float lux;              /*!< Illuminance (lux), -1 for N/A. */
+    float cct;              /*!< Correlated color temperature (Kelvin), -1 for N/A. */
+    cmc_cie_coords cie_coor; /*!< CIE xy chromaticity, -1 for N/A. */
+    float r;                /*!< Red mean, -1 for N/A. */
+    float g;                /*!< Green mean, -1 for N/A. */
+    float b;                /*!< Blue mean, -1 for N/A. */
+    float c;                /*!< Clear (white) mean, -1 for N/A. */
+    float ir;               /*!< Infra-red mean, -1 for N/A. */
+} ia_aiq_ambient_light_events_v1;
+
+/*!
+ * \brief Device Movement Detector (DMD) motion level
+ *        Coincides with the definition at ISH.
+ */
+typedef enum
+{
+    ia_aiq_dmd_motion_level_sleep = 0,          /*!< The device did not move for the last 10 seconds */
+    ia_aiq_dmd_motion_level_motionless,
+    ia_aiq_dmd_motion_level_slightly_drifting,
+    ia_aiq_dmd_motion_level_slowly_moving,
+    ia_aiq_dmd_motion_level_moving,
+    ia_aiq_dmd_motion_level_rapidly_moving,
+} ia_aiq_dmd_sensor_motion_level;
+
+/*!
+ * \brief Device Movement Detector (DMD) Sensor Events
+ *        This is a virtual sensor designed in ISH to detect if device is in motion.
+ */
+typedef struct
+{
+    unsigned long long ts;  /*!< Time stamp in usec (microseconds) */
+    ia_aiq_dmd_sensor_motion_level motion;
+    unsigned long long fs;  /*!< Frame stamp in usec (microseconds) */
+} ia_aiq_dmd_sensor_events;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA_AIQ_TYPES_H_ */
+
+
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_encode.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_encode.h
new file mode 100644
index 000000000000..fc719c162eb1
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_encode.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_aiqb_encode.h
+ * \brief Helper functtions to encode records into AIQB.
+ */
+
+
+#ifndef IA_AIQB_ENCODE_H_
+#define IA_AIQB_ENCODE_H_
+
+#include "ia_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MAX_NUM_MAPS 20
+typedef struct
+{
+    ia_aiqd_parser_offset_map offset_maps[MAX_NUM_MAPS];
+    ia_aiqd_parser_maps_info maps_info;
+} pointer_map;
+
+/*!
+ * \brief Copies data from source data pointer to target data pointer and updates pointer address
+ * param[in]     data_end     End address of output buffer. Used to make sure that data is not copied beyond allocated memory.
+ * param[in]     data_input   Input buffer to copy.
+ * param[in]     data_size    Size of data to copy.
+ * param[in/out] data_current Target data pointer (where to copy data).
+ * param[in/out] data_target  Target address pointer (where to update address of copied data).
+ */
+ia_err memory_assign_and_copy(
+    const char *data_end,
+    const void *data_input,
+    size_t data_size,
+    char **data_current,
+    char **data_target);
+
+ia_err update_pointer_map(
+    const char *data_start,
+    const char *pointer_to_pointer,
+    const char *pointer_to_data,
+    pointer_map *maps);
+
+ia_err append_pointer_map(
+    char *data_start,
+    char *data_end,
+    pointer_map *maps,
+    char **data_current);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IA_AIQB_ENCODE_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_parser.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_parser.h
new file mode 100644
index 000000000000..3e9561aa6fe8
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_parser.h
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_aiqb_parser.h
+ * \brief Generic parser of new AIQB file format.
+ *
+ * New AIQB format assumes that records can be typecasted directly into structures. This means that when using some variable data types in
+ * 32 or 64 bit environments, they occupy different amount of space. Thus AIQB needs to be contructed differently for those environments.
+ * See https://en.wikipedia.org/wiki/Data_structure_alignment#Typical_alignment_of_C_structs_on_x86 for reference.
+ *
+ * Also, structure (and enum) packing must be disabled when constructing AIQB file (or structure packing needs taken into account when creating AIQB).
+ * See https://en.wikipedia.org/wiki/Data_structure_alignment#Default_packing_and_.23pragma_pack for reference.
+ *
+ */
+
+
+#ifndef IA_AIQB_PARSER_H_
+#define IA_AIQB_PARSER_H_
+
+#include "ia_types.h"
+#include "ia_mkn_decoder.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _DEBUG
+#ifdef __ANDROID__
+#include <utils/Log.h>
+#define IA_AIQB_LOG(...)      ((void)ALOG(LOG_DEBUG, "IA_AIQB: ", __VA_ARGS__))
+#define IA_AIQB_LOG_ERR(...)  ((void)ALOG(LOG_ERROR, "IA_AIQB: ", __VA_ARGS__))
+#else
+#include <stdio.h>
+#define IA_AIQB_LOG(fmt, ...)     fprintf(stdout, "IA_AIQB: " fmt "\n", ## __VA_ARGS__)
+#define IA_AIQB_LOG_ERR(fmt, ...) fprintf(stderr, "IA_AIQB: " fmt "\n", ## __VA_ARGS__)
+#endif
+#else
+#define IA_AIQB_LOG(...) ((void)0)
+#define IA_AIQB_LOG_ERR(...) ((void)0)
+#endif
+
+/*!
+ * \brief Offset information about pointers and data tables inside AIQB record.
+ *
+ * Using the offset information parser inserts correct memory address into structures' pointer values.
+ */
+typedef struct
+{
+    uint32_t offset_to_pointer;  /*!< Offset from the beginning of the record to a pointer in the typecasted structure. */
+    uint32_t offset_to_data;     /*!< Offset from the beginning of the record to data where offset_to_pointer needs to reference. */
+} ia_aiqd_parser_offset_map;
+
+/*!
+ * \brief Tells how many offset maps there are.
+ *
+ * AIQB file contains as many maps as there are pointers in the tuning structure.
+ */
+typedef struct
+{
+    uint32_t checksum;         /*!< Checksum of record data after ia_mkn_header and before ia_aiqd_parserr_offset_map and ia_aiqd_parserr_maps_info calculated with function ia_aiqb_parse_checksum(). */
+    uint32_t num_maps;         /*!< Number of ia_aiqd_parserr_offset_map (maps) structures after the record data. */
+} ia_aiqd_parser_maps_info;
+
+/*!
+ * \brief Calculates checksum of given memory using unsigned 32 bit values.
+ *
+ * Function will round down number of elements to sum, if size given is not multiple of 4 bytes. However this should never happen because sizeof(struct) is always multiple of 4 bytes.
+ *
+ * \param[in] data  Buffer from where checksum is calculated.
+ * \param[in] count Size of buffer to sum in bytes.
+ * \return          Calculated checksum.
+ */
+LIBEXPORT unsigned int
+ia_aiqb_parse_calculate_checksum(void *data, size_t size);
+
+
+/*!
+* \brief Replace pointers in the AIQB data from map.
+*
+* Modifies contents of the given AIQB record data buffer by updating pointer values in the record to valid memory address.
+* Map in the end of the record tells offset to pointers which need to be updated. Record has following structure:
+*
+* ia_mkn_record_header record_header;
+* char record_data[record_header.size - (maps_info.num_maps * sizeof(ia_aiqd_parser_offset_map) + sizeof(ia_aiqd_parser_maps_info))];
+* ia_aiqd_parser_offset_map maps[maps_info.num_maps];
+* ia_aiqd_parser_maps_info maps_info;
+*
+* \param[in,out] record AIQB record buffer including all data listed above (header + data). 
+* \return               Error code.
+*/
+LIBEXPORT ia_err
+ia_aiqb_parse_record(ia_mkn_record_header *record);
+
+/*!
+ * \brief Replace pointers in the AIQB data from map.
+ *
+ * Modifies contents of the given AIQB data buffer by updating pointer values in all records to valid memory address.
+ *
+ * \param[in,out] aiqb_binary AIQB data buffer
+ * \return                    Error code.
+ */
+LIBEXPORT ia_err
+ia_aiqb_parse(ia_binary_data *aiqb_binary);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IA_AIQB_PARSER_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_alloc.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_alloc.h
new file mode 100644
index 000000000000..87dfd4c90f40
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_alloc.h
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+ /*!
+  * \file ia_alloc.h
+  * \brief Linear scope stack allocator interface.
+  */
+
+#ifndef IA_ALLOC_H_
+#define IA_ALLOC_H_
+
+#include "ia_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void(*finalizer_function)(void *ptr);
+typedef struct ia_alloc_t ia_alloc;
+
+/*!
+ *  Initializes the linear allocator.
+ *
+ *  \param [in] size Size of the allocator memory space.
+ *                   If 0, no allocation is made at this point and memory must be reserved with ia_alloc_reserve().
+ *
+ *  \return A pointer to the allocator object, or NULL if errors.
+ */
+LIBEXPORT ia_alloc* ia_alloc_init(size_t size);
+
+/*!
+ *  Initializes the linear allocator using pre-allocated memory.
+ *
+ *  \param [in] buffer Pre-allocated memory buffer.
+ *  \param [in] size   The size of the given buffer.
+ *
+ *  \return A pointer to the allocator object, or NULL if errors.
+ */
+LIBEXPORT ia_alloc* ia_alloc_init_from_memory(void* buffer, size_t size);
+
+/*!
+ *  Reserves memory for the allocator. Can also be used to increase the size of the allocation.
+ *
+ *  \param [in] alloc The allocator.
+ *  \param [in] size  The size of the internal memory space to allocate.
+ *
+ *  \note Stack position is automatically rewound to the start of the allocator buffer.
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_nomemory, if out of memory.
+ *          ia_err_argument, if invalid allocator or the allocator used pre-allocated memory.
+ */
+LIBEXPORT ia_err ia_alloc_reserve(ia_alloc* alloc, size_t size);
+
+/*!
+ *  Allocates a block of memory from the allocator memory space.
+ *
+ *  \param [in] alloc The allocator.
+ *  \param [in] size  The size of the requested allocation.
+ *
+ *  \return A pointer to the allocation, or NULL, if ran out of allocator memory space.
+ */
+LIBEXPORT void* ia_alloc_allocate(ia_alloc* alloc, size_t size);
+
+/*!
+ *  Allocates a block of memory from the allocator with a custom specified finalizer for destruction.
+ *
+ *  \param [in] alloc The allocator.
+ *  \param [in] size  The size of the requested allocation.
+ *  \param [in] func  A pointer to the finalizer function.
+ *
+ *  \return A pointer to the allocation, or NULL, if ran out of allocator memory space.
+ */
+LIBEXPORT void* ia_alloc_allocate_with_finalizer(ia_alloc* alloc, size_t size, finalizer_function func);
+
+/*!
+ *  Enters a new scope.
+ *
+ *  \param [in] alloc The allocator.
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_internal, if maximum scope depth was reached.
+ */
+LIBEXPORT ia_err ia_alloc_enter_scope(ia_alloc* alloc);
+
+/*!
+*  Leaves a scope.
+*
+*  \param [in] alloc The allocator.
+*
+*  \return ia_err_none, if no errors.
+*          ia_err_internal, if there is a mismatch between enter and leave calls.
+*/
+LIBEXPORT ia_err ia_alloc_leave_scope(ia_alloc* alloc);
+
+/*!
+ *  Deinitializes the linear allocator.
+ *
+ *  \param [in] alloc The allocator.
+ */
+LIBEXPORT void ia_alloc_deinit(ia_alloc* alloc);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* IA_ALLOC_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp.h
new file mode 100644
index 000000000000..bf8865129ab5
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp.h
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*!
+ * \mainpage IA BCOMP API documentation
+ *
+ * Browse Files and Classes tabs for details.
+ *
+ */
+/*!
+ * \file ia_bcomp.h
+ * \brief Definitions and declarations of IA_BCOMP library.
+ */
+#ifndef _IA_BCOMP_H_
+#define _IA_BCOMP_H_
+
+#include "ia_aiq_types.h"
+#include "ia_types.h"
+#include "ia_bcomp_types.h"
+#include "ia_cmc_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*!
+ * \brief Initialize ia_bcomp handle.
+ *        If yes the object is allocated and initialized.
+ *        If not, null is returned
+ * \param [in]      ia_cmc              Mandatory, Pointer to CMC structure
+ * \param [in]      dol_mode            Mandatory, Operating mode for DOL sensor
+ * \param [in]      cg_ratio            Optional, conversion gain ratio for DCG sensor, if sensor is not DCG sensor, this should be set to 1.
+ * return                               IA_BCOMP handle. Use the returned handle as input parameter for the consequent IA_BCOMP calls.
+ *                                      Returns NULL is ia_bcomp initialization fails.
+ */
+LIBEXPORT ia_bcomp*
+ia_bcomp_init(const ia_cmc_t *ia_cmc, ia_bcomp_dol_mode_t dol_mode,
+              float cg_ratio);
+
+/*!
+ * \brief Deinitialize IA_BCOMP.
+ *        All memory allocated by BCOMP algoritmhs are freed. BCOMP handle can no longer be used.
+ *
+ * \param[in] ia_bcomp                  Mandatory. BCOMP instance handle.
+ *
+ */
+LIBEXPORT void
+ia_bcomp_deinit(ia_bcomp *ia_bcomp);
+
+/*!
+* \brief IA_BCOMP parameters to calculate compression info.
+*/
+typedef struct ia_bcomp_input_params
+{
+    ia_aiq_ae_results *ae_results;  /*!< Mandatory. Exposure results which are to be used to calculate next ISP parameters.
+                                         Currently only exposure times, analog and digital gains are used. For convenience reasons bcomp takes
+                                         ae results and not only needed parameters. */
+} ia_bcomp_input_params;
+
+/*!
+* \brief Run a bit-compression and generates necessary outputs.
+*
+*  \param [in]      ia_bcomp            Mandatory, initialized ia_bcomp handle.\n
+*  \param [in]      bcomp_input_params  Mandatory. Input parameters to run bit-compression.\n
+*  \param[out]      bcomp_results       Mandatory. Pointer's pointer where address of bcomp results are stored.
+*  \return                              Error code.
+*
+*/
+LIBEXPORT ia_err
+ia_bcomp_run(ia_bcomp *ia_bcomp,
+             const ia_bcomp_input_params *bcomp_input_params,
+             ia_bcomp_results **bcomp_results);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _IA_BCOMP_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp_types.h
new file mode 100644
index 000000000000..5b8d066490bc
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp_types.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_bcomp_types.h
+*/
+
+#ifndef IA_BCOMP_TYPES_H_
+#define IA_BCOMP_TYPES_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MAX_AMOUNT_OF_KNEE_POINTS   16
+
+typedef struct ia_bcomp_t ia_bcomp;
+
+/*!
+* \brief compression curves.
+*/
+typedef struct ia_pwl_compression_curve
+{
+    uint32_t x[MAX_AMOUNT_OF_KNEE_POINTS];
+    uint32_t y[MAX_AMOUNT_OF_KNEE_POINTS];
+    uint32_t num_of_knee_points;
+} ia_pwl_compression_curve;
+
+/*!
+ * \brief Current operating modes supported for various DOL sensors.
+ */
+typedef enum
+{
+    ia_bcomp_non_dol = 0,                /*!< Non-DOL sensor >*/
+    ia_bcomp_dol_two_or_three_frame = 1, /*!< UC1 - DOL Sensor outputs two or three exposure readout mode, long, medium , short / long, short >*/
+    ia_bcomp_dol_dcg = 2,                    /*!< UC2 - DOL DCG (Dual Conversion gain) sensor - outputs HCG (long) and LCG (medium) with a constant cg ratio >*/
+    ia_bcomp_dol_combined_very_short = 3,    /*!< UC3 - DOL DCG sensor - outputs combined image (long and medium exposure stitched in sensor) and very short exposure >*/
+    ia_bcomp_dol_dcg_very_short = 4,         /*!< UC4 - DOL DCG sensor - outputs HCG (long), LCG(medium) with constant cg ratio and very short exposure frames >*/
+} ia_bcomp_dol_mode_t;
+
+/*!
+ * \brief calculated compression curves.
+ */
+typedef struct ia_bcomp_results
+{
+    ia_pwl_compression_curve    pwl_compression_curve; /*!< piecewise linear compression curve >*/
+    ia_bcomp_dol_mode_t         dol_mode; /*!< Operating Mode for DOL sensor >*/
+    float                       cg_ratio; /*!< Conversion Gain Ratio for the sensor - constant value per sensor >*/
+} ia_bcomp_results;
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* IA_BCOMP_TYPES_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat.h
new file mode 100644
index 000000000000..bdc27cb4d65e
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat.h
@@ -0,0 +1,545 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_ccat.h
+ * \brief Definitions of common analysis functions used by Intel 3A modules.
+*/
+
+#ifndef IA_CCAT_H_
+#define IA_CCAT_H_
+
+#include "ia_configuration.h"
+#include "ia_ccat_types.h"
+#include "ia_aiq_types.h"
+#include "ia_cmc_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define IA_CCAT_ACM_SECTORS_MAX_NUM 36
+
+typedef struct ia_ccat_t ia_ccat;
+typedef struct frame_info_t ia_ccat_frame_info;
+
+LIBEXPORT ia_ccat*
+ia_ccat_init();
+
+/*!
+ * \brief (Re)allocates memory for CMC/tunings used inside CCAT.
+ * Given CMC structure must be valid throughout lifetime of CCAT.
+ */
+LIBEXPORT ia_err
+ia_ccat_set_tunings(
+    ia_ccat *ccat,        /*!< \param[in] Analysis toolbox's internal structure. */
+    const ia_cmc_t *cmc); /*!< \param[in] CMC structure that will be stored and copied/modified for CCAT internal use. */
+
+/*!
+ * \brief De-initializes and frees memory allocated in ia_ccat_init() function.
+ */
+LIBEXPORT void
+ia_ccat_deinit(ia_ccat *ccat); /*!< \param[in] Analysis toolbox's internal structure. */
+
+/*!
+ * \brief Statistics setting and initialization functions.
+ *
+ * Note: frame_parameters_available and frame_type:
+ * CCAT keeps shallow copy of ia_ccat_frame_parameters structure for all frame_types (eg. flash and nonflash frame parameters) and accesses
+ * parameters behind given pointers directly during its lifetime. When ia_ccat_set_frame_parameters is called with new set of parameters
+ * (and frame_parameters_available is set to true), previously given frame parameters (for the given frame_type) will no longer be used and
+ * can be freed/reused by CCAT client.
+ * If CCAT client wants to invalidate given frame parameters (for particular frame_type) without new set of parameters, frame_parameters_available
+ * flag should be set to false. This needs to be done for all frame_types that CCAT client wants to invalidate.
+ *
+ * Note: statistics_crop_area:
+ * This information is needed to restrict use parameters from Camera Module Characterization (for example LSC),
+ * which was done relative to the full sensor resolution (FOV).
+ * For example, if sensor captures image size 1600x1200 (4:3 ratio) pixels and only 1600x900 (16:9) area is used from the center.
+ * So, image area at top and bottom must not be used (needs to be cropped 150 pixels from top and bottom).
+ * statistics_crop_area crop rectangle needs to be given relative to IA_COORDINATE_WIDTH, IA_COORDINATE_HEIGHT found in ia_coordinate.h.
+ * Thus given structure in this example case should be:
+ *  statistics_crop_area.left = (0*IA_COORDINATE_WIDTH/1600);
+ *  statistics_crop_area.top = (150*IA_COORDINATE_HEIGHT/1200);
+ *  statistics_crop_area.right = (0*IA_COORDINATE_WIDTH/1600);
+ *  statistics_crop_area.bottom = (150*IA_COORDINATE_HEIGHT/1200);
+ *
+ */
+LIBEXPORT ia_err
+ia_ccat_set_frame_parameters(
+    ia_ccat *ccat,                                                           /*!< \param[in] Analysis toolbox internal data structure. */
+    const ia_ccat_frame_statistics *frame_statistics,                        /*!< \param[in] Input statistics */
+    const ia_ccat_frame_parameters *frame_parameters);                       /*!< \param[in] Input parameters */
+
+/*!
+ * \brief Registers percentile that will be calculated from histograms covering whole frame.
+ */
+LIBEXPORT ia_err
+ia_ccat_register_percentile_frame(
+    ia_ccat *ccat,                    /*!< \param[in] Analysis toolbox internal data structure. */
+    float percentile);
+
+/*!
+ * \brief Reserves frame into use.
+ * \return Error code.
+ */
+LIBEXPORT ia_err
+ia_ccat_hold_frame(
+    ia_ccat *ccat,                    /*!< \param[in]  Analysis toolbox internal data structure. */
+    ia_ccat_frame_type frame_type,    /*!< \param[in]  Frame type to acquire. */
+    ia_ccat_frame_info **frame_info); /*!< \param[out] Pointer to acquired frame info. */
+
+LIBEXPORT ia_err
+ia_ccat_release_frame(
+    ia_ccat *ccat,                    /*!< \param[in] Analysis toolbox internal data structure. */
+    ia_ccat_frame_info **frame_info); /*!< \param[in] Frame info pointer that is no longer used. */
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_percentile(
+    ia_ccat_frame_info* frame_info,
+    float percentile,
+    unsigned int exposure_index,
+    ia_ccat_histogram_type histogram_type,
+    float *percentile_bin);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_normalized_percentile(
+    ia_ccat_frame_info* frame_info,
+    float percentile,
+    unsigned int exposure_index,
+    ia_ccat_histogram_type histogram_type,
+    float *normalized_percentile);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_total_gain(
+    ia_ccat_frame_info *frame_info,
+    unsigned int exposure_index,
+    float *total_gain);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_total_exposure_time(
+    ia_ccat_frame_info *frame_info,
+    unsigned int exposure_index,
+    unsigned int *total_exposure_time);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_lux_level_estimate(
+    ia_ccat_frame_info *frame_info,
+    unsigned int exposure_index,
+    float *lux_level_estimate);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_filtered_lux_level_estimate(
+    ia_ccat_frame_info *frame_info,
+    unsigned int exposure_index,
+    float *filtered_lux_level_estimate);
+
+LIBEXPORT ia_err
+ia_ccat_hold_frame_histogram(
+    ia_ccat_frame_info *frame_info,
+    unsigned int exposure_index,
+    ia_ccat_histogram_type histogram_type,
+    const ia_histogram **histogram);
+
+LIBEXPORT ia_err
+ia_ccat_release_frame_histogram(
+    ia_ccat_frame_info *frame_info,
+    unsigned int exposure_index,
+    ia_ccat_histogram_type histogram_type,
+    const ia_histogram **histogram);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_histogram_info(
+    ia_ccat_frame_info *frame_info,
+    unsigned int exposure_index,
+    ia_ccat_histogram_type histogram_type,
+    float *mean,
+    float *saturation_percent,
+    float *max);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_histogram_segment_average(
+    ia_ccat_frame_info *frame_info,
+    unsigned int exposure_index,
+    ia_ccat_histogram_type a_histogram_type,
+    float low_limit,
+    float high_limit,
+    float *average);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_ae_results(
+    ia_ccat_frame_info *frame_info,
+    const ia_aec_results **ae_results);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_awb_results(
+    ia_ccat_frame_info *frame_info,
+    const ia_aiq_awb_results **awb_results);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_af_results(
+    ia_ccat_frame_info *frame_info,
+    const ia_aiq_af_results **af_results);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_sa_results(
+    ia_ccat_frame_info *frame_info,
+    const ia_aiq_sa_results_v1 **sa_results);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_exposure_result(
+    ia_ccat_frame_info *frame_info,
+    unsigned int exposure_index,
+    ia_aec_exposure_result *exposure_result);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_exposure_parameters(
+    ia_ccat_frame_info *frame_info,
+    unsigned int exposure_index,
+    ia_aec_exposure_parameters *exposure_parameters);
+
+#ifdef IA_AEC_FEATURE_WEIGHT_GRID
+LIBEXPORT ia_err
+ia_ccat_get_frame_histogram_weight_map(
+    ia_ccat_frame_info *frame_info,
+    const ia_aec_weight_grid **weight_grid);
+#endif
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_sensor_exposure_parameters(
+    ia_ccat_frame_info *frame_info,
+    unsigned int exposure_index,
+    ia_aiq_exposure_sensor_parameters *exposure_sensor_parameters);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_color_gains(
+    ia_ccat_frame_info *frame_info,
+    ia_aiq_color_channels *color_gains);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_color_correction_matrix(
+    ia_ccat_frame_info *frame_info,
+    float(*matrix)[3][3]);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_timestamp(
+    ia_ccat_frame_info *frame_info,
+    unsigned long long *frame_timestamp);
+
+/*!
+ * \brief Get information about number of exposures and which of them is the center (in case of multi exposure frame) exposure index.
+ */
+LIBEXPORT ia_err
+ia_ccat_get_frame_exposure_index_info(
+    ia_ccat_frame_info *frame_info,                                    /*!< [in] Frame handle. */
+    unsigned int *center_exposure_index,                               /*!< [out] Center (in case of multiple exposures) / default exposure index . */
+    unsigned int *num_exposures);                                      /*!< [out] Number of exposures/statistics in the frame. */
+
+/*!
+ * \brief Get closest ACMs for a white point.
+ * Note: Only CCMs are updated in out_acm structure.
+ */
+LIBEXPORT ia_err
+ia_ccat_calculate_weighted_acm(
+    ia_ccat_frame_info *frame_info,                                    /*!< [in] Frame handle. */
+    const cmc_parsed_advanced_color_matrices_ls_t *parsed_acm_ls,      /*!< [in] ACMs from CMC or AIQ tunings. */
+    unsigned int a_num_advanced_color_matrices,                        /*!< [in] Number of advanced color matrices */
+    unsigned int sector_count,                                         /*!< [in] Number of sectors in ACMs. */
+    cmc_chromaticity point,                                            /*!< [in] Chromaticity to calculate distance (x and y axis) against input list of chromaticities in R/G and B/G plane. */
+    float (*out_acm)[3][3],                                            /*!< [out] Resulting ACMs. Array length is defined by sector_count. */
+    float (*out_ccm)[3][3]);                                           /*!< [out] Resulting CCM. */
+
+/*!
+ * \brief Get closest CCMs for a white point.
+ */
+LIBEXPORT ia_err
+ia_ccat_calculate_weighted_ccm(
+    ia_ccat_frame_info *frame_info,                                    /*!< [in] Frame handle. */
+    const cmc_parsed_color_matrices_t *parsed_color_matrices,          /*!< [in] CCM characterization data with R/G and B/G chromaticities. */
+    bool output_ccm_type_preferred,                                    /*!< [in] Flag to control output CCM to be preferred (true) or accurate (false). */
+    cmc_chromaticity point,                                            /*!< [in] Chromaticity to calculate distance (x and y axis) against input list of chromaticities in R/G and B/G plane. */
+    float (*out_ccm)[3][3]);                                           /*!< [out] Resulting CCM. */
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_scaled_cmc_lens_shading(
+    ia_ccat_frame_info *a_frame_info_ptr,
+    unsigned int a_exposure_index,
+    const cmc_lens_shading_correction **a_scaled_lsc_ptr);
+
+LIBEXPORT ia_err
+ia_ccat_calculate_chromaticity_based_weights(
+    ia_ccat_frame_info *frame_info,                                      /*!< [in] Frame handle. */
+    cmc_chromaticity(*a_chromaticities_ptr)[CMC_NUM_LIGHTSOURCES],       /*!< [in] CCM characterization data with R/G and B/G chromaticities. */
+    unsigned int num_chromaticities,                                     /*!< [in] Number of input chromaticities. */
+    cmc_chromaticity point,                                              /*!< [in] Chromaticity to calculate distance (x and y axis) against input list of chromaticities in R/G and B/G plane. */
+    const float *ir_proportion,                                          /*!< [in] Ir effect on chromaticity point distance (z axis). */
+    float(*weights)[CMC_NUM_LIGHTSOURCES]);                              /*!< [out] Normalized chromaticity distances translated into weights. */
+
+#ifdef IA_AEC_FEATURE_FLASH
+/*!
+ * \brief Calculate preferred flash ratio for multi-flash using non-flash white point information. flash_ratio scale between 0-100
+ */
+LIBEXPORT ia_err
+ia_ccat_calculate_flash_ratios(
+    const cmc_multi_led_flash_t *flash_tunings,
+    ia_ccat_frame_info *nonflash_frame_info,
+    float (*flash_ratios)[IA_AEC_FLASHES_NUM]);
+#endif
+
+#ifdef IA_CCAT_IR_GRID_ENABLED
+LIBEXPORT ia_err
+ia_ccat_get_frame_ir_grid(
+    ia_ccat_frame_info *frame_info,
+    const ia_ccat_grid_char **ir_grid);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_ir_histogram_info(
+    ia_ccat_frame_info *frame_info,
+    float *mean,
+    float *saturation_percent,
+    float *max);
+#endif
+
+#ifdef IA_CCAT_DEPTH_GRID_ENABLED
+LIBEXPORT ia_err
+ia_ccat_get_frame_depth_grid(
+    ia_ccat_frame_info *frame_info,
+    const ia_depth_grid **depth_grid);
+#endif
+
+#ifdef IA_CCAT_RGBS_GRID_ENABLED
+LIBEXPORT ia_err
+ia_ccat_get_frame_rgbs_grid(
+    ia_ccat_frame_info *frame_info,
+    bool shading_corrected,
+    unsigned int exposure_index,
+    const ia_rgbs_grid **rgbs_grid);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_af_grid(
+    ia_ccat_frame_info *frame_info,
+    unsigned int exposure_index,
+    const ia_filter_response_grid **af_grid);
+
+#ifdef IA_CCAT_HSV_GRID_ENABLED
+LIBEXPORT ia_err
+ia_ccat_get_frame_hsv_grid(
+    ia_ccat_frame_info *frame_info,
+    unsigned int exposure_index,
+    const ia_ccat_hsv_grid **hsv_grid);
+#endif
+
+#ifdef IA_CCAT_LUMINANCE_GRID_ENABLED
+LIBEXPORT ia_err
+ia_ccat_get_frame_luminance_grid(
+    ia_ccat_frame_info *frame_info,
+    unsigned int exposure_index,
+    const ia_ccat_grid_char **luminance_grid);
+
+#ifdef IA_CCAT_LUMINANCE_MOTION_ESTIMATE_ENABLED
+LIBEXPORT ia_err
+ia_ccat_get_frame_motion_level_estimate(
+    ia_ccat_frame_info *frame_info,
+    unsigned int exposure_index,
+    float *motion_estimate);
+#endif
+#endif
+
+#ifdef IA_CCAT_ROI_ANALYSIS_ENABLED
+LIBEXPORT ia_err
+ia_ccat_register_percentile_roi(
+    ia_ccat *ccat,                    /*!< \param[in] Analysis toolbox internal data structure. */
+    float percentile);
+
+LIBEXPORT ia_err
+ia_ccat_hold_frame_histogram_roi(
+    ia_ccat_frame_info *frame_info,
+    unsigned int exposure_index,
+    const ia_rectangle *roi_area,
+    ia_ccat_histogram_type histogram_type,
+    const ia_histogram **histogram);
+
+LIBEXPORT ia_err
+ia_ccat_release_frame_histogram_roi(
+    ia_ccat_frame_info *frame_info,
+    unsigned int exposure_index,
+    const ia_rectangle *roi_area,
+    ia_ccat_histogram_type histogram_type,
+    const ia_histogram **histogram);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_histogram_info_roi(
+    ia_ccat_frame_info *frame_info,
+    unsigned int exposure_index,
+    const ia_rectangle *roi_area,
+    ia_ccat_histogram_type histogram_type,
+    float *mean,
+    float *saturation_percent,
+    float *max);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_percentile_roi(
+    ia_ccat_frame_info *frame_info,
+    float percentile,
+    unsigned int exposure_index,
+    const ia_rectangle *roi_area,
+    ia_ccat_histogram_type histogram_type,
+    float *percentile_bin);
+#endif /* IA_CCAT_ROI_ANALYSIS_ENABLED */
+
+#ifdef IA_CCAT_FACE_ANALYSIS_ENABLED
+LIBEXPORT ia_err
+ia_ccat_register_percentile_face(
+    ia_ccat *ccat,                    /*!< \param[in] Analysis toolbox internal data structure. */
+    float percentile);
+
+LIBEXPORT ia_err
+ia_ccat_get_face_stencil(
+    ia_ccat_frame_info *frame_info,
+    unsigned int exposure_index,
+    const ia_rectangle *face_area,
+    const ia_ccat_grid_char **stencil_mask);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_faces(
+    ia_ccat_frame_info *frame_info,
+    unsigned int *num_faces,
+    const ia_face_roi **faces);
+
+LIBEXPORT ia_err
+ia_ccat_get_face_coverage(
+    const ia_face_roi *face,
+    float *coverage);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_face_y_mean(
+    ia_ccat_frame_info *frame_info,
+    unsigned int exposure_index,
+    const ia_face_roi *face,
+    float *face_y_mean);
+
+LIBEXPORT ia_err
+ia_ccat_get_frame_percentile_face(
+    ia_ccat_frame_info *frame_info,
+    float percentile,
+    unsigned int exposure_index,
+    const ia_face_roi *face,
+    ia_ccat_histogram_type histogram_type,
+    float *percentile_bin);
+#endif /* IA_CCAT_FACE_ANALYSIS_ENABLED */
+#endif /* IA_CCAT_RGBS_GRID_ENABLED */
+
+#ifdef IA_CCAT_EXTERNAL_SENSORS_ENABLED
+/*
+* Sensor event functions.
+*/
+/*!
+* \brief Set the accelerometer sensor events to CCAT internal circular buffer.
+* Initialize sensor_events structure. Const fields in the structure are assumed to be initialized before calling this function.
+*/
+LIBEXPORT ia_err
+ia_ccat_set_sensor_events_accelerometer(
+    ia_ccat *ccat,                                     /*!< [in, out] Analysistoolbox internal data structures. */
+    unsigned int num_events,                           /*!< [in] Number of accelerometer sensor events. */
+    const ia_ccat_motion_sensor_event *sensor_events); /*!< [in] Structure containing accelerometer events for given time range. */
+
+/*!
+* \brief Get a copy of accelerometer events.
+* Outputs all events within given timestamps.
+*/
+LIBEXPORT ia_err
+ia_ccat_get_sensor_events_accelerometer(
+    const ia_ccat *ccat,                               /*!< [in] Analysistoolbox internal data structures. */
+    unsigned long long start_timestamp,                /*!< [in]  Start time for events to be copied. 0 if all data (max_num_events) must be copied. */
+    unsigned long long end_timestamp,                  /*!< [in]  End time for events to be copied. 0 if all data (max_num_events) must be copied. */
+    unsigned int *num_events,                          /*!< [in]  Number of events allowed to be copied (maximum amount of available memory in sensor_events).
+                                                       [out] How many events were copied to the sensor_events structure. */
+    ia_ccat_motion_sensor_event* sensor_events);       /*!< [out] Copied accelerometer events. */
+
+/*!
+* \brief Set the gyroscope sensor events to CCAT internal circular buffer.
+*/
+LIBEXPORT ia_err
+ia_ccat_set_sensor_events_gyroscope(
+    ia_ccat *ccat,                                     /*!< [in, out] Analysistoolbox internal data structures. */
+    unsigned int num_events,                           /*!< [in] Number of gyroscope sensor events. */
+    const ia_ccat_motion_sensor_event *sensor_events); /*!< [in] Structure containing gyroscope events for given time range. */
+
+/*!
+* \brief Get a copy of gyroscope events.
+* Outputs all events within given timestamps.
+*/
+LIBEXPORT ia_err
+ia_ccat_get_sensor_events_gyroscope(
+    const ia_ccat *ccat,                               /*!< [in]  Analysistoolbox internal data structures. */
+    unsigned long long start_timestamp,                /*!< [in]  Start time for events to be copied. 0 if all data (max_num_events) must be copied. */
+    unsigned long long end_timestamp,                  /*!< [in]  End time for events to be copied. 0 if all data (max_num_events) must be copied. */
+    unsigned int *num_events,                          /*!< [in]  Number of events allowed to be copied (maximum amount of available memory in sensor_events).
+                                                       [out] How many events were copied to the sensor_events structure. */
+    ia_ccat_motion_sensor_event* sensor_events);       /*!< [out] Copied gyroscope events. */
+
+/*!
+* \brief Set the gravity sensor events to CCAT internal circular buffer.
+*/
+LIBEXPORT ia_err
+ia_ccat_set_sensor_events_gravity(
+    ia_ccat *ccat,                                     /*!< [in, out] Analysistoolbox internal data structures. */
+    unsigned int num_events,                           /*!< [in] Number of gravity sensor events. */
+    const ia_ccat_motion_sensor_event *sensor_events); /*!< [in] Structure containing gravity events for given time range. */
+
+/*!
+* \brief Get a copy of gravity events.
+* Outputs all events within given timestamps.
+*/
+LIBEXPORT ia_err
+ia_ccat_get_sensor_events_gravity(
+    const ia_ccat *ccat,                               /*!< [in]  Analysistoolbox internal data structures. */
+    unsigned long long start_timestamp,                /*!< [in]  Start time for events to be copied. 0 if all data (max_num_events) must be copied. */
+    unsigned long long end_timestamp,                  /*!< [in]  End time for events to be copied. 0 if all data (max_num_events) must be copied. */
+    unsigned int *num_events,                          /*!< [in]  Number of events allowed to be copied (maximum amount of available memory in sensor_events).
+                                                       [out] How many events were copied to the sensor_events structure. */
+    ia_ccat_motion_sensor_event* sensor_events);       /*!< [out] Copied gravity events. */
+
+/*!
+* \brief Set the ambient light sensor events to CCAT internal circular buffer.
+*/
+LIBEXPORT ia_err
+ia_ccat_set_sensor_events_ambient_light(
+    ia_ccat *ccat,                                     /*!< [in, out] Analysistoolbox internal data structures. */
+    unsigned int num_events,                           /*!< [in] Number of ambient light sensor events. */
+    const ia_ccat_ambient_light_event *sensor_events); /*!< [in] Structure containing ambient light events for given time range. */
+
+/*!
+* \brief Get a copy of ambient light events.
+* Outputs all events within given timestamps.
+*/
+LIBEXPORT ia_err
+ia_ccat_get_sensor_events_ambient_light(
+    const ia_ccat *ccat,                               /*!< [in]  Analysistoolbox internal data structures. */
+    unsigned long long start_timestamp,                /*!< [in]  Start time for events to be copied. 0 if all data (max_num_events) must be copied. */
+    unsigned long long end_timestamp,                  /*!< [in]  End time for events to be copied. 0 if all data (max_num_events) must be copied. */
+    unsigned int *num_events,                          /*!< [in]  Number of events allowed to be copied (maximum amount of available memory in sensor_events).
+                                                            [out] How many events were copied to the sensor_events structure. */
+    ia_ccat_ambient_light_event* sensor_events);       /*!< [out] Copied ambient light events. */
+
+                                                       /* Following functions require frame_info structure as input. Client should call ia_ccat_hold_frame() to get the frame handle.
+                                                       * Once frame handle is no longer used, ia_ccat_release_frame() must be called. */
+#endif /* IA_CCAT_EXTERNAL_SENSORS_ENABLED */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IA_CCAT_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat_types.h
new file mode 100644
index 000000000000..5f352b78f0b5
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat_types.h
@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_ccat.h
+ * \brief Definitions of common analysis types used by Intel 3A modules.
+*/
+
+#ifndef IA_CCAT_TYPES_H_
+#define IA_CCAT_TYPES_H_
+
+#include "ia_configuration.h"
+#include "ia_statistics_types.h"
+#include "ia_aiq_types.h"
+#include "ia_aec_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum
+{
+    ia_ccat_frame_type_nonflash,
+#ifdef IA_AEC_FEATURE_FLASH
+    ia_ccat_frame_type_flash,
+#endif
+    ia_ccat_frame_type_count
+} ia_ccat_frame_type;
+
+typedef enum
+{
+    ia_ccat_histogram_type_cc_start = 0,
+    ia_ccat_histogram_type_cc_rgb_averaged = ia_ccat_histogram_type_cc_start, /*!< Color corrected and weighted R, G and B histograms averaged into one histogram. */
+    ia_ccat_histogram_type_cc_rgb_combined,                                   /*!< Color corrected and weighted R, G and B histograms summed into one histogram. */
+    ia_ccat_histogram_type_cc_y,                                              /*!< Color corrected and weighted R, G and B histograms converted to Y (luminance) histogram. */
+    ia_ccat_histogram_type_cc_end,
+    ia_ccat_histogram_type_raw_start = ia_ccat_histogram_type_cc_end,
+#ifdef IA_CCAT_RGBS_GRID_ENABLED
+    ia_ccat_histogram_type_raw_rgb_averaged = ia_ccat_histogram_type_cc_end,  /*!< Raw (calculated from RGBS grid before color correction) R, G and B histograms averaged into one histogram. */
+    ia_ccat_histogram_type_raw_rgb_combined,                                  /*!< Raw (calculated from RGBS grid before color correction) R, G and B histograms summed into one histogram. */
+    ia_ccat_histogram_type_raw_y,                                             /*!< Raw (calculated from RGBS grid before color correction) R, G and B histograms converted to Y (luminance) histogram. */
+    ia_ccat_histogram_type_uncorrected_raw_y,                                 /*!< Raw (calculated from RGBS grid before LSC and color correction) R, G and B histograms converted to Y (luminance) histogram. */
+    ia_ccat_histogram_type_raw_end,
+#else
+    ia_ccat_histogram_type_raw_end = ia_ccat_histogram_type_raw_start,
+    ia_ccat_histogram_type_raw_rgb_averaged = ia_ccat_histogram_type_raw_end,
+    ia_ccat_histogram_type_raw_rgb_combined = ia_ccat_histogram_type_raw_end,
+    ia_ccat_histogram_type_raw_y = ia_ccat_histogram_type_raw_end,
+    ia_ccat_histogram_type_uncorrected_raw_y = ia_ccat_histogram_type_raw_end,
+#endif
+    ia_ccat_histogram_type_count = ia_ccat_histogram_type_raw_end,
+    ia_ccat_histogram_type_invalid = ia_ccat_histogram_type_count,
+} ia_ccat_histogram_type;
+
+typedef struct ia_ccat_histograms
+{
+    ia_histogram r;
+    ia_histogram g;
+    ia_histogram b;
+} ia_ccat_histograms;
+
+#ifdef IA_CCAT_RGBS_GRID_ENABLED
+#ifdef IA_CCAT_HSV_GRID_ENABLED
+typedef struct ia_ccat_hsv_channels
+{
+    float h;
+    float s;
+    float v;
+} ia_ccat_hsv_channels;
+
+/*!
+* \brief HSV grid structure.
+*/
+typedef struct ia_ccat_hsv_grid
+{
+    unsigned int grid_width;                        /*! Width of the grid. */
+    unsigned int grid_height;                       /*! Height of the grid. */
+    ia_ccat_hsv_channels data[IA_RGBS_GRID_SIZE];   /*! Grid data. */
+} ia_ccat_hsv_grid;
+#endif
+#endif
+
+#if defined IA_CCAT_RGBS_GRID_ENABLED || defined IA_CCAT_LUMINANCE_GRID_ENABLED || defined IA_CCAT_IR_GRID_ENABLED
+/*!
+ * \brief Generic 8 bit grid structure.
+ */
+typedef struct ia_ccat_grid_char
+{
+    unsigned int grid_width;                    /*! Width of the grid. */
+    unsigned int grid_height;                   /*! Height of the grid. */
+    unsigned char data[IA_RGBS_GRID_SIZE];      /*! Grid data. */
+} ia_ccat_grid_char;
+
+/*!
+* \brief Generic 16 bit grid structure.
+*/
+typedef struct ia_ccat_grid_short
+{
+    unsigned int grid_width;                    /*! Width of the grid. */
+    unsigned int grid_height;                   /*! Height of the grid. */
+    unsigned short data[IA_RGBS_GRID_SIZE];     /*! Grid data. */
+} ia_ccat_grid_short;
+
+/*!
+ * \brief Generic grid structure with floating point values.
+ */
+typedef struct ia_ccat_grid_float
+{
+    unsigned int grid_width;                    /*! Width of the grid. */
+    unsigned int grid_height;                   /*! Height of the grid. */
+    float data[IA_RGBS_GRID_SIZE];              /*! Grid data in floating point format. */
+} ia_ccat_grid_float;
+#endif
+
+typedef struct ia_ccat_frame_statistics
+{
+    bool frame_parameters_available;                                         /*!< Mandatory. Flag indicating that frame parameters can be used by CCAT. Set to false to invalidate frame parameters. */
+    bool shading_corrected;                                                  /*!< Mandatory. Flag indicating if statistics were calculated using lens shading corrected data. */
+    ia_ccat_frame_type frame_type;                                           /*!< Mandatory. Indicates if statistics were captured from non-flash or flash illuminated frame. */
+    unsigned long long frame_id;                                             /*!< Mandatory. ID for the captured frame. */
+    unsigned long long frame_timestamp;                                      /*!< Mandatory. Time stamp for captured frame. */
+    ia_rectangle statistics_crop_area;                                       /*!< Mandatory. RGBS and AF grid area crop with respect to full field of view of sensor output using (relative)ranges from ia_coordinate.h. */
+#ifdef IA_CCAT_EXTERNAL_RGB_HISTOGRAMS_ENABLED
+    ia_ccat_histograms rgb_histograms[IA_CCAT_STATISTICS_MAX_NUM];           /*!< Optional. RGB histograms pointer for each exposure statistics. */
+#endif
+#ifdef IA_CCAT_EXTERNAL_LUMINANCE_HISTOGRAM_ENABLED
+    ia_histogram y_histogram[IA_CCAT_STATISTICS_MAX_NUM];                    /*!< Optional. Luminance histogram. */
+#endif
+#ifdef IA_CCAT_RGBS_GRID_ENABLED
+    ia_rgbs_grid rgbs_grids[IA_CCAT_STATISTICS_MAX_NUM];                     /*!< Optional. RGBS grids for each exposure statistics. */
+#endif
+#ifdef IA_CCAT_CONVOLUTION_FILTER_GRID_ENABLED
+    ia_filter_response_grid af_grids[IA_CCAT_STATISTICS_MAX_NUM];            /*!< Optional. AF grids for each exposure statistics. */
+#endif
+#ifdef IA_CCAT_EXTERNAL_LUMINANCE_GRID_ENABLED
+    ia_ccat_grid_char y_grid[IA_CCAT_STATISTICS_MAX_NUM];                    /*!< Optional. Luminance (LSC and color corrected) grids for each exposure statistics. */
+#endif
+#ifdef IA_CCAT_IR_GRID_ENABLED
+    ia_ccat_grid_char ir_grid;                                               /*!< Optional. Ir grid (Non LSC corrected grid). */
+#endif
+#ifdef IA_CCAT_DEPTH_GRID_ENABLED
+    ia_depth_grid depth_grid;                                                /*!< Optional. Depth grid. */
+#endif
+} ia_ccat_frame_statistics;
+
+typedef struct ia_ccat_frame_parameters
+{
+    ia_aec_results ae_results;                                               /*!< Mandatory. Exposure parameters used to capture the frame. */
+    ia_aiq_pa_results_v1 pa_results;                                         /*!< Optional. */
+    ia_aiq_sa_results_v1 sa_results;                                         /*!< Optional. */
+    ia_aiq_awb_results awb_results;                                          /*!< Optional. */
+    ia_aiq_af_results af_results;                                            /*!< Optional. */
+#ifdef IA_CCAT_FACE_ANALYSIS_ENABLED
+    ia_face_roi faces[IA_CCAT_FACES_MAX_NUM];                                /*!< Optional. Face coordinates from external face detector. NULL if not available. */
+#endif
+} ia_ccat_frame_parameters;
+
+/*!
+ * \brief Structure for various motion sensors
+ * Accelerometer Events:
+ *  - The data holds information on the acceleration of the device in mg/sec (miligravity per second). Acceleration = Gravity + Linear Acceleration.
+ * Gravity Events:
+ *  - The data holds information on the gravitation of the device in mg/sec (miligravity per second).
+ * Gyroscope Events:
+ *  - The data holds information on the angular velocity of the device in rad/sec.
+ */
+typedef struct ia_ccat_motion_sensor_event
+{
+    unsigned long long ts;  /*!< Time stamp in usec (microseconds) */
+    float x;                /*!< Sensor Data in X direction depending on the type of the sensor */
+    float y;                /*!< Sensor Data in Y direction depending on the type of the sensor */
+    float z;                /*!< Sensor Data in Z direction depending on the type of the sensor */
+    float sensitivity;      /*!< Sensitivity of the sensor */
+    unsigned long long fs;  /*!< Frame stamp in usec (microseconds) */
+} ia_ccat_motion_sensor_event;
+
+/*!
+ * \brief Ambient Light Events
+ * NOTE: This should always match to libsensorhub API
+ * TODO: Update the structure according to the API
+ */
+typedef struct ia_ccat_ambient_light_event
+{
+    unsigned long long ts;  /*!< Time stamp in usec (microseconds) */
+    float data;             /*!< Ambient Light data ? */
+    float sensitivity;      /*!< Sensitivity of Ambient Light sensor */
+    unsigned long long fs;  /*!< Frame stamp in usec (microseconds) */
+} ia_ccat_ambient_light_event;
+
+#if 0
+/*!
+ * \brief Face rectangle
+ * Range of rectangle values is defined in ia_coordinate.h:
+ * IA_COORDINATE_TOP, IA_COORDINATE_LEFT, IA_COORDINATE_BOTTOM, IA_COORDINATE_RIGHT
+ */
+typedef struct ia_face_roi
+{
+    int tracking_id;                   /*!< Tracking id of the face. */
+    ia_rectangle face_area;            /*!< Bounding box of the face in the coordination system where (0,0) indicates left-top position. */
+    ia_coordinate mouth;               /*!< Mid-point of the mouth. */
+    ia_coordinate left_eye;            /*!< Left eye */
+    ia_coordinate right_eye;           /*!< Right eye */
+    bool eye_validity;                 /*!< Indicates whether a face was processed to get eye positions */
+    float skin_type_dark_likelihood;   /*!< Likelihood of skin type being dark [0.0, 1.0]. Bright skin likelihood = 1.0 - dark_skin_type_likelihood */
+    bool skin_type_validity;           /*!< Indicates whether a face was processed to get skin likelihood */
+} ia_face_roi;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IA_CCAT_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser.h
new file mode 100644
index 000000000000..341f04476944
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_cmc_parser.h
+ * \brief Parser for CMC data.
+*/
+
+
+#ifndef IA_CMC_PARSER_H_
+#define IA_CMC_PARSER_H_
+
+#include "ia_types.h"
+#include "ia_cmc_types.h"
+#include "ia_nvm.h"
+#include "ia_cmc_parser_deprecated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+LIBEXPORT ia_cmc_t*
+ia_cmc_parser_init_v1(
+    const ia_binary_data *a_aiqb_binary,
+    const ia_binary_data *a_nvm_data);
+
+LIBEXPORT void
+ia_cmc_parser_deinit(ia_cmc_t *ia_cmc);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IA_CMC_PARSER_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser_deprecated.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser_deprecated.h
new file mode 100644
index 000000000000..7ad170aee24a
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser_deprecated.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_cmc_parser.h
+ * \brief Parser for CMC data.
+*/
+
+
+#ifndef IA_CMC_PARSER_DEPRECATED_H_
+#define IA_CMC_PARSER_DEPRECATED_H_
+
+#include "ia_types.h"
+#include "ia_cmc_types.h"
+#include "ia_nvm.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+LIBEXPORT ia_cmc_t*
+ia_cmc_parser_init(
+    const ia_binary_data *a_aiqb_binary);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IA_CMC_PARSER_DEPRECATED_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_types.h
new file mode 100644
index 000000000000..9172c27f84ef
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_types.h
@@ -0,0 +1,1468 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_cmc_types.h
+ * \brief Definitions of Camera Module Characterization (CMC) records.
+*/
+
+#ifndef IA_CMC_TYPES_H_
+#define IA_CMC_TYPES_H_
+
+#include "ia_mkn_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* All CMC records are inside AIQB record in CPFF file. */
+#define AIQB_TAG IA_MKN_CHTOUL('A','I','Q','B')  /*!< AIQ configuration block tag. */
+
+/*
+ * Color Channels (1-4) refer to Raw Bayer quad in the following order.
+ * -------------
+ * | CC1 | CC2 |
+ * -------------
+ * | CC3 | CC4 |
+ * -------------
+ *
+ * Structures defined in this header file, which are stored into memory/file must start from 64 bit boundary (for 64 bit systems).
+ * Keep in mind also structures' internal padding when defining new structures.
+ */
+#define CMC_NUM_CHANNELS 4
+
+typedef struct
+{
+    uint16_t cc1;
+    uint16_t cc2;
+    uint16_t cc3;
+    uint16_t cc4;
+} cmc_color_channels;
+
+/*!
+ * \brief CIE x and Y coordinates.
+ */
+typedef struct
+{
+    uint16_t x;
+    uint16_t y;
+} cie_coords_t;
+
+/*!
+ * \brief R/G and B/G ratios.
+ */
+typedef struct
+{
+    uint16_t r_per_g;
+    uint16_t b_per_g;
+} chromaticity_t;
+
+/*!
+ * \brief Physical pixel coordinates.
+ */
+typedef struct
+{
+    uint16_t x;
+    uint16_t y;
+} cmc_coords;
+
+/*!
+ * \brief Chromaticity coordinates in CIE 1931 space.
+ */
+typedef struct
+{
+    float x;
+    float y;
+} cmc_cie_coords;
+
+/*!
+ * \brief Chromaticity coordinates in R/G & B/G space.
+ */
+typedef struct
+{
+    float r_per_g;
+    float b_per_g;
+} cmc_chromaticity;
+
+/*!
+* \brief 3x3 color matrix.
+*/
+typedef struct
+{
+    float matrix[3][3];                 /*!< 3x3 accurate CCM, each consequtive elements sum to 1. */
+} cmc_color_matrix;
+
+/*!
+ * \brief Raw image bayer order.
+ */
+typedef enum
+{
+    cmc_bayer_order_2x2,                            /*!< Start of enumerations for 2x2 bayer types. */
+    cmc_bayer_order_grbg = cmc_bayer_order_2x2,     /*!< First row contains pixels Gr, R. Second row contains pixels B, Gb. */
+    cmc_bayer_order_rggb,                           /*!< First row contains pixels R, Gr. Second row contains pixels Gb, B. */
+    cmc_bayer_order_bggr,                           /*!< First row contains pixels B, Gb. Second row contains pixels Gr, R. */
+    cmc_bayer_order_gbrg,                           /*!< First row contains pixels Gb, B. Second row contains pixels R, Gr. */
+    cmc_bayer_order_grbi,                           /*!< First row contains pixels Gr, R. Second row contains pixels B, IR. */
+    cmc_bayer_order_irbg,                           /*!< First row contains pixels IR, R. Second row contains pixels B, Gb. */
+    cmc_bayer_order_rgib,                           /*!< First row contains pixels R, Gr. Second row contains pixels IR, B. */
+    cmc_bayer_order_rigb,                           /*!< First row contains pixels R, IR. Second row contains pixels Gb, B. */
+    cmc_bayer_order_bgir,                           /*!< First row contains pixels B, Gb. Second row contains pixels IR, R. */
+    cmc_bayer_order_bigr,                           /*!< First row contains pixels B, IR. Second row contains pixels Gr, R. */
+    cmc_bayer_order_gbri,                           /*!< First row contains pixels Gb, B. Second row contains pixels R, IR. */
+    cmc_bayer_order_ibrg,                           /*!< First row contains pixels IR, B. Second row contains pixels R, Gr. */
+    cmc_bayer_order_4x2 = 128,                      /*!< Start of enumerations for 4x2 bayer types. */
+    cmc_bayer_order_2pd_grbg = cmc_bayer_order_4x2, /*!< Two photodiodes per pixel in Gr, R, B, Gb order (4x2). */
+    cmc_bayer_order_2pd_rggb,                       /*!< Two photodiodes per pixel in R, Gr, Gb, B order (4x2). */
+    cmc_bayer_order_2pd_bggr,                       /*!< Two photodiodes per pixel in B, Gb, Gr, R order (4x2). */
+    cmc_bayer_order_2pd_gbrg,                       /*!< Two photodiodes per pixel in Gb, B, R, Gr order (4x2). */
+    cmc_bayer_order_4x4 = 256,                      /*!< Start of enumerations for 4x4 bayer types. */
+    cmc_bayer_order_bgrg_gigi_rgbg_gigi = cmc_bayer_order_4x4, /*!< Order: 1st row: B G R G, 2nd row: G I G I, 3rd row: R G B G, 4th row: G I G I (4x4). */
+    cmc_bayer_order_grgb_igig_gbgr_igig,                       /*!< Order: 1st row: G R G B, 2nd row: I G I G, 3rd row: G B G R, 4th row: I G I G (4x4). */
+    cmc_bayer_order_rgbg_gigi_bgrg_gigi,                       /*!< Order: 1st row: R G B G, 2nd row: G I G I, 3rd row: B G R G, 4th row: G I G I (4x4). */
+    cmc_bayer_order_gbgr_igig_grgb_igig,                       /*!< Order: 1st row: G B G R, 2nd row: I G I G, 3rd row: G R G B, 4th row: I G I G (4x4). */
+    cmc_bayer_order_gigi_rgbg_gigi_bgrg,                       /*!< Order: 1st row: G I G I, 2nd row: R G B G, 3rd row: G I G I, 4th row: B G R G (4x4). */
+    cmc_bayer_order_igig_gbgr_igig_grgb,                       /*!< Order: 1st row: I G I G, 2nd row: G B G R, 3rd row: I G I G, 4th row: G R G B (4x4). */
+    cmc_bayer_order_gigi_bgrg_gigi_rgbg,                       /*!< Order: 1st row: G I G I, 2nd row: B G R G, 3rd row: G I G I, 4th row: R G B G (4x4). */
+    cmc_bayer_order_igig_grgb_igig_gbgr                        /*!< Order: 1st row: I G I G, 2nd row: G R G B, 3rd row: I G I G, 4th row: G B G R (4x4). */
+} cmc_bayer_order;
+
+/*!
+ * \brief Color space definitions.
+ */
+typedef enum
+{
+    cmc_color_space_srgb,
+    cmc_color_space_bt601,
+    cmc_color_space_bt709,
+    cmc_color_space_bt2020,
+    cmc_color_space_bt2100_rgb,
+    cmc_color_space_bt2100_lms,
+    cmc_color_space_dci_p3,
+    cmc_color_space_adobergb,
+} cmc_color_space;
+
+/*!
+ * \brief CMC names used in the record headers.
+ */
+typedef enum
+{
+    cmc_name_id_reserved = 0,                            /*!< 00 */
+    cmc_name_id_comment,                                 /*!< 01 */
+    cmc_name_id_general_data,                            /*!< 02 */
+    cmc_name_id_black_level,                             /*!< 03 */
+    cmc_name_id_black_level_spatial,                     /*!< 04 */
+    cmc_name_id_saturation_level,                        /*!< 05 */
+    cmc_name_id_dynamic_range_and_linearity,             /*!< 06 */
+    cmc_name_id_module_sensitivity,                      /*!< 07 */
+    cmc_name_id_defect_pixels,                           /*!< 08 */
+    cmc_name_id_noise,                                   /*!< 09 */
+    cmc_name_id_lens_shading_correction,                 /*!< 10 */
+    cmc_name_id_lens_shading_correction_ratio,           /*!< 11 */
+    cmc_name_id_geometric_distortion_correction,         /*!< 12 */
+    cmc_name_id_optics_and_mechanics,                    /*!< 13 */
+    cmc_name_id_module_spectral_response,                /*!< 14 */
+    cmc_name_id_chromaticity_response,                   /*!< 15 */
+    cmc_name_id_flash_chromaticity,                      /*!< 16 */
+    cmc_name_id_nvm_info,                                /*!< 17 */
+    cmc_name_id_color_matrices,                          /*!< 18 */
+    cmc_name_id_analog_gain_conversion,                  /*!< 19 DEPRECATED */
+    cmc_name_id_digital_gain,                            /*!< 20 */
+    cmc_name_id_sensor_metadata,                         /*!< 21 */
+    cmc_name_id_geometric_distortion_correction2,        /*!< 22 */
+    cmc_name_id_exposure_range,                          /*!< 23 */
+    cmc_name_id_multi_led_flash_chromaticity,            /*!< 24 */
+    cmc_name_id_advanced_color_matrices,                 /*!< 25 */
+    cmc_name_id_hdr,                                     /*!< 26 */
+    cmc_name_id_infrared_correction,                     /*!< 27 */
+    cmc_name_id_lens_shading_correction_4x4,             /*!< 28 */
+    cmc_name_id_lateral_chromatic_aberration_correction, /*!< 29 */
+    cmc_name_id_phase_difference,                        /*!< 30 */
+    cmc_name_id_black_level_global,                      /*!< 31 */
+    cmc_name_id_valid_image_area,                        /*!< 32 */
+    cmc_name_id_lens_shading_correction_4x4_ratio,       /*!< 33 */
+    cmc_name_id_multi_gain_conversions,                  /*!< 34 */
+} cmc_name_id;
+
+/*!
+ * \brief Camera features flags (see cmc_optomechanics_t.camera_features).
+ * Bit '1' means that the feature is presented.
+ */
+typedef enum {
+    cmc_camera_feature_lens_position_sensor        = 1,            /*!< Physical Lens Position sensor */
+    cmc_camera_feature_voice_coil_actuator         = (1 << 1),     /*!< 'Voice Coil' type of lens actuator */
+    cmc_camera_feature_hybrid_voice_coil_actuator  = (1 << 2),     /*!< 'Hybrid Voice Coil' type of lens actuator */
+    cmc_camera_feature_piezo_actuator              = (1 << 3),     /*!< 'Piezo' type of lens actuator */
+    cmc_camera_feature_mems_actuator               = (1 << 4),     /*!< 'MEMS' type of lens actuator */
+    cmc_camera_feature_nd_filter                   = (1 << 5),     /*!< Neutral Density filter */
+    cmc_camera_feature_mechanical_shutter          = (1 << 6),     /*!< Mechanical Shutter */
+    cmc_camera_feature_variable_apertures          = (1 << 7),     /*!< Variable Apertures */
+    cmc_camera_feature_optical_zoom                = (1 << 8)      /*!< Optical Zoom */
+} cmc_camera_feature;
+
+/*!
+ * \brief Camera module orientation
+ */
+typedef enum {
+    cmc_camera_orientation_down = 0,            /*!< Camera module is pointing down */
+    cmc_camera_orientation_horizontally,        /*!< Camera module is pointing horizontally */
+    cmc_camera_orientation_up                   /*!< Camera module is pointing up */
+} cmc_camera_orientation;
+
+/*!
+ * \brief LSC level enumeration.
+ */
+typedef enum {
+    cmc_lsc_force_first_grid = 0,           /*!< Use always first LSC grid */
+    cmc_lsc_without_nvm,                    /*!< Use LSC adaptation without NVM */
+    cmc_lsc_with_nvm                        /*!< Use LSC adaptation with NVM */
+} cmc_lsc_level;
+
+/*!
+ * \brief Shading Adaptor Level enumeration.
+ */
+typedef enum {
+    cmc_sa_disable = 0,                     /*!< Do not apply shading tables (bypass LSC) */
+    cmc_sa_cct_based,                       /*!< Use CCT based LSC selection */
+    cmc_sa_adaptive,                        /*!< Use adaptive LSC selection */
+    cmc_sa_self_adjusting                   /*!< Use module variation correcting LSC */
+} cmc_sa_level;
+
+/*!
+ * \brief Light source enumeration
+ */
+typedef enum {
+    cmc_light_source_none = 0,           /*!< Light source N/A */
+    cmc_light_source_a,                  /*!< Incandescent / Tungsten */
+    cmc_light_source_b,                  /*!< Obsolete. Direct sunlight at noon */
+    cmc_light_source_c,                  /*!< Obsolete. Average / north sky daylight */
+    cmc_light_source_d50,                /*!< Horizon light. ICC profile PCS */
+    cmc_light_source_d55,                /*!< Mid-morning / mid-afternoon daylight */
+    cmc_light_source_d65,                /*!< Noon daylight. Television, sRGB color space */
+    cmc_light_source_d75,                /*!< North sky daylight */
+    cmc_light_source_e,                  /*!< Equal energy */
+    cmc_light_source_f1,                 /*!< Daylight fluorescent */
+    cmc_light_source_f2,                 /*!< Cool white fluorescent */
+    cmc_light_source_f3,                 /*!< White fluorescent */
+    cmc_light_source_f4,                 /*!< Warm white fluorescent */
+    cmc_light_source_f5,                 /*!< Daylight fluorescent */
+    cmc_light_source_f6,                 /*!< Lite white fluorescent */
+    cmc_light_source_f7,                 /*!< D65 simulator, daylight simulator */
+    cmc_light_source_f8,                 /*!< D50 simulator, Sylvania F40 Design 50 */
+    cmc_light_source_f9,                 /*!< Cool white deluxe fluorescent */
+    cmc_light_source_f10,                /*!< Philips TL85, Ultralume 50 */
+    cmc_light_source_f11,                /*!< Philips TL84, Ultralume 40 */
+    cmc_light_source_f12                 /*!< Philips TL83, Ultralume 30 */
+} cmc_light_source;
+#define CMC_NUM_LIGHTSOURCES 20u
+
+/*!
+ * \brief PD sensor type enumeration.
+ */
+typedef enum {
+    cmc_pd_sensor_type_non_pd = 0,        /*!< Non-PD sensor */
+    cmc_pd_sensor_type_1,                 /*!< Type 1 (All processing done on sensor) */
+    cmc_pd_sensor_type_2,                 /*!< Type 2 (PD extraction on sensor, statistics processing in IPU) */
+    cmc_pd_sensor_type_3                  /*!< Type 3 (All processing done in IPU) */
+} cmc_pd_sensor_type;
+
+/*!
+ * \brief PD technology type enumeration.
+ */
+typedef enum {
+    cmc_pd_technology_type_metal_shield = 0,        /*!< Metal shield-based PD */
+    cmc_pd_technology_type_dual_photodiode,         /*!< Dual photodiode-based PD */
+    cmc_pd_technology_type_wide_microlens           /*!< Wide microlens-based PD */
+} cmc_pd_technology_type;
+
+/*!
+ * \brief CMC gdc mode type enumeration.
+ */
+typedef enum {
+    cmc_gdc_mode_grid,    /*!< CMC GDC Grid mode */
+    cmc_gdc_mode_lut,     /*!< CMC GDC Look-up Table mode */
+    cmc_gdc_mode_extlut   /*!< CMC GDC Look-up Table from External Tool mode */
+} cmc_gdc_mode_type;
+
+/*!
+ * \brief CMC Comment
+ */
+typedef struct
+{
+    ia_mkn_record_header header; /*!< Record header with Format ID: UInt8 (See AIQB_DataID), Name ID: cmc_name_id_comment (See cmc_name_id). */
+    uint8_t project_id[16];      /*!< NULL terminated Project ID string. Date format: yymmddHHMMSSFFF. For example: 1202201823444. */
+/*    uint8_t comment[];          / *!< Free C string text comment (NULL terminated). Must end at 64 bit alignment. * / */
+} cmc_comment_t;
+#define SIZEOF_CMC_COMMENT_T 24
+
+/*!
+ * \brief CMC General Data
+ */
+typedef struct
+{
+    ia_mkn_record_header header;        /*!< Record header with Format ID: Uint16 (See AIQB_DataID) Name ID: cmc_name_id_general_data. (enum cmc_name_id). */
+    uint16_t width;                     /*!< Sensor native maximum width. */
+    uint16_t height;                    /*!< Sensor native maximum height. */
+    uint16_t bit_depth;                 /*!< Sensor native maximum bit depth (after sensor linearization). For HDR sensor, this is the bit depth after stitching. */
+    uint16_t color_order;               /*!< Sensor color order in native orientation. */
+    uint16_t bit_depth_packed;          /*!< Sensor native maximum bit depth (before sensor linearization = packed) . */
+    uint8_t sve_pattern[16];            /*!< 4x4 pixel pattern. 0 means shortest exposure time and n the longest. */
+    uint16_t single_exposure_bit_depth; /*!< Sensor native maximum bit depth for single (non-stitched) exposure. */
+} cmc_general_data_t;
+#define SIZEOF_CMC_GENERAL_DATA_V100_T 16
+#define SIZEOF_CMC_GENERAL_DATA_V101_T 18
+#define SIZEOF_CMC_GENERAL_DATA_V102_T 34
+#define SIZEOF_CMC_GENERAL_DATA_V103_T 36
+
+/*!
+ * \brief CMC Black Level
+ * - Global black level compensation.
+ */
+typedef struct
+{
+    uint32_t exposure_time;              /*!< Exposure time. */
+    uint32_t analog_gain;                /*!< Analog gain. */
+    cmc_color_channels color_channels;     /*!< Color channel correction for given exposure time and analog gain. */
+} cmc_black_level_lut_t;
+#define SIZEOF_CMC_BLACK_LEVEL_LUT_T 16
+
+typedef struct
+{
+    ia_mkn_record_header header;     /*!< Record header with Format ID: Custom (See AIQB_DataID) Name ID: cmc_name_id_black_level. (enum cmc_name_id). */
+    uint32_t num_bl_luts;            /*!< Number of black level lookup tables (number of analog gain * number of exposures).  */
+/*    cmc_black_level_lut_t bl_luts[]; / *!< Lookup tables for black level correction. * / */
+} cmc_black_level_t;
+#define SIZEOF_CMC_BLACK_LEVEL_T 12
+
+/*!
+* \brief CMC for global black Level
+* - Global black level compensation for 4x4 sensors.
+*/
+typedef struct
+{
+    uint32_t exposure_time;         /*!< Exposure time in microseconds. */
+    float total_gain;               /*!< Total gain (including both analog and digital gains). */
+    float black_level[4][4];        /*!< Black level correction for given exposure time and total gain. */
+} cmc_black_level_values;
+
+typedef struct
+{
+    ia_mkn_record_header header;             /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_black_level_global (See cmc_name_id). */
+    uint32_t num_bl_luts;                    /*!< Number of black level lookup tables (number of analog gain * number of exposures).  */
+    uint32_t padding;                        /* Ensures that next 64 bit variable starts from 64 bit boundary. */
+    union {
+        cmc_black_level_values *ptr;         /*!< Array of global black level values as function of exposure time and gain. Array length is defined by num_bl_luts. */
+        uint64_t dummy;                      /* Ensures that pointer is accessible in both 32 and 64 bit systems. */
+    } bl_values;
+} cmc_black_level_global;
+
+/*!
+ * \brief CMC Saturation Level
+ * - Defined for each color channels.
+ * - Absolute pixel values using native max bit depth.
+ */
+typedef struct
+{
+    ia_mkn_record_header header; /*!< Record header with Format ID: UInt16 (See AIQB_DataID) Name ID: cmc_name_id_saturation_level. (enum cmc_name_id). */
+    uint16_t saturation_cc1;     /*!< Saturation level of 1st color channel. */
+    uint16_t saturation_cc2;     /*!< Saturation level of 2nd color channel. */
+    uint16_t saturation_cc3;     /*!< Saturation level of 3rd color channel. */
+    uint16_t saturation_cc4;     /*!< Saturation level of 4th color channel. */
+} cmc_saturation_level_t;
+#define SIZEOF_CMC_SATURATION_LEVEL_T 16
+
+/*!
+ * \brief CMC Pixel Dynamic Range And Linearity
+ */
+typedef struct
+{
+    ia_mkn_record_header header; /*!< Record header with Format ID: Custom (See AIQB_DataID) Name ID: cmc_name_id_dynamic_range_and_linearity. (enum cmc_name_id). */
+    uint32_t dynamic_range;      /*!< Pixel dynamic range in dB. */
+    uint8_t num_linearity_cc1;   /*!< Number of points in color channel 1 linearity lookup table. */
+    uint8_t num_linearity_cc2;   /*!< Number of points in color channel 2 linearity lookup table. */
+    uint8_t num_linearity_cc3;   /*!< Number of points in color channel 3 linearity lookup table. */
+    uint8_t num_linearity_cc4;   /*!< Number of points in color channel 4 linearity lookup table. */
+/*    uint16_t lut_linearities[]; / *!< Linearity lookup table for color channels in order: Ch1, Ch2, Ch3 and Ch4. * / */
+} cmc_linearity_t;
+#define SIZEOF_CMC_LINEARITY_T 16
+
+/*!
+ * \brief CMC Module Sensitivity
+ */
+typedef struct
+{
+    ia_mkn_record_header header; /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_module_sensitivity (See cmc_name_id). */
+    uint16_t base_iso;           /*!< Base ISO value of the camera module. */
+} cmc_sensitivity_t;
+#define SIZEOF_CMC_SENSITIVITY_T 10
+
+/*!
+ * \brief CMC Defect Pixels
+ */
+typedef struct
+{
+    ia_mkn_record_header header; /*!< Record header with Format ID: ??? (See AIQB_DataID), Name ID: cmc_name_id_defect_pixels (See cmc_name_id). */
+    uint16_t not_defined;        /*!<  */
+} cmc_defect_pixel_t;
+#define SIZEOF_CMC_DEFECT_PIXEL_T 10
+
+/*!
+ * \brief CMC Noise
+ */
+typedef struct
+{
+    ia_mkn_record_header header;       /*!< Record header with Format ID: Float (See AIQB_DataID), Name ID: cmc_name_id_noise (See cmc_name_id). */
+    float noise_model_coefficients[5]; /*!< Noise model coefficients (c1..5) in equation y = c1*x^2 + Gain*c2*x + Gain^2*c3 + Gain*c4 + c5.
+                                            Gain is sum of gain applied to pixel (DG and AG), x is the normalized mean (pixel value), and y is the variance. */
+    int reserved;                      /*!< Reserved for alignment. Always 0. */
+} cmc_noise;
+
+typedef struct
+{
+    uint16_t source_type;      /*!< Light source type (enum), e.g. Fluorescent. */
+    uint16_t correction_level; /*!< Luminance correction level. */
+    cie_coords_t cie_coords;   /*!< CIE x and y coordinates. */
+/*    uint16_t lsc_grid[];       / *!< LSC Grid. * / */
+} cmc_lsc_grid_t;
+#define SIZEOF_CMC_LSC_GRID_T 8
+
+/*!
+ * \brief CMC_Lens Shading Correction
+ * - Full native FOV
+ * - Absolute gain values
+ * - 100% color shading correction
+ * - x% grid "divided by" NVM_calibration_grid (=ratio) - if no NVM use ones
+ */
+typedef struct
+{
+    ia_mkn_record_header header; /*!< Record header with Format ID: Custom (See AIQB_DataID), Name ID: cmc_name_id_lens_shading_correction (See cmc_name_id). */
+    uint16_t lsc_level;          /*!< LSC level enumeration. */
+    uint16_t num_grids;          /*!< Number of LSC grids. */
+    uint16_t grid_width;         /*!< LSC Grid width. */
+    uint16_t grid_height;        /*!< LSC Grid height. */
+/*  cmc_lsc_grid_t lsc_grids[]; / *!< LSC grids. * / */
+} cmc_lens_shading_t;
+#define SIZEOF_CMC_LENS_SHADING_T 16
+
+typedef struct
+{
+    uint16_t pair_index;       /*!< Calibration light source pair index. */
+    uint16_t source_type;      /*!< Light source type (enum), e.g. Fluorescent. */
+    uint16_t correction_level; /*!< Luminance correction level. */
+    cie_coords_t cie_coords;   /*!< CIE x and y coordinates. */
+/*    uint16_t lsc_grid[];       / *!< LSC Grid. * / */
+} cmc_lsc_ratio_grid_t;
+#define SIZEOF_CMC_LSC_RATIO_GRID_T 10
+
+/*!
+ * \brief Lens Shading Correction Ratio
+ */
+typedef struct
+{
+    ia_mkn_record_header header;      /*!< Record header with Format ID: Custom (See AIQB_DataID), Name ID: cmc_name_id_lens_shading_correction_ratio (See cmc_name_id). */
+    uint16_t num_grids;               /*!< Number of LSC grids. */
+    uint16_t grid_width;              /*!< LSC Grid width. */
+    uint16_t grid_height;             /*!< LSC Grid height. */
+/*    cmc_lsc_ratio_grid_t lsc_grids[]; / *!< LSC grids. * / */
+} cmc_lens_shading_ratio_t;
+#define SIZEOF_CMC_LENS_SHADING_RATIO_T 14
+
+/*!
+ * \brief CMC Geometric Distortion Correction
+ */
+typedef struct
+{
+    ia_mkn_record_header header; /*!< Record header with Format ID: Float (See AIQB_DataID), Name ID: cmc_name_id_geometric_distortion_correction (See cmc_name_id). */
+    float gdck1;                 /*!<  1st order radial distortion coefficient. */
+    float gdck2;                 /*!<  2nd order radial distortion coefficient. */
+    float gdck3;                 /*!<  3rd order radial distortion coefficient. */
+    float gdcp1;                 /*!<  1st order tangential distortion coefficient. */
+    float gdcp2;                 /*!<  2nd order tangential distortion coefficient. */
+} cmc_geometric_distortion_t;
+#define SIZEOF_CMC_GEOMETRIC_DISTORTION_T 28
+
+/*!
+ * \brief CMC Optics and Mechanics
+ */
+typedef struct
+{
+    ia_mkn_record_header header;                         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_optics_and_mechanics (See cmc_name_id). */
+    uint8_t actuator;                                    /*!< Actuator type (enum). */
+    uint8_t camera_module_orientation;                   /*!< Camera module orientation during the AF calibration (enum from Camera Module Orientation). */
+    uint16_t camera_actuator_features;                   /*!< Camera features list (flags from cmc_camera_feature enumeration). */
+    uint16_t nd_gain;                                    /*!< Neutral density filter gain. */
+    uint16_t effect_focal_length;                        /*!< Effective Focal Length, (mm * 100). */
+    uint16_t sensor_pix_size_v;                          /*!< Sensor pixel size Vertical, (um * 100). */
+    uint16_t sensor_pix_size_h;                          /*!< Sensor pixel size Horizontal, (um * 100). */
+    uint16_t sensor_width_pix_total;                     /*!< Sensor width in pixels, total. */
+    uint16_t sensor_height_pix_total;                    /*!< Sensor height in pixels, total. */
+    uint16_t lens_offset_up_to_horz;                     /*!< Lens displacement when module turns from Up to Horizontal, (um). */
+    uint16_t lens_offset_horz_to_down;                   /*!< Lens displacement when module turns from Horizontal to Down, (um). */
+    uint16_t range_inf_to_85mm;                          /*!< Optical range 'Inf - 8.5 cm', (um). */
+    uint16_t range_inf_to_100mm;                         /*!< Optical range 'Inf - 10 cm', (um). */
+    uint16_t range_inf_to_300mm;                         /*!< Optical range 'Inf - 30 cm', (um). */
+    uint16_t range_inf_to_500mm;                         /*!< Optical range 'Inf - 50 cm', (um). */
+    uint16_t range_inf_to_950mm;                         /*!< Optical range 'Inf - 95 cm', (um). */
+    uint16_t range_inf_to_1200mm;                        /*!< Optical range 'Inf - 120 cm', (um). */
+    uint16_t range_inf_to_hyperfocal;                    /*!< Optical range 'Inf - Hyperfocal', (um). */
+    uint16_t range_inf_to_calibration_distance_far;      /*!< Optical range 'Inf - calibration distance far', (um). */
+    uint16_t range_inf_to_calibration_distance_near;     /*!< Optical range 'Inf - calibration_distance_near', (um). */
+    uint16_t range_inf_to_min_focusing_distance;         /*!< Optical range 'Inf - calibration_distance_near', (um). */
+    uint16_t calibration_distance_far;                   /*!< Distance to supplier's FAR production calibration target, (cm). */
+    uint16_t calibration_distance_near;                  /*!< Distance to supplier's NEAR production calibration target, (cm). */
+    int16_t calibration_position_far;                    /*!< Supplier's FAR production calibration target in ACTUATOR UNITS, default (used in case NVM is not available).*/
+    int16_t calibration_position_near;                   /*!< Supplier's NEAR production calibration target in ACTUATOR UNITS,  default (used in case NVM is not available).*/
+    int32_t lens_range_limit;                            /*!< Maximum available value for the lens actuator. */
+    int32_t lens_actuator_offset;                        /*!< Permanent offset to lens actuator values. */
+    uint32_t lens_movement_time;                         /*!< Time (in us) needed to move the lens per single VC unit (if linear_lens_movement_time is 1). Total time needed per one lens move (if linear_lens_movement_time is 0)*/
+    uint16_t min_focus_distance;                         /*!< Minimum focusing distance, (cm). */
+    uint16_t num_apertures;                              /*!< Actual number of apertures, presented in camera. */
+} cmc_optomechanics_t;
+#define SIZEOF_CMC_OPTOMECHANICS    72
+
+/*!
+ * \brief CMC Module Spectral Response
+ */
+typedef struct
+{
+    ia_mkn_record_header header;          /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_module_spectral_response (See cmc_name_id). */
+    uint16_t min_wavelength;              /*!< Minimum wave length. */
+    uint16_t max_wavelength;              /*!< Maximum wave length. */
+    uint16_t wavelength_sampling_rate;    /*!< Wave length sampling rate. */
+/*    cmc_color_channels spectral_response[]; / *!< Module spectral response in order: Ch1,Ch2,Ch3 and Ch4. * / */
+} cmc_spectral_response_t;
+#define SIZEOF_CMC_SPECTRAL_RESPONSE 14
+
+/*!
+ * \brief Lightsource definition.
+ */
+typedef struct
+{
+    cie_coords_t cie_coords;           /*!< Light source CIE xy coordinates. */
+    chromaticity_t chromaticity_response; /*!< Avg Chromaticity response for R/G anf B/G.*/
+} cmc_lightsource_t;
+#define SIZEOF_CMC_LIGHTSOURCE_T 8
+
+/*!
+ * \brief CMC Chromaticity Response
+ */
+typedef struct
+{
+    ia_mkn_record_header header;      /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_chromaticity_response (See cmc_name_id). */
+    uint16_t num_lightsources;        /*!< Number of avg light sources. */
+    uint16_t num_nvm_lightsources;    /*!< Number of nvm light sources. */
+/*  cmc_lightsource_t lightsources[]; / *!< Lightsources in the order: avg, high and low. * / */
+} cmc_chromaticity_response_t;
+#define SIZEOF_CMC_CHROMATICITY_RESPONSE 12
+
+/*!
+ *  \brief Flash chromaticity responses for a point.
+ */
+typedef struct
+{
+    chromaticity_t flash_chromaticity_response;    /*!< Flash Chromaticity response, R/G and B/G */
+} cmc_poly_point_t;
+#define SIZEOF_CMC_POLY_POINT_T 4
+
+/*!
+ * \brief CMC Flash Chromaticity
+ */
+typedef struct
+{
+    ia_mkn_record_header header;        /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_flash_chromaticity (See cmc_name_id). */
+    chromaticity_t flash_avg_chromaticity; /*!< Flash chromaticity in R/G, B/G plane. */
+    uint16_t num_poly_points;           /*!< Number of points defining polygon. */
+/*    cmc_poly_point_t poly_point[];    / *!< Flash Chromaticity Deviation in R/G, B/G plane. * / */
+} cmc_flash_chromaticity_t;
+#define SIZEOF_CMC_FLASH_CHROMATICITY_T 14
+
+typedef struct
+{
+    cmc_light_source light_src_type; /*!< Light-source type. See enum cmc_light_source.  */
+    chromaticity_t chromaticity;     /*!< Chromaticity (sensor) in R/G, B/G plane. */
+    cie_coords_t cie_coords;      /*!< CIE x and y coordinates. */
+    int32_t matrix_accurate[9];   /*!< 3x3 accurate CCM, each 3 consequtive elemets sum to 1. */
+    int32_t matrix_preferred[9];  /*!< 3x3 preferred CCM, each 3 consequtive elemets sum to 1. */
+} cmc_color_matrix_t;
+#define SIZEOF_CMC_COLOR_MATRIX_T 84
+
+/*!
+ * \brief CMC Color matrices
+ */
+typedef struct
+{
+    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_color_matrices (See cmc_name_id). */
+    uint16_t num_matrices;               /*!< Number of color matrices. */
+/*    cmc_color_matrix_t color_matrices[]; / *!< Color matrices. * / */
+} cmc_color_matrices_t;
+#define SIZEOF_CMC_COLOR_MATRICES_T 10
+/*!
+ * \brief CMC NVM Info
+ */
+typedef struct
+{
+    ia_mkn_record_header header;      /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_nvm_info (See cmc_name_id). */
+    uint16_t nvm_parser_version;      /*!< Parser version for current camera module type */
+    uint16_t nvm_data_color_order;    /*!< NVM data color order */
+    uint16_t nvm_data_orientation;    /*!< NVM data orientation */
+} cmc_nvm_info_t;
+#define SIZEOF_CMC_NVM_INFO_T 14
+
+/*!
+ * \brief CMC NVM Info v101
+ */
+typedef struct
+{
+    uint16_t nvm_scaling_method;        /*!< NVM table scaling method. */
+} cmc_nvm_info_v101_t;
+#define SIZEOF_CMC_NVM_INFO_V101_T   2
+
+typedef struct
+{
+    cmc_nvm_info_t *cmc_nvm_info;           /*!< CMC NVM info data. */
+    cmc_nvm_info_v101_t *cmc_nvm_info_v101; /*!< CMC NVM info data v101. */
+} cmc_parsed_nvm_info_t;
+
+/*!
+ * \brief Analog gain to gain code mapping.
+ * Gains must be defined in ascending order.
+ */
+typedef struct
+{
+    uint32_t gain;                 /*!< Gain in fixed point format (16bit integer part + 16bit fraction part). */
+    uint32_t code;                 /*!< Code corresponding to gain. */
+} cmc_analog_gain_pair_t;
+#define SIZEOF_CMC_ANALOG_GAIN_PAIR_T 8
+
+/*!
+ * \brief Analog gain to gain code mapping of a segment.
+ * Segments contain SMIA analog gain parameters. When ranges is defined, beginning is always inclusive and end exclusive.
+ * For example analog gain 2.0 and ranges: [1.0, 2.0[; [2.0, 4.0[;. Analog gain 2.0 is not calculated from the first range parameters but from the second range.
+ */
+typedef struct
+{
+    uint32_t gain_begin;         /*!< Begin of gain of the segment (inclusive) in fixed point format (16bit integer part + 16bit fraction part). */
+    uint32_t gain_end;           /*!< End of gain of the segment (exclusive) in fixed point format (16bit integer part + 16bit fraction part). */
+    uint32_t code_min;           /*!< The minimum recommended setting for the analog gain control. */
+    uint32_t code_max;           /*!< The maximum recommended setting for the analog gain control. */
+    uint32_t code_step;          /*!< The precision of the analog gain control. */
+    int16_t M0;                  /*!< Gain code M0 as in SMIA. */
+    int16_t C0;                  /*!< Gain code C0 as in SMIA. */
+    int16_t M1;                  /*!< Gain code M1 as in SMIA. */
+    int16_t C1;                  /*!< Gain code C1 as in SMIA. */
+} cmc_analog_gain_segment_t;
+#define SIZEOF_CMC_ANALOG_GAIN_SEGMENT_T 28
+
+/*!
+ * \brief CMC Analog gain conversion types
+ * Enum defines different analog gain conversion types.
+ */
+typedef enum
+{
+    cmc_analog_gain_conversion_type_none,    /*!< No analog gain conversion should be done. */
+    cmc_analog_gain_conversion_type_segment, /*!< Segments contain SMIA compatible parameters for calculating register value for a certain range of analog gain. */
+    cmc_analog_gain_conversion_type_pair,    /*!< Pairs contain analog gain value & corresponding register value. */
+} cmc_analog_gain_conversion_type_t;
+
+/*!
+ * \brief CMC Analog gain conversion table
+ * Analog gain can be represented with n amount of gain code (register value) pairs/segments.
+ */
+typedef struct
+{
+    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_analog_gain_conversion (See cmc_name_id). */
+    uint16_t conversion_type;            /*!< Analog gain conversion type.  See cmc_analog_gain_conversion_type_t. */
+    uint16_t reserved;                   /*!< Reserved due to byte alignment. */
+    uint16_t num_segments;               /*!< Number of gain/code segments which describe the analog gain. */
+    uint16_t num_pairs;                  /*!< Number of gain/code pairs which describe the analog gain. */
+/*    cmc_analog_gain_segment_t gain_segments[]; */
+/*    cmc_analog_gain_pair_t gain_pairs[]; */
+} cmc_analog_gain_conversion_t;
+#define SIZEOF_CMC_ANALOG_GAIN_CONVERSION_T 16
+
+/*!
+ * \brief CMC Digital gain conversion types
+ * Enum defines different digital gain conversion types.
+ */
+typedef enum
+{
+    cmc_digital_gain_conversion_type_fixed_point, /*!< Digital gain is defined in fixed point format. */
+    cmc_digital_gain_conversion_type_pair,        /*!< Pairs contain digital gain value & corresponding register value. */
+} cmc_digital_gain_conversion_type_t;
+
+/*!
+ * \brief CMC digital gain limits and step.
+ */
+typedef struct
+{
+    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_digital_gain (See cmc_name_id). */
+    uint16_t digital_gain_min;           /*!< The minimum valid limit of the digital gain control parameters in fixed point format (16bit integer part + 16bit fraction part). */
+    uint16_t digital_gain_max;           /*!< The maximum valid limit of the digital gain control parameters in fixed point format (16bit integer part + 16bit fraction part). */
+    uint8_t digital_gain_step_size;      /*!< Step size of digital gain code register value. */
+    uint8_t digital_gain_fraction_bits;  /*!< Number of bits used for the fraction part of the 16 bit register value. */
+/*    cmc_digital_gain_v102_t dg_v102; */
+/*    cmc_analog_gain_pair_t dg_pairs[];*/
+} cmc_digital_gain_t;
+#define SIZEOF_CMC_DIGITAL_GAIN_T 14
+
+/*!
+ * \brief Defines additions to digital gain structure with gain/code pairs support.
+ */
+typedef struct
+{
+    uint16_t conversion_type;            /*!< Digital gain conversion type.  See cmc_digital_gain_conversion_type_t. */
+    uint16_t num_pairs;                  /*!< Number of gain/code pairs which describe the digital gain. */
+    uint16_t reserved;                   /*!< Not used at the moment. Reserved to ensure correct (32 bit) alignment. */
+} cmc_digital_gain_v102_t;
+#define SIZEOF_CMC_DIGITAL_GAIN_V102_T 6
+
+/*!
+ * \brief CMC Sensor exposure registers ranges.
+ */
+typedef struct
+{
+    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_exposure_range (See cmc_name_id). */
+    uint32_t coarse_integration_min;     /*!< Minimum sensor register value for coarse integration time. */
+    uint32_t coarse_integration_max;     /*!< Maximum sensor register value for coarse integration time.*/
+    uint32_t fine_integration_min;       /*!< Minimum sensor register value for fine integration time.*/
+    uint32_t fine_integration_max;       /*!< Maximum sensor register value for fine integration time.*/
+} cmc_exposure_range_t;
+#define SIZEOF_CMC_EXPOSURE_RANGE_T 24
+
+/*!
+ * \brief CMC Multiple LED flash chromaticity.
+ */
+typedef struct
+{
+    uint16_t device_id;                    /*!< Flash device ID enumerator. */
+    uint16_t num_poly_points;              /*!< Number of points defining polygon. */
+    chromaticity_t flash_avg_chromaticity; /*!< Flash chromaticity in R/G, B/G plane. */
+    cie_coords_t flash_avg_cie;            /*!< Flash chromaticity in CIE X, CIE Y plane. */
+    uint16_t reserved[2];                  /*!< Reserved for future changes. Always 0 (for now).. */
+    cmc_poly_point_t *poly_points;         /*!< Flash Chromaticity Deviation in R/G, B/G plane. */
+} cmc_flash_device_t;
+#define SIZEOF_CMC_FLASH_DEVICE_T 16     /*!< Size of the structure without pointers. Used in copying data from CPF to this structure. */
+
+typedef struct
+{
+    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_multi_led_flash_chromaticity (See cmc_name_id). */
+    uint16_t max_flash_output;           /*!< Flash maximum energy output for full power, lumen per second [lm/s] */
+    uint16_t multi_led_flash_mode;       /*!< Reserved for future changes. Always 0 (for now). */
+    uint16_t reserved;                   /*!< Reserved for future changes. Always 0 (for now). */
+    uint16_t num_flash_devices;          /*!< Number of flash devices/LEDs. */
+    cmc_flash_device_t *flash_devices;   /*!< Data of all flash devices. */
+} cmc_multi_led_flash_t;
+#define SIZEOF_CMC_MULTI_LED_FLASH_T 16  /*!< Size of the structure without pointers. Used in copying data from CPF to this structure. */
+
+typedef struct
+{
+    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_sensor_metadata (See cmc_name_id). */
+    uint16_t total_num_of_cfg_blocks;    /*!< Total number of config blocks (ia_emd_config_block_t). */
+    uint16_t total_num_of_data_blocks;   /*!< Total number of decoded data blocks (ia_emd_decoded_block_t). */
+    uint8_t num_of_exposure_sets;        /*!< Number of exposure sets in sensor embedded data. */
+    uint8_t num_of_color_channels;       /*!< Number of color channels in sensor embedded data. */
+    uint8_t max_num_of_faces;            /*!< Maximum number of faces in external ISP embedded data. */
+    uint8_t reserved;                    /*!< Reserved. */
+    /* ia_emd_config_block_t cfg_blocks[];*/   /*!< Configuration blocks array. */
+} cmc_emd_decoder_config_t;
+#define SIZEOF_CMC_EMD_DECODER_CONFIG_T  16 /*!< Size of cmc_emd_decoder_config_t without pointer. Used in copying data from CPF to this structure. */
+
+typedef struct
+{
+    uint8_t *key;                       /*!< Free C string text key (NULL terminated) */
+    uint8_t *version;                   /*!< Free C string text version (NULL terminated) */
+} cmc_version_info_t;
+
+typedef struct
+{
+    cmc_comment_t *cmc_comment;
+    uint8_t *comment;
+    uint16_t num_version_infos;
+    cmc_version_info_t *version_infos;
+} cmc_parsed_comment_t;
+
+typedef struct
+{
+    cmc_black_level_t *cmc_black_level;
+    cmc_black_level_lut_t *cmc_black_level_luts;
+} cmc_parsed_black_level_t;
+
+typedef struct
+{
+    cmc_linearity_t *cmc_linearity;
+    uint16_t *cmc_linearity_lut;
+} cmc_parsed_linearity_t;
+
+typedef struct
+{
+    cmc_lens_shading_t *cmc_lens_shading;
+    cmc_lsc_grid_t *cmc_lsc_grids;
+    uint16_t *lsc_grids;
+    chromaticity_t *cmc_lsc_rg_bg_ratios;  /* Sensor R/G B/G ratios, available in
+                                               cmc_name_id_lens_shading_correction v101. */
+} cmc_parsed_lens_shading_t;
+
+typedef struct
+{
+    cmc_lens_shading_ratio_t *cmc_lens_shading_ratio;
+    cmc_lsc_ratio_grid_t *cmc_lsc_ratio_grids;
+    uint16_t *lsc_grids;
+} cmc_parsed_lens_shading_ratio_t;
+
+typedef enum
+{
+    cmc_aperture_type_fixed = 0,          /*!< Aperture is fixed. */
+    cmc_aperture_type_dc_iris,            /*!< Aperture is controlled by DC-iris. */
+    cmc_aperture_type_p_iris,             /*!< Aperture is controlled by P-iris. */
+} cmc_aperture_type_t;
+
+typedef struct
+{
+    int16_t cmc_dac_min;        /*!< Minimum value of the DA-converter (will close the iris). */
+    int16_t cmc_dac_hold;       /*!< A value for DA-converter that will hold the iris ("barely open or barely close"). */
+    int16_t cmc_dac_max;        /*!< Maximum value of the DA-converter (will open the iris). */
+} cmc_dc_iris_dac_t;
+
+typedef struct
+{
+    cmc_optomechanics_t *cmc_optomechanics;
+    uint16_t *lut_apertures;
+    uint16_t aperture_type;         /*!< Aperture type control of type cmc_aperture_type_t, v101 and onwards. */
+    cmc_dc_iris_dac_t dc_iris_dac;  /*!< DAC values for DC-iris, v102 and onwards. */
+} cmc_parsed_optics_t;
+
+typedef struct
+{
+    cmc_spectral_response_t *cmc_spectral_response;
+    cmc_color_channels *spectral_responses;
+} cmc_parsed_spectral_response_t;
+
+/*!
+ * \brief CMC Gamut.
+ */
+typedef struct
+{
+    uint16_t light_source;               /*!< Light source type (0 if not known). */
+    uint16_t r_per_g;                    /*!< Gamut achromatic point R per G (white balance gains for given gamut).*/
+    uint16_t b_per_g;                    /*!< Gamut achromatic point R per G (white balance gains for given gamut).*/
+    uint16_t CIE_x;                      /*!< Illumination CIE x coordinate.*/
+    uint16_t CIE_y;                      /*!< Illumination CIE x coordinate.*/
+    uint16_t size;                       /*!< Size of the gamut tables.*/
+    uint16_t *gamut_r_per_g;             /*!< Illumination gamut (convex hull). R per g points in clockwise order*/
+    uint16_t *gamut_b_per_g;             /*!< Illumination gamut (convex hull). R per g points in clockwise order*/
+} cmc_gamut_t;
+#define SIZEOF_CMC_GAMUT_T 12
+
+typedef struct
+{
+    uint16_t num_illumination_gamuts;   /*!< Number of illumination gamuts */
+    cmc_gamut_t *cmc_gamut;
+} cmc_chromaticity_response_v101_t;
+#define SIZEOF_CMC_CHROMATICITY_RESPONSE_V101 2
+
+/*!
+ * \brief Parametric model coefficients for the average chromaticity locus and CCT curve
+ */
+typedef struct
+{
+    float locus_model[4];
+    float cct_model[3];
+} cmc_locus_t;
+
+typedef struct
+{
+    cmc_chromaticity_response_t *cmc_chromaticity_response;
+    cmc_chromaticity_response_v101_t *cmc_chromaticity_response_v101;
+    cmc_locus_t *cmc_locus;
+    cmc_lightsource_t *cmc_lightsources_avg;
+    cmc_lightsource_t *cmc_lightsources_hi;
+    cmc_lightsource_t *cmc_lightsources_lo;
+    cmc_lightsource_t *cmc_lightsources_nvm;
+} cmc_parsed_chromaticity_response_t;
+
+typedef struct
+{
+    cmc_flash_chromaticity_t *cmc_flash_chromaticity;
+    cmc_poly_point_t *cmc_poly_points;
+} cmc_parsed_flash_chromaticity_t;
+
+typedef enum
+{
+    ccm_estimate_method_bypass,     /*!< Return unity CCM matrix. */
+    ccm_estimate_method_wp,         /*!< Return CCM matrix using only white point estimate from AWB. */
+    ccm_estimate_method_wp_sa,      /*!< Return CCM matrix using both white point estimate from AWB and Shading Adaptor Results. */
+} ccm_estimate_method_t;
+
+typedef struct
+{
+    cmc_color_matrices_t *cmc_color_matrices;
+    cmc_color_matrix_t *cmc_color_matrix;
+    uint16_t *ccm_estimate_method;              /*!< ccm_estimate_method for interpolation -> ccm_estimate_method_t */
+} cmc_parsed_color_matrices_t;
+
+typedef struct
+{
+    cmc_analog_gain_conversion_t *cmc_analog_gain_conversion;
+    cmc_analog_gain_segment_t *cmc_analog_gain_segments;
+    cmc_analog_gain_pair_t *cmc_analog_gain_pairs;
+} cmc_parsed_analog_gain_conversion_t;
+
+/*!
+ * \brief Gain to gain code mapping.
+ * Gains must be defined in ascending order.
+*/
+typedef struct
+{
+    float gain;                         /*!< Gain in floating point format. */
+    uint32_t code;                      /*!< Code corresponding to gain. */
+} cmc_gain_code_pair_t;
+
+/*!
+ * \brief Gain to gain code mapping of a segment.
+ * Segments contain SMIA gain parameters. When ranges is defined, beginning is always inclusive and end exclusive.
+ * For example gain 2.0 and ranges: [1.0, 2.0[; [2.0, 4.0[;. Gain 2.0 is not calculated from the first range parameters but from the second range.
+ */
+typedef struct
+{
+    float gain_begin;                   /*!< Begin of gain of the segment (inclusive) in floating point format. */
+    float gain_end;                     /*!< End of gain of the segment (exclusive) in floating point format. */
+    uint32_t code_min;                  /*!< The minimum recommended setting for the gain control. */
+    uint32_t code_max;                  /*!< The maximum recommended setting for the gain control. */
+    uint32_t code_step;                 /*!< The precision of the gain control. */
+    int16_t M0;                         /*!< Gain code M0 as in SMIA. */
+    int16_t C0;                         /*!< Gain code C0 as in SMIA. */
+    int16_t M1;                         /*!< Gain code M1 as in SMIA. */
+    int16_t C1;                         /*!< Gain code C1 as in SMIA. */
+    uint32_t padding;                   /*!< Padding to 64-bit boundary. */
+} cmc_gain_segment_t;
+
+typedef struct
+{
+    cmc_digital_gain_t *cmc_digital_gain;
+    cmc_digital_gain_v102_t *cmc_digital_gain_v102;
+    cmc_analog_gain_pair_t *cmc_digital_gain_pairs;
+} cmc_parsed_digital_gain_t;
+
+typedef enum
+{
+    cmc_gain_type_invalid = -1,     /*!< Invalid gain. */
+    cmc_gain_type_analog_gain = 0,  /*!< Analog gain. */
+    cmc_gain_type_digital_gain,     /*!< Digital gain. */
+    cmc_gain_type_conversion_gain,  /*!< Conversion gain for HDR sensors. */
+    cmc_gain_type_isp_gain,         /*!< Gain applied in ISP. */
+} cmc_gain_type_t;
+
+#ifndef IA_CMC_GAINS_MAX_NUM
+/* TODO: Use definition from ia_configuration.h */
+/* Windows driver and imaging system simulators don't include ia_configuration.h correctly. */
+#define IA_CMC_GAINS_MAX_NUM 4
+#endif
+
+typedef enum
+{
+    cmc_gain_conversion_type_none,          /*!< No gain conversion should be done. */
+    cmc_gain_conversion_type_segment,       /*!< Segments contain SMIA compatible parameters for calculating register value for a certain range of gain. */
+    cmc_gain_conversion_type_pair,          /*!< Pairs contain gain value & corresponding register value. */
+    cmc_gain_conversion_type_fixed_point,   /*!< Gain is defined in fixed point format. */
+} cmc_gain_conversion_type_t;
+
+typedef struct
+{
+    uint16_t gain_min;           /*!< The minimum valid limit of the gain control parameters in fixed point format (16bit integer part + 16bit fraction part). */
+    uint16_t gain_max;           /*!< The maximum valid limit of the gain control parameters in fixed point format (16bit integer part + 16bit fraction part). */
+    uint16_t gain_step_size;      /*!< Step size of gain code register value. */
+    uint16_t fraction_bits;       /*!< Number of bits used for the fraction part of the 16 bit register value. */
+} cmc_gain_fixed_t;
+
+typedef struct
+{
+    cmc_gain_type_t gain_type;                  /*!< Gain type. */
+    cmc_gain_conversion_type_t conversion_type; /*!< Gain conversion type. */
+    uint32_t num_segments;                      /*!< Number of gain/code segments which describe the gain. */
+    uint32_t num_pairs;                         /*!< Number of gain/code pairs which describe the gain. */
+    union
+    {
+        cmc_gain_segment_t *ptr;                /*!< Array of gain segments. Array length is defined by num_segments. */
+        uint64_t dummy;                         /* Ensures that pointer is accessible in both 32 and 64 bit systems. */
+    } segments;
+    union
+    {
+        cmc_gain_code_pair_t *ptr;              /*!< Array of gain code pairs. Array length is defined by num_pairs. */
+        uint64_t dummy;                         /* Ensures that pointer is accessible in both 32 and 64 bit systems. */
+    } pairs;
+    union
+    {
+        cmc_gain_fixed_t *ptr;                  /*!< A pointer to the fixed point format. */
+        uint64_t dummy;                         /* Ensures that pointer is accessible in both 32 and 64 bit systems. */
+    } fixed;
+} cmc_gain_conversion_t;
+
+typedef struct
+{
+    ia_mkn_record_header header;        /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_multi_gain_conversions (See cmc_name_id). */
+    uint32_t num_gains;                 /*!< Number of gains configured. */
+    uint32_t padding;
+    union
+    {
+        cmc_gain_conversion_t* ptr;     /*!< Array of gain conversions. Array length defined in num_gains. */
+        uint64_t dummy;                 /* Ensures that pointer is accessible in both 32 and 64 bit systems. */
+    } gains;
+    uint64_t reserved;                  /* Reserved for record version updates. */
+} cmc_multi_gain_conversions_t;
+
+/*!
+* \brief CMC geometric distortion correction grids
+*/
+typedef struct
+{
+    uint16_t focus_position;             /*!< Focus motor position in terms of those used by the sensor module.
+                                         Range should be depicted from the cmc_name_id_optics_and_mechanics section in the CPFF.). */
+    int32_t *x_deltas;                  /*!< Table of x-axis deltas of the grid points. The delta at each point represents the distortion
+                                        that was done. Contains [GDC_grid_height  x GDC_grid_width] values. */
+    int32_t *y_deltas;                  /*!< Table of y-axis deltas of the grid points. The delta at each point represents the distortion
+                                        that was done. Contains [GDC_grid_height  x GDC_grid_width] values. */
+} cmc_geometric_distortion2_grid_t;
+
+typedef struct
+{
+    int32_t focalLength;            /*!< Focal length in terms of those used by the camera module.Range should be depicted from the CMC_OpticsAndMechanics section in the CPFF.*/
+    int32_t ldc_r_lut[256];         /*!< LDC(R) LUT table*/
+    int32_t ldc_r_x_center;         /*!< X coordinate of LDC(R) correction center of symmetry */
+    int32_t ldc_r_y_center;         /*!< Y coordinate of LDC(R) correction center of symmetry */
+    int32_t ldc_r_y_scale_factor;   /*!< Y coordinate scaling factor for elliptical distortion of LDC(R) correction */
+} cmc_ldc_lut_t;
+
+/*!
+ * \brief LDC LUT mode
+ */
+typedef enum {
+    cmc_camera_ldc_lut_type_incident_angle_vs_distorted_radius = 0,  /*!< incident angle vs Rd */
+    cmc_camera_ldc_lut_type_undistorted_radius_vs_distorted_radius,  /*!< 1-> Ru vs Rd */
+} cmc_camera_ldc_lut_mode_t;
+
+
+/*!
+ * \brief CMC WFOV LDC parameters
+ */
+
+typedef struct
+{
+    float focal_length;            /*!< Focal length in terms of those used by the camera module.Range should be depicted from the CMC_OpticsAndMechanics section in the CPFF.*/
+    float max_fov_lut;            /*!< Max incident angle (in degrees) covered in the LUT.*/
+    cmc_camera_ldc_lut_mode_t lut_mode;    /*!< LDC LUT mode: 0 -> incident angle vs Rd, 1-> Ru vs Rd*/
+    int32_t num_lut_elements;     /*!< Number of LUT elements.*/
+    float *ldc_r_lut;             /*!< LDC(R) LUT table in pixels*/
+} cmc_wfov_ldc_lut_t;
+
+
+/*!
+ * \brief CMC WFOV calibration parameters
+ */
+typedef struct
+{
+    float horizontal_shift;         /*!< Horizontal shifts in pixels */
+    float vertical_shift;           /*!< Vertical shifts in pixels */
+    float horizontal_foclen_fact;   /*!< Horizontal focal length factor */
+    float vertical_foclen_fact;     /*!< Vertical focal length factor */
+    float horizontal_shear;         /*!< Horizontal shear factor */
+    float vertical_shear;           /*!< Vertical shear factor */
+} cmc_affine_params_t;
+#define SIZEOF_CMC_AFFINE_PARAMS (24)
+
+typedef struct
+{
+    int16_t ldc_col_start;                             /*!< Table X offset in pixels from left corner of the sensor maximum visible area e.g.
+                                                       If GDC_col_start=GDC_block_width*(-1) then GDC table offset is is one block left compared
+                                                       to the maximum visible sensor area. */
+    int16_t ldc_row_start;                             /*!< Table Y offset in pixels from upper corner of the sensor maximum visible area e.g.
+                                                       If GDC_row_start=GDC_block_height*(-1) then GDC table offset is is one block up compared
+                                                       to the maximum visible sensor area.  */
+    int16_t ldc_grid_width;                            /*!< Indicates number of grid vertices on the horizontal axis. */
+    int16_t ldc_grid_height;                           /*!< Indicates number of grid vertices on the vertical axis. */
+    int16_t ldc_block_width;                           /*!< Average width of the grid cell in pixel count. */
+    int16_t ldc_block_height;                          /*!< Average height of the grid cell in pixel count. */
+    uint16_t ldc_grid_count;                           /*!< Number of LDC grids (focus positions). */
+    cmc_gdc_mode_type gdc_mode;                        /*!< GDC mode enum, 0=Grid based (old),  1=LUT, 2=ext-LUT. */
+    int32_t ldc_lut_count;                             /*!< Number of LDC Luts (focal lengths) */
+    int32_t spherical_r_lut[256];                      /*!< R-spherical LUT table for spherical to Cartesian coordinate system transformation (dewarping) */
+    int32_t spherical_r_lut_radius_start;              /*!< R-spherical LUT table starting radius, 0-65535 */
+    int32_t spherical_r_lut_radius_end;                /*!< R-spherical LUT table ending radius, 0-65535 */
+    int32_t spherical_to_cartesian_x_center;           /*!< X coordinate of spherical to Cartesian coordinate system transformation (dewarping), 0-65535 */
+    int32_t spherical_to_cartesian_y_center;           /*!< Y coordinate of spherical to Cartesian coordinate system transformation (dewarping), 0-65535 */
+    cmc_geometric_distortion2_grid_t* ldc_grid;        /*!< LDC grids (legacy) */
+    cmc_ldc_lut_t* ldc_lut;                            /*!< LDC LUTs */
+    float max_fov_lens;                                /*!< Max field of view of the lens(degrees) */
+    int32_t num_wfov_luts;                             /*!< Number of WFOV Luts (focal lengths) */
+    cmc_wfov_ldc_lut_t *wfov_ldc_lut;                  /*!< WFOV LDC LUTs: Number of LUTs specified by num_wfov_luts */
+    cmc_affine_params_t *affine_params;                /*!< WFOV affine parameters: One for each LUT */
+} cmc_parsed_geometric_distortion2_t;
+#define SIZEOF_CMC_GEOMETRIC_DISTORTION_V100_T 22
+#define SIZEOF_CMC_GEOMETRIC_DISTORTION_SPHERICAL_R_LUT 1024 /* 256 * 4 */
+#define SIZEOF_CMC_GEOMETRIC_DISTORTION_SPHERICAL_CFG_PARAMS 16
+
+
+
+/*!
+ * \brief CMC advanced color matrix info
+ */
+typedef struct
+{
+    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: CMC_GeometricDistortion2 (See cmc_name_id). */
+    uint16_t light_sources_count;        /*!< Number of light sources. */
+    uint16_t sector_count;               /*!< Number of color matrix sectors.  */
+} cmc_advanced_color_matrix_info_t;
+#define SIZEOF_CMC_ADVANCED_COLOR_MATRIX_INFO_T 12
+
+/*!
+ * \brief CMC color matrix
+ */
+typedef struct
+{
+    float color_matrix[9];                 /*!< 3x3 accurate CCM, each consequtive elements sum to 1. */
+} cmc_acm_color_matrix_t;
+#define SIZEOF_CMC_ACM_COLOR_MATRIX_T 36
+
+/*!
+ * \brief CMC advanced color matrices info for light sources
+ */
+typedef struct
+{
+    uint32_t src_type;                   /*!< Light source type (enum), e.g. Fluorescent. */
+    float chromaticity[2];               /*!< Chromaticity (sensor) in R/G, B/G plane. */
+    float src_cie_xy[2];                 /*!< CIE x and y coordinates. */
+} cmc_acm_color_matrices_info_t;
+#define SIZEOF_CMC_ACM_COLOR_MATRICES_INFO_T 20
+
+typedef struct
+{
+    cmc_acm_color_matrices_info_t *color_matrices_info;         /*! < Information for Color matrices. */
+    cmc_acm_color_matrix_t traditional_color_matrix;            /*! < Color matrix optimized using all sectors. */
+    cmc_acm_color_matrix_t *advanced_color_matrices;            /*! < Array of color matrices. Array size is sector_count */
+} cmc_parsed_advanced_color_matrices_ls_t;
+
+typedef struct
+{
+    cmc_advanced_color_matrix_info_t *cmc_advanced_color_matrix_info;
+    uint32_t *hue_of_sectors;                                                       /*! < Starting hue angle array of sectors. Array size is sector_count. */
+    cmc_parsed_advanced_color_matrices_ls_t *cmc_parsed_advanced_color_matrices_ls; /*! < Array of color matrices
+                                                                                          for different light sources.
+                                                                                          Array size is light_sources_count. */
+} cmc_parsed_advanced_color_matrix_t;
+
+typedef struct
+{
+    float min;    /*!< The minimum allowed ratio for the parameter. */
+    float max;    /*!< The maximum allowed ratio for the parameter. */
+} cmc_hdr_param_ratio_limit_t;
+
+/*!
+ *  CMC HDR ratio limits.
+ */
+typedef struct
+{
+    cmc_hdr_param_ratio_limit_t hdr_exposure_time_ratio_limits; /*!< Allowed ratio between exposure times. */
+    cmc_hdr_param_ratio_limit_t hdr_analog_gain_ratio_limits;   /*!< Allowed ratio between analog gains. */
+    cmc_hdr_param_ratio_limit_t hdr_digital_gain_ratio_limits;  /*!< Allowed ratio between digital gains. */
+} cmc_hdr_ratio_limits_t;
+
+/*!
+* \brief CMC HDR Parameters
+*/
+typedef struct
+{
+    ia_mkn_record_header header;    /*!< Record header with Format ID: Uint16 (See AIQB_DataID) Name ID: cmc_name_id_hdr. */
+    float hdr_exposure_ratio_min;   /*!< Minimum HDR exposure ratio between different exposures. */
+    float hdr_exposure_ratio_max;   /*!< Maximum HDR exposure ratio between different exposures. */
+
+    cmc_hdr_ratio_limits_t overall_ratio_limits;    /*!< v101. Ratio limits between the longest and shortest exposure. */
+    cmc_hdr_ratio_limits_t pair_ratio_limits;       /*!< v101. Ratio limits between exposure pairs. */
+} cmc_parsed_hdr_parameters_t;
+
+#define SIZEOF_CMC_HDR_T        16
+#define SIZEOF_CMC_HDR_V101_T   (2*(uint32_t)sizeof(cmc_hdr_ratio_limits_t))
+
+typedef enum
+{
+    ir_correction_level_bypass,     /*!< Set PA IR Weight grid pointer as NULL. */
+    ir_correction_level_wp,         /*!< Interpolate IR Weight grid using only white point estimate from AWB. */
+} ir_correction_level_t;
+
+/*!
+* \brief CMC IR Weight Grids Parameters
+*/
+typedef struct
+{
+    ia_mkn_record_header header;    /*!< Record header with Format ID: Uint16 (See AIQB_DataID) Name ID: cmc_name_id_hdr. */
+    int8_t grid_indices[16];        /*!< IR Weight grid indices showing which tables in the structure holds information. -1 means no correction for that pixel */
+    uint16_t num_light_sources;     /*!< Number of light sources for which IR Weight Grids are characterized . */
+    uint16_t num_grids;             /*!< Number of grids per light source. This depends on the CFA type and non -1 elements in  . */
+    uint16_t grid_width;            /*!< IR Weight Grid width. */
+    uint16_t grid_height;           /*!< IR Weight Grid height. */
+}
+cmc_ir_weight_info_t;
+#define SIZEOF_CMC_IR_WEIGHT_INFO_T 32
+
+
+typedef struct
+{
+    cmc_light_source source_type;    /*!< Light-source type. See enum cmc_light_source.  */
+    float chromaticity[2];          /*!< Chromaticity (sensor) in R/G, B/G plane. */
+    float cie_coords[2];            /*!< CIE x and y coordinates. */
+} cmc_ir_weight_grid_info_t;
+#define SIZEOF_CMC_IR_WEIGHT_GRID_INFO_T 20
+
+typedef struct
+{
+    cmc_ir_weight_grid_info_t *ir_weight_grid_info;     /*!< IR Weight Grid Info. */
+    uint16_t *ir_weight_grid;        /*!< IR Weight Grids for all channels. */
+}
+cmc_ir_weight_grids_t;
+
+typedef struct
+{
+    float ir_proportion;            /*!< IR and green pixel proportion in sensor plane, */
+    float reserved[3];              /*!< Reserved. */
+}
+cmc_ir_proportion_t;
+#define SIZEOF_CMC_IR_PROPORTION_V101_T   ((uint32_t)sizeof(cmc_ir_proportion_t))
+
+typedef struct
+{
+    cmc_ir_weight_info_t *ir_weight_info;       /*!< IR Weight Info . */
+    cmc_ir_weight_grids_t *ir_weight_grids;     /*!< IR Weight Grids. */
+    cmc_ir_proportion_t *ir_proportion;         /*!< v101. */
+}
+cmc_parsed_ir_weight_t;
+
+/* CMC structures with version ID >= v200 */
+
+typedef struct
+{
+    cmc_light_source source_type;         /*!< Light source type (enum), e.g. Fluorescent. */
+    cmc_chromaticity chromaticity;        /*!< Chromaticity (sensor) in R/G, B/G plane. */
+    cmc_cie_coords cie_coords;            /*!< CIE x and y coordinates. */
+    cmc_color_matrix traditional;         /*!< Color matrix optimized using all sectors. */
+    cmc_color_matrix *advanced;           /*!< Array of color matrices (as defined by num_sectors). */
+} cmc_advanced_color_matrices;
+
+typedef struct
+{
+    ia_mkn_record_header header;          /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_advanced_color_matrices (See cmc_name_id). */
+    unsigned short num_light_srcs;        /*!< Number of light sources. */
+    unsigned short num_sectors;           /*!< Number of color matrix sectors.  */
+    cmc_advanced_color_matrices *acms;    /*!< Advanced color matrices for all light sources (as defined by num_light_srcs). */
+    unsigned int *hue_of_sectors;         /*!< Starting hue angle array of sectors (as defined by num_sectors). */
+} cmc_advanced_color_matrix_correction;
+
+typedef struct
+{
+    cmc_light_source source_type;         /*!< Light source type. */
+    float chromaticity_i_per_g;           /*!< Sensor Ir/G ratio. */
+    cmc_chromaticity chromaticity;        /*!< Sensor R/G B/G ratios. */
+    cmc_cie_coords cie_coords;            /*!< CIE x and y coordinates. */
+    uint16_t *grids[4][4];                /*!< IR Grids for all color channels (as defined by grid_indices). */
+} cmc_ir_grid;
+
+typedef struct
+{
+    ia_mkn_record_header header;          /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_infrared_correction (See cmc_name_id). */
+    char grid_indices[4][4];              /*!< IR grid indices showing which tables in the structure holds information. -1 means no correction. */
+    unsigned short num_light_srcs;        /*!< Number of light sources. */
+    unsigned short grid_width;            /*!< IR Grid width. */
+    unsigned short grid_height;           /*!< IR Grid height. */
+    cmc_ir_grid *ir_grids;                /*!< IR grids for all light sources (as defined by num_light_srcs). */
+} cmc_infrared_correction;
+
+typedef struct
+{
+    cmc_light_source source_type;         /*!< Light source type. */
+    cmc_chromaticity chromaticity;        /*!< Sensor R/G B/G ratios. */
+    cmc_cie_coords cie_coords;            /*!< CIE x and y coordinates. */
+    unsigned short fraction_bits;         /*!< Number of fraction bits in the shading table fix point representation. */
+    unsigned short *grids[4][4];          /*!< LSC gain grid stored in fixed point format with variable number of fraction bits, (16-fraction_bits)Qfraction_bits. */
+} cmc_lsc_grid;
+#define SIZEOF_CMC_LSC_GAIN_GRID_T 22
+
+typedef struct
+{
+    ia_mkn_record_header header;          /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_lens_shading_correction_4x4 (See cmc_name_id). */
+    char grid_indices[4][4];              /*!< LSC grid indices showing which tables in the structure holds information. -1 means no correction. */
+    unsigned short num_light_srcs;        /*!< Number of light sources. */
+    unsigned short grid_width;            /*!< LSC grid width. */
+    unsigned short grid_height;           /*!< LSC grid height. */
+    cmc_lsc_grid *lsc_grids;              /*!< LSC grids for all light sources (as defined by num_light_srcs). */
+} cmc_lens_shading_correction;
+#define SIZEOF_CMC_LENS_SHADING4x4_T 32
+
+typedef struct
+{
+    cmc_lsc_grid lsc_grid;                /* LSC gain grid. */
+    uint16_t pair_index;                  /* Calibration light source pair index. Tells which NVM table number should be used (in case there are more than one, if there is only one the value is always 0). */
+} cmc_lsc_ratio_grid;
+
+typedef struct
+{
+    ia_mkn_record_header header;          /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_lens_shading_correction_4x4 (See cmc_name_id). */
+    char grid_indices[4][4];              /*!< LSC grid indices showing which tables in the structure holds information. -1 means no correction. */
+    unsigned short num_light_srcs;        /*!< Number of light sources. */
+    unsigned short grid_width;            /*!< LSC grid width. */
+    unsigned short grid_height;           /*!< LSC grid height. */
+    cmc_lsc_ratio_grid *ratio_grids;      /*!< LSC grids for all light sources (as defined by num_light_srcs). */
+} cmc_lens_shading_ratio_correction;
+
+typedef struct
+{
+    ia_mkn_record_header header;          /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_lateral_chromatic_aberration_correction (See cmc_name_id). */
+    cmc_coords optical_center;            /*!< Optical center distance from the left uppermost corner of the sensor (in native sensors resolution). This the location where no lateral chromatic aberration is present. [x, y]. */
+    uint16_t grid_width;                  /*!< Width of the grid. */
+    uint16_t grid_height;                 /*!< Height of the grid. */
+    uint16_t cell_size_x;                 /*!< X-dimension distance (in pixels) between the grid points (lca_grid_*). Guaranteed to be 2^n. This is always in respect to the maximum native sensor width defined in ID2 (General Data). All adaptations to other resolutions is done in the imaging system code in the device in the runtime.*/
+    uint16_t cell_size_y;                 /*!< Same as above but y-dimension */
+    float *lca_grid_blue_x;               /*!< Amount of absolute lateral chromatic aberration in horizontal direction in each of the grid locations for blue pixels, in respect to the green pixel. The grid is evenly spaced over the native maximum sensor resolution and maximum field of view. 0 means no aberration, -x means shifted to left, +x mean shifted to right. Grid is aligned to the left uppermost corner of the maximum focal plane. This, as all other CMC tables, are in respect to the maximum native image sensor resolution. All adaptations to other resolutions is done in the imaging system code in the device in the runtime. */
+    float *lca_grid_blue_y;               /*!< Same as above but in vertical direction. */
+    float *lca_grid_red_x;                /*!< Same as above but for horizontal and red pixel. */
+    float *lca_grid_red_y;                /*!< Same as above but in vertical direction. */
+} cmc_lateral_chromatic_aberration_correction;
+#define SIZEOF_CMC_LCA_HDR 20
+
+typedef struct
+{
+    uint16_t pattern_horizontal_offsets;    /*!< Buffer of horizontal offsets for repetitive PD pixels within the pattern */
+    uint16_t pattern_vertical_offsets;      /*!< Buffer of vertical offsets for repetitive PD pixels within the pattern */
+    uint16_t pattern_labels;                /*!< Buffer of labels for repetitive PD pixels within the pattern (0 - left pixel, 1 - right pixel) */
+} cmc_pd_pattern_t;
+
+typedef struct
+{
+    uint16_t dlom;                          /*!< Default DLOM table for the reference golden sample */
+} cmc_pd_dlom_t;
+
+typedef struct
+{
+    uint16_t ps_gains_left;                /*!< Default PS gains table for left pixels for the reference golden module */
+    uint16_t ps_gains_right;               /*!< Default PS gains table for right pixels for the reference golden module */
+} cmc_pd_ps_gains_t;
+
+typedef struct
+{
+    ia_mkn_record_header header;            /*!< Record header with Format ID: Uint16 (See AIQB_DataID) Name ID: cmc_name_id_phase_difference */
+    uint16_t sensor_type;                   /*!< PD sensor type (See cmc_pd_sensor_type)*/
+    uint16_t technology_type;               /*!< PD technology type (See cmc_pd_technology_type) */
+    uint16_t pd_horizontal_offset;          /*!< Number of pixel pairs skipped at the beginning of the frame before the start of the first PD pattern */
+    uint16_t pd_vertical_offset;            /*!< Number of line pairs skipped at the beginning of the frame before the start of the first PD pattern */
+    uint16_t num_pd_pixels;                 /*!< Number of repetitive PD pixels within the pattern */
+    uint16_t pattern_width;                 /*!< Pattern width (horizontal period for repetitive PD pixels) */
+    uint16_t pattern_height;                /*!< Pattern height (vertical period for repetitive PD pixels) */
+    uint16_t dlom_width;                    /*!< Number of Disparity of Lens Offset Mapping (DLOM) knots in horizontal orientation */
+    uint16_t dlom_height;                   /*!< Number of Disparity of Lens Offset Mapping (DLOM) knots in vertical orientation */
+    uint16_t ps_gains_width;                /*!< Number of pixel sensitivity (PS) knots in horizontal orientation */
+    uint16_t ps_gains_height;               /*!< Number of pixel sensitivity (PS) knots in vertical orientation */
+    cmc_pd_pattern_t *cmc_pd_pattern;       /*!< PD pattern characterization (num_pd_pixels) */
+    cmc_pd_dlom_t *cmc_pd_dlom;             /*!< Disparity of Lens Offset Mapping characterization (dlom_width*dlom_height) */
+    cmc_pd_ps_gains_t *cmc_pd_ps_gains;     /*!< Pixel sensitivity characterization (ps_gains_width*ps_gains_height) */
+} cmc_phase_difference_t;
+#define SIZEOF_CMC_PHASE_DIFFERENCE_T 30
+
+/*!
+ * \brief Structure defining run (count) and value pairs.
+ */
+typedef struct
+{
+    unsigned short run;    /*!< Count of how many times the same 'value' is present. */
+    unsigned short value;  /*!< Value. */
+} cmc_run_value;
+
+/*!
+ * \brief Defines structure that describes valid image area.
+ * When using WFOV lens, for example fisheye lens, image coming through the optics is not covering the whole sensor area.
+ * For example corners of the captured image from sensor may be invalid and need to be excluded from 3A analysis and ISP processing.
+ * This structure defines generic form of describing areas that should be excluded from captured rectangular sensor image.
+ * 0 value indicates invalid area and 1 indicates valid area.
+ * { run, value } pairs are used to compress data.
+ *
+ * Example how following 2D table is described with { run, value } pairs:
+ * 0000000000000000 -> { 16, 0 },
+ * 0000011111111111 -> { 5, 0 },  { 11, 1 },
+ * 0111111111111110 -> { 1, 0  }, { 14, 1 }, { 1, 0 },
+ * 0011111111111100 -> { 2, 0  }, { 12, 1 }, { 2, 0 },
+ * 0000111111110000 -> { 4, 0  }, { 8, 1  }, { 4, 0 },
+ *
+ * This 2D table can be further reduced by joining per row { run, value } pairs to 1D table:
+ * { 21, 0 }, { 11, 1 }, { 1, 0 }, { 14, 1 }, { 3, 0 }, { 12, 1 }, { 6, 0 }, { 8, 1 }, { 4, 0 }
+ * 'width' defines how to decode 1D array into 2D table.
+ * 'height' is given for reference, in order to calculate size of 2D table for decoding it into memory.
+ */
+typedef struct
+{
+    ia_mkn_record_header header; /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_valid_image_area (See cmc_name_id). */
+    unsigned short width;        /*!< Width of the map that indicates valid image area. */
+    unsigned short height;       /*!< Height of the map that indicates valid image area. */
+    unsigned int num_run_values; /*!< Number of { run, value } pairs encoded. */
+    union {
+        cmc_run_value *ptr;      /*!< Pointer to { run, value} pairs. */
+        uint64_t dummy;          /* Ensures that pointer is accessible in both 32 and 64 bit systems. */
+    } run_values;
+
+    unsigned short center_x;     /*!< v201+ only -- Horizontal center of radial approximation of valid image area in pixels. */
+    unsigned short center_y;     /*!< v201+ only -- Vertical center of radial approximation of valid image area in pixels. */
+    unsigned int radius;         /*!< v201+ only -- Radius of valid image area in pixels */
+    uint64_t reserved_v202;      /*!< v202+ only -- reserved for pointer to v202 data */
+    uint64_t reserved_v203;      /*!< v202+ only -- reserved for pointer to v203 data */
+} cmc_valid_image_area;
+
+/*!
+ * \brief Parsed CMC structure.
+ * Parser will fill the pointers in this structure so that data can be accessed more easily.
+ */
+typedef struct
+{
+    cmc_parsed_comment_t cmc_parsed_comment;                               /* 0 */
+    cmc_general_data_t *cmc_general_data;                                  /* 8 */
+    cmc_parsed_black_level_t cmc_parsed_black_level;                       /* DEPRECATED. Use cmc_black_level_global instead. */
+    cmc_saturation_level_t *cmc_saturation_level;                          /* 20 */
+    cmc_parsed_linearity_t cmc_parsed_linearity;                           /* 24 */
+    cmc_sensitivity_t *cmc_sensitivity;                                    /* 32 */
+    cmc_defect_pixel_t *cmc_defect_pixel;                                  /* 36 */
+    cmc_noise *cmc_noise_model;                                            /* 40 */
+    cmc_parsed_lens_shading_t cmc_parsed_lens_shading;                     /* 44 */
+    cmc_parsed_optics_t cmc_parsed_optics;                                 /* 72 */
+    cmc_parsed_spectral_response_t cmc_parsed_spectral_response;           /* 80 */
+    cmc_parsed_chromaticity_response_t cmc_parsed_chromaticity_response;   /* 88 */
+    cmc_parsed_flash_chromaticity_t cmc_parsed_flash_chromaticity;         /* 108 */
+    cmc_parsed_nvm_info_t cmc_parsed_nvm_info;                             /* 114 */
+    cmc_parsed_color_matrices_t cmc_parsed_color_matrices;                 /* */
+    cmc_parsed_analog_gain_conversion_t cmc_parsed_analog_gain_conversion; /* DEPRECATED. Use cmc_multi_gain_conversions instead. */
+    cmc_parsed_digital_gain_t cmc_parsed_digital_gain;                     /* DEPRECATED. Use cmc_multi_gain_conversions instead. */
+    cmc_parsed_geometric_distortion2_t *cmc_parsed_geometric_distortion2;
+    cmc_exposure_range_t *cmc_exposure_range;
+    cmc_multi_led_flash_t *cmc_multi_led_flashes;
+    cmc_emd_decoder_config_t *cmc_emd_decoder_config;
+    cmc_parsed_advanced_color_matrix_t cmc_parsed_advanced_color_matrix;
+    cmc_parsed_hdr_parameters_t *cmc_parsed_hdr_parameters;
+    cmc_parsed_ir_weight_t *cmc_parsed_ir_weight;
+    cmc_phase_difference_t *cmc_phase_difference;
+    cmc_lateral_chromatic_aberration_correction *cmc_parsed_lca;
+    cmc_lens_shading_correction *cmc_lens_shading;
+    cmc_black_level_global *cmc_black_level_global;
+    cmc_valid_image_area *cmc_valid_image_area;
+    cmc_lens_shading_ratio_correction *cmc_lens_shading_ratio;
+    cmc_multi_gain_conversions_t *cmc_multi_gain_conversions;
+} ia_cmc_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IA_CMC_TYPES_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_configuration.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_configuration.h
new file mode 100644
index 000000000000..bbfbaeb60963
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_configuration.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _IA_CONFIGURATION_H_
+#define _IA_CONFIGURATION_H_
+
+#define IA_HISTOGRAM_SIZE 256
+#define IA_RGBS_GRID_WIDTH 100
+#define IA_RGBS_GRID_HEIGHT 100
+#define IA_FILTER_RESPONSE_GRID_WIDTH 100
+#define IA_FILTER_RESPONSE_GRID_HEIGHT 100
+#define IA_DEPTH_GRID_WIDTH 16
+#define IA_DEPTH_GRID_HEIGHT 12
+#define IA_CMC_GAINS_MAX_NUM 4
+#define IA_CCAT_STATISTICS_MAX_NUM 3
+#define IA_CCAT_EXTERNAL_RGB_HISTOGRAMS_ENABLED
+#define IA_CCAT_IR_GRID_ENABLED
+#define IA_CCAT_DEPTH_GRID_ENABLED
+#define IA_CCAT_RGBS_GRID_ENABLED
+#define IA_CCAT_HSV_GRID_ENABLED
+#define IA_CCAT_LIGHT_SOURCE_ESTIMATION_ENABLED
+#define IA_CCAT_LUMINANCE_GRID_ENABLED
+#define IA_CCAT_LUMINANCE_MOTION_ESTIMATE_ENABLED
+#define IA_CCAT_FACE_ANALYSIS_ENABLED
+#define IA_CCAT_FACES_MAX_NUM 3
+#define IA_CCAT_ROI_ANALYSIS_ENABLED
+#define IA_CCAT_ROIS_MAX_NUM 1
+#define IA_CCAT_CONVOLUTION_FILTER_GRID_ENABLED
+#define IA_CCAT_EXTERNAL_SENSORS_ENABLED
+#define IA_AEC_EXPOSURES_MAX_NUM 10
+#define IA_AEC_EXPOSURE_PLANS_NUM 4
+#define IA_AEC_FEATURE_WEIGHT_GRID
+#define IA_AEC_WEIGHT_GRID_WIDTH 32
+#define IA_AEC_WEIGHT_GRID_HEIGHT 24
+#define IA_AEC_FEATURE_CALIBRATION_DATA
+#define IA_AEC_FEATURE_FLASH
+#define IA_AEC_FLASHES_NUM 2
+#define IA_AEC_FEATURE_FLICKER_DETECTION
+#define IA_AEC_FEATURE_BACKLIGHT_DETECTION
+#define IA_AEC_FEATURE_FACE_UTILIZATION
+#define IA_AEC_FEATURE_ROI_ENABLED
+#define IA_AEC_FEATURE_APERTURE_CONTROL
+#define IA_AEC_FEATURE_DC_IRIS
+#define IA_AEC_FEATURE_MULTIFRAME_HINT
+#define IA_AEC_FEATURE_HDR
+#define IA_AEC_FEATURE_MOTION_BLUR_REDUCTION
+
+#endif /* _IA_CONFIGURATION_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_coordinate.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_coordinate.h
new file mode 100644
index 000000000000..6a1b64ec39e2
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_coordinate.h
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_coordinate.h
+ * \brief Definitions of IA imaging coordinate system and conversion functions.
+ *
+ * IA Imaging algorithms use relative coordinate system where top left corner
+ * is (0,0) and bottom right corner is (8192,8192).
+ *
+ * Coordinate conversions can happen between arbitrary coordinate systems.
+ *
+ * Width and height of coordinate system must be > 0.
+ *
+ * Zoom factor is not considered in coordinate conversions but it should be
+ * calculated when defining the target coordinate system.
+ *
+ * For example:
+ *
+ *      |-------------------------------------------|
+ *      |(0,0)                                      |
+ *      |                                           |
+ *      |    (1800,1700)                            |
+ *      |        |--------------|                   |
+ *      |        |(-100,-100)   |                   |
+ *      |        |              |                   |
+ *      |        |     (100,100)|                   |
+ *      |        |--------------|                   |
+ *      |                   (5500,4000)             |
+ *      |                                           |
+ *      |                                           |
+ *      |                                           |
+ *      |                                           |
+ *      |                                (8192,8192)|
+ *      |-------------------------------------------|
+ *
+ *
+ * There is an algorithm which works on cropped area with own coordinate system A
+ * [(-100,100), (100.100)] inside another coordinate system B [(0,0), (8192,8192)].
+ *
+ * To convert results from coordinate system A to B, one must define source and target
+ * coordinate systems:
+ * Source system is coordinate system A.
+ * src_system: [(-100,100), (100.100)]
+ *
+ * Target system defines the cropped rectangle from inside coordinate system B.
+ * trg_system: [(1800,1700), (5500,4000)]
+ *
+ */
+
+
+#ifndef IA_COORDINATE_H_
+#define IA_COORDINATE_H_
+
+#include "ia_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*! \brief Definitions of IA imaging coordinate system. */
+#define IA_COORDINATE_TOP 0
+#define IA_COORDINATE_LEFT 0
+#define IA_COORDINATE_BOTTOM 8192
+#define IA_COORDINATE_RIGHT 8192
+#define IA_COORDINATE_WIDTH (IA_COORDINATE_RIGHT-IA_COORDINATE_LEFT)
+#define IA_COORDINATE_HEIGHT (IA_COORDINATE_BOTTOM-IA_COORDINATE_TOP)
+
+typedef enum
+{
+    ia_coordinate_rounding_mode_floor = 0, /* Coordinates are always floored down. This is the old behavior. */
+    ia_coordinate_rounding_mode_ceil,      /* Coordinates are always ceiled up. */
+    ia_coordinate_rounding_mode_round      /* Coordinates are rounded to the closest integer. */
+} ia_coordinate_rounding_mode;
+
+/*!
+ * \brief Coordinate system.
+ * Defines the coordinate space boundaries.
+ */
+typedef struct
+{
+    int top;    /*!< Top coordinate value in the coordinate system. */
+    int left;   /*!< Left coordinate value in the coordinate system. */
+    int bottom; /*!< Bottom coordinate value in the coordinate system. */
+    int right;  /*!< Right coordinate value in the coordinate system. */
+} ia_coordinate_system;
+
+/*!
+ * \brief Convert coordinate from source coordinate space to target coordinate space.
+ * \param[in] src_system     Source coordinate system boundaries.
+ * \param[in] trg_system     Target coordinate system boundaries.
+ * \param[in] src_coordinate Coordinate values in source coordinate system.
+ * \param[in] rounding_mode  Coordinate rounding mode.
+ * \return                   Target coordinate converted from source coordinate.
+ */
+LIBEXPORT ia_coordinate
+ia_coordinate_convert(
+    const ia_coordinate_system *src_system,
+    const ia_coordinate_system *trg_system,
+    const ia_coordinate src_coordinate,
+    const ia_coordinate_rounding_mode rounding_mode);
+
+/*!
+*  Converts a rectangle from one coordinate system to another.
+*
+*  \param [in]  a_src_system_ptr   The source coordinate system.
+*  \param [in]  a_src_rect_ptr     The source rectangle.
+*  \param [in]  a_tgt_system_ptr   The target coordinate system.
+*  \param [out] a_tgt_rect_ptr     The calculated target rectangle.
+*/
+LIBEXPORT void
+ia_coordinate_convert_rect(
+    const ia_coordinate_system* a_src_system_ptr,
+    const ia_rectangle* a_src_rect_ptr,
+    const ia_coordinate_system* a_tgt_system_ptr,
+    ia_rectangle* a_tgt_rect_ptr);
+
+/*!
+ * \brief Convert face coordinates to target coordinate system.
+ * \param[in,out] face_state Structure containing face information from face tracker.
+ * \param[in]     src_system Source coordinate system boundaries.
+ * \param[in]     trg_system Target coordinate system boundaries.
+ */
+LIBEXPORT void
+ia_coordinate_convert_atbx_faces(
+    ia_atbx_face_state *face_state,
+    const ia_coordinate_system *src_system,
+    const ia_coordinate_system *trg_system);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* IA_COORDINATE_H_ */
+
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_dpc.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_dpc.h
new file mode 100644
index 000000000000..0883373c132b
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_dpc.h
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*!
+ * \mainpage IA DPC API documentation
+ *
+ * Browse Files and Classes tabs for details.
+ *
+ */
+/*!
+ * \file ia_dpc.h
+ * \brief Definitions and declarations of IA SD-DPC library.
+ */
+#ifndef _IA_DPC_H_
+#define _IA_DPC_H_
+
+#include "ia_aiq_types.h"
+#include "ia_types.h"
+#include "ia_mkn_types.h"
+#include "ia_cmc_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define IA_DPC_VERSION "1.0.0.0"
+typedef struct ia_dpc_t ia_dpc;
+
+/*!
+ * \brief SD-DPC runtime input.
+ */
+typedef struct {
+    short *frame_data;                 /*!< fixed point image */
+    int frame_width;                   /*!< current frame width (might be cropped) */
+    int frame_height;                  /*!< current frame height (might be cropped) */
+} sd_dpc_input;
+
+/*!
+ * \brief SD-DPC per-run output.
+ */
+typedef struct {
+    short *defect_lut;          /*!< defects LUT stores the column indices (one-based) of the approved defects per row. size frame_height x max_defects_per_line */
+    int dpc_lut_width;        /*!< the width of the DP LUT, equal to maximum number of defects per line */
+    int dpc_lut_height;       /*!< the height of the DP LUT, equal to sensor height */
+    bool dpc_lut_changed;     /*!< true if the new defects have been added */
+} sd_dpc_output;
+
+/*!
+ * \brief Initialize IA_DPC.The function parses the given AIQB data and determines if the SD-DPC should be used. 
+ *        If yes the object is allocated and initialized.
+ *        If not, null is returned
+ *
+ * \param[in]     aiqb_data              Mandatory.\n
+ *                                       CPFF that contains tuning parameters for camera, ISP and AIQ algorithms.
+ *                                       If NULL is given the function will return NULL.
+ * \param[in]     ia_cmc                 Mandatory.\n
+ *                                       Parsed camera module characterization structure. Internal copy of the structure will be taken.
+ *                                       If NULL is given the function will return NULL.
+ * \param[in]     ia_dpcd_data           Mandatory.\n
+ *                                       loaded DPCD data. Should not be NULL, but have size = 0 instead
+ * \param[in]     max_defects_per_line   Mandatory.\n
+ *                                       maximum number of defects per line support by the ISP.
+ * \param[in]     stripe_number_of_lines Mandatory.\n
+ *                                       The maximum stripe height.
+ * return                                IA_DPC handle. Use the returned handle as input parameter for the consequent IA_DPC calls.
+ *                                       Returns NULL is SD-DPC should be bypassed.
+ */
+LIBEXPORT ia_dpc*
+ia_dpc_init(const ia_binary_data *aiqb_data,
+            const ia_cmc_t *ia_cmc,
+            const ia_binary_data *ia_dpcd_data,
+            unsigned int max_defects_per_line,
+            unsigned int stripe_number_of_lines);
+
+/*!
+ * \brief De-initialize IA_DPC.
+ * All memory allocated by DPC algoriths are freed. DPC handle can no longer be used.
+ *
+ * \param[in] ia_dpc                Mandatory.\n
+ *                                  DPC instance handle.
+ */
+LIBEXPORT void
+ia_dpc_deinit(ia_dpc *ia_dpc);
+/*!
+ * \brief SD-DPC execution based on input parameters and stripe.
+ *
+ *  \param [in]      ia_dpc         Mandatory.\n
+ *                                  SD-DPC state, updated with the intermediate results
+ *  \param [in,out]  stripe_ptr     Mandatory.\n
+ *                                  Stripe data that include the RAW pixels and the exisitng/ missing margins information.
+ *  \param [out]     dpc_output     Mandatory.\n
+ *                                  Output LUT of the verified defect pixels. The new defect pixels can be only in the given stripe region.
+ *                                  Results can be used directly as input for AIC.
+ *  \return                         Error code.
+ */
+
+LIBEXPORT ia_err
+ia_dpc_run(ia_dpc *ia_dpc,
+          const sd_dpc_input *stripe_ptr,
+          const ia_aiq_frame_params *aiq_frame_params_ptr,
+          const ia_aiq_ae_exposure_result *ae_exposure_result_ptr,
+          sd_dpc_output *dpc_output);
+
+/*!
+ * \param[in]  ia_aiq               Mandatory.\n
+ *                                  DPC instance handle.
+ * \param[out] out_ia_dpcd_data     Mandatory.\n
+ *                                  Contains various DPC related information, collected during run-time and subject to
+ *                                  be stored in a host file system. Host will copy this data, if ia_dpcd_data->size > 0
+ *                                  and ia_dpcd_data->data != NULL; SD-DPC is responsible to deallocate data buffer
+ *                                  during ia_dpc_deinit().
+ * \return                          Error code.
+ */
+LIBEXPORT ia_err 
+ia_dpc_get_dpcd_data(
+        ia_dpc *ia_dpc,
+        ia_binary_data *out_ia_dpcd_data);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _IA_DPC_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs.h
new file mode 100644
index 000000000000..8dfabb66b42d
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs.h
@@ -0,0 +1,286 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \mainpage IA DVS documentation
+ *
+ * \section general General info
+ *
+ * Digital video stabilization API.
+ *
+ */
+
+/*!
+ * \file ia_dvs.h
+ * \brief Definitions and declarations of Intel DVS library.
+ */
+
+#ifndef _IA_DVS_H_
+#define _IA_DVS_H_
+
+#include <stdint.h>
+#include "ia_dvs_types.h"
+#include "ia_aiq_types.h"
+#include "ia_cmc_types.h"
+#include "ia_aiq.h"
+#include "ia_dvs_deprecated.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*! \brief Initialize the DVS module.
+ *
+ * \param[out]  dvs_state            dvs state.
+ *                                   This is a pointer to a pointer to a module.
+ * \param[in]   a_aiq_tuning_binary  aiqb binary tuning parameter.
+ * \param[in]   cmc                  cmc_t parameter.
+ * \return                           0 for no error, others for error.
+ *
+ * This function initializes the DVS module. This allocates and initializes
+ * internal data structures. This function must always be called before any
+ * other ia_dvs function.
+ */
+LIBEXPORT ia_err
+ia_dvs_init(ia_dvs_state **dvs_state,
+            const ia_binary_data *a_aiq_tuning_binary,
+            const ia_cmc_t *cmc);
+
+/*! \brief Configure the DVS module.
+ *
+ * \param[in]   dvs_state           dvs state.
+ * \param[in]   config              dvs configuration
+ * \param[in]   digital_zoom_ratio  digital zoom ratio.
+ * \return                          0 for no error, others for error.
+ *
+ * This function configures the DVS module. This allocates and initializes
+ * internal data structures. This function must always be called after ia_dvs_init
+ * and before any other ia_dvs function is called.
+ */
+LIBEXPORT ia_err
+ia_dvs_config_v1(ia_dvs_state *dvs_state,
+                 const ia_dvs_configuration_v1 *config,
+                 float digital_zoom_ratio);
+
+/*! \brief Deinitialize the DVS module.
+ *
+ * \param[in]   dvs_state       dvs state.
+ *                              This is a pointer to a module.
+ *
+ * This function deinitilizes the DVS module. This frees the allocated memory.
+ */
+LIBEXPORT void
+ia_dvs_deinit(ia_dvs_state *dvs_state);
+
+/*! \brief Set the DVS statistics.
+ *
+ * \param[in]   dvs_state       dvs state.
+ *                              This is a pointer to a module.
+ * \param[in]   statistics      Pointer to generic DVS statistics
+ * \param[in]   ae_results      Optional. Pointer to AIQ AE results.
+ * \param[in]   af_results      Optional. Pointer to AIQ AF results.
+ * \param[in]   sensor_events   Optional. Pointer to sensor events data which contains accelerometer,
+ *                              gravity and gyroscope events.
+ * \param[in]   frame_readout_start     Frame readout start time. Optional for image based DVS. Mandatory for gyro based DVS
+ * \param[in]   frame_readout_end       Frame readout end time. Optional for image based DVS. Mandatory for gyro based DVS
+ * \return                      0 for no error, others for error.
+ *
+ * This function receives DVS statistics in generic format.
+ */
+LIBEXPORT ia_err
+ia_dvs_set_statistics(ia_dvs_state *dvs_state,
+                      const ia_dvs_statistics *statistics,
+                      const ia_aiq_ae_results *ae_results,
+                      const ia_aiq_af_results *af_results,
+                      const ia_aiq_sensor_events *sensor_events,
+                      const unsigned long long frame_readout_start,
+                      const unsigned long long frame_readout_end);
+
+/*! \brief Execute DVS main process.
+ *
+ * \param[in]   dvs_state       dvs state.
+ *                              This is a pointer to a module.
+ * \param[in]   focus_position  Focus motor position in terms of those used by the sensor module.
+ *                              Value 0 will use the first LDC grid from the CPF.
+ * \return                      0 for no error, others for error.
+ *
+ * This function processes the DVS main functionality. This generates a
+ * lens distortion configuration and calculates global motion.
+ */
+LIBEXPORT ia_err
+ia_dvs_execute(ia_dvs_state *dvs_state,
+               uint16_t focus_position);
+
+/*! \brief allocate the DVS morphing table.
+ *
+ * \param[in]   dvs_state       dvs state.
+ *                              This is a pointer to a module.
+ * \param[out]  morph_table     Pointer to Pointer to morphing table.
+ * \return                      0 for no error, others for error.
+ *
+ * This function allocates the memory of dvs morphing table.
+ * This allocates the struct ia_dvs_morph_table itself, and the members in the structure.
+ */
+LIBEXPORT ia_err
+ia_dvs_allocate_morph_table(ia_dvs_state *dvs_state,
+                            ia_dvs_morph_table **morph_table);
+
+/*! \brief Free the DVS morphing table.
+ *
+ * \param[in]   morph_table     Pointer to morphing table.
+ * \return                      0 for no error, others for error.
+ *
+ * This function frees the memory of dvs morphing table.
+ * Each allocated member in morph_table, and morph_table itself are freed.
+ */
+LIBEXPORT ia_err
+ia_dvs_free_morph_table(ia_dvs_morph_table *morph_table);
+
+/*! \brief Get the GDC morphing table.
+ *
+ * \param[in]   dvs_state       dvs state.
+ *                              This is a pointer to a module.
+ * \param[out]  morph_table     Pointer to the GDC morph table
+ * \return                      0 for no error, others for error.
+ *
+ * This function calculates GDC morphing table from lens distortion configuration, digital zoom and global motion.
+ */
+LIBEXPORT ia_err
+ia_dvs_get_morph_table(ia_dvs_state *dvs_state,
+                       ia_dvs_morph_table *morph_table);
+
+/*! \brief Set non blanking ratio.
+ *
+ * \param[in]   dvs_state               dvs_state.
+ *                                      This is a pointer to a module.
+ * \param[in]   nonblanking_ratio       non blanking ratio.
+ *                                      Value 0.0 means no rolling shutter correction.
+ * \return                              0 for no error, others for error.
+ *
+ * This function specifies the rolling shutter correction effect.
+ */
+LIBEXPORT ia_err
+ia_dvs_set_non_blank_ratio(ia_dvs_state *dvs_state,
+                           float nonblanking_ratio);
+
+/*! \brief Set digital zoom magnitude.
+ *
+ * \param[in]   dvs_state       dvs state.
+ *                              This is a pointer to a module.
+ * \param[in]   magnitude       digital zoom magnitude
+ * \return                      0 for no error, others for error.
+ *
+ * This function specifies the digital zoom magnitude
+ */
+LIBEXPORT ia_err
+ia_dvs_set_digital_zoom_magnitude(ia_dvs_state *dvs_state,
+                                  float magnitude);
+
+/*!
+ * \brief Set the distortion configuration.
+ *
+ * This function specifies lens distortion correction grid. This will override LDC defined in CPF.
+ *
+ * \param[in]   dvs_state           dvs state.
+ *                                  This is a pointer to a module.
+ * \param[in]   distortion_config   Distortion grid configuration.
+ * \return                          0 for no error, others for error.
+ */
+LIBEXPORT ia_err
+ia_dvs_set_distortion_config(ia_dvs_state *dvs_state,
+                             const ia_dvs_distortion_config *distortion_config);
+
+/*!
+ * \brief Set digital zoom mode.
+ *
+ * This function specifies the digital zoom mode.
+ *
+ * In mode ia_dvs_zoom_mode_center ia_dvs_set_digital_zoom_magnitude() is used to control
+ * digital zoom. Zooming is performed to the center of the image.
+ *
+ * In mode ia_dvs_zoom_mode_region ia_dvs_set_digital_zoom_region() is used to control
+ * zooming position and magnitude.
+ *
+ * By default mode ia_dvs_zoom_mode_center is used.
+ *
+ * \param[in]   dvs_state           dvs state.
+ *                                  This is a pointer to a module.
+ * \param[in]   zoom_mode           digital zoom mode
+ * \return                          0 for no error, others for error.
+ */
+LIBEXPORT ia_err
+ia_dvs_set_digital_zoom_mode(ia_dvs_state *dvs_state,
+                             ia_dvs_zoom_mode zoom_mode);
+
+/*!
+ * \brief Set digital zoom region.
+ *
+ * This function specifies the digital zoom region. It requires setting
+ * the zoom mode to ia_dvs_zoom_mode_region.
+ *
+ * \param[in]   dvs_state           dvs state.
+ *                                  This is a pointer to a module.
+ * \param[in]   zoom_region         Rectangle which is zoomed in.
+ *                                  This region is cropped and scaled
+ *                                  to the size of the output image.
+ *                                  Coordinates are given in BQs.
+ * \return                          0 for no error, others for error.
+ */
+LIBEXPORT ia_err
+ia_dvs_set_digital_zoom_region(ia_dvs_state *dvs_state,
+                               ia_rectangle *zoom_region);
+
+/*!
+ * \brief Set digital zoom coordinate.
+ *
+ * This function specifies the digital zoom coordinate. It requires setting
+ * the zoom mode to ia_dvs_zoom_mode_coordinate.
+ *
+ * \param[in]   dvs_state           dvs state.
+ *                                  This is a pointer to a module.
+ * \param[in]   zoom_coordinate     Coordinate which is zoomed in.
+ *                                  Coordinate is given in BQs.
+ * \return                          0 for no error, others for error.
+ */
+LIBEXPORT ia_err
+ia_dvs_set_digital_zoom_coordinate(ia_dvs_state *dvs_state,
+                               ia_coordinate *zoom_coordinate);
+
+/*!
+ * \brief Get version.
+ * Get version from version header.
+ *
+ * \return                          Version string.
+ */
+LIBEXPORT const char* ia_dvs_get_version(void);
+
+/*! \brief Get the homography matrix for image stabilization.
+*
+* \param[in]   dvs_state             dvs state.
+*                                    This is a pointer to a module.
+* \param[out]  image_transformation  Pointer to the transformation structure where results are saved.
+* \return                           0 for no error, others for error.
+*
+* This function calculates gets a set of homography matrices to perform video stabilization for one frame.
+*/
+LIBEXPORT ia_err
+ia_dvs_get_image_transformation(ia_dvs_state *dvs_state,
+                                ia_dvs_image_transformation *image_transformation);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA_DVS_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_deprecated.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_deprecated.h
new file mode 100644
index 000000000000..f3ec84b8f027
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_deprecated.h
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _IA_DVS_DEPRECATED_H_
+#define _IA_DVS_DEPRECATED_H_
+
+#include "ia_dvs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** DVS configuration.
+ * This structure contains DVS configuration.
+ */
+typedef struct
+{
+    ia_dvs_algorithm_version num_axis;          /**< Algorithm mode */
+    float nonblanking_ratio;                    /**< Effective vertical scan ratio, used for rolling correction (Non-blanking ration of frame interval) */
+    ia_dvs_bq_resolution source_bq;             /**< Input image size [BQ] for GDC block */
+    ia_dvs_bq_resolution output_bq;             /**< Output image size [BQ] from GDC block */
+    ia_dvs_bq_resolution envelope_bq;           /**< GDC effective envelope size [BQ] */
+    ia_dvs_bq_resolution ispfilter_bq;          /**< Padding of the image which is corrupted and should not be visible in the output image [BQ] */
+    int gdc_shift_x;                            /**< Shift value of morphing table depend on ISP pipe. [chroma pixel] */
+    int gdc_shift_y;                            /**< Shift value of morphing table depend on ISP pipe. [chroma pixel] */
+    unsigned int oxdim_y;                       /**< Output block width  for Y plane [pixel] */
+    unsigned int oydim_y;                       /**< Output block height for Y plane [pixel] */
+    unsigned int oxdim_uv;                      /**< Output block width  for U/V plane [chroma pixel] */
+    unsigned int oydim_uv;                      /**< Output block height for U/V plane [chroma pixel] */
+    ia_dvs_gdc_hw_configuration hw_config;      /**< GDC h/w configuration. DVS does not set these values anywhere so it's only
+                                                     used when validating outgoing morphing table. */
+    bool use_lens_distortion_correction;        /**< False disables LDC, true enables */
+    int frame_rate;                             /**< Frame rate */
+    ia_dvs_gdc_buffer_config gdc_buffer_config; /**< Configuration of the GDC buffer is used inside DVS to prevent morphing table to point
+                                                     invalid memory locations in GDC.
+
+                                                     This configuration should come from FW
+                                                     to inform how large buffer is allocated for GDC processing.
+                                                     Morphing table coordinates generated by DVS must fit inside
+                                                     GDC buffer limits. GDC buffer is allocated by FW and
+                                                     it needs to allocate extra padding for each side of the image data.
+                                                     This allows DVS to generate morphing table which points are outside of the image area
+                                                     but still inside GDC buffer (padding area). This might be the case e.g. if LDC grid is
+                                                     barrel shaped. */
+    ia_dvs_crop_params crop_params;             /**< Sensor and ISP cropping parameteres in native resolution (without any scaling or binning).
+                                                     If scaling is performed before cropping, cropping offsets need to be calculated in native
+                                                     resolution. Also if cropping is done in multiple places, everything needs to be combined
+                                                     together.
+                                                     Lens distortion correction is calculated from the full sensor resolution and
+                                                     DVS needs to know how distortion grids need to be cropped so that they will match with
+                                                     the GDC input image.*/
+    bool validate_morph_table;                  /**< False disables morph table validation, true enables. Morph table needs to be validated to
+                                                     protect FW. Starting from IPU4 validation is performed in PAL. */
+    bool gdc_uses_floats;                       /**< False keeps dvs providing fixed point Y and UV morphing tables (legacy). True changes dvs to
+                                                     provide only UV table in floating point format. */
+    float quaternion_clip_max_angle;            /**< Maximum allowed angle [degrees] of rotation for rotational motion compensation. The value is
+                                                     used to clip the angle of rotation for shake motion or rolling shutter compensation. The clipping
+                                                     value does not depend on the orientation of the axis of rotation. This should be non-negative
+                                                     value and depends on the resolution and envelope and GDC HW limitations.*/
+    float gyro_to_cam_orientation[9];           /**< Contains the orientation of gyro sensor in relation to camera sensor. */
+} ia_dvs_configuration;
+
+/*! \brief Configure the DVS module.
+ *
+ * \param[in]   dvs_state           dvs state.
+ * \param[in]   config              dvs configuration
+ * \param[in]   digital_zoom_ratio  digital zoom ratio.
+ * \return                          0 for no error, others for error.
+ *
+ * This function configures the DVS module. This allocates and initializes
+ * internal data structures. This function must always be called after ia_dvs_init
+ * and before any other ia_dvs function is called.
+ */
+LIBEXPORT ia_err
+ia_dvs_config(ia_dvs_state *dvs_state,
+              const ia_dvs_configuration *config,
+              float digital_zoom_ratio);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA_DVS_DEPRECATED_H_ */
\ No newline at end of file
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_types.h
new file mode 100644
index 000000000000..7d52f17b85a2
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_types.h
@@ -0,0 +1,304 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*!
+ * \file ia_dvs_types.h
+ * \brief Data types and enumerations for Intel DVS library.
+ */
+#ifndef _IA_DVS_TYPES_H_
+#define _IA_DVS_TYPES_H_
+#include <stdint.h>
+#include "ia_types.h"
+
+#define DVS_HOMOGRAPHY_MATRIX_MAX_COUNT 16
+
+typedef struct t_dvs_facade ia_dvs_state;
+
+/** DVS Algorithm.
+ * These settings specify the members of correction axes.
+ * ia_dvs_algorihm_0_axis is a special mode. In this case, library does not compensate the
+ * motion, works for digital zoom and distortion correction.
+ */
+typedef enum
+{
+    ia_dvs_algorithm_0_axis     = 0,                        /**< 0 axis, means video stabilization is turned off */
+    ia_dvs_algorithm_2_axis     = 2,                        /**< 2 axis - x and y translations */
+    ia_dvs_algorithm_3_axis     = 3,                        /**< 3 axis - x and y translations and z-scale*/
+    ia_dvs_algorithm_4_axis     = 4,                        /**< 4 axis */
+    ia_dvs_algorithm_5_axis     = 5,                        /**< 5 axis - x and y translations and all rotations*/
+    ia_dvs_algorithm_6_axis     = 6,                        /**< 6 axis - x and y translations, z-scale and all rotations*/
+    ia_dvs_algorithm_max_axis   = ia_dvs_algorithm_6_axis,  /**< maximum axis */
+    ia_dvs_algorithm_motion_sensor = 10                     /**< motion sensor based stabilization */
+} ia_dvs_algorithm_version;
+
+/** DVS2 BQ resolution.
+ * These parameter are BQ resolution configuration.
+ */
+typedef struct
+{
+    int width_bq;                           /**< width [BQ] */
+    int height_bq;                          /**< height [BQ] */
+} ia_dvs_bq_resolution;
+
+/** GDC Scan Mode
+ * These settings specify the gdc scan mode.
+ */
+typedef enum
+{
+    ia_dvs_gdc_scan_mode_stb    = 0,        /**< STB (slide to the bottom) */
+    ia_dvs_gdc_scan_mode_str,               /**< STR (slide to the right) */
+} ia_dvs_gdc_scan_mode;
+
+/** GDC Interpolation Method
+ * These settings specify the gdc interpolation method.
+ */
+typedef enum
+{
+    ia_dvs_gdc_interpolation_nnd= 0,        /**< NND (nearest neighbor) */
+    ia_dvs_gdc_interpolation_bli,           /**< BLI (bilinear) */
+    ia_dvs_gdc_interpolation_bci,           /**< BCI (bicubic) */
+    ia_dvs_gdc_interpolation_lut,           /**< LUT (look up table) */
+} ia_dvs_gdc_interpolation;
+
+/** GDC Performance Point
+ * These settings specify the gdc performance point.
+ */
+typedef enum
+{
+    ia_dvs_gdc_performance_point_1x1= 0,    /**< 1x1 */
+    ia_dvs_gdc_performance_point_2x1,       /**< 2x1 */
+    ia_dvs_gdc_performance_point_1x2,       /**< 1x2 */
+    ia_dvs_gdc_performance_point_2x2,       /**< 2x2 */
+} ia_dvs_gdc_performance_point;
+
+/** GDC hardware configuration
+ * These parametes are the gdc hardware block configuration.
+ * dvs library use these parameters just check the gdc constraints,
+ * do NOT use these parameters for any controls nor calculations.
+ */
+typedef struct
+{
+    ia_dvs_gdc_scan_mode scan_mode;
+    ia_dvs_gdc_interpolation interpolation;
+    ia_dvs_gdc_performance_point performance_point;
+} ia_dvs_gdc_hw_configuration;
+
+/** GDC buffer configuration
+ *  These parameters indicates the limits of the GDC ISP buffer.
+ *  DVS needs to limit morphing table coordinates to fit inside GDC
+ *  ISP buffer.
+ */
+typedef struct
+{
+    unsigned int x_offset;  /* X offset [BQ] for the first pixel of image data */
+    unsigned int y_offset;  /* Y offset [BQ] for the first pixel of image data*/
+    unsigned int width;     /* Total width [BQ] for the buffer */
+    unsigned int height;    /* Total height [BQ] for the buffer */
+} ia_dvs_gdc_buffer_config;
+
+/** Total cropping parameters
+ *  These parameters contain sensor and ISP cropping information without any scaling or binning.
+ *  In case of scaling before cropping, cropping params needs to be scaled back to the original resolution.
+ *  This information is used to crop lens distortion grids accordingly.
+ */
+typedef struct
+{
+    unsigned int horizontal_crop_offset;    /* Read out offset horizontal [BQ] */
+    unsigned int vertical_crop_offset;      /* Read out offset vertical [BQ] */
+    unsigned int cropped_width;             /* Width of cropped area without any scaling [BQ] */
+    unsigned int cropped_height;            /* Height of cropped area without any scaling [BQ] */
+} ia_dvs_crop_params;
+
+
+
+
+
+/** GDC HW limits which are specific for particluar IPU
+ * version and need to be taken into account in the
+ * DVS algorithm side when preparing a correct morphing table
+ */
+
+
+
+
+/** This enum is a list of possible constraints on the DVS morphing
+ * table which need to be ensured during DVS algorithm execution.
+ */
+typedef enum
+{
+    ia_dvs_no_constraints = 0,     /**< No additional constraints on the morphing table need to be performed */
+    ia_dvs_woi_validation,         /**< The morphing table is validated for access violation in FW duirng WOI pixel data fetch;
+                                        a violation results in no compensation for the current frame */
+    ia_dvs_max_tetragon_size,      /**< DVS ensures that the morph table tetragons fit inside pre-defined max width and height */
+} ia_dvs_morph_table_constraints;
+
+/** DVS configuration.
+ * This structure contains DVS configuration.
+ */
+typedef struct
+{
+    ia_dvs_algorithm_version num_axis;          /**< Algorithm mode */
+    float nonblanking_ratio;                    /**< Effective vertical scan ratio, used for rolling correction (Non-blanking ration of frame interval) */
+    ia_dvs_bq_resolution source_bq;             /**< Input image size [BQ] for GDC block */
+    ia_dvs_bq_resolution output_bq;             /**< Output image size [BQ] from GDC block */
+    ia_dvs_bq_resolution envelope_bq;           /**< GDC effective envelope size [BQ] */
+    ia_dvs_bq_resolution ispfilter_bq;          /**< Padding of the image which is corrupted and should not be visible in the output image [BQ] */
+    int gdc_shift_x;                            /**< Shift value of morphing table depend on ISP pipe. [chroma pixel] */
+    int gdc_shift_y;                            /**< Shift value of morphing table depend on ISP pipe. [chroma pixel] */
+    unsigned int oxdim_y;                       /**< Output block width  for Y plane [pixel] */
+    unsigned int oydim_y;                       /**< Output block height for Y plane [pixel] */
+    unsigned int oxdim_uv;                      /**< Output block width  for U/V plane [chroma pixel] */
+    unsigned int oydim_uv;                      /**< Output block height for U/V plane [chroma pixel] */
+    ia_dvs_gdc_hw_configuration hw_config;      /**< GDC h/w configuration. DVS does not set these values anywhere so it's only
+                                                     used when validating outgoing morphing table. */
+    bool use_lens_distortion_correction;        /**< False disables LDC, true enables */
+    int frame_rate;                             /**< Frame rate */
+    ia_dvs_gdc_buffer_config gdc_buffer_config; /**< Configuration of the GDC buffer is used inside DVS to prevent morphing table to point
+                                                     invalid memory locations in GDC.
+
+                                                     This configuration should come from FW
+                                                     to inform how large buffer is allocated for GDC processing.
+                                                     Morphing table coordinates generated by DVS must fit inside
+                                                     GDC buffer limits. GDC buffer is allocated by FW and
+                                                     it needs to allocate extra padding for each side of the image data.
+                                                     This allows DVS to generate morphing table which points are outside of the image area
+                                                     but still inside GDC buffer (padding area). This might be the case e.g. if LDC grid is
+                                                     barrel shaped. */
+    ia_dvs_crop_params crop_params;             /**< Sensor and ISP cropping parameteres in native resolution (without any scaling or binning).
+                                                     If scaling is performed before cropping, cropping offsets need to be calculated in native
+                                                     resolution. Also if cropping is done in multiple places, everything needs to be combined
+                                                     together.
+                                                     Lens distortion correction is calculated from the full sensor resolution and
+                                                     DVS needs to know how distortion grids need to be cropped so that they will match with
+                                                     the GDC input image.*/
+    ia_dvs_morph_table_constraints morph_table_constraints;
+                                                /**< Constraints defined on the DVS morphing table which need to be taken into account during
+                                                     DVS algorithm execution for smoother video perception */
+    bool gdc_uses_floats;                       /**< False keeps dvs providing fixed point Y and UV morphing tables (legacy). True changes dvs to
+                                                     provide only UV table in floating point format. */
+    float quaternion_clip_max_angle;            /**< Maximum allowed angle [degrees] of rotation for rotational motion compensation. The value is
+                                                     used to clip the angle of rotation for shake motion or rolling shutter compensation. The clipping
+                                                     value does not depend on the orientation of the axis of rotation. This should be non-negative
+                                                     value and depends on the resolution and envelope and GDC HW limitations.*/
+    float gyro_to_cam_orientation[9];           /**< Contains the orientation of gyro sensor in relation to camera sensor. */
+} ia_dvs_configuration_v1;
+
+/** Distortion grid configuration.
+ * Structure defines lens distortion grid.
+ */
+typedef struct
+{
+    int16_t ldc_col_start;      /*!< Table X offset in pixels from left corner of the sensor maximum visible area.
+                                     e.g. If ldc_col_start=ldc_block_width*(-1)
+                                     then ldc table offset is is one block left compared to the maximum visible sensor area. */
+    int16_t ldc_row_start;      /*!< Table Y offset in pixels from upper corner of the sensor maximum visible area.
+                                     e.g. If ldc_row_start=ldc_block_height*(-1)
+                                     then ldc table offset is is one block up compared to the maximum visible sensor area.  */
+    int16_t ldc_grid_width;     /*!< Indicates number of grid vertices on the horizontal axis. */
+    int16_t ldc_grid_height;    /*!< Indicates number of grid vertices on the vertical axis. */
+    int16_t ldc_block_width;    /*!< Width of the original grid cell (without correction). */
+    int16_t ldc_block_height;   /*!< Height of the original grid cell (without correction). */
+    float *x_deltas;            /*!< Table of x-axis deltas of the grid points. The delta at each point represents the distortion
+                                     that was done. Contains [ldc_grid_height  x ldc_grid_width] values. */
+    float *y_deltas;            /*!< Table of y-axis deltas of the grid points. The delta at each point represents the distortion
+                                     that was done. Contains [ldc_grid_height  x ldc_grid_width] values. */
+} ia_dvs_distortion_config;
+
+/** DVS Motion vector structure.
+ * This structure contains definition for one local motion vector.
+ */
+typedef struct
+{
+    float x_start;          /* Normalized X start position */
+    float y_start;          /* Normalized Y start position */
+    float x_end;            /* Normalized X end position */
+    float y_end;            /* Normalized y end position */
+    float weight;           /* Weight of the motion vector [0.0, 1.0]. Describes accuracy of the motion vector */
+} ia_dvs_motion_vector;
+
+/** DVS Motion vectors.
+ * This structure contains DVS statistics.
+ */
+typedef struct
+{
+    unsigned int vector_count;              /* Number of motion vectors */
+    ia_dvs_motion_vector *motion_vectors;   /* Table of local motion vectors. Contains [vector_count] values. */
+} ia_dvs_statistics;
+
+/** DVS morphing table structure.
+ * This structure contains morphing table which includes
+ * lens distortion correction, digital zoom, rolling shutter correction and video stabilization.
+ */
+typedef struct
+{
+    uint32_t width_y;
+    uint32_t height_y;
+    uint32_t width_uv;
+    uint32_t height_uv;
+    uint32_t *xcoords_y;
+    uint32_t *ycoords_y;
+    uint32_t *xcoords_uv;
+    uint32_t *ycoords_uv;
+    bool morph_table_changed;
+    float *xcoords_uv_float; /* uv x-coordinates in float format */
+    float *ycoords_uv_float; /* uv y-coordinates in float format */
+    bool disable_gdc;        /* Info flag for GDC to indicate input resolution = output resolution and no warping is done. */
+} ia_dvs_morph_table;
+
+/** Digital zoom mode
+ * These settings specify digital zoom mode.
+ */
+typedef enum {
+        ia_dvs_zoom_mode_center = 0,
+        ia_dvs_zoom_mode_region,
+        ia_dvs_zoom_mode_coordinate
+} ia_dvs_zoom_mode;
+
+/** DVS global translation parameters.
+ * This structure contains the frame-to-frame translations along x and y axes
+ * and also a coefficient for scene reliability in the range [0, 1] with 1 being
+ * totally reliable estimate and 0 being totally unreliable
+ */
+typedef struct
+{
+    uint32_t plane_translation_x;
+    uint32_t plane_translation_y;
+    float reliability_coefficient;
+} ia_dvs_global_translation;
+
+
+typedef struct
+{
+    int32_t start_row;             /* Vertical offset in lines where matrix is applied.
+                                      Between two offsets corresponding matrices are linearly interpolated
+                                      element wise.*/
+    float matrix[3][3];            /* Defines one 3x3 homography matrix which is ordered row wise. */
+} ia_dvs_homography_matrix;
+
+/** Image transformation parameters.
+* This structure defines image transformation with a list of 3x3 homography matrices.
+* Maximum number of homography matrices is 16 and for each matrix start offset
+* should be defined.
+*/
+typedef struct
+{
+    int32_t num_homography_matrices;                                     /* Number of homography matrices */
+    ia_dvs_homography_matrix matrices[DVS_HOMOGRAPHY_MATRIX_MAX_COUNT];  /* Homography matrices for image
+                                                                            transformation. Can be used e.g.
+                                                                            for image alignment or
+                                                                            video stabilization. */
+} ia_dvs_image_transformation;
+
+#endif /* _IA_DVS_TYPES_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_emd_decoder.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_emd_decoder.h
new file mode 100644
index 000000000000..1d854d1af4a9
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_emd_decoder.h
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_emd_decoder.h
+ * \brief Definitions of functions in Embedded Data decoder.
+*/
+
+#ifndef _IA_EMD_DECODER_H_
+#define _IA_EMD_DECODER_H_
+
+#include "ia_aiq_types.h"
+#include "ia_emd_types.h"
+#include "ia_types.h"
+#include "ia_log.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef LOG_EMD
+#define IA_EMD_LOG(fmt, ...) IA_LOG(ia_log_debug, "IAEMD: " fmt, ## __VA_ARGS__)
+#define IA_EMD_LOG_ERROR(fmt, ...) IA_LOG(ia_log_error, "IAEMD: " fmt, ## __VA_ARGS__)
+#define IA_EMD_LOG_INFO(fmt, ...) IA_LOG(ia_log_info, "IAEMD: " fmt, ## __VA_ARGS__)
+#else
+#define IA_EMD_LOG(...) ((void)0)
+#define IA_EMD_LOG_ERROR(...) ((void)0)
+#define IA_EMD_LOG_INFO(...) ((void)0)
+#endif
+
+
+/*!
+ * \brief Creates Embedded Data Decoder.
+ *
+ * \param[in] ia_cmc                        Mandatory.\n
+ *                                          Parsed camera module characterization structure. Internal copy of the structure will be taken.
+ * \return                                  Pointer to Embedded Data Decoder handle.
+ */
+LIBEXPORT ia_emd_decoder_t *
+ia_emd_decoder_init(
+    const ia_cmc_t *ia_cmc);
+
+
+/*!
+ * \brief Deletes Sensor Data Decoder.
+ *
+ * \param[in] emd_decoder                   Mandatory. \n
+ *                                          Pointer to decoder handle.
+ * \return                                  None.
+ */
+LIBEXPORT void
+ia_emd_decoder_deinit(ia_emd_decoder_t *emd_decoder);
+
+
+/*!
+ * \brief Runs Sensor Data Decoder.
+ *
+ * \param[in] emd_bin                       Mandatory. \n
+ *                                          Pointer to sensor embedded data binary blob.
+ * \param[in] emd_mode                      Mandatory. \n
+ *                                          Pointer to sensor embedded data run-time configuration.
+ * \param[in] sensor_descriptor             Mandatory. \n
+ *                                          Pointer to sensor specific descriptor.
+ * \param[in/out] emd_decoder               Mandatory. \n
+                                            Pointer to decoder handle. Contains decoded exposure data as well.
+ * \return                                  Error code.
+ */
+LIBEXPORT ia_err
+ia_emd_decoder_run(
+    const ia_binary_data *emd_bin,
+    const ia_emd_mode_t *emd_mode,
+    const ia_aiq_exposure_sensor_descriptor *sensor_descriptor,
+    ia_emd_decoder_t *emd_decoder);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA_EMD_DECODER_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_emd_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_emd_types.h
new file mode 100644
index 000000000000..7d9eb03cf2e4
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_emd_types.h
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_emd_types.h
+ * \brief Enumerations, structures and definitions used in the Embedded Data decoder.
+*/
+
+#ifndef _EMD_TYPES_H_
+#define _EMD_TYPES_H_
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*!
+ *  Revision of Sensor Data Decoder library, format 0xYYMMDDVV, where:
+ * - YY: year,
+ * - MM: month,
+ * - DD: day,
+ * - VV: version ('01': ver 0.1,'11': ver 1.1 etc.)
+ */
+#define IA_SENSOR_DATA_DECODER_REVISION         0x15080711
+
+#define MAX_NUMBER_OF_BLOCK_IDS                 0xF00
+
+/* CMC Comment */
+#define AIQB_EMD_RECORD_1_ID                    1
+#define AIQB_EMD_RECORD_1_VERSION               100
+
+/* CMC Embedded Data */
+#define AIQB_EMD_RECORD_21_ID                   21
+#define AIQB_EMD_RECORD_21_VERSION              100
+#define AIQB_EMD_RECORD_21_VERSION_101          101
+
+
+#define SIZEOF_CONFIG_DATA_BLOCK_T              16         /*!< Size of ia_emd_config_block_t structure in bytes. */
+
+/*!
+ * \brief Elementary embedded data block IDs.
+ */
+typedef enum
+{
+    /* Parameters in sensor units */
+    fine_int_time_sensor_units = 0,                 /*!<  0: Fine integration time in sensor units. */
+    coarse_int_time_sensor_units,                   /*!<  1: Coarse integration time in sensor units. */
+    a_gain_global_sensor_units,                     /*!<  2: Analog gain global in sensor units. */
+    d_gain_global_sensor_units,                     /*!<  3: Digital gain global in sensor units. */
+    d_gain_R_sensor_units,                          /*!<  4: Digital gain R in sensor units. */
+    d_gain_GR_sensor_units,                         /*!<  5: Digital gain GR in sensor units. */
+    d_gain_GB_sensor_units,                         /*!<  6: Digital gain GB in sensor units. */
+    d_gain_B_sensor_units,                          /*!<  7: Digital gain B in sensor units. */
+
+    /* Parameters in generic units */
+    fine_int_time_generic_units,                    /*!<  8: Fine integration time in generic_units. */
+    coarse_int_time_generic_units,                  /*!<  9: Coarse integration time in generic_units. */
+    a_gain_global_generic_units,                    /*!< 10: Analog gain global in generic_units. */
+    d_gain_global_generic_units,                    /*!< 11: Digital gain global in generic_units. */
+    d_gain_R_generic_units,                         /*!< 12: Digital gain R in generic_units. */
+    d_gain_GR_generic_units,                        /*!< 13: Digital gain GR in generic_units. */
+    d_gain_GB_generic_units,                        /*!< 14: Digital gain GB in generic_units. */
+    d_gain_B_generic_units,                         /*!< 15: Digital gain GB in generic_units. */
+
+    /* Additional parameters */
+    analog_gain_apex_format,                        /*!< 16: Analog gain in APEX format. */
+    digital_gain_apex_format,                       /*!< 17: Digital gain in APEX format. */
+    total_gain_apex_format,                         /*!< 18: Total gain in APEX format. */
+    exposure_time_us,                               /*!< 19: Exposure time in us. */
+    iso_speed,                                      /*!< 20: ISO speed value. */
+    f_number_apex,                                  /*!< 21: F-number in APEX format. */
+    face_count,                                     /*!< 22: Number of faces recognized in the image. */
+    face_largest_index,                             /*!< 23: Index of the largest face in a face array. */
+    face_top_left_corner_x,                         /*!< 24: Top-left corner of face region, X coordinates of faces recognized in the image. */
+    face_top_left_corner_y,                         /*!< 25: Top-left corner of face region, Y coordinates of faces recognized in the image. */
+    face_bottom_right_x,                            /*!< 26: Bottom-right corner of face region, X coordinates of faces recognized in the image. */
+    face_bottom_right_y,                            /*!< 27: Bottom-right corner of face region, Y coordinates of faces recognized in the image. */
+
+    /* Misc. parameters */
+    frame_length,                                   /*!< 28: Total line number per one frame. */
+    line_length,                                    /*!< 29: Total pixel number per one line. */
+    frame_counter,                                  /*!< 30: Frame counter. */
+    x_output_size,                                  /*!< 31: Horizontal output width. */
+    y_output_size,                                  /*!< 32: Vertical output height. */
+
+    /* Keep it as last one */
+    num_of_embedded_data_block_ids                  /*!< Number of Embedded Data block IDs. */
+} ia_emd_block_id_t;
+
+
+/*!
+ * \brief Elementary Embedded Data block.
+ * Each block describes the content of a single elementary data unit, which could be provided from different
+ * sources, e.g.:
+ * - RAW data embedded lines;
+ * - External ISP embedded data block;
+ * - Any other type of sources.
+ */
+typedef struct
+{
+    uint32_t offset;                                /*!< Offset from beginning of data source blob in bytes. */
+    uint16_t total_blocks;                          /*!< Total number of Elementary Data blocks in a value. */
+    uint16_t block_number;                          /*!< Number of the current block in a series. */
+    uint8_t  data_src;                              /*!< Value from emd_source_t enumeration. */
+    uint8_t  block_id;                              /*!< Value from emd_block_id_t enumeration. */
+    uint8_t  bit_mask;                              /*!< Bit mask, applyed to the byte (before applying the shift). */
+    int8_t   byte_shift_value;                      /*!< Shift value (bits) applyed to byte. E.g. -2 is (N >> 2), 3 is (N << 3). */
+    uint8_t  data_format;                           /*!< Format of the data (block describes), value from ia_mkn_dfid enumeration. */
+    uint8_t  msb_num;                               /*!< Most significant bit of the block (e.g 11 if [11:8]), if applicable. */
+    uint8_t  lsb_num;                               /*!< Least significant bit of the block (e.g 8 if [11:8]), if applicable. */
+    uint8_t  embedded_line;                         /*!< Embedded line #, where data block is located. */
+} ia_emd_config_block_t;
+
+
+/*!
+ * \brief Describes a run-time configuration of sensor embedded data.
+ */
+typedef struct
+{
+    uint32_t exp_id;                                /*!< A unique exposure ID of the frame. */
+    int32_t stride;                                 /*!< Stride of embedded data lines. */
+    int32_t height;                                 /*!< Num of lines in sensor emb.data, e.g for imx227 it should '2'. */
+    int32_t *effective_width;                       /*!< Effective data for each line, e.g for imx227 it should be {160, 62}. */
+} ia_emd_mode_t;
+
+
+/*!
+ * \brief Decoded Embedded Data block.
+ * Each block contains one decoded embedded data parameter (e.g.: fine integration time, analog gain, etc.), copyied to int64 container.
+ */
+typedef struct
+{
+    int64_t data;                                   /*!< Data of the block. */
+    uint8_t data_src;                               /*!< Value from emd_source_t enumeration. */
+    uint8_t block_id;                               /*!< Value from emd_block_id_t enumeration. */
+    uint8_t data_format;                            /*!< Format of the data (block describes), value from ia_mkn_dfid enumeration. */
+    uint8_t reserved;                               /*!< Reserved. */
+} ia_emd_decoded_block_t;
+
+/*!
+ * \brief Decoded Embedded Data block.
+ * Each block contains one decoded embedded data parameter (e.g.: fine integration time, analog gain, etc.), copyied to int64 container.
+ */
+typedef struct
+{
+    uint32_t frame_counter;                         /*!< Frame counter. */
+    uint16_t x_output_size;                         /*!< Horizontal output width. */
+    uint16_t y_output_size;                         /*!< Vertical output height. */
+} ia_emd_misc_parameters_t;
+
+/*!
+ * \brief Decoded Exposure parameters.
+ */
+typedef struct
+{
+    ia_aiq_exposure_sensor_parameters *sensor_units_p; /*!< Exposure parameters in terms of sensor units. */
+    ia_aiq_exposure_parameters *generic_units_p;    /*!< Exposure parameters in terms of generic units. */
+    ia_emd_misc_parameters_t *misc_parameters_p;    /*!< Misc decoded parameters. */
+} ia_emd_result_t;
+
+
+/*!
+ * \brief Embedded Data Decoder handle.
+ */
+typedef struct
+{
+    uint32_t decoder_revision;                      /*!< Version of decoder: 0xMAjor.MInor. */
+    const ia_cmc_t *ia_cmc_p;                       /*!< Pointer to internal copy of parsed camera module characterization structure. */
+    uint16_t max_block_ID;                          /*!< Maximum block_id value from decoder_cfg_p. */
+    uint16_t config_flags;                          /*!< Value from embedded_data_decoder_flags_t enumeration. */
+    uint16_t *block_id_mapping;                     /*!< Array[max_block_ID + 1] for mapping of block_id to data blocks array index. */
+    ia_emd_result_t decoded_data;                   /*!< Result of EMD decoding. */
+    /* ia_emd_decoded_block_t blocks[];*/           /*!< Decoded data blocks array. */
+} ia_emd_decoder_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _EMD_TYPES_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_exc.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_exc.h
new file mode 100644
index 000000000000..0d78c5bc81ca
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_exc.h
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_exc.h
+ * \brief Definitions of exposure parameters conversions between generic and sensor units.
+*/
+
+
+#ifndef IA_EXC_H_
+#define IA_EXC_H_
+
+#include "ia_types.h"
+#include "ia_aiq_types.h"
+#include "ia_cmc_types.h"
+
+#include "ia_exc_deprecated.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*!
+ * \brief Convert exposure time from generic units to sensor units (line & pixel values).
+ * AEC will use default formula for conversion, if not given
+ * \param[in]  exposure_range          Structure containing coarse and fine integration sensor register ranges. Can be set to NULL if not available.
+ * \param[in]  sensor_descriptor       Structure containing coarse and fine integration time limits and step size.
+ * \param[in]  exposure_time_us        Exposure time to convert.
+ * \param[out] coarse_integration_time Coarse (rows of integration) for rolling shutter cameras.
+ * \param[out] fine_integration_time   Fine (pixels of integration remaining after coarse quantization) for rolling shutter cameras.
+ * \return                             Error code.
+ */
+LIBEXPORT ia_err
+ia_exc_exposure_time_to_sensor_units(
+    const cmc_exposure_range_t *exposure_range,
+    const ia_aiq_exposure_sensor_descriptor *sensor_descriptor,
+    const unsigned int exposure_time_us,
+    unsigned short *coarse_integration_time,
+    unsigned short *fine_integration_time);
+
+/*!
+ * \brief Converts gain from generic units to sensor units.
+ * AEC will use default formulae for conversion, if not given
+ * Converts gain value to sensor units, limiting the value according to sensor specific limits.
+ * \param[in]  gain_conversion   Structure containing gain to code mapping information.
+ * \param[in]  gain              Gain in generic units.
+ * \param[out] gain_code         Calculated gain code.
+ * \return                       Error code.
+ */
+LIBEXPORT ia_err
+ia_exc_gain_to_sensor_units(
+    const cmc_gain_conversion_t *gain_conversion,
+    const float gain,
+    unsigned short *gain_code);
+
+/*!
+ * \brief Convert exposure time from sensor units to generic units.
+ * AEC will use default formula for conversion, if not given
+ * \param[in]  sensor_descriptor       Structure containing pixel clock frequency needed in exposure conversion.
+ * \param[in]  coarse_integration_time Coarse (rows of integration) for rolling shutter cameras.
+ * \param[in]  fine_integration_time   Fine (pixels of integration remaining after coarse quantization) for rolling shutter cameras.
+ * \param[out] exposure_time           Calculated exposure value in microseconds.
+ * \return                             Error code.
+ */
+LIBEXPORT ia_err
+ia_exc_sensor_units_to_exposure_time(
+    const ia_aiq_exposure_sensor_descriptor *sensor_descriptor,
+    const unsigned short coarse_integration_time,
+    const unsigned short fine_integration_time,
+    unsigned int *exposure_time);
+
+/*!
+* \brief Convert gain from sensor units to generic units.
+* Using the sensor characteristics info, calculate gain from sensor register values.
+* \param[in]  gain_conversion   Structure containing gain to gain code conversion tables.
+* \param[in]  gain_code         Gain code in sensor specific units.
+* \param[out] gain              Calculated gain.
+* \return                       Error code.
+*/
+LIBEXPORT ia_err
+ia_exc_sensor_units_to_gain(
+    const cmc_gain_conversion_t *gain_conversion,
+    const unsigned short gain_code,
+    float *gain);
+
+/*!
+* \brief Gets gain and code based on current code.
+* Offset is used to retrieve previous or next gain code pairs from the CMC gain conversion tables.
+* \param[in]  gain_conversion   Structure containing gain to gain code conversion tables.
+* \param[in]  gain_code         Gain code in sensor specific units.
+* \param[in]  gain_code_offset  Offset of code to resolve (-1 or 1).
+* \param[out] indexed_gain_code Gain code matching the offset.
+* \return                       Error code.
+*/
+LIBEXPORT ia_err
+ia_exc_get_gain_code(
+    const cmc_gain_conversion_t *gain_conversion,
+    const unsigned short gain_code,
+    const int gain_code_offset,
+    unsigned short *indexed_gain_code);
+
+/*!
+ * \brief Converts ISO to gains and codes.
+ * Gains are round down except if given ISO is smaller than corresponding gain 1.0.
+ * \param[in]  multi_gain_conversions   Structure containing gain to gain code conversion tables.
+ * \param[in]  sensitivity              Structure containing sensor sensitivity information.
+ * \param[in]  iso                      ISO value to be converted into gains.
+ * \param[out] gains                    Array of calculated gains. -1.0 if not available.
+ * \param[out] gain_codes               Array of calculated gain codes. -1 if not available.
+ * \return                              Error code.
+ */
+LIBEXPORT ia_err
+ia_exc_convert_iso_to_multi_gains(
+    const cmc_multi_gain_conversions_t *multi_gain_conversions,
+    const cmc_sensitivity_t *sensitivity,
+    const int iso,
+    float gains[IA_CMC_GAINS_MAX_NUM],
+    int gain_codes[IA_CMC_GAINS_MAX_NUM]);
+
+/*!
+ * \brief Converts gain codes to ISO.
+ * \param[in]  multi_gain_conversions   Structure containing gain to gain code conversion tables. Can be NULL, if sensor doesn't support any gains.
+ * \param[in]  sensitivity              Structure containing sensor sensitivity information.
+ * \param[in]  gain_codes               Array of gain codes. Each element can be -1 if not available.
+ * \param[out] iso                      Gain codes converted into ISO value. -1 if not available.
+ * \return                              Error code.
+ */
+LIBEXPORT ia_err
+ia_exc_convert_multi_gain_codes_to_iso(
+    const cmc_multi_gain_conversions_t *multi_gain_conversions,
+    const cmc_sensitivity_t *sensitivity,
+    const int gain_codes[IA_CMC_GAINS_MAX_NUM],
+    int *iso);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IA_EXC_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_exc_deprecated.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_exc_deprecated.h
new file mode 100644
index 000000000000..1f6472f1eba7
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_exc_deprecated.h
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_exc_deprecated.h
+ * \brief Definitions of exposure parameters conversions between generic and sensor units (deprecated versions).
+*/
+
+
+#ifndef IA_EXC_DEPRECATED_H_
+#define IA_EXC_DEPRECATED_H_
+
+#include "ia_types.h"
+#include "ia_aiq_types.h"
+#include "ia_cmc_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*!
+ * \brief Convert analog gain from generic units to sensor units.
+ * Calculate analog gain code from analog gain, limiting it to the sensor specific values.
+ * \param[in]  gain_conversion   Structure containing analog gain to gain code conversion tables.
+ * \param[in]  analog_gain       Analog gain value to convert to sensor unit.
+ * \param[out] analog_gain_code  Calculated analog gain code.
+ * \return                       Error code.
+ */
+LIBEXPORT ia_err
+ia_exc_analog_gain_to_sensor_units(
+    const cmc_parsed_analog_gain_conversion_t *gain_conversion,
+    const float analog_gain,
+    unsigned short *analog_gain_code);
+
+/*!
+ * \brief Converts digital gain from generic units to sensor units.
+ * AEC will use default formulae for conversion, if not given
+ * Converts digital gain value to sensor units, limiting the value according to sensor specific limits.
+ * \param[in]  gain_conversion   Structure containing digital gain to code mapping information.
+ * \param[in]  digital_gain      Digital gain in generic units.
+ * \param[out] digital_gain_code Calculated digital gain code.
+ * \return                       Error code.
+ */
+LIBEXPORT ia_err
+ia_exc_digital_gain_to_sensor_units(
+    const cmc_parsed_digital_gain_t *gain_conversion,
+    const float digital_gain,
+    unsigned short *digital_gain_code);
+
+/*!
+ * \brief Convert analog gain from sensor units to generic units.
+ * Using the sensor characteristics info, calculate analog gain from sensor register values.
+ * \param[in]  gain_conversion   Structure containing analog gain to gain code conversion tables.
+ * \param[in]  gain_code         Analog gain code in sensor specific units.
+ * \param[out] analog_gain       Calculated analog gain.
+ * \return                       Error code.
+ */
+LIBEXPORT ia_err
+ia_exc_sensor_units_to_analog_gain(
+    const cmc_parsed_analog_gain_conversion_t *gain_conversion,
+    const unsigned short gain_code,
+    float *analog_gain);
+
+/*!
+ * \brief Converts digital gain from sensor units to generic units.
+ * AEC will use default formula for conversion, if not given
+ * \param[in]  gain_conversion   Structure containing digital gain to code mapping information.
+ * \param[in]  gain_code         Digital gain code in sensor specific units.
+ * \param[out] digital_gain      Calculated digital gain.
+ * \return                       Error code.
+ */
+LIBEXPORT ia_err
+ia_exc_sensor_units_to_digital_gain(
+    const cmc_parsed_digital_gain_t *gain_conversion,
+    const unsigned short code,
+    float *digital_gain);
+
+/*!
+ * \brief Gets analog gain and code based on current code.
+ * Offset is used to retrieve previous or next analog gain code pairs from the CMC analog gain conversion tables.
+ * \param[in]  gain_conversion   Structure containing analog gain to gain code conversion tables.
+ * \param[in]  gain_code         Analog gain code in sensor specific units.
+ * \param[in]  gain_code_offset  Offset of code to resolve (-1 or 1).
+ * \param[out] indexed_gain_code Analog gain code matching the offset.
+ * \return                       Error code.
+ */
+LIBEXPORT ia_err
+ia_exc_get_analog_gain_code(
+    const cmc_parsed_analog_gain_conversion_t *gain_conversion,
+    const unsigned short gain_code,
+    const int gain_code_offset,
+    unsigned short *indexed_gain_code);
+
+/*!
+ * \brief Gets digital gain and code based on current code.
+ * Offset is used to retrieve previous or next digital gain code pairs from the CMC digital gain conversion tables.
+ * \param[in]  gain_conversion   Structure containing digital gain to gain code conversion tables.
+ * \param[in]  gain_code         Digital gain code in sensor specific units.
+ * \param[in]  gain_code_offset  Offset of code to resolve (-1 or 1).
+ * \param[out] indexed_gain_code Analog gain code matching the offset.
+ * \return                       Error code.
+ */
+LIBEXPORT ia_err
+ia_exc_get_digital_gain_code(
+    const cmc_parsed_digital_gain_t *gain_conversion,
+    const unsigned short gain_code,
+    const int gain_code_offset,
+    unsigned short *indexed_gain_code);
+
+/*!
+ * \brief Converts ISO to analog gain and digital gain and codes.
+ * Gains are round down except if given ISO is smaller than corresponding gain 1.0.
+ * \param[in]  analog_gain_conversion   Structure containing analog gain to gain code conversion tables.  Can be NULL, if sensor doesn't support analog gain.
+ * \param[in]  digital_gain_conversion  Structure containing digital gain to code mapping information. Can be NULL, if sensor doesn't support digital gain.
+ * \param[in]  sensitivity              Structure containing sensor sensitivity information.
+ * \param[in]  iso                      ISO value to be converted into gains.
+ * \param[out] analog_gain              Calculated analog gain.-1.0 if not available.
+ * \param[out] analog_gain_code         Calculated analog gain code. -1 if not available.
+ * \param[out] digital_gain             Calculated digital gain. -1.0 if not available.
+ * \param[out] digital_gain_code        Calculated digital gain code. -1 if not available.
+ * \return                              Error code.
+ */
+LIBEXPORT ia_err
+ia_exc_convert_iso_to_gains(
+    const cmc_parsed_analog_gain_conversion_t *analog_gain_conversion,
+    const cmc_parsed_digital_gain_t *digital_gain_conversion,
+    const cmc_sensitivity_t *sensitivity,
+    const int iso,
+    float *analog_gain,
+    int *analog_gain_code,
+    float *digital_gain,
+    int *digital_gain_code);
+
+/*!
+ * \brief Converts analog gain and digital gain codes to ISO.
+ * \param[in]  analog_gain_conversion   Structure containing analog gain to gain code conversion tables. Can be NULL, if sensor doesn't support analog gain.
+ * \param[in]  digital_gain_conversion  Structure containing digital gain to code mapping information. Can be NULL, if sensor doesn't support digital gain.
+ * \param[in]  sensitivity              Structure containing sensor sensitivity information.
+ * \param[in]  analog_gain_code         Analog gain code. -1 if not available.
+ * \param[in]  digital_gain_code        Digital gain code. -1 if not available.
+ * \param[out] iso                      Analog and digital gain codes converted into ISO value. -1 if not available.
+ * \return                              Error code.
+ */
+LIBEXPORT ia_err
+ia_exc_convert_gain_codes_to_iso(
+    const cmc_parsed_analog_gain_conversion_t *analog_gain_conversion,
+    const cmc_parsed_digital_gain_t *digital_gain_conversion,
+    const cmc_sensitivity_t *sensitivity,
+    const int analog_gain_code,
+    const int digital_gain_code,
+    int *iso);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IA_EXC_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics.h
new file mode 100644
index 000000000000..f2cd47572713
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics.h
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_intrinsics.h
+ * \brief Definitions and declarations of intrinsics library.
+ */
+
+#ifndef _IA_INTRINSICS_H_
+#define _IA_INTRINSICS_H_
+
+#include "ia_types.h"
+#include "ia_isp_bxt_types.h"
+#include "ia_aiq_types.h"
+#include "ia_intrinsics_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct
+{
+    ia_aiq_frame_params *output_frame_descriptor;   /*!<Scale and crop info of output*/
+    bool  focus_supported;                          /*!<Is focussing supported*/
+    bool  dvs_enabled;                              /*!<Is DVS enabled*/
+} ia_intrinsics_config_params;
+
+/*!
+ * \brief Initialize intrinsics.
+ * This function must be called before any other function in the library. It allocates memories for all intrinsics
+ * algorithms based on input parameters given by the user.
+ *
+ * \param[in]     ia_cmc            Mandatory. Parsed camera module characterization structure.
+ *  return                          ia_intrinsics handle. Use the returned handle as input parameter for the consequent intrinsics calls.
+ */
+LIBEXPORT ia_intrinsics*
+ia_intrinsics_init(const ia_cmc_t *ia_cmc);
+
+/*!
+ * \brief Focal length calculation based on AF results.
+ * Intrinsics lib calculates focal length for each frame.
+ * \param[in]   intrinsics_ptr      Mandatory.\n
+ *                                  Intrinsics handle.
+ * \param[in]   af_results          Mandatory.\n
+ *                                  AF results from AF algorithm.
+ * \param[out]  out_focal_length    Mandatory.\n
+ *                                  Calculated focal_length in x and y coordinates.
+ * \return                          Error code.
+ */
+LIBEXPORT ia_err
+ia_intrinsics_get_focal_length(ia_intrinsics *intrinsics_ptr, ia_aiq_af_results *af_results, float *out_focal_length);
+
+/*! \brief Configure the intrinsics lib to calculate the principal point.
+*
+* \param[in]   intrinsics_ptr           Mandatory.\n
+*                                       Intrinsics handle.
+* \param[in]   config_params            Mandatory.\n
+*                                       Needed to know the scaling/cropping done in the sensor and isp.
+* \return                               0 for no error, others for error.
+*
+* This function configures the intrinsics lib to provide the needed info to calculate
+* the principal point. This function must be called everytime the pipe config changes before
+* calling the API to get the principal point.
+*/
+LIBEXPORT ia_err
+ia_intrinsics_config(ia_intrinsics *intrinsics_ptr,
+    ia_intrinsics_config_params *config_params);
+
+
+/*! \brief Function to get the principal point x, y coordinates.
+*
+* \param[in]   intrinsics_ptr       Mandatory.\n
+*                                   Intrinsics handle.
+* \param[out]  out_principal_point  Mandatory.\n
+*                                   Calculated principal point  x, y coordinates.
+* \return                           0 for no error, others for error.
+*
+* This function returns the principal point based on the sensor params and pipe config given in the config function.
+* Config function must be called atleast once before calling this function.
+*/
+LIBEXPORT ia_err
+ia_intrinsics_get_principal_point(ia_intrinsics *intrinsics_ptr, float *out_principal_point);
+
+/*! \brief Function to get the distortion coefficients.
+*
+* \param[in]   intrinsics_ptr               Mandatory.\n
+*                                           Intrinsics handle.
+* \param[out]  out_radial_distortion        Mandatory.\n
+*                                           Calculated radial_distortion coefficients k1, k2, k3.
+* \param[out]  out_tangential_distortion    Mandatory.\n
+*                                           Calculated tangential_distortion coefficients p1, p2.
+* \return                                   0 for no error, others for error.
+*
+* This function returns the radial_distortion and tangential_distortion coefficients point based on the cmc info given in the
+* init function. Cmc is not expected to change after intrinsic lib init.
+*/
+LIBEXPORT ia_err
+ia_intrinsics_get_distortion_coefficients(ia_intrinsics *intrinsics_ptr, float *out_radial_distortion, float *out_tangential_distortion);
+
+/*! \brief Function to set zoom factor.
+*
+* \param[in]   intrinsics_ptr               Mandatory.\n
+*                                           Intrinsics handle.
+* \param[out]  zoom_factor                  Mandatory.\n
+*                                           Zoom factor to set.
+*/
+LIBEXPORT void
+ia_intrinsics_set_zoom_factor(ia_intrinsics *intrinsics_ptr, float zoom_factor);
+
+/*!
+ * \brief De-initialize intrinsics lib.
+ * All memory allocated by intrinsics library are freed.
+ *
+ */
+LIBEXPORT void
+ia_intrinsics_deinit(ia_intrinsics *intrinsics_ptr);
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA_INTRINSICS_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics_types.h
new file mode 100644
index 000000000000..1486cc4d0455
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics_types.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*!
+ * \file ia_intrinsics_types.h
+ * \brief Data types and enumerations for Intel Intrinsics library.
+ */
+#ifndef _IA_INTRINSICS_TYPES_H_
+#define _IA_INTRINSICS_TYPES_H_
+#include <stdint.h>
+#include "ia_types.h"
+
+typedef struct ia_intrinsics_t ia_intrinsics;
+
+/*!
+ * \brief ia_intrinsics structure.
+ */
+
+typedef struct ia_intrinsics_t
+{
+    float principal_point[2];                       /*!<The current principal point of the camera in x and y coordinates based on the current pipe config*/
+    float radial_distortion[3];                     /*!<The radial distortion coefficients of the camera based on the current cmc*/
+    float tangential_distortion[2];                 /*!<The tangential distortion coefficients of the camera based on the current cmc*/
+    float undistorted_projection_transform[16];     /*!<4x4 warping matrix which can be used to describe the mapping between
+                                                        3D world points and image pixels like camera intrinsics matrix*/
+    const ia_cmc_t *ia_cmc;
+    float zoom_factor;                              /*!<Zoom factor to be used in the calculations*/
+    bool  focus_supported;                          /*!<Is focussing supported*/
+    bool  dvs_enabled;                              /*!<Is DVS enabled*/
+    ia_aiq_frame_params *output_frame_descriptor;   /*!<Scale and crop info of output*/
+} ia_intrinsics_t;
+
+/** Total cropping parameters
+*  These parameters contain sensor and ISP cropping information without any scaling or binning.
+*  In case of scaling before cropping, cropping params needs to be scaled back to the original resolution.
+*  This information is used to crop lens distortion grids accordingly.
+*/
+typedef struct
+{
+    unsigned int horizontal_crop_offset;    /* Read out offset horizontal */
+    unsigned int vertical_crop_offset;      /* Read out offset vertical */
+    unsigned int cropped_width;             /* Width of cropped area without any scaling*/
+    unsigned int cropped_height;            /* Height of cropped area without any scaling*/
+} ia_intrinsics_crop_params;
+
+#endif /* _IA_INTRINSICS_TYPES_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt.h
new file mode 100644
index 000000000000..396bc4246f55
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt.h
@@ -0,0 +1,916 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_isp_bxt.h
+ * \brief ia_isp_bxt specific implementation.
+ *
+ * \mainpage
+ * \section main Automatic ISP (AIC) Configuration component for IPU4 (and onwards)
+ *
+ * AIC is stateless component, which purpose is to
+ * - Convert generic results into ISP specific format.
+ * - Adapt ISP tunings based on run-time changing parameters.
+ * - Convert ISP specific statistics into format that is used by 3A and control other algorithms.
+ *
+ * AIC consists of following components:
+ * - \ref gaic
+ * - \ref pal
+ *
+ * AIC API is defined in ia_isp_bxt.h file.
+ *
+ * See \ref integration for more detailed information about various integration details.
+ *
+ * \page aicparts AIC modules
+ * \section gaic Generic AIC (GAIC)
+ *
+ * GAIC implements generic adaptation of tunings (generated with IQ tools) as factor of run-time changing parameters. GAIC uses various interpolation
+ * schemes to calculate ISP parameters between distinct tunings.
+ *
+ * \section pal Parameter Abstraction Layer (PAL)
+ *
+ * PAL generates ISP parameters to each ISP block based on distinct tuning given to it. Refer to PAL documentation for detailed description for
+ * configuration and dependencies of each ISP block.
+ *
+ * \page integration Integration notes
+ * \section AIC output buffer state
+ *
+ * AIC is stateless but instead state is stored inside output buffer. Naturally, if same output buffer is not given back to AIC in the next iteration
+ * AIC will recalculate all ISP parameters, thus maintaining backwards compatibility for systems that don't utilize buffer state.AIC determines if the given buffer
+ * is the same by compating if the first 8 bytes of the given buffer are always the same. If AIC client uses the same output buffer all the time, client should
+ * invalidate (by clearing the first 8 bytes of the) given AIC output buffer when any resolution (resolution_info or resolution_history) parameters change at any
+ * stage of the camera operation. Such changes include for example change in digital zoom, scaling and cropping.
+ *
+ * \section ispdg Digital gain in ISP
+ *
+ * Applying DG in ISP is preferable over sensor digital gain in certain cases:
+ * - ISP may have higher bit depth in the image and retain information that would be lost, if digital gain operation would be done in the sensor.
+ * - ISP can apply gains after statistics calculation. This allows 3A algorithms to operate on statistics, which would be saturated by digital gain.
+ *   - Sometimes this is the only way to gain image data further, if higher that maximum WB gains that ISP block supports are required.
+ *
+ * There are three ways to implement digital gain operation in a running system (using input parameters for ia_isp_bxt_run function).
+ * AIC client should make decision how to apply digital gain before and after statistics (or partially both):
+ * 1. Apply digital gain in WB gains.
+ *  - Digital gain operation is applied in ISP after statistic collection (preferred)
+ *  - Applying digital gain after statistics collection reduces saturation of image before statistics calculation giving 3A+ algorithms best possible statistics input.
+ *  - This can be done only if all digital gain can be applied by WB ISP block.
+ *  - Route AEC digital gain to ia_aiq_pa_run() in ia_aiq_pa_input_params->color_gains. Further route ia_aiq_pa_results to AIC.
+ * 2. Apply digital gain in manual_digital_gain.
+ *  - This is simple from integration point of view.
+ *  - Digital gain operation is applied before statistics collection (may saturate some image data in early phase of image processing).
+ *  - Route AEC digital gain directly to manual_digital_gain parameter.
+ * 3. Apply digital gain partially in WB gains and partially in manual_digital_gain.
+ *  - Should be considered only if digital gain exceeds maximum gain supported by WB ISP block (see option 1).
+ *  - Most difficult to integrate. Consider using this option, if image quality is not sufficient by using option 2.
+ *  - Each ia_aiq_pa_results->color_gains gain is compared against maximum supported gain in the WB ISP block.
+ *  - If all gains are below maximum supported gain, apply all gains in color_gains.
+ *   - Example:
+ *    - Maximum supported gain in WB ISP block is 15.9.
+ *    - AEC requests digital gain on 4.0 -> apply digital gain to all color channels as color_gains in ia_aiq_pa_run() input parameters.
+ *    - WB gains for all color channels after ia_aiq_pa_run() (including white point gains from AWB results) are all below 15.9
+ *     -> pass ia_aiq_pa_results to AIC as they are.
+ *  - If some of the gains are above maximum supported gain, extract smallest amount of common gains from all color channels and set that in manual_digital_gain.
+ *   - Note for integration: When giving statistics to AIQ, modified ia_aiq_pa_results (where common gain was removed) should be given along with the statistics.
+ *     Also manual_digital_gain should be given in ia_aiq_ae_results, which indicates how much digital gain was applied in the statistics.
+ *   - Example:
+ *    - Maximum supported gain in WB ISP block is 15.9.
+ *    - AEC requests digital gain on 18.0 -> apply digital gain to all color channels as color_gains in ia_aiq_pa_run() input parameters.
+ *    - Some color channels' WB gains after ia_aiq_pa_run() (including white point gains from AWB results) are all above 15.9
+ *     -> modify WB gains so that common for all color channels gain is removed from ia_aiq_pa_results->color_gains and given as manual_digital_gain to AIC.
+ *
+ * \section performance Power & Perfomance optimizations
+ *
+ * \subsection state AIC output buffer state
+ *
+ * AIC being stateless component, won't retain anything in history of previous iterations. However, if AIC output buffer is given to AIC (to fill) by the client,
+ * AIC stores state of ISP parameters in that buffer. Then in the next iteration, if same AIC output buffer (with same exact list of run_kernels) is given back to AIC,
+ * it can decide to execute or skip calculation of new ISP parameters.
+ *
+ * \subsection tunablerunrate Tunable run rate of ISP algorithms
+ *
+ * Calculation of some ISP configuration parameters can be heavy and in some cases it is not needed to run some algorithms at every ia_isp_bxt_run iteration.
+ * AIC supports variable run rate of ISP algorithms via tuning record, which contains list of ISP block UUIDs and their corresponding execution rate in microseconds.
+ * AIC needs to get correct timestamp in microseconds as input. This timestamp is stored into the AIC output buffer. If same buffer is given back to AIC in the
+ * next iteration, AIC detects it, compares newly given timestamp against the timestamp of the previous run and decides if calculation of certain ISP parameters
+ * need to be done.
+ *
+*/
+
+#ifndef IA_ISP_BXT_H_
+#define IA_ISP_BXT_H_
+
+#include "ia_aiq_types.h"
+#include "ia_types.h"
+#include "ia_isp_bxt_types.h"
+#include "ia_isp_bxt_statistics_types.h"
+#include "ia_isp_types.h"
+#include "ia_dvs_types.h"
+#include "ia_ltm_types.h"
+#include "ia_mkn_types.h"
+#include "ia_view_types.h"
+#include "ia_ob.h"
+#include "ia_isp_bxt_deprecated.h"
+#include "ia_bcomp_types.h"
+#include "ia_ccat_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*!
+ * \brief Initialize IA_ISP and its submodules.
+ * This function must be called before any other function in the library. It allocates memories and parses ISP specific parts from CPFF.
+ * Initialization returns a handle to the ISP instance, which is given as input parameter for all the
+ * ISP functions.
+ *
+ * \param[in]     aiqb_data          Mandatory although function will not return error, if it not given.\n
+ *                                   Reads generic AIC records Block from CPFF.
+ * \param[in]     ia_cmc             Mandatory. Parsed camera module characterization structure. IA_ISP will use structures behind given pointer.
+ *                                   Structure must be valid throughout whole lifetime of IA_ISP component.
+ * \param[in]     max_stats_width    Mandatory. Maximum width of RGBS and AF statistics grids from ISP. Used to calculate size of
+ *                                   memory buffers for the IA_AIQ algorithms. The same maximum width will be used for all RGBS
+ *                                   and AF statistics grid allocations.
+ * \param[in]     max_stats_height   Mandatory. Maximum height of RGBS and AF statistics grids from ISP. Used to calculate size of
+ *                                   memory buffers for the IA_AIQ algorithms. The same maximum height will be used for all RGBS
+ *                                   and AF statistics grid allocations.l
+ *                                   Initialization parameters for statistics conversion.
+ * \param[in]     max_num_stats_in   Mandatory. The maximum number of input statistics for one frame. Each statistics is related to different exposure.
+ *                                   Used especially for sensors that support two or more simultaneous exposures (HDR).
+ */
+
+LIBEXPORT ia_isp_bxt*
+ia_isp_bxt_init(
+    const ia_binary_data *aiqb_data,
+    const ia_cmc_t *ia_cmc,
+    unsigned int max_stats_width,
+    unsigned int max_stats_height,
+    unsigned int max_num_stats_in,
+    ia_mkn *ia_mkn);
+
+/*!
+* \brief Set tuning to an existing AIC instance.
+* This function can be used to switch tunings on-the-fly in a way that AIC preserves its state and offers smooth transition from one tuning to another.
+* \param[in]    ia_isp_ptr      Handle to the ia_isp instance. This is the output of _init.
+* \param[in]    aiqb_data       Binary data containing the tunings.
+* \param[in]    ia_cmc_ptr      Parsed structure of Camera Module Characterization.
+* \returns error codes
+*/
+LIBEXPORT ia_err
+ia_isp_bxt_set_tuning(ia_isp_bxt *ia_isp_ptr,
+     const ia_binary_data *aiqb_data,
+     const ia_cmc_t *ia_cmc_ptr);
+
+LIBEXPORT void
+ia_isp_bxt_deinit(ia_isp_bxt *ia_isp_bxt);
+
+
+
+/*!
+*  \brief IA_ISP_BXT parameter input structure.
+*/
+typedef struct ia_isp_bxt_input_params_v2
+{
+    ia_aiq_frame_params *sensor_frame_params;        /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
+    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
+    ia_aiq_gbce_results *gbce_results;               /*!< Mandatory. GBCE Gamma tables which are to be used to calculate next ISP parameters.*/
+    ia_aiq_ae_results *ae_results;                   /*!< Mandatory. Exposure results which are to be used to calculate next ISP parameters.
+                                                                     Currently only exposure times, analog and digital gains are used. For convenience reasons AIC takes
+                                                                     ae results and not only needed parameters. */
+    ia_aiq_pa_results_v1 *pa_results;                /*!< Mandatory. Parameter adaptor results from AIQ. */
+    ia_aiq_sa_results_v1 *sa_results;                /*!< Mandatory. Shading adaptor results from AIQ. */
+    ia_aiq_hist_weight_grid *weight_grid;            /*!< Mandatory. Weight map to be used in the next frame histogram calculation. */
+    ia_isp_bxt_program_group *program_group;         /*!< Mandatory. List of kernels associated with this program group */
+    unsigned int stream_id;                          /*!< Optional. If program_group is not given, stream_id is used to fetch all the tunings for all the kernels
+                                                                    associated with the stream_id. */
+    ia_isp_feature_setting nr_setting;               /*!< Mandatory. Feature setting for noise reduction algorithms. */
+    ia_isp_feature_setting ee_setting;               /*!< Mandatory. Feature setting for edge enhancement algorithms. */
+    char manual_brightness;                          /*!< Optional. Manual brightness value range [-128,127]. Value 0 means no change. */
+    char manual_contrast;                            /*!< Optional. Manual contrast value range [-128,127]. Value 0 means no change. */
+    char manual_hue;                                 /*!< Optional. Manual hue value range [-128,127]. Value 0 means no change.
+                                                                    Value -96 means red become blue, green become red, blue become green */
+    char manual_saturation;                          /*!< Optional. Manual saturation value range [-128,127]. Value 0 means no change. */
+    ia_isp_effect effects;                           /*!< Optional. Manual setting for special effects. Combination of ia_isp_effect enums.*/
+    ia_dvs_morph_table *dvs_morph_table;             /*!< Mandatory. DVS results which are passed to GDC ISP FW. If null is given, PAL produces default
+                                                                     morphing table in PAL results. PAL will add scaling to the grid if defined in resolution info.*/
+    ia_isp_custom_controls* custom_controls;         /*!< Optional. Custom control parameter for interpolating between different tunings.
+                                                                    If custom controls are not used, pointer can be set as null.*/
+    ia_binary_data* pal_override;                    /*!< Optional. Set of parameters for overriding tunings from CPF. Parameters need to follow
+                                                                    Algo API binary format. Binary may contain multiple parameter sets.
+                                                                    Can be set as null if PAL override functionality is not used. */
+    ia_ltm_results *ltm_results;                     /*!< Mandatory. Local tone mapping results from LTM. */
+    ia_ltm_drc_params *ltm_drc_params;               /*!< Mandatory. DRC parameters from LTM. */
+    float manual_digital_gain;                       /*!< Optional. Additional digital gain that is applied to all color channels of the image before ISP statistics collection.
+                                                                    Values less than 1.0 means no additional gain. */
+    ia_ob_output ob_black_level;                     /*!< Optional. Black level values calculated on-the-fly when the sensor supports. */
+    unsigned long long timestamp;                    /*!< Mandatory. Current timestamp (is microseconds) when ia_isp_bxt_run function is called. AIC uses timestamp to decide what
+                                                                     calculations are done based on tunable run rate for each ISP configuration algorithm. */
+    ia_dvs_image_transformation *gdc_transformation; /*!< Mandatory. Image transformation parameters for GDC5 ISP FW. This feature replaces the need for morph_table usage.*/
+    ia_isp_bxt_view_params_t const *view_params;     /*!< Optional. View parameters for running in GDC5 mode.*/
+    ia_media_format media_format;                    /*!< Mandatory. Selected Digital television output format.(e.g. BT709) */
+    ia_bcomp_results const *bcomp_results;           /*!< Optional.  bit-compression curves. */
+    ia_isp_bxt_gdc_limits const *gdc_mbr_limits;     /*!< Optional.  GDC MBR limits for WFOV usecases */
+} ia_isp_bxt_input_params_v2;
+
+/*!
+ * \brief Dump AIC input parameters to binary, for debug purpose only.
+ *
+ * \param[in] input_params                  Mandatory. Input parameters for AIC.
+ * \param[out] output_data                  Mandatory. Output data structure which contains the dump of input_params.
+ * \return                                  Error code.
+ */
+LIBEXPORT ia_err
+ia_isp_bxt_input_params_dump(
+    const ia_isp_bxt_input_params_v2 *bxt_input_params,
+    ia_binary_data *output_data);
+
+/*!
+ * \brief Load AIC input parameters from binary, for debug purpose only.
+ *
+ * \param[out] input_params                Mandatory. AIC input parameters loaded from binary.
+ * \param[in] output_data                  Mandatory. Binary where to load AIC input parameters from.
+ * \return                                 Error code.
+ */
+LIBEXPORT ia_err
+ia_isp_bxt_input_params_load(
+    ia_isp_bxt_input_params_v2 **input_params,
+    const ia_binary_data *output_data);
+
+/*!
+ * \brief ISP configuration for the next frame
+ * Computes ISP parameters from input parameters and CPF values for the next image.
+ *
+ * \param[in] ia_isp_bxt                    Mandatory. ISP instance handle.
+ * \param[in] input_params                  Mandatory. Input parameters for ISP calculations.
+ * \param[in] output_data                   Mandatory. Output data structure. If output_data->data pointer is given, AIC writes the results to given buffer.
+ *                                                     Output is PAL output following ISP API format.
+ * \return                                  Error code.
+ *
+ */
+LIBEXPORT ia_err
+ia_isp_bxt_run_v2(
+    ia_isp_bxt *ia_isp_bxt,
+    const ia_isp_bxt_input_params_v2 *input_params,
+    ia_binary_data *output_data);
+
+/*!
+ * \brief Get version.
+ * Get version from version header.
+ *
+ * \return                         Version string.
+ */
+LIBEXPORT const char*
+ia_isp_bxt_get_version(void);
+
+/*!
+* \brief Get PAL kernel statuses.
+* Get PAL kernel status list from previous run.
+* \param[in] ia_isp_bxt                    Mandatory. ISP instance handle.
+* \param[in] pal_status_list               Mandatory. Pointer's pointer where kernel status list is set.
+* \param[in] status_list_count             Mandatory. Pointer where number of statuses is written.
+*
+*/
+LIBEXPORT void
+ia_isp_bxt_get_pal_status_list(ia_isp_bxt *ia_isp_bxt_ptr, ia_isp_pal_status_t **pal_status_list, unsigned int *status_list_count);
+
+/*!
+ * \brief Calculates ISP parameters output buffer size for given program group.
+ * This function can be used by AIC client to query the size of AIC output buffer for particular program group. Client should allocate the memory and
+ * pass the size and data it to ia_isp_bxt_run() function in the output_data structure.
+ *
+ * \param[in] program_group        Optional. List of kernels associated with this program group. If NULL, AIC calculates output size of all ISP blocks.
+ * \return                         Size of memory to allocate in order to fit the
+ */
+LIBEXPORT int
+ia_isp_bxt_get_output_size(ia_isp_bxt_program_group *program_group);
+
+/*!
+ * \brief Gets a pointer of HDR YV statistics inside the given binary statistics buffer.
+ * Note! Output hdr_yv_grid always points inside the given statistics buffer.
+ * \param[in]  statistics        Mandatory. Statistics in ISP specific format.
+ * \param[out] hdr_yv_grid       Mandatory. Pointer's pointer where address of statistics are located. Pointing inside given statistics buffer.
+ * \return                       Error code.
+ */
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_get_hdr_yv_in_binary(
+    const ia_binary_data *statistics,
+    ia_isp_bxt_hdr_yv_grid_t **hdr_yv_grid);
+
+/*!
+ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
+ * from various ISP formats into AIQ statistics format.
+ * \param[in] ia_isp_bxt         Mandatory. ia_isp_bxt instance handle.
+ * \param[in]  statistics        Mandatory. Statistics in ISP specific format.
+ * \param[out] out_query_results Mandatory. A pointer to the query results which indicate which statistics are available.
+ * \return                       Error code.
+ */
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_query(
+    ia_isp_bxt *ia_isp_bxt,
+    const ia_binary_data *statistics,
+    ia_isp_bxt_statistics_query_results_t* out_query_results);
+
+/*!
+ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
+ * from various ISP formats into AIQ statistics format.
+ * \param[in] ia_isp_bxt            Mandatory. ia_isp_bxt instance handle.
+ * \param[in] statistics            Mandatory. Statistics in ISP specific format.
+ * \param[in] ir_weight             Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
+ * \param[in] ae_results            Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
+ *                                  used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
+ * \param[in] wb_color_gains        Mandatory for cases(such as DOL) where statistics have WB already applied in the ISP which needs to be reverted for valid RGBS stat calculation,
+ *                                  ignored otherwise. The color gains are from PA results(ia_aiq_pa_results.color_gains) used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
+ * \param[in] bcomp_results         Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU6).
+ * \param[out] out_rgbs_grid        Mandatory. Pointer's pointer where address of converted statistics are stored.
+ *                                  Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+ *                                  if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
+ * \param[out] out_ir_grid          Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
+ *                                  Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+ *                                  if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
+ * \return                          Error code.
+ */
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_awb_from_binary_v4(
+    ia_isp_bxt *ia_isp_bxt,
+    const ia_binary_data *statistics,
+    const ia_aiq_ir_weight_t *ir_weight,
+    const ia_aiq_ae_results *ae_results,
+    const ia_aiq_color_channels *wb_color_gains,
+    const ia_bcomp_results *bcomp_results,
+    ia_aiq_rgbs_grid **out_rgbs_grid,
+    ia_aiq_grid **out_ir_grid);
+
+/*!
+* \brief Converts awb statistics to ccat format (<=IPU6).
+* ISP generated statistics may not be in the ccat format. Statistics need to be converted
+* from various ISP formats into CCAT statistics format.
+* \param[in] ia_isp_bxt             Mandatory. ia_isp_bxt instance handle.
+* \param[in] stats_width            Mandatory actual width of the statistics grid.
+* \param[in] stats_height           Mandatory actual height of the statistics grid.
+* \param[in] buf_color              Mandatory Average level of colors in hw statistics format.
+* \param[in] buf_sat                Mandatory Saturation ratio data in hw statistics format.
+*                                       0: 0% above saturation
+*                                       255: 100% above saturation
+* \param[in] color_stride           Mandatory. Stride in bytes for single row of color average data in buf_color.
+* \param[in] sat_stride             Mandatory. Stride in bytes for single row of saturation data in buf_sat.
+* \param[in] ir_weight              Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
+* \param[in] ae_results             Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
+*                                   used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
+* \param[in] wb_color_gains         Mandatory for cases(such as DOL) where statistics have WB already applied in the ISP which needs to be reverted for valid RGBS stat calculation,
+*                                   ignored otherwise. The color gains are from PA results(ia_aiq_pa_results.color_gains) used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
+* \param[in] bcomp_results          Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU7).
+* \param[out] out_rgbs_grid         Mandatory. CCAT output rgbs-grids. At least IA_CCAT_STATISTICS_MAX_NUM grids.
+* \param[out] out_ir_grid           Mandatory for RGB-IR sensors, NULL otherwise. CCAT output ir-grid.
+* \return                           Error code.
+*/
+LIBEXPORT ia_err
+ia_isp_statistics_convert_awb_ccat(
+    ia_isp_bxt *ia_isp_bxt,
+    unsigned int stats_width,
+    unsigned int stats_height,
+    const void *buf_color,
+    const void *buf_sat,
+    unsigned int color_stride,
+    unsigned int sat_stride,
+    const ia_aiq_ir_weight_t *ir_weight,
+    const ia_aiq_ae_results *ae_results,
+    const ia_aiq_color_channels *wb_color_gains,
+    const ia_bcomp_results *bcomp_results,
+    ia_rgbs_grid *out_rgbs_grids,
+    ia_ccat_grid_char *out_ir_grid);
+
+/*!
+* \brief Converts rgbs grid statistics to ccat format (IPU7->).
+* ISP generated statistics may not be in the ccat format. Statistics need to be converted
+* from various ISP formats into CCAT statistics format.
+* \param[in] ia_isp_bxt             Mandatory. ia_isp_bxt instance handle.
+* \param[in] stats_width            Mandatory actual width of the statistics grid.
+* \param[in] stats_height           Mandatory actual height of the statistics grid.
+* \param[in] buf1_c0_c1_c2_c3       Mandatory Average level of c0-c3 colors
+* \param[in] buf2_c4_c5_c6_c7       Average level of c4-c7 colors. Can be NULL, if buf2_cid_count is 0.
+* \param[in] sat_buf                Mandatory Represents Saturation ratio.
+*                                       0: 0% above saturation
+*                                       255: 100% above saturation
+* \param[in] buf1_cid_count         Mandatory. Number of color ids in buf1_c0_c1_c2_c3. Either 1 or 4.
+* \param[in] buf2_cid_count         Mandatory. Number of color ids in buf2_c4_c5_c6_c7. Can be 0, 1 or 4.
+* \param[in] min_out_bytes_per_cell Mandatory. Minimum number of bytes per grid cell.
+* \param[in] uint8_t_statistics     Mandatory.
+*                                       true:  uint8_t  average values in buf1 and buf2
+*                                       false: uint16_t average values in buf1 and buf2
+* \param[in] ir_weight              Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
+* \param[in] ae_results             Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
+*                                   used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
+* \param[in] wb_color_gains         Mandatory for cases(such as DOL) where statistics have WB already applied in the ISP which needs to be reverted for valid RGBS stat calculation,
+*                                   ignored otherwise. The color gains are from PA results(ia_aiq_pa_results.color_gains) used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
+* \param[in] bcomp_results          Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU7).
+* \param[out] out_rgbs_grid         Mandatory. CCAT output rgbs-grids. At least IA_CCAT_STATISTICS_MAX_NUM grids.
+* \param[out] out_ir_grid           Mandatory for RGB-IR sensors, NULL otherwise. CCAT output ir-grid.
+* \return                           Error code.
+*/
+LIBEXPORT ia_err
+ia_isp_statistics_convert_rgbs_grid_ccat(
+    ia_isp_bxt *ia_isp_bxt,
+    unsigned int stats_width,
+    unsigned int stats_height,
+    const void *buf1_c0_c1_c2_c3,
+    const void *buf2_c4_c5_c6_c7,
+    const void *sat_buf,
+    int buf1_cid_count,
+    int buf2_cid_count,
+    int min_out_bytes_per_cell,
+    bool uint8_t_statistics,
+    const ia_aiq_ir_weight_t *ir_weight,
+    const ia_aiq_ae_results *ae_results,
+    const ia_aiq_color_channels *wb_color_gains,
+    const ia_bcomp_results *bcomp_results,
+    ia_rgbs_grid *out_rgbs_grids,
+    ia_ccat_grid_char *out_ir_grid);
+
+/*!
+* \brief Converts fr grid statistics to ccat format (all ipus).
+* ISP generated statistics may not be in the ccat format. Statistics need to be converted
+* from various ISP formats into CCAT statistics format.
+* \param[in] ia_isp_bxt             Mandatory. ia_isp_bxt instance handle.
+* \param[in] stats_width            Mandatory actual width of the statistics grid.
+* \param[in] stats_height           Mandatory actual height of the statistics grid.
+* \param[in] buf1                   Mandatory fr filter data
+* \param[in] buf2                   Optional fr filter data. Only used with ipu7. <= ipu6 must set this to NULL
+* \param[in] stride                 Mandatory. Stride in bytes for single row of fr filter data in buf(s).
+* \param[in] num_stats              Mandatory. Number of fr grids allocated behind the fr_grids pointer.
+* \param[out] fr_grids              Mandatory. CCAT output fr-grids pointer.
+* \return                           Error code.
+*/
+LIBEXPORT ia_err
+ia_isp_statistics_convert_af_ccat(
+    ia_isp_bxt *ia_isp_bxt,
+    unsigned int stats_width,
+    unsigned int stats_height,
+    const void *buf1,
+    const void *buf2,
+    unsigned int stride,
+    unsigned int num_stats,
+    ia_filter_response_grid *fr_grids);
+
+/*!
+* \brief Converts rgbs grid statistics to IA_AIQ format (IPU7->).
+* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
+* from various ISP formats into AIQ statistics format.
+* \param[in] ia_isp_bxt             Mandatory. ia_isp_bxt instance handle.
+* \param[in] stats_width            Mandatory actual width of the statistics grid.
+* \param[in] stats_height           Mandatory actual height of the statistics grid.
+* \param[in] buf1_c0_c1_c2_c3       Mandatory Average level of c0-c3 colors
+* \param[in] buf2_c4_c5_c6_c7       Average level of c4-c7 colors. Can be NULL, if buf2_cid_count is 0.
+* \param[in] sat_buf                Mandatory Represents Saturation ratio.
+*                                       0: 0% above saturation
+*                                       255: 100% above saturation
+* \param[in] buf1_cid_count         Mandatory. Number of color ids in buf1_c0_c1_c2_c3. Either 1 or 4.
+* \param[in] buf2_cid_count         Mandatory. Number of color ids in buf2_c4_c5_c6_c7. Can be 0, 1 or 4.
+* \param[in] min_out_bytes_per_cell Mandatory. Minimum number of bytes per grid cell.
+* \param[in] output_packed          Mandatory.
+*                                       true:  uint8_t  average values in buf1 and buf2
+*                                       false: uint16_t average values in buf1 and buf2
+* \param[in] ir_weight              Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
+* \param[in] ae_results             Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
+*                                   used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
+* \param[in] wb_color_gains         Mandatory for cases(such as DOL) where statistics have WB already applied in the ISP which needs to be reverted for valid RGBS stat calculation,
+*                                   ignored otherwise. The color gains are from PA results(ia_aiq_pa_results.color_gains) used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
+* \param[in] bcomp_results          Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU7).
+* \param[out] out_rgbs_grid         Mandatory. Pointer's pointer where address of converted statistics are stored.
+*                                   Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+*                                   if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
+* \param[out] out_ir_grid           Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
+*                                   Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+*                                   if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
+* \return                           Error code.
+*/
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_rgbs_grid(
+    ia_isp_bxt *ia_isp_bxt,
+    unsigned int stats_width,
+    unsigned int stats_height,
+    const void *buf1_c0_c1_c2_c3,
+    const void *buf2_c4_c5_c6_c7,
+    const void *sat_buf,
+    int buf1_cid_count,
+    int buf2_cid_count,
+    int min_out_bytes_per_cell,
+    bool output_packed,
+    const ia_aiq_ir_weight_t *ir_weight,
+    const ia_aiq_ae_results *ae_results,
+    const ia_aiq_color_channels *wb_color_gains,
+    const ia_bcomp_results *bcomp_results,
+    ia_aiq_rgbs_grid **out_rgbs_grid,
+    ia_aiq_grid **out_ir_grid);
+
+/*!
+ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
+ * from various ISP formats into AIQ statistics format.
+ * \param[in] ia_isp_bxt               Mandatory.\n
+ *                                     ia_isp_bxt instance handle.
+ * \param[in]  stats_width             Mandatory actual width of the statistics grid.
+ * \param[in]  stats_height            Mandatory actual height of the statistics grid.
+ * \param[in]  c0_avg                  Mandatory Average level of c0 color
+ * \param[in]  c1_avg                  Mandatory Average level of c0 color
+ * \param[in]  c2_avg                  Mandatory Average level of c0 color
+ * \param[in]  c3_avg                  Mandatory Average level of c0 color
+ * \param[in]  c4_avg                  Mandatory Average level of c0 color
+ * \param[in]  c5_avg                  Mandatory Average level of c0 color
+ * \param[in]  c6_avg                  Mandatory Average level of c0 color
+ * \param[in]  c7_avg                  Mandatory Average level of c0 color
+ * \param[in]  sat_ratio_0             Mandatory Represents Saturation ratio.
+ *                                               0: 0% above saturation
+ *                                               255: 100% above saturation
+ * \param[in]  sat_ratio_1             Mandatory Represents Saturation ratio.
+ *                                               0: 0% above saturation
+ *                                               255: 100% above saturation
+ * \param[in]  sat_ratio_2             Mandatory Represents Saturation ratio.
+ *                                               0: 0% above saturation
+ *                                               255: 100% above saturation
+ * \param[in]  sat_ratio_3             Mandatory Represents Saturation ratio.
+ *                                               0: 0% above saturation
+ *                                               255: 100% above saturation
+ * \param[in]  ir_weight               Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid for given frame.
+ * \param[in]  ae_results              Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
+ *                                     used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
+ * \param[in]  wb_color_gains          Mandatory for cases(such as DOL) where statistics have WB already applied in the ISP which needs to be reverted for valid RGBS stat calculation,
+ *                                     ignored otherwise. The color gains are from PA results(ia_aiq_pa_results.color_gains) used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
+ * \param[in] bcomp_results            Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU6)
+ *
+ * \param[out] out_rgbs_grid           Mandatory. Pointer's pointer where address of converted statistics are stored.
+ *                                     Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+ *                                     if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
+ * \param[out] out_ir_grid             Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
+ *                                     Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+ *                                     if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
+ *
+ * \return                             Error code.
+ */
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_awb_v4(
+    ia_isp_bxt *ia_isp_bxt,
+    unsigned int stats_width,
+    unsigned int stats_height,
+    void *c0_avg,
+    void *c1_avg,
+    void *c2_avg,
+    void *c3_avg,
+    void *c4_avg,
+    void *c5_avg,
+    void *c6_avg,
+    void *c7_avg,
+    void *sat_ratio_0,
+    void *sat_ratio_1,
+    void *sat_ratio_2,
+    void *sat_ratio_3,
+    const ia_aiq_ir_weight_t *ir_weight,
+    const ia_aiq_ae_results *ae_results,
+    const ia_aiq_color_channels *wb_color_gains,
+    const ia_bcomp_results *bcomp_results,
+    ia_aiq_rgbs_grid **out_rgbs_grid,
+    ia_aiq_grid **out_ir_grid);
+
+/*!
+* \brief Converts BXT ISP specific statistics (MSB aligned) to IA_AIQ format.
+* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
+* from various ISP formats into AIQ statistics format.
+*
+* \param[in]  ia_isp_bxt                         Mandatory. ia_isp_bxt instance handle.
+* \param[in]  statistics                         Mandatory. Statistics in ISP specific format. Must be MSB aligned to ia_isp_bxt_ptr->ia_cmc->cmc_general_data->bit_depth.
+* \param[in]  hdr_compression                    Optional. NULL, if HDR statistics are already in linear space (no compression).
+* \param[in]  stats_rgbs_hdr_block_pixel_width   Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Width of the block in pixel used in computing the saturation percentage.
+* \param[in]  stats_rgbs_hdr_block_pixel_height  Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Height of the block in pixel used in computing the saturation percentage.
+* \param[in]  r_gain                             Mandatory. Gain applied to the R color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
+* \param[in]  g_gain                             Mandatory. Gain applied to the G color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
+* \param[in]  b_gain                             Mandatory. Gain applied to the B color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
+* \param[out] out_rgbs_grid                      Mandatory. Pointer's pointer where address of converted statistics are stored.
+* \param[out] out_hdr_rgbs_grid                  Optional. Pointer's pointer where address of combined HDR statistics are stored.
+*                                                Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+*                                                if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
+* \return                                        Error code.
+*/
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_awb_hdr_from_binary_v2(
+    ia_isp_bxt *ia_isp_bxt,
+    const ia_binary_data *statistics,
+    const ia_aiq_ae_results *ae_results,
+    const ia_isp_bxt_hdr_compression_t *hdr_compression,
+    unsigned int stats_rgbs_hdr_block_pixel_width,
+    unsigned int stats_rgbs_hdr_block_pixel_height,
+    float r_gain,
+    float g_gain,
+    float b_gain,
+    ia_aiq_rgbs_grid **out_rgbs_grid,
+    ia_aiq_hdr_rgbs_grid **out_hdr_rgbs_grid);
+
+/*!
+* \brief Converts HDR DP RGBS statistics (MSB aligned) to AIQ format.
+* ISP/VLIW generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted  into AIQ statistics format.
+* \param[in]  ia_isp_bxt                         Mandatory. ia_isp_bxt instance handle.
+* \param[in]  stats_width                        Mandatory. Actual width of the statistics grid.
+* \param[in]  stats_height                       Mandatory. Actual height of the statistics grid.
+* \param[in]  stats_r                            Mandatory. Must be MSB aligned to ia_isp_bxt_ptr->ia_cmc->cmc_general_data->bit_depth.
+* \param[in]  stats_b                            Mandatory. Must be MSB aligned to ia_isp_bxt_ptr->ia_cmc->cmc_general_data->bit_depth.
+* \param[in]  stats_g                            Mandatory. Must be MSB aligned to ia_isp_bxt_ptr->ia_cmc->cmc_general_data->bit_depth.
+* \param[in]  stats_s                            Mandatory.
+* \param[in]  hdr_compression                    Optional. NULL, if HDR statistics are already in linear space (no compression).
+* \param[in]  stats_rgbs_hdr_block_pixel_width   Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Width of the block in pixel used in computing the saturation percentage.
+* \param[in]  stats_rgbs_hdr_block_pixel_height  Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Height of the block in pixel used in computing the saturation percentage.
+* \param[in]  r_gain                             Mandatory. Gain applied to the R color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
+* \param[in]  g_gain                             Mandatory. Gain applied to the G color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
+* \param[in]  b_gain                             Mandatory. Gain applied to the B color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
+* \param[out] out_rgbs_grid                      Mandatory. Pointer's pointer where address of de-stitched statistics array is stored.
+* \param[out] out_hdr_rgbs_grid                  Optional. Pointer's pointer where address of combined HDR statistics is stored.
+*                                                Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+*                                                if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
+* \return                                        Error code.
+*/
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_awb_hdr_v2(
+    ia_isp_bxt *ia_isp_bxt_ptr,
+    unsigned int stats_width,
+    unsigned int stats_height,
+    void *stats_r,
+    void *stats_g,
+    void *stats_b,
+    void *stats_s,
+    const ia_aiq_ae_results *ae_results,
+    const ia_isp_bxt_hdr_compression_t *hdr_compression,
+    unsigned int stats_rgbs_hdr_block_pixel_width,
+    unsigned int stats_rgbs_hdr_block_pixel_height,
+    float  r_gain,
+    float  g_gain,
+    float  b_gain,
+    ia_aiq_rgbs_grid **out_rgbs_grid,
+    ia_aiq_hdr_rgbs_grid **out_hdr_rgbs_grid);
+
+/*!
+ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
+ * from various ISP formats into AIQ statistics format.
+ * \param[in]  ia_isp_bxt     Mandatory ia_isp_bxt instance handle.
+ * \param[in]  statistics     Mandatory. Statistics in ISP specific format.
+ *
+ * \param[out] out_af_grid    Mandatory. This pointer is returned from the initialize function
+ *                            Pointer's pointer where address of converted statistics are stored.
+ *                            Converted af grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+ *                            if the external buffer is provided in out_af_grid it will be used otherwise internal buffer is used.
+ * \return                    Error code.
+ */
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_af_from_binary(
+    ia_isp_bxt *ia_isp_bxt,
+    const ia_binary_data *statistics,
+    ia_aiq_af_grid **out_af_grid);
+
+/*!
+ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
+ * from various ISP formats into AIQ statistics format.
+ * \param[in]  ia_isp_bxt    Mandatory. ia_isp_bxt instance handle.
+ * \param[in]  stats_width   Mandatory. Actual width of the statistics grid.
+ * \param[in]  stats_height  Mandatory. Actual height of the statistics grid.
+ * \param[in]  y00_avg       Mandatory. Blocks value of Y00 filter response
+ * \param[in]  y01_avg       Mandatory. Blocks value of Y01 filter response. IPU7 must have a NULL in this.
+ * \param[in]  y10_avg       Mandatory. Blocks value of Y10 filter response
+ * \param[in]  y11_avg       Mandatory. Blocks value of Y11 filter response. IPU7 must have a NULL in this.
+ *
+ * \param[out] out_af_grid   Mandatory.\n
+ *                           Pointer's pointer where address of converted statistics are stored.
+ *                           Converted af grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+ *                           if the external buffer is provided in out_af_grid it will be used otherwise internal buffer is used.
+ * \return                   Error code.
+ */
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_af(
+    ia_isp_bxt *ia_isp_bxt,
+    unsigned int stats_width,
+    unsigned int stats_height,
+    void *y00_avg,
+    void *y01_avg,
+    void *y10_avg,
+    void *y11_avg,
+    ia_aiq_af_grid **out_af_grid);
+
+/*!
+* \brief Converts ISP specific statistics to ccat format.
+* ISP generated statistics may not be in the format in which ccat expect. Statistics need to be converted
+* from various ISP formats into ccat statistics format.
+* \param[in]  c0_histogram      Optional. Block value of c0_histogram. Mapped to rgb_histograms->r. If null, not read.
+* \param[in]  c1_histogram      Optional. Block value of c1_histogram. Mapped to rgb_histograms->g. If null, not read.
+* \param[in]  c2_histogram      Optional. Block value of c2_histogram. Mapped to rgb_histograms->b. If null, not read.
+* \param[in]  c3_histogram      Optional. Block value of c3_histogram. Mapped to y_histogram. If null, not read.
+* \param[in]  num_bins          Mandatory. Number of histogram bins in ISP generated histograms.
+* \param[out] rgb_histograms    Optional. Pointer to rgb histograms output. If null, not written to.
+* \param[out] y_histogram       Optional. Pointer to y histogram output. If null, not written to.
+* \return                       Error code.
+*/
+LIBEXPORT ia_err
+ia_isp_statistics_convert_histogram_ccat(
+        unsigned int *c0_histogram,
+        unsigned int *c1_histogram,
+        unsigned int *c2_histogram,
+        unsigned int *c3_histogram,
+        unsigned int num_bins,
+        ia_ccat_histograms *rgb_histograms,
+        ia_histogram *y_histogram);
+
+/*!
+ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
+ * from various ISP formats into AIQ statistics format.
+ * \param[in]  ia_isp_bxt        Mandatory. ia_isp_bxt instance handle.
+ * \param[in]  statistics        Mandatory. Statistics in ISP specific format.
+ * \param[out] out_aiq_histogram Mandatory. Pointer's pointer where address of converted statistics are stored.
+ *                               Converted aiq histogram statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+ *                               if the external buffer is provided in out_aiq_histogram it will be used otherwise internal buffer is used.
+ * \return                       Error code.
+ */
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_ae_from_binary(
+    ia_isp_bxt *ia_isp_bxt,
+    const ia_binary_data *statistics,
+    ia_aiq_histogram **out_aiq_histogram);
+
+/*!
+ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
+ * from various ISP formats into AIQ statistics format.
+ * \param[in]  ia_isp_bxt        Mandatory. ia_isp_bxt instance handle.
+ * \param[in]  c0_histogram      Mandatory. Block value of c0_histogram
+ * \param[in]  c1_histogram      Mandatory. Block value of c1_histogram
+ * \param[in]  c2_histogram      Mandatory. Block value of c2_histogram
+ * \param[in]  c3_histogram      Mandatory. Block value of c3_histogram
+ * \param[in]  c4_histogram      Mandatory. Block value of c4_histogram
+ * \param[in]  c5_histogram      Mandatory. Block value of c5_histogram
+ * \param[in]  c6_histogram      Mandatory. Block value of c6_histogram
+ * \param[in]  c7_histogram      Mandatory. Block value of c7_histogram
+ * \param[in]  num_bins          Mandatory. Number of histogram bins in ISP generated histograms.
+ * \param[out] out_aiq_histogram Mandatory. Pointer's pointer where address of converted statistics are stored.
+ *                               Converted aiq histogram statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+ *                               if the external buffer is provided in out_aiq_histogram it will be used otherwise internal buffer is used.
+ * \return                       Error code.
+ */
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_ae(
+    ia_isp_bxt *ia_isp_bxt,
+    void *c0_histogram,
+    void *c1_histogram,
+    void *c2_histogram,
+    void *c3_histogram,
+    void *c4_histogram,
+    void *c5_histogram,
+    void *c6_histogram,
+    void *c7_histogram,
+    unsigned int num_bins,
+    ia_aiq_histogram **out_aiq_histogram);
+
+/*!
+ * \brief This function converts corner based statistics to generic DVS statistics.
+ *
+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
+ * from various ISP formats into AIQ statistics format.
+ *
+ * \param[in]  ia_isp_bxt                  Mandatory. ia_isp_bxt instance handle.
+ * \param[in]  statistics                  Mandatory. Statistics in ISP specific format.
+ * \param[in]  dvs_statistics_input_width  Mandatory. DVS statistics input width. Used only in DVS statistics conversion.
+ * \param[in]  dvs_statistics_input_height Mandatory. DVS statistics input height. Used only in DVS statistics conversion.
+ * \param[out] dvs_statistics              Mandatory. Pointer's pointer where address of converted statistics are stored.
+ *                                         Converted DVS statistics. Output can be directly used as input in function ia_dvs_set_statistics.
+ *                                         If the external buffer is provided in dvs_statistics it will be used otherwise internal buffer is used.
+ * \return                                 Error code.
+ */
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_dvs_from_binary(
+    ia_isp_bxt *ia_isp_bxt,
+    const ia_binary_data *statistics,
+    unsigned int dvs_statistics_input_width,
+    unsigned int dvs_statistics_input_height,
+    ia_dvs_statistics **dvs_statistics);
+
+/*!
+ * \brief This function converts corner based statistics to generic DVS statistics.
+ *
+ * ISP generated statistics may not be in the format in which DVS algorithms expect. Statistics need to be converted
+ * from various ISP formats into DVS statistics format.
+ *
+ * \param[in]  ia_isp_bxt                  Mandatory. ia_isp_bxt instance handle.
+ * \param[in]  bxt_dvs_statistics          Mandatory. Binary data which contains pointer to BXT specific DVS statistics structure.
+ * \param[in]  dvs_statistics_input_width  Mandatory. DVS statistics input width. Used only in DVS statistics conversion.
+ * \param[in]  dvs_statistics_input_height Mandatory. DVS statistics input height. Used only in DVS statistics conversion.
+ * \param[out] dvs_statistics              Mandatory. Converted DVS statistics. Output can be directly used as input in function ia_dvs_set_statistics.
+ *                                         If the external buffer is provided in dvs_statistics it will be used otherwise internal buffer is used.
+ * \return                                 Error code.
+ */
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_dvs(
+    ia_isp_bxt *ia_isp_bxt,
+    const ia_binary_data *bxt_dvs_statistics,
+    unsigned int dvs_statistics_input_width,
+    unsigned int dvs_statistics_input_height,
+    ia_dvs_statistics **dvs_statistics);
+
+/*!
+ * \brief Read parameters, interpolated by GAIC, of requested ISP block.
+ * This function queries currently effective Algorithm API parameters, which are interpolated by GAIC, of a target ISP block.
+ *
+ * \param [in]  ia_isp_bxt         Mandatory.  ia_isp_bxt instance handle.
+ * \param [in]  target_id          Mandatory.  uuid of queried ISP block.
+ * \param [out] target_data_ptr    Mandatory.  a pointer of a pointer to data buffer that will have read parameters.
+ * \param [out] output_size_ptr    Mandatory.  a size of all parameters. 0 if a target record does not exist.
+ *
+ * \return                         Error code.
+ */
+LIBEXPORT ia_err
+ia_isp_bxt_get_interpolated_parameters(
+    const ia_isp_bxt *ia_isp_bxt_ptr,
+    const unsigned int target_id,
+    char **target_data_ptr,
+    size_t *output_size_ptr);
+
+/*!
+* \brief Get Algo API values interpolated by GAIC of all the ISP blocks.
+* This function queries currently effective Algorithm API parameters, which are interpolated by GAIC, for all the ISP blocks.
+*
+* \param [in] ia_isp_bxt Mandatory. ia_isp_bxt instance handle.
+* \param [out] output_data Mandatory. Effective Algorithm API parameters binary data.
+* \return Error code.
+*/
+LIBEXPORT ia_err
+ia_isp_bxt_get_all_interpolated_parameters(
+const ia_isp_bxt *ia_isp_bxt_ptr,
+ia_binary_data* output_data);
+
+/*!
+* \brief Get Direct Results.
+* This function queries currently effective Direct Results.
+*
+* \param [in] ia_isp_bxt Mandatory. ia_isp_bxt instance handle.
+* \param [out] output_data Mandatory. Effective Direct Results data.
+* \return Error code.
+*/
+LIBEXPORT ia_err
+ia_isp_bxt_get_direct_results(
+const ia_isp_bxt *ia_isp_bxt_ptr,
+ia_binary_data* output_data);
+
+/*!
+ * \brief Converts BXT ISP PAF statistics to IA_AIQ format.
+ *
+ * ISP generated statistics may not be in the format in which IA_AIQ algorithms expect. Statistics need to be converted
+ * from various ISP formats into IA_AIQ statistics format.
+ *
+ * \param[in]  ia_isp_bxt                  Mandatory. ia_isp_bxt instance handle.
+ * \param[in]  bxt_paf_statistics          Mandatory. Binary data which contains pointer to BXT specific PAF statistics structure.
+ * \param[in]  paf_statistics_input_width  Mandatory. PAF statistics input width.
+ * \param[in]  paf_statistics_input_height Mandatory. PAF statistics input height.
+ * \param[out] depth_statistics            Mandatory. Converted PAF statistics. Output can be directly used as input in function ia_statistics_set.
+ * \return                                 Error code.
+ */
+ia_err ia_isp_bxt_statistics_convert_paf_from_binary(
+        ia_isp_bxt *ia_isp_bxt,
+        const ia_binary_data *bxt_paf_statistics,
+        unsigned int paf_statistics_input_width,
+        unsigned int paf_statistics_input_height,
+        ia_aiq_depth_grid **depth_statistics);
+
+/*!
+* \brief Converts uint16_t PAF statistics to IA_AIQ format.
+*
+* ISP generated statistics may not be in the format in which IA_AIQ algorithms expect. Statistics need to be converted
+* from the ISP format into IA_AIQ statistics format.
+*
+* \param[in]  ia_isp_bxt                  Mandatory. ia_isp_bxt instance handle.
+* \param[in]  paf_statistics_data         Mandatory. uint16_t PAF data handle.
+* \param[in]  paf_statistics_input_width  Mandatory. PAF statistics input width.
+* \param[in]  paf_statistics_input_height Mandatory. PAF statistics input height.
+* \param[in]  num_phase_shifts            Mandatory. Number of phase shifts in the paf_statistics_data
+* \param[out] depth_statistics            Mandatory. Converted PAF statistics. Output can be directly used as input in function ia_statistics_set.
+* \return                                 Error code.
+*/
+ia_err ia_isp_bxt_statistics_convert_paf(
+    ia_isp_bxt *ia_isp_bxt,
+    uint16_t *paf_statistics_data,
+    unsigned int paf_statistics_input_width,
+    unsigned int paf_statistics_input_height,
+    int num_phase_shifts,
+    ia_aiq_depth_grid **depth_statistics);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* IA_ISP_BXT_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_deprecated.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_deprecated.h
new file mode 100644
index 000000000000..9197eab0978a
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_deprecated.h
@@ -0,0 +1,641 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_isp_bxt_deprecated.h
+ * \brief ia_isp_bxt specific implementation.
+*/
+
+#ifndef IA_ISP_BXT_DEPRECATED_H_
+#define IA_ISP_BXT_DEPRECATED_H_
+
+#include "ia_aiq_types.h"
+#include "ia_types.h"
+#include "ia_isp_bxt_types.h"
+#include "ia_bcomp_types.h"
+#include "ia_aiq_deprecated.h"
+#include "ia_cmc_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*!
+*  HDR exposure info which provides information about the thresholds and exposure ratios.
+*
+*  Exposure 0: L[0]|---------------|H[0]
+*         R[0] <--->
+*  Exposure 1:      L[1]|----------------------|H[1]
+*              R[1] <--->
+*  Exposure 2:           L[2]|-----------------------------|H[2]
+*  ...
+*                 R[N-2] <--->
+*  Exposure N:                L[N-1]|-----------------------------------|H[N-1]
+*
+*  N = number of exposures
+*  L[n] = lowest intensity captured by n:th exposure (ia_isp_stat_split_thresh::low)
+*  H[n] = highest intensity captured by n:th exposure (ia_isp_stat_split_thresh::high)
+*  R[n] = exposure ratio between n:th and the longest exposure
+*
+*  Number of thresholds equals N, but number of exposure ratios equals N-1.
+*/
+typedef struct
+{
+    unsigned int num_exposures;                             /*!< Number of exposures. */
+    ia_isp_stat_split_thresh thresholds[IA_AIQ_MAX_NUM_EXPOSURES]; /*!< Lowest and highest intensity values in the stitched data for each exposure [0, num_exposures-1]. */
+    float exposure_ratios[IA_AIQ_MAX_NUM_EXPOSURES - 1];    /*!< Exposure ratios for each exposure pair (between n:th and the longest exposure) [0, num_exposures-2]. */
+    float hdr_gain;                                         /*!< Scaling factor for normalizing pixel data to the maximum bit depth. */
+} ia_isp_hdr_exposure_info_t;
+
+
+/*!
+*  \brief IA_ISP_BXT parameter input structure.
+*/
+typedef struct
+{
+    ia_aiq_frame_params *sensor_frame_params;        /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
+    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
+    ia_aiq_gbce_results *gbce_results;               /*!< Mandatory. GBCE Gamma tables which are to be used to calculate next ISP parameters.*/
+    ia_aiq_ae_results *ae_results;                   /*!< Mandatory. Exposure results which are to be used to calculate next ISP parameters.
+                                                     Currently only exposure times, analog and digital gains are used. For convenience reasons AIC takes
+                                                     ae results and not only needed parameters. */
+    ia_aiq_pa_results *pa_results;                   /*!< Mandatory. Parameter adaptor results from AIQ. */
+    ia_aiq_sa_results *sa_results;                   /*!< Mandatory. Shading adaptor results from AIQ. */
+    ia_aiq_hist_weight_grid *weight_grid;            /*!< Mandatory. Weight map to be used in the next frame histogram calculation. */
+    ia_isp_bxt_program_group *program_group;         /*!< Mandatory. List of kernels associated with this program group */
+    unsigned int stream_id;                          /*!< Optional. If program_group is not given, stream_id is used to fetch all the tunings for all the kernels
+                                                     associated with the stream_id. */
+    ia_isp_feature_setting nr_setting;               /*!< Mandatory. Feature setting for noise reduction algorithms. */
+    ia_isp_feature_setting ee_setting;               /*!< Mandatory. Feature setting for edge enhancement algorithms. */
+    char manual_brightness;                          /*!< Optional. Manual brightness value range [-128,127]. Value 0 means no change. */
+    char manual_contrast;                            /*!< Optional. Manual contrast value range [-128,127]. Value 0 means no change. */
+    char manual_hue;                                 /*!< Optional. Manual hue value range [-128,127]. Value 0 means no change.
+                                                     Value -96 means red become blue, green become red, blue become green */
+    char manual_saturation;                          /*!< Optional. Manual saturation value range [-128,127]. Value 0 means no change. */
+    ia_isp_effect effects;                           /*!< Optional. Manual setting for special effects. Combination of ia_isp_effect enums.*/
+    ia_dvs_morph_table *dvs_morph_table;             /*!< Mandatory. DVS results which are passed to GDC ISP FW. If null is given, PAL produces default
+                                                     morphing table in PAL results. PAL will add scaling to the grid if defined in resolution info.*/
+    ia_isp_custom_controls* custom_controls;         /*!< Optional. Custom control parameter for interpolating between different tunings.
+                                                     If custom controls are not used, pointer can be set as null.*/
+    ia_binary_data* pal_override;                    /*!< Optional. Set of parameters for overriding tunings from CPF. Parameters need to follow
+                                                     Algo API binary format. Binary may contain multiple parameter sets.
+                                                     Can be set as null if PAL override functionality is not used. */
+    ia_ltm_results *ltm_results;                     /*!< Mandatory. Local tone mapping results from LTM. */
+    ia_ltm_drc_params *ltm_drc_params;               /*!< Mandatory. DRC parameters from LTM. */
+    float manual_digital_gain;                       /*!< Optional. Additional digital gain that is applied to all color channels of the image before ISP statistics collection.
+                                                     Values less than 1.0 means no additional gain. */
+    ia_ob_output ob_black_level;                     /*!< Optional. Black level values calculated on-the-fly when the sensor supports. */
+    unsigned long long timestamp;                    /*!< Mandatory. Current timestamp (is microseconds) when ia_isp_bxt_run function is called. AIC uses timestamp to decide what
+                                                     calculations are done based on tunable run rate for each ISP configuration algorithm. */
+    ia_dvs_image_transformation *gdc_transformation; /*!< Mandatory. Image transformation parameters for GDC5 ISP FW. This feature replaces the need for morph_table usage.*/
+    ia_isp_bxt_view_params_t const *view_params;     /*!< Optional. View parameters for running in GDC5 mode.*/
+    ia_media_format media_format;                    /*!< Mandatory. Selected Digital television output format.(e.g. BT709) */
+    ia_bcomp_results const *bcomp_results;           /*!< Optional.  bit-compression curves. */
+} ia_isp_bxt_input_params;
+
+/*!
+*  \brief IA_ISP_BXT parameter input structure.
+*/
+typedef struct
+{
+    ia_aiq_frame_params *sensor_frame_params;        /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
+    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
+    ia_aiq_gbce_results *gbce_results;               /*!< Mandatory. GBCE Gamma tables which are to be used to calculate next ISP parameters.*/
+    ia_aiq_ae_results *ae_results;                   /*!< Mandatory. Exposure results which are to be used to calculate next ISP parameters.
+                                                     Currently only exposure times, analog and digital gains are used. For convenience reasons AIC takes
+                                                     ae results and not only needed parameters. */
+    ia_aiq_pa_results_v1 *pa_results;                /*!< Mandatory. Parameter adaptor results from AIQ. */
+    ia_aiq_sa_results *sa_results;                   /*!< Mandatory. Shading adaptor results from AIQ. */
+    ia_aiq_hist_weight_grid *weight_grid;            /*!< Mandatory. Weight map to be used in the next frame histogram calculation. */
+    ia_isp_bxt_program_group *program_group;         /*!< Mandatory. List of kernels associated with this program group */
+    unsigned int stream_id;                          /*!< Optional. If program_group is not given, stream_id is used to fetch all the tunings for all the kernels
+                                                     associated with the stream_id. */
+    ia_isp_feature_setting nr_setting;               /*!< Mandatory. Feature setting for noise reduction algorithms. */
+    ia_isp_feature_setting ee_setting;               /*!< Mandatory. Feature setting for edge enhancement algorithms. */
+    char manual_brightness;                          /*!< Optional. Manual brightness value range [-128,127]. Value 0 means no change. */
+    char manual_contrast;                            /*!< Optional. Manual contrast value range [-128,127]. Value 0 means no change. */
+    char manual_hue;                                 /*!< Optional. Manual hue value range [-128,127]. Value 0 means no change.
+                                                     Value -96 means red become blue, green become red, blue become green */
+    char manual_saturation;                          /*!< Optional. Manual saturation value range [-128,127]. Value 0 means no change. */
+    ia_isp_effect effects;                           /*!< Optional. Manual setting for special effects. Combination of ia_isp_effect enums.*/
+    ia_dvs_morph_table *dvs_morph_table;             /*!< Mandatory. DVS results which are passed to GDC ISP FW. If null is given, PAL produces default
+                                                     morphing table in PAL results. PAL will add scaling to the grid if defined in resolution info.*/
+    ia_isp_custom_controls* custom_controls;         /*!< Optional. Custom control parameter for interpolating between different tunings.
+                                                     If custom controls are not used, pointer can be set as null.*/
+    ia_binary_data* pal_override;                    /*!< Optional. Set of parameters for overriding tunings from CPF. Parameters need to follow
+                                                     Algo API binary format. Binary may contain multiple parameter sets.
+                                                     Can be set as null if PAL override functionality is not used. */
+    ia_ltm_results *ltm_results;                     /*!< Mandatory. Local tone mapping results from LTM. */
+    ia_ltm_drc_params *ltm_drc_params;               /*!< Mandatory. DRC parameters from LTM. */
+    float manual_digital_gain;                       /*!< Optional. Additional digital gain that is applied to all color channels of the image before ISP statistics collection.
+                                                     Values less than 1.0 means no additional gain. */
+    ia_ob_output ob_black_level;                     /*!< Optional. Black level values calculated on-the-fly when the sensor supports. */
+    unsigned long long timestamp;                    /*!< Mandatory. Current timestamp (is microseconds) when ia_isp_bxt_run function is called. AIC uses timestamp to decide what
+                                                     calculations are done based on tunable run rate for each ISP configuration algorithm. */
+    ia_dvs_image_transformation *gdc_transformation; /*!< Mandatory. Image transformation parameters for GDC5 ISP FW. This feature replaces the need for morph_table usage.*/
+    ia_isp_bxt_view_params_t const *view_params;     /*!< Optional. View parameters for running in GDC5 mode.*/
+    ia_media_format media_format;                    /*!< Mandatory. Selected Digital television output format.(e.g. BT709) */
+    ia_bcomp_results const *bcomp_results;           /*!< Optional.  bit-compression curves. */
+} ia_isp_bxt_input_params_v1;
+
+/*!
+* \brief ISP configuration for the next frame
+* Computes ISP parameters from input parameters and CPF values for the next image.
+*
+* \param[in] ia_isp_bxt                    Mandatory. ISP instance handle.
+* \param[in] input_params                  Mandatory. Input parameters for ISP calculations.
+* \param[in] output_data                   Mandatory. Output data structure. If output_data->data pointer is given, AIC writes the results to given buffer.
+*                                                     Output is PAL output following ISP API format.
+* \return                                  Error code.
+*
+*/
+LIBEXPORT ia_err
+ia_isp_bxt_run(
+    ia_isp_bxt *ia_isp_bxt,
+    const ia_isp_bxt_input_params *input_params,
+    ia_binary_data *output_data);
+
+/*!
+* \brief ISP configuration for the next frame
+* Computes ISP parameters from input parameters and CPF values for the next image.
+*
+* \param[in] ia_isp_bxt                    Mandatory. ISP instance handle.
+* \param[in] input_params                  Mandatory. Input parameters for ISP calculations.
+* \param[in] output_data                   Mandatory. Output data structure. If output_data->data pointer is given, AIC writes the results to given buffer.
+*                                                     Output is PAL output following ISP API format.
+* \return                                  Error code.
+*
+*/
+LIBEXPORT ia_err
+ia_isp_bxt_run_v1(
+    ia_isp_bxt *ia_isp_bxt,
+    const ia_isp_bxt_input_params_v1 *input_params,
+    ia_binary_data *output_data);
+
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_awb_from_binary(
+    ia_isp_bxt *ia_isp_bxt,
+    const ia_binary_data *statistics,
+    ia_aiq_rgbs_grid **out_rgbs_grid);
+
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_awb(
+    ia_isp_bxt *ia_isp_bxt,
+    unsigned int stats_width,
+    unsigned int stats_height,
+    void *c0_avg,
+    void *c1_avg,
+    void *c2_avg,
+    void *c3_avg,
+    void *c4_avg,
+    void *c5_avg,
+    void *c6_avg,
+    void *c7_avg,
+    void *sat_ratio_0,
+    void *sat_ratio_1,
+    void *sat_ratio_2,
+    void *sat_ratio_3,
+    ia_aiq_rgbs_grid **out_rgbs_grid);
+
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_awb_hdr_from_binary(
+    ia_isp_bxt *ia_isp_bxt,
+    const ia_binary_data *statistics,
+    const ia_isp_stat_split_thresh *thresholds,
+    int num_thresholds,
+    ia_isp_bxt_hdr_params_t *ia_isp_bxt_hdr_params,
+    unsigned int stats_rgbs_hdr_block_pixel_width,
+    unsigned int stats_rgbs_hdr_block_pixel_height,
+    float r_gain,
+    float g_gain,
+    float b_gain,
+    ia_aiq_rgbs_grid **out_rgbs_grid);
+
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_awb_hdr(
+    ia_isp_bxt *ia_isp_bxt_ptr,
+    unsigned int stats_width,
+    unsigned int stats_height,
+    void *stats_r,
+    void *stats_g,
+    void *stats_b,
+    void *stats_s,
+    const ia_isp_stat_split_thresh *thresholds,
+    int num_thresholds,
+    ia_isp_bxt_hdr_params_t *ia_isp_bxt_hdr_params,
+    unsigned int stats_rgbs_hdr_block_pixel_width,
+    unsigned int stats_rgbs_hdr_block_pixel_height,
+    float  r_gain,
+    float  g_gain,
+    float  b_gain,
+    ia_aiq_rgbs_grid **out_rgbs_grid);
+
+/*!
+* \brief Converts BXT ISP specific statistics to IA_AIQ format.
+* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
+* from various ISP formats into AIQ statistics format.
+*
+* \param[in] ia_isp_bxt                          Mandatory. ia_isp_bxt instance handle.
+* \param[in]  statistics                         Mandatory. Statistics in ISP specific format.
+* \param[in]  hdr_exposure_info                  Mandatory. HDR exposure info calculated with ia_isp_bxt_calculate_hdr_exposure_info().
+* \param[in]  hdr_compression                    Optional. NULL, if HDR statistics are already in linear space (no compression).
+* \param[in]  stats_rgbs_hdr_block_pixel_width   Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Width of the block in pixel used in computing the saturation percentage.
+* \param[in]  stats_rgbs_hdr_block_pixel_height  Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Height of the block in pixel used in computing the saturation percentage.
+* \param[in]  r_gain                             Mandatory. Gain applied to the R color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
+* \param[in]  g_gain                             Mandatory. Gain applied to the G color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
+* \param[in]  b_gain                             Mandatory. Gain applied to the B color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
+* \param[out] out_rgbs_grid                      Mandatory. Pointer's pointer where address of converted statistics are stored.
+* \param[out] out_hdr_rgbs_grid                  Optional. Pointer's pointer where address of combined HDR statistics are stored.
+*                                                Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+*                                                if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
+* \return                                        Error code.
+*/
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_awb_hdr_from_binary_v1(
+    ia_isp_bxt *ia_isp_bxt,
+    const ia_binary_data *statistics,
+    const ia_isp_hdr_exposure_info_t *hdr_exposure_info,
+    const ia_isp_bxt_hdr_compression_t *hdr_compression,
+    unsigned int stats_rgbs_hdr_block_pixel_width,
+    unsigned int stats_rgbs_hdr_block_pixel_height,
+    float r_gain,
+    float g_gain,
+    float b_gain,
+    ia_aiq_rgbs_grid **out_rgbs_grid,
+    ia_aiq_hdr_rgbs_grid **out_hdr_rgbs_grid);
+
+/*!
+* \brief Converts HDR DP RGBS statistics to AIQ format.
+* ISP/VLIW generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted  into AIQ statistics format.
+* \param[in]  ia_isp_bxt                         Mandatory. ia_isp_bxt instance handle.
+* \param[in]  stats_width                        Mandatory. Actual width of the statistics grid.
+* \param[in]  stats_height                       Mandatory. Actual height of the statistics grid.
+* \param[in]  stats_r                            Mandatory.
+* \param[in]  stats_b                            Mandatory.
+* \param[in]  stats_g                            Mandatory.
+* \param[in]  stats_s                            Mandatory.
+* \param[in]  hdr_exposure_info                  Mandatory. HDR exposure info calculated with ia_isp_bxt_calculate_hdr_exposure_info().
+* \param[in]  hdr_compression                    Optional. NULL, if HDR statistics are already in linear space (no compression).
+* \param[in]  stats_rgbs_hdr_block_pixel_width   Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Width of the block in pixel used in computing the saturation percentage.
+* \param[in]  stats_rgbs_hdr_block_pixel_height  Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Height of the block in pixel used in computing the saturation percentage.
+* \param[in]  r_gain                             Mandatory. Gain applied to the R color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
+* \param[in]  g_gain                             Mandatory. Gain applied to the G color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
+* \param[in]  b_gain                             Mandatory. Gain applied to the B color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
+* \param[out] out_rgbs_grid                      Mandatory. Pointer's pointer where address of de-stitched statistics array is stored.
+* \param[out] out_hdr_rgbs_grid                  Optional. Pointer's pointer where address of combined HDR statistics is stored.
+*                                                Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+*                                                if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
+* \return                                        Error code.
+*/
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_awb_hdr_v1(
+    ia_isp_bxt *ia_isp_bxt_ptr,
+    unsigned int stats_width,
+    unsigned int stats_height,
+    void *stats_r,
+    void *stats_g,
+    void *stats_b,
+    void *stats_s,
+    const ia_isp_hdr_exposure_info_t *hdr_exposure_info,
+    const ia_isp_bxt_hdr_compression_t *hdr_compression,
+    unsigned int stats_rgbs_hdr_block_pixel_width,
+    unsigned int stats_rgbs_hdr_block_pixel_height,
+    float  r_gain,
+    float  g_gain,
+    float  b_gain,
+    ia_aiq_rgbs_grid **out_rgbs_grid,
+    ia_aiq_hdr_rgbs_grid **out_hdr_rgbs_grid);
+
+/*!
+*  Calculates additional HDR exposure information based on the AE results.
+*
+*  \param [in]  ia_isp_bxt         Mandatory. ia_isp_bxt instance handle.
+*  \param [in]  ae_results         Mandatory. AE results structure containing the used exposures.
+*  \param [in]  hdr_bit_depth      Mandatory. Maximum bit depth of the HDR data.
+*  \param [out] hdr_exposure_info  Mandatory. Calculated additional HDR exposure information.
+*
+*  \return                         Error code.
+*/
+LIBEXPORT ia_err
+ia_isp_bxt_calculate_hdr_exposure_info(
+ia_isp_bxt *ia_isp_bxt,
+const ia_aiq_ae_results *ae_results,
+unsigned int hdr_bit_depth,
+ia_isp_hdr_exposure_info_t *hdr_exposure_info);
+
+/*!
+* \brief Converts BXT ISP specific statistics to IA_AIQ format.
+* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
+* from various ISP formats into AIQ statistics format.
+* \param[in] ia_isp_bxt     Mandatory.\n
+*                           ia_isp_bxt instance handle.
+* \param[in]  stats_width   Mandatory actual width of the statistics grid.
+* \param[in]  stats_height  Mandatory actual height of the statistics grid.
+* \param[in]  c0_avg        Mandatory Average level of c0 color
+* \param[in]  c1_avg        Mandatory Average level of c0 color
+* \param[in]  c2_avg        Mandatory Average level of c0 color
+* \param[in]  c3_avg        Mandatory Average level of c0 color
+* \param[in]  c4_avg        Mandatory Average level of c0 color
+* \param[in]  c5_avg        Mandatory Average level of c0 color
+* \param[in]  c6_avg        Mandatory Average level of c0 color
+* \param[in]  c7_avg        Mandatory Average level of c0 color
+* \param[in]  sat_ratio_0   Mandatory Represents Saturation ratio.
+*                                     0: 0% above saturation
+*                                     255: 100% above saturation
+* \param[in]  sat_ratio_1   Mandatory Represents Saturation ratio.
+*                                     0: 0% above saturation
+*                                     255: 100% above saturation
+* \param[in]  sat_ratio_2   Mandatory Represents Saturation ratio.
+*                                     0: 0% above saturation
+*                                     255: 100% above saturation
+* \param[in]  sat_ratio_3   Mandatory Represents Saturation ratio.
+*                                     0: 0% above saturation
+*                                     255: 100% above saturation
+* \param[in]  ir_weight     Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid for given frame.
+*
+* \param[out] out_rgbs_grid Mandatory. Pointer's pointer where address of converted statistics are stored.
+*                           Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+*                           if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
+* \param[out] out_ir_grid   Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
+*                           Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+*                           if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
+*
+* \return                   Error code.
+*/
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_awb_v1(
+    ia_isp_bxt *ia_isp_bxt,
+    unsigned int stats_width,
+    unsigned int stats_height,
+    void *c0_avg,
+    void *c1_avg,
+    void *c2_avg,
+    void *c3_avg,
+    void *c4_avg,
+    void *c5_avg,
+    void *c6_avg,
+    void *c7_avg,
+    void *sat_ratio_0,
+    void *sat_ratio_1,
+    void *sat_ratio_2,
+    void *sat_ratio_3,
+    const ia_aiq_ir_weight_t *ir_weight,
+    ia_aiq_rgbs_grid **out_rgbs_grid,
+    ia_aiq_grid **out_ir_grid);
+
+/*!
+* \brief Converts BXT ISP specific statistics to IA_AIQ format.
+* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
+* from various ISP formats into AIQ statistics format.
+* \param[in] ia_isp_bxt     Mandatory.\n
+*                           ia_isp_bxt instance handle.
+* \param[in]  stats_width   Mandatory actual width of the statistics grid.
+* \param[in]  stats_height  Mandatory actual height of the statistics grid.
+* \param[in]  c0_avg        Mandatory Average level of c0 color
+* \param[in]  c1_avg        Mandatory Average level of c0 color
+* \param[in]  c2_avg        Mandatory Average level of c0 color
+* \param[in]  c3_avg        Mandatory Average level of c0 color
+* \param[in]  c4_avg        Mandatory Average level of c0 color
+* \param[in]  c5_avg        Mandatory Average level of c0 color
+* \param[in]  c6_avg        Mandatory Average level of c0 color
+* \param[in]  c7_avg        Mandatory Average level of c0 color
+* \param[in]  sat_ratio_0   Mandatory Represents Saturation ratio.
+*                                     0: 0% above saturation
+*                                     255: 100% above saturation
+* \param[in]  sat_ratio_1   Mandatory Represents Saturation ratio.
+*                                     0: 0% above saturation
+*                                     255: 100% above saturation
+* \param[in]  sat_ratio_2   Mandatory Represents Saturation ratio.
+*                                     0: 0% above saturation
+*                                     255: 100% above saturation
+* \param[in]  sat_ratio_3   Mandatory Represents Saturation ratio.
+*                                     0: 0% above saturation
+*                                     255: 100% above saturation
+* \param[in]  ir_weight     Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid for given frame.
+* \param[in]  ae_results    Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
+*                                     used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
+*
+* \param[out] out_rgbs_grid Mandatory. Pointer's pointer where address of converted statistics are stored.
+*                           Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+*                           if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
+* \param[out] out_ir_grid   Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
+*                           Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+*                           if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
+*
+* \return                   Error code.
+*/
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_awb_v2(
+    ia_isp_bxt *ia_isp_bxt,
+    unsigned int stats_width,
+    unsigned int stats_height,
+    void *c0_avg,
+    void *c1_avg,
+    void *c2_avg,
+    void *c3_avg,
+    void *c4_avg,
+    void *c5_avg,
+    void *c6_avg,
+    void *c7_avg,
+    void *sat_ratio_0,
+    void *sat_ratio_1,
+    void *sat_ratio_2,
+    void *sat_ratio_3,
+    const ia_aiq_ir_weight_t *ir_weight,
+    const ia_aiq_ae_results *ae_results,
+    ia_aiq_rgbs_grid **out_rgbs_grid,
+    ia_aiq_grid **out_ir_grid);
+
+/*!
+ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
+ * from various ISP formats into AIQ statistics format.
+ * \param[in] ia_isp_bxt     Mandatory.\n
+ *                           ia_isp_bxt instance handle.
+ * \param[in]  stats_width   Mandatory actual width of the statistics grid.
+ * \param[in]  stats_height  Mandatory actual height of the statistics grid.
+ * \param[in]  c0_avg        Mandatory Average level of c0 color
+ * \param[in]  c1_avg        Mandatory Average level of c0 color
+ * \param[in]  c2_avg        Mandatory Average level of c0 color
+ * \param[in]  c3_avg        Mandatory Average level of c0 color
+ * \param[in]  c4_avg        Mandatory Average level of c0 color
+ * \param[in]  c5_avg        Mandatory Average level of c0 color
+ * \param[in]  c6_avg        Mandatory Average level of c0 color
+ * \param[in]  c7_avg        Mandatory Average level of c0 color
+ * \param[in]  sat_ratio_0   Mandatory Represents Saturation ratio.
+ *                                     0: 0% above saturation
+ *                                     255: 100% above saturation
+ * \param[in]  sat_ratio_1   Mandatory Represents Saturation ratio.
+ *                                     0: 0% above saturation
+ *                                     255: 100% above saturation
+ * \param[in]  sat_ratio_2   Mandatory Represents Saturation ratio.
+ *                                     0: 0% above saturation
+ *                                     255: 100% above saturation
+ * \param[in]  sat_ratio_3   Mandatory Represents Saturation ratio.
+ *                                     0: 0% above saturation
+ *                                     255: 100% above saturation
+ * \param[in]  ir_weight     Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid for given frame.
+ * \param[in]  ae_results    Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
+ *                                     used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
+ * \param[in] bcomp_results  Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU6)
+ *
+ * \param[out] out_rgbs_grid Mandatory. Pointer's pointer where address of converted statistics are stored.
+ *                           Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+ *                           if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
+ * \param[out] out_ir_grid   Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
+ *                           Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+ *                           if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
+ *
+ * \return                   Error code.
+ */
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_awb_v3(
+    ia_isp_bxt *ia_isp_bxt,
+    unsigned int stats_width,
+    unsigned int stats_height,
+    void *c0_avg,
+    void *c1_avg,
+    void *c2_avg,
+    void *c3_avg,
+    void *c4_avg,
+    void *c5_avg,
+    void *c6_avg,
+    void *c7_avg,
+    void *sat_ratio_0,
+    void *sat_ratio_1,
+    void *sat_ratio_2,
+    void *sat_ratio_3,
+    const ia_aiq_ir_weight_t *ir_weight,
+    const ia_aiq_ae_results *ae_results,
+    const ia_bcomp_results *bcomp_results,
+    ia_aiq_rgbs_grid **out_rgbs_grid,
+    ia_aiq_grid **out_ir_grid);
+
+/*!
+* \brief Converts BXT ISP specific statistics to IA_AIQ format.
+* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
+* from various ISP formats into AIQ statistics format.
+* \param[in] ia_isp_bxt        Mandatory. ia_isp_bxt instance handle.
+* \param[in]  statistics       Mandatory. Statistics in ISP specific format.
+* \param[in]  ir_weight        Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
+* \param[out] out_rgbs_grid    Mandatory. Pointer's pointer where address of converted statistics are stored.
+*                              Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+*                              if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
+* \param[out] out_ir_grid      Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
+*                              Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+*                              if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
+* \return                      Error code.
+*/
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_awb_from_binary_v1(
+    ia_isp_bxt *ia_isp_bxt,
+    const ia_binary_data *statistics,
+    const ia_aiq_ir_weight_t *ir_weight,
+    ia_aiq_rgbs_grid **out_rgbs_grid,
+    ia_aiq_grid **out_ir_grid);
+
+/*!
+* \brief Converts BXT ISP specific statistics to IA_AIQ format.
+* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
+* from various ISP formats into AIQ statistics format.
+* \param[in] ia_isp_bxt        Mandatory. ia_isp_bxt instance handle.
+* \param[in]  statistics       Mandatory. Statistics in ISP specific format.
+* \param[in]  ir_weight        Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
+* \param[in]  ae_results       Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
+                               used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
+* \param[out] out_rgbs_grid    Mandatory. Pointer's pointer where address of converted statistics are stored.
+*                              Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+*                              if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
+* \param[out] out_ir_grid      Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
+*                              Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+*                              if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
+* \return                      Error code.
+*/
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_awb_from_binary_v2(
+    ia_isp_bxt *ia_isp_bxt,
+    const ia_binary_data *statistics,
+    const ia_aiq_ir_weight_t *ir_weight,
+    const ia_aiq_ae_results *ae_results,
+    ia_aiq_rgbs_grid **out_rgbs_grid,
+    ia_aiq_grid **out_ir_grid);
+
+/*!
+ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
+ * from various ISP formats into AIQ statistics format.
+ * \param[in] ia_isp_bxt        Mandatory. ia_isp_bxt instance handle.
+ * \param[in] statistics        Mandatory. Statistics in ISP specific format.
+ * \param[in] ir_weight         Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
+ * \param[in] ae_results        Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
+ *                              used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
+ * \param[in] bcomp_results     Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU6).
+ * \param[out] out_rgbs_grid    Mandatory. Pointer's pointer where address of converted statistics are stored.
+ *                              Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+ *                              if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
+ * \param[out] out_ir_grid      Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
+ *                              Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
+ *                              if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
+ * \return                      Error code.
+ */
+LIBEXPORT ia_err
+ia_isp_bxt_statistics_convert_awb_from_binary_v3(
+    ia_isp_bxt *ia_isp_bxt,
+    const ia_binary_data *statistics,
+    const ia_aiq_ir_weight_t *ir_weight,
+    const ia_aiq_ae_results *ae_results,
+    const ia_bcomp_results *bcomp_results,
+    ia_aiq_rgbs_grid **out_rgbs_grid,
+    ia_aiq_grid **out_ir_grid);
+
+/*!
+* \brief Convert legacy isp api input data to version 1 data
+* Convert legacy isp api input data structure to new version 1 input
+* format structure.
+* \param[in] input_params       Legacy format input parameters
+* \param[in] ia_cmc             CMC handle
+* \param[out] pa_results_v1_ptr pa_results version 1 output pointer
+* \param[out] input_params_v1   pointer to version 1 output data
+*
+*/
+
+LIBEXPORT void
+ia_isp_convert_input_params_v0_to_v1(
+    const ia_isp_bxt_input_params *input_params,
+    ia_isp_bxt_input_params_v1 *input_params_v1,
+    const ia_cmc_t *ia_cmc,
+    ia_aiq_pa_results_v1* pa_results_v1_ptr);
+
+/*!
+* \brief Convert isp api input v1 data to version 2 data
+* Convert isp api input v1 data structure to new version 2 input
+* format structure.
+* \param[in] input_params       Legacy format input parameters
+* \param[out] sa_results_v1     sa-results in format v1
+* \param[out] input_params_v1   pointer to version 1 output data
+*
+*/
+
+struct ia_isp_bxt_input_params_v2;
+LIBEXPORT void
+ia_isp_convert_input_params_v1_to_v2(const ia_isp_bxt_input_params_v1 *input_params_v1,
+    struct ia_isp_bxt_input_params_v2 *input_params_v2,
+    ia_aiq_sa_results_v1 *sa_results_v1);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* IA_ISP_BXT_DEPRECATED_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_statistics_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_statistics_types.h
new file mode 100644
index 000000000000..c51b1ef42529
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_statistics_types.h
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_isp_bxt_statistics_types.h
+ * \brief BXT ISP specific statistics data types.
+*/
+#ifndef IA_ISP_BXT_STATISTICS_TYPES_H_
+#define IA_ISP_BXT_STATISTICS_TYPES_H_
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define BXT_HISTOGRAM_BINS                          256
+#define BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS   1024    /* Max grid size = [32, 32] */
+
+#define BXT_RGBS_GRID_MAX_WIDTH                     96 /* Max grid size = [96, 72] */
+#define BXT_RGBS_GRID_MAX_HEIGHT                    72
+#define BXT_RGBS_GRID_MAX_NUM_ELEMENTS              BXT_RGBS_GRID_MAX_WIDTH*BXT_RGBS_GRID_MAX_HEIGHT
+
+#define BXT_DVS_STATS_L0_MAX_NUM_ELEMENTS 154
+#define BXT_DVS_STATS_L1_MAX_NUM_ELEMENTS 120
+#define BXT_DVS_STATS_L2_MAX_NUM_ELEMENTS 85
+
+#define BXT_PAF_STATS_MAX_STEPS                      11     /*!< Max number of phase shifts in a block. */
+#define BXT_PAF_STATS_GRID_MAX_NUM_ELEMENTS          16*12*BXT_PAF_STATS_MAX_STEPS /*!< Max grid size = [16, 12] */
+
+#define BXT_HDR_RGBY_GRID_MAX_WIDTH                  484  /*!< Maximum grid width for HDR-statisics.*/
+#define BXT_HDR_RGBY_GRID_MAX_HEIGHT                 276  /*!< Maximum grid height for HDR-statisics.*/
+#define BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS           (BXT_HDR_RGBY_GRID_MAX_WIDTH * BXT_HDR_RGBY_GRID_MAX_HEIGHT)  /*!< Maximum grid size for HDR-statisics.484*276=133584.*/
+
+typedef enum
+{
+    /* TODO: These should be calculated as a hash from the below data structures. */
+    ia_isp_bxt_statistics_uuid_filter_response_grid = 101,
+    ia_isp_bxt_statistics_uuid_rgbs_grid = 102,
+    ia_isp_bxt_statistics_uuid_histograms = 103,
+    ia_isp_bxt_statistics_uuid_motion_vectors = 104,
+    ia_isp_bxt_statistics_uuid_paf_grid = 105,
+    ia_isp_bxt_statistics_uuid_hdr_rgbs_grid = 106,           /*!< RGBS grid with higher than 8 bit precision. */
+    ia_isp_bxt_statistics_uuid_hdr_rgby_grid = 107,           /*!< RGBY grid with higher than 8 bit precision. Possibly compressed. */
+    ia_isp_bxt_statistics_uuid_hdr_yv_grid = 108              /*!< Y (Luma) V (Value in HSV color space)  grid with higher than 8 bit precision. Possibly compressed. */
+} ia_isp_bxt_statistics_uuid;
+
+typedef struct
+{
+    int32_t uuid;                           /*!< Unique identifier of the record. See ia_isp_bxt_statistics_uuid. */
+    int32_t size;                           /*!< The size of the record (i.e., the size of this struct). */
+} ia_isp_bxt_statistics_header_t;
+
+typedef struct
+{
+    ia_isp_bxt_statistics_header_t header;  /*!< Header data. */
+    int32_t hist_c0[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C0. */
+    int32_t hist_c1[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C1. */
+    int32_t hist_c2[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C2. */
+    int32_t hist_c3[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C3. */
+    int32_t hist_c4[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C4. */
+    int32_t hist_c5[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C5. */
+    int32_t hist_c6[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C6. */
+    int32_t hist_c7[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C7. */
+} ia_isp_bxt_histograms_t;
+
+typedef struct
+{
+    ia_isp_bxt_statistics_header_t header;                      /*!< Header data. */
+    int32_t grid_width;                                         /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
+    int32_t grid_height;                                        /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
+    int32_t y00_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS]; /*!< Y00 filter responses for each grid block. */
+    int32_t y01_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS]; /*!< Y01 filter responses for each grid block. */
+    int32_t y10_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS]; /*!< Y10 filter responses for each grid block. */
+    int32_t y11_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS]; /*!< Y11 filter responses for each grid block. */
+    int32_t r_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS];   /*!< R filter responses for each grid block. */
+    int32_t g_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS];   /*!< G filter responses for each grid block. */
+    int32_t b_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS];   /*!< B filter responses for each grid block. */
+} ia_isp_bxt_filter_response_grid_t;
+
+typedef struct
+{
+    ia_isp_bxt_statistics_header_t header;                      /*!< Header data. */
+    int32_t grid_width;                                         /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
+    int32_t grid_height;                                        /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
+    int32_t c0_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C0 color for each grid block. */
+    int32_t c1_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C1 color for each grid block. */
+    int32_t c2_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C2 color for each grid block. */
+    int32_t c3_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C3 color for each grid block. */
+    int32_t c4_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C4 color for each grid block. */
+    int32_t c5_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C5 color for each grid block. */
+    int32_t c6_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C6 color for each grid block. */
+    int32_t c7_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C7 color for each grid block. */
+    int32_t sat_ratio_0[BXT_RGBS_GRID_MAX_NUM_ELEMENTS / 4];    /*!< Saturation ratios. 0 = 0% above saturation. 255 = 100% above saturation. */
+    int32_t sat_ratio_1[BXT_RGBS_GRID_MAX_NUM_ELEMENTS / 4];    /*!< Saturation ratios. 0 = 0% above saturation. 255 = 100% above saturation. */
+    int32_t sat_ratio_2[BXT_RGBS_GRID_MAX_NUM_ELEMENTS / 4];    /*!< Saturation ratios. 0 = 0% above saturation. 255 = 100% above saturation. */
+    int32_t sat_ratio_3[BXT_RGBS_GRID_MAX_NUM_ELEMENTS / 4];    /*!< Saturation ratios. 0 = 0% above saturation. 255 = 100% above saturation. */
+} ia_isp_bxt_rgbs_grid_t;
+
+/*!
+ * \brief RGBS data collected from decompressed and merged (from multiple exposures) HDR image.
+ * Named as StatR/G/B/S in ISP Firmware.
+*/
+typedef struct
+{
+    ia_isp_bxt_statistics_header_t header;                      /*!< Header data. */
+    int32_t grid_width;                                         /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
+    int32_t grid_height;                                        /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
+    int32_t r_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];              /*!< U20. Average level of red color for each grid block. */
+    int32_t g_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];              /*!< U20. Average level of (gr+gb)/2 color for each grid block. */
+    int32_t b_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];              /*!< U20. Average level of blue color for each grid block. */
+    unsigned char sat[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];          /*!< U8. currently this is saturation count and it will be saturation percentage after a few weeks. All codes need to be updated accordingly.*/
+} ia_isp_bxt_hdr_rgbs_grid_t;
+
+/*!
+ * \brief RBGY grids of data which may be compressed or not based on sensor and ISP pipe type.
+ * Named as HistStatR/G/B/Y in ISP Firmware.
+ * If statistics are compressed, information for decompression is described in structure ia_isp_bxt_hdr_compression_property_t.
+*/
+typedef struct
+{
+    ia_isp_bxt_statistics_header_t header;                      /*!< Header data. */
+    int32_t grid_width;                                         /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
+    int32_t grid_height;                                        /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
+    unsigned short r_avg[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];   /*!< U15. Average level of R color for each grid block with high resolution. */
+    unsigned short b_avg[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];   /*!< U15. Average level of B color for each grid block with high resolution. */
+    unsigned short g_avg[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];   /*!< U15. Average level of (GR+GB)/2 color for each grid block with high resolution. */
+    unsigned short y_avg[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];   /*!< U15. Average level of Y (luminance) for each grid block with high resolution. */
+} ia_isp_bxt_hdr_rgby_grid_t;
+
+/*!
+ * \brief Y (luminance) V (Value in HSV color space) grids of data which may be compressed or not based on sensor and ISP pipe type.
+ * Named as DRCStatY/V in ISP Firmware.
+ * If statistics are compressed, information for decompression is described in structure ia_isp_bxt_hdr_compression_property_t.
+*/
+typedef struct
+{
+    ia_isp_bxt_statistics_header_t header;                      /*!< Header data. */
+    int32_t grid_width;                                         /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
+    int32_t grid_height;                                        /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
+    unsigned short v_max[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];   /*!< U15.v_max = max(R,G,B) in HSV color space. Compressed or not based on sensor type. */
+    unsigned short y_avg[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];   /*!< U15.y_avg is same data as the y_avg in ia_isp_bxt_hdr_rgby_grid_t, but sub-sampled by 2x. */
+} ia_isp_bxt_hdr_yv_grid_t;
+
+typedef struct
+{
+    int32_t vec_fe_x_pos;
+    int32_t vec_fe_y_pos;
+    int32_t vec_fm_x_pos;
+    int32_t vec_fm_y_pos;
+    int32_t harris_grade;
+    int32_t match_grade;
+    int32_t level;
+} ia_isp_bxt_dvs_motion_vector_entry_t;
+
+typedef struct
+{
+    ia_isp_bxt_statistics_header_t header;                                          /*!< Header data. */
+    int32_t grid_width_l0;                                                          /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
+    int32_t grid_height_l0;                                                         /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
+    int32_t grid_width_l1;                                                          /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
+    int32_t grid_height_l1;                                                         /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
+    int32_t grid_width_l2;                                                          /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
+    int32_t grid_height_l2;                                                         /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
+    ia_isp_bxt_dvs_motion_vector_entry_t mv_l0[BXT_DVS_STATS_L0_MAX_NUM_ELEMENTS];  /*!< Motion vectors for L0 grid. */
+    ia_isp_bxt_dvs_motion_vector_entry_t mv_l1[BXT_DVS_STATS_L1_MAX_NUM_ELEMENTS];  /*!< Motion vectors for L1 grid. */
+    ia_isp_bxt_dvs_motion_vector_entry_t mv_l2[BXT_DVS_STATS_L2_MAX_NUM_ELEMENTS];  /*!< Motion vectors for L2 grid. */
+} ia_isp_bxt_motion_vectors_t;
+
+typedef struct
+{
+    ia_isp_bxt_statistics_header_t header;                                          /*!< Header data. */
+    int32_t sum_of_diff[BXT_PAF_STATS_GRID_MAX_NUM_ELEMENTS];                       /*!<  Sum of phase differences from blocks. */
+}ia_isp_bxt_paf_grid_t;
+
+#ifdef __cplusplus
+}
+
+#endif
+#endif /* IA_ISP_BXT_STATISTICS_TYPES_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_types.h
new file mode 100644
index 000000000000..19155e6773ba
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_types.h
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_isp_bxt_types.h
+*/
+
+#ifndef IA_ISP_BXT_TYPES_H_
+#define IA_ISP_BXT_TYPES_H_
+
+#include "ia_types.h"
+#include <stdint.h>  /* defines fixed width integers */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct ia_isp_bxt_t ia_isp_bxt;
+
+/*!
+ * \brief Input structure for resolution changing ISP block.
+ *
+ * If ISP block changes resolution as part of its processing, this structure defines
+ * resolutions and cropping parameters for one input and output pins. If ISP block has
+ * multiple outputs, structure needs to be passed for each output pin. Order of operations:
+ *
+ * -# Input image is cropped according to input_crop structure parameters. New cropped input resolution is calculated.
+ * -# Cropped input image is scaled from cropped input resolution to output resolution (output_width & output_height).
+ * -# Output image is cropped according to output_crop structure parameters.
+ *
+ * If ISP block doesn't change resolution of the image as part of its processing, this structure defines
+ * resolution changes done to the image from the beginning of the pipe until now. For example if some scaling or
+ * cropping was done before, they are combined.
+ *
+ * Example:
+ *
+ * -# Sensor outputs 6528 x 4896. Sensor crops 3264 x 2448 ROI from bottom right corner.
+ * -# ISP block downscales the image from 3264 x 2448 to 2176 x 1632 (scale 0.6667) and crops to 1920 x 1080 (RCB):
+ *    - resolution_info { 6528, 4896, { 3264, 2448, 0, 0 }, 2176, 1632, { 128, 276, 128, 276 } }
+ *
+ * -# ISP block needs to know what resolution changes were done with respect to full sensor frame:
+ *    - resolution_history { 6528, 4896, { 3264+(128/0.6667), 2448+(276/0.6667), (128/0.6667), (276/0.6667) }, 1920, 1080, { 0, 0, 0, 0 } }
+ *
+ * -# ISP block forther downscales the image to 1280 x 720 (RCB):
+ *    - resolution_info { 1920, 1080, { 0, 0, 0, 0 }, 1280, 720, { 0, 0, 0, 0 } }
+ *
+ * -# ISP block needs to know what resolution changes were done:
+ *    - resolution_history { 6528, 4896, { 3264+(128/0.6667), 2448+(276/0.6667), (128/0.6667), (276/0.6667) }, 1280, 720, { 0, 0, 0, 0 } }
+ *
+ */
+
+/*!
+* \brief Metadata buffer indices for ia_isp_bxt_run_kernels_t structure.
+*/
+typedef enum
+{
+    kernel_metadata_paf_frame_width = 0,                   /*!< Widht of PDAF frame buffer (used by DPC and PAF Statistics). */
+    kernel_metadata_paf_frame_height                       /*!< Height of PDAF frame buffer (used by DPC and PAF Statistics). */
+} run_kernels_metadata_t;
+
+typedef struct ia_isp_bxt_resolution_info
+{
+    int input_width;          /*!< Input image width. */
+    int input_height;         /*!< Input image height. */
+    ia_rectangle input_crop;  /*!< Crop offsets for input image. Cropping happens before processing the input image. */
+    int output_width;         /*!< Output image width. */
+    int output_height;        /*!< Output image height. */
+    ia_rectangle output_crop; /*!< Crop offsets for output image. Cropping happens after scaling to output resolution. */
+} ia_isp_bxt_resolution_info_t;
+
+/*!
+* \brief Defines how ISP kernel should modify bit depth of image passing through it.
+* Note: Not all ISP kernels are able to change depth of image data which it's processing.
+*/
+typedef struct ia_isp_bxt_bpp_info
+{
+    int32_t input_bpp;        /*!< Bit depth of image going in to a particular ISP kernel. */
+    int32_t output_bpp;       /*!< Bit depth of output going out from a particular ISP kernel. */
+} ia_isp_bxt_bpp_info_t;
+
+/*!
+* \brief Describes options for run-time kernel control.
+*/
+typedef enum
+{
+    kernel_passthrough = 0,
+    kernel_enable,
+    kernel_disable
+} ia_isp_bxt_enable_control_t;
+
+typedef struct ia_isp_bxt_run_kernels
+{
+    uint32_t stream_id;                                     /*!< Used to identify, in which branch of the pipe the kernel is located. */
+    uint32_t kernel_uuid;                                   /*!< ia_pal_uuid. ISP API (output) UUID. */
+    int32_t enable;                                         /*!< Run-time control to passthrough, enable or disable kernel. */
+    ia_isp_bxt_resolution_info_t *resolution_info;          /*!< Resolution change to be done in this kernel. NULL, if kernel doesn't change resolution. */
+    ia_isp_bxt_resolution_info_t *resolution_history;       /*!< Resolution changes done before current kernel with respect to sensor output. NULL, if not available*/
+    uint32_t metadata[4];                                   /*!< Kernel specific metadata. For example image data format etc. */
+    ia_isp_bxt_bpp_info_t bpp_info;                         /*!< Kernel specific input and output bits per pixel values. */
+    uint32_t output_count;                                  /*!< Number of outputs this kernel has, this means that in this structure the pointer to resolution_info can
+                                                                 be interpreted as an array of this size */
+    ia_binary_data system_api;                              /*!< Used by system devices to get system information from graph */
+} ia_isp_bxt_run_kernels_t;
+
+typedef struct
+{
+    uint32_t kernel_uuid;                                   /*!< ia_pal_uuid */
+    uint32_t flags;
+#define IA_ISP_BXT_PIPE_LAST     (1 << 0)                   /*!< this is the last kernel in the array */
+#define IA_ISP_BXT_PIPE_FIRST    (1 << 1)                   /*!< this is the first kernel in a path */
+#define IA_ISP_BXT_PIPE_TERMINAL (1 << 2)                   /*!< this is not a kernel but a terminal.
+                                                                 In this case, kernel_uuid is the terminal id */
+#define IA_ISP_BXT_PIPE_RCB      (1 << 3)                   /*!< this kernel is a resolution changing block */
+} ia_isp_bxt_pipe_t;
+
+typedef struct ia_isp_bxt_program_group
+{
+    unsigned int kernel_count;                    /*!< Number of kernels in the program group .*/
+    ia_isp_bxt_run_kernels_t *run_kernels;        /*!< Array of kernels in the program group. */
+    unsigned int operation_mode;                  /*!< Operation mode for selecting proper tunings. Is usually associated to different resolutions. */
+    ia_isp_bxt_pipe_t *pipe;                      /*!< The graph of kernels in the program group .*/
+} ia_isp_bxt_program_group;
+
+/*!
+* \brief ia_isp_pal_status_t keeps track of PAL kernel status.
+*/
+typedef struct ia_isp_pal_status_t
+{
+    int32_t uuid;
+    int32_t status_id;
+} ia_isp_pal_status_t;
+
+typedef struct
+{
+    bool rgbs_grid;          /*!< If true, RGBS grid is available. */
+    bool af_grid;            /*!< If true, AF grid is available. */
+    bool histograms;         /*!< If true, histograms are available. */
+    bool dvs_stats;          /*!< If true, DVS statistics are available. */
+    bool rgbs_grids_hdr;     /*!< If true, RGBS HDR grids are available. */
+    bool rgby_grids_hdr;     /*!< If true, RGBY stat for high precision histogram is available. */
+    bool yv_grids_hdr;       /*!< If true, YV HDR grids are available. */
+    bool paf_grid;           /*!< If true, PAF grid is available. */
+} ia_isp_bxt_statistics_query_results_t;
+
+/*!
+ * \brief Describes options to decompress Y (luma).
+ */
+typedef enum
+{
+    ia_isp_bxt_hdr_y_decompression_max_rgb,   /*!< Use RGB max to calculate Y (luma). */
+    ia_isp_bxt_hdr_y_decompression_avg_rgb    /*!< Use RGB average to calculate Y (luma). */
+} ia_isp_bxt_hdr_y_compression_method_t;
+
+/*!
+ * \brief Describes the parameters used in HDR compression algorithm.
+ * Sensor/ISP may merge the HDR image and then compress the data to preserve data from different parts of the dynamic range.
+ * Compression is most often done to save memory. For example, merged 20 bit (input) image data could be compressed to fit into (output) 15 bits.
+ * Parameters in this structure are used to decompress HDR statistics back to linear space.
+ */
+typedef struct
+{
+    ia_isp_bxt_hdr_y_compression_method_t y_compression_method; /*!< Used decompression method. */
+    ia_isp_bxt_bpp_info_t                 bpp_info;             /*!< Input and output bits per pixel values. */
+} ia_isp_bxt_hdr_compression_t;
+
+/*!
+ * \brief Structure describes the parameters used in HDR statistics.
+ */
+typedef struct
+{
+    unsigned char num_exposures;                               /*!< Mandatory. Number of exposures the sensor supports/outputs. */
+    float *hdr_ratios;                                         /*!< Mandatory. HDR ratio of [L/S S/VS etc.] for stitching. The effective length is determined by num_exposures-1. */
+    ia_isp_bxt_hdr_compression_t *ia_isp_bxt_hdr_compression;  /*!< Optional. NULL, if HDR statistics are already in linear space (no compression). */
+} ia_isp_bxt_hdr_params_t;
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* IA_ISP_BXT_TYPES_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_types.h
new file mode 100644
index 000000000000..19e2555ce089
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_types.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_isp_types.h
+ * \brief Common ISP enumerations and structures.
+*/
+
+
+#ifndef IA_ISP_TYPES_H_
+#define IA_ISP_TYPES_H_
+
+#include "ia_aiq_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*!
+ *  \brief Complexity level for ISP features.
+ */
+typedef enum
+{
+    ia_isp_feature_level_off,   /* Feature is turned off */
+    ia_isp_feature_level_low,   /* Minimum set of algorithms are used */
+    ia_isp_feature_level_high   /* Maximum set of algorithms are used */
+} ia_isp_feature_level;
+
+/*!
+ * \brief Custom control parameters for tuning interpolation in GAIC
+ *
+ * GAIC implements generic interpolations of tuning parameters as factor of certain run-time changing parameter.
+ * This structure defines custom run-time changeable control parameters, which can be used in tuning interpolations.
+ */
+typedef struct
+{
+    int count;                        /*!< Length of parameters array. */
+    float *parameters;                /*!< Parameters used in calculation (interpolation) of tuning values.
+                                           The first element of the array corresponds custom tuning 0,
+                                           second corresponds with custom tuning 1 etc.*/
+} ia_isp_custom_controls;
+
+/*!
+ *  \brief Definitions for the color effects.
+ */
+typedef enum
+{
+    ia_isp_effect_none     =               0,
+    ia_isp_effect_sky_blue =         (1 << 0),
+    ia_isp_effect_grass_green =      (1 << 1),
+    ia_isp_effect_skin_whiten_low =  (1 << 2),
+    ia_isp_effect_skin_whiten =      (1 << 3),
+    ia_isp_effect_skin_whiten_high = (1 << 4),
+    ia_isp_effect_sepia =            (1 << 5),
+    ia_isp_effect_black_and_white =  (1 << 6),
+    ia_isp_effect_negative =         (1 << 7),
+    ia_isp_effect_vivid =            (1 << 8),
+    ia_isp_effect_invert_gamma =     (1 << 9),
+    ia_isp_effect_grayscale =        (1 << 10),
+    ia_isp_effect_aqua =             (1 << 11)
+} ia_isp_effect;
+
+/*!
+ *  \brief Settings for feature level and strength.
+ */
+typedef struct
+{
+    ia_isp_feature_level feature_level;  /* Feature level */
+    char strength;                       /* Setting for the strength [-128,127]. */
+} ia_isp_feature_setting;
+
+/* Thresholds to extract data of given range from statistics. Used to split combined WDR statistics into several low dynamic range statistics. */
+typedef struct
+{
+    float low;
+    float high;
+    float scale;
+} ia_isp_stat_split_thresh;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IA_ISP_TYPES_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_lard.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_lard.h
new file mode 100644
index 000000000000..19096f6af1e6
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_lard.h
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+/*!
+ * \file ia_lard.h
+ * \brief Lard PCF parser specific implementation.
+ */
+
+#ifndef _IA_LARD_H_
+#define _IA_LARD_H_
+
+#include "ia_types.h"
+#include "ia_mkn_types.h"
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*!
+ * \brief available group tags, each group contains all of the tuning modes,
+ * each mode, contains all of the records which are used for the different filters tunings.
+ */
+#define LCMC_TAG IA_MKN_CHTOUL('L','C','M','C')  /*!< CMC group header tag. */
+#define LAIQ_TAG IA_MKN_CHTOUL('L','A','I','Q')  /*!< 3A+ group header tag. */
+#define LISP_TAG IA_MKN_CHTOUL('L','I','S','P')  /*!< ISP group header tag. */
+#define LTHR_TAG IA_MKN_CHTOUL('L','T','H','R')  /*!< Others group header tag. */
+
+
+typedef struct ia_lard_t ia_lard;
+
+/*!
+ * \brief Initialize IA_LARD.
+ * This function must be called before any other function in the library. It allocates needed memory and
+ * parses given Lard CPF data. Initialization returns a handle to data of all parsed items, if given
+ * data is valid Lard CPF data.
+ *
+ * \param[in]     lard_data_ptr    Mandatory although function will not return error, if it not given.\n
+ * \return                         IA_LARD handle. Use the returned handle as input parameter for the consequent IA_LARD calls.
+ */
+LIBEXPORT ia_lard*
+ia_lard_init(const ia_binary_data *lard_data_ptr);
+
+/*!
+ * \brief De-initialize IA_LARD.
+ * All memory allocated by LARD is freed. LARD handle can no longer be used.
+ *
+ * \param[in] ia_lard              Mandatory.\n
+ *                                 LARD instance handle.
+ */
+LIBEXPORT void
+ia_lard_deinit(ia_lard *ia_lard_ptr);
+
+/*!
+ * \brief Input parameter structure for Lard run.
+ * Please NOTICE!
+ * the ISP group can use either index OR tag, the other groups are using tags to get
+ * the correct thing mode.
+ * for example
+ * cmc_mode_tag = 'D','F','L','T'
+ * aiq_mode_tag = 'L','O','W','L' (low light tunings which the user made up)
+ * isp_mode_index = 1 OR 'D', 'F', 'L', 'T'
+ * others_mode_tag = 'D','F','L','T'
+ *
+ *
+ */
+typedef struct
+{
+    unsigned int cmc_mode_tag;      /*!< Mandatory. CMC mode tag (4 letters) to be used with ia_lard_run. */
+    unsigned int aiq_mode_tag;      /*!< Mandatory. AIQ mode tag (4 letters) to be used with ia_lard_run. */
+    unsigned int isp_mode_index;    /*!< Mandatory. ISP mode index (number) or tag (4 letters) to be used with ia_lard_run. */
+    unsigned int others_mode_tag;   /*!< Mandatory. Other mode tag (4 letters)to be used with ia_lard_run. */
+} ia_lard_input_params;
+
+/*!
+* \brief Output parameter structure for ia_lard_run.
+* Pointers to aiqb data of requested mode for each of the groups.
+*/
+typedef struct ia_lard_results
+{
+    ia_binary_data aiqb_cmc_data;      /*!< Mandatory. Aiqb binary data struct for CMC data. */
+    ia_binary_data aiqb_aiq_data;      /*!< Mandatory. Aiqb binary data struct for AIQ data. */
+    ia_binary_data aiqb_isp_data;      /*!< Mandatory. Aiqb binary data struct for ISP data. */
+    ia_binary_data aiqb_other_data;    /*!< Mandatory. Aiqb binary data struct for Other data. */
+} ia_lard_results;
+
+/*!
+ * \brief Lard run will give pointers to aiqb data of the requested modes of each group.
+ *
+ * \param[in] ia_lard_ptr               Mandatory.\n
+ *                                      Lard instance handle.
+ * \param[in] lard_input_params_ptr     Mandatory.\n
+ *                                      Input parameters to tell modes that client is requesting.
+ * \param[in/out] lard_results_ptr      Mandatory. \n
+ *                                      Output pointer to aiqb data blocks of specific modes
+ *                                      that client were requested with lard_input_params_ptr. NULL will
+ *                                      be set if no modes are requested in some group or data for that
+ *                                      mode can't be found.
+ * \return                              Error code.
+ */
+LIBEXPORT ia_err
+ia_lard_run(
+    ia_lard *ia_lard_ptr,
+    ia_lard_input_params *lard_input_params_ptr,
+    ia_lard_results **lard_results_ptr);
+
+/*!
+ * \brief Get version.
+ * Get version from version header.
+ *
+ * \return                              Lard version string.
+ */
+LIBEXPORT const char*
+ia_lard_get_version(void);
+
+
+/*!
+ * \brief Get a list of all of the available tags for a given group
+ * \param[in] ia_lard_ptr               Mandatory.\n
+ *                                      Lard instance handle.
+ * \param[in] mode_tag                  Mandatory.\n
+ *                                      Mode tag (LAIQ, LISP, LCMC, LTHR)
+ * \param[out] num_tags                 Mandatory.\n
+ *                                      number of tunings available for given mode tag
+ * \param[out] tags                     Mandatory.\n
+ *                                      tags of available tunings for given mode tag
+ * \return                              Error code.
+ */
+LIBEXPORT ia_err ia_lard_get_tag_list(ia_lard* ia_lard_ptr, const unsigned int mode_tag, unsigned int* num_tags, const unsigned int** tags);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA_LARD_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_log.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_log.h
new file mode 100644
index 000000000000..70117dc1a407
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_log.h
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ia_types.h"
+
+#ifndef _IA_LOG_H_
+#define _IA_LOG_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef __func__
+#define __func__ __FUNCTION__
+#endif
+
+/*!
+ * \brief Macro for not logging.
+ */
+#define IA_NOLOG(...)           ((void)0)
+
+/*!
+ * \brief Macro wrapper for ia_log function.
+ */
+#define IA_LOG(level, fmt, ...) ((void)ia_log(level, fmt, ## __VA_ARGS__))
+
+/*!
+ * \brief Logging levels.
+ */
+typedef enum
+{
+    ia_log_error,
+    ia_log_debug,
+    ia_log_info,
+} ia_log_level;
+
+/*!
+ * \brief Initializes ia_log library with external function pointers for logging.
+ * If this function is not called, logging will be directed to stdout and stderr.
+ *
+ * \param[in] a_env_ptr Structure containing the addresses to logging functions.
+ *                      If NULL is passed as function pointer, there won't be log prints.
+ * \return              Error code.
+ */
+LIBEXPORT ia_err
+ia_log_init(ia_env *a_env_ptr);
+
+/*!
+ * \brief Prints formatted string.
+ *
+ *
+ * \param[in] level Log level.
+ * \param[in] fmt   Format string.
+ * \param[in] ...   Variables to be printed out as defined by the format string.
+ */
+LIBEXPORT void
+ia_log(ia_log_level level, const char *fmt, ...);
+
+/*!
+ * \brief Prints formatted string with interpreted error code.
+ *
+ *
+ * \param[in]     error               Error code.
+ * \return                            Pointer to all Error string.
+ */
+LIBEXPORT const char *
+ia_log_strerror(ia_err error);
+
+/*!
+ * \brief De-initialization of ia_log library.
+ * Must be called if ia_log_init() was called.
+ */
+LIBEXPORT void
+ia_log_deinit();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA_LOG_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm.h
new file mode 100644
index 000000000000..e198086219df
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm.h
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \mainpage IA LTM API documentation
+ *
+ * Browse Files and Classes tabs for details.
+ *
+ * \section general General info
+ *
+ *  \section init Initialization of LTM library
+ *
+ * \copybrief ia_ltm_init
+ * To create an instance of LTM library one must call function:
+ * \code ia_ltm_init \endcode
+ * \copydetails ia_ltm_init
+ *
+ * <br><hr><br>
+ */
+/*!
+ * \file ia_ltm.h
+ * \brief Definitions and declarations of Intel LTM library.
+ */
+
+
+#ifndef _IA_LTM_H_
+#define _IA_LTM_H_
+
+#include "ia_ltm_types.h"
+#include "ia_types.h"
+#include "ia_aiq_types.h"
+#include "ia_isp_bxt_statistics_types.h"
+#include "ia_mkn_types.h"
+#include "ia_ltm_deprecated.h"
+#include "ia_bcomp_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*!
+ * \brief Initialize IA_LTM.
+ * This function must be called before any other function in the library. It allocates memories for all LTM algorithms based on input parameters
+ * given by the user. Tuning parameters are parsed from AIQB and saved for LTM algorithms to use. Initialization returns a handle to the LTM instance,
+ * which is given as input parameter for other functions to access object data. Therefore, multiple instances of LTM library can running simultaneously.
+ * For example one instance per camera.
+ *
+ * \param[in]     aiqb_data         Mandatory although function will not return error, if it not given.\n
+ *                                  AIQB Block from CPFF. Contains tuning parameters for AIQ, ISP and LTM algorithms.
+ * \param[in,out] ia_mkn            Optional.\n
+ *                                  Makernote handle which can be initialized with ia_mkn library. If debug data from LTM is needed
+ *                                  to be stored into EXIF, this parameter is needed. Algorithms will update records inside this makernote instance.
+ *                                  Client writes the data into Makernote section in EXIF.
+ * return                           IA_LTM handle. Use the returned handle as input parameter for the consequent IA_LTM calls.
+ */
+LIBEXPORT ia_ltm*
+ia_ltm_init(const ia_binary_data *aiqb_data,
+            ia_mkn *ia_mkn);
+
+/*!
+ * \brief De-initialize IA_LTM.
+ * All memory allocated by LTM algorithms is freed. LTM handle can no longer be used.
+ *
+ * \param[in] ia_ltm                Mandatory.\n
+ *                                  LTM instance handle.
+ */
+LIBEXPORT void
+ia_ltm_deinit(ia_ltm *ia_ltm);
+
+/*!
+* \brief Set tuning to an existing LTM instance.
+* This function can be used to switch tunings on-the-fly in a way that LTM preserves its state and offers smooth transition from one tuning to another.
+*/
+LIBEXPORT ia_err
+ia_ltm_set_tuning(ia_ltm *ia_ltm,
+    const ia_binary_data *tuning_data_ptr);
+
+/*!
+ * \brief Input parameter structure for LTM/DRC algorithm.
+ * Note that, even though all the input statistics and image are optional (i.e. yv_grid, rgbs,grid_ptr, hdr_rgbs_grid_ptr and input_image_ptr),
+ * one of them is always needed. While certain LTM algorithms (selectable from tunings) can utilize different input, all algorithms can operate
+ * on input_image_ptr data. Some inputs may provide certain PnP or IQ advantages over others, so all inputs should still be set if available in
+ * order to allow the tuner make the appropriate choice (for instance rgbs_grid_ptr and hdr_rgbs_grid_ptr). Notice that input image or statistics
+ * may or may not contain WB gains and CCM applied. Parameters needed by Optibright algorithm are marked with '(ob)' and parameters needed by LBCE are
+ * marked with '(lb)'.
+ */
+typedef struct ia_ltm_input_params_v2
+{
+    ia_ltm_level ltm_level;                         /*!< Mandatory. LTM level. -1 to use tuning defaults.*/
+    float ev_shift;                                 /*!< Optional. (ob) Exposure Value shift [-4,4]. */
+    char ltm_strength_manual;                       /*!< Optional. (ob) User defined manual control for ltm strength, will be casted into unsigned char, [0, 200], default is 100 and means no manual effect*/
+    ia_aiq_ae_results *ae_results;                  /*!< Optional. (ob) AEC output will be used by LTM.*/
+    ia_isp_bxt_hdr_yv_grid_t *yv_grid;              /*!< Optional. (ob) Statistics used to calculate LTMs. (available only in IPU4 using FW DRC). */
+    int16_t frame_width;                            /*!< Mandatory. Width of the frame where the results will be applied. */
+    int16_t frame_height;                           /*!< Mandatory. Height of the frame where the results will be applied. */
+    ia_aiq_rgbs_grid *rgbs_grid_ptr;                /*!< Optional. (lb) RGBS statistics. LTM may use this small grid instead of given larger grids to reduce PnP (available in IPU4 and onwards). */
+    ia_aiq_hdr_rgbs_grid *hdr_rgbs_grid_ptr;        /*!< Optional. (lb) HDR RGBS statistics. LTM may use this small grid instead of given larger grids to reduce PnP (available in IPU4 and onwards). */
+    ia_ltm_input_image *input_image_ptr;            /*!< Optional. (ob)(lb) Image data of any resolution based on IQ requirements for particular use case from which LTM calculates local tone maps (HW generated image available in IPU5 and onwards). */
+    ia_ltm_gtm_input_params *gtm_input_params_ptr;  /*!< Optional. (ob) GTM parameters of LTM if GTM should be applied inside LTM. */
+    const ia_bcomp_results *bcomp_results;          /*!< Optional. (lb) Compression curve for DOL sensors */
+} ia_ltm_input_params_v2;
+
+/*!
+ * \brief LTM calculation based on input parameters and frame statistics.
+  *
+ * \param[in] ia_ltm                        Mandatory.\n
+ *                                          LTM instance handle.
+ * \param[in] ltm_input_params              Mandatory.\n
+ *                                          Input parameters for LTM calculations.
+ * \param[out] ltm_results                  Mandatory.\n
+ *                                          Pointer's pointer where address of LTM results are stored.
+ * \return                                  Error code.
+ */
+LIBEXPORT ia_err
+ia_ltm_run_v2(ia_ltm *ia_ltm,
+        const ia_ltm_input_params_v2 *ltm_input_params,
+        ia_ltm_results **ltm_results,
+        ia_ltm_drc_params **ltm_results_drc);
+
+/*!
+ * \brief Get version.
+ * Get version from version header.
+ *
+ * \return                                  Version string.
+ */
+LIBEXPORT const char* ia_ltm_get_version(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA_LTM_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_deprecated.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_deprecated.h
new file mode 100644
index 000000000000..eb8a4c75ac8d
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_deprecated.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_ltm_deprecated.h
+ * \brief Definitions and declarations of Intel LTM library.
+ */
+
+
+#ifndef _IA_LTM__DEPRECATED_H_
+#define _IA_LTM__DEPRECATED_H_
+
+#include "ia_ltm_types.h"
+#include "ia_types.h"
+#include "ia_aiq_types.h"
+#include "ia_bcomp_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*!
+ * \brief Input parameter structure for LTM/DRC algorithm.
+ * Note that, even though all the input statistics and image are optional (i.e. yv_grid, rgbs,grid_ptr, hdr_rgbs_grid_ptr and input_image_ptr),
+ * one of them is always needed. While certain LTM algorithms (selectable from tunings) can utilize different input, all algorithms can operate
+ * on input_image_ptr data. Some inputs may provide certain PnP or IQ advantages over others, so all inputs should still be set if available in
+ * order to allow the tuner make the appropriate choice (for instance rgbs_grid_ptr and hdr_rgbs_grid_ptr). Notice that input image or statistics
+ * may or may not contain WB gains and CCM applied. Parameters needed by Optibright algorithm are marked with '(ob)' and parameters needed by LBCE are
+ * marked with '(lb)'.
+ */
+typedef struct ia_ltm_input_params
+{
+    ia_ltm_level ltm_level;                 /*!< Mandatory. LTM level. -1 to use tuning defaults.*/
+    ia_aiq_frame_use frame_use;             /*!< Mandatory. Target frame type of the LTM calculations (Preview, Still, video etc.). */
+    float ev_shift;                         /*!< Optional. (ob) Exposure Value shift [-4,4]. */
+    char ltm_strength_manual;               /*!< Optional. (ob) User defined manual control for ltm strength, will be casted into unsigned char, [0, 200], default is 100 and means no manual effect*/
+    ia_aiq_ae_results *ae_results;          /*!< Optional. (ob) AEC output will be used by LTM.*/
+    ia_isp_bxt_hdr_yv_grid_t *yv_grid;      /*!< Optional. (ob) Statistics used to calculate LTMs. (available only in IPU4 using FW DRC). */
+    int16_t frame_width;                    /*!< Mandatory. Width of the frame where the results will be applied. */
+    int16_t frame_height;                   /*!< Mandatory. Height of the frame where the results will be applied. */
+    ia_aiq_rgbs_grid *rgbs_grid_ptr;        /*!< Optional. (lb) RGBS statistics. LTM may use this small grid instead of given larger grids to reduce PnP (available in IPU4 and onwards). */
+    ia_aiq_hdr_rgbs_grid *hdr_rgbs_grid_ptr;/*!< Optional. (lb) HDR RGBS statistics. LTM may use this small grid instead of given larger grids to reduce PnP (available in IPU4 and onwards). */
+    ia_ltm_input_image *input_image_ptr;    /*!< Optional. (ob)(lb) Image data of any resolution based on IQ requirements for particular use case from which LTM calculates local tone maps (HW generated image available in IPU5 and onwards). */
+    ia_ltm_gtm_input_params *gtm_input_params_ptr;  /*!< Optional. (ob) GTM parameters of LTM if GTM should be applied inside LTM. */
+} ia_ltm_input_params;
+
+typedef struct ia_ltm_input_params_v1
+{
+    ia_ltm_level ltm_level;                         /*!< Mandatory. LTM level. -1 to use tuning defaults.*/
+    float ev_shift;                                 /*!< Optional. (ob) Exposure Value shift [-4,4]. */
+    char ltm_strength_manual;                       /*!< Optional. (ob) User defined manual control for ltm strength, will be casted into unsigned char, [0, 200], default is 100 and means no manual effect*/
+    ia_aiq_ae_results *ae_results;                  /*!< Optional. (ob) AEC output will be used by LTM.*/
+    ia_isp_bxt_hdr_yv_grid_t *yv_grid;              /*!< Optional. (ob) Statistics used to calculate LTMs. (available only in IPU4 using FW DRC). */
+    int16_t frame_width;                            /*!< Mandatory. Width of the frame where the results will be applied. */
+    int16_t frame_height;                           /*!< Mandatory. Height of the frame where the results will be applied. */
+    ia_aiq_rgbs_grid *rgbs_grid_ptr;                /*!< Optional. (lb) RGBS statistics. LTM may use this small grid instead of given larger grids to reduce PnP (available in IPU4 and onwards). */
+    ia_aiq_hdr_rgbs_grid *hdr_rgbs_grid_ptr;        /*!< Optional. (lb) HDR RGBS statistics. LTM may use this small grid instead of given larger grids to reduce PnP (available in IPU4 and onwards). */
+    ia_ltm_input_image *input_image_ptr;            /*!< Optional. (ob)(lb) Image data of any resolution based on IQ requirements for particular use case from which LTM calculates local tone maps (HW generated image available in IPU5 and onwards). */
+    ia_ltm_gtm_input_params *gtm_input_params_ptr;  /*!< Optional. (ob) GTM parameters of LTM if GTM should be applied inside LTM. */
+} ia_ltm_input_params_v1;
+
+/*!
+ * \brief LTM calculation based on input parameters and frame statistics.
+  *
+ * \param[in] ia_ltm                        Mandatory.\n
+ *                                          LTM instance handle.
+ * \param[in] ltm_input_params              Mandatory.\n
+ *                                          Input parameters for LTM calculations.
+ * \param[out] ltm_results                  Mandatory.\n
+ *                                          Pointer's pointer where address of LTM results are stored.
+ * \return                                  Error code.
+ */
+LIBEXPORT ia_err
+ia_ltm_run(ia_ltm *ia_ltm,
+        const ia_ltm_input_params *ltm_input_params,
+        ia_ltm_results **ltm_results,
+        ia_ltm_drc_params **ltm_results_drc);
+
+LIBEXPORT ia_err
+ia_ltm_run_v1(ia_ltm *ia_ltm,
+        const ia_ltm_input_params_v1 *ltm_input_params,
+        ia_ltm_results **ltm_results,
+        ia_ltm_drc_params **ltm_results_drc);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA_LTM__DEPRECATED_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_types.h
new file mode 100644
index 000000000000..edf2850ed6c8
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_types.h
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_ltm_types.h
+ * \brief Definitions of input/output structures of the Intel local tone mapping library.
+ */
+
+#ifndef _IA_LTM_TYPES_H_
+#define _IA_LTM_TYPES_H_
+
+#include "ia_types.h"
+#include <stdint.h>
+#include "ia_isp_bxt_statistics_types.h"
+
+#define GTM_LUT_SIZE 32
+#define GCE_DEFOG_LUT_SIZE 64
+#define NUM_TONE_MAP_PWL_SEGMENTS 7   /*!< Local curves in piece-wise-linear form (7 pieces)*/
+#define MAX_LUT_WIDTH   145
+#define MAX_LUT_HEIGHT  500
+#define MAX_NUM_LUT 500           /*!< Max. possible number of grids in GammaStar (25 x 20) */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct ia_ltm_t ia_ltm;
+
+/*!
+ * \brief New struct for LTM/DRC (local tone mapping/dynamic range compression),
+ * LTM is a algorithm for local tone mapping when sensor is in HDR mode
+ * LTM/DRC analysis algorithm is in CPU, applying LTM is a FW block called gamma.
+ */
+typedef enum
+{
+    ia_ltm_level_use_tuning = -1,      /*!< Use LTM level defined in the tuning. */
+    ia_ltm_level_bypass = 0,           /*!< Bypass LTM (DRC) */
+} ia_ltm_level;
+
+/*!
+ * \brief Input image for LTM calculations.
+ */
+typedef struct
+{
+    ia_image_full_info image_info;     /*!< Structure defining given image format, size and other characteristics. */
+    const ia_binary_data *image_data;  /*!< Input image buffer format, layout and size depends of width & height (and other paddings) defined in image_info structure above. */
+} ia_ltm_input_image;
+
+/*!
+ * \brief struct to hold LTM LUTs
+ * Local curves in pwl format as needed by GammaStar
+ * x & y indexes, slopes for each linear piece
+ */
+typedef struct ia_ltm_lut
+{
+    uint16_t points_x[NUM_TONE_MAP_PWL_SEGMENTS + 1]; /* UQ0.15 + 2^15(offset) */
+    uint16_t slopes_a[NUM_TONE_MAP_PWL_SEGMENTS];     /* UQ8.8 */
+    uint16_t points_y[NUM_TONE_MAP_PWL_SEGMENTS];     /* UQ0.15 */
+} ia_ltm_lut;
+
+/*!
+ * \brief struct to hold LTM results
+ * - Local LUTs
+ * - Number of blocks in each dimension
+ * - Average local gain (An estimate of overall local gains to be applied is needed for accurate denoising)
+ */
+typedef struct ia_ltm_results
+{
+    ia_ltm_lut ltm_luts[MAX_NUM_LUT];   /*!< Local look-up-tables */
+    int grid_width;                     /*!< Grid width of LTM LUTs. */
+    int grid_height;                    /*!< Grid height of LTM LUTs. */
+    int block_size;                     /*!< Block size (width & height in pixels) to which LTM LUTs are applied. */
+    float ltm_gain;                     /*!< LTM gain. */
+    float dynamic_range;                /*!< Estimated scene's dynamic range from 0 to 100.  Scene has wider dynamic range when this gets closer to 100.
+                                        Currently only Optibright outputs this value and this would be zero always for all other LTM algorithms. */
+} ia_ltm_results;
+
+/*!
+ * \brief GTM parameters for DRC.
+ */
+
+typedef struct ia_ltm_gce_defog
+{
+    int32_t offset_vec[GCE_DEFOG_LUT_SIZE]; /* U15 */
+    int32_t slope_vec[GCE_DEFOG_LUT_SIZE];  /* S15 */
+    int32_t x_cord_vec[GCE_DEFOG_LUT_SIZE]; /* U15 */
+    int32_t x_cord_max;                     /* U15 */
+    int32_t exponent;                       /* U4  */
+    int32_t resolution;                     /* U4  */
+    int32_t A0;
+    int32_t A1;
+    int32_t ltm_bypass;
+    int32_t ltm_weight;                     /* U15 */
+    int32_t defog_enable;
+    int32_t defog_enhance;
+} ia_ltm_gce_defog;
+
+typedef struct ia_ltm_drc_gtm
+{
+    unsigned short gtm_bypass;
+    unsigned short xcu_gtm_offset_vec[GTM_LUT_SIZE];
+    short xcu_gtm_slope_vec[GTM_LUT_SIZE];
+    unsigned short xcu_gtm_x_cord_vec[GTM_LUT_SIZE];
+    unsigned short xcu_gtm_x_cord_max;
+    unsigned short xcu_gtm_exponent;
+    unsigned short xcu_gtm_slope_resolution;
+    unsigned short gtm_gain_frac_bit;
+} ia_ltm_drc_gtm;
+
+/*!
+ * \brief LTM results from algorithms, passing to DRC in IPU4i HDR pipe.
+ */
+
+typedef struct ia_ltm_drc_params
+{
+    unsigned short gain_map[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];    /*!< U15.gain_map is upscaled by bilateral, applied to pixel-to-pixel in DRC FW block. */
+    unsigned short weight_map[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];  /*!< U15.weight_map is for computing similarity inside DRC FW block. */
+    ia_ltm_drc_gtm drc_gtm;                                         /*! GTM parameters. */
+    ia_ltm_gce_defog gce_defog;                                     /*! GCE/DEFOG parameters. */
+} ia_ltm_drc_params;
+
+/*!
+ * \brief GTM parameters for GTM part of LTM.
+ * If GTM is applied inside LTM this structure is used for passing arguments to GTM. In case that GTM is applied
+ * inside LTM, GBCE and GammaTM ISP block should be disabled.
+ */
+typedef struct
+{
+    float manual_gain;                  /*!< Mandatory. Manual gain. -1.0 if NA */
+    float manual_convergence_time;      /*!< Mandatory. Manual brightness convergence speed in seconds. -1.0 if NA. */
+    unsigned long long frame_timestamp; /*!< Mandatory. Current time stamp in micro seconds. */
+} ia_ltm_gtm_input_params;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA_LTM_TYPES_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_me_corner.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_me_corner.h
new file mode 100644
index 000000000000..7d3d53c48119
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_me_corner.h
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_me_corner.h
+ * \brief Motion estimation from corner detection and feature matching DVS statistics.
+ */
+#ifndef _IA_ME_CORNER_H_
+#define _IA_ME_CORNER_H_
+
+#include <stdint.h>
+#include "ia_dvs_types.h"
+#include "dvs_stat_public.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** ME Corner State.
+ * Host code access to the Motion Estimation Corner detection API with this.
+ */
+typedef struct t_ia_me_corner ia_me_corner_state;
+
+/** \brief Initialize the ME corner detection module.
+ *
+ * \param[out]  me_corner_state      ME corner state.
+ *                                   This is a pointer to a pointer to a module.
+ * \param[in]   aiq_tuning_binary    aiqb binary tuning parameter.
+ * \return                           0 for no error, others for error.
+ *
+ * This function initializes the Motion Estimation Corner detection module. This allocates and initializes
+ * internal data structures. This function must always be called before any
+ * other ia_me_corner function.
+ */
+LIBEXPORT ia_err
+ia_me_corner_init(ia_me_corner_state **me_corner_state,
+                  const ia_binary_data *aiq_tuning_binary);
+
+/** \brief Configures the ME corner module.
+ *
+ * \param[in]  me_corner_state       ME corner state.
+ *                                   This is a pointer to a module.
+ * \param[in]  input_resolution      ISP input resolution in BQ.
+ * \return                           0 for no error, others for error.
+ *
+ * This function configures the Motion Estimation corner detection module. This function must always be called
+ * after ia_me_corner_init.
+ */
+LIBEXPORT ia_err
+ia_me_corner_config(ia_me_corner_state *me_corner_state,
+                    ia_dvs_bq_resolution *input_resolution);
+
+/** \brief Deinitialize the ME corner module.
+ *
+ * \param[in]   me_corner_state  ME corner state.
+ *                               This is a pointer to a module.
+ *
+ * This function deinitilizes the ME corner module. This frees the allocated memory.
+ */
+LIBEXPORT void
+ia_me_corner_deinit(ia_me_corner_state *me_corner_state);
+
+/*!
+ * \brief Allocate statistics buffer.
+ *
+ * Returns allocated DVS statistics.
+ *
+ * \param[out]  statistics          Mandatory.\n
+ *                                  Pointer's pointer where statistics buffer instance is stored.
+ * \return                          Error code.
+ */
+LIBEXPORT ia_err
+ia_me_corner_allocate_statistics(struct ia_css_skc_dvs_statistics **statistics);
+
+/*!
+ * \brief Free the statistics buffer.
+ *
+ * Free the statistics buffer.
+ *
+ * \param[in]   statistics          Mandatory.\n
+ *                                  Pointer to allocated statistics buffer.
+ * \return                          Error code.
+ */
+LIBEXPORT ia_err
+ia_me_corner_free_statistics(struct ia_css_skc_dvs_statistics *statistics);
+
+
+/** \brief Set the ME corner statistics.
+ *
+ * \param[in]   me_corner_state     ME corner state.
+ *                                  This is a pointer to a module.
+ * \param[in]   corner_statistics   Pointer to statistics from ISP
+ * \param[out]  dvs_statistics      Pointer to pointer to converted DVS statistics
+ * \return                          0 for no error, others for error.
+ *
+ * This function converts corner based statistics to generic DVS statistics.
+ */
+LIBEXPORT ia_err
+ia_me_corner_convert_statistics(ia_me_corner_state *me_corner_state,
+                                const struct ia_css_skc_dvs_statistics *corner_statistics,
+                                ia_dvs_statistics **dvs_statistics);
+
+/** \brief Gets the ME corner statistics configuration.
+ *
+ * \param[in]   me_corner_state        ME corner state.
+ *                                     This is a pointer to a module.
+ * \param[out]  dvs_statistics_config  Pointer to pointer to calculated DVS statistics configuration
+ * \return                             0 for no error, others for error.
+ *
+ * This function calculates configuration for collecting DVS statistics.
+ */
+LIBEXPORT ia_err
+ia_me_corner_get_statistics_config(ia_me_corner_state *me_corner_state,
+                                   struct ia_css_dvs_stat_grid_info **dvs_statistics_config);
+
+
+/*!
+ * \brief Get version.
+ * Get version from version header.
+ *
+ * \return                             Version string.
+ */
+LIBEXPORT const char* ia_me_corner_get_version(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA_ME_CORNER_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_decoder.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_decoder.h
new file mode 100644
index 000000000000..132c660df1d4
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_decoder.h
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_mkn_decoder.h
+ * \brief Definitions of functions to decode records from Maker Note.
+*/
+
+#ifndef IA_MKN_DECODER_H_
+#define IA_MKN_DECODER_H_
+
+#include "ia_types.h"
+#include "ia_mkn_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*!
+ * \brief Checks if makernote contents are valid.
+ *
+ * \param[in] a_mknt_data_ptr       Mandatory.\n
+ *                                  Pointer to the makernote (MKNT) binary data.
+ * \param[in] a_tag                 Mandatory.\n
+ *                                  Tag which should match tag in the given data. Can be 0, if tag doesn't matter.
+ * \return                          True if makernote data is valid.
+ */
+LIBEXPORT bool
+ia_mkn_is_valid(const ia_binary_data *a_mknt_data_ptr,
+                const unsigned int a_tag);
+
+/*!
+ * \brief Changes endianness of given makernote buffer.
+ * Modifies the makernote buffer by changing endianness of makernote header and records.
+ *
+ * \param[in, out] mknt_data        Mandatory.\n
+ *                                  Pointer to the makernote (MKNT) binary data which will be changed
+ *                                  to different endianness.
+ * \return                          Error code.
+ */
+LIBEXPORT ia_err
+ia_mkn_change_endianness(ia_binary_data *mknt_data);
+
+/*!
+ * \brief Prints all records contents.
+ * Prints all record headers and record contents into the stdout in the same format as defined by the DFID. If a buffer
+ * containing makernote header file is given as input, the DNID is also printed out as the first value on each row.
+ * Note. Makernote data CRC validity is not checked when printing records. Prior to calling this function,
+ * call ia_mkn_is_valid() to validate integrity of makernote data.
+ *
+ * \param[in] mknt_data             Mandatory.\n
+ *                                  Pointer to the makernote (MKNT) binary data.
+ * \param[in] makernote_header_file Optional.\n
+ *                                  Buffer where makernote header file has been read. Can be NULL.
+ * \param[in] mkn_dnid_struct_name  Optional.\n
+ *                                  C string of name of structure containing DNIDs in the given header file.
+ * \param[in] dnid                  Mandatory.\n
+ *                                  Record's DNID to print. If 0, all records will be printed out.
+ * \param[in] binary                Mandatory.\n
+ *                                  Flag indicating if data is printed out as binary data into stdout.
+ * \param[in] key                   Mandatory.\n
+ *                                  Packing key (16 bytes).
+ * \return                          Error code.
+ */
+#ifdef TESTMODE
+LIBEXPORT ia_err
+ia_mkn_print_record(const ia_binary_data *mknt_data,
+                    const char *makernote_header_file,
+                    const char *mkn_dnid_struct_name,
+                    ia_mkn_dnid dnid,
+                    bool binary,
+                    const char *key);
+
+#endif
+/*!
+ * \brief Copies record data from the makernote to given buffer.
+ * Checks if a given record exists in the makernote and copies the data from the makernote buffer into the record data buffer.
+ * The amount to copy depends on size value given as input in the record header structure. If size is 0,
+ * only the record header is updated with correct data size and no data is copied. Thus this function can be called twice:
+ * First to get the record size and second time (after allocating a buffer for the output) to get the record data. When querying
+ * for record, DFID and DNID must match the record's DFID and DNID.
+ * Note. Makernote data CRC validity is not checked when getting records. Prior to calling this function,
+ * call ia_mkn_is_valid() to validate integrity of makernote data.
+ *
+ * \param[in] mknt_data             Mandatory.\n
+ *                                  Pointer to the makernote (MKNT) binary data.
+ * \param[in] key                   Mandatory.\n
+ *                                  Packing key (16 bytes).
+ * \param[in,out] mkn_record_header Mandatory.\n
+ *                                  Record header with size set to 0 or wanted data size from record. DFID and DNID
+ *                                  must be set correctly to get record data.
+ * \param[out]    record_data       Mandatory if record header size is not 0.\n
+ *                                  Large enough buffer to hold whole record data.
+ * \return                          Error code.
+ */
+LIBEXPORT ia_err
+ia_mkn_get_record(const ia_binary_data *mknt_data,
+                  const char* key,
+                  ia_mkn_record_header *mkn_record_header,
+                  void *record_data);
+
+/*!
+ * \brief Copies record data from the makernote to given buffer.
+ * Parses through the makernote file and copies record headers of the first num_mkn_records to the given memory array.
+ * Client should make sure enough memory is allocated for num_mkn_records in the given array.
+ * If mkn_record_headers is NULL, this function will return the number of records. Thus
+ * first call can be used to query how many records there are and second call to get the actual record headers.
+ *
+ * \param[in] mknt_data              Mandatory.\n
+ *                                   Pointer to the makernote (MKNT) binary data.
+ * \param[in,out] num_mkn_records    Mandatory.\n
+ *                                   Number of makernote records the function is allowed to parse and store to the mkn_record_headers.
+ * \param[in,out] mkn_record_headers Mandatory.\n
+ *                                   Client allocated memory for storing the array of record headers parsed by this function.
+ * \return                           Error code.
+ */
+LIBEXPORT ia_err
+ia_mkn_get_record_headers(const ia_binary_data *mknt_data,
+                          int *num_mkn_records,
+                          ia_mkn_record_header *mkn_record_headers);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* IA_MKN_DECODER_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_encoder.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_encoder.h
new file mode 100644
index 000000000000..b715b8595763
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_encoder.h
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_mkn_encoder.h
+ * \brief Definitions of functions to control and add records to Maker Note.
+*/
+
+#ifndef IA_MKN_ENCODER_H_
+#define IA_MKN_ENCODER_H_
+
+#include <stddef.h>
+#include "ia_types.h"
+#include "ia_mkn_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*!
+ * \brief Creates Make Note system handle.
+ * Allocates and initializes makernote handle. Handle must be given as input parameter to all consequent ia_mkn calls.
+ *
+ * \param[in] mkn_config_bits       Mandatory.\n
+ *                                  Configuration flag bits.
+ * \param[in] mkn_section_1_size    Mandatory.\n
+ *                                  Size of Section 1 data buffer.
+ * \param[in] mkn_section_2_size    Mandatory.\n
+ *                                  Size of Section 2 data buffer.
+ * \return                          Pointer to the makernote handle.
+ */
+LIBEXPORT ia_mkn*
+ia_mkn_init(ia_mkn_config_bits mkn_config_bits,
+            size_t mkn_section_1_size,
+            size_t mkn_section_2_size);
+
+/*!
+ * \brief Deletes Make Note system handle.
+ *
+ * \param[in] mkn                Mandatory. \n
+ *                               Pointer to makernote handle.
+ * \return                       Error code.
+ */
+LIBEXPORT void
+ia_mkn_uninit(ia_mkn *mkn);
+
+/*!
+ * \brief Reset Make Note system to default state.
+ *
+ * \param[in] mkn                Mandatory. \n
+ *                               Pointer to makernote handle obtained from ia_mkn_init function call.
+ * \return                       Error code.
+ */
+LIBEXPORT ia_err
+ia_mkn_reset(ia_mkn *mkn);
+
+/*!
+ * \brief Adds or updates a data record in the makernote.
+ *
+ * \param[in] mkn                Mandatory. \n
+ *                               Pointer to makernote handle obtained from ia_mkn_init function call.
+ * \param[in] data_format_id     Mandatory.\n
+ *                               Record data format ID.
+ * \param[in] data_name_id       Mandatory.\n
+ *                               Record name ID.
+ * \param[in] data               Mandatory.\n
+ *                               Pointer to record data to be copied into the makernote. Size of data to be copied is calculated
+ *                               from on DFID and number of elements.
+ * \param[in] num_elements       Mandatory.\n
+ *                               Number of elements to store.
+ * \param[in] key                Mandatory.\n
+ *                               Packing key (16 bytes). NULL means 'no packing'.
+ * \return                       Error code.
+*/
+LIBEXPORT ia_err
+ia_mkn_add_record(ia_mkn *mkn,
+                  ia_mkn_dfid mkn_data_format_id,
+                  ia_mkn_dnid mkn_data_name_id,
+                  const void *data,
+                  unsigned int num_elements,
+                  const char *key);
+
+/*!
+ * \brief Deletes a data record from the makernote.
+ *
+ * \param[in] mkn                Mandatory. \n
+ *                               Pointer to makernote handle obtained from ia_mkn_init function call.
+ * \param[in] data_format_id     Mandatory.\n
+ *                               Record data format ID.
+ * \param[in] data_name_id       Mandatory.\n
+ *                               Record name ID.
+ * \return                       Error code.
+*/
+LIBEXPORT ia_err
+ia_mkn_delete_record(ia_mkn *mkn,
+                     ia_mkn_dfid mkn_data_format_id,
+                     ia_mkn_dnid mkn_data_name_id);
+
+/*!
+ * \brief Prepares makernote so that it can be included into the EXIF.
+ * Based on data target: Section 1 can be used by client for example for EXIF or Section 2 where all (Section 1 & Section 2) records will be included.
+ * calculates checksum, updates total size of makernote data, compresses and pack makernote data.
+ *
+ * \param[in] mkn                Mandatory. \n
+ *                               Pointer to makernote handle obtained from ia_mkn_init function call.
+ * \param[in] data_target        Target of the makernote as defined in enum ia_mkn_trg.
+ * \return                       Binary data structure with pointer and size of data..
+ */
+LIBEXPORT ia_binary_data
+ia_mkn_prepare(ia_mkn *mkn,
+               ia_mkn_trg data_target);
+
+/*!
+ * \brief Enable/Disable makernote data collecting.
+ *
+ * \param[in] mkn                Mandatory. \n
+ *                               Pointer to makernote handle obtained from ia_mkn_init function call.
+ * \param enable_data_collection Mandatory.\n
+ *                               Enable/disable data collection.
+ * \return                       Error code.
+*/
+LIBEXPORT ia_err
+ia_mkn_enable(ia_mkn *mkn,
+              bool enable_data_collection);
+
+/*!
+ * \brief Merge two makernotes.
+ * Copies all records from source makernote to the target makernote. Existing same records in the target are overwritten by source record.
+ * Both makernotes must be created with the same makernote library ie. have the same internal structure.
+ * After merging makernotes, ia_mkn_prepare() function must be called before using the merged makernote.
+ *
+ * \param[in,out] mkn_trg_data   Target makernote. Source makernote will be merged into this.
+ * \param[in]     mkn_src_data   Source makernote.
+ * \return                       Error code.
+ */
+LIBEXPORT ia_err
+ia_mkn_merge(ia_mkn *mkn_trg,
+             const ia_mkn *mkn_src);
+
+/*!
+ * \brief Converts makernote (MKNT) binary data to full MKN data.
+ *  Allocates full MKN data and copies the content of (MKNT) binary data to MKN.
+ *
+ * \param[in]     mknt_src_data  Pointer to the makernote (MKNT) binary data.
+ * \return                       Pointer to the makernote handle.
+ */
+LIBEXPORT ia_mkn*
+ia_mknt_to_mkn(const ia_binary_data *mknt_src_data);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IA_MKN_ENCODER_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_types.h
new file mode 100644
index 000000000000..a63af4d2c33b
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_types.h
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_mkn_types.h
+ * \brief Enumerations, structures and definitions used in the Maker Note System.
+*/
+
+#ifndef _IA_MKN_TYPES_H_
+#define _IA_MKN_TYPES_H_
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*!
+ * \brief combines 4 chars into one unsigned long integer.
+ */
+#define IA_MKN_CHTOUL(a,b,c,d) \
+    ( (uint32_t)(a) | ((uint32_t)(b)<<8) | ((uint32_t)(c)<<16) | ((uint32_t)(d)<<24) )
+
+/*!
+ * \brief Makernote tag. 4 first bytes of the makernote data.
+ */
+#define IA_MKN_TAG IA_MKN_CHTOUL('M','K','N','T')
+
+/*!
+ * \brief Definition of ia_mkn handle.
+ * Definition to clarify when ia_mkn handle is expected to be used.
+ */
+typedef void ia_mkn;
+
+/*!
+ *  Start of MKN System enumeration set.
+ * \brief Enumerations set for Maker Note System.
+ * This part contatins two enumerations:
+ * - 'ia_mkn_dfid', describes data type of the 'Data' field in the MKN record;
+ * - 'ia_mkn_dnid',describes a name (or functionality) of data in the 'Data' field.
+ * To modify this file a following procedure is used:
+ * a) Add new enum members of ia_mkn_dfid or ia_mkn_dnid
+ * b) Update MKN_ENUMS_DATA_REVISION accordingly.
+ */
+
+/*!
+ *  Revision of MKN System enumeration set, format 0xYYMMDDVV, where:
+ * - YY: year,
+ * - MM: month,
+ * - DD: day,
+ * - VV: version ('01','02' etc.)
+ */
+#define IA_MKN_ENUMS_DATA_REVISION 0x14012702
+
+/*!
+ * \brief Data Format ID (DFID) enumeration describes data type of the 'Data' field in the MKN record.
+ */
+typedef enum
+{
+    ia_mkn_dfid_dummy,                     /*!< Used for dummy records (no actual data). */
+
+    /*! Standard integer data types */
+    ia_mkn_dfid_signed_char,               /*!< 8-bit, int. values, range: -128 to 127 */
+    ia_mkn_dfid_unsigned_char,             /*!< 8-bit, int. values, range: 0 to 255 */
+    ia_mkn_dfid_signed_short,              /*!< 16-bit, int. values, range: -32768 to 32767 */
+    ia_mkn_dfid_unsigned_short,            /*!< 16-bit, int. values, range: 0 to 65535 */
+    ia_mkn_dfid_signed_int,                /*!< 32-bit, int. values, range: -2147483648 to 2147483647 */
+    ia_mkn_dfid_unsigned_int,              /*!< 32-bit, int. values, range: 0 to 4294967295 */
+    ia_mkn_dfid_signed_long_long,          /*!< 64-bit, int. values, range: -9223372036854775808 to 9223372036854775807 */
+    ia_mkn_dfid_unsigned_long_long,        /*!< 64-bit, int. values, range: 0 to 18446744073709551615 */
+    ia_mkn_dfid_string,                    /*!< 8-bit chars which are converted to ASCII. */
+
+    /*! Floating point numbers. */
+    ia_mkn_dfid_float = 14,                /*!< IEEE-754 floating point single precision */
+    ia_mkn_dfid_double,                    /*!< IEEE-754 floating point double precision */
+
+    /*! Fixed point fractional data types */
+    ia_mkn_dfid_unsigned_q16_16,            /*!< 32-bit, Unsigned fixed point fractional value,  16 bits integer, 16 bits fractional */
+    ia_mkn_dfid_signed_q15_16,              /*!< 32-bit, Signed fixed point fractional value,  1 bit sign, 15 bits integer, 16 bits fractional */
+    ia_mkn_dfid_unsigned_q8_8,              /*!< 16-bit, Unsigned fixed point fractional value,  8 bits integer, 8 bits fractional */
+    ia_mkn_dfid_signed_q7_8,                /*!< 16-bit, Signed fixed point fractional value,  1 bit sign, 7 bits integer, 8 bits fractional */
+
+    ia_mkn_dfid_last                        /*!< Total number of data types, keep this enum member as a last one!. */
+} ia_mkn_dfid;
+
+
+/*!
+ * \brief Data Name ID (DNID) enumeration describes a name (or functionality) of data in the 'Data' field.
+ */
+typedef enum
+{
+    ia_mkn_dnid_dummy,                      /*!< Used for dummy records (no actual data). */
+    ia_mkn_dnid_ia_aiq_records = 1,         /*!< ia_aiq library internal records. */
+    ia_mkn_dnid_hal_records = 256,          /*!< HAL records. */
+    ia_mkn_dnid_ia_isp_records = 512,       /*!< ia_isp library internal records. */
+    ia_mkn_dnid_free_records = 768,         /*!< Next free block of records - replace this when assigned. */
+    ia_mkn_dnid_last                        /*!< Total number of data names, keep this enum member as a last one!. */
+} ia_mkn_dnid;
+
+
+/*!
+ * \brief Bitfield to enable makernote features.
+ */
+typedef enum
+{
+    ia_mkn_cfg_compression  = 1,        /*!< Enable compression of maker note data */
+    ia_mkn_cfg_imported  = 1 << 1,      /*!< Shows that MKN has been imported from binary container */
+} ia_mkn_config_bits;
+
+
+/*!
+ * \brief Target of the makernote data: Section 1 or 2 (which could represent e.g. JPEG EXIF or RAW Header data).
+ *  Notice that if Section 2 is selected, an output makernote data will contain both Section 1 and Section 2 parts.
+ *  Bitwise OR'd with DNID when set for the target sections.
+ */
+typedef enum
+{
+    ia_mkn_trg_section_1    = 0,        /*!< Extensions ('or'-ed to ia_mkn_dnid) */
+    ia_mkn_trg_section_2    = 0x10000   /*!< Extensions ('or'-ed to ia_mkn_dnid) */
+} ia_mkn_trg;
+
+
+/*!
+ * \brief Makernote header structure. Records (ia_mkn_record_header) are followed after this header.
+ */
+typedef struct
+{
+    uint32_t tag;                           /*!< Tag in the beginning of makernote data. It also can be used to determine endianness. */
+    uint32_t size;                          /*!< Size of the actual makernote records data (including ia_mkn_header) */
+    uint32_t system_version;                /*!< Version of makernote system, format 0xYYMMDDVV */
+    uint32_t enum_revision;                 /*!< Revision of makernote enumerations set, format 0xYYMMDDVV */
+    uint32_t config_bits;                   /*!< Configuration flag bits set */
+    uint32_t checksum;                      /*!< Global checksum of all bytes from the maker note buffer */
+} ia_mkn_header;
+
+
+/*!
+ * \brief Record header structure. Data is followed after this header.
+ */
+typedef struct
+{
+    uint32_t size;                          /*!< Size of record including header */
+    uint8_t data_format_id;                 /*!< ia_mkn_dfid enumeration values used */
+    uint8_t key_id;                         /*!< Packing key ID. If 0 - no packing */
+    uint16_t data_name_id;                  /*!< ia_mkn_dnid enumeration values used */
+} ia_mkn_record_header;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA_MKN_TYPES_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_nvm.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_nvm.h
new file mode 100644
index 000000000000..53c2a382a06f
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_nvm.h
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file nvmparser.h
+ * \brief Definitions of NVM (Non-Volatile Memory) data parser.
+*/
+
+#ifndef _IA_NVM_H_
+#define _IA_NVM_H_
+
+#include <stdint.h>
+#include "ia_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define IA_NVM_NUM_CHANNELS 4
+#define IA_NVM_LSC_BIT_DEPTH_THRESHOLD 8
+#define IA_NVM_MIN_LSC_WIDTH 7
+#define IA_NVM_MIN_LSC_HEIGHT 5
+#define IA_NVM_SENSITIVITY_BIT_DEPTH 10
+#define IA_NVM_CIE_RANGE_MIN 0.270
+#define IA_NVM_CIE_RANGE_MAX 0.490
+
+#define IA_NVM_INTERFACE_PDAF_MAJOR_VERSION   2
+
+#define IA_NVM_STATIC_BUFFER_SIZE_V1 10
+#define IA_NVM_STATIC_BUFFER_SIZE_V2 12 /*new nvm format with PDAF fields added*/
+
+/*!
+ * \brief NVM parsing status codes.
+ */
+typedef enum
+{
+    ia_nvm_error_none,            /*!< No error. */
+    ia_nvm_error_internal,        /*!< Parser internal failure (not enough memory). */
+    ia_nvm_error_no_data,         /*!< NULL pointer as input or not enough input data. */
+    ia_nvm_error_af,              /*!< Error parsing AF parameters. */
+    ia_nvm_error_lsc,             /*!< Error parsing AF parameters. (lsc dimensions, lsc data) */
+    ia_nvm_error_awb,             /*!< Error parsing AWB parameters (sensitivities, n_lights). */
+    ia_nvm_error_crc,             /*!< CRC check error. */
+    ia_nvm_error_not_used,        /*!< No error in NVM data but NVM data is not used. */
+    ia_nvm_error_not_implemented, /*!< Parser for given data type has not been implemented. */
+    ia_nvm_error_version,         /*!< invalid version. */
+    ia_nvm_error_pdaf,            /*!< Error parsing PDAF parameters */
+    ia_nvm_error_vcm,             /*!< Error parsing Closed loop vcm parameters*/
+} ia_nvm_error;
+
+/*!
+ * \brief PDAF PS Table data layout in NVM (Non-Volatile Memory) data.
+ */
+typedef struct
+{
+    uint16_t* pdaf_ps_left;          /*!< PS Gain tables for Left Pixels */
+    uint16_t* pdaf_ps_right;         /*!< PS Gain tables for Right Pixels */
+} ia_nvm_pdaf_ps;
+
+/*!
+ * \brief PDAF data layout in NVM (Non-Volatile Memory) data.
+ */
+typedef struct
+{
+    uint8_t pdaf_ps_sensor_modes;                     /*!< number of sensor modes calibrated for PS */
+    uint8_t pdaf_ps_knots_width;                      /*!< number of PS knots across width */
+    uint8_t pdaf_ps_knots_height;                     /*!< number of PS knots across height */
+    uint8_t pdaf_ps_frac_bits;                        /*!< PS Fractional Bit depth */
+    ia_nvm_pdaf_ps *pdaf_ps_tables;                  /*!< PS tables for all the sensor modes */
+    uint8_t pdaf_dlom_knots_width;                   /*!< number of DLOM knots across width */
+    uint8_t pdaf_dlom_knots_height;                  /*!< number of DLOM knots across height */
+    uint8_t pdaf_dlom_frac_bits;                     /*!< DLOM Fractional Bit Depth */
+    int32_t* pdaf_dlom_tables;                      /*!< DLOM tables */
+} ia_nvm_pdaf_data;
+
+/*!
+ * \brief Closed loop vcm calibration data layout in NVM (Non-Volatile Memory) data.
+ */
+typedef struct
+{
+    uint8_t  closed_loop_hall_offset_vert;  /*!< vertical distance b/w Hall sensor and Magnet */
+    uint8_t  closed_loop_hall_bias_horz;    /*!< horizontal distance b/w Hall sensor and Magnet */
+    uint16_t closed_loop_hall_min;          /*!< Hall sensor movement minimum limit */
+    uint16_t closed_loop_hall_max;          /*!< Hall sensor movement maximum limit */
+} ia_nvm_closed_loop_vcm;
+
+/*!
+ * \brief LSC table layout in NVM (Non-Volatile Memory) data.
+ * LSC tables are one after another for N amount of lights. One LSC table consists of tables for 4 channels in order: Ch1, Ch2, Ch3 and Ch4.
+ */
+typedef struct
+{
+    uint8_t lsc_frac_bits;                    /*!< LSC fractional bit depth range 4-8. */
+    void *lsc_tables[IA_NVM_NUM_CHANNELS];    /*!< LSC table for Ch1, Ch2, Ch3 and Ch4. Type depends on lsc_fraq_bits. If <= IA_NVM_LSC_BIT_DEPTH_THRESHOLD, then uint8_t, else uint16_t. */
+} ia_nvm_lsc;
+
+
+typedef struct
+{
+    uint8_t major_version;                            /*!< Calibration data major version. */
+    uint8_t minor_version;                            /*!< Calibration data minor version. */
+    uint8_t n_pos;                                    /*!< Number of AF measurement orientations. */
+    uint8_t vcm_lps_bits;                             /*!< VCM lens position sensor bit depth (0 if N/A). */
+    uint8_t vcm_bits;                                 /*!< VCM register bit depth (8 or 16). */
+    int16_t *vcm_af_near;                             /*!< VCM register values for n_pos for AF at near calibration distance (supplier specific). */
+    int16_t *vcm_af_far;                              /*!< VCM register values for n_pos for AF at far calibration distance (supplier specific). */
+    int16_t *vcm_af_start;                            /*!< VCM register values for n_pos for AF at lens start.DEPRICATED.the parameter must not be used */
+    int16_t *vcm_af_end;                              /*!< VCM register values for n_pos for AF at lens end.DEPRICATED the parameter must not be used */
+    uint8_t n_lights;                                 /*!< Number of light sources used for LSC and AWB. */
+    uint8_t *cie_coords_x;                            /*!< CIE x coordinates for n_lights light sources. */
+    uint8_t *cie_coords_y;                            /*!< CIE y coordinates for n_lights light sources. */
+    uint8_t lsc_width;                                /*!< Width of all LSC tables. */
+    uint8_t lsc_height;                               /*!< Height of all LSC tables. */
+    ia_nvm_lsc *lsc;                                  /*!< LSC tables for n_lights. */
+    uint16_t *awb_sensitivities[IA_NVM_NUM_CHANNELS]; /*!< AWB sensitivities for n_lights in order: Ch1, Ch2, Ch3 and Ch4. */
+    uint8_t pdaf_data_present;                        /*!< PDAF Calibration data present or not(0: no PDAF Data)*/
+    ia_nvm_pdaf_data *pdaf_data;                      /*!< PDAF Calibration data */
+    uint8_t closed_loop_data_present;                 /*!< closed loop vcm data present or not (0: no vcm data)*/
+    ia_nvm_closed_loop_vcm *vcm;                      /*!< vcm data */
+    uint16_t checksum;                                /*!< CRC-16 checksum calculated from all bytes before checksum. */
+} ia_nvm;
+
+/*!
+ * \brief Parses intel specified camera NVM data into ia_nvm structure.
+ * \param[in]  nvm        Camera NVM data in Intel specified format.
+ * \param[out] parsed_nvm Camera NVM in parsed (ia_nvm) structure.
+ * \return                NVM parsing error code.
+ */
+LIBEXPORT ia_nvm_error
+ia_nvm_parse(const ia_binary_data *nvm,
+             ia_nvm** parsed_nvm);
+
+/*!
+ * \brief Frees contents of ia_nvm structure.
+ * \param[in] parsed_nvm Camera NVM in parsed (ia_nvm) structure.
+ */
+LIBEXPORT void
+ia_nvm_deinit(ia_nvm *parsed_nvm);
+
+/*!
+ * \brief Allocates memory and creates Intel specified camera NVM data from input structure.
+ * \param[in] parsed_nvm Structure containing values from which the binary will be created.
+ * \return               Binary data containing the camera NVM in Intel specified format.
+ */
+LIBEXPORT ia_binary_data*
+ia_nvm_binary_create(const ia_nvm *parsed_nvm);
+
+/*!
+ * \brief Deletes memory allocated by ia_nvm_binary_create() function.
+ * \param[in] nvm_binary Binary data created by function ia_nvm_binary_create.
+ */
+LIBEXPORT void
+ia_nvm_binary_delete(ia_binary_data *nvm_binary);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA_NVM_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_ob.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_ob.h
new file mode 100644
index 000000000000..fad1336b845c
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ob.h
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*!
+ * \mainpage IA OB API documentation
+ *
+ * Browse Files and Classes tabs for details.
+ *
+ */
+/*!
+ * \file ia_ob.h
+ * \brief Definitions and declarations of IA OB library.
+ */
+#ifndef _IA_OB_H_
+#define _IA_OB_H_
+
+#include "ia_types.h"
+
+#define IA_OB_DEBUG
+#if defined IA_OB_DEBUG
+#define IA_OB_LOG(fmt, ...)       IA_LOG(ia_log_debug, "IAOB: " fmt, ## __VA_ARGS__)
+#define IA_OB_LOG_ERROR(fmt, ...) IA_LOG(ia_log_error, "IAOB: ERROR: " fmt, ## __VA_ARGS__)
+#define DEBUG_BUFFER_SIZE 1024*7
+#else
+#define IA_OB_LOG            IA_NOLOG
+#define IA_OB_LOG_ERROR      IA_NOLOG
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define IA_OB_VERSION "1.0.0.0"
+typedef struct ia_ob_t ia_ob;
+
+typedef enum
+{
+    ia_ob_interleave_none,
+    ia_ob_interleave_two,
+} ia_ob_interleave_mode;
+
+/*!
+ * \brief OB runtime input.
+ */
+typedef struct {
+    short *frame_data;       /*!< fixed point image */
+    unsigned int frame_width;         /*!< current frame width (might be cropped) */
+    unsigned int frame_height;        /*!< current frame height (might be cropped) */
+    unsigned int ob_top;
+    unsigned int ob_left;
+    unsigned int ob_width;
+    unsigned int ob_height;
+    ia_ob_interleave_mode interleave_step;
+} ia_ob_input;
+
+/*!
+ * \brief OB per-run output.
+ */
+typedef struct {
+    float cc00;
+    float cc01;
+    float cc10;
+    float cc11;
+} ia_ob_output;                 /*!< OB ouput for 4 color components */
+
+LIBEXPORT ia_ob*
+ia_ob_init(void);
+
+LIBEXPORT void
+ia_ob_deinit(ia_ob *ia_ob);
+
+LIBEXPORT ia_err
+ia_ob_run(ia_ob *ia_ob,
+          const ia_ob_input *ob_input,
+          ia_ob_output *ob_output);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _IA_OB_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_p2p.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_p2p.h
new file mode 100644
index 000000000000..f504b690b0b2
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_p2p.h
@@ -0,0 +1,1979 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_p2p.h
+ * \brief Declares the public2private converter API interface.
+ */
+
+/*! \mainpage
+ *
+ *  Public2Private (P2P) is a component designed for converting algorithm-related parameters between the ISP algo API and the actual
+ *  register layouts what firmware expects in its terminals. In the context of P2P, ISP algo parameters are referred as public data
+ *  and the register layouts as private data.
+ *
+ *  P2P has three main responsibilities:
+ *   - Converting public data to private data (encoding parameters)
+ *   - Converting private data to public data (decoding statistics)
+ *   - Filling the actual terminal descriptors accordingly
+ *
+ *  \section deps Dependencies
+ *
+ *  P2P has dependencies to other repositories:
+ *   - \b include: contains include files that are common to all AIQ libraries
+ *   - \b ia_log: the log library used in all AIQ libraries
+ *   - \b ia_pal: contains the public parameter definitions
+ *   - \b vied-viedifw-ispfw: P2P uses the CSS functions related to accessing data inside terminals
+ *
+ *  \section supported_kernels Supported Platforms and Kernels
+ *
+ *  Supported platforms:
+ *   - BXT B0
+ *   - CNL A0
+ *   - CNL B0
+ *   - GLV A0
+ *
+ *  P2P implementation currently supports the following kernels from ISYS:
+ *   - INL
+ *   - BLC_GLOBAL
+ *   - BLC_SENSOR_TYPE_0
+ *   - BLC_SENSOR_TYPE_1
+ *   - BLC_SENSOR_TYPE_2
+ *   - PCLN
+ *   - LSC_SENSOR_TYPE_0
+ *   - LSC_SENSOR_TYPE_1
+ *   - LSC_SENSOR_TYPE_2
+ *   - 3A_STAT_AWB
+ *   - 3A_STAT_AF
+ *   - 3A_STAT_AE_CCM
+ *   - 3A_STAT_AE
+ *   - IDS
+ *   - 3A_STAT_PAF
+ *
+ *  P2P implementation currently supports the following kernels from VPREGDC:
+ *   - WBA_WBA
+ *   - RYNR_VCUD
+ *   - RYNR_BNLM
+ *   - DEMOSAIC_DEMOSAIC
+ *   - ACM_CCM
+ *   - ACM_ACM
+ *   - GTC_CSC_CDS
+ *   - GTC_GTM
+ *   - YUV1_IEFD
+ *   - YUV1_YDS (defaults)
+ *   - YUV1_TCC (defaults)
+ *   - DVS_YBIN
+ *   - DVS_DVS
+ *   - DVS_L0
+ *   - DVS_L1
+ *   - DVS_L2
+ *   - XNR4-MH
+ *   - XNR4-M
+ *   - XNR4_2_Video
+ *
+ *  P2P implementation currently supports the following kernels from VPREGDC_HQ_NS:
+ *   - WBA_WBA
+ *   - RYNR_VCUD
+ *   - RYNR_BNLM
+ *   - DEMOSAIC_DEMOSAIC
+ *   - ACM_CCM
+ *   - ACM_ACM
+ *   - GTC_CSC_CDS
+ *   - GTC_GTM
+ *   - YUV1_IEFD
+ *   - YUV1_YDS (defaults)
+ *   - YUV1_TCC (defaults)
+ *   - DVS_YBIN
+ *   - DVS_DVS
+ *   - DVS_L0
+ *   - DVS_L1
+ *   - DVS_L2
+ *   - EXY
+ *   - XNR42_Video
+ *
+ *  P2P implementation currently supports the following kernels from VPREGDC_HQ_NS_DVS:
+ *   - WBA_WBA
+ *   - RYNR_VCUD
+ *   - RYNR_BNLM
+ *   - DEMOSAIC_DEMOSAIC
+ *   - ACM_CCM
+ *   - ACM_ACM
+ *   - GTC_CSC_CDS
+ *   - GTC_GTM
+ *   - YUV1_IEFD
+ *   - YUV1_YDS (defaults)
+ *   - YUV1_TCC (defaults)
+ *   - DVS_YBIN
+ *   - DVS_DVS
+ *   - DVS_L0
+ *   - DVS_L1
+ *   - DVS_L2
+ *   - EXY
+ *   - XNR42_Video
+ *
+ *  P2P implementation currently supports the following kernels from VPREGDC_ISL_HQ_4K:
+ *   - INL
+ *   - BLC_GLOBAL
+ *   - BLC_SENSOR_TYPE_0
+ *   - BLC_SENSOR_TYPE_1
+ *   - BLC_SENSOR_TYPE_2
+ *   - PCLN
+ *   - LSC_SENSOR_TYPE_0
+ *   - LSC_SENSOR_TYPE_1
+ *   - LSC_SENSOR_TYPE_2
+ *   - 3A_STAT_AWB
+ *   - 3A_STAT_AF
+ *   - 3A_STAT_AE_CCM
+ *   - 3A_STAT_AE
+ *   - 3A_STAT_PAF
+ *   - WBA_WBA
+ *   - RYNR_VCUD
+ *   - RYNR_BNLM
+ *   - DEMOSAIC_DEMOSAIC
+ *   - ACM_CCM
+ *   - ACM_ACM
+ *   - GTC_CSC_CDS
+ *   - GTC_GTM
+ *   - YUV1_IEFD
+ *   - YUV1_YDS (defaults)
+ *   - YUV1_TCC (defaults)
+ *   - DVS_YBIN
+ *   - DVS_DVS
+ *   - DVS_L0
+ *   - DVS_L1
+ *   - DVS_L2
+ *   - XNR42_Video
+ *
+ *  P2P implementation currently supports the following kernels from VHDR_PREGDC_HP: // TODO: Update list.
+ *   - INL
+ *   - BLC_GLOBAL
+ *   - BLC_SENSOR_TYPE_0
+ *   - BLC_SENSOR_TYPE_1
+ *   - BLC_SENSOR_TYPE_2
+ *   - PCLN
+ *   - LSC_V1_0_SENSOR_TYPE_0
+ *   - LSC_V1_0_SENSOR_TYPE_1
+ *   - LSC_V1_0_SENSOR_TYPE_2
+ *   - DPC_1_0_1
+ *   - IDS_V2_1
+ *   - 3A_STAT_AWB
+ *   - 3A_STAT_AF
+ *   - 3A_STAT_AE_CCM
+ *   - 3A_STAT_AE
+ *   - BLC_SENSOR_TYPE_0
+ *   - BLC_SENSOR_TYPE_1
+ *   - BLC_SENSOR_TYPE_2
+ *   - LSC_V1_0_SENSOR_TYPE_0
+ *   - LSC_V1_0_SENSOR_TYPE_1
+ *   - LSC_V1_0_SENSOR_TYPE_2
+ *   - 3A_STAT_AWB
+ *   - 3A_STAT_AF
+ *   - OUTPUT_CROP
+ *   - HDR_STATS
+ *   - HDR_STATS_RGBY_OUT
+ *   - HDR_STATS_YDRC_OUT
+ *   - HDR_STATS_RGBS_OUT
+ *
+ *  P2P implementation currently supports the following kernels from VPOSTGDC:
+ *   - DVS_COORDS
+ *   - DVS_CONFIG
+ *   - OFS_OF
+ *   - OFS_SC0
+ *   - OFS_SC1
+ *   - OFS_ISP
+ *   - TNR5
+ *
+ *  P2P implementation currently supports the following kernels from VPOSTGDC_HQ_NS:
+ *   - DVS_COORDS
+ *   - DVS_CONFIG
+ *   - OFS_OF
+ *   - OFS_SC0
+ *   - OFS_SC1
+ *   - OFS_ISP
+ *   - TNR5_2_1
+ *
+ *  P2P implementation currently supports the following kernels from VPOSTGDC_HQ_NS_DVS2:
+ *   - DVS_COORDS
+ *   - DVS_CONFIG
+ *   - OFS_OF
+ *   - OFS_SC0
+ *   - OFS_SC1
+ *   - OFS_ISP
+ *   - TNR5_2_1
+ *
+ *  P2P implementation currently supports the following kernels from VPOSTGDC_HQ_NS_DVS3:
+ *   - DVS_COORDS
+ *   - DVS_CONFIG
+ *   - OFS_OF
+ *   - OFS_SC0
+ *   - OFS_SC1
+ *   - OFS_ISP
+ *   - TNR5_2_1
+ *
+ *  P2P implementation currently supports the following kernels from VPOSTGDC_HQ_4K: with DVS2
+ *   - DVS_COORDS
+ *   - DVS_CONFIG
+ *   - OFS_OF
+ *   - OFS_SC0
+ *   - OFS_SC1
+ *   - OFS_ISP
+ *   - TNR5_2_2
+ *
+ *  P2P implementation currently supports the following kernels from YUV_CSC:
+ *   - CSC_YUV2RGB
+ *
+ *  \section init Initialization and deinitialization
+ *
+ *  P2P must be initialized before its conversion functions can be used. Initialization happens during the camera start-up with ia_p2p_init().
+ *  This function returns a handle to the created P2P instance, required by the encoding and decoding functions. When cleaning up, P2P must be
+ *  deinitialized with ia_p2p_deinit().
+ *
+ *  The user has to allocate a cache buffer which is used during encoding and decoding to store parameters which are cached between frames.
+ *  The cache buffer is specific to a stream, so each stream must have its own cache buffer. The user takes care of giving the correct cache
+ *  buffer to P2P. The size of the cache buffer must be queried with ia_p2p_get_cache_buffer_size().
+ *
+ *  \section runtime Runtime use
+ *
+ *  The high-level execution flow during runtime is illustrated in Figure 1. On each frame, P2P expects to get public data from PAL. The user
+ *  is responsible for calling pal_run() to produce the public data as a binary data chunk and give this as an input to ia_p2p_parse() which
+ *  parses the data to a form that is more easily accessible by the encoding functions. ia_p2p_parse() also requires the pointer to the cache
+ *  buffer to use for encoding the cached data. After parsing the public data, the requirements for the terminals and the payload can be queried
+ *  from P2P in order to allocate memory for the payload and to create terminals.
+ *
+ *  \mscfile overview.signalling Figure 1. Using P2P at runtime.
+ *
+ *  After the terminals have been created, the encoding functions can be used to fill the terminals and their payload with private data.
+ *
+ *  \subsection runtime_terminal_creation Querying requirements and creating terminals
+ *
+ *  There are five different terminal types relevant to P2P: three input terminals and two output terminals.
+ *
+ *  Input terminals:
+ *      - <b>Parameter input terminal</b>: contains global kernel parameters
+ *      - <b>Program terminal</b>: contains program-specific information, i.e. information related to fragmentation and fragment-specific kernel parameters
+ *      - <b>Spatial parameter input terminal</b>: contains spatial kernel parameters, e.g. 2D lookup tables for LSC and GridBLC
+ *
+ *  Output terminals:
+ *      - <b>Parameter output terminal</b>: contains global statistics, e.g. histograms
+ *      - <b>Spatial parameter output terminal</b>: contains spatial statistics, e.g. RGBS grid
+ *
+ *  Parameter input terminal contains global parameters for all kernels, so only one parameter input terminal is required. The order of the sections
+ *  in the parameter input terminal usually comes from a FW terminal manifest except for ISYS which does not have a manifest.
+ *
+ *  Program terminal contains program-specific information, i.e. parameters which are not global but fragment-specific. The user can decide into how many
+ *  fragments the full frame is split. Only one program terminal is needed, and it contains fragment-specific parameters for all kernels and for each and every
+ *  fragment. The order of the sections in the program terminal is such that first comes all the sections of all kernels for the first fragment (similar to
+ *  parameter input terminal) and then for the second fragment and so on.
+ *
+ *  Spatial parameter input terminals are kernel-specific, so there is one for each kernel which requires spatial input parameters. The spatial parameter
+ *  input terminal contains lookup tables e.g. LSC table.
+ *
+ *  Parameter output terminal contains global statistics, such as the histograms. There is only one parameter output terminal which contains statistics
+ *  data for all kernels producing global statistics. Since the image might be fragmented, parameter output terminal contains the statistics for each
+ *  fragment individually. The order of the sections is such that first comes the statistics of all kernels for the first fragment, then for the second
+ *  fragment and so on.
+ *
+ *  Spatial parameter output terminal contains spatial statistics, such as the RGBS grid. There is one spatial parameter output terminal for each kernel
+ *  which produces spatial statistics and it contains only the data for that specific kernel.
+ *
+ *  Figure 2 illustrates the process of querying terminal and payload requirements and creating the terminals. The number of sections in the
+ *  terminals must be queried from P2P using ia_p2p_get_kernel_terminal_requirements(). Since this function returns the requirements for a single
+ *  kernel, the user is responsible for looping it over all kernels and accumulating the results to determine the total number of sections in the
+ *  parameter terminal and program terminal.
+ *
+ *  In order to calculate how much memory should be allocated for the actual payload, ia_p2p_get_kernel_payload_desc() is used. This function returns
+ *  the required payload size for a single kernel for each terminal type. The user must accumulate the payload sizes over all kernels to determine the
+ *  total amount of memory required for payload.
+ *
+ *  \mscfile terminal_creation.signalling Figure 2. Querying requirements and creating terminals.
+ *
+ *  After requirements for the terminals and the payload have been determined, memory should be allocated for the terminals and the payload.
+ *  Terminals are created using the functions provided by the firmware. As previously explained, only one parameter input terminal, one parameter
+ *  output terminal and one program terminal is needed, whereas there must be one spatial parameter input terminal for each kernel having spatial
+ *  input parameters. The same applies to spatial output terminals.
+ *
+ *  \subsection runtime_encoding Encoding
+ *
+ *  Figure 3 illustrates the encoding process. P2P expects that the user will keep track of the section index where to write the parameters for each
+ *  kernel. For each terminal, encoding is performed kernel by kernel in the order of increasing kernel identifier. The first kernel will write to section 0.
+ *  The results of ia_p2p_get_kernel_requirements() define how much to increment the section index counter between loop iterations. E.g., if the first
+ *  kernel requires 3 sections, the second kernel will be written to section index 3 and so on. The following pseudo code shows how the loop could look like
+ *  for the parameter input terminal in case of ISYS:
+ *
+ *  \code{.c}
+ *  unsigned int cur_section = 0;
+ *  unsigned int cur_offset = 0;
+ *
+ *  for (kernel = 0; kernel < N_IA_CSS_ISYS_KERNEL_ID; ++kernel)
+ *  {
+ *      ia_p2p_parameter_terminal_encode(ia_p2p, IA_P2P_PG_ISYS, kernel, terminal, cur_section, payload_buffer, cur_offset);
+ *
+ *      ia_p2p_get_kernel_terminal_requirements(ia_p2p, IA_P2P_PG_ISYS, kernel, &reqs); // These could be cached before the loop.
+ *      cur_section += reqs.parameter_section_count;
+ *
+ *      ia_p2p_get_kernel_payload_desc(ia_p2p, IA_P2P_PG_ISYS, kernel, fragment_count, &desc); // These could be cached before the loop.
+ *      cur_offset += desc.parameter_payload_size;
+ *  }
+ *  \endcode
+ *
+ *  \mscfile encoding.signalling 3. Encoding process.
+ *
+ *  Parameter terminal does not have any dependencies, so it can be encoded at any point of execution by looping through all kernel identifiers using
+ *  ia_p2p_param_in_terminal_encode(). Same is true for the parameter output terminal which is prepared using ia_p2p_param_out_terminal_prepare() at any time.
+ *  Preparation only fills in the payload offsets so that firmware knows where to write the statistics.
+ *
+ *  Program terminal encoding must be started with ia_p2p_program_terminal_init(). This is executed only once per frame. Then, ia_p2p_program_terminal_encode()
+ *  needs to be run for each kernel individually, just as was with ia_p2p_param_in_terminal_encode(). Program terminal encode needs the fragment descriptors,
+ *  which define which part of the full frame the fragment contains.
+ *
+ *  Spatial param terminals are encoded/prepared with ia_p2p_spatial_param_in_terminal_encode() / ia_p2p_spatial_param_out_terminal_prepare(). Each kernel has its
+ *  own spatial terminals, so the function is called only once per terminal for each kernel.
+ *
+ *  \subsection runtime_decoding_stats Decoding statistics
+ *
+ *  Figure 4 illustrates the decoding process for statistics. Decoding the parameter output terminal should be done with a similar loop as encoding the parameter
+ *  input terminal and keeping track of the current section index. ia_p2p_param_out_terminal_decode() is used to decode the global statistics. Spatial statistics are
+ *  decoded similarly with ia_p2p_spatial_param_out_terminal_decode() with the exception that every statistics block producing spatial statistics has its own spatial
+ *  param output terminal.
+ *
+ *  \mscfile decoding_stats.signalling 4. Decoding process for statistics.
+ *
+ *  After all statistics have been decoded, the statistics buffer can be requested from P2P by ia_p2p_serialize_statistics(). The returned ia_binary_data buffer is
+ *  owned by P2P and remains valid until ia_p2p_serialize_statistics() is called the next time. The user is responsible of copying the data from the ia_binary_data
+ *  structure to another location to preserve it over several frames.
+ *
+ *  \subsection runtime_decoding_inputs Decoding input parameters (only for debugging purposes)
+ *
+ *  P2P offers functions for decoding also the input parameters. This is meant only for debugging purposes and should not be used on a real device. Decoding input
+ *  parameters has strict requirements for the order of executing the decoding functions. It is mandatory to first decode the parameter terminal with
+ *  ia_p2p_param_in_terminal_encode() since the parameter terminal contains the information about which kernels have been enabled. This is needed to determine
+ *  how the other terminals are decoded. Before the program terminal can be decoded, the sequencer fragment grid descriptors for a specific kernel must be retrieved
+ *  from the spatial parameter input terminal using ia_p2p_spatial_param_in_terminal_decode_grid_descriptors(). After this step, ia_p2p_program_terminal_decode()
+ *  can be used to decode program-specific parameters. Finally, ia_p2p_spatial_param_in_terminal_decode() is used to decode the spatial input terminals.
+ *
+ *  \mscfile decoding.signalling 5. Decoding process for input parameters.
+ *
+ *  \page integration_guide Integration Guide
+ *
+ *  This page explains how to integrate P2P for each program group.
+ *
+ *  The following table summarizes the supported program groups in P2P:
+ *
+ *  SV = meaning supported for internal System Validation only (not released for driver)
+ *
+ *  Program Group             | P2P Constant                         | PG ID | Fragmentation Support | BXT B0 | CNL B0 | GLV A0 | IPU6 | IPU6S
+ *  ------------------------- | ------------------------------------ | ----- | --------------------- | ------ | ------ | ------ | ---- | ------
+ *  ISYS                      | IA_P2P_PG_ISYS                       | 0     | Yes                   | X      | X      | -      | -    | -
+ *  ISL PS HIRES              | IA_P2P_PG_ISL_PS_HIRES               | 127   | Yes                   | X      | -      | -      | -    | -
+ *  ISL PS INPUT CROP         | IA_P2P_PG_ISL_PS_INPUT_CROP          | 127   | Yes                   | -      | X      | -      | -    | -
+ *  ISL PS GLV VPLESS         | IA_P2P_PG_ISL_PS_GLV_VPLESS          | 166   | Yes                   | -      | -      | X      | -    | -
+ *  ISA LB GLV VPLESS         | IA_P2P_PG_ISA_LB_GLV_VPLESS          | 194   | Yes                   | -      | -      | X      | -    | -
+ *  Video PreGDC HQ           | IA_P2P_PG_VPREGDC_HQ                 | 122   | Yes                   | X      | X      | -      | -    | -
+ *  IPU5 Video PreGDC VPless  | IA_P2P_PG_IPU5_VPREGDC_VPLESS        | 167   | Yes                   | -      | -      | X      | -    | -
+ *  Still PreGDC              | IA_P2P_PG_SPREGDC                    | 117   | No                    | -      | -      | -      | -    | -
+ *  IPU5 Still PreGDC VPless  | IA_P2P_PG_IPU5_SPREGDC_VPLESS        | 168   | Yes                   | -      | -      | X      | -    | -
+ *  Still PreGDC XNR          | IA_P2P_PG_SPREGDC_XNR                | 125   | No                    | -      | -      | -      | -    | -
+ *  Still PreGDC XNR V2       | IA_P2P_PG_SPREGDC_XNR_V2             | 131   | Yes                   | X      | X      | -      | -    | -
+ *  Still PreGDC XNR V3       | IA_P2P_PG_SPREGDC_XNR_V3             | 136   | Yes                   | X      | X      | -      | -    | -
+ *  Still PostGDC             | IA_P2P_PG_SPOSTGDC                   | 118   | Yes                   | X      | X      | X      | -    | -
+ *  Still PostGDC IN8         | IA_P2P_PG_SPOSTGDC_IN8               | 152   | Yes                   |        |        | X      | -    | -
+ *  Still PostGDC V4          | IA_P2P_PG_SPOSTGDC_V4                | 161   | No                    |        |        | SV     | -    | -
+ *  Still PostGDC IN8 V4      | IA_P2P_PG_SPOSTGDC_IN8_V4            | 162   | Yes                   | -      | -      | X      | -    | -
+ *  Still PostGDC V4 10BIT    | IA_P2P_PG_IPU5_SPOSTGDC_V4_10BIT     | 197   | Yes                   | -      | -      | X      | -    | -
+ *  Video PostGDC V1          | IA_P2P_PG_IPU5_VPOSTGDC_V1           | 151   | No                    | -      | -      | X      | -    | -
+ *  Video PostGDC V4          | IA_P2P_PG_IPU5_VPOSTGDC_V4           | 169   | No                    | -      | -      | X      | -    | -
+ *  Video PostGDC V4 HDR10    | IA_P2P_PG_IPU5_VPOSTGDC_V4           | 193   | No                    | -      | -      | X      | -    | -
+ *  Video PostGDC V2          | IA_P2P_PG_VPOSTGDC_V2                | 129   | No                    | X      | X      | -      | -    | -
+ *  Video PostGDC V2 MBR      | IA_P2P_PG_VPOSTGDC_V2_MBR            | 172   | No                    | -      | X      | -      | -    | -
+ *  Still PostGDC V2 MBR      | IA_P2P_PG_SPOSTGDC_V2_MBR            | 173   | Yes                   | -      | X      | -      | -    | -
+ *  Video PostGDC MBR         | IA_P2P_PG_VPOSTGDC_MBR               | 132   | No                    | -      | X      | -      | -    | -
+ *  Still PostGDC MBR         | IA_P2P_PG_SPOSTGDC_MBR               | 133   | Yes                   | -      | X      | -      | -    | -
+ *  Video PreGDC HQ VCR2      | IA_P2P_PG_VPREGDC_HQ_VCR2            | 148   | Yes                   | -      | X      | -      | -    | -
+ *  Video ISL PreGDC HQ VCR2  | IA_P2P_PG_VIDEO_ISL_PREGDC_HQ_VCR2   | 156   | Yes                   | -      | X      | -      | -    | -
+ *  Still PreGDC XNR V2 VCR2  | IA_P2P_PG_SPREGDC_XNR_V2_VCR2        | 149   | Yes                   | -      | X      | -      | -    | -
+ *  Still PreGDC XNR V3 VCR2  | IA_P2P_PG_SPREGDC_XNR_V3_VCR2        | 150   | Yes                   | -      | X      | -      | -    | -
+ *  LB PSA Bypass             | IA_P2P_PG_IPU6_LB_PSA_BYPASS         | 182   | No                    | -      | -      | -      | X    | -
+ *  LB PSA                    | IA_P2P_PG_IPU6_LB_PSA                | 183   | No                    | -      | -      | -      | X    | -
+ *  ISL RBM                   | IA_P2P_PG_IPU6_ISL_RBM               | 185   | No                    | -      | -      | -      | X    | -
+ *  ISA combined LB PG        | IA_P2P_PG_IPU6_ISA_LB                | 187   | No                    | -      | -      | -      | X    | -
+ *  ISA PG                    | IA_P2P_PG_IPU6S_ISA                  | 198   | No                    | -      | -      | -      | -    | X
+ *  Video PreGDC HQ NS        | IA_P2P_PG_VPREGDC_HQ_NS              | 1000  | Yes                   | X      | -      | -      | -    | -
+ *  Video PostGDC HQ NS       | IA_P2P_PG_VPOSTGDC_HQ_NS             | 1001  | Yes                   | X      | -      | -      | -    | -
+ *  Video PreGDC HP           | IA_P2P_PG_VPREGDC_HP                 | 1002  | Yes                   | X      | -      | -      | -    | -
+ *  Video PostGDC HP          | IA_P2P_PG_VPOSTGDC_HP                | 1003  | Yes                   | X      | -      | -      | -    | -
+ *  Video PreGDC LL           | IA_P2P_PG_VPREGDC_LL                 | 1004  | Yes                   | X      | -      | -      | -    | -
+ *  VHDR PreProc V2           | IA_P2P_PG_VHDR_PREPROC_V2            | 1005  | Yes                   | X      | -      | -      | -    | -
+ *  Video PreGDC HQ NS DVS    | IA_P2P_PG_VPREGDC_HQ_NS_DVS          | 1007  | Yes                   | X      | -      | -      | -    | -
+ *  Video PostGDC HQ NS DVS2  | IA_P2P_PG_VPOSTGDC_HQ_NS_DVS2        | 1008  | Yes                   | X      | -      | -      | -    | -
+ *  Video PostGDC HQ NS DVS3  | IA_P2P_PG_VPOSTGDC_HQ_NS_DVS3        | 1009  | Yes                   | X      | -      | -      | -    | -
+ *  Video PreGDC HP 2FR       | IA_P2P_PG_VPREGDC_HP_2FR             | 1010  | Yes                   | X      | -      | -      | -    | -
+ *  Video PostGDC HQ 4K       | IA_P2P_PG_VPOSTGDC_HQ_4K             | 1011  | No                    | X      | -      | -      | -    | -
+ *  Video PreGDC ISL HQ 4K    | IA_P2P_PG_VPREGDC_ISL_HQ_4K          | 1012  | Yes                   | X      | -      | -      | -    | -
+ *  VHDR PreProc Stats HP     | IA_P2P_PG_VHDR_PREPROC_Stats hp      | 1013  | Yes                   | X      | -      | -      | -    | -
+ *  Video PreGDC HP DRC       | IA_P2P_PG_VPREGDC_HP_DRC             | 1014  | Yes                   | X      | -      | -      | -    | -
+ *  VHDR PreGDC HP            | IA_P2P_PG_VHDR_PREGDC_HP             | 1015  | Yes                   | X      | -      | -      | -    | -
+ *  YUYV SCALE                | IA_P2P_PG_YUYV_SCALE                 | 1051  | No                    | X      | -      | -      | -    | -
+ *  YUV_CSC                   | IA_P2P_PG_YUV_CSC                    | 1052  | No                    | X      | -      | -      | -    | -
+ *  YUYV_LDC                  | IA_P2P_PG_YUYV_LDC                   | 1053  | No                    | X      | -      | -      | -    | -
+ *
+ *  \section isys Input System Program Groups
+ *
+ *  Program groups involved
+ *   - ISYS
+ *   - ISL PS GLV
+ *   - ISL PS HIRES
+ *   - ISL PS INPUT CROP
+ *
+ *  ISYS is the only program group which does not have a terminal manifest to use. This is why all control logic for P2P integration must be done by calling P2P
+ *  encode functions in the increasing kernel id order defined in the IA_CSS_ISA_KERNEL_ID enumeration in FW code. This ordering holds true for both param in and
+ *  program terminals. Spatial terminals use individual kernel ids and they utilize the same numbering as the param in and program terminal kernel ids.
+ *
+ *  ISL PS GLV, ISL PS INPUT CROP and ISL PS HIRES program groups are similar to ISYS program group, but they are run on PSYS and are meant for multi-camera setups.
+ *  This also means that there is a manifest available. All encoding logic should follow the manifest to achieve correct section order.
+ *
+ *  One difference compared to the ISYS program group is also that the spatial terminals have different kernel ids than the param in and program terminal. A good
+ *  example of this is LSC: param in and program terminals use kernel id 7 for LSC sensor type 1, but the corresponding LSC spatial terminal is using kernel id 28.
+ *
+ *  Since P2P needs to support both ISYS and ISL PS program groups at the same time, P2P internally uses the common logic and this is why kernel requirements
+ *  and payload descriptors should not be calculated for spatial terminal kernel ids (kernel_id >= 24). The required payload is already calculated when calling
+ *  ia_p2p_get_kernel_terminal_requirements() and ia_p2p_get_kernel_payload_desc() functions for the non-spatial kernel ids (kernel_id < 24). This is not critical,
+ *  since the only downside of calling the functions is that too much memory is allocated, but should anyway be optimized.
+ *
+ * The following chapters list the required PAL records for each Input System program group.
+ *
+ *  \subsection ipu5_pre_gdc_pgs IPU5 Input System Program Group PALs
+ *
+
+ *  \subsubsection isl_ps_glv_vpless IA_P2P_PG_ISL_PS_GLV_VPLESS (PG id 166)
+ *
+ *   - ia_pal_uuid_isp_pixelformatter
+ *   - ia_pal_uuid_isp_bxt_norm_lin
+ *   - ia_pal_uuid_isp_bxt_gridbaseob
+ *   - ia_pal_uuid_isp_bxt_linearization
+ *   - ia_pal_uuid_isp_bxt_lsc
+ *   - ia_pal_uuid_isp_dpc_1_3
+ *   - ia_pal_uuid_isp_pafstatistics_1
+ *   - ia_pal_uuid_isp_lca_1_0
+ *   - ia_pal_uuid_isp_bxt_blc
+ *   - ia_pal_uuid_isp_bxt_disparity
+ *   - ia_pal_uuid_isp_bxt_applycorrection
+ *   - ia_pal_uuid_isp_bxt_awbstatistics
+ *   - ia_pal_uuid_isp_bxt_af_awb_fr_statistics
+ *   - ia_pal_uuid_isp_bxt_3a_ccm
+ *   - ia_pal_uuid_isp_bxt_aestatistics
+ *   - ia_pal_uuid_isp_bxt_pixprecadapter_precropstills
+ *   - ia_pal_uuid_isp_pxl_crop_bayer_a
+ *   - ia_pal_uuid_isp_padder_bayer_a
+ *   - ia_pal_uuid_isp_bxt_inputscalerv2
+ *   - ia_pal_uuid_isp_bxt_vcsc
+ *   - ia_pal_uuid_isp_bxt_pixprecadapter_precropvideo
+ *   - ia_pal_uuid_isp_pxl_crop_yuv_a
+ *   - ia_pal_uuid_isp_padder_yuv_a
+ *   - ia_pal_uuid_isp_crop_sis
+ *   - ia_pal_uuid_isp_wb_sis
+ *   - ia_pal_uuid_isp_sis_1
+ *   - ia_pal_uuid_isp_pixprecadapter_post_sis
+ *   - ia_pal_uuid_isp_pxl_crop_sis_a
+ *
+ *  \subsubsection isl_ps_dfm_lb_glv IA_P2P_PG_ISA_LB_GLV_VPLESS (PG id 194)
+ *
+ *   - ia_pal_uuid_isp_bxt_pixelformatter
+ *   - ia_pal_uuid_isp_bxt_norm_lin
+ *   - ia_pal_uuid_isp_bxt_gridbaseob
+ *   - ia_pal_uuid_isp_bxt_linearization
+ *   - ia_pal_uuid_isp_bxt_lsc
+ *   - ia_pal_uuid_isp_dpc_1_3
+ *   - ia_pal_uuid_isp_pafstatistics_1
+ *   - ia_pal_uuid_isp_lca_1_0
+ *   - ia_pal_uuid_isp_bxt_blc
+ *   - ia_pal_uuid_isp_bxt_disparity
+ *   - ia_pal_uuid_isp_bxt_applycorrection
+ *   - ia_pal_uuid_isp_bxt_awbstatistics
+ *   - ia_pal_uuid_isp_bxt_af_awb_fr_statistics
+ *   - ia_pal_uuid_isp_bxt_3a_ccm
+ *   - ia_pal_uuid_isp_bxt_aestatistics
+ *   - ia_pal_uuid_isp_bxt_pixprecadapter_precropstills
+ *   - ia_pal_uuid_isp_pxl_crop_bayer_a
+ *   - ia_pal_uuid_isp_padder_bayer_a
+ *   - ia_pal_uuid_isp_bxt_inputscalerv2
+ *   - ia_pal_uuid_isp_bxt_vcsc
+ *   - ia_pal_uuid_isp_bxt_pixprecadapter_precropvideo
+ *   - ia_pal_uuid_isp_pxl_crop_yuv_a
+ *   - ia_pal_uuid_isp_padder_yuv_a
+ *   - ia_pal_uuid_isp_crop_sis
+ *   - ia_pal_uuid_isp_wb_sis
+ *   - ia_pal_uuid_isp_sis_1
+ *   - ia_pal_uuid_isp_pixprecadapter_post_sis
+ *   - ia_pal_uuid_isp_pxl_crop_sis_a
+ *   - ia_pal_uuid_isp_bnlm_3_0
+ *   - ia_pal_uuid_isp_bxt_wb
+ *   - ia_pal_uuid_isp_b2i_dm_1_0
+ *   - ia_pal_uuid_isp_bxt_vcsc
+ *   - ia_pal_uuid_isp_gltm_1_0
+ *   - ia_pal_uuid_isp_xnr_5_1
+ *   - ia_pal_uuid_isp_bxt_vcr2
+ *   - ia_pal_uuid_isp_bxt_ccm
+ *   - ia_pal_uuid_isp_glim_1_0
+ *   - ia_pal_uuid_isp_bxt_acm
+ *   - ia_pal_uuid_isp_gammastar_1
+ *   - ia_pal_uuid_isp_gammatm_v3
+ *   - ia_pal_uuid_isp_bxt_csc
+ *   - ia_pal_uuid_isp_sc_iefd_v2
+ *   - ia_pal_uuid_isp_strm_crop_psa
+ *   - ia_pal_uuid_isp_espa_1_0
+ *   - ia_pal_uuid_isp_dvsstatistics_2
+ *
+ *  \section pregdc_pgs Pre-GDC Program Groups
+ *
+ *  Program groups involved
+ *   - Video PreGDC
+ *   - Video PreGDC HQ
+ *   - Video PreGDC HQ VCR2
+ *   - ISL Video PreGDC HQ VCR2
+ *   - Still PreGDC
+ *   - Still PreGDC XNR
+ *   - Still PreGDC XNR V2
+ *   - Still PreGDC XNR V3
+ *   - Still PreGDC XNR V2 VCR2
+ *   - Still PreGDC XNR V3 VCR2
+ *   - Video PreGDC HQ NS
+ *   - Video PreGDC HQ NS DVS
+ *   - Video PreGDC LL
+ *   - Video PreGDC HP
+ *   - Video PreGDC HP 2FR
+ *   - Video ISL PreGDC HQ 4K
+ *   - Video HDR PreGDC HP
+ *
+ *  All PreGDC program groups have a manifest which should be used when calling P2P encoding functionality. Because of the DMA packing feature,
+ *  the input and output fragment's "bits per elements" or "bpe" can be freely chosen by the driver. Hence the alignment requirements are different
+ *  between input and output fragments. For P2P to configure the output crop parameters, it should to know the fragment descriptor calculation logic
+ *  Hence P2P must be used to calculate the fragment descriptors for preGDC and driver would need to call the ia_p2p_calculate_pregdc_fragments()
+ *  for that purpose.
+ *
+ *  Because the input and output alignments can be different, p2p maintains an internal cache about the pixels to be cropped for each fragment.
+ *  The driver must call ia_p2p_calculate_pregdc_fragments() with input and output fragment bpe, frame width, fragment count and input and output
+ *  fragment descriptors. P2P will use the cached output crop pixel offsets for subsequent configuring of the output crop parameters.
+ *
+ *  To simplify the fragment descriptor calculations, P2P assumes the maximum number of fragments to be supported as 20.
+ *
+ * The following chapters list the required PAL records for each Pre-GDC program group.
+ *
+ *  \subsection ipu5_pre_gdc_pgs IPU5 Pre-GDC Program Group PALs
+ *
+ *  \subsubsection  vpregdc IA_P2P_PG_IPU5_VPREGDC_VPLESS (PG id 167)
+ *
+ *   - ia_pal_uuid_isp_bnlm_3_0
+ *   - ia_pal_uuid_isp_gltm_1_0
+ *   - ia_pal_uuid_isp_xnr_5_1
+ *   - ia_pal_uuid_isp_bxt_vcr2
+ *   - ia_pal_uuid_isp_bxt_ccm
+ *   - ia_pal_uuid_isp_glim_1_0
+ *   - ia_pal_uuid_isp_bxt_acm
+ *   - ia_pal_uuid_isp_gammastar_1
+ *   - ia_pal_uuid_isp_gammatm_v3
+ *   - ia_pal_uuid_isp_bxt_csc
+ *   - ia_pal_uuid_isp_sc_iefd_v2
+ *   - ia_pal_uuid_isp_strm_crop_psa
+ *   - ia_pal_uuid_isp_espa_1_0
+ *   - ia_pal_uuid_isp_dvsstatistics_2
+ *
+ *  \subsubsection  spregdc_vpless IA_P2P_PG_IPU5_SPREGDC_VPLESS (PG id 168)
+ *
+ *   - ia_pal_uuid_isp_bnlm_3_0
+ *   - ia_pal_uuid_isp_bxt_wb_stills
+ *   - ia_pal_uuid_isp_bxt_demosaic
+ *   - ia_pal_uuid_isp_bxt_rynr_splitter
+ *   - ia_pal_uuid_isp_bxt_rynr_collector
+ *   - ia_pal_uuid_isp_bxt_vcsc_stills
+ *   - ia_pal_uuid_isp_gltm_1_0
+ *   - ia_pal_uuid_isp_xnr_5_1
+ *   - ia_pal_uuid_isp_bxt_vcr2
+ *   - ia_pal_uuid_isp_bxt_ccm
+ *   - ia_pal_uuid_isp_glim_1_0
+ *   - ia_pal_uuid_isp_bxt_acm
+ *   - ia_pal_uuid_isp_gammastar_1
+ *   - ia_pal_uuid_isp_gammatm_v3
+ *   - ia_pal_uuid_isp_bxt_csc
+ *   - ia_pal_uuid_isp_sc_iefd_v2
+ *   - ia_pal_uuid_isp_strm_crop_psa
+ *   - ia_pal_uuid_isp_espa_1_0
+ *
+ *  \subsection ipu4p_pre_gdc_pgs IPU4P Pre-GDC Program Group PALs
+ *
+ *  \subsubsection  vpregdc_hq_kernels IA_P2P_PG_VPREGDC_HQ (PG id 122)
+ *
+ *   - ia_pal_uuid_isp_bxt_wb
+ *   - ia_pal_uuid_isp_bxt_rynr_splitter
+ *   - ia_pal_uuid_isp_bxt_rynr_collector,
+ *   - ia_pal_uuid_isp_bxt_ccm,
+ *   - ia_pal_uuid_isp_bxt_acm
+ *   - ia_pal_uuid_isp_bxt_demosaic
+ *   - ia_pal_uuid_isp_bxt_gammatm
+ *   - ia_pal_uuid_isp_bxt_csc
+ *   - ia_pal_uuid_isp_bxt_csc2
+ *   - ia_pal_uuid_isp_bxt_vcud
+ *   - ia_pal_uuid_isp_sc_iefd_v2
+ *   - ia_pal_uuid_isp_bxt_vcr2
+ *   - ia_pal_uuid_isp_bxt_bnlm
+ *   - ia_pal_uuid_isp_bxt_xnr4_m
+ *   - ia_pal_uuid_isp_bxt_dvsstatistics
+ *
+ *  \subsubsection  vpregdc_hq_vcr2_kernels IA_P2P_PG_VPREGDC_HQ_VCR2 (PG id 148)
+ *
+ *   - ia_pal_uuid_isp_bxt_wb
+ *   - ia_pal_uuid_isp_bxt_rynr_splitter
+ *   - ia_pal_uuid_isp_bxt_rynr_collector,
+ *   - ia_pal_uuid_isp_bxt_ccm,
+ *   - ia_pal_uuid_isp_bxt_acm
+ *   - ia_pal_uuid_isp_bxt_demosaic
+ *   - ia_pal_uuid_isp_bxt_gammatm
+ *   - ia_pal_uuid_isp_bxt_csc
+ *   - ia_pal_uuid_isp_bxt_csc2
+ *   - ia_pal_uuid_isp_bxt_vcud
+ *   - ia_pal_uuid_isp_sc_iefd_v2
+ *   - ia_pal_uuid_isp_bxt_vcr2
+ *   - ia_pal_uuid_isp_bxt_bnlm
+ *   - ia_pal_uuid_isp_bxt_xnr4_m
+ *   - ia_pal_uuid_isp_bxt_dvsstatistics
+ *
+ *  \subsubsection  video_isl_pregdc_hq_vcr2_kernels IA_P2P_PG_VIDEO_ISL_PREGDC_HQ_VCR2 (PG id 156)
+ *
+ *   - ia_pal_uuid_isp_bxt_norm_lin
+ *   - ia_pal_uuid_isp_bxt_blc
+ *   - ia_pal_uuid_isp_bxt_gridbaseob
+ *   - ia_pal_uuid_isp_bxt_linearization
+ *   - ia_pal_uuid_isp_bxt_lsc
+ *   - ia_pal_uuid_isp_bxt_applycorrection
+ *   - ia_pal_uuid_isp_bxt_disparity
+ *   - ia_pal_uuid_isp_dpc_1_1
+ *   - ia_pal_uuid_isp_bxt_awbstatistics
+ *   - ia_pal_uuid_isp_bxt_af_awb_fr_statistics
+ *   - ia_pal_uuid_isp_bxt_3a_ccm
+ *   - ia_pal_uuid_isp_bxt_aestatistics
+ *   - ia_pal_uuid_isp_bxt_wb
+ *   - ia_pal_uuid_isp_bxt_rynr_splitter
+ *   - ia_pal_uuid_isp_bxt_rynr_collector
+ *   - ia_pal_uuid_isp_bxt_ccm
+ *   - ia_pal_uuid_isp_bxt_acm
+ *   - ia_pal_uuid_isp_bxt_demosaic
+ *   - ia_pal_uuid_isp_bxt_gammatm
+ *   - ia_pal_uuid_isp_bxt_csc
+ *   - ia_pal_uuid_isp_bxt_csc2
+ *   - ia_pal_uuid_isp_sc_iefd_v2
+ *   - ia_pal_uuid_isp_bxt_bnlm
+ *   - ia_pal_uuid_isp_bxt_xnr4_mh
+ *   - ia_pal_uuid_isp_bxt_dvsstatistics
+ *
+ *  \subsubsection  spregdc_xnr_v2_kernels IA_P2P_PG_SPREGDC_XNR_V2 (PG id 131)
+ *   - ia_pal_uuid_isp_bxt_wb
+ *   - ia_pal_uuid_isp_bxt_rynr_splitter
+ *   - ia_pal_uuid_isp_bxt_rynr_collector
+ *   - ia_pal_uuid_isp_bxt_ccm
+ *   - ia_pal_uuid_isp_bxt_acm
+ *   - ia_pal_uuid_isp_bxt_demosaic
+ *   - ia_pal_uuid_isp_bxt_gammatm
+ *   - ia_pal_uuid_isp_bxt_csc
+ *   - ia_pal_uuid_isp_bxt_csc2
+ *   - ia_pal_uuid_isp_sc_iefd_v2
+ *   - ia_pal_uuid_isp_bxt_vcr2
+ *   - ia_pal_uuid_isp_bxt_bnlm
+ *   - ia_pal_uuid_isp_bxt_xnr4_mh
+ *   - ia_pal_uuid_isp_bxt_dvsstatistics
+ *
+ *  \subsubsection  spregdc_xnr_v2_kernels IA_P2P_PG_SPREGDC_XNR_V2_VCR2 (PG id 149)
+ *
+ *   - ia_pal_uuid_isp_bxt_wb
+ *   - ia_pal_uuid_isp_bxt_rynr_splitter
+ *   - ia_pal_uuid_isp_bxt_rynr_collector
+ *   - ia_pal_uuid_isp_bxt_ccm
+ *   - ia_pal_uuid_isp_bxt_acm
+ *   - ia_pal_uuid_isp_bxt_demosaic
+ *   - ia_pal_uuid_isp_bxt_gammatm
+ *   - ia_pal_uuid_isp_bxt_csc
+ *   - ia_pal_uuid_isp_bxt_csc2
+ *   - ia_pal_uuid_isp_sc_iefd_v2
+ *   - ia_pal_uuid_isp_bxt_vcr2
+ *   - ia_pal_uuid_isp_bxt_bnlm
+ *   - ia_pal_uuid_isp_bxt_xnr4_mh
+ *   - ia_pal_uuid_isp_bxt_dvsstatistics
+ *
+ *  \subsubsection  vpregdc_hq_ns_dvs_kernels IA_P2P_PG_VPREGDC_HQ_NS_DVS (PG id 1007)
+ *
+ *   - ia_pal_uuid_isp_bxt_wb
+ *   - ia_pal_uuid_isp_bxt_rynr_splitter
+ *   - ia_pal_uuid_isp_bxt_rynr_collector
+ *   - ia_pal_uuid_isp_bxt_bnlm
+ *   - ia_pal_uuid_isp_bxt_vcud
+ *   - ia_pal_uuid_isp_bxt_demosaic
+ *   - ia_pal_uuid_isp_bxt_ccm
+ *   - ia_pal_uuid_isp_bxt_acm
+ *   - ia_pal_uuid_isp_bxt_csc
+ *   - ia_pal_uuid_isp_bxt_gammatm
+ *   - ia_pal_uuid_isp_sc_iefd
+ *   - ia_pal_uuid_isp_exy
+ *   - ia_pal_uuid_isp_bxt_csc2
+ *   - ia_pal_uuid_isp_bxt_xnr_dss
+ *   - ia_pal_uuid_isp_exy
+ *   - ia_pal_uuid_isp_bxt_dvsstatistics
+ *
+ *  \section postgdc_pgs Post-GDC Program Groups
+ *
+ *  Program groups involved
+ *   - Video PostGDC
+ *   - Video PostGDC V2
+ *   - Video PostGDC V2 MBR
+ *   - Still PostGDC
+ *   - Still PostGDC V2
+ *   - Still PostGDC V2 MBR
+ *   - Video PostGDC MBR
+ *   - Still PostGDC MBR
+ *   - Video PostGDC HQ NS
+ *   - Video PostGDC HQ NS DVS2
+ *   - Video PostGDC HQ NS DVS3
+ *   - Video PostGDC HQ 4K
+ *   - Video PostGDC HP
+ *   - YUYV Scale
+ *   - YUYV LDC
+ *
+ *  Both PostGDC program groups have a manifest which should be used when calling P2P encoding functionality. The driver should call ia_p2p_calculate_postgdc_fragments()
+ *  to calculate proper fragmentation for PostGDC. This function can be used even when there is no fragmentation, i.e. the fragment count is 1. This way the integration
+ *  can be done in the same way for both unfragmented and fragmented use cases.
+ *
+ *  The function ia_p2p_calculate_postgdc_fragments() calculates multiple fragment descriptors. Some of this data needs to be used when configuring the data terminals.
+ *  The following table describes how to configure each data terminal in the program group:
+ *
+ *  Terminal                     | Fragment Descriptors
+ *  ---------------------------- | ---------------------------------------------------------------------------------------------------------------
+ *  Data input terminal          | Configure always to full frame
+ *  Data output terminal (pin 0) | Use output_pixel_fragment_descs_display_pin descriptors calculated by ia_p2p_calculate_postgdc_fragments()
+ *  Data output terminal (pin 1) | Use output_pixel_fragment_descs_main_pin descriptors calculated by ia_p2p_calculate_postgdc_fragments()
+ *  Data output terminal (pin 2) | Use output_pixel_fragment_descs_postprocess_pin descriptors calculated by ia_p2p_calculate_postgdc_fragments()
+ *
+ *  The input_pixel_fragment_descs descriptors returned by ia_p2p_calculate_postgdc_fragments() must be given as input to the P2P encoding functions.
+ *
+ * The following chapters list the required PAL records for each Post-GDC program group.
+ *
+ *  \subsection ipu5_post_gdc_pgs IPU5 Post-GDC Program Group PALs
+ *
+ *  \subsubsection vpostgdc IA_P2P_PG_IPU5_VPOSTGDC_V4 (PG ID 169)
+ *
+ *   - ia_pal_uuid_isp_gdc4_2
+ *   - ia_pal_uuid_isp_ofa_1
+ *   - ia_pal_uuid_isp_dma_cropper_mp
+ *   - ia_pal_uuid_isp_sc_outputscaler_dp
+ *   - ia_pal_uuid_isp_dma_cropper_dp
+ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
+ *   - ia_pal_uuid_isp_dma_cropper_ppp
+ *   - ia_pal_uuid_isp_tnr5_3
+ *
+ *  \subsubsection vpostgdc IA_P2P_PG_IPU5_VPOSTGDC_V4_10BIT (PG ID 193)
+ *
+ *   - ia_pal_uuid_isp_gdc4_2
+ *   - ia_pal_uuid_isp_ofa_1
+ *   - ia_pal_uuid_isp_dma_cropper_mp
+ *   - ia_pal_uuid_isp_sc_outputscaler_dp
+ *   - ia_pal_uuid_isp_dma_cropper_dp
+ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
+ *   - ia_pal_uuid_isp_dma_cropper_ppp
+ *   - ia_pal_uuid_isp_tnr5_3_1
+ *
+ *  \subsubsection spostgdc_v4 IA_P2P_PG_SPOSTGDC_V4 (PG id 161)
+ *
+ *   - ia_pal_uuid_isp_gdc4_2
+ *   - ia_pal_uuid_isp_ofa_1
+ *   - ia_pal_uuid_isp_dma_cropper_mp
+ *   - ia_pal_uuid_isp_sc_outputscaler_dp
+ *   - ia_pal_uuid_isp_dma_cropper_dp
+ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
+ *   - ia_pal_uuid_isp_dma_cropper_ppp
+ *
+ *  \subsubsection spostgdc_in8_v4 IA_P2P_PG_SPOSTGDC_IN8_V4 (PG id 162)
+ *
+ *   - ia_pal_uuid_isp_gdc4_2
+ *   - ia_pal_uuid_isp_ofa_1
+ *   - ia_pal_uuid_isp_dma_cropper_mp
+ *   - ia_pal_uuid_isp_sc_outputscaler_dp
+ *   - ia_pal_uuid_isp_dma_cropper_dp
+ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
+ *   - ia_pal_uuid_isp_dma_cropper_ppp
+ *
+ *  \subsubsection spostgdc_v4_10bit IA_P2P_PG_IPU5_SPOSTGDC_V4_10BIT (PG id 197)
+ *
+ *   - ia_pal_uuid_isp_gdc4_2
+ *   - ia_pal_uuid_isp_ofa_1
+ *
+ *  \subsection ipu4p_post_gdc_pgs IPU4P Post-GDC Program Group PALs
+ *
+ *  \subsubsection vpostgdc_dvs2 IA_P2P_PG_VPOSTGDC_HQ_NS_DVS2 (PG id 1008)
+ *
+ *   - ia_pal_uuid_isp_gdc3_1
+ *   - ia_pal_uuid_isp_ofa_1
+ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
+ *   - ia_pal_uuid_isp_sc_outputscaler_dp
+ *   - ia_pal_uuid_isp_dma_cropper_ppp
+ *   - ia_pal_uuid_isp_dma_cropper_mp
+ *   - ia_pal_uuid_isp_dma_cropper_dp
+ *   - ia_pal_uuid_isp_tnr5_21
+ *
+ *  \subsubsection vpostgdc_dvs3 IA_P2P_PG_VPOSTGDC_HQ_NS_DVS3 (PG id 1009)
+ *
+ *   - ia_pal_uuid_isp_gdc3_1
+ *   - ia_pal_uuid_isp_ofa_1
+ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
+ *   - ia_pal_uuid_isp_sc_outputscaler_dp
+ *   - ia_pal_uuid_isp_dma_cropper_ppp
+ *   - ia_pal_uuid_isp_dma_cropper_mp
+ *   - ia_pal_uuid_isp_dma_cropper_dp
+ *   - ia_pal_uuid_isp_tnr5_21
+ *
+ *  \subsubsection vpostgdc_4K IA_P2P_PG_VPOSTGDC_HQ_4K (PG id 1011)
+ *
+ *   - ia_pal_uuid_isp_gdc3_1
+ *   - ia_pal_uuid_isp_ofa_1
+ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
+ *   - ia_pal_uuid_isp_sc_outputscaler_dp
+ *   - ia_pal_uuid_isp_dma_cropper_ppp
+ *   - ia_pal_uuid_isp_dma_cropper_mp
+ *   - ia_pal_uuid_isp_dma_cropper_dp
+ *   - ia_pal_uuid_isp_tnr5_22
+ *
+ *  \subsubsection vpostgdc IA_P2P_PG_VPOSTGDC_V2_MBR (PG id 172)
+ *
+ *   - ia_pal_uuid_isp_gdc3_1
+ *   - ia_pal_uuid_isp_ofa_1
+ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
+ *   - ia_pal_uuid_isp_sc_outputscaler_dp
+ *   - ia_pal_uuid_isp_dma_cropper_ppp
+ *   - ia_pal_uuid_isp_dma_cropper_mp
+ *   - ia_pal_uuid_isp_dma_cropper_dp
+ *   - ia_pal_uuid_isp_bxt_tnr5v1
+ *
+ *  \subsection IPU6 PGs
+ *
+ *  \subsubsection LB PSA Bypass PG IA_P2P_PG_IPU6_LB_PSA_BYPASS (PG id 182)
+ *
+ *   - ia_pal_uuid_isp_bnlm_3_0
+ *   - ia_pal_uuid_isp_bxt_ccm
+ *   - ia_pal_uuid_isp_bxt_acm
+ *   - ia_pal_uuid_isp_bxt_vcr2
+ *   - ia_pal_uuid_isp_gammastar_1
+ *   - ia_pal_uuid_isp_bxt_csc
+ *   - ia_pal_uuid_isp_gammatm_v3
+ *   - ia_pal_uuid_isp_yuv_splitter
+ *   - ia_pal_uuid_isp_sc_iefd_v2
+ *   - ia_pal_uuid_isp_gltm_1_0
+ *   - ia_pal_uuid_isp_xnr_5_1
+ *   - ia_pal_uuid_isp_espa_1_0
+ *   - ia_pal_uuid_isp_xnr_5_1
+ *   - ia_pal_uuid_isp_espa_1_0
+ *   - ia_pal_uuid_isp_glim_1_0
+ *
+ *  \subsubsection LB PSA Bypass PG IA_P2P_PG_IPU6_LB (PG id 183)
+ *
+ *   - ia_pal_uuid_isp_bnlm_3_0
+ *   - ia_pal_uuid_isp_bxt_demosaic
+ *   - ia_pal_uuid_isp_bxt_vcsc
+ *   - ia_pal_uuid_isp_bxt_ccm
+ *   - ia_pal_uuid_isp_bxt_acm
+ *   - ia_pal_uuid_isp_bxt_vcr2
+ *   - ia_pal_uuid_isp_gammastar_1
+ *   - ia_pal_uuid_isp_bxt_csc
+ *   - ia_pal_uuid_isp_gammatm_v3
+ *   - ia_pal_uuid_isp_yuv_splitter
+ *   - ia_pal_uuid_isp_sc_iefd_v2
+ *   - ia_pal_uuid_isp_gltm_1_0
+ *   - ia_pal_uuid_isp_xnr_5_1
+ *   - ia_pal_uuid_isp_espa_1_0
+ *   - ia_pal_uuid_isp_xnr_5_1
+ *   - ia_pal_uuid_isp_espa_1_0
+ *   - ia_pal_uuid_isp_glim_1_0
+ *
+ *  \subsubsection LB ISA RBM PG IA_P2P_PG_IPU6_ISL_RBM (PG id 185)
+ *
+ *   - ia_pal_uuid_isp_bxt_pixelformatter
+ *   - ia_pal_uuid_isp_bxt_norm_lin
+ *   - ia_pal_uuid_isp_bxt_blc
+ *   - ia_pal_uuid_isp_bxt_gridbaseob
+ *   - ia_pal_uuid_isp_linearization2_0
+ *   - ia_pal_uuid_isp_lsc_1_1
+ *   - ia_pal_uuid_isp_dpc_2_0
+ *   - ia_pal_uuid_isp_bxt_disparity
+ *   - ia_pal_uuid_isp_bxt_applycorrection
+ *   - ia_pal_uuid_isp_af_awb_frstatistics_2_0
+ *   - ia_pal_uuid_isp_awbstatistics_2_0
+ *   - ia_pal_uuid_isp_ccm_3a_2_0
+ *   - ia_pal_uuid_isp_aestatistics_2_0
+ *   - ia_pal_uuid_isp_bxt_wb
+ *   - ia_pal_uuid_isp_lca_1_0
+ *   - ia_pal_uuid_isp_strm_crop_sis_a
+ *   - ia_pal_uuid_isp_sis_1_0_a
+ *   - ia_pal_uuid_isp_espa_sis_a
+ *   - ia_pal_uuid_isp_pxl_crop_sis_a
+ *   - ia_pal_uuid_isp_strm_crop_sis_b
+ *   - ia_pal_uuid_isp_sis_1_0_b
+ *   - ia_pal_uuid_isp_espa_sis_b
+ *   - ia_pal_uuid_isp_pxl_crop_sis_b
+ *   - ia_pal_uuid_isp_espa_bayer_a
+ *   - ia_pal_uuid_isp_padder_bayer_a
+ *   - ia_pal_uuid_isp_pxl_crop_bayer_a
+ *   - ia_pal_uuid_isp_b2i_bnr_1_0
+ *   - ia_pal_uuid_isp_b2i_dm_1_0
+ *   - ia_pal_uuid_isp_b2i_sie_1_0
+ *   - ia_pal_uuid_isp_b2i_ds_1_0_0
+ *   - ia_pal_uuid_isp_espa_yuv_a
+ *   - ia_pal_uuid_isp_padder_yuv_a
+ *   - ia_pal_uuid_isp_pxl_crop_yuv_a
+ *   - ia_pal_uuid_isp_b2i_ds_1_0_1
+ *   - ia_pal_uuid_isp_espa_yuv_b
+ *   - ia_pal_uuid_isp_padder_yuv_b
+ *   - ia_pal_uuid_isp_pxl_crop_yuv_b
+ *   - ia_pal_uuid_isp_espa_yuv_c
+ *   - ia_pal_uuid_isp_padder_yuv_c
+ *   - ia_pal_uuid_isp_pxl_crop_yuv_c
+ *
+ *  \subsubsection IPU6 combined ISA PG IA_P2P_PG_IPU6_ISA_LB (PG id 187)
+ *   - ia_pal_uuid_espa_isa_sis_a
+ *   - ia_pal_uuid_espa_isa_sis_b
+ *   - ia_pal_uuid_ycbcrcombine
+ *   - ia_pal_uuid_pxl_crop_sis_a
+ *   - ia_pal_uuid_linearization2_0
+ *   - ia_pal_uuid_pxl_crop_sis_b
+ *   - ia_pal_uuid_pixelformatter
+ *   - ia_pal_uuid_dpc_2_0
+ *   - ia_pal_uuid_packer_isa_yuv_b
+ *   - ia_pal_uuid_bxt_acm
+ *   - ia_pal_uuid_espa_isa_bayer_a
+ *   - ia_pal_uuid_awbstatistics_2_0
+ *   - ia_pal_uuid_pxl_crop_yuv_c
+ *   - ia_pal_uuid_strm_crop_psa_c
+ *   - ia_pal_uuid_strm_crop_psa_d
+ *   - ia_pal_uuid_strm_crop_psa_e
+ *   - ia_pal_uuid_strm_crop_psa_f
+ *   - ia_pal_uuid_pxl_crop_yuv_b
+ *   - ia_pal_uuid_strm_crop_psa_h
+ *   - ia_pal_uuid_b2i_dm_1_0
+ *   - ia_pal_uuid_pxl_crop_yuv_a
+ *   - ia_pal_uuid_sve_1_0
+ *   - ia_pal_uuid_espa_isa_yuv_c
+ *   - ia_pal_uuid_espa_isa_yuv_b
+ *   - ia_pal_uuid_espa_isa_yuv_a
+ *   - ia_pal_uuid_linearization2_0_c
+ *   - ia_pal_uuid_linearization2_0_b
+ *   - ia_pal_uuid_bxt_vcsc_stills
+ *   - ia_pal_uuid_sis_1_0_b
+ *   - ia_pal_uuid_lsc_1_1
+ *   - ia_pal_uuid_espa_psa_e
+ *   - ia_pal_uuid_sis_1_0_a
+ *   - ia_pal_uuid_espa_psa_c
+ *   - ia_pal_uuid_pix_crop_ir_md
+ *   - ia_pal_uuid_espa_psa_h
+ *   - ia_pal_uuid_bxt_vcr2
+ *   - ia_pal_uuid_bxt_gridbaseob
+ *   - ia_pal_uuid_xnr_5_2
+ *   - ia_pal_uuid_bxt_norm_lin_c
+ *   - ia_pal_uuid_bxt_blc_b
+ *   - ia_pal_uuid_bxt_csc
+ *   - ia_pal_uuid_padder_yuv_a
+ *   - ia_pal_uuid_padder_yuv_b
+ *   - ia_pal_uuid_padder_yuv_c
+ *   - ia_pal_uuid_ccm_3a_2_0
+ *   - ia_pal_uuid_bxt_blc_c
+ *   - ia_pal_uuid_espa_psa_4
+ *   - ia_pal_uuid_x2i_md_1_0
+ *   - ia_pal_uuid_espa_psa_1
+ *   - ia_pal_uuid_b2i_sie_1_0
+ *   - ia_pal_uuid_bxt_applycorrection
+ *   - ia_pal_uuid_packer_isa_yuv_c
+ *   - ia_pal_uuid_padder_bayer_a
+ *   - ia_pal_uuid_packer_isa_yuv_a
+ *   - ia_pal_uuid_pxl_crop_bayer_a
+ *   - ia_pal_uuid_dvsstatistics_2
+ *   - ia_pal_uuid_sc_iefd_v2
+ *   - ia_pal_uuid_packer_isa_bayer_a
+ *   - ia_pal_uuid_b2i_bnr_1_0
+ *   - ia_pal_uuid_af_awb_frstatistics_2_0
+ *   - ia_pal_uuid_rgb_ir_2_0
+ *   - ia_pal_uuid_glim_1_0
+ *   - ia_pal_uuid_strm_crop_sis_b
+ *   - ia_pal_uuid_strm_crop_sis_a
+ *   - ia_pal_uuid_espa_isa_wb
+ *   - ia_pal_uuid_bxt_blc
+ *   - ia_pal_uuid_bxt_gridbaseob_b
+ *   - ia_pal_uuid_bxt_gridbaseob_c
+ *   - ia_pal_uuid_espa_psa_f
+ *   - ia_pal_uuid_bxt_norm_lin
+ *   - ia_pal_uuid_bxt_norm_lin_b
+ *   - ia_pal_uuid_gltm_1_0
+ *   - ia_pal_uuid_pixelformatter_c
+ *   - ia_pal_uuid_pixelformatter_b
+ *   - ia_pal_uuid_bxt_ccm
+ *   - ia_pal_uuid_vertical_padding_1_0
+ *   - ia_pal_uuid_b2i_ds_1_0_1
+ *   - ia_pal_uuid_b2i_ds_1_0_0
+ *   - ia_pal_uuid_espa_psa_d
+ *   - ia_pal_uuid_pafstatistics_1
+ *   - ia_pal_uuid_strm_crop_psa_g
+ *   - ia_pal_uuid_bxt_demosaic
+ *   - ia_pal_uuid_lca_1_0
+ *   - ia_pal_uuid_bxt_disparity
+ *   - ia_pal_uuid_gammastar_1
+ *   - ia_pal_uuid_espa_psa_g
+ *   - ia_pal_uuid_dol_1_0
+ *   - ia_pal_uuid_aestatistics_2_0
+ *   - ia_pal_uuid_espa_isa_ir_md
+ *   - ia_pal_uuid_gammatm_v3
+ *   - ia_pal_uuid_bnlm_3_0
+ *   - ia_pal_uuid_bxt_wb
+ *
+ *  \page debugging Debugging
+ *
+ *  This page explains how P2P can be debugged. There are three ways to debug P2P operation.
+ *
+ *  \section simulator P2P simulator
+ *
+ *  P2P simulator (also known as PG dump utility), which originally was done for FW validation purposes, is a test case which can be used to run whole P2P encoding cycle
+ *  for a program group based on a PAL output binary. The simulator takes the PAL output binary as an input and produces terminal payload dumps as an output. By attaching
+ *  a debugger, the whole P2P encoding can be debugged. This is useful for checking if the input parameters valid and encoded correctly. Since the P2P simulator can only
+ *  run encoding, it is not suitable for debugging statistics related issues.
+ *
+ *  All test case files needed by the P2P simulator can be found under <i>validation</i> folder. File <i>dumpgen.test</i> is the main test case file for running the dump
+ *  generation. In addition to the generator, the simulator needs to know which program group to run (defined by a .pg file) and what kind of fragmentation scheme to run
+ *  (defined by a .frag file). The simulator produces two files for each terminal: terminal descriptor and terminal payload. There can be directly used by FW for validation
+ *  purposes.
+ *
+ *  The generic syntax of running the P2P simulator is as follows:
+ *
+ *  \code
+ *  bin/testframework -D Validate=<boolean> -D OutputDir=<string> -D FrameWidth=<int> -D FrameHeight=<int> -D FragmentCount=<int> -D PalDataFile=<string> <Frag_file> <Pg_file> validation/dumpgen.test GenerateDump
+ *  \endcode
+ *
+ *  Parameters:
+ *  - <b>Validate</b>: Defines whether PAL output binary values will be validated or not. Possible values:
+ *      - <i>true</i>: P2P validates all PAL output binary values and stops if there is even a single invalid value. No P2P dumps are produced in case that the validation fails.
+ *      - <i>false</i>: Validation is skipped and the P2P dumps are produced always. If there is invalid values, it might lead to a crash in the worst case.
+ *  - <b>OutputDir</b>: Specifies the folder where the P2P dumps are written.
+ *  - <b>FrameWidth</b>: Defines the full input frame width. Only needed when using single.frag for fragmentation.
+ *  - <b>FrameHeight</b>: Defines the full input frame height. Only needed when using single.frag for fragmentation.
+ *  - <b>FragmentCount</b>: Defines the number of fragments to use. Only needed when using postgdc_auto.frag for fragmentation.
+ *  - <b>PalDataFile</b>: Specifies the location of the PAL output binary to use as the input.
+ *  - <b>Frag_file</b>: The file which defines the fragmentation scheme (.frag file). Currently, there are two possible schemes:
+ *      - <i>validation/single.frag</i>: Runs a single fragment which covers the full frame. Uses FrameWidth and FrameHeight parameters.
+ *      - <i>validation/postgdc_auto.frag</i>: Runs automatic fragmentation calculation for postgdc. Uses FragmentCount parameter to define into how many fragments the full frame is split.
+ *      - <i>validation/auto.fraq</i>: Runs automatic fragment calculation for all program groups. THIS SHOULD BE USED in all PGs for IPU5.5.
+ *  - <b>Pg_file</b>: The file which defines which program group to run (.pg file).
+ *  - <b>ShowVersion</b>: Displays simulator version in output log. The version number is generated for pre-compiled binaries.
+ *
+ *  Example use for vpregdc using one fragment and resolution 2048x1536:
+ *  \code
+ *  bin/testframework -D Validate=true -D OutputDir=p2p_output -D FrameWidth=2048 -D FrameHeight=1536 -D PalDataFile=PAL.bin validation/single.frag validation/vpregdc.pg validation/dumpgen.test GenerateDump
+ *  \endcode
+ *
+ *  Example use for spostgdc using automatic fragmentation:
+ *  \code
+ *  bin/testframework -D Validate=true -D OutputDir=p2p_output -D FragmentCount=2 -D PalDataFile=PAL.bin validation/postgdc_auto.frag validation/spostgdc.pg validation/dumpgen.test GenerateDump
+ *  \endcode
+ *
+ *  Example use for querying version number:
+ *  \code
+ *  bin/testframework validation/dumpgen.test ShowVersion
+ *  \endcode
+ *
+ *  \section p2pdecoder P2P decoder
+ *
+ *  P2P decoder can be used to interpret P2P outputs received from FW or driver teams. The decoder supports both pgdump and parambins formats. PG dump is a file which
+ *  contains the P2P output as a single text file. Parambins, on the other hand, is a collection of binary files which define the terminal descriptor and payload for each
+ *  terminal.
+ *
+ *  P2P decoder interprets the P2P output and prints all found parameters into the log output. In a sense, it is doing the P2P simulation to the other direction (from
+ *  private to public). This can be used to check what kind of configuration parameters were sent to the FW. Also, if the pgdump is created after running the program
+ *  group, the decoder can be used for inspecting statistics issues.
+ *
+ *  The version number is the same for P2P simulator and decoder. However, it is possible to query the version by running decoder.test with the same option as the simulator.
+ *
+ *  \subsection decode_from_pgdump Decoding From Pgdump
+ *
+ *  The syntax of running the decoder using a pgdump as input is as follows:
+ *
+ *  \code
+ *  bin/testframework -D PGDumpFile=<string> <Pg_file> validation/decoder.test DecodePGDump
+ *  \endcode
+ *
+ *  Parameters:
+ *  - <b>PGDumpFile</b>: Specifies the location of the PG dump file to use as the input.
+ *  - <b>Pg_file</b>: The file which defines for which program group the dump was made (.pg file).
+ *
+ *  Example use for spostgdc:
+ *  \code
+ *  bin/testframework -D PGDumpFile=pgdump.txt validation/spostgdc.pg validation/decoder.test DecodePGDump
+ *  \endcode
+ *
+ *  \subsection decode_from_parambins Decoding From Parambins
+ *
+ *  The syntax of running the decoder using parambins as input is as follows:
+ *
+ *  \code
+ *  bin/testframework -D ParamBinsFolder=<string> <Pg_file> validation/decoder.test DecodeParamBins
+ *  \endcode
+ *
+ *  Parameters:
+ *  - <b>ParamBinsFolder</b>: Specifies the folder which contains the parambins for all terminals to use as the input.
+ *  - <b>Pg_file</b>: The file which defines for which program group the dump was made (.pg file).
+ *
+ *  Example use for spostgdc:
+ *  \code
+ *  bin/testframework -D ParamBinsFolder=p2p_output validation/spostgdc.pg validation/decoder.test DecodeParamBins
+ *  \endcode
+ *
+ *  \section filedebug P2P File Debug
+ *
+ *  P2P contains similar file debug functionality as the other libraries (AIQ and IA_ISP). By enabling the file debug feature in the builds by defining the pre-compiler flag
+ *  INPUT_IN_FILE, P2P will store all function calls to ia_p2p_usecase.bin files, which allows reproducing the exact same execution than what was run in real hardware.
+ *
+ *  Unlike the file debug in other libraries, P2P file debug cannot be run independently. Both IA_ISP_BXT and P2P file debug dumps are required in order to run the full
+ *  simulation. This means that INPUTS_IN_FILE needs to be enabled in both ia_p2p and ia_isp_bxt libraries. The HAL/driver also instantiates multiple instances of P2P to
+ *  be able to run encoding for different frames concurrently. This means that it is not enough to copy only one of the P2P file debug dumps. For full file debug simulation,
+ *  all P2P file debug dumps produced from the same system startup are required.
+ *
+ *  \subsection filedebug_windows Capturing P2P File Debug Dumps on Windows
+ *
+ *  On Windows, P2P file debug dumps are produced in folder <i>C:\\Windows\\system32\\drivers</i>. Windows version of P2P is run in kernel mode which means that P2P is initialized
+ *  already during system startup and uninitialized only when the system is shut down. Since the file debug file handles remain open until the uninitialization, the system needs
+ *  to be restarted in order to be able to copy the ia_p2p_usecase_xxx.bin files to another location.
+ *
+
+ *
+ *  \subsection filedebug_testframework Running File Debug in Testframework
+ *
+ *  Running the simulation is done via ia_isp repository. On Windows side, this happens using the testframework_isp_with_p2p.sln solution file which enables P2P builds in the
+ *  same environment and expects to get P2P dumps as input as well as the ia_isp_bxt dump. P2P dumps are read by the file debug test case using a wild card, so it is enough
+ *  to copy all P2P file debug dumps to the <i>testdata</i> folder. There is no need to change the file names. The IA_ISP_BXT dump is set up in the same way as when debugging
+ *  IA_ISP.
+ */
+
+#ifndef IA_P2P_H_
+#define IA_P2P_H_
+
+#include "ia_isp_bxt_types.h"
+#include "ia_css_terminal_types.h"
+#include "ia_css_terminal.h"
+#include "ia_css_kernel_bitmap.h"
+#include "ia_p2p_types.h"
+#include <ia_css_rbm.h>
+
+#ifdef IA_P2P_ENABLE_DEBUG_SUPPORT
+#include "ia_p2p_private.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Following definitions are used regardless if the IA_AIC is compiled in or not.
+ * Keep this part self-contained until the proper IA_AIC implementation exists for these
+ */
+#define PAC_P2P_SECTIONS MAX_NUM_SECTIONS_PER_KERNEL //private buffer layout calculated by p2p also for PAC proto
+#define PAC_P2P_MAX_FRAGMENTS IA_P2P_MAX_FRAGMENTS
+
+struct ia_pac_fragment_desc_p2p {
+        uint16_t fragment_width;    /*!< The width of the fragment. */
+        uint16_t fragment_height;   /*!< The height of the fragment. */
+        uint16_t fragment_start_x;  /*!< The x offset from the top-left corner of the full image. */
+        uint16_t fragment_start_y;  /*!< The y offset from the top-left corner of the full image. */
+};
+
+struct ia_aic_section_info
+{
+    uint32_t param_in_size[PAC_P2P_SECTIONS];
+    uint32_t param_sec_count;
+    uint32_t program_size[PAC_P2P_SECTIONS];
+    uint32_t program_sec_count;
+    uint32_t spatial_in_size[PAC_P2P_SECTIONS];
+    uint32_t spatial_sec_count;
+    uint32_t uuid[MAX_NUM_ASSOCIATED_PALS_PER_DEVICE];
+    uint32_t uuid_count;
+    uint32_t logical_k_id;
+    uint32_t p2p_kernel_id;
+    struct ia_pac_fragment_desc_p2p pixel_fragment_descs[PAC_P2P_MAX_FRAGMENTS];
+};
+
+/*!
+ *  Initializes IA_P2P module for the given platform.
+ *
+ *  \param [in] platform The platform for which to initialize P2P.
+ *
+ *  \return The IA_P2P instance handle, or NULL if errors.
+ */
+ia_p2p_handle ia_p2p_init(ia_p2p_platform_t platform);
+
+/*!
+ *  De-initializes IA_P2P module.
+ *
+ *  \param [in] ia_p2p IA_P2P instance handle.
+ */
+void ia_p2p_deinit(ia_p2p_handle ia_p2p);
+
+/*!
+ *  Returns the required size for the cache buffer.
+ *
+ *  \param [in] ia_p2p IA_P2P instance handle.
+ */
+uint32_t ia_p2p_get_cache_buffer_size(ia_p2p_handle ia_p2p);
+
+/*!
+ *  Parses the public data ready to be used for encoding.
+ *
+ *  \param [in] ia_p2p          IA_P2P instance handle.
+ *  \param [in] public_data     The public data to parse (from PAL output).
+ *  \param [in] cache_buffer    A pointer to the cache buffer. The buffer is allocated and managed by the user (query the required size with ia_p2p_get_cache_buffer_size()).
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_argument, if the arguments are invalid.
+ *          ia_err_data, if public_data doesn't contain enough data.
+ */
+ia_err ia_p2p_parse(
+    ia_p2p_handle ia_p2p,
+    const ia_binary_data* public_data,
+    void* cache_buffer);
+
+/*!
+ *  Serializes the statistics to a single binary blob.
+ *
+ *  \param [in]  ia_p2p     IA_P2P instance handle.
+ *  \param [out] statistics The resulting statistics data.
+ *  \param [out] included   Flags which indicate what statistics are included in the data.
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_argument, if the arguments are invalid.
+ *
+ *  \remarks The returned data buffer is owned by P2P and is valid as long as any P2P decode functions are not called.
+ */
+ia_err ia_p2p_serialize_statistics(
+    ia_p2p_handle ia_p2p,
+    ia_binary_data* statistics,
+    ia_p2p_statistics_included_t* included);
+
+/*!
+ *  Generates a kernel bitmap for the requested program group.
+ *
+ *  \param [in] ia_p2p  IA_P2P instance handle.
+ *  \param [in] pg_id   The program group id.
+ *
+ *  \return The kernel bitmap where set bit means that the kernel is an imaging kernel and should be encoded by P2P.
+ */
+ia_css_kernel_bitmap_t ia_p2p_get_kernel_bitmap(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id);
+
+/*!
+*  Generates a kernel bitmap for enabled kernels of the requested program group.
+*
+*  \param [in] ia_p2p  IA_P2P instance handle.
+*  \param [in] pg_id   The program group id.
+*
+*  \return The kernel bitmap where set bit means that the kernel is enabled and should be encoded by P2P.
+*/
+ia_css_kernel_bitmap_t ia_p2p_get_kernel_enable_bitmap(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id);
+
+/*!
+*  Generates a kernel bitmap for disabled kernels of the requested program group.
+*
+*  \param [in] ia_p2p  IA_P2P instance handle.
+*  \param [in] pg_id   The program group id.
+*
+*  \return The kernel bitmap where set bit means that the kernel need to be disabled for the PG.
+*/
+ia_css_kernel_bitmap_t ia_p2p_get_kernel_disable_bitmap(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id);
+
+/*!
+ * Check if the kernel bitmaps is empty.
+ *
+ * \param [in] bitmap Kernel bitmap.
+ *
+ * \return bitmap == 0.
+ */
+bool ia_p2p_is_kernel_bitmap_empty(ia_css_kernel_bitmap_t bitmap);
+
+/*!
+ *  Calculates proper fragments for ISL.
+ *
+ *  \param [in]   ia_p2p                                     IA_P2P instance handle.
+ *  \param [in]   fragment_count                             The number of fragments.
+ *  \param [out]  input_pixel_fragment_descs                 The resulting array of fragment descriptors, one for each fragment.
+ *  \param [out]  input_pixel_fragment_descs_display_pin     The resulting array of output fragment descriptors for Bayer (non-scaled) output.
+ *  \param [out]  input_pixel_fragment_descs_main_pin        The resulting array of output fragment descriptors for YUV (scaled) output.
+ */
+ia_err ia_p2p_calculate_isl_fragments(
+    ia_p2p_handle ia_p2p,
+    unsigned int fragment_count,
+    ia_p2p_fragment_desc* input_pixel_fragment_descs,
+    ia_p2p_fragment_desc* output_pixel_fragment_descs_bayer,
+    ia_p2p_fragment_desc* output_pixel_fragment_descs_yuv);
+
+/*!
+ *  Calculates proper fragments for post-GDC.
+ *
+ *  \param [in]   ia_p2p                                     IA_P2P instance handle.
+ *  \param [in]   fragment_count                             The number of fragments.
+ *  \param [out]  input_pixel_fragment_descs                 The resulting array of fragment descriptors, one for each fragment.
+ *  \param [out]  input_pixel_fragment_descs_display_pin     The resulting array of output fragment descriptors for display pin, one for each fragment.
+ *  \param [out]  input_pixel_fragment_descs_main_pin        The resulting array of output fragment descriptors for main pin, one for each fragment.
+ *  \param [out]  input_pixel_fragment_descs_postprocess_pin The resulting array of output fragment descriptors for post-process pin, one for each fragment.
+ */
+ia_err ia_p2p_calculate_postgdc_fragments(
+    ia_p2p_handle ia_p2p,
+    unsigned int fragment_count,
+    ia_p2p_fragment_desc* input_pixel_fragment_descs,
+    ia_p2p_fragment_desc* output_pixel_fragment_descs_display_pin,
+    ia_p2p_fragment_desc* output_pixel_fragment_descs_main_pin,
+    ia_p2p_fragment_desc* output_pixel_fragment_descs_postprocess_pin);
+
+/*!
+ *  Calculates proper fragments for pre-GDC.
+ *
+ *  \param [in]   ia_p2p                                     IA_P2P instance handle.
+ *  \param [in]   fragment_count                             The number of fragments.
+ *  \param [in]   frame_width                                Frame width
+ *  \param [in]   frame_height                               Frame height
+ *  \param [in]   input_bpe                                  Input bits per element because of DMA packing
+ *  \param [in]   output_bpe                                 Output bits per element because of DMA packing
+ *  \param [out]  input_pixel_fragment_descs                 The resulting array of fragment descriptors, one for each fragment.
+ *  \param [out]  output_pixel_fragment_descs                The resulting array of fragment descriptors, one for each fragment.
+ */
+ia_err ia_p2p_calculate_pregdc_fragments(
+    ia_p2p_handle ia_p2p,
+    unsigned int fragment_count,
+    unsigned int frame_width,
+    unsigned int frame_height,
+    unsigned int input_bpe,
+    unsigned int output_bpe,
+    ia_p2p_fragment_desc* input_pixel_fragment_descs,
+    ia_p2p_fragment_desc* output_pixel_fragment_descs);
+
+/*!
+ *  Calculates proper fragments for a program group with pipe graph.
+ *
+ *  \param [in]   ia_p2p            IA_P2P instance handle.
+ *  \param [in]   pg_id             The program group id.
+ *  \param [in]   fragment_count    The number of fragments.
+ *  \param [in]   pipe              The pipe graph.
+ *  \param [in]   fragment_reqs     The constraints to align fragments.
+ *  \param [out]  configuration     The resulting fragment configuration.
+ */
+ia_err ia_p2p_calculate_fragments_pipe(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    unsigned int fragment_count,
+    const ia_isp_bxt_pipe_t *pipe,
+    ia_p2p_fragment_reqs *fragment_reqs,
+    ia_p2p_fragment_configuration_t* configuration);
+
+/*!
+ *  Calculates proper fragments for a program group.
+ *  DEPRECATED. Use ia_p2p_calculate_fragments_pipe instead.
+ *
+ *  \param [in]   ia_p2p            IA_P2P instance handle.
+ *  \param [in]   pg_id             The program group id.
+ *  \param [in]   fragment_count    The number of fragments.
+ *  \param [out]  configuration     The resulting fragment configuration.
+ */
+ia_err ia_p2p_calculate_fragments(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    unsigned int fragment_count,
+    ia_p2p_fragment_configuration_t* configuration);
+
+/*!
+ *  Calculates proper fragments for a program group with routing bitmap.
+ *  DEPRECATED. Use ia_p2p_calculate_fragments_pipe instead.
+ *
+ *  \param [in]   ia_p2p            IA_P2P instance handle.
+ *  \param [in]   pg_id             The program group id.
+ *  \param [in]   fragment_count    The number of fragments.
+ *  \param [in]   rbm               The routing bitmap.
+ *  \param [in]   fragment_reqs     The constraints to align fragments.
+ *  \param [out]  configuration     The resulting fragment configuration.
+ */
+ia_err ia_p2p_calculate_fragments_rbm(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    unsigned int fragment_count,
+    const ia_css_rbm_t *rbm,
+    ia_p2p_fragment_reqs *fragment_reqs,
+    ia_p2p_fragment_configuration_t* configuration);
+
+/*!
+ *  Calculates the required number of section descriptors for each terminal type for the given kernel.
+ *
+ *  \param [in]  ia_p2p                 IA_P2P instance handle.
+ *  \param [in]  pg_id                  The program group id.
+ *  \param [in]  kernel_id              The program group specific identifier of the kernel whose descriptor to calculate.
+ *  \param [out] kernel_requirements    The calculated requirements for each terminal for the given kernel.
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_argument, if the arguments are invalid.
+ */
+ia_err ia_p2p_get_kernel_terminal_requirements(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    uint32_t kernel_id,
+    ia_p2p_terminal_requirements_t* kernel_requirements);
+
+/*!
+ *  Calculates the total size of payload for each terminal type for the given kernel.
+ *
+ *  \param [in]  ia_p2p                 IA_P2P instance handle.
+ *  \param [in]  pg_id                  The program group id.
+ *  \param [in]  kernel_id              The program group specific identifier of the kernel whose payload sizes to calculate.
+ *  \param [in]  fragment_count         The number of fragments.
+ *  \param [in]  pixel_fragment_descs   An array of fragment descriptors, one for each fragment.
+ *  \param [out] kernel_payload_desc    The calculated total payload size for each terminal for the given kernel.
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_argument, if the arguments are invalid.
+ */
+ia_err ia_p2p_get_kernel_payload_desc(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    uint32_t kernel_id,
+    unsigned int fragment_count,
+    const ia_p2p_fragment_desc* pixel_fragment_descs,
+    ia_p2p_payload_desc* kernel_payload_desc);
+
+/*!
+ * Interface for IPU7 PAC. Caller needs more information about the sections.
+ * IPU7 PAC still borrows some services from P2P.
+ *
+ * Interface is the same as for ia_p2p_get_kernel_payload_desc but
+ * \ param[out] s_info                  Section information
+ */
+ia_err ia_pac_get_kernel_payload_desc(
+        ia_p2p_handle ia_p2p,
+        uint32_t pg_id,
+        uint32_t kernel_id,
+        unsigned int fragment_count,
+        const ia_p2p_fragment_desc* pixel_fragment_descs,
+        ia_p2p_payload_desc* kernel_payload_desc,
+        struct ia_aic_section_info *s_info);
+
+
+/*!
+ *  Gets the section count and size of payload for param-in/param-out/program terminal for the given kernel.
+ *
+ *  \param [in]  ia_p2p                 IA_P2P instance handle.
+ *  \param [in]  pg_id                  The program group id.
+ *  \param [in]  kernel_id              The program group specific identifier of the kernel whose section count and sizes to get.
+ *  \param [out] kernel_payload_desc    The section count and size for param-in/param-out/program terminal for the given kernel.
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_argument, if the arguments are invalid.
+ *          ia_err_data, if the section count is out of boundary.
+ */
+ia_err ia_p2p_get_kernel_payload_section_desc(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    uint32_t kernel_id,
+    ia_p2p_payload_section_desc* kernel_payload_desc);
+
+/*!
+ *  Encodes data for a single kernel in a parameter terminal.
+ *
+ *  \param [in]     ia_p2p              IA_P2P instance handle.
+ *  \param [in]     pg_id               The program group id.
+ *  \param [in]     kernel_id           The program group specific identifier of the kernel to encode.
+ *  \param [in,out] terminal            The parameter terminal.
+ *  \param [in]     section_index       The index of the first section where the data for this kernel is written to the terminal.
+ *  \param [in,out] payload_buffer      A pointer to the beginning of the payload buffer.
+ *  \param [in]     payload_buffer_size The total size of the given payload buffer, in bytes.
+ *  \param [in]     payload_base_offset The base offset in the payload buffer for this kernel.
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_argument, if the arguments are invalid.
+ */
+ia_err ia_p2p_param_in_terminal_encode(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    uint32_t kernel_id,
+    ia_css_param_terminal_t* terminal,
+    unsigned int section_index,
+    unsigned char* payload_buffer,
+    unsigned int payload_buffer_size,
+    unsigned int payload_base_offset);
+
+/*!
+ *  Initializes the program terminal sequencer with fragment information.
+ *
+ *  \param [in]     ia_p2p                  IA_P2P instance handle.
+ *  \param [in]     pg_id                   The program group id.
+ *  \param [in]     fragment_count          The number of fragments.
+ *  \param [in]     pixel_fragment_descs    An array of fragment descriptors, one for each fragment.
+ *  \param [in,out] terminal                The program terminal.
+ */
+ia_err ia_p2p_program_terminal_init(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    unsigned int fragment_count,
+    const ia_p2p_fragment_desc* pixel_fragment_descs,
+    ia_css_program_terminal_t* terminal);
+
+/*!
+ *  Initializes the program terminal sequencer with fragment information.
+ *
+ *  \param [in]     ia_p2p                  IA_P2P instance handle.
+ *  \param [in]     pg_id                   The program group id.
+ *  \param [in]     configuration           Fragment configuration calculated with ia_p2p_calculate_fragments().
+ *  \param [in,out] terminal                The program terminal.
+ */
+ia_err ia_p2p_program_terminal_init_v2(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    const ia_p2p_fragment_configuration_t* configuration,
+    ia_css_program_terminal_t* terminal);
+
+/*!
+ *  Encodes data for a single kernel in a program terminal.
+ *
+ *  \param [in]     ia_p2p                          IA_P2P instance handle.
+ *  \param [in]     pg_id                           The program group id.
+ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to encode.
+ *  \param [in]     fragment_count                  The number of fragments.
+ *  \param [in]     pixel_fragment_descs            An array of fragment descriptors, one for each fragment.
+ *  \param [in,out] terminal                        The program terminal.
+ *  \param [in]     section_index                   The index of the first section where the data for this kernel is written to the terminal.
+ *  \param [in]     total_section_count             The total number of sections for one fragment including all kernels.
+ *  \param [in,out] payload_buffer                  A pointer to the beginning of the payload buffer.
+ *  \param [in]     payload_buffer_size             The total size of the given payload buffer, in bytes.
+ *  \param [in]     payload_base_offset             The base offset in the payload buffer for this kernel.
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_argument, if the arguments are invalid.
+ */
+ia_err ia_p2p_program_terminal_encode(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    uint32_t kernel_id,
+    unsigned int fragment_count,
+    const ia_p2p_fragment_desc* pixel_fragment_descs,
+    ia_css_program_terminal_t* terminal,
+    unsigned int section_index,
+    unsigned int total_section_count,
+    unsigned char* payload_buffer,
+    unsigned int payload_buffer_size,
+    unsigned int payload_base_offset);
+
+/*!
+ *  Encodes data for a single kernel in a spatial param input terminal.
+ *
+ *  \param [in]     ia_p2p                          IA_P2P instance handle.
+ *  \param [in]     pg_id                           The program group id.
+ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to encode.
+ *  \param [in]     fragment_count                  The number of fragments.
+ *  \param [in]     pixel_fragment_descs            An array of fragment descriptors, one for each fragment.
+ *  \param [in,out] terminal                        The spatial param input terminal.
+ *  \param [in]     section_index                   The index of the first section where the data for this kernel is written to the terminal.
+ *  \param [in,out] payload_buffer                  A pointer to the beginning of the payload buffer.
+ *  \param [in]     payload_buffer_size             The total size of the given payload buffer, in bytes.
+ *  \param [in]     payload_base_offset             The base offset in the payload buffer for this kernel.
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_argument, if the arguments are invalid.
+ */
+ia_err ia_p2p_spatial_param_in_terminal_encode(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    uint32_t kernel_id,
+    unsigned int fragment_count,
+    const ia_p2p_fragment_desc* pixel_fragment_descs,
+    ia_css_spatial_param_terminal_t* terminal,
+    unsigned int section_index,
+    unsigned char* payload_buffer,
+    unsigned int payload_buffer_size,
+    unsigned int payload_base_offset);
+
+/*!
+ *  Encodes data for a single kernel in a spatial param output terminal.
+ *
+ *  \param [in]     ia_p2p                          IA_P2P instance handle.
+ *  \param [in]     pg_id                           The program group id.
+ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to encode.
+ *  \param [in]     fragment_count                  The number of fragments.
+ *  \param [in]     pixel_fragment_descs            An array of fragment descriptors, one for each fragment.
+ *  \param [in,out] terminal                        The spatial param output terminal.
+ *  \param [in]     section_index                   The index of the first section where the data for this kernel is written to the terminal.
+ *  \param [in]     payload_buffer_size             The total size of the given payload buffer, in bytes.
+ *  \param [in]     payload_base_offset             The base offset in the payload buffer for this kernel.
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_argument, if the arguments are invalid.
+ */
+ia_err ia_p2p_spatial_param_out_terminal_prepare(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    uint32_t kernel_id,
+    unsigned int fragment_count,
+    const ia_p2p_fragment_desc* pixel_fragment_descs,
+    ia_css_spatial_param_terminal_t* terminal,
+    unsigned int section_index,
+    unsigned int payload_buffer_size,
+    unsigned int payload_base_offset);
+
+/*!
+ *  Decodes spatial parameter data for a single kernel from a spatial param output terminal.
+ *
+ *  \param [in]     ia_p2p              IA_P2P instance handle.
+ *  \param [in]     pg_id               The program group id.
+ *  \param [in]     kernel_id           The program group specific identifier of the kernel to decode.
+ *  \param [in]     terminal            The spatial param output terminal.
+ *  \param [in]     section_index       The index of the first section where the data for this kernel is available in the terminal.
+ *  \param [in]     payload_buffer      A pointer to the beginning of the payload buffer.
+ *  \param [in]     payload_buffer_size The total size of the given payload buffer, in bytes.
+ *  \param [in,out] cache_buffer        A pointer to the cache buffer for storing the cached outputs.
+ *                                      The buffer is allocated and managed by the user (query the required size with ia_p2p_get_cache_buffer_size()).
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_argument, if the arguments are invalid.
+ */
+ia_err ia_p2p_spatial_param_out_terminal_decode(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    uint32_t kernel_id,
+    ia_css_spatial_param_terminal_t* terminal,
+    unsigned int section_index,
+    const unsigned char* payload_buffer,
+    unsigned int payload_buffer_size,
+    void* cache_buffer);
+
+/*!
+*  Decodes spatial parameter data for a single kernel from a spatial param output terminal with fragment information.
+*
+*  \param [in]     ia_p2p               IA_P2P instance handle.
+*  \param [in]     pg_id                The program group id.
+*  \param [in]     kernel_id            The program group specific identifier of the kernel to decode.
+*  \param [in]     fragments_count      To apply offsets to subsequent fragments.
+*  \param [in]     pixel_fragment_descs Pixel fragment descriptors that were used when encoding current frame.
+*  \param [in]     terminal             The spatial param output terminal.
+*  \param [in]     section_index        The index of the first section where the data for this kernel is available in the terminal.
+*  \param [in]     payload_buffer       A pointer to the beginning of the payload buffer.
+*  \param [in]     payload_buffer_size  The total size of the given payload buffer, in bytes.
+*  \param [in,out] cache_buffer         A pointer to the cache buffer for storing the cached outputs.
+*                                       The buffer is allocated and managed by the user (query the required size with ia_p2p_get_cache_buffer_size()).
+*
+*
+*  \return ia_err_none, if no errors.
+*          ia_err_argument, if the arguments are invalid.
+*/
+ia_err ia_p2p_spatial_param_out_terminal_decode_v2(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    uint32_t kernel_id,
+    unsigned int fragments_count,
+    const ia_p2p_fragment_desc* pixel_fragment_descs,
+    ia_css_spatial_param_terminal_t* terminal,
+    unsigned int section_index,
+    const unsigned char* payload_buffer,
+    unsigned int payload_buffer_size,
+    void* cache_buffer);
+
+/*!
+ *  Prepares payload for a single kernel in a parameter output terminal.
+ *
+ *  \param [in]     ia_p2p              IA_P2P instance handle.
+ *  \param [in]     pg_id               The program group id.
+ *  \param [in]     kernel_id           The program group specific identifier of the kernel whose descriptors to prepare.
+ *  \param [in]     fragment_count      The number of fragments.
+ *  \param [in,out] terminal            The param output terminal.
+ *  \param [in]     section_index       The index of the first section where the data for this kernel is written to the terminal.
+ *  \param [in]     total_section_count The total number of sections for one fragment including all kernels.
+ *  \param [in]     payload_buffer_size The total size of the payload buffer, in bytes.
+ *  \param [in]     payload_base_offset The base offset in the payload buffer for this kernel.
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_argument, if the arguments are invalid.
+ */
+ia_err ia_p2p_param_out_terminal_prepare(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    uint32_t kernel_id,
+    unsigned int fragment_count,
+    ia_css_param_terminal_t* terminal,
+    unsigned int section_index,
+    unsigned int total_section_count,
+    unsigned int payload_buffer_size,
+    unsigned int payload_base_offset);
+
+/*!
+ *  Decodes param out data for a single kernel in a parameter output terminal.
+ *
+ *  \param [in]     ia_p2p              IA_P2P instance handle.
+ *  \param [in]     pg_id               The program group id.
+ *  \param [in]     kernel_id           The program group specific identifier of the kernel to decode.
+ *  \param [in]     fragment_count      The number of fragments.
+ *  \param [in]     terminal            The param output terminal.
+ *  \param [in]     section_index       The index of the first section where the data for this kernel is written to the terminal.
+ *  \param [in]     total_section_count The total number of sections for one fragment including all kernels.
+ *  \param [in]     payload_buffer_size The total size of the given payload buffer, in bytes.
+ *  \param [in]     payload_buffer      A pointer to the beginning of the payload buffer.
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_argument, if the arguments are invalid.
+ */
+ia_err ia_p2p_param_out_terminal_decode(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    uint32_t kernel_id,
+    unsigned int fragment_count,
+    const ia_css_param_terminal_t* terminal,
+    unsigned int section_index,
+    unsigned int total_section_count,
+    const unsigned char* payload_buffer,
+    unsigned int payload_buffer_size);
+
+/*!
+ *  Returns the size of kernel user parameters for all the kernels in the given Program Group.
+ *  This is used in VP-less environment where some of the parameter calculation is done in P2P
+ *  instead of firmware.
+ *
+ *  \param [in]  ia_p2p                 IA_P2P instance handle.
+ *  \param [in]  pg_id                  The program group id.
+ *  \param [in]  fragment_count         The number of fragments.
+ *  \param [out] user_parameter_size    Size of the kernel user parameters in the given PG.
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_argument, if the arguments are invalid.
+ */
+ia_err ia_p2p_get_kernel_user_parameter_size(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    unsigned int fragment_count,
+    unsigned int* user_parameter_size);
+
+/*!
+ *  Returns the size of kernel user parameters descriptor and payload size separately for the
+ *  parambin generation purpose.
+ *
+ *  \param [in]  ia_p2p                 IA_P2P instance handle.
+ *  \param [in]  pg_id                  The program group id.
+ *  \param [in]  fragment_count         The number of fragments.
+ *  \param [out] kup_desc_size          Size of the kernel user parameter descriptor for a given PG
+ *  \param [out] kup_payload_size       Size of the kernel user parameter payload for a given PG.
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_argument, if the arguments are invalid.
+ */
+ia_err ia_p2p_get_kup_desc_and_payload_size(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    unsigned int fragment_count,
+    unsigned int* kup_desc_size,
+    unsigned int* kup_payload_size);
+
+/*!
+ *  Initializes the Program Group with kernel specific user parameters.
+ *  This is used in VP-less environment where some of the parameter calculation is done in P2P
+ *  instead of firmware.
+ *
+ *  \param [in]     ia_p2p                   IA_P2P instance handle.
+ *  \param [in]     pg_id                    The program group id.
+ *  \param [in]     fragment_count           The number of fragments.
+ *  \param [in]     pixel_fragment_descs     An array of fragment descriptors, one for each fragment.
+ *  \param [in,out] user_parameters          A pointer to the beginning of user parameters.
+ */
+ia_err ia_p2p_get_kernel_user_parameters(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    unsigned int fragment_count,
+    const ia_p2p_fragment_desc* pixel_fragment_descs,
+    unsigned char* user_parameters);
+
+/*!
+*  Initializes the Program Group with kernel specific user parameters.
+*  This is used in VP-less environment where some of the parameter calculation is done in P2P
+*  instead of firmware.
+*
+*  \param [in]     ia_p2p                   IA_P2P instance handle.
+*  \param [in]     pg_id                    The program group id.
+*  \param [in]     fragment_count           The number of fragments.
+*  \param [in]     frag_configuration       Fragment configuration calculated with ia_p2p_calculate_fragments().
+*  \param [in,out] user_parameters          A pointer to the beginning of user parameters.
+*/
+ia_err ia_p2p_get_kernel_user_parameters_v2(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    unsigned int fragment_count,
+    const ia_p2p_fragment_configuration_t* frag_configuration,
+    unsigned char* user_parameters);
+
+/*!
+ * \brief Get version.
+ * Get version from version header.
+ *
+ * \return                                  Version string.
+ */
+const char* ia_p2p_get_version(void);
+
+/*!
+*  Decodes kernel user parameters for all kernels in the program group.
+*  The result is printout of each parameter.
+*
+*  \param [in]     ia_p2p                   IA_P2P instance handle.
+*  \param [in]     pg_id                    The program group id.
+*  \param [in]     kup_descriptor           The kernel user parameter payload layout information.
+*  \param [in]     payload_buffer           Kernel user parameter binary.
+*/
+ia_err ia_p2p_decode_kup(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    const unsigned char* kup_descriptor,
+    const unsigned char* payload_buffer);
+
+
+#ifdef IA_P2P_ENABLE_DEBUG_SUPPORT
+/*!
+ *  Decodes data for a single kernel in a parameter terminal.
+ *
+ *  \param [in]     ia_p2p              IA_P2P instance handle.
+ *  \param [in]     pg_id               The program group id.
+ *  \param [in]     kernel_id           The program group specific identifier of the kernel to encode.
+ *  \param [in,out] terminal            The parameter terminal.
+ *  \param [in]     section_index       The index of the first section where the data for this kernel is available in the terminal.
+ *  \param [in,out] payload_buffer      A pointer to the beginning of the payload buffer.
+ *  \param [in]     payload_buffer_size The total size of the given payload buffer, in bytes.
+ *  \param [out]    public_data_out     A structure for the public data output.
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_argument, if the arguments are invalid.
+ */
+ia_err ia_p2p_param_in_terminal_decode(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    uint32_t kernel_id,
+    const ia_css_param_terminal_t* terminal,
+    unsigned int section_index,
+    const unsigned char* payload_buffer,
+    unsigned int payload_buffer_size,
+    ia_p2p_public_data_t* public_data_out);
+
+/*!
+ *  Encodes data for a single kernel in a program terminal.
+ *
+ *  \param [in]     ia_p2p                          IA_P2P instance handle.
+ *  \param [in]     pg_id                           The program group id.
+ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to decode.
+ *  \param [in]     fragment_count                  The number of fragments.
+ *  \param [in,out] terminal                        The program terminal.
+ *  \param [in]     section_index                   The index of the first section where the data for this kernel is available in the terminal.
+ *  \param [in]     total_section_count             The total number of sections for one fragment including all kernels.
+ *  \param [in]     payload_buffer                  A pointer to the beginning of the payload buffer.
+ *  \param [in]     payload_buffer_size             The total size of the given payload buffer, in bytes.
+ *  \param [out]    public_data_out                 A structure for the decoded output.
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_argument, if the arguments are invalid.
+ */
+ia_err ia_p2p_program_terminal_decode(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    uint32_t kernel_id,
+    unsigned int fragment_count,
+    ia_css_program_terminal_t* terminal,
+    unsigned int section_index,
+    unsigned int total_section_count,
+    const unsigned char* payload_buffer,
+    unsigned int payload_buffer_size,
+    ia_p2p_public_data_t* public_data_out);
+
+/*!
+ *  Decodes fragment grid descriptors for a single kernel from a spatial param input terminal.
+ *
+ *  \param [in]     ia_p2p                          IA_P2P instance handle.
+ *  \param [in]     pg_id                           The program group id.
+ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to decode.
+ *  \param [in]     fragment_count                  The number of fragments.
+ *  \param [in]     terminal                        The spatial param input terminal.
+ *  \param [in]     public_data_out                 A structure for the decoded output.
+ *  \param [out]    sequencer_fragment_descs        The resulting array of fragment grid descriptors.
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_argument, if the arguments are invalid.
+ */
+ia_err ia_p2p_spatial_param_in_terminal_decode_grid_descriptors(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    uint32_t kernel_id,
+    unsigned int fragment_count,
+    ia_css_spatial_param_terminal_t* terminal,
+    ia_p2p_public_data_t* public_data_out,
+    ia_css_fragment_grid_desc_t* sequencer_fragment_descs);
+
+/*!
+ *  Decodes spatial parameter data for a single kernel from a spatial param input terminal.
+ *
+ *  \param [in]     ia_p2p                          IA_P2P instance handle.
+ *  \param [in]     pg_id                           The program group id.
+ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to decode.
+ *  \param [in]     terminal                        The spatial param input terminal.
+ *  \param [in]     section_index                   The index of the first section where the data for this kernel is available in the terminal.
+ *  \param [in]     payload_buffer                  A pointer to the beginning of the payload buffer.
+ *  \param [in]     payload_buffer_size             The total size of the given payload buffer, in bytes.
+ *  \param [in,out] public_data_out                 A structure for the decoded output.
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_argument, if the arguments are invalid.
+ */
+ia_err ia_p2p_spatial_param_in_terminal_decode(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    uint32_t kernel_id,
+    ia_css_spatial_param_terminal_t* terminal,
+    unsigned int section_index,
+    const unsigned char* payload_buffer,
+    unsigned int payload_buffer_size,
+    ia_p2p_public_data_t* public_data_out);
+
+/*!
+ *  Decodes fragment grid descriptors for a single kernel from a spatial param output terminal.
+ *
+ *  \param [in]     ia_p2p                          IA_P2P instance handle.
+ *  \param [in]     pg_id                           The program group id.
+ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to decode.
+ *  \param [in]     fragment_count                  The number of fragments.
+ *  \param [in]     terminal                        The spatial param output terminal.
+ *  \param [in]     public_data_out                 A structure for the decoded output.
+ *  \param [out]    sequencer_fragment_descs        The resulting array of fragment grid descriptors.
+ *
+ *  \return ia_err_none, if no errors.
+ *          ia_err_argument, if the arguments are invalid.
+ */
+ia_err ia_p2p_spatial_param_out_terminal_decode_grid_descriptors(
+    ia_p2p_handle ia_p2p,
+    uint32_t pg_id,
+    uint32_t kernel_id,
+    unsigned int fragment_count,
+    ia_css_spatial_param_terminal_t* terminal,
+    ia_p2p_public_data_t* public_data_out,
+    ia_css_fragment_grid_desc_t* sequencer_fragment_descs);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IA_P2P_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_p2p_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_p2p_types.h
new file mode 100644
index 000000000000..d5f3d44dd97d
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_p2p_types.h
@@ -0,0 +1,221 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \file ia_p2p_types.h
+ * \brief Declares public2private interface data types.
+ */
+
+#ifndef IA_P2P_TYPES_H_
+#define IA_P2P_TYPES_H_
+
+#include <stdint.h>
+
+#include "ia_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*!
+ * Max section count for each kernel
+ */
+#define MAX_NUM_SECTIONS_PER_KERNEL 20
+
+/*!
+ * Max number of Algo kernels associated with a HW device
+ */
+#define MAX_NUM_ASSOCIATED_PALS_PER_DEVICE 5
+
+/*!
+ *  P2P instance handle type.
+ */
+typedef struct ia_p2p_t* ia_p2p_handle;
+
+/*!
+ *  Platform identifier.
+ */
+typedef enum
+{
+    IA_P2P_PLATFORM_BXT_A0,
+    IA_P2P_PLATFORM_BXT_B0,
+    IA_P2P_PLATFORM_CNL_A0,
+    IA_P2P_PLATFORM_CNL_B0,
+    IA_P2P_PLATFORM_GLV_A0,
+    IA_P2P_PLATFORM_IPU6,
+} ia_p2p_platform_t;
+
+#define IA_P2P_MAX_FRAGMENTS       10
+#define IA_P2P_MAX_KERNELS_PER_PG  128
+
+/*!
+ *  Fragment descriptor.
+ */
+typedef struct
+{
+    uint16_t fragment_width;    /*!< The width of the fragment. */
+    uint16_t fragment_height;   /*!< The height of the fragment. */
+    uint16_t fragment_start_x;  /*!< The x offset from the top-left corner of the full image. */
+    uint16_t fragment_start_y;  /*!< The y offset from the top-left corner of the full image. */
+} ia_p2p_fragment_desc;
+
+/*!
+ *  Fragment requirements.
+ */
+typedef struct
+{
+    uint8_t input_bpe;    /*!< The input bits per element. */
+    uint8_t output_bpe;   /*!< The output bits per element. */
+} ia_p2p_fragment_reqs;
+
+/*!
+ *  Full fragmentation configuration for a program group.
+ */
+typedef struct
+{
+    unsigned int fragment_count;
+    ia_p2p_fragment_desc pixel_fragment_descs[IA_P2P_MAX_KERNELS_PER_PG][IA_P2P_MAX_FRAGMENTS];
+} ia_p2p_fragment_configuration_t;
+
+/*!
+ *  Structure for terminal requirements, specifying the number of sections required for each terminal type.
+ */
+typedef struct
+{
+    unsigned int param_in_section_count;                        /*!< The number of parameter input sections required. */
+    unsigned int param_out_section_count_per_fragment;          /*!< The number of parameter output sections required per fragment. */
+    unsigned int program_section_count_per_fragment;            /*!< The number of program sections required per fragment. */
+    unsigned int spatial_param_in_section_count;                /*!< The number of spatial param input sections required. */
+    unsigned int spatial_param_out_section_count;               /*!< The number of spatial param output sections required. */
+} ia_p2p_terminal_requirements_t;
+
+/*!
+ *  Payload descriptor specifying the total size of payload required for each terminal type.
+ */
+typedef struct
+{
+    uint32_t param_in_payload_size;             /*!< The total size of the parameter input payload in bytes. */
+    uint32_t param_out_payload_size;            /*!< The total size of the parameter output payload in bytes. */
+    uint32_t program_payload_size;              /*!< The total size of the program payload in bytes. */
+    uint32_t spatial_param_in_payload_size;     /*!< The total size of the spatial param input payload in bytes. */
+    uint32_t spatial_param_out_payload_size;    /*!< The total size of the spatial param output payload in bytes. */
+} ia_p2p_payload_desc;
+
+/*!
+ *  Payload descriptor specifying the count and size of payload required for each terminal type.
+ */
+typedef struct
+{
+    uint32_t param_in_section_count;                              /*!< The count of parameter input sections. */
+    uint32_t param_out_section_count;                             /*!< The count of parameter output sections (per fragment). */
+    uint32_t program_section_count;                               /*!< The count of program sections (per fragment). */
+    uint32_t param_in_section_size[MAX_NUM_SECTIONS_PER_KERNEL];  /*!< The size of the parameter input section in bytes. */
+    uint32_t param_out_section_size[MAX_NUM_SECTIONS_PER_KERNEL]; /*!< The size of the parameter output section in bytes. */
+    uint32_t program_section_size[MAX_NUM_SECTIONS_PER_KERNEL];   /*!< The size of the program section in bytes. */
+} ia_p2p_payload_section_desc;
+/*!
+ *  Flags for available serialized statistics.
+ */
+typedef struct
+{
+    bool rgbs_grid;          /*!< If true, RGBS grid is available. */
+    bool af_grid;            /*!< If true, AF grid is available. */
+    bool histograms;         /*!< If true, histograms are available. */
+    bool dvs_stats;          /*!< If true, DVS statistics are available. */
+    bool paf_grid;           /*!< If true, PAF grid is available. */
+    bool rgbs_grids_hdr;     /*!< If true, RGBS HDR grids are available. */
+    bool rgby_grids_hdr;     /*!< If true, RGBY stat for high precision histogram is available. */
+    bool yv_grids_hdr;       /*!< If true, YV HDR grids are available. */
+} ia_p2p_statistics_included_t;
+
+/* Currently supported program groups. */
+#define IA_P2P_PG_ISYS                       0       /* No manifest available so we define a custom PG specification id for ISYS. */
+#define IA_P2P_PG_VPOSTGDC                   114     /* IA_CSS_BXT_PSS_PG_SPECIFICATION_VPOSTGDC */
+#define IA_P2P_PG_VPREGDC                    116     /* Deprecated */
+#define IA_P2P_PG_SPREGDC                    117     /* Deprecated */
+#define IA_P2P_PG_SPOSTGDC                   118
+#define IA_P2P_PG_ISL                        120     /* Deprecated */
+#define IA_P2P_PG_VHDR_PREPROC               121     /* Deprecated */
+#define IA_P2P_PG_VPREGDC_HQ                 122
+#define IA_P2P_PG_VPREGDC_HQ_VCR2            148
+#define IA_P2P_PG_VIDEO_ISL_PREGDC_HQ_VCR2   156
+#define IA_P2P_PG_SPREGDC_XNR                125     /* Deprecated */
+#define IA_P2P_PG_SPREGDC_XNR_V2             131
+#define IA_P2P_PG_SPREGDC_XNR_V3             136
+#define IA_P2P_PG_SPOSTGDC_IN8               152
+#define IA_P2P_PG_SPOSTGDC_V4                161     /* For SV usage only */
+#define IA_P2P_PG_SPOSTGDC_IN8_V4            162
+#define IA_P2P_PG_SPREGDC_XNR_V2_VCR2        149
+#define IA_P2P_PG_SPREGDC_XNR_V3_VCR2        150
+#define IA_P2P_PG_ISL_PS_HIRES               127
+#define IA_P2P_PG_ISL_PS_INPUT_CROP          127
+#define IA_P2P_PG_ISL_PS_RGBIR               130
+#define IA_P2P_PG_ISL_RGBIR_VPREGDC_HQ_VCR2  158
+#define IA_P2P_PG_SPOSTGDC_V2                128
+#define IA_P2P_PG_SPOSTGDC_V2_MBR            173
+#define IA_P2P_PG_VPOSTGDC_V2                129
+#define IA_P2P_PG_VPOSTGDC_V2_MBR            172
+#define IA_P2P_PG_VPOSTGDC_MBR               132
+#define IA_P2P_PG_SPOSTGDC_MBR               133
+#define IA_P2P_PG_IPU5_SPOSTGDC_10BIT        197
+#define IA_P2P_PG_POWERON                    201     /* Deprecated */
+#define IA_P2P_PG_VIDEO_ISL_PREGDC_HQ        137
+#define IA_P2P_PG_ISL_PS_GLV                 138
+#define IA_P2P_PG_ISL_PS_GLV_V2              155
+#define IA_P2P_PG_DFM_ISL_PS_GLV_VPLESS      166     /* To be removed, leaved here to simplify integration (referenced by libiacss) */
+#define IA_P2P_PG_ISL_PS_GLV_VPLESS          166
+#define IA_P2P_PG_ISA_LB_GLV_VPLESS          194
+#define IA_P2P_PG_IPU5_VPREGDC_VPLESS        167
+#define IA_P2P_PG_IPU5_SPREGDC_VPLESS        168
+#define IA_P2P_PG_IPU5_VPOSTGDC_V1           151
+#define IA_P2P_PG_IPU5_VPOSTGDC_V4           169
+#define IA_P2P_PG_IPU5_VPOSTGDC_V4_HDR10     193 /* TODO: Remove after merge. Here just to avoid two-way dependency to libiacss */
+#define IA_P2P_PG_IPU5_VPOSTGDC_V4_10BIT     193
+#define IA_P2P_PG_IPU6_LB_PSA_BYPASS         182
+#define IA_P2P_PG_IPU6_LB_PSA                183
+#define IA_P2P_PG_IPU6_ISL_RBM               185
+#define IA_P2P_PG_IPU6_ISA_LB                187
+#define IA_P2P_PG_IPU6_BB_OFS                188
+#define IA_P2P_PG_IPU6_BB                    189
+#define IA_P2P_PG_IPU6_BB_OFS_GDC            196
+#define IA_P2P_PG_IPU6S_ISA                  198
+#define IA_P2P_PG_VPREGDC_HQ_NS              1000    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_HQ_NS */
+#define IA_P2P_PG_VPOSTGDC_HQ_NS             1001    /* IA_CSS_PROGRAM_GROUP_ID_VPOSTGDC_HQ_NS */
+#define IA_P2P_PG_VPREGDC_HP                 1002    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_HP */
+#define IA_P2P_PG_VPOSTGDC_HP                1003    /* IA_CSS_PROGRAM_GROUP_ID_VPOSTGDC_HP */
+#define IA_P2P_PG_VPREGDC_LL                 1004    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_LL */
+#define IA_P2P_PG_VHDR_PREPROC_V2            1005    /* IA_CSS_PROGRAM_GROUP_ID_VHDR_PREPROC_V2 */
+#define IA_P2P_PG_VPREGDC_HQ_NS_DVS          1007    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_HQ_NS_DVS */
+#define IA_P2P_PG_VPOSTGDC_HQ_NS_DVS2        1008    /* IA_CSS_PROGRAM_GROUP_ID_VPOSTGDC_HQ_NS_DVS2 */
+#define IA_P2P_PG_VPOSTGDC_HQ_NS_DVS3        1009    /* IA_CSS_PROGRAM_GROUP_ID_VPOSTGDC_HQ_NS_DVS3 */
+#define IA_P2P_PG_VPREGDC_HP_2FR             1010    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_HP_2FR */
+#define IA_P2P_PG_VPOSTGDC_HQ_4K             1011    /* IA_CSS_PROGRAM_GROUP_ID_VPOSTGDC_HQ_4K */
+#define IA_P2P_PG_VPREGDC_ISL_HQ_4K          1012    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_ISL_HQ_4K */
+#define IA_P2P_PG_VHDR_PREPROC_STATS_HP      1013    /* A_CSS_PROGRAM_GROUP_ID_VHDRPREPROC_STATS_HP */
+#define IA_P2P_PG_VPREGDC_HP_DRC             1014    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_HP_DRC */
+#define IA_P2P_PG_VHDR_PREGDC_HP             1015    /* IA_CSS_PROGRAM_GROUP_ID_VHDR_PREGDC_HP */
+#define IA_P2P_PG_VHDR_PREGDC_HP_DRC2        1016    /* IA_CSS_PROGRAM_GROUP_ID_VHDR_PREGDC_HP_DRC2 */
+#define IA_P2P_PG_VHDR_PREGDC_HP_2FR_V2      1017    /* IA_CSS_PROGRAM_GROUP_ID_VHDR_PREGDC_HP_2FR_V2 */
+#define IA_P2P_PG_YUYV_SCALE                 1051    /* IA_CSS_PROGRAM_GROUP_ID_YUYV_SCALE */
+#define IA_P2P_PG_YUV_CSC                    1052    /* IA_CSS_PROGRAM_GROUP_ID_YUV_CSC */
+#define IA_P2P_PG_YUYV_LDC                   1053    /* IA_CSS_PROGRAM_GROUP_ID_YUYV_LDC */
+#define IA_P2P_PG_TEST                       1       /* For internal P2P testing. */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IA_P2P_TYPES_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_exports.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_exports.h
new file mode 100644
index 000000000000..db7bdb595798
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_exports.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#if defined _WIN32 && defined BUILD_SHARED_LIBS
+#if defined BROXTON_IA_PAL_EXPORTS || defined broxton_ia_pal_EXPORTS
+#define IA_PAL_API __declspec(dllexport)
+#else
+#define IA_PAL_API __declspec(dllimport)
+#endif
+#else
+#define IA_PAL_API
+#endif
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp.h
new file mode 100644
index 000000000000..2fbc76c0c908
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef IA_PAL_TYPES_ISP_H_
+#define IA_PAL_TYPES_ISP_H_
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+/*!
+ * \brief Common header for all PAL output data structures.
+ */
+typedef struct
+{
+    int uuid;                   /*!< UUID of PAL output. Indicates, which ISP block configuration this record contains. */
+    int size;                   /*!< Size of PAL output for a particular kernel. */
+    bool update;                /*!< Flag indicating if PAL calculations updated results. */
+    char enable;                /*!< Three-state kernel enable (passthrough, enable, disable) */
+    unsigned int run_time_diff; /*!< Time difference since these PAL results were previously calculated. */
+    unsigned short width;       /*!< Input width of frame for this ISP block. */
+    unsigned short height;      /*!< Input height of frame for this ISP block. */
+} ia_pal_record_header;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* IA_PAL_TYPES_ISP_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_ids_autogen.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_ids_autogen.h
new file mode 100644
index 000000000000..c4f5fe069f29
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_ids_autogen.h
@@ -0,0 +1,360 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+#include <stdint.h>
+#include <memory.h>
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+typedef enum
+{
+    ia_pal_uuid_isp_acm_1_1 = 13026,
+    ia_pal_uuid_isp_aestatistics_2_0 = 26055,
+    ia_pal_uuid_isp_aestatistics_2_1 = 55073,
+    ia_pal_uuid_isp_af_awb_frstatistics_2_0 = 13395,
+    ia_pal_uuid_isp_awbstatistics_2_0 = 33260,
+    ia_pal_uuid_isp_b2i_bnr_1_0 = 8682,
+    ia_pal_uuid_isp_b2i_dm_1_0 = 64138,
+    ia_pal_uuid_isp_b2i_ds_1_0_0 = 10497,
+    ia_pal_uuid_isp_b2i_ds_1_0_1 = 20739,
+    ia_pal_uuid_isp_b2i_sie_1_0 = 58817,
+    ia_pal_uuid_isp_b2i_sie_1_1 = 42944,
+    ia_pal_uuid_isp_bnlm_3_0 = 41108,
+    ia_pal_uuid_isp_bnlm_3_1 = 2748,
+    ia_pal_uuid_isp_bnlm_3_2 = 48964,
+    ia_pal_uuid_isp_bnlm_3_3 = 21777,
+    ia_pal_uuid_isp_burst_isp = 11827,
+    ia_pal_uuid_isp_bxt_3a_ccm = 15593,
+    ia_pal_uuid_isp_bxt_acm = 13506,
+    ia_pal_uuid_isp_bxt_aestatistics = 21985,
+    ia_pal_uuid_isp_bxt_af_awb_fr_statistics = 21650,
+    ia_pal_uuid_isp_bxt_applycorrection = 45482,
+    ia_pal_uuid_isp_bxt_awbstatistics = 10104,
+    ia_pal_uuid_isp_bxt_blc = 11700,
+    ia_pal_uuid_isp_bxt_blc_b = 26932,
+    ia_pal_uuid_isp_bxt_blc_c = 18168,
+    ia_pal_uuid_isp_bxt_bnlm = 54605,
+    ia_pal_uuid_isp_bxt_ccm = 16559,
+    ia_pal_uuid_isp_bxt_convert16sto8u = 48932,
+    ia_pal_uuid_isp_bxt_cropstills = 34611,
+    ia_pal_uuid_isp_bxt_cropvideo = 42997,
+    ia_pal_uuid_isp_bxt_csc = 31704,
+    ia_pal_uuid_isp_bxt_csc_yuv2rgb = 1391,
+    ia_pal_uuid_isp_bxt_csc2 = 39659,
+    ia_pal_uuid_isp_bxt_demosaic = 48695,
+    ia_pal_uuid_isp_bxt_disparity = 55093,
+    ia_pal_uuid_isp_bxt_dpc = 23342,
+    ia_pal_uuid_isp_bxt_dpcm_decode = 16046,
+    ia_pal_uuid_isp_bxt_dpcm_encode = 11653,
+    ia_pal_uuid_isp_bxt_dvsstatistics = 10794,
+    ia_pal_uuid_isp_bxt_gammatm = 44304,
+    ia_pal_uuid_isp_bxt_gridbaseob = 46517,
+    ia_pal_uuid_isp_bxt_gridbaseob_b = 28979,
+    ia_pal_uuid_isp_bxt_gridbaseob_c = 18935,
+    ia_pal_uuid_isp_bxt_inputscaler = 29163,
+    ia_pal_uuid_isp_bxt_inputscalerv2 = 10913,
+    ia_pal_uuid_isp_bxt_isl_inputcrop = 42521,
+    ia_pal_uuid_isp_bxt_linearization = 33288,
+    ia_pal_uuid_isp_bxt_lsc = 53711,
+    ia_pal_uuid_isp_bxt_norm_lin = 64791,
+    ia_pal_uuid_isp_bxt_norm_lin_b = 1034,
+    ia_pal_uuid_isp_bxt_norm_lin_c = 20905,
+    ia_pal_uuid_isp_bxt_ofa_dp = 18729,
+    ia_pal_uuid_isp_bxt_ofa_mp = 5232,
+    ia_pal_uuid_isp_bxt_ofa_ppp = 19509,
+    ia_pal_uuid_isp_bxt_paddingsupport = 65094,
+    ia_pal_uuid_isp_bxt_pafstatistics = 21380,
+    ia_pal_uuid_isp_bxt_pixelformatter = 15205,
+    ia_pal_uuid_isp_bxt_pixprecadapter = 15868,
+    ia_pal_uuid_isp_bxt_pixprecadapter_postvcr = 64780,
+    ia_pal_uuid_isp_bxt_pixprecadapter_precropstills = 29575,
+    ia_pal_uuid_isp_bxt_pixprecadapter_precropvideo = 13533,
+    ia_pal_uuid_isp_bxt_pixprecadapter_precsc2 = 60774,
+    ia_pal_uuid_isp_bxt_pixprecadapter_pregdc = 12215,
+    ia_pal_uuid_isp_bxt_pixprecadapter_prevcud = 23002,
+    ia_pal_uuid_isp_bxt_pixprecadapter_prewb = 20178,
+    ia_pal_uuid_isp_bxt_rynr_collector = 28476,
+    ia_pal_uuid_isp_bxt_rynr_splitter = 61356,
+    ia_pal_uuid_isp_bxt_shift14to16bit = 49150,
+    ia_pal_uuid_isp_bxt_tnr5v1 = 43225,
+    ia_pal_uuid_isp_bxt_vcr = 21834,
+    ia_pal_uuid_isp_bxt_vcr2 = 5194,
+    ia_pal_uuid_isp_bxt_vcsc = 60680,
+    ia_pal_uuid_isp_bxt_vcsc_stills = 21171,
+    ia_pal_uuid_isp_bxt_vcsc_video = 11176,
+    ia_pal_uuid_isp_bxt_vcud = 17897,
+    ia_pal_uuid_isp_bxt_wb = 32398,
+    ia_pal_uuid_isp_bxt_wb_stills = 47444,
+    ia_pal_uuid_isp_bxt_xnr4_m = 19837,
+    ia_pal_uuid_isp_bxt_xnr4_mh = 47865,
+    ia_pal_uuid_isp_call_info = 28030,
+    ia_pal_uuid_isp_cas_1_0 = 22660,
+    ia_pal_uuid_isp_ccm_3a_2_0 = 62344,
+    ia_pal_uuid_isp_comp_spliter = 35257,
+    ia_pal_uuid_isp_compand_1_0 = 35311,
+    ia_pal_uuid_isp_crop_sis = 12166,
+    ia_pal_uuid_isp_cvt_1_0 = 5505,
+    ia_pal_uuid_isp_debug_info = 12967,
+    ia_pal_uuid_isp_decompand_1_0 = 55624,
+    ia_pal_uuid_isp_dehaze_1_0 = 58873,
+    ia_pal_uuid_isp_dma_cropper_dp = 47638,
+    ia_pal_uuid_isp_dma_cropper_mp = 27230,
+    ia_pal_uuid_isp_dma_cropper_ppp = 49162,
+    ia_pal_uuid_isp_dol_1_0 = 11842,
+    ia_pal_uuid_isp_dol_2_0 = 11890,
+    ia_pal_uuid_isp_dol_mapper = 17361,
+    ia_pal_uuid_isp_dol_parser = 44843,
+    ia_pal_uuid_isp_dpc_1_1 = 51918,
+    ia_pal_uuid_isp_dpc_1_3 = 23488,
+    ia_pal_uuid_isp_dpc_2_0 = 5679,
+    ia_pal_uuid_isp_drc_1 = 29204,
+    ia_pal_uuid_isp_drc_2 = 4091,
+    ia_pal_uuid_isp_ds_dynamic = 8249,
+    ia_pal_uuid_isp_dvsstatistics_2 = 37235,
+    ia_pal_uuid_isp_espa_1_0 = 47319,
+    ia_pal_uuid_isp_espa_1_1 = 41663,
+    ia_pal_uuid_isp_espa_isa_bayer_a = 1326,
+    ia_pal_uuid_isp_espa_isa_ir_md = 37592,
+    ia_pal_uuid_isp_espa_isa_sis_a = 59281,
+    ia_pal_uuid_isp_espa_isa_sis_b = 52347,
+    ia_pal_uuid_isp_espa_isa_wb = 63427,
+    ia_pal_uuid_isp_espa_isa_yuv_a = 33409,
+    ia_pal_uuid_isp_espa_isa_yuv_b = 58945,
+    ia_pal_uuid_isp_espa_isa_yuv_c = 45072,
+    ia_pal_uuid_isp_espa_psa_1 = 11719,
+    ia_pal_uuid_isp_espa_psa_4 = 36228,
+    ia_pal_uuid_isp_espa_psa_5 = 33315,
+    ia_pal_uuid_isp_espa_psa_c = 41410,
+    ia_pal_uuid_isp_espa_psa_d = 19387,
+    ia_pal_uuid_isp_espa_psa_e = 40191,
+    ia_pal_uuid_isp_espa_psa_f = 56948,
+    ia_pal_uuid_isp_espa_psa_g = 17153,
+    ia_pal_uuid_isp_espa_psa_h = 11266,
+    ia_pal_uuid_isp_exy = 35008,
+    ia_pal_uuid_isp_fr_grid_1_0 = 26958,
+    ia_pal_uuid_isp_gammastar_1 = 42751,
+    ia_pal_uuid_isp_gammatm_v3 = 57496,
+    ia_pal_uuid_isp_gd_dpc_2_1 = 22642,
+    ia_pal_uuid_isp_gdc3 = 14376,
+    ia_pal_uuid_isp_gdc3_1 = 15925,
+    ia_pal_uuid_isp_gdc3_1_1 = 35089,
+    ia_pal_uuid_isp_gdc4_2 = 55837,
+    ia_pal_uuid_isp_gdc5 = 41165,
+    ia_pal_uuid_isp_gdc7 = 12364,
+    ia_pal_uuid_isp_gdc_sp = 44006,
+    ia_pal_uuid_isp_glim_1_0 = 55620,
+    ia_pal_uuid_isp_glim_2_0 = 36029,
+    ia_pal_uuid_isp_gltm_1_0 = 60649,
+    ia_pal_uuid_isp_gltm_2_0 = 54721,
+    ia_pal_uuid_isp_gmv_statistics_1_0 = 54420,
+    ia_pal_uuid_isp_hdr_blc_1 = 40166,
+    ia_pal_uuid_isp_hdr_pwldecomp_1 = 41666,
+    ia_pal_uuid_isp_hdr_sqrtcomp_2 = 31478,
+    ia_pal_uuid_isp_hdr_sqrtcomp_3 = 63941,
+    ia_pal_uuid_isp_hdr_stitch_1w = 15195,
+    ia_pal_uuid_isp_hdr_wb_1 = 23040,
+    ia_pal_uuid_isp_hdrstats_1 = 23432,
+    ia_pal_uuid_isp_is_odr_a = 11470,
+    ia_pal_uuid_isp_is_odr_b = 55449,
+    ia_pal_uuid_isp_is_odr_c = 50407,
+    ia_pal_uuid_isp_gdc_fp_rifd_yuvn_regs = 18444,
+    ia_pal_uuid_isp_gdc_sp_bodr_yuv4n_regs = 53835,
+    ia_pal_uuid_isp_gdc_sp_rifd_yuv4n_regs = 53402,
+    ia_pal_uuid_isp_ifd_gmv = 53572,
+    ia_pal_uuid_isp_ifd_lsc = 47907,
+    ia_pal_uuid_isp_ifd_pdaf = 37302,
+    ia_pal_uuid_isp_ifd_pipe = 42612,
+    ia_pal_uuid_isp_lbff_crop_espa = 4004,
+    ia_pal_uuid_isp_odr_ae = 6313,
+    ia_pal_uuid_isp_odr_af_std = 62075,
+    ia_pal_uuid_isp_odr_af_sve = 54833,
+    ia_pal_uuid_isp_odr_awb_sat = 49283,
+    ia_pal_uuid_isp_odr_awb_std = 2174,
+    ia_pal_uuid_isp_odr_awb_sve = 37370,
+    ia_pal_uuid_isp_odr_burst_isp = 14707,
+    ia_pal_uuid_isp_odr_cv = 61005,
+    ia_pal_uuid_isp_odr_gmv_feature = 59716,
+    ia_pal_uuid_isp_odr_gmv_match = 51196,
+    ia_pal_uuid_isp_odr_ir = 35969,
+    ia_pal_uuid_isp_odr_output_me = 11628,
+    ia_pal_uuid_isp_odr_output_ps = 61310,
+    ia_pal_uuid_isp_odr_pdaf = 53935,
+    ia_pal_uuid_isp_ofs_dp_bodr_regs = 59297,
+    ia_pal_uuid_isp_ofs_mp_bodr_regs = 42394,
+    ia_pal_uuid_isp_ofs_pp_bodr_regs = 2519,
+    ia_pal_uuid_isp_sdp_left_ifd = 49194,
+    ia_pal_uuid_isp_sdp_right_ifd = 24589,
+    ia_pal_uuid_isp_sdp_image_out0_odr = 53124,
+    ia_pal_uuid_isp_sdp_image_pp_odr = 26203,
+    ia_pal_uuid_isp_sdp_map_odr = 14789,
+    ia_pal_uuid_isp_slim_tnr_fp_blend_bifd_yuvnm1_regs = 20364,
+    ia_pal_uuid_isp_slim_tnr_sp_bc_bifd_rs4nm1_regs = 44594,
+    ia_pal_uuid_isp_slim_tnr_sp_bc_bifd_yuv4nm1_regs = 50322,
+    ia_pal_uuid_isp_slim_tnr_spatial_bifd_yuvn_regs = 2937,
+    ia_pal_uuid_isp_tnr_fp_blend_bifd_rs4n_regs = 16783,
+    ia_pal_uuid_isp_tnr_fp_bodr_yuvn_regs = 38223,
+    ia_pal_uuid_isp_tnr_mc_fp_bifd_mv16n_regs = 64647,
+    ia_pal_uuid_isp_tnr_mc_fp_rifd_yuvnm1_regs = 29456,
+    ia_pal_uuid_isp_tnr_scale_fp_bodr_yuv4n_regs = 57717,
+    ia_pal_uuid_isp_tnr_scale_sp_bifd_y4n_regs = 21311,
+    ia_pal_uuid_isp_tnr_scale_sp_bodr_y16n_regs = 2778,
+    ia_pal_uuid_isp_tnr_sp_bc_bifd_yuv4n_regs = 40140,
+    ia_pal_uuid_isp_tnr_sp_bc_bodr_rs4n_regs = 11735,
+    ia_pal_uuid_isp_tnr_sp_bc_bifd_mv16n_regs = 17714,
+    ia_pal_uuid_isp_tnr_sp_cme_lifd_y16n_regs = 33626,
+    ia_pal_uuid_isp_tnr_sp_cme_lifd_y16nm1_regs = 53417,
+    ia_pal_uuid_isp_tnr_sp_mc1_rifd_y4nm1_regs = 59712,
+    ia_pal_uuid_isp_tnr_sp_mc2_bifd_mv16n_regs = 57592,
+    ia_pal_uuid_isp_tnr_sp_mc2_rifd_rs4nm1_regs = 24719,
+    ia_pal_uuid_isp_tnr_sp_mc2_rifd_yuv4nm1_regs = 32735,
+    ia_pal_uuid_isp_tnr_sp_rme_bifd_y4n_regs = 50769,
+    ia_pal_uuid_isp_tnr_sp_rme_bodr_mv16n_regs = 3636,
+    ia_pal_uuid_isp_visp_metadata_sodr_regs = 16898,
+    ia_pal_uuid_isp_visp_pixels_bodr_regs = 19495,
+    ia_pal_uuid_isp_irs_1_0 = 16993,
+    ia_pal_uuid_isp_lca_1_0 = 25352,
+    ia_pal_uuid_isp_ldr_blc_1 = 12439,
+    ia_pal_uuid_isp_ldr_wb_1 = 8496,
+    ia_pal_uuid_isp_linearization2_0 = 10326,
+    ia_pal_uuid_isp_linearization2_0_b = 42416,
+    ia_pal_uuid_isp_linearization2_0_c = 28552,
+    ia_pal_uuid_isp_linearization2hdr = 19752,
+    ia_pal_uuid_isp_linearizationdg_dss = 38566,
+    ia_pal_uuid_isp_linearizationwb_dss = 41930,
+    ia_pal_uuid_isp_lossycomp_1_0 = 62606,
+    ia_pal_uuid_isp_lossydecomp_1_0 = 41948,
+    ia_pal_uuid_isp_lsc_1_1 = 16882,
+    ia_pal_uuid_isp_lsc_1_2 = 2144,
+    ia_pal_uuid_isp_ltm_cd_1_0 = 53308,
+    ia_pal_uuid_isp_ltm_de_gamma_1_0 = 43310,
+    ia_pal_uuid_isp_ltm_fd_1_0 = 6516,
+    ia_pal_uuid_isp_ltm_vrt_ctrl = 34560,
+    ia_pal_uuid_isp_mas = 53441,
+    ia_pal_uuid_isp_mrc_1_0 = 57534,
+    ia_pal_uuid_isp_norm_lin_dss = 48425,
+    ia_pal_uuid_isp_nrf_6_00 = 24924,
+    ia_pal_uuid_isp_nv12reader = 27990,
+    ia_pal_uuid_isp_nv12writer = 15697,
+    ia_pal_uuid_isp_ofa_1_dp = 60197,
+    ia_pal_uuid_isp_ofa_1_mp = 59839,
+    ia_pal_uuid_isp_ofa_1_ppp = 53002,
+    ia_pal_uuid_isp_ofa_2_dp = 18275,
+    ia_pal_uuid_isp_ofa_2_mp = 16233,
+    ia_pal_uuid_isp_ofa_2_ppp = 16427,
+    ia_pal_uuid_isp_outputscaler_2_0_a = 6800,
+    ia_pal_uuid_isp_outputscaler_2_0_b = 51856,
+    ia_pal_uuid_isp_packer_isa_bayer_a = 13215,
+    ia_pal_uuid_isp_packer_isa_yuv_a = 3683,
+    ia_pal_uuid_isp_packer_isa_yuv_b = 5000,
+    ia_pal_uuid_isp_packer_isa_yuv_c = 27259,
+    ia_pal_uuid_isp_padder_bayer_a = 19728,
+    ia_pal_uuid_isp_padder_yuv_a = 40136,
+    ia_pal_uuid_isp_padder_yuv_b = 49213,
+    ia_pal_uuid_isp_padder_yuv_c = 23317,
+    ia_pal_uuid_isp_pafstatistics_1 = 47216,
+    ia_pal_uuid_isp_pafstatistics_1_1 = 38817,
+    ia_pal_uuid_isp_pext_1_0 = 43213,
+    ia_pal_uuid_isp_pix_crop_ir_md = 54005,
+    ia_pal_uuid_isp_pixcomp_1_0 = 4693,
+    ia_pal_uuid_isp_pixelformatter = 41023,
+    ia_pal_uuid_isp_pixelformatter_b = 54735,
+    ia_pal_uuid_isp_pixelformatter_c = 3081,
+    ia_pal_uuid_isp_pixprecadapter_post_sis = 53715,
+    ia_pal_uuid_isp_pixprecadapter_s2v_c = 57170,
+    ia_pal_uuid_isp_pixprecadapter_v2s_4 = 56918,
+    ia_pal_uuid_isp_pme_1_0 = 51711,
+    ia_pal_uuid_isp_pxl_crop_bayer_a = 34076,
+    ia_pal_uuid_isp_pxl_crop_psa = 41874,
+    ia_pal_uuid_isp_pxl_crop_sis_a = 38128,
+    ia_pal_uuid_isp_pxl_crop_sis_b = 3437,
+    ia_pal_uuid_isp_pxl_crop_yuv_a = 9082,
+    ia_pal_uuid_isp_pxl_crop_yuv_b = 33476,
+    ia_pal_uuid_isp_pxl_crop_yuv_c = 64756,
+    ia_pal_uuid_isp_rgb_ir_2_0 = 14488,
+    ia_pal_uuid_isp_rgb_ir_2_1 = 62955,
+    ia_pal_uuid_isp_rgb_ir_2_1_bbb = 39657,
+    ia_pal_uuid_isp_rgbs_grid_1_0 = 18844,
+    ia_pal_uuid_isp_rgbs_statistics_1_0 = 39058,
+    ia_pal_uuid_isp_sc_iefd = 2442,
+    ia_pal_uuid_isp_sc_iefd_v2 = 7320,
+    ia_pal_uuid_isp_sc_outputscaler_dp = 5852,
+    ia_pal_uuid_isp_sc_outputscaler_dp_1_1 = 23205,
+    ia_pal_uuid_isp_sc_outputscaler_ppp = 60118,
+    ia_pal_uuid_isp_sc_outputscaler_ppp_1_1 = 52796,
+    ia_pal_uuid_isp_sc_ylpf = 50844,
+    ia_pal_uuid_isp_sdp_rec = 50882,
+    ia_pal_uuid_isp_sdp_scp = 13630,
+    ia_pal_uuid_isp_see = 15281,
+    ia_pal_uuid_isp_see2 = 55908,
+    ia_pal_uuid_isp_sharpening_1_0 = 25130,
+    ia_pal_uuid_isp_sie_vcsc1_1 = 5286,
+    ia_pal_uuid_isp_sis_1 = 1732,
+    ia_pal_uuid_isp_sis_1_0_a = 44134,
+    ia_pal_uuid_isp_sis_1_0_b = 7487,
+    ia_pal_uuid_isp_spa_sis_a = 13401,
+    ia_pal_uuid_isp_stream2mmio = 33280,
+    ia_pal_uuid_isp_stream2mmio_b = 10400,
+    ia_pal_uuid_isp_stream2mmio_c = 30373,
+    ia_pal_uuid_isp_strm_crop_psa = 45913,
+    ia_pal_uuid_isp_strm_crop_psa_c = 12123,
+    ia_pal_uuid_isp_strm_crop_psa_d = 44733,
+    ia_pal_uuid_isp_strm_crop_psa_e = 1739,
+    ia_pal_uuid_isp_strm_crop_psa_f = 40056,
+    ia_pal_uuid_isp_strm_crop_psa_g = 46549,
+    ia_pal_uuid_isp_strm_crop_psa_h = 42698,
+    ia_pal_uuid_isp_strm_crop_sis_a = 9544,
+    ia_pal_uuid_isp_strm_crop_sis_b = 49322,
+    ia_pal_uuid_isp_sve_1_0 = 11000,
+    ia_pal_uuid_isp_sve_1_1 = 53103,
+    ia_pal_uuid_isp_tnr_6_0 = 64565,
+    ia_pal_uuid_isp_tnr_scale_lb = 33723,
+    ia_pal_uuid_isp_tnr_scale_fp = 60056,
+    ia_pal_uuid_isp_tnr_scale_sp = 44886,
+    ia_pal_uuid_isp_tnr5_21 = 7824,
+    ia_pal_uuid_isp_tnr5_22 = 21293,
+    ia_pal_uuid_isp_tnr5_25 = 41522,
+    ia_pal_uuid_isp_tnr5_3 = 35640,
+    ia_pal_uuid_isp_tnr5_3_1 = 43630,
+    ia_pal_uuid_isp_tnr7_bc_1_0 = 65198,
+    ia_pal_uuid_isp_tnr7_blend_1_0 = 32696,
+    ia_pal_uuid_isp_tnr7_cme_1_0 = 28470,
+    ia_pal_uuid_isp_tnr7_ims_1_0 = 4720,
+    ia_pal_uuid_isp_tnr7_mc_1_0 = 1886,
+    ia_pal_uuid_isp_tnr_sp_mc2 = 43550,
+    ia_pal_uuid_isp_tnr7_rme_1_0 = 8230,
+    ia_pal_uuid_isp_tnr7_spatial_1_0 = 3133,
+    ia_pal_uuid_isp_tvs_1_0 = 64291,
+    ia_pal_uuid_isp_vcr_3_1 = 36035,
+    ia_pal_uuid_isp_vcr3 = 32600,
+    ia_pal_uuid_isp_vcsc_2_0 = 6086,
+    ia_pal_uuid_isp_vcsc_2_0_b = 13708,
+    ia_pal_uuid_isp_vcsc_2_0_c = 21802,
+    ia_pal_uuid_isp_vertical_padding_1_0 = 54484,
+    ia_pal_uuid_isp_vltm_1_0 = 20302,
+    ia_pal_uuid_isp_wb_1_1 = 5144,
+    ia_pal_uuid_isp_wb_sis = 1689,
+    ia_pal_uuid_isp_x2i_md_1_0 = 59520,
+    ia_pal_uuid_isp_xnr_5_1 = 40137,
+    ia_pal_uuid_isp_xnr_5_2 = 58858,
+    ia_pal_uuid_isp_xnr_dss = 42418,
+
+} ia_pal_uuid;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_parameters_autogen.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_parameters_autogen.h
new file mode 100644
index 000000000000..a89fd0efc0c6
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_parameters_autogen.h
@@ -0,0 +1,16093 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+#include <stdint.h>
+#include <memory.h>
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+
+/*! \isp struct acm_1_1
+
+*/
+typedef struct
+{
+    /*!< bypass Block bypass for HW use*/
+    int32_t bypass;
+    /*!< enable_chroma_lut Enable Chroma adaptation by LUT*/
+    int32_t enable_chroma_lut;
+    /*!< enable_luma_lut Enable Luma adaptation by LUT*/
+    int32_t enable_luma_lut;
+    /*!< enable_negative_pixels enable negative pixels in output*/
+    int32_t enable_negative_pixels;
+    /*!< enable_chroma_low_light_mode Enable Chroma adaptation in low light mode*/
+    int32_t enable_chroma_low_light_mode;
+    /*!< enable_luma_low_light_mode Enable Luma adaptation in low light mode*/
+    int32_t enable_luma_low_light_mode;
+    /*!< num_of_sectors number of sectors, U5.0*/
+    int32_t num_of_sectors;
+    /*!< chromagrid2uniformlut_cu_x[9] U12.0*/
+    int32_t chromagrid2uniformlut_cu_x[9];
+    /*!< chromagrid2uniformlut_cu_a[8] S4.10*/
+    int32_t chromagrid2uniformlut_cu_a[8];
+    /*!< lumagrid2uniformlut_cu_x[9] U12.0*/
+    int32_t lumagrid2uniformlut_cu_x[9];
+    /*!< lumagrid2uniformlut_cu_a[8] S4.10*/
+    int32_t lumagrid2uniformlut_cu_a[8];
+    /*!< ccm_matrix_arr[216] CCM's table (one per sector), S3.11*/
+    int32_t ccm_matrix_arr[216];
+    /*!< hue_boundary_arr[24] Table of sectors boundaries, U11.0*/
+    int32_t hue_boundary_arr[24];
+    /*!< ccm_index_arr[25] Table of the sectors indices, U5.0*/
+    int32_t ccm_index_arr[25];
+    /*!< offr CCM bias for R, S13.0*/
+    int32_t offr;
+    /*!< offg CCM bias for G, S13.0*/
+    int32_t offg;
+    /*!< offb CCM bias for B, S13.0*/
+    int32_t offb;
+    /*!< luma_coeff_arr[3] Luna coefficients (weights), U0.8*/
+    int32_t luma_coeff_arr[3];
+    /*!< adapt_chroma_lut[81] Chroma adaptation LUT, U2.7*/
+    int32_t adapt_chroma_lut[81];
+    /*!< adapt_luma_lut[81] Luma adaptation LUT, S13.0*/
+    int32_t adapt_luma_lut[81];
+    /*!< enable_low_light_mode Enable CC's adaptation low light mode*/
+    int32_t enable_low_light_mode;
+    /*!< enable_compand enable for the (de)companding*/
+    int32_t enable_compand;
+    /*!< cu_compression_x[13] U.24 linear, default log-limited*/
+    int32_t cu_compression_x[13];
+    /*!< cu_compression_y[12] U.15 companded output*/
+    int32_t cu_compression_y[12];
+    /*!< cu_compression_slope[12] U1.14 15bit slopes for companding*/
+    int32_t cu_compression_slope[12];
+    /*!< cu_decompression_x[13] U.15 companded input, default log-limited*/
+    int32_t cu_decompression_x[13];
+    /*!< cu_decompression_y[12] U.24 linear*/
+    int32_t cu_decompression_y[12];
+    /*!< cu_decompression_slope[12] U20.6 26bit slopes for decompanding*/
+    int32_t cu_decompression_slope[12];
+    /*!< linear_pedestal Pedestal subtracted (and added later) in linear domain, U.24*/
+    int32_t linear_pedestal;
+    /*!< use_pedestal If true, pedestal is used and the companded signal should be U15. If false, linear_pedestal should be 0*/
+    int32_t use_pedestal;
+
+} ia_pal_isp_acm_1_1_t;
+
+/*! \isp struct aestatistics_2_0
+AE Statistics (histogram)
+*/
+typedef struct
+{
+    /*!< cell0[96] weighted histogram grid values*/
+    int32_t cell0[96];
+    /*!< cell1[96] weighted histogram grid values*/
+    int32_t cell1[96];
+    /*!< cell2[96] weighted histogram grid values*/
+    int32_t cell2[96];
+    /*!< cell3[96] weighted histogram grid values*/
+    int32_t cell3[96];
+    /*!< cell4[96] weighted histogram grid values*/
+    int32_t cell4[96];
+    /*!< cell5[96] weighted histogram grid values*/
+    int32_t cell5[96];
+    /*!< cell6[96] weighted histogram grid values*/
+    int32_t cell6[96];
+    /*!< cell7[96] weighted histogram grid values*/
+    int32_t cell7[96];
+    /*!< grid_width represents number of horizontal grid cells*/
+    int32_t grid_width;
+    /*!< grid_height represents number of vertical grid cells*/
+    int32_t grid_height;
+    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128, 256)*/
+    int32_t block_width;
+    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128, 256)*/
+    int32_t block_height;
+    /*!< ae_en 0: FF will not write to the AE  array; 1: FF will write*/
+    int32_t ae_en;
+    /*!< rst_hist_array 1: triggers the reset mechanism for the GLB_HIST*/
+    int32_t rst_hist_array;
+    /*!< x_start X top left corner of the grid*/
+    int32_t x_start;
+    /*!< y_start Y top left corner of the grid*/
+    int32_t y_start;
+    /*!< x_end X bottom right corner of the grid*/
+    int32_t x_end;
+    /*!< y_end Y bottom right corner of the grid*/
+    int32_t y_end;
+    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/
+    int32_t sensor_mode;
+    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_00;
+    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_01;
+    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_02;
+    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_03;
+    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_10;
+    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_11;
+    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_12;
+    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_13;
+    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_20;
+    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_21;
+    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_22;
+    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_23;
+    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_30;
+    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_31;
+    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_32;
+    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_33;
+    /*!< shift_id[8] shifter for the histograms per color channel*/
+    int32_t shift_id[8];
+
+} ia_pal_isp_aestatistics_2_0_t;
+
+/*! \isp struct aestatistics_2_1
+AE Statistics (histogram)
+*/
+typedef struct
+{
+    /*!< cell0[96] weighted histogram grid values*/
+    int32_t cell0[96];
+    /*!< cell1[96] weighted histogram grid values*/
+    int32_t cell1[96];
+    /*!< cell2[96] weighted histogram grid values*/
+    int32_t cell2[96];
+    /*!< cell3[96] weighted histogram grid values*/
+    int32_t cell3[96];
+    /*!< cell4[96] weighted histogram grid values*/
+    int32_t cell4[96];
+    /*!< cell5[96] weighted histogram grid values*/
+    int32_t cell5[96];
+    /*!< cell6[96] weighted histogram grid values*/
+    int32_t cell6[96];
+    /*!< cell7[96] weighted histogram grid values*/
+    int32_t cell7[96];
+    /*!< grid_width represents number of horizontal grid cells*/
+    int32_t grid_width;
+    /*!< grid_height represents number of vertical grid cells*/
+    int32_t grid_height;
+    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128, 256)*/
+    int32_t block_width;
+    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128, 256)*/
+    int32_t block_height;
+    /*!< ae_en 0: FF will not write to the AE  array; 1: FF will write*/
+    int32_t ae_en;
+    /*!< rst_hist_array 1: triggers the reset mechanism for the GLB_HIST*/
+    int32_t rst_hist_array;
+    /*!< x_start X top left corner of the grid*/
+    int32_t x_start;
+    /*!< y_start Y top left corner of the grid*/
+    int32_t y_start;
+    /*!< x_end X bottom right corner of the grid*/
+    int32_t x_end;
+    /*!< y_end Y bottom right corner of the grid*/
+    int32_t y_end;
+    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/
+    int32_t sensor_mode;
+    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_00;
+    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_01;
+    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_02;
+    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_03;
+    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_10;
+    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_11;
+    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_12;
+    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_13;
+    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_20;
+    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_21;
+    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_22;
+    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_23;
+    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_30;
+    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_31;
+    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_32;
+    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_33;
+    /*!< shift_id[8] shifter for the histograms per color channel*/
+    int32_t shift_id[8];
+
+} ia_pal_isp_aestatistics_2_1_t;
+
+/*! \isp struct af_awb_frstatistics_2_0
+
+*/
+typedef struct
+{
+    /*!< grid_width represents number of horizontal grid cells*/
+    int32_t grid_width;
+    /*!< grid_height represents number of vertical grid cells*/
+    int32_t grid_height;
+    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128,256)*/
+    int32_t block_width;
+    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128,256)*/
+    int32_t block_height;
+    /*!< grid_height_per_slice # of blocks in vert.axis per Meta-Data Slice*/
+    int32_t grid_height_per_slice;
+    /*!< y_fr_en 0: FF will not write to the Y  array; 1: FF will write  to the Y  array*/
+    int32_t y_fr_en;
+    /*!< awb_fr_en 0: FF will not write to the AWB_FR  array; 1: FF will write  to the AWB_FR  array*/
+    int32_t awb_fr_en;
+    /*!< x_start X top left corner of the grid*/
+    int32_t x_start;
+    /*!< y_start Y top left corner of the grid*/
+    int32_t y_start;
+    /*!< x_end X bottom right corner of the grid*/
+    int32_t x_end;
+    /*!< y_end Y bottom right corner of the grid*/
+    int32_t y_end;
+    /*!< shftr_val_x[7] Log2(num pixels of estimated colour component in a block). The binding as follows: m_ShftR_val_Y00 = shftr_val_x[0]; m_ShftR_val_Y01 = shftr_val_x[1];m_ShftR_val_Y10 = shftr_val_x[2];m_ShftR_val_Y11 = shftr_val_x[3];m_ShftR_val_R = shftr_val_x[4];m_ShftR_val_G = shftr_val_x[5];m_ShftR_val_B = shftr_val_x[6];*/
+    int32_t shftr_val_x[7];
+    /*!< gx_0[4] gx0 Y_calc contribution ratio for Pat_ij*/
+    int32_t gx_0[4];
+    /*!< gx_1[4] gx1 Y_calc contribution ratio for Pat_ij*/
+    int32_t gx_1[4];
+    /*!< gx_2[4] gx2 Y_calc contribution ratio for Pat_ij*/
+    int32_t gx_2[4];
+    /*!< gx_3[4] gx3 Y_calc contribution ratio for Pat_ij*/
+    int32_t gx_3[4];
+    /*!< mask_y0 selecting the relevant pixels for Y0; bit k = row * 4 + column*/
+    int32_t mask_y0;
+    /*!< mask_y1 selecting the relevant pixels for Y1; bit k = row * 4 + column*/
+    int32_t mask_y1;
+    /*!< oe_y0 output enable for Y0; bit k corresponds to row * 2 + column*/
+    int32_t oe_y0;
+    /*!< oe_y1 output enable for Y1; bit k corresponds to row * 2 + column*/
+    int32_t oe_y1;
+    /*!< on_x_y0[4] Y0 estimation normalization (00, 01, 10, 11)*/
+    int32_t on_x_y0[4];
+    /*!< on_x_y1[4] Y1 estimation normalization (00, 01, 10, 11)*/
+    int32_t on_x_y1[4];
+    /*!< r_select selecting the relevant R pixels; bit k corresponds to Row * 4 + Column*/
+    int32_t r_select;
+    /*!< g_select selecting the relevant G pixels; bit k corresponds to Row * 4 + Column*/
+    int32_t g_select;
+    /*!< b_select selecting the relevant B pixels; bit k corresponds to Row * 4 + Column*/
+    int32_t b_select;
+    /*!< y00_filter_coeff[6] filter coefficients for Y00 (A1, A2, A3, A4, A5, A6)*/
+    int32_t y00_filter_coeff[6];
+    /*!< y00_filter_sign_vec sign vector for Y00*/
+    int32_t y00_filter_sign_vec;
+    /*!< y01_filter_coeff[6] filter coefficients for Y01 (A1, A2, A3, A4, A5, A6)*/
+    int32_t y01_filter_coeff[6];
+    /*!< y01_filter_sign_vec sign vector for Y01*/
+    int32_t y01_filter_sign_vec;
+    /*!< y10_filter_coeff[6] filter coefficients for Y10 (A1, A2, A3, A4, A5, A6)*/
+    int32_t y10_filter_coeff[6];
+    /*!< y10_filter_sign_vec sign vector for Y10*/
+    int32_t y10_filter_sign_vec;
+    /*!< y11_filter_coeff[6] filter coefficients for Y11 (A1, A2, A3, A4, A5, A6)*/
+    int32_t y11_filter_coeff[6];
+    /*!< y11_filter_sign_vec sign vector for Y11*/
+    int32_t y11_filter_sign_vec;
+    /*!< r_filter_coeff[6] filter coefficients for R (A1, A2, A3, A4, A5, A6)*/
+    int32_t r_filter_coeff[6];
+    /*!< r_filter_sign_vec sign vector for R*/
+    int32_t r_filter_sign_vec;
+    /*!< g_filter_coeff[6] filter coefficients for G (A1, A2, A3, A4, A5, A6)*/
+    int32_t g_filter_coeff[6];
+    /*!< g_filter_sign_vec sign vector for G*/
+    int32_t g_filter_sign_vec;
+    /*!< b_filter_coeff[6] filter coefficients for B (A1, A2, A3, A4, A5, A6)*/
+    int32_t b_filter_coeff[6];
+    /*!< b_filter_sign_vec sign vector for B*/
+    int32_t b_filter_sign_vec;
+    /*!< nf_x[7] Filter response normalization factors for Y00, Y01, Y10, Y11, R, G, B*/
+    int32_t nf_x[7];
+    /*!< sensor_mode Sensor mode 0: 1x1,  1: 2x2, 2: 4x4*/
+    int32_t sensor_mode;
+    /*!< downscaling_factor Downscaling factor 0: 1x, 1: 2x, 2: 4x*/
+    int32_t downscaling_factor;
+    /*!< y00_blending_weight Median filter weight for Y00*/
+    int32_t y00_blending_weight;
+    /*!< y01_blending_weight Median filter weight for Y01*/
+    int32_t y01_blending_weight;
+    /*!< y10_blending_weight Median filter weight for Y10*/
+    int32_t y10_blending_weight;
+    /*!< y11_blending_weight Median filter weight for Y11*/
+    int32_t y11_blending_weight;
+
+} ia_pal_isp_af_awb_frstatistics_2_0_t;
+
+/*! \isp struct awbstatistics_2_0
+AWB Statistics (RGBS grid)
+*/
+typedef struct
+{
+    /*!< grid_width represents number of horizontal grid cells*/
+    int32_t grid_width;
+    /*!< grid_height represents number of vertical grid cells*/
+    int32_t grid_height;
+    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128)*/
+    int32_t block_width;
+    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128)*/
+    int32_t block_height;
+    /*!< grid_height_per_slice # of blocks in vert.axis per Meta-Data Slice (grid_height_per_slice * grid_width <= 192)*/
+    int32_t grid_height_per_slice;
+    /*!< awb_en 0: FF will not write to the AWB  array; 1: FF will write*/
+    int32_t awb_en;
+    /*!< rgbs_incl_sat 0: do not include saturated quads in the average; 1: include saturated quads in the average*/
+    int32_t rgbs_incl_sat;
+    /*!< x_start X top left corner of the grid. 0 <= x_start <= (frame_width - 1)*/
+    int32_t x_start;
+    /*!< y_start Y top left corner of the grid. 0 <= y_start <= (frame_height - 1)*/
+    int32_t y_start;
+    /*!< x_end X bottom right corner of the grid. x_end = x_start + (grid_width << block_width) - 1*/
+    int32_t x_end;
+    /*!< y_end Y bottom right corner of the grid. y_end = y_start + (grid_height << block_height) - 1*/
+    int32_t y_end;
+    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/
+    int32_t sensor_mode;
+    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_00;
+    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_01;
+    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_02;
+    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_03;
+    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_10;
+    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_11;
+    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_12;
+    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_13;
+    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_20;
+    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_21;
+    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_22;
+    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_23;
+    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_30;
+    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_31;
+    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_32;
+    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_33;
+    /*!< rgbs_thr_cx[8] RGBS threshold value (C0, C1, C2, C3, C4, C5, C6, C7)*/
+    int32_t rgbs_thr_cx[8];
+    /*!< shftr_val_cx[8] ShiftVal is derived from log2(number of pixels from C0-C7 color channel in a cell)*/
+    int32_t shftr_val_cx[8];
+    /*!< shftr_sat represents log2(num of pixels in cell)*/
+    int32_t shftr_sat;
+    /*!< output_packed Enabling Output packing. Use 0 if ColorID [0 3] are used, Use 1 if all ColorIDs i.e. [0 7] are used (i.e. multi-exposure (e.g. SVE) use-cases)*/
+    int32_t output_packed;
+
+} ia_pal_isp_awbstatistics_2_0_t;
+
+/*! \isp struct b2i_bnr_1_0
+
+*/
+typedef struct
+{
+    /*!< enable enable B2I-BNR filter*/
+    int32_t enable;
+    /*!< bayer_noise_mod_poiss_coeff denoise: noise model alpha - TH=alpha*sqrt(gain*I)+beta*gain*sigma+gamma+texture(I)*/
+    int32_t bayer_noise_mod_poiss_coeff;
+    /*!< bayer_noise_mod_gauss_coeff denoise: noise model beta - TH=alpha*sqrt(gain*I)+beta*gain*sigma+gamma+texture(I)*/
+    int32_t bayer_noise_mod_gauss_coeff;
+    /*!< bayer_noise_mod_gain_gr denoise: noise model gain for gr - TH=alpha*sqrt(gain*I)+beta*gain*sigma+gamma+texture(I)*/
+    int32_t bayer_noise_mod_gain_gr;
+    /*!< bayer_noise_mod_gain_r denoise: noise model gain for r - TH=alpha*sqrt(gain*I)+beta*gain*sigma+gamma+texture(I)*/
+    int32_t bayer_noise_mod_gain_r;
+    /*!< bayer_noise_mod_gain_b denoise: noise model gain for b - TH=alpha*sqrt(gain*I)+beta*gain*sigma+gamma+texture(I)*/
+    int32_t bayer_noise_mod_gain_b;
+    /*!< bayer_noise_mod_gain_gb denoise: noise model gain for gb - TH=alpha*sqrt(gain*I)+beta*gain*sigma+gamma+texture(I)*/
+    int32_t bayer_noise_mod_gain_gb;
+    /*!< bayer_noise_spatial_Gcoeff[4] denoise: spatial kernel coefficients for G pixels*/
+    int32_t bayer_noise_spatial_Gcoeff[4];
+    /*!< bayer_noise_spatial_Rbcoeff[3] denoise: spatial kernel coefficients for R,B pixels*/
+    int32_t bayer_noise_spatial_Rbcoeff[3];
+    /*!< psdy_noise_th 0-use bayer pixel for noise TH, 1- use psdY pixel for noise TH*/
+    int32_t psdy_noise_th;
+    /*!< radial_x_initial Radial x coordinates of corner*/
+    int32_t radial_x_initial;
+    /*!< radial_y_initial Radial y coordinates of corner*/
+    int32_t radial_y_initial;
+    /*!< radial_coords_prec_reduc radial coordinates precision reduction - to bring sqrX+sqrY to [0-256]*/
+    int32_t radial_coords_prec_reduc;
+    /*!< cu_radial_coeff_gr_x[6] radial coeff function for Gr channel config unit - x values*/
+    int32_t cu_radial_coeff_gr_x[6];
+    /*!< cu_radial_coeff_gr_y[5] radial coeff function for Gr channel config unit - y values*/
+    int32_t cu_radial_coeff_gr_y[5];
+    /*!< cu_radial_coeff_gr_slope[5] radial coeff function for Gr channel config unit - slope values*/
+    int32_t cu_radial_coeff_gr_slope[5];
+    /*!< cu_radial_coeff_r_x[6] radial coeff function for R channel config unit - x values*/
+    int32_t cu_radial_coeff_r_x[6];
+    /*!< cu_radial_coeff_r_y[5] radial coeff function for R channel config unit - y values*/
+    int32_t cu_radial_coeff_r_y[5];
+    /*!< cu_radial_coeff_r_slope[5] radial coeff function for R channel config unit - slope values*/
+    int32_t cu_radial_coeff_r_slope[5];
+    /*!< cu_radial_coeff_b_x[6] radial coeff function for B channel config unit - x values*/
+    int32_t cu_radial_coeff_b_x[6];
+    /*!< cu_radial_coeff_b_y[5] radial coeff function for B channel config unit - y values*/
+    int32_t cu_radial_coeff_b_y[5];
+    /*!< cu_radial_coeff_b_slope[5] radial coeff function for B channel config unit - slope values*/
+    int32_t cu_radial_coeff_b_slope[5];
+    /*!< cu_radial_coeff_gb_x[6] radial coeff function for Gb channel config unit - x values*/
+    int32_t cu_radial_coeff_gb_x[6];
+    /*!< cu_radial_coeff_gb_y[5] radial coeff function for Gb channel config unit - y values*/
+    int32_t cu_radial_coeff_gb_y[5];
+    /*!< cu_radial_coeff_gb_slope[5] radial coeff function for Gb channel config unit - slope values*/
+    int32_t cu_radial_coeff_gb_slope[5];
+
+} ia_pal_isp_b2i_bnr_1_0_t;
+
+/*! \isp struct b2i_dm_1_0
+
+*/
+typedef struct
+{
+    /*!< enable enable B2I-DM filter*/
+    int32_t enable;
+    /*!< local_median_bypass local_median_bypass*/
+    int32_t local_median_bypass;
+    /*!< cas_bypass cas_bypass*/
+    int32_t cas_bypass;
+    /*!< g_int_x_points[2] x_points for green interpolation CU*/
+    int32_t g_int_x_points[2];
+    /*!< g_int_a_points a_points for green interpolation CU*/
+    int32_t g_int_a_points;
+    /*!< g_int_b_points b_points for green interpolation CU*/
+    int32_t g_int_b_points;
+    /*!< cas_x_points[2] x_points for CAS CU*/
+    int32_t cas_x_points[2];
+    /*!< cas_a_points a_points for CAS CU*/
+    int32_t cas_a_points;
+    /*!< cas_b_points b_points for CAS CU*/
+    int32_t cas_b_points;
+    /*!< local_med_x_points[2] x_points forlocal median CU*/
+    int32_t local_med_x_points[2];
+    /*!< local_med_a_points a_points forlocal median CU*/
+    int32_t local_med_a_points;
+    /*!< local_med_b_points b_points forlocal median CU*/
+    int32_t local_med_b_points;
+    /*!< cas_low_level low level of the CAS config unit. [0 , 1024]*/
+    int32_t cas_low_level;
+    /*!< sharp_power power of DM sharpening - higher is more sharp [0 15]*/
+    int32_t sharp_power;
+
+} ia_pal_isp_b2i_dm_1_0_t;
+
+/*! \isp struct b2i_ds_1_0_0
+
+*/
+typedef struct
+{
+    /*!< enable enable scaling filter*/
+    int32_t enable;
+    /*!< scaling_ratio Scaling factor, 16bit fixed point, greater than 1*/
+    int32_t scaling_ratio;
+    /*!< horizontal_offset Position of first output pixel for scaler*/
+    int32_t horizontal_offset;
+    /*!< vertical_offset Position of first output line for scaler*/
+    int32_t vertical_offset;
+    /*!< output_height Output image height for scaler*/
+    int32_t output_height;
+    /*!< output_width Output image width for scaler*/
+    int32_t output_width;
+    /*!< vkernel_LUT[129] interpolation vertical kernel coefficients for scaler*/
+    int32_t vkernel_LUT[129];
+    /*!< hkernel_LUT[129] interpolation horizontal kernel coefficients for scaler*/
+    int32_t hkernel_LUT[129];
+    /*!< input_height input image height*/
+    int32_t input_height;
+
+} ia_pal_isp_b2i_ds_1_0_0_t;
+
+/*! \isp struct b2i_ds_1_0_1
+
+*/
+typedef struct
+{
+    /*!< enable enable scaling filter*/
+    int32_t enable;
+    /*!< scaling_ratio Scaling factor, 16bit fixed point, greater than 1*/
+    int32_t scaling_ratio;
+    /*!< horizontal_offset Position of first output pixel for scaler*/
+    int32_t horizontal_offset;
+    /*!< vertical_offset Position of first output line for scaler*/
+    int32_t vertical_offset;
+    /*!< output_height Output image height for scaler*/
+    int32_t output_height;
+    /*!< output_width Output image width for scaler*/
+    int32_t output_width;
+    /*!< vkernel_LUT[129] interpolation vertical kernel coefficients for scaler*/
+    int32_t vkernel_LUT[129];
+    /*!< hkernel_LUT[129] interpolation horizontal kernel coefficients for scaler*/
+    int32_t hkernel_LUT[129];
+    /*!< input_height input image height*/
+    int32_t input_height;
+
+} ia_pal_isp_b2i_ds_1_0_1_t;
+
+/*! \isp struct b2i_sie_1_0
+
+*/
+typedef struct
+{
+    /*!< csc_enable csc_bypass*/
+    int32_t csc_enable;
+    /*!< sharp_enable sharp_bypass*/
+    int32_t sharp_enable;
+    /*!< gamma_lut_enable gamma lut enable*/
+    int32_t gamma_lut_enable;
+    /*!< tm_lut_enable TM enable*/
+    int32_t tm_lut_enable;
+    /*!< ccm_enable ccm_bypass*/
+    int32_t ccm_enable;
+    /*!< cnr_enable cnr_bypass*/
+    int32_t cnr_enable;
+    /*!< csc_matrix[9] conversion matrix for RGB2YUV*/
+    int32_t csc_matrix[9];
+    /*!< csc_matrix_norm normalization factor for RGB2YUV*/
+    int32_t csc_matrix_norm;
+    /*!< csc_bias_vec[3] conversion bias for RGB2YUV*/
+    int32_t csc_bias_vec[3];
+    /*!< cds_coeff_array[8] conversion kernel from 444->420*/
+    int32_t cds_coeff_array[8];
+    /*!< cds_coeff_array_norm normalization factor for 444->420 kernel*/
+    int32_t cds_coeff_array_norm;
+    /*!< sharp_undershoot_power sharpening undershoot enhancement.To enhance use positive. To weaken use a negative.*/
+    int32_t sharp_undershoot_power;
+    /*!< sharp_overshoot_power sharpening overshoot enhancement.To enhance use positive. To weaken use a negative.*/
+    int32_t sharp_overshoot_power;
+    /*!< glut_base_level[5] Gamma lut  - GLUT base levels*/
+    int32_t glut_base_level[5];
+    /*!< glut_start_bin[5] Gamma lut  - GLUT start bin*/
+    int32_t glut_start_bin[5];
+    /*!< glut_step[5] Gamma lut  - GLUT step*/
+    int32_t glut_step[5];
+    /*!< glut_gen_lut[385] Gamma lut  - GLUT values*/
+    int32_t glut_gen_lut[385];
+    /*!< gamma_prog_shift programable shift for the gamma output*/
+    int32_t gamma_prog_shift;
+    /*!< ccm_matrix[9] color space conversion matrix for color enhancement*/
+    int32_t ccm_matrix[9];
+    /*!< ccm_matrix_norm normalization factor for color enhancement*/
+    int32_t ccm_matrix_norm;
+    /*!< tmlut_base_level TM lut  - LUT base levels*/
+    int32_t tmlut_base_level;
+    /*!< tmlut_start_bin TM lut  - LUT start bin*/
+    int32_t tmlut_start_bin;
+    /*!< tmlut_step TM lut  - LUT step*/
+    int32_t tmlut_step;
+    /*!< tmlut_gen_lut[513] TM lut  - LUT values*/
+    int32_t tmlut_gen_lut[513];
+    /*!< x_points_for_sharp_pos_th[6] x points for sharpning overshoot config unit*/
+    int32_t x_points_for_sharp_pos_th[6];
+    /*!< a_points_for_sharp_pos_th[5] a points for sharpning overshoot config unit*/
+    int32_t a_points_for_sharp_pos_th[5];
+    /*!< b_points_for_sharp_pos_th[5] b points for sharpning overshoot config unit*/
+    int32_t b_points_for_sharp_pos_th[5];
+    /*!< x_points_for_sharp_neg_th[6] x points for sharpning undershoot config unit*/
+    int32_t x_points_for_sharp_neg_th[6];
+    /*!< a_points_for_sharp_neg_th[5] a points for sharpning undershoot config unit*/
+    int32_t a_points_for_sharp_neg_th[5];
+    /*!< b_points_for_sharp_neg_th[5] b points for sharpning undershoot config unit*/
+    int32_t b_points_for_sharp_neg_th[5];
+    /*!< x_points_for_sharp_pixval_th[6] x points for sharpning pixel value config unit*/
+    int32_t x_points_for_sharp_pixval_th[6];
+    /*!< a_points_for_sharp_pixval_th[5] a points for sharpning pixel value config unit*/
+    int32_t a_points_for_sharp_pixval_th[5];
+    /*!< b_points_for_sharp_pixval_th[5] b points for sharpning pixel value config unit*/
+    int32_t b_points_for_sharp_pixval_th[5];
+    /*!< sharp_texture_coeff_norm texture  metric normalization power*/
+    int32_t sharp_texture_coeff_norm;
+    /*!< sharp_texture_undershoot sharpening: allowed undershoot for textured pixels*/
+    int32_t sharp_texture_undershoot;
+    /*!< sharp_edge_undershoot sharpening: allowed undershoot for edge pixels*/
+    int32_t sharp_edge_undershoot;
+    /*!< sharp_texture_overshoot sharpening: allowed overshoot for textured pixels*/
+    int32_t sharp_texture_overshoot;
+    /*!< sharp_edge_overshoot sharpening: allowed overshoot for edge pixels*/
+    int32_t sharp_edge_overshoot;
+    /*!< sharp_kernel_coeffs[6] sharpening: kernel coefficients*/
+    int32_t sharp_kernel_coeffs[6];
+    /*!< x_points_for_noise_th[6] x points for sharpning noise th config unit*/
+    int32_t x_points_for_noise_th[6];
+    /*!< a_points_for_noise_th[5] a  points for sharpning noise th config unit*/
+    int32_t a_points_for_noise_th[5];
+    /*!< b_points_for_noise_th[5] b  points for sharpning noise th config unit*/
+    int32_t b_points_for_noise_th[5];
+    /*!< x_points_for_local_coring[6] x points for local coring config unit*/
+    int32_t x_points_for_local_coring[6];
+    /*!< a_points_for_local_coring[5] a points for local coring config unit*/
+    int32_t a_points_for_local_coring[5];
+    /*!< b_points_for_local_coring[5] b points for local coring config unit*/
+    int32_t b_points_for_local_coring[5];
+    /*!< x_points_for_global_coring[6] x points for global coring config unit*/
+    int32_t x_points_for_global_coring[6];
+    /*!< a_points_for_global_coring[5] a points for global coring config unit*/
+    int32_t a_points_for_global_coring[5];
+    /*!< b_points_for_global_coring[5] b points for global coring config unit*/
+    int32_t b_points_for_global_coring[5];
+    /*!< cnr_iir_weight weights for vertical iir filter (filter norm power = 6)*/
+    int32_t cnr_iir_weight;
+    /*!< cnr_fir_weight[3] weights for horizontal fir filter (filter norm power = 7)*/
+    int32_t cnr_fir_weight[3];
+
+} ia_pal_isp_b2i_sie_1_0_t;
+
+/*! \isp struct b2i_sie_1_1
+
+*/
+typedef struct
+{
+    /*!< csc_enable csc_bypass*/
+    int32_t csc_enable;
+    /*!< sharp_enable sharp_bypass*/
+    int32_t sharp_enable;
+    /*!< gamma_lut_enable gamma lut enable*/
+    int32_t gamma_lut_enable;
+    /*!< tmlut_enable TM enable*/
+    int32_t tmlut_enable;
+    /*!< ccm_enable ccm_bypass*/
+    int32_t ccm_enable;
+    /*!< cnr_enable cnr_bypass*/
+    int32_t cnr_enable;
+    /*!< csc_matrix[9] conversion matrix for RGB2YUV*/
+    int32_t csc_matrix[9];
+    /*!< csc_matrix_norm normalization factor for RGB2YUV*/
+    int32_t csc_matrix_norm;
+    /*!< csc_bias_vec[3] conversion bias for RGB2YUV*/
+    int32_t csc_bias_vec[3];
+    /*!< cds_coeff_array[8] conversion kernel from 444->420*/
+    int32_t cds_coeff_array[8];
+    /*!< cds_coeff_array_norm normalization factor for 444->420 kernel*/
+    int32_t cds_coeff_array_norm;
+    /*!< sharp_undershoot_power sharpening undershoot enhancement.To enhance use positive. To weaken use a negative.*/
+    int32_t sharp_undershoot_power;
+    /*!< sharp_overshoot_power sharpening overshoot enhancement.To enhance use positive. To weaken use a negative.*/
+    int32_t sharp_overshoot_power;
+    /*!< glut_base_level[5] Gamma lut  - GLUT base levels*/
+    int32_t glut_base_level[5];
+    /*!< glut_start_bin[5] Gamma lut  - GLUT start bin*/
+    int32_t glut_start_bin[5];
+    /*!< glut_step[5] Gamma lut  - GLUT step*/
+    int32_t glut_step[5];
+    /*!< glut_gen_lut[385] Gamma lut  - GLUT values*/
+    int32_t glut_gen_lut[385];
+    /*!< gamma_prog_shift programable shift for the gamma output*/
+    int32_t gamma_prog_shift;
+    /*!< ccm_matrix[9] color space conversion matrix for color enhancement*/
+    int32_t ccm_matrix[9];
+    /*!< ccm_matrix_norm normalization factor for color enhancement*/
+    int32_t ccm_matrix_norm;
+    /*!< tmlut_base_level TM lut  - LUT base levels*/
+    int32_t tmlut_base_level;
+    /*!< tmlut_start_bin TM lut  - LUT start bin*/
+    int32_t tmlut_start_bin;
+    /*!< tmlut_step TM lut  - LUT step*/
+    int32_t tmlut_step;
+    /*!< tmlut_gen_lut[513] TM lut  - LUT values*/
+    int32_t tmlut_gen_lut[513];
+    /*!< x_points_for_sharp_pos_th[6] x points for sharpning overshoot config unit*/
+    int32_t x_points_for_sharp_pos_th[6];
+    /*!< a_points_for_sharp_pos_th[5] a points for sharpning overshoot config unit*/
+    int32_t a_points_for_sharp_pos_th[5];
+    /*!< b_points_for_sharp_pos_th[5] b points for sharpning overshoot config unit*/
+    int32_t b_points_for_sharp_pos_th[5];
+    /*!< x_points_for_sharp_neg_th[6] x points for sharpning undershoot config unit*/
+    int32_t x_points_for_sharp_neg_th[6];
+    /*!< a_points_for_sharp_neg_th[5] a points for sharpning undershoot config unit*/
+    int32_t a_points_for_sharp_neg_th[5];
+    /*!< b_points_for_sharp_neg_th[5] b points for sharpning undershoot config unit*/
+    int32_t b_points_for_sharp_neg_th[5];
+    /*!< x_points_for_sharp_pixval_th[6] x points for sharpning pixel value config unit*/
+    int32_t x_points_for_sharp_pixval_th[6];
+    /*!< a_points_for_sharp_pixval_th[5] a points for sharpning pixel value config unit*/
+    int32_t a_points_for_sharp_pixval_th[5];
+    /*!< b_points_for_sharp_pixval_th[5] b points for sharpning pixel value config unit*/
+    int32_t b_points_for_sharp_pixval_th[5];
+    /*!< sharp_texture_coeff_norm texture  metric normalization power*/
+    int32_t sharp_texture_coeff_norm;
+    /*!< sharp_texture_undershoot sharpening: allowed undershoot for textured pixels*/
+    int32_t sharp_texture_undershoot;
+    /*!< sharp_edge_undershoot sharpening: allowed undershoot for edge pixels*/
+    int32_t sharp_edge_undershoot;
+    /*!< sharp_texture_overshoot sharpening: allowed overshoot for textured pixels*/
+    int32_t sharp_texture_overshoot;
+    /*!< sharp_edge_overshoot sharpening: allowed overshoot for edge pixels*/
+    int32_t sharp_edge_overshoot;
+    /*!< sharp_kernel_coeffs[6] sharpening: kernel coefficients*/
+    int32_t sharp_kernel_coeffs[6];
+    /*!< x_points_for_noise_th[6] x points for sharpning noise th config unit*/
+    int32_t x_points_for_noise_th[6];
+    /*!< a_points_for_noise_th[5] a  points for sharpning noise th config unit*/
+    int32_t a_points_for_noise_th[5];
+    /*!< b_points_for_noise_th[5] b  points for sharpning noise th config unit*/
+    int32_t b_points_for_noise_th[5];
+    /*!< x_points_for_local_coring[6] x points for local coring config unit*/
+    int32_t x_points_for_local_coring[6];
+    /*!< a_points_for_local_coring[5] a points for local coring config unit*/
+    int32_t a_points_for_local_coring[5];
+    /*!< b_points_for_local_coring[5] b points for local coring config unit*/
+    int32_t b_points_for_local_coring[5];
+    /*!< x_points_for_global_coring[6] x points for global coring config unit*/
+    int32_t x_points_for_global_coring[6];
+    /*!< a_points_for_global_coring[5] a points for global coring config unit*/
+    int32_t a_points_for_global_coring[5];
+    /*!< b_points_for_global_coring[5] b points for global coring config unit*/
+    int32_t b_points_for_global_coring[5];
+    /*!< cnr_iir_weight weights for vertical iir filter (filter norm power = 6)*/
+    int32_t cnr_iir_weight;
+    /*!< cnr_fir_weight[3] weights for horizontal fir filter (filter norm power = 7)*/
+    int32_t cnr_fir_weight[3];
+
+} ia_pal_isp_b2i_sie_1_1_t;
+
+/*! \isp struct bnlm_3_0
+noise reduction
+*/
+typedef struct
+{
+    /*!< bayer_fmt Bayer format*/
+    int32_t bayer_fmt;
+    /*!< bypass bypass*/
+    int32_t bypass;
+    /*!< run_on_y a flag that indicates if the block used on Y input*/
+    int32_t run_on_y;
+    /*!< hv_edge_density_thr Edge density noise sigma thr*/
+    int32_t hv_edge_density_thr;
+    /*!< minmax_hv_edge_density_thr Edge density delta max - min thr*/
+    int32_t minmax_hv_edge_density_thr;
+    /*!< d_edge_density_thr Diagonal edge density noise sigma thr*/
+    int32_t d_edge_density_thr;
+    /*!< minmax_d_edge_density_thr Diagonal edge density delta max - min thr*/
+    int32_t minmax_d_edge_density_thr;
+    /*!< sigma_flat sigma flat*/
+    int32_t sigma_flat;
+    /*!< sigma_slope sigma slope*/
+    int32_t sigma_slope;
+    /*!< sigma_edge sigma edge*/
+    int32_t sigma_edge;
+    /*!< sigma_texture sigma texture*/
+    int32_t sigma_texture;
+    /*!< delta_flat delta flat*/
+    int32_t delta_flat;
+    /*!< delta_slope delta slope*/
+    int32_t delta_slope;
+    /*!< delta_edge delta edge*/
+    int32_t delta_edge;
+    /*!< delta_texture delta texture*/
+    int32_t delta_texture;
+    /*!< alpha_flat alpha flat*/
+    int32_t alpha_flat;
+    /*!< alpha_slope alpha slope*/
+    int32_t alpha_slope;
+    /*!< alpha_edge alpha edge*/
+    int32_t alpha_edge;
+    /*!< alpha_texture alpha texture*/
+    int32_t alpha_texture;
+    /*!< sigma_s spatial sigma of uniform filter*/
+    int32_t sigma_s;
+    /*!< sigma_s_b narrow sigma of elliptical filter*/
+    int32_t sigma_s_b;
+    /*!< sigma_s_a wide sigma of elliptical filter*/
+    int32_t sigma_s_a;
+    /*!< rx_sqr_start initial value of Rx^2*/
+    int32_t rx_sqr_start;
+    /*!< ry_sqr_start initial value of Ry^2*/
+    int32_t ry_sqr_start;
+    /*!< coordinates_shift coordinates shift*/
+    int32_t coordinates_shift;
+    /*!< color_penalty_weight color penalty weight*/
+    int32_t color_penalty_weight;
+    /*!< alpha_i_max alpha I max*/
+    int32_t alpha_i_max;
+    /*!< cu_ed_measure_x[4] edge density config unit - x values*/
+    int32_t cu_ed_measure_x[4];
+    /*!< cu_ed_measure_y[3] edge density config unit - y values*/
+    int32_t cu_ed_measure_y[3];
+    /*!< cu_ed_measure_slope[3] edge density config unit - slope values*/
+    int32_t cu_ed_measure_slope[3];
+    /*!< cu_ed_dir_measure_x[4] directional measure config unit - x values*/
+    int32_t cu_ed_dir_measure_x[4];
+    /*!< cu_ed_dir_measure_y[3] directional measure config unit - y values*/
+    int32_t cu_ed_dir_measure_y[3];
+    /*!< cu_ed_dir_measure_slope[3] directional measure config unit - slopes values*/
+    int32_t cu_ed_dir_measure_slope[3];
+    /*!< cu_lin_slope_measure_x[4] slope measure config unit - x values*/
+    int32_t cu_lin_slope_measure_x[4];
+    /*!< cu_lin_slope_measure_y[3] slope measure config unit - y values*/
+    int32_t cu_lin_slope_measure_y[3];
+    /*!< cu_lin_slope_measure_slope[3] slope measure config unit - slope values*/
+    int32_t cu_lin_slope_measure_slope[3];
+    /*!< cu_lin_slope_edge_measure_x[4] edge measure based on linear slope config unit - x values*/
+    int32_t cu_lin_slope_edge_measure_x[4];
+    /*!< cu_lin_slope_edge_measure_y[3] edge measure based on linear slope config unit - y values*/
+    int32_t cu_lin_slope_edge_measure_y[3];
+    /*!< cu_lin_slope_edge_measure_slope[3] edge measure based on linear slope config unit - slope values*/
+    int32_t cu_lin_slope_edge_measure_slope[3];
+    /*!< cu_var_measure_x[4] variance measure config unit - x values*/
+    int32_t cu_var_measure_x[4];
+    /*!< cu_var_measure_y[3] variance measure config unit - y values*/
+    int32_t cu_var_measure_y[3];
+    /*!< cu_var_measure_slope[3] variance measure config unit - slope values*/
+    int32_t cu_var_measure_slope[3];
+    /*!< cu_var_edge_measure_x[4] variance edge measure config unit - x values*/
+    int32_t cu_var_edge_measure_x[4];
+    /*!< cu_var_edge_measure_y[3] variance edge measure config unit - y values*/
+    int32_t cu_var_edge_measure_y[3];
+    /*!< cu_var_edge_measure_slope[3] variance edge measure config unit - slope values*/
+    int32_t cu_var_edge_measure_slope[3];
+    /*!< cu_alpha_i_x[4] alpha change with intensity config unit - x values*/
+    int32_t cu_alpha_i_x[4];
+    /*!< cu_alpha_i_y[3] alpha change with intensity config unit - y values*/
+    int32_t cu_alpha_i_y[3];
+    /*!< cu_alpha_i_slope[3] alpha change with intensity config unit - slopes values*/
+    int32_t cu_alpha_i_slope[3];
+    /*!< cu_lsc_coeff_gr_x[6] LSC coeff function for Gr channel config unit - x values*/
+    int32_t cu_lsc_coeff_gr_x[6];
+    /*!< cu_lsc_coeff_gr_y[5] LSC coeff function for Gr channel config unit - y values*/
+    int32_t cu_lsc_coeff_gr_y[5];
+    /*!< cu_lsc_coeff_gr_slope[5] LSC coeff function for Gr channel config unit - slope values*/
+    int32_t cu_lsc_coeff_gr_slope[5];
+    /*!< cu_lsc_coeff_r_x[6] LSC coeff function for R channel config unit - x values*/
+    int32_t cu_lsc_coeff_r_x[6];
+    /*!< cu_lsc_coeff_r_y[5] LSC coeff function for R channel config unit - y values*/
+    int32_t cu_lsc_coeff_r_y[5];
+    /*!< cu_lsc_coeff_r_slope[5] LSC coeff function for R channel config unit - slope values*/
+    int32_t cu_lsc_coeff_r_slope[5];
+    /*!< cu_lsc_coeff_b_x[6] LSC coeff function for B channel config unit - x values*/
+    int32_t cu_lsc_coeff_b_x[6];
+    /*!< cu_lsc_coeff_b_y[5] LSC coeff function for B channel config unit - y values*/
+    int32_t cu_lsc_coeff_b_y[5];
+    /*!< cu_lsc_coeff_b_slope[5] LSC coeff function for B channel config unit - slope values*/
+    int32_t cu_lsc_coeff_b_slope[5];
+    /*!< cu_lsc_coeff_gb_x[6] LSC coeff function for Gb channel config unit - x values*/
+    int32_t cu_lsc_coeff_gb_x[6];
+    /*!< cu_lsc_coeff_gb_y[5] LSC coeff function for Gb channel config unit - y values*/
+    int32_t cu_lsc_coeff_gb_y[5];
+    /*!< cu_lsc_coeff_gb_slope[5] LSC coeff function for Gb channel config unit - slope values*/
+    int32_t cu_lsc_coeff_gb_slope[5];
+    /*!< start_col The distance along the vertical axis of the first pixel of the frame*/
+    int32_t start_col;
+    /*!< start_row The distance along the horizontal axis of the first pixel of the frame*/
+    int32_t start_row;
+    /*!< delta_y_counter crop supporting register*/
+    int32_t delta_y_counter;
+    /*!< delta_x_counter crop supporting register*/
+    int32_t delta_x_counter;
+    /*!< cu_nm_patch_x[10] noise model config unit - x values*/
+    int32_t cu_nm_patch_x[10];
+    /*!< cu_nm_patch_y[9] noise model config unit - y values*/
+    int32_t cu_nm_patch_y[9];
+    /*!< cu_nm_patch_slope[9] noise model config unit - slope values*/
+    int32_t cu_nm_patch_slope[9];
+    /*!< cu_nm_block_x[10] content detectors noise model config unit - x values*/
+    int32_t cu_nm_block_x[10];
+    /*!< cu_nm_block_y[9] content detectors noise model config unit - y values*/
+    int32_t cu_nm_block_y[9];
+    /*!< cu_nm_block_slope[9] content detectors noise model config unit - slope values*/
+    int32_t cu_nm_block_slope[9];
+    /*!< cu_input_compression_x[16] input compression function (16 to 12 bits) - x values*/
+    int32_t cu_input_compression_x[16];
+    /*!< cu_input_compression_y[15] input compression function (16 to 12 bits) - y values*/
+    int32_t cu_input_compression_y[15];
+    /*!< cu_input_compression_slope[15] input compression function (16 to 12 bits) - slope values*/
+    int32_t cu_input_compression_slope[15];
+    /*!< cu_input_decompression_x[16] input decompression function (16 to 24 bits) - x values*/
+    int32_t cu_input_decompression_x[16];
+    /*!< cu_input_decompression_y[15] input decompression function (16 to 24 bits) - y values*/
+    int32_t cu_input_decompression_y[15];
+    /*!< cu_input_decompression_slope[15] input decompression function (16 to 24 bits) - slope values*/
+    int32_t cu_input_decompression_slope[15];
+    /*!< cu_output_compression_x[16] output compression function (24 to 16 bits) - x values*/
+    int32_t cu_output_compression_x[16];
+    /*!< cu_output_compression_y[15] output compression function (24 to 16 bits) - y values*/
+    int32_t cu_output_compression_y[15];
+    /*!< cu_output_compression_slope[15] output compression function (24 to 16 bits) - slope values*/
+    int32_t cu_output_compression_slope[15];
+    /*!< nm_norm_scale Amount of bits to normalize the noise model*/
+    int32_t nm_norm_scale;
+
+} ia_pal_isp_bnlm_3_0_t;
+
+/*! \isp struct bnlm_3_1
+noise reduction
+*/
+typedef struct
+{
+    /*!< bayer_fmt Bayer format*/
+    int32_t bayer_fmt;
+    /*!< bypass bypass*/
+    int32_t bypass;
+    /*!< run_on_y a flag that indicates if the block used on Y input*/
+    int32_t run_on_y;
+    /*!< hv_edge_density_thr Edge density noise sigma thr*/
+    int32_t hv_edge_density_thr;
+    /*!< minmax_hv_edge_density_thr Edge density delta max - min thr*/
+    int32_t minmax_hv_edge_density_thr;
+    /*!< d_edge_density_thr Diagonal edge density noise sigma thr*/
+    int32_t d_edge_density_thr;
+    /*!< minmax_d_edge_density_thr Diagonal edge density delta max - min thr*/
+    int32_t minmax_d_edge_density_thr;
+    /*!< sigma_flat sigma flat*/
+    int32_t sigma_flat;
+    /*!< sigma_slope sigma slope*/
+    int32_t sigma_slope;
+    /*!< sigma_edge sigma edge*/
+    int32_t sigma_edge;
+    /*!< sigma_texture sigma texture*/
+    int32_t sigma_texture;
+    /*!< delta_flat delta flat*/
+    int32_t delta_flat;
+    /*!< delta_slope delta slope*/
+    int32_t delta_slope;
+    /*!< delta_edge delta edge*/
+    int32_t delta_edge;
+    /*!< delta_texture delta texture*/
+    int32_t delta_texture;
+    /*!< alpha_flat alpha flat*/
+    int32_t alpha_flat;
+    /*!< alpha_slope alpha slope*/
+    int32_t alpha_slope;
+    /*!< alpha_edge alpha edge*/
+    int32_t alpha_edge;
+    /*!< alpha_texture alpha texture*/
+    int32_t alpha_texture;
+    /*!< sigma_s spatial sigma of uniform filter*/
+    int32_t sigma_s;
+    /*!< sigma_s_b narrow sigma of elliptical filter*/
+    int32_t sigma_s_b;
+    /*!< sigma_s_a wide sigma of elliptical filter*/
+    int32_t sigma_s_a;
+    /*!< rx_sqr_start initial value of Rx^2*/
+    int32_t rx_sqr_start;
+    /*!< ry_sqr_start initial value of Ry^2*/
+    int32_t ry_sqr_start;
+    /*!< coordinates_shift coordinates shift*/
+    int32_t coordinates_shift;
+    /*!< color_penalty_weight color penalty weight*/
+    int32_t color_penalty_weight;
+    /*!< alpha_i_max alpha I max*/
+    int32_t alpha_i_max;
+    /*!< cu_ed_measure_x[4] edge density config unit - x values*/
+    int32_t cu_ed_measure_x[4];
+    /*!< cu_ed_measure_y[3] edge density config unit - y values*/
+    int32_t cu_ed_measure_y[3];
+    /*!< cu_ed_measure_slope[3] edge density config unit - slope values*/
+    int32_t cu_ed_measure_slope[3];
+    /*!< cu_ed_dir_measure_x[4] directional measure config unit - x values*/
+    int32_t cu_ed_dir_measure_x[4];
+    /*!< cu_ed_dir_measure_y[3] directional measure config unit - y values*/
+    int32_t cu_ed_dir_measure_y[3];
+    /*!< cu_ed_dir_measure_slope[3] directional measure config unit - slopes values*/
+    int32_t cu_ed_dir_measure_slope[3];
+    /*!< cu_lin_slope_measure_x[4] slope measure config unit - x values*/
+    int32_t cu_lin_slope_measure_x[4];
+    /*!< cu_lin_slope_measure_y[3] slope measure config unit - y values*/
+    int32_t cu_lin_slope_measure_y[3];
+    /*!< cu_lin_slope_measure_slope[3] slope measure config unit - slope values*/
+    int32_t cu_lin_slope_measure_slope[3];
+    /*!< cu_lin_slope_edge_measure_x[4] edge measure based on linear slope config unit - x values*/
+    int32_t cu_lin_slope_edge_measure_x[4];
+    /*!< cu_lin_slope_edge_measure_y[3] edge measure based on linear slope config unit - y values*/
+    int32_t cu_lin_slope_edge_measure_y[3];
+    /*!< cu_lin_slope_edge_measure_slope[3] edge measure based on linear slope config unit - slope values*/
+    int32_t cu_lin_slope_edge_measure_slope[3];
+    /*!< cu_var_measure_x[4] variance measure config unit - x values*/
+    int32_t cu_var_measure_x[4];
+    /*!< cu_var_measure_y[3] variance measure config unit - y values*/
+    int32_t cu_var_measure_y[3];
+    /*!< cu_var_measure_slope[3] variance measure config unit - slope values*/
+    int32_t cu_var_measure_slope[3];
+    /*!< cu_var_edge_measure_x[4] variance edge measure config unit - x values*/
+    int32_t cu_var_edge_measure_x[4];
+    /*!< cu_var_edge_measure_y[3] variance edge measure config unit - y values*/
+    int32_t cu_var_edge_measure_y[3];
+    /*!< cu_var_edge_measure_slope[3] variance edge measure config unit - slope values*/
+    int32_t cu_var_edge_measure_slope[3];
+    /*!< cu_alpha_i_x[4] alpha change with intensity config unit - x values*/
+    int32_t cu_alpha_i_x[4];
+    /*!< cu_alpha_i_y[3] alpha change with intensity config unit - y values*/
+    int32_t cu_alpha_i_y[3];
+    /*!< cu_alpha_i_slope[3] alpha change with intensity config unit - slopes values*/
+    int32_t cu_alpha_i_slope[3];
+    /*!< cu_lsc_coeff_gr_x[6] LSC coeff function for Gr channel config unit - x values*/
+    int32_t cu_lsc_coeff_gr_x[6];
+    /*!< cu_lsc_coeff_gr_y[5] LSC coeff function for Gr channel config unit - y values*/
+    int32_t cu_lsc_coeff_gr_y[5];
+    /*!< cu_lsc_coeff_gr_slope[5] LSC coeff function for Gr channel config unit - slope values*/
+    int32_t cu_lsc_coeff_gr_slope[5];
+    /*!< cu_lsc_coeff_r_x[6] LSC coeff function for R channel config unit - x values*/
+    int32_t cu_lsc_coeff_r_x[6];
+    /*!< cu_lsc_coeff_r_y[5] LSC coeff function for R channel config unit - y values*/
+    int32_t cu_lsc_coeff_r_y[5];
+    /*!< cu_lsc_coeff_r_slope[5] LSC coeff function for R channel config unit - slope values*/
+    int32_t cu_lsc_coeff_r_slope[5];
+    /*!< cu_lsc_coeff_b_x[6] LSC coeff function for B channel config unit - x values*/
+    int32_t cu_lsc_coeff_b_x[6];
+    /*!< cu_lsc_coeff_b_y[5] LSC coeff function for B channel config unit - y values*/
+    int32_t cu_lsc_coeff_b_y[5];
+    /*!< cu_lsc_coeff_b_slope[5] LSC coeff function for B channel config unit - slope values*/
+    int32_t cu_lsc_coeff_b_slope[5];
+    /*!< cu_lsc_coeff_gb_x[6] LSC coeff function for Gb channel config unit - x values*/
+    int32_t cu_lsc_coeff_gb_x[6];
+    /*!< cu_lsc_coeff_gb_y[5] LSC coeff function for Gb channel config unit - y values*/
+    int32_t cu_lsc_coeff_gb_y[5];
+    /*!< cu_lsc_coeff_gb_slope[5] LSC coeff function for Gb channel config unit - slope values*/
+    int32_t cu_lsc_coeff_gb_slope[5];
+    /*!< start_col The distance along the vertical axis of the first pixel of the frame*/
+    int32_t start_col;
+    /*!< start_row The distance along the horizontal axis of the first pixel of the frame*/
+    int32_t start_row;
+    /*!< delta_y_counter crop supporting register*/
+    int32_t delta_y_counter;
+    /*!< delta_x_counter crop supporting register*/
+    int32_t delta_x_counter;
+    /*!< cu_nm_patch_x[10] noise model config unit - x values*/
+    int32_t cu_nm_patch_x[10];
+    /*!< cu_nm_patch_y[9] noise model config unit - y values*/
+    int32_t cu_nm_patch_y[9];
+    /*!< cu_nm_patch_slope[9] noise model config unit - slope values*/
+    int32_t cu_nm_patch_slope[9];
+    /*!< cu_nm_block_x[10] content detectors noise model config unit - x values*/
+    int32_t cu_nm_block_x[10];
+    /*!< cu_nm_block_y[9] content detectors noise model config unit - y values*/
+    int32_t cu_nm_block_y[9];
+    /*!< cu_nm_block_slope[9] content detectors noise model config unit - slope values*/
+    int32_t cu_nm_block_slope[9];
+    /*!< cu_input_compression_x[16] input compression function (16 to 12 bits) - x values*/
+    int32_t cu_input_compression_x[16];
+    /*!< cu_input_compression_y[15] input compression function (16 to 12 bits) - y values*/
+    int32_t cu_input_compression_y[15];
+    /*!< cu_input_compression_slope[15] input compression function (16 to 12 bits) - slope values*/
+    int32_t cu_input_compression_slope[15];
+    /*!< cu_input_decompression_x[16] input decompression function (16 to 24 bits) - x values*/
+    int32_t cu_input_decompression_x[16];
+    /*!< cu_input_decompression_y[15] input decompression function (16 to 24 bits) - y values*/
+    int32_t cu_input_decompression_y[15];
+    /*!< cu_input_decompression_slope[15] input decompression function (16 to 24 bits) - slope values*/
+    int32_t cu_input_decompression_slope[15];
+    /*!< cu_output_compression_x[16] output compression function (24 to 16 bits) - x values*/
+    int32_t cu_output_compression_x[16];
+    /*!< cu_output_compression_y[15] output compression function (24 to 16 bits) - y values*/
+    int32_t cu_output_compression_y[15];
+    /*!< cu_output_compression_slope[15] output compression function (24 to 16 bits) - slope values*/
+    int32_t cu_output_compression_slope[15];
+    /*!< nm_norm_scale Amount of bits to normalize the noise model*/
+    int32_t nm_norm_scale;
+
+} ia_pal_isp_bnlm_3_1_t;
+
+/*! \isp struct bnlm_3_2
+noise reduction
+*/
+typedef struct
+{
+    /*!< bayer_fmt Bayer format*/
+    int32_t bayer_fmt;
+    /*!< bypass bypass*/
+    int32_t bypass;
+    /*!< run_on_y a flag that indicates if the block used on Y input*/
+    int32_t run_on_y;
+    /*!< hv_edge_density_thr Edge density noise sigma thr*/
+    int32_t hv_edge_density_thr;
+    /*!< minmax_hv_edge_density_thr Edge density delta max - min thr*/
+    int32_t minmax_hv_edge_density_thr;
+    /*!< d_edge_density_thr Diagonal edge density noise sigma thr*/
+    int32_t d_edge_density_thr;
+    /*!< minmax_d_edge_density_thr Diagonal edge density delta max - min thr*/
+    int32_t minmax_d_edge_density_thr;
+    /*!< sigma_flat sigma flat*/
+    int32_t sigma_flat;
+    /*!< sigma_slope sigma slope*/
+    int32_t sigma_slope;
+    /*!< sigma_edge sigma edge*/
+    int32_t sigma_edge;
+    /*!< sigma_texture sigma texture*/
+    int32_t sigma_texture;
+    /*!< delta_flat delta flat*/
+    int32_t delta_flat;
+    /*!< delta_slope delta slope*/
+    int32_t delta_slope;
+    /*!< delta_edge delta edge*/
+    int32_t delta_edge;
+    /*!< delta_texture delta texture*/
+    int32_t delta_texture;
+    /*!< alpha_flat alpha flat*/
+    int32_t alpha_flat;
+    /*!< alpha_slope alpha slope*/
+    int32_t alpha_slope;
+    /*!< alpha_edge alpha edge*/
+    int32_t alpha_edge;
+    /*!< alpha_texture alpha texture*/
+    int32_t alpha_texture;
+    /*!< sigma_s spatial sigma of uniform filter*/
+    int32_t sigma_s;
+    /*!< sigma_s_b narrow sigma of elliptical filter*/
+    int32_t sigma_s_b;
+    /*!< sigma_s_a wide sigma of elliptical filter*/
+    int32_t sigma_s_a;
+    /*!< rx_sqr_start initial value of Rx^2*/
+    int32_t rx_sqr_start;
+    /*!< ry_sqr_start initial value of Ry^2*/
+    int32_t ry_sqr_start;
+    /*!< coordinates_shift coordinates shift*/
+    int32_t coordinates_shift;
+    /*!< color_penalty_weight color penalty weight*/
+    int32_t color_penalty_weight;
+    /*!< alpha_i_max alpha I max*/
+    int32_t alpha_i_max;
+    /*!< cu_ed_measure_x[4] edge density config unit - x values*/
+    int32_t cu_ed_measure_x[4];
+    /*!< cu_ed_measure_y[3] edge density config unit - y values*/
+    int32_t cu_ed_measure_y[3];
+    /*!< cu_ed_measure_slope[3] edge density config unit - slope values*/
+    int32_t cu_ed_measure_slope[3];
+    /*!< cu_ed_dir_measure_x[4] directional measure config unit - x values*/
+    int32_t cu_ed_dir_measure_x[4];
+    /*!< cu_ed_dir_measure_y[3] directional measure config unit - y values*/
+    int32_t cu_ed_dir_measure_y[3];
+    /*!< cu_ed_dir_measure_slope[3] directional measure config unit - slopes values*/
+    int32_t cu_ed_dir_measure_slope[3];
+    /*!< cu_lin_slope_measure_x[4] slope measure config unit - x values*/
+    int32_t cu_lin_slope_measure_x[4];
+    /*!< cu_lin_slope_measure_y[3] slope measure config unit - y values*/
+    int32_t cu_lin_slope_measure_y[3];
+    /*!< cu_lin_slope_measure_slope[3] slope measure config unit - slope values*/
+    int32_t cu_lin_slope_measure_slope[3];
+    /*!< cu_lin_slope_edge_measure_x[4] edge measure based on linear slope config unit - x values*/
+    int32_t cu_lin_slope_edge_measure_x[4];
+    /*!< cu_lin_slope_edge_measure_y[3] edge measure based on linear slope config unit - y values*/
+    int32_t cu_lin_slope_edge_measure_y[3];
+    /*!< cu_lin_slope_edge_measure_slope[3] edge measure based on linear slope config unit - slope values*/
+    int32_t cu_lin_slope_edge_measure_slope[3];
+    /*!< cu_var_measure_x[4] variance measure config unit - x values*/
+    int32_t cu_var_measure_x[4];
+    /*!< cu_var_measure_y[3] variance measure config unit - y values*/
+    int32_t cu_var_measure_y[3];
+    /*!< cu_var_measure_slope[3] variance measure config unit - slope values*/
+    int32_t cu_var_measure_slope[3];
+    /*!< cu_var_edge_measure_x[4] variance edge measure config unit - x values*/
+    int32_t cu_var_edge_measure_x[4];
+    /*!< cu_var_edge_measure_y[3] variance edge measure config unit - y values*/
+    int32_t cu_var_edge_measure_y[3];
+    /*!< cu_var_edge_measure_slope[3] variance edge measure config unit - slope values*/
+    int32_t cu_var_edge_measure_slope[3];
+    /*!< cu_alpha_i_x[4] alpha change with intensity config unit - x values*/
+    int32_t cu_alpha_i_x[4];
+    /*!< cu_alpha_i_y[3] alpha change with intensity config unit - y values*/
+    int32_t cu_alpha_i_y[3];
+    /*!< cu_alpha_i_slope[3] alpha change with intensity config unit - slopes values*/
+    int32_t cu_alpha_i_slope[3];
+    /*!< cu_lsc_coeff_gr_x[6] LSC coeff function for Gr channel config unit - x values*/
+    int32_t cu_lsc_coeff_gr_x[6];
+    /*!< cu_lsc_coeff_gr_y[5] LSC coeff function for Gr channel config unit - y values*/
+    int32_t cu_lsc_coeff_gr_y[5];
+    /*!< cu_lsc_coeff_gr_slope[5] LSC coeff function for Gr channel config unit - slope values*/
+    int32_t cu_lsc_coeff_gr_slope[5];
+    /*!< cu_lsc_coeff_r_x[6] LSC coeff function for R channel config unit - x values*/
+    int32_t cu_lsc_coeff_r_x[6];
+    /*!< cu_lsc_coeff_r_y[5] LSC coeff function for R channel config unit - y values*/
+    int32_t cu_lsc_coeff_r_y[5];
+    /*!< cu_lsc_coeff_r_slope[5] LSC coeff function for R channel config unit - slope values*/
+    int32_t cu_lsc_coeff_r_slope[5];
+    /*!< cu_lsc_coeff_b_x[6] LSC coeff function for B channel config unit - x values*/
+    int32_t cu_lsc_coeff_b_x[6];
+    /*!< cu_lsc_coeff_b_y[5] LSC coeff function for B channel config unit - y values*/
+    int32_t cu_lsc_coeff_b_y[5];
+    /*!< cu_lsc_coeff_b_slope[5] LSC coeff function for B channel config unit - slope values*/
+    int32_t cu_lsc_coeff_b_slope[5];
+    /*!< cu_lsc_coeff_gb_x[6] LSC coeff function for Gb channel config unit - x values*/
+    int32_t cu_lsc_coeff_gb_x[6];
+    /*!< cu_lsc_coeff_gb_y[5] LSC coeff function for Gb channel config unit - y values*/
+    int32_t cu_lsc_coeff_gb_y[5];
+    /*!< cu_lsc_coeff_gb_slope[5] LSC coeff function for Gb channel config unit - slope values*/
+    int32_t cu_lsc_coeff_gb_slope[5];
+    /*!< start_col The distance along the vertical axis of the first pixel of the frame*/
+    int32_t start_col;
+    /*!< start_row The distance along the horizontal axis of the first pixel of the frame*/
+    int32_t start_row;
+    /*!< delta_y_counter crop supporting register*/
+    int32_t delta_y_counter;
+    /*!< delta_x_counter crop supporting register*/
+    int32_t delta_x_counter;
+    /*!< cu_nm_patch_x[10] noise model config unit - x values*/
+    int32_t cu_nm_patch_x[10];
+    /*!< cu_nm_patch_y[9] noise model config unit - y values*/
+    int32_t cu_nm_patch_y[9];
+    /*!< cu_nm_patch_slope[9] noise model config unit - slope values*/
+    int32_t cu_nm_patch_slope[9];
+    /*!< cu_nm_block_x[10] content detectors noise model config unit - x values*/
+    int32_t cu_nm_block_x[10];
+    /*!< cu_nm_block_y[9] content detectors noise model config unit - y values*/
+    int32_t cu_nm_block_y[9];
+    /*!< cu_nm_block_slope[9] content detectors noise model config unit - slope values*/
+    int32_t cu_nm_block_slope[9];
+    /*!< cu_input_compression_x[16] input compression function (16 to 12 bits) - x values*/
+    int32_t cu_input_compression_x[16];
+    /*!< cu_input_compression_y[15] input compression function (16 to 12 bits) - y values*/
+    int32_t cu_input_compression_y[15];
+    /*!< cu_input_compression_slope[15] input compression function (16 to 12 bits) - slope values*/
+    int32_t cu_input_compression_slope[15];
+    /*!< cu_input_decompression_x[16] input decompression function (16 to 24 bits) - x values*/
+    int32_t cu_input_decompression_x[16];
+    /*!< cu_input_decompression_y[15] input decompression function (16 to 24 bits) - y values*/
+    int32_t cu_input_decompression_y[15];
+    /*!< cu_input_decompression_slope[15] input decompression function (16 to 24 bits) - slope values*/
+    int32_t cu_input_decompression_slope[15];
+    /*!< cu_output_compression_x[16] output compression function (24 to 16 bits) - x values*/
+    int32_t cu_output_compression_x[16];
+    /*!< cu_output_compression_y[15] output compression function (24 to 16 bits) - y values*/
+    int32_t cu_output_compression_y[15];
+    /*!< cu_output_compression_slope[15] output compression function (24 to 16 bits) - slope values*/
+    int32_t cu_output_compression_slope[15];
+    /*!< nm_norm_scale Amount of bits to normalize the noise model*/
+    int32_t nm_norm_scale;
+
+} ia_pal_isp_bnlm_3_2_t;
+
+/*! \isp struct bnlm_3_3
+noise reduction
+*/
+typedef struct
+{
+    /*!< bayer_fmt Bayer format*/
+    int32_t bayer_fmt;
+    /*!< bypass bypass*/
+    int32_t bypass;
+    /*!< run_on_y a flag that indicates if the block used on Y input*/
+    int32_t run_on_y;
+    /*!< hv_edge_density_thr Edge density noise sigma thr*/
+    int32_t hv_edge_density_thr;
+    /*!< minmax_hv_edge_density_thr Edge density delta max - min thr*/
+    int32_t minmax_hv_edge_density_thr;
+    /*!< d_edge_density_thr Diagonal edge density noise sigma thr*/
+    int32_t d_edge_density_thr;
+    /*!< minmax_d_edge_density_thr Diagonal edge density delta max - min thr*/
+    int32_t minmax_d_edge_density_thr;
+    /*!< sigma_flat sigma flat*/
+    int32_t sigma_flat;
+    /*!< sigma_slope sigma slope*/
+    int32_t sigma_slope;
+    /*!< sigma_edge sigma edge*/
+    int32_t sigma_edge;
+    /*!< sigma_texture sigma texture*/
+    int32_t sigma_texture;
+    /*!< delta_flat delta flat*/
+    int32_t delta_flat;
+    /*!< delta_slope delta slope*/
+    int32_t delta_slope;
+    /*!< delta_edge delta edge*/
+    int32_t delta_edge;
+    /*!< delta_texture delta texture*/
+    int32_t delta_texture;
+    /*!< alpha_flat alpha flat*/
+    int32_t alpha_flat;
+    /*!< alpha_slope alpha slope*/
+    int32_t alpha_slope;
+    /*!< alpha_edge alpha edge*/
+    int32_t alpha_edge;
+    /*!< alpha_texture alpha texture*/
+    int32_t alpha_texture;
+    /*!< sigma_s spatial sigma of uniform filter*/
+    int32_t sigma_s;
+    /*!< sigma_s_b narrow sigma of elliptical filter*/
+    int32_t sigma_s_b;
+    /*!< sigma_s_a wide sigma of elliptical filter*/
+    int32_t sigma_s_a;
+    /*!< rx_sqr_start initial value of Rx^2*/
+    int32_t rx_sqr_start;
+    /*!< ry_sqr_start initial value of Ry^2*/
+    int32_t ry_sqr_start;
+    /*!< coordinates_shift coordinates shift*/
+    int32_t coordinates_shift;
+    /*!< color_penalty_weight color penalty weight*/
+    int32_t color_penalty_weight;
+    /*!< alpha_i_max alpha I max*/
+    int32_t alpha_i_max;
+    /*!< cu_ed_measure_x[4] edge density config unit - x values*/
+    int32_t cu_ed_measure_x[4];
+    /*!< cu_ed_measure_y[3] edge density config unit - y values*/
+    int32_t cu_ed_measure_y[3];
+    /*!< cu_ed_measure_slope[3] edge density config unit - slope values*/
+    int32_t cu_ed_measure_slope[3];
+    /*!< cu_ed_dir_measure_x[4] directional measure config unit - x values*/
+    int32_t cu_ed_dir_measure_x[4];
+    /*!< cu_ed_dir_measure_y[3] directional measure config unit - y values*/
+    int32_t cu_ed_dir_measure_y[3];
+    /*!< cu_ed_dir_measure_slope[3] directional measure config unit - slopes values*/
+    int32_t cu_ed_dir_measure_slope[3];
+    /*!< cu_lin_slope_measure_x[4] slope measure config unit - x values*/
+    int32_t cu_lin_slope_measure_x[4];
+    /*!< cu_lin_slope_measure_y[3] slope measure config unit - y values*/
+    int32_t cu_lin_slope_measure_y[3];
+    /*!< cu_lin_slope_measure_slope[3] slope measure config unit - slope values*/
+    int32_t cu_lin_slope_measure_slope[3];
+    /*!< cu_lin_slope_edge_measure_x[4] edge measure based on linear slope config unit - x values*/
+    int32_t cu_lin_slope_edge_measure_x[4];
+    /*!< cu_lin_slope_edge_measure_y[3] edge measure based on linear slope config unit - y values*/
+    int32_t cu_lin_slope_edge_measure_y[3];
+    /*!< cu_lin_slope_edge_measure_slope[3] edge measure based on linear slope config unit - slope values*/
+    int32_t cu_lin_slope_edge_measure_slope[3];
+    /*!< cu_var_measure_x[4] variance measure config unit - x values*/
+    int32_t cu_var_measure_x[4];
+    /*!< cu_var_measure_y[3] variance measure config unit - y values*/
+    int32_t cu_var_measure_y[3];
+    /*!< cu_var_measure_slope[3] variance measure config unit - slope values*/
+    int32_t cu_var_measure_slope[3];
+    /*!< cu_var_edge_measure_x[4] variance edge measure config unit - x values*/
+    int32_t cu_var_edge_measure_x[4];
+    /*!< cu_var_edge_measure_y[3] variance edge measure config unit - y values*/
+    int32_t cu_var_edge_measure_y[3];
+    /*!< cu_var_edge_measure_slope[3] variance edge measure config unit - slope values*/
+    int32_t cu_var_edge_measure_slope[3];
+    /*!< cu_alpha_i_x[4] alpha change with intensity config unit - x values*/
+    int32_t cu_alpha_i_x[4];
+    /*!< cu_alpha_i_y[3] alpha change with intensity config unit - y values*/
+    int32_t cu_alpha_i_y[3];
+    /*!< cu_alpha_i_slope[3] alpha change with intensity config unit - slopes values*/
+    int32_t cu_alpha_i_slope[3];
+    /*!< start_col The distance along the vertical axis of the first pixel of the frame*/
+    int32_t start_col;
+    /*!< start_row The distance along the horizontal axis of the first pixel of the frame*/
+    int32_t start_row;
+    /*!< delta_y_counter crop supporting register*/
+    int32_t delta_y_counter;
+    /*!< delta_x_counter crop supporting register*/
+    int32_t delta_x_counter;
+    /*!< cu_nm_patch_x[10] noise model config unit - x values*/
+    int32_t cu_nm_patch_x[10];
+    /*!< cu_nm_patch_y[9] noise model config unit - y values*/
+    int32_t cu_nm_patch_y[9];
+    /*!< cu_nm_patch_slope[9] noise model config unit - slope values*/
+    int32_t cu_nm_patch_slope[9];
+    /*!< cu_nm_block_x[10] content detectors noise model config unit - x values*/
+    int32_t cu_nm_block_x[10];
+    /*!< cu_nm_block_y[9] content detectors noise model config unit - y values*/
+    int32_t cu_nm_block_y[9];
+    /*!< cu_nm_block_slope[9] content detectors noise model config unit - slope values*/
+    int32_t cu_nm_block_slope[9];
+    /*!< cu_input_compression_x[16] input compression function (16 to 12 bits) - x values*/
+    int32_t cu_input_compression_x[16];
+    /*!< cu_input_compression_y[15] input compression function (16 to 12 bits) - y values*/
+    int32_t cu_input_compression_y[15];
+    /*!< cu_input_compression_slope[15] input compression function (16 to 12 bits) - slope values*/
+    int32_t cu_input_compression_slope[15];
+    /*!< cu_input_decompression_x[16] input decompression function (16 to 24 bits) - x values*/
+    int32_t cu_input_decompression_x[16];
+    /*!< cu_input_decompression_y[15] input decompression function (16 to 24 bits) - y values*/
+    int32_t cu_input_decompression_y[15];
+    /*!< cu_input_decompression_slope[15] input decompression function (16 to 24 bits) - slope values*/
+    int32_t cu_input_decompression_slope[15];
+    /*!< cu_output_compression_x[16] output compression function (24 to 16 bits) - x values*/
+    int32_t cu_output_compression_x[16];
+    /*!< cu_output_compression_y[15] output compression function (24 to 16 bits) - y values*/
+    int32_t cu_output_compression_y[15];
+    /*!< cu_output_compression_slope[15] output compression function (24 to 16 bits) - slope values*/
+    int32_t cu_output_compression_slope[15];
+    /*!< nm_norm_scale Amount of bits to normalize the noise model*/
+    int32_t nm_norm_scale;
+    /*!< lsc_coeff_lut_gr[32] Shading coeffcients along the distance from the frame optical center*/
+    int32_t lsc_coeff_lut_gr[32];
+    /*!< lsc_coeff_lut_gb[32] Shading coeffcients along the distance from the frame optical center*/
+    int32_t lsc_coeff_lut_gb[32];
+    /*!< lsc_coeff_lut_r[32] Shading coeffcients along the distance from the frame optical center*/
+    int32_t lsc_coeff_lut_r[32];
+    /*!< lsc_coeff_lut_b[32] Shading coeffcients along the distance from the frame optical center*/
+    int32_t lsc_coeff_lut_b[32];
+
+} ia_pal_isp_bnlm_3_3_t;
+
+/*! \isp struct burst_isp
+3A results are passed to burstisp
+*/
+typedef struct
+{
+    /*!< exp_time_us exposure time*/
+    int32_t exp_time_us;
+    /*!< analog_gain Although the parameter is defined as analog_gain we are using it as total_gain. U24.8 precision*/
+    int32_t analog_gain;
+    /*!< wb_gain_gr Absolute WB gain for Gr in U3.13 format*/
+    uint32_t wb_gain_gr;
+    /*!< wb_gain_r Absolute WB gain for R in U3.13 format*/
+    uint32_t wb_gain_r;
+    /*!< wb_gain_b Absolute WB gain for Bin U3.13 format*/
+    uint32_t wb_gain_b;
+    /*!< wb_gain_gb Absolute WB gain for Gb in U3.13 format*/
+    uint32_t wb_gain_gb;
+    /*!< lut_width LUT width*/
+    int32_t lut_width;
+    /*!< lut_height LUT height*/
+    int32_t lut_height;
+    /*!< num_channel Number of channels*/
+    int32_t num_channel;
+    /*!< lut[16384] LUT_width*LUT_height*Num_channel*/
+    int32_t lut[16384];
+
+} ia_pal_isp_burst_isp_t;
+
+/*! \isp struct bxt_3a_ccm
+
+*/
+typedef struct
+{
+    /*!< gain_cx[8] WB coefficients*/
+    int32_t gain_cx[8];
+    /*!< m_1x[4] CCM matrix coefficients M11 - M14*/
+    int32_t m_1x[4];
+    /*!< m_2x[4] CCM matrix coefficients M21 - M24*/
+    int32_t m_2x[4];
+    /*!< m_3x[4] CCM matrix coefficients M31 - M34*/
+    int32_t m_3x[4];
+    /*!< c_0x[8] Y-calc matrix coefficients C01 - C08*/
+    int32_t c_0x[8];
+    /*!< c_1x[8] Y-calc matrix coefficients C11 - C18*/
+    int32_t c_1x[8];
+    /*!< c_2x[8] Y-calc matrix coefficients C21 - C28*/
+    int32_t c_2x[8];
+    /*!< c_3x[8] Y-calc matrix coefficients C31 - C38*/
+    int32_t c_3x[8];
+    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/
+    int32_t sensor_mode;
+    /*!< ccm_ycalc_en 0: CCM_YCALC is bypassed; 1: CCM_YCALC is enabled*/
+    int32_t ccm_ycalc_en;
+    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_00;
+    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_01;
+    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_02;
+    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_03;
+    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_10;
+    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_11;
+    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_12;
+    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_13;
+    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_20;
+    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_21;
+    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_22;
+    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_23;
+    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_30;
+    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_31;
+    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_32;
+    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_33;
+
+} ia_pal_isp_bxt_3a_ccm_t;
+
+/*! \isp struct bxt_acm
+
+*/
+typedef struct
+{
+    /*!< m_acm_bypass Block bypass for HW use*/
+    int32_t m_acm_bypass;
+    /*!< m_enable_chroma_lut Enable Chroma adaptation by LUT*/
+    int32_t m_enable_chroma_lut;
+    /*!< m_enable_luma_lut Enable Luma adaptation by LUT*/
+    int32_t m_enable_luma_lut;
+    /*!< m_enable_negative_pixels enable negative pixels in output*/
+    int32_t m_enable_negative_pixels;
+    /*!< m_enable_chroma_low_light_mode Enable Chroma adaptation in low light mode*/
+    int32_t m_enable_chroma_low_light_mode;
+    /*!< m_enable_luma_low_light_mode Enable Luma adaptation in low light mode*/
+    int32_t m_enable_luma_low_light_mode;
+    /*!< m_num_of_sectors number of sectors, U5.0*/
+    int32_t m_num_of_sectors;
+    /*!< m_chromagrid2uniformlut_cu_x[9] U12.0*/
+    int32_t m_chromagrid2uniformlut_cu_x[9];
+    /*!< m_chromagrid2uniformlut_cu_a[8] S4.10*/
+    int32_t m_chromagrid2uniformlut_cu_a[8];
+    /*!< m_lumagrid2uniformlut_cu_x[9] U12.0*/
+    int32_t m_lumagrid2uniformlut_cu_x[9];
+    /*!< m_lumagrid2uniformlut_cu_a[8] S4.10*/
+    int32_t m_lumagrid2uniformlut_cu_a[8];
+    /*!< m_ccm_matrix_arr[216] CCM's table (one per sector), S3.11*/
+    int32_t m_ccm_matrix_arr[216];
+    /*!< m_hue_boundary_arr[24] Table of sectors boundaries, U11.0*/
+    int32_t m_hue_boundary_arr[24];
+    /*!< m_ccm_index_arr[25] Table of the sectors indices, U5.0*/
+    int32_t m_ccm_index_arr[25];
+    /*!< m_offr CCM bias for R, S13.0*/
+    int32_t m_offr;
+    /*!< m_offg CCM bias for G, S13.0*/
+    int32_t m_offg;
+    /*!< m_offb CCM bias for B, S13.0*/
+    int32_t m_offb;
+    /*!< m_luma_coeff_arr[3] Luna coefficients (weights), U0.8*/
+    int32_t m_luma_coeff_arr[3];
+    /*!< m_adapt_chroma_lut[81] Chroma adaptation LUT, U2.7*/
+    int32_t m_adapt_chroma_lut[81];
+    /*!< m_adapt_luma_lut[81] Luma adaptation LUT, S13.0*/
+    int32_t m_adapt_luma_lut[81];
+    /*!< m_enable_low_light_mode Enable CC's adaptation low light mode*/
+    int32_t m_enable_low_light_mode;
+
+} ia_pal_isp_bxt_acm_t;
+
+/*! \isp struct bxt_aestatistics
+
+*/
+typedef struct
+{
+    /*!< cell0[96] weighted histogram grid values*/
+    int32_t cell0[96];
+    /*!< cell1[96] weighted histogram grid values*/
+    int32_t cell1[96];
+    /*!< cell2[96] weighted histogram grid values*/
+    int32_t cell2[96];
+    /*!< cell3[96] weighted histogram grid values*/
+    int32_t cell3[96];
+    /*!< cell4[96] weighted histogram grid values*/
+    int32_t cell4[96];
+    /*!< cell5[96] weighted histogram grid values*/
+    int32_t cell5[96];
+    /*!< cell6[96] weighted histogram grid values*/
+    int32_t cell6[96];
+    /*!< cell7[96] weighted histogram grid values*/
+    int32_t cell7[96];
+    /*!< grid_width represents number of horizontal grid cells*/
+    int32_t grid_width;
+    /*!< grid_height represents number of vertical grid cells*/
+    int32_t grid_height;
+    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128, 256)*/
+    int32_t block_width;
+    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128, 256)*/
+    int32_t block_height;
+    /*!< ae_en 0: FF will not write to the AE  array; 1: FF will write*/
+    int32_t ae_en;
+    /*!< rst_hist_array 1: triggers the reset mechanism for the GLB_HIST*/
+    int32_t rst_hist_array;
+    /*!< x_start X top left corner of the grid. 0 <= x_start <= (frame_width - 1)*/
+    int32_t x_start;
+    /*!< y_start Y top left corner of the grid. 0 <= y_start <= (frame_height - 1)*/
+    int32_t y_start;
+    /*!< x_end X bottom right corner of the grid. x_end = x_start + (grid_width << block_width) - 1*/
+    int32_t x_end;
+    /*!< y_end Y bottom right corner of the grid. y_end = y_start + (grid_height << block_height) - 1*/
+    int32_t y_end;
+    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/
+    int32_t sensor_mode;
+    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_00;
+    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_01;
+    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_02;
+    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_03;
+    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_10;
+    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_11;
+    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_12;
+    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_13;
+    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_20;
+    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_21;
+    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_22;
+    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_23;
+    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_30;
+    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_31;
+    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_32;
+    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_33;
+
+} ia_pal_isp_bxt_aestatistics_t;
+
+/*! \isp struct bxt_af_awb_fr_statistics
+
+*/
+typedef struct
+{
+    /*!< grid_width represents number of horizontal grid cells*/
+    int32_t grid_width;
+    /*!< grid_height represents number of vertical grid cells*/
+    int32_t grid_height;
+    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128,256)*/
+    int32_t block_width;
+    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128,256)*/
+    int32_t block_height;
+    /*!< grid_height_per_slice # of blocks (vert) per Meta-Data Slice (grid_height_per_slice * grid_width <= 32; grid_height_per_slice <= 2)*/
+    int32_t grid_height_per_slice;
+    /*!< y_fr_en 0: FF will not write to the Y array; 1: FF will write*/
+    int32_t y_fr_en;
+    /*!< awb_fr_en 0: FF will not write to the AWB_FR array; 1: FF will write*/
+    int32_t awb_fr_en;
+    /*!< ff_en 0: FF is bypassed; 1: FF is enabled*/
+    int32_t ff_en;
+    /*!< x_start X top left corner of the grid. 20 <= x_start <= (frame_width - 1)*/
+    int32_t x_start;
+    /*!< y_start Y top left corner of the grid. 0 <= x_start <= (frame_height - 1)*/
+    int32_t y_start;
+    /*!< x_end X bottom right corner of the grid. x_end <= (frame_width - 1 - 20)*/
+    int32_t x_end;
+    /*!< y_end Y bottom right corner of the grid. y_end <= (frame_height - 1)*/
+    int32_t y_end;
+    /*!< shftr_val_x[7] represents log2(num of pixels of the estimated colour component in a block) for Y00, Y01, Y10, Y11, R, G, B*/
+    int32_t shftr_val_x[7];
+    /*!< gx0[4] Ycalc contribution ratio for Pat_ij*/
+    int32_t gx0[4];
+    /*!< gx1[4] Ycalc contribution ratio for Pat_ij*/
+    int32_t gx1[4];
+    /*!< gx2[4] Ycalc contribution ratio for Pat_ij*/
+    int32_t gx2[4];
+    /*!< gx3[4] Ycalc contribution ratio for Pat_ij*/
+    int32_t gx3[4];
+    /*!< mask_y0 selecting the relevant pixels for Y0; bit k corresponds to Row * 4 + Column*/
+    int32_t mask_y0;
+    /*!< mask_y1 selecting the relevant pixels for Y1; bit k corresponds to Row * 4 + Column*/
+    int32_t mask_y1;
+    /*!< oe_y0 Output Enable for Y0; bit k corresponds to Row * 2 + Column*/
+    int32_t oe_y0;
+    /*!< oe_y1 Output Enable for Y1; bit k corresponds to Row * 2 + Column*/
+    int32_t oe_y1;
+    /*!< on_x_y0[4] Y0 estimation normalization (00, 01, 10, 11)*/
+    int32_t on_x_y0[4];
+    /*!< on_x_y1[4] Y1 estimation normalization (00, 01, 10, 11)*/
+    int32_t on_x_y1[4];
+    /*!< r_select selecting the relevant R pixels; bit k corresponds to Row * 4 + Column*/
+    int32_t r_select;
+    /*!< g_select selecting the relevant G pixels; bit k corresponds to Row * 4 + Column + 16*/
+    int32_t g_select;
+    /*!< b_select selecting the relevant B pixels; bit k corresponds to Row * 4 + Column*/
+    int32_t b_select;
+    /*!< y00_filter_coeff[6] filter coefficients for Y00 (A1, A2, A3, A4, A5, A6)*/
+    int32_t y00_filter_coeff[6];
+    /*!< y00_filter_sign_vec sign vector for Y00*/
+    int32_t y00_filter_sign_vec;
+    /*!< y01_filter_coeff[6] filter coefficients for Y01 (A1, A2, A3, A4, A5, A6)*/
+    int32_t y01_filter_coeff[6];
+    /*!< y01_filter_sign_vec sign vector for Y01*/
+    int32_t y01_filter_sign_vec;
+    /*!< y10_filter_coeff[6] filter coefficients for Y10 (A1, A2, A3, A4, A5, A6)*/
+    int32_t y10_filter_coeff[6];
+    /*!< y10_filter_sign_vec sign vector for Y10*/
+    int32_t y10_filter_sign_vec;
+    /*!< y11_filter_coeff[6] filter coefficients for Y11 (A1, A2, A3, A4, A5, A6)*/
+    int32_t y11_filter_coeff[6];
+    /*!< y11_filter_sign_vec sign vector for Y11*/
+    int32_t y11_filter_sign_vec;
+    /*!< r_filter_coeff[6] filter coefficients for R (A1, A2, A3, A4, A5, A6)*/
+    int32_t r_filter_coeff[6];
+    /*!< r_filter_sign_vec sign vector for R*/
+    int32_t r_filter_sign_vec;
+    /*!< g_filter_coeff[6] filter coefficients for G (A1, A2, A3, A4, A5, A6)*/
+    int32_t g_filter_coeff[6];
+    /*!< g_filter_sign_vec sign vector for G*/
+    int32_t g_filter_sign_vec;
+    /*!< b_filter_coeff[6] filter coefficients for B (A1, A2, A3, A4, A5, A6)*/
+    int32_t b_filter_coeff[6];
+    /*!< b_filter_sign_vec sign vector for B*/
+    int32_t b_filter_sign_vec;
+    /*!< nf_x[7] Filter response normalization factors for Y00, Y01, Y10, Y11, R, G, B*/
+    int32_t nf_x[7];
+    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/
+    int32_t sensor_mode;
+
+} ia_pal_isp_bxt_af_awb_fr_statistics_t;
+
+/*! \isp struct bxt_applycorrection
+
+*/
+typedef struct
+{
+    /*!< global_enable global enable*/
+    int32_t global_enable;
+    /*!< gdc_enable gdc enable*/
+    int32_t gdc_enable;
+    /*!< dpc_enable dpc enable*/
+    int32_t dpc_enable;
+    /*!< green_pos gb position*/
+    int32_t green_pos;
+
+} ia_pal_isp_bxt_applycorrection_t;
+
+/*! \isp struct bxt_awbstatistics
+
+*/
+typedef struct
+{
+    /*!< grid_width represents number of horizontal grid cells*/
+    int32_t grid_width;
+    /*!< grid_height represents number of vertical grid cells*/
+    int32_t grid_height;
+    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128)*/
+    int32_t block_width;
+    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128)*/
+    int32_t block_height;
+    /*!< grid_height_per_slice # of blocks in vert.axis per Meta-Data Slice (grid_height_per_slice * grid_width <= 160)*/
+    int32_t grid_height_per_slice;
+    /*!< awb_en 0: FF will not write to the AWB  array; 1: FF will write*/
+    int32_t awb_en;
+    /*!< rgbs_incl_sat 0: do not include saturated quads in the average; 1: include saturated quads in the average*/
+    int32_t rgbs_incl_sat;
+    /*!< x_start X top left corner of the grid. 0 <= x_start <= (frame_width - 1)*/
+    int32_t x_start;
+    /*!< y_start Y top left corner of the grid. 0 <= y_start <= (frame_height - 1)*/
+    int32_t y_start;
+    /*!< x_end X bottom right corner of the grid. x_end = x_start + (grid_width << block_width) - 1*/
+    int32_t x_end;
+    /*!< y_end Y bottom right corner of the grid. y_end = y_start + (grid_height << block_height) - 1*/
+    int32_t y_end;
+    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/
+    int32_t sensor_mode;
+    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_00;
+    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_01;
+    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_02;
+    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_03;
+    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_10;
+    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_11;
+    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_12;
+    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_13;
+    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_20;
+    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_21;
+    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_22;
+    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_23;
+    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_30;
+    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_31;
+    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_32;
+    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_33;
+    /*!< rgbs_thr_cx[8] RGBS threshold value (C0, C1, C2, C3, C4, C5, C6, C7)*/
+    int32_t rgbs_thr_cx[8];
+    /*!< shftr_val_cx[8] ShiftVal is derived from log2(number of pixels from C0-C7 color channel in a cell)*/
+    int32_t shftr_val_cx[8];
+    /*!< shftr_sat represents log2(num of pixels in cell)*/
+    int32_t shftr_sat;
+
+} ia_pal_isp_bxt_awbstatistics_t;
+
+/*! \isp struct bxt_blc
+
+*/
+typedef struct
+{
+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/
+    int32_t cfa_type;
+    /*!< bypass bypass for the filter*/
+    int32_t bypass;
+    /*!< dummy_bypass dumy bypass for the filter. Required to allign block API to RTL registers*/
+    int32_t dummy_bypass;
+    /*!< fixobc00 black level value*/
+    int32_t fixobc00;
+    /*!< fixobc01 black level value*/
+    int32_t fixobc01;
+    /*!< fixobc02 black level value*/
+    int32_t fixobc02;
+    /*!< fixobc03 black level value*/
+    int32_t fixobc03;
+    /*!< fixobc10 black level value*/
+    int32_t fixobc10;
+    /*!< fixobc11 black level value*/
+    int32_t fixobc11;
+    /*!< fixobc12 black level value*/
+    int32_t fixobc12;
+    /*!< fixobc13 black level value*/
+    int32_t fixobc13;
+    /*!< fixobc20 black level value*/
+    int32_t fixobc20;
+    /*!< fixobc21 black level value*/
+    int32_t fixobc21;
+    /*!< fixobc22 black level value*/
+    int32_t fixobc22;
+    /*!< fixobc23 black level value*/
+    int32_t fixobc23;
+    /*!< fixobc30 black level value*/
+    int32_t fixobc30;
+    /*!< fixobc31 black level value*/
+    int32_t fixobc31;
+    /*!< fixobc32 black level value*/
+    int32_t fixobc32;
+    /*!< fixobc33 black level value*/
+    int32_t fixobc33;
+
+} ia_pal_isp_bxt_blc_t;
+
+/*! \isp struct bxt_blc_b
+
+*/
+typedef struct
+{
+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/
+    int32_t cfa_type;
+    /*!< bypass bypass for the filter*/
+    int32_t bypass;
+    /*!< dummy_bypass dumy bypass for the filter. Required to allign block API to RTL registers*/
+    int32_t dummy_bypass;
+    /*!< fixobc00 black level value*/
+    int32_t fixobc00;
+    /*!< fixobc01 black level value*/
+    int32_t fixobc01;
+    /*!< fixobc02 black level value*/
+    int32_t fixobc02;
+    /*!< fixobc03 black level value*/
+    int32_t fixobc03;
+    /*!< fixobc10 black level value*/
+    int32_t fixobc10;
+    /*!< fixobc11 black level value*/
+    int32_t fixobc11;
+    /*!< fixobc12 black level value*/
+    int32_t fixobc12;
+    /*!< fixobc13 black level value*/
+    int32_t fixobc13;
+    /*!< fixobc20 black level value*/
+    int32_t fixobc20;
+    /*!< fixobc21 black level value*/
+    int32_t fixobc21;
+    /*!< fixobc22 black level value*/
+    int32_t fixobc22;
+    /*!< fixobc23 black level value*/
+    int32_t fixobc23;
+    /*!< fixobc30 black level value*/
+    int32_t fixobc30;
+    /*!< fixobc31 black level value*/
+    int32_t fixobc31;
+    /*!< fixobc32 black level value*/
+    int32_t fixobc32;
+    /*!< fixobc33 black level value*/
+    int32_t fixobc33;
+
+} ia_pal_isp_bxt_blc_b_t;
+
+/*! \isp struct bxt_blc_c
+
+*/
+typedef struct
+{
+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/
+    int32_t cfa_type;
+    /*!< bypass bypass for the filter*/
+    int32_t bypass;
+    /*!< dummy_bypass dumy bypass for the filter. Required to allign block API to RTL registers*/
+    int32_t dummy_bypass;
+    /*!< fixobc00 black level value*/
+    int32_t fixobc00;
+    /*!< fixobc01 black level value*/
+    int32_t fixobc01;
+    /*!< fixobc02 black level value*/
+    int32_t fixobc02;
+    /*!< fixobc03 black level value*/
+    int32_t fixobc03;
+    /*!< fixobc10 black level value*/
+    int32_t fixobc10;
+    /*!< fixobc11 black level value*/
+    int32_t fixobc11;
+    /*!< fixobc12 black level value*/
+    int32_t fixobc12;
+    /*!< fixobc13 black level value*/
+    int32_t fixobc13;
+    /*!< fixobc20 black level value*/
+    int32_t fixobc20;
+    /*!< fixobc21 black level value*/
+    int32_t fixobc21;
+    /*!< fixobc22 black level value*/
+    int32_t fixobc22;
+    /*!< fixobc23 black level value*/
+    int32_t fixobc23;
+    /*!< fixobc30 black level value*/
+    int32_t fixobc30;
+    /*!< fixobc31 black level value*/
+    int32_t fixobc31;
+    /*!< fixobc32 black level value*/
+    int32_t fixobc32;
+    /*!< fixobc33 black level value*/
+    int32_t fixobc33;
+
+} ia_pal_isp_bxt_blc_c_t;
+
+/*! \isp struct bxt_bnlm
+
+*/
+typedef struct
+{
+    /*!< div_unit_slope[15] DIV_UNIT_SLOPE - fixed value array for config unit*/
+    int32_t div_unit_slope[15];
+    /*!< div_unit_x[16] DIV_UNIT_X - fixed value array for config unit*/
+    int32_t div_unit_x[16];
+    /*!< div_unit_y[15] DIV_UNIT_Y - fixed value array for config unit*/
+    int32_t div_unit_y[15];
+    /*!< m_bypass Block bypass for HW use*/
+    int32_t m_bypass;
+    /*!< m_bcandshift1[4] m_BCandShift1: Group B candidate factoring params*/
+    int32_t m_bcandshift1[4];
+    /*!< m_bcandshift2[4] m_BCandShift2: Group B candidate factoring params*/
+    int32_t m_bcandshift2[4];
+    /*!< m_bcandsubflag[4] m_BCandSubFlag: Group B candidate factoring params*/
+    int32_t m_bcandsubflag[4];
+    /*!< m_ccandshift1[4] m_CCandShift1: Group C candidate factoring params*/
+    int32_t m_ccandshift1[4];
+    /*!< m_ccandshift2[4] m_CCandShift2:  Group C candidate factoring params*/
+    int32_t m_ccandshift2[4];
+    /*!< m_ccandsubflag[4] m_CCandSubFlag:  Group C candidate factoring params*/
+    int32_t m_ccandsubflag[4];
+    /*!< m_candconstellation[2] m_CandConstellation: (0,1,2)  (1=Dendse 10x10 for Y video  0=16x16 sparse for Bayer)    2=Obsolete   input format related params;   Only first element is in use*/
+    int32_t m_candconstellation[2];
+    /*!< m_dcandshift1[4] m_DCandShift1:  Group D candidate factoring params*/
+    int32_t m_dcandshift1[4];
+    /*!< m_dcandshift2[4] m_DCandShift2:   Group D candidate factoring params*/
+    int32_t m_dcandshift2[4];
+    /*!< m_dcandsubflag[4] m_DCandSubFlag:   Group D candidate factoring params*/
+    int32_t m_dcandsubflag[4];
+    /*!< m_detail_radial_lut_f1[12] m_DETAIL_RADIAL_LUT_f1*/
+    int32_t m_detail_radial_lut_f1[12];
+    /*!< m_detail_radial_lut_f2[12] m_DETAIL_RADIAL_LUT_f2*/
+    int32_t m_detail_radial_lut_f2[12];
+    /*!< m_detail_radial_lut_s1[12] m_DETAIL_RADIAL_LUT_s1*/
+    int32_t m_detail_radial_lut_s1[12];
+    /*!< m_detail_radial_lut_s2[12] m_DETAIL_RADIAL_LUT_s2*/
+    int32_t m_detail_radial_lut_s2[12];
+    /*!< m_detail_radial_lut_s3[12] m_DETAIL_RADIAL_LUT_s3*/
+    int32_t m_detail_radial_lut_s3[12];
+    /*!< m_detail_radial_lut_v[12] m_DETAIL_RADIAL_LUT_v*/
+    int32_t m_detail_radial_lut_v[12];
+    /*!< m_exp_lut_f1[12] m_EXP_LUT_f1*/
+    int32_t m_exp_lut_f1[12];
+    /*!< m_exp_lut_f2[12] m_EXP_LUT_f2*/
+    int32_t m_exp_lut_f2[12];
+    /*!< m_exp_lut_o[12] m_EXP_LUT_o*/
+    int32_t m_exp_lut_o[12];
+    /*!< m_exp_lut_s1[12] m_EXP_LUT_s1*/
+    int32_t m_exp_lut_s1[12];
+    /*!< m_exp_lut_s2[12] m_EXP_LUT_s2*/
+    int32_t m_exp_lut_s2[12];
+    /*!< m_exp_lut_s3[12] m_EXP_LUT_s3*/
+    int32_t m_exp_lut_s3[12];
+    /*!< m_exp_lut_v[12] m_EXP_LUT_v*/
+    int32_t m_exp_lut_v[12];
+    /*!< m_frame_width OBSOLETE*/
+    int32_t m_frame_width;
+    /*!< m_matchqualitymaxidx[4] OBSOLETE*/
+    int32_t m_matchqualitymaxidx[4];
+    /*!< m_mu_root_lut_f1[12] m_MU_ROOT_LUT_f1*/
+    int32_t m_mu_root_lut_f1[12];
+    /*!< m_mu_root_lut_f2[12] m_MU_ROOT_LUT_f2*/
+    int32_t m_mu_root_lut_f2[12];
+    /*!< m_mu_root_lut_s1[12] m_MU_ROOT_LUT_s1*/
+    int32_t m_mu_root_lut_s1[12];
+    /*!< m_mu_root_lut_s2[12] m_MU_ROOT_LUT_s2*/
+    int32_t m_mu_root_lut_s2[12];
+    /*!< m_mu_root_lut_s3[12] m_MU_ROOT_LUT_s3*/
+    int32_t m_mu_root_lut_s3[12];
+    /*!< m_mu_root_lut_v[12] m_MU_ROOT_LUT_v*/
+    int32_t m_mu_root_lut_v[12];
+    /*!< m_nl_lut1_f1[10] m_NL_LUT1_f1*/
+    int32_t m_nl_lut1_f1[10];
+    /*!< m_nl_lut1_f2[10] m_NL_LUT1_f1*/
+    int32_t m_nl_lut1_f2[10];
+    /*!< m_nl_lut1_s1[10] m_NL_LUT1_s1*/
+    int32_t m_nl_lut1_s1[10];
+    /*!< m_nl_lut1_s2[10] m_NL_LUT1_s2*/
+    int32_t m_nl_lut1_s2[10];
+    /*!< m_nl_lut1_s3[10] m_NL_LUT1_s2*/
+    int32_t m_nl_lut1_s3[10];
+    /*!< m_nl_lut1_v[10] m_NL_LUT1_v*/
+    int32_t m_nl_lut1_v[10];
+    /*!< m_nl_lut2_f1[10] m_NL_LUT2_f1*/
+    int32_t m_nl_lut2_f1[10];
+    /*!< m_nl_lut2_f2[10] m_NL_LUT2_f1*/
+    int32_t m_nl_lut2_f2[10];
+    /*!< m_nl_lut2_s1[10] m_NL_LUT2_s1*/
+    int32_t m_nl_lut2_s1[10];
+    /*!< m_nl_lut2_s2[10] m_NL_LUT2_s2*/
+    int32_t m_nl_lut2_s2[10];
+    /*!< m_nl_lut2_s3[10] m_NL_LUT2_s2*/
+    int32_t m_nl_lut2_s3[10];
+    /*!< m_nl_lut2_v[10] m_NL_LUT2_v*/
+    int32_t m_nl_lut2_v[10];
+    /*!< m_nl_lut3_f1[10] m_NL_LUT3_f1*/
+    int32_t m_nl_lut3_f1[10];
+    /*!< m_nl_lut3_f2[10] m_NL_LUT3_f1*/
+    int32_t m_nl_lut3_f2[10];
+    /*!< m_nl_lut3_s1[10] m_NL_LUT3_s1*/
+    int32_t m_nl_lut3_s1[10];
+    /*!< m_nl_lut3_s2[10] m_NL_LUT3_s2*/
+    int32_t m_nl_lut3_s2[10];
+    /*!< m_nl_lut3_s3[10] m_NL_LUT3_s2*/
+    int32_t m_nl_lut3_s3[10];
+    /*!< m_nl_lut3_v[10] m_NL_LUT3_v*/
+    int32_t m_nl_lut3_v[10];
+    /*!< m_nl_lut4_f1[10] m_NL_LUT4_f1*/
+    int32_t m_nl_lut4_f1[10];
+    /*!< m_nl_lut4_f2[10] m_NL_LUT4_f1*/
+    int32_t m_nl_lut4_f2[10];
+    /*!< m_nl_lut4_s1[10] m_NL_LUT4_s1*/
+    int32_t m_nl_lut4_s1[10];
+    /*!< m_nl_lut4_s2[10] m_NL_LUT4_s2*/
+    int32_t m_nl_lut4_s2[10];
+    /*!< m_nl_lut4_s3[10] m_NL_LUT4_s2*/
+    int32_t m_nl_lut4_s3[10];
+    /*!< m_nl_lut4_v[10] m_NL_LUT4_v*/
+    int32_t m_nl_lut4_v[10];
+    /*!< m_nl_th[3] m_NL_TH: detailIx-->detailType 3 THs for classification 1=Flat.vs.Weak; 2=Weak.vs.Texture 3=Texture.vs.Edge 4=OBSOLETE & not implemented*/
+    int32_t m_nl_th[3];
+    /*!< m_radial_power_lut_f1[12] m_RADIAL_POWER_LUT_f1*/
+    int32_t m_radial_power_lut_f1[12];
+    /*!< m_radial_power_lut_f2[12] m_RADIAL_POWER_LUT_f2*/
+    int32_t m_radial_power_lut_f2[12];
+    /*!< m_radial_power_lut_s1[12] m_RADIAL_POWER_LUT_s1*/
+    int32_t m_radial_power_lut_s1[12];
+    /*!< m_radial_power_lut_s2[12] m_RADIAL_POWER_LUT_s2*/
+    int32_t m_radial_power_lut_s2[12];
+    /*!< m_radial_power_lut_s3[12] m_RADIAL_POWER_LUT_s3*/
+    int32_t m_radial_power_lut_s3[12];
+    /*!< m_radial_power_lut_v[12] m_RADIAL_POWER_LUT_v*/
+    int32_t m_radial_power_lut_v[12];
+    /*!< m_rxinitial m_RxInitial: Radial  (coordinates of corner) - Initial X [0,m_frame_width-1]  Default=m_frame_width/2*/
+    int32_t m_rxinitial;
+    /*!< m_rxsqrinitial m_RxSqrInitial: m_RxInitial^2*/
+    int32_t m_rxsqrinitial;
+    /*!< m_ryinitial m_RyInitial: : Radial  (coordinates of corner) - Initial Y [0,m_frame_height-1]  Default=m_frame_height/2*/
+    int32_t m_ryinitial;
+    /*!< m_rysqrinitial m_RySqrInitial: m_RyInitial^2*/
+    int32_t m_rysqrinitial;
+    /*!< m_sad_norm_lut_f1[12] m_SAD_NORM_LUT_f1*/
+    int32_t m_sad_norm_lut_f1[12];
+    /*!< m_sad_norm_lut_f2[12] m_SAD_NORM_LUT_f2*/
+    int32_t m_sad_norm_lut_f2[12];
+    /*!< m_sad_norm_lut_s1[12] m_SAD_NORM_LUT_s1*/
+    int32_t m_sad_norm_lut_s1[12];
+    /*!< m_sad_norm_lut_s2[12] m_SAD_NORM_LUT_s2*/
+    int32_t m_sad_norm_lut_s2[12];
+    /*!< m_sad_norm_lut_s3[12] m_SAD_NORM_LUT_s3*/
+    int32_t m_sad_norm_lut_s3[12];
+    /*!< m_sad_norm_lut_v[12] m_SAD_NORM_LUT_v*/
+    int32_t m_sad_norm_lut_v[12];
+    /*!< m_sig_n_detail_lut_f1[10] m_SIG_N_DETAIL_LUT_f1*/
+    int32_t m_sig_n_detail_lut_f1[10];
+    /*!< m_sig_n_detail_lut_f2[10] m_SIG_N_DETAIL_LUT_f1*/
+    int32_t m_sig_n_detail_lut_f2[10];
+    /*!< m_sig_n_detail_lut_s1[10] m_SIG_N_DETAIL_LUT_s1*/
+    int32_t m_sig_n_detail_lut_s1[10];
+    /*!< m_sig_n_detail_lut_s2[10] m_SIG_N_DETAIL_LUT_s2*/
+    int32_t m_sig_n_detail_lut_s2[10];
+    /*!< m_sig_n_detail_lut_s3[10] m_SIG_N_DETAIL_LUT_s2*/
+    int32_t m_sig_n_detail_lut_s3[10];
+    /*!< m_sig_n_detail_lut_v[10] m_SIG_N_DETAIL_LUT_v*/
+    int32_t m_sig_n_detail_lut_v[10];
+    /*!< m_sig_n_rad_lut_f1[12] m_SIG_N_RAD_LUT_f1*/
+    int32_t m_sig_n_rad_lut_f1[12];
+    /*!< m_sig_n_rad_lut_f2[12] m_SIG_N_RAD_LUT_f2*/
+    int32_t m_sig_n_rad_lut_f2[12];
+    /*!< m_sig_n_rad_lut_s1[12] m_SIG_N_RAD_LUT_s1*/
+    int32_t m_sig_n_rad_lut_s1[12];
+    /*!< m_sig_n_rad_lut_s2[12] m_SIG_N_RAD_LUT_s2*/
+    int32_t m_sig_n_rad_lut_s2[12];
+    /*!< m_sig_n_rad_lut_s3[12] m_SIG_N_RAD_LUT_s3*/
+    int32_t m_sig_n_rad_lut_s3[12];
+    /*!< m_sig_n_rad_lut_v[12] m_SIG_N_RAD_LUT_v*/
+    int32_t m_sig_n_rad_lut_v[12];
+    /*!< m_sve_groups m_SVE_Groups: OBSOLETE*/
+    int32_t m_sve_groups;
+    /*!< m_sve_enable m_SVE_enable: OBSOLETE*/
+    int32_t m_sve_enable;
+    /*!< m_sve_gain[2] m_SVE_gain: OBSOLETE*/
+    int32_t m_sve_gain[2];
+    /*!< m_sve_shift[2] m_SVE_shift: OBSOLETE*/
+    int32_t m_sve_shift[2];
+    /*!< m_signglobal_shift1 m_SigNGlobal_SHIFT1: OBSOLETE*/
+    int32_t m_signglobal_shift1;
+    /*!< m_signglobal_shift2 m_SigNGlobal_SHIFT2: OBSOLETE*/
+    int32_t m_signglobal_shift2;
+    /*!< m_signglobal_sub_flag m_SigNGlobal_SUB_FLAG: OBSOLETE*/
+    int32_t m_signglobal_sub_flag;
+    /*!< m_detailidxshiftleft m_detailIdxShiftLeft: detail index shift left - Dynamic range normalization  Fixed=2  [2:7]*/
+    int32_t m_detailidxshiftleft;
+    /*!< m_matchqualitycands[16] m_matchQualityCands: match quality index weight pick  4X4   alpha0 inputs  (4 canidates [ 0*/
+    int32_t m_matchqualitycands[16];
+    /*!< m_ncandforavgpixel[4] m_nCandForAvgPixel: number of cands. for average pixel  per detail Type  (15..0)+1  Typically=[16 6 4 6]*/
+    int32_t m_ncandforavgpixel[4];
+    /*!< m_sortth[15] m_sortTh: sort th index set - THs for Pseudo SORT (Const not to be configured)*/
+    int32_t m_sortth[15];
+    /*!< m_statusetopleft m_statUseTopLeft: is top left pixel G/W  (for Bayer start)*/
+    int32_t m_statusetopleft;
+    /*!< m_wmaxminth m_wMaxMinTh: Final TH on Max(Weight) to overright Alpha*/
+    int32_t m_wmaxminth;
+    /*!< m_wsumminth m_wSumMinTh:  Final TH on Sum(Weight) to overright Alpha*/
+    int32_t m_wsumminth;
+    /*!< rad_enable OBSOLETE*/
+    int32_t rad_enable;
+
+} ia_pal_isp_bxt_bnlm_t;
+
+/*! \isp struct bxt_ccm
+
+*/
+typedef struct
+{
+    /*!< bypass block bypass bit*/
+    int32_t bypass;
+    /*!< nb1 offset 1 for the transform*/
+    int32_t nb1;
+    /*!< nb2 offset 2 for the transform*/
+    int32_t nb2;
+    /*!< nb3 offset 3 for the transform*/
+    int32_t nb3;
+    /*!< configuration_matrix[9] ccm configuration matrix precision: S4.11*/
+    int32_t configuration_matrix[9];
+
+} ia_pal_isp_bxt_ccm_t;
+
+/*! \isp struct bxt_convert16sto8u
+
+*/
+typedef struct
+{
+    /*!< m_bypass Bypass     {0,1}*/
+    int32_t m_bypass;
+
+} ia_pal_isp_bxt_convert16sto8u_t;
+
+/*! \isp struct bxt_cropstills
+
+*/
+typedef struct
+{
+    /*!< Bypass block bypass*/
+    int32_t Bypass;
+    /*!< LeftBorder crop left border*/
+    int32_t LeftBorder;
+    /*!< TopBorder crop top border*/
+    int32_t TopBorder;
+    /*!< RightBorder crop right border*/
+    int32_t RightBorder;
+    /*!< BottomBorder crop bottom border*/
+    int32_t BottomBorder;
+
+} ia_pal_isp_bxt_cropstills_t;
+
+/*! \isp struct bxt_cropvideo
+
+*/
+typedef struct
+{
+    /*!< Bypass block bypass*/
+    int32_t Bypass;
+    /*!< LeftBorder crop left border*/
+    int32_t LeftBorder;
+    /*!< TopBorder crop top border*/
+    int32_t TopBorder;
+    /*!< RightBorder crop right border*/
+    int32_t RightBorder;
+    /*!< BottomBorder crop bottom border*/
+    int32_t BottomBorder;
+
+} ia_pal_isp_bxt_cropvideo_t;
+
+/*! \isp struct bxt_csc
+
+*/
+typedef struct
+{
+    /*!< m_csc_c_matrix_arr[9] CSC Matrix components (S0.14)*/
+    int32_t m_csc_c_matrix_arr[9];
+    /*!< m_csc_b_vec_arr[3] CSC Vector components (S0.13)*/
+    int32_t m_csc_b_vec_arr[3];
+    /*!< m_chroma_ds_coeff_arr[8] Chroma downsample 4x2 filter coefficients (U2.0)*/
+    int32_t m_chroma_ds_coeff_arr[8];
+    /*!< m_chroma_ds_nf Chroma downsample 4x2 filter normalization factor*/
+    int32_t m_chroma_ds_nf;
+    /*!< m_bypass Bypassing CSC. Outputting RGB to the Chroma downscale*/
+    int32_t m_bypass;
+    /*!< m_uv_bin_output 0 = YUV4:2:0 output, 1 = YUV4:2:2 output*/
+    int32_t m_uv_bin_output;
+
+} ia_pal_isp_bxt_csc_t;
+
+/*! \isp struct bxt_csc_yuv2rgb
+CSC YUV2RGB Block
+*/
+typedef struct
+{
+    /*!< coeff_shift coeff_shift*/
+    int32_t coeff_shift;
+    /*!< yuv_calibration[3] yuv_calibration*/
+    int32_t yuv_calibration[3];
+    /*!< yuv2rgb_coef[9] yuv2rgb_coef*/
+    int32_t yuv2rgb_coef[9];
+
+} ia_pal_isp_bxt_csc_yuv2rgb_t;
+
+/*! \isp struct bxt_csc2
+Color Space Conversion and down-sample to 4:2:0
+*/
+typedef struct
+{
+    /*!< bypass_0_1 Bypass CSC2*/
+    int32_t bypass_0_1;
+    /*!< use_fir_flag use ani-aliasing filter before decimation*/
+    int32_t use_fir_flag;
+    /*!< rgb2yuv_coef[3] 3 coefs for Y , 1 for U and 1 for V , Q15*/
+    int32_t rgb2yuv_coef[3];
+
+} ia_pal_isp_bxt_csc2_t;
+
+/*! \isp struct bxt_demosaic
+
+*/
+typedef struct
+{
+    /*!< bypass Block bypass for HW use*/
+    int32_t bypass;
+    /*!< frame_width Frame width*/
+    int32_t frame_width;
+    /*!< gammasg Sharpening coefficient*/
+    int32_t gammasg;
+    /*!< lcctrl Checkers removal control*/
+    int32_t lcctrl;
+    /*!< crparam1 High frequency denoise param1*/
+    int32_t crparam1;
+    /*!< crparam2 High frequency denoise param2*/
+    int32_t crparam2;
+    /*!< coringparam False color correction gain*/
+    int32_t coringparam;
+    /*!< char_en Checkers removal enable*/
+    int32_t char_en;
+    /*!< fcc_en False color correction enable*/
+    int32_t fcc_en;
+    /*!< car_en Chroam artifacts removal enable*/
+    int32_t car_en;
+    /*!< hfar_en High frequency aliasing reduction correction enable*/
+    int32_t hfar_en;
+    /*!< es_enable Edge smoothing enable*/
+    int32_t es_enable;
+    /*!< es_pow Edge smoohing enable.*/
+    int32_t es_pow;
+    /*!< diag_car_trade_off_th Diagonal regions protection param1*/
+    int32_t diag_car_trade_off_th;
+    /*!< diag_car_trade_off_slope Diagonal regions protection param2*/
+    int32_t diag_car_trade_off_slope;
+    /*!< stream_ylp_c Coefficient for the YLP for central element of 3x3 neighborhood*/
+    int32_t stream_ylp_c;
+    /*!< stream_ylp_p Coefficient for the YLP for peripheral element of 3x3 neighborhood*/
+    int32_t stream_ylp_p;
+    /*!< stream_ylp_d Coefficient for the YLP for diagonal element of 3x3 neighborhood*/
+    int32_t stream_ylp_d;
+    /*!< stream_ylp_mul_norm Coefficient for multiplier in YLP stream*/
+    int32_t stream_ylp_mul_norm;
+    /*!< stream_ylp_norm_shift Coefficient for YLP stream*/
+    int32_t stream_ylp_norm_shift;
+    /*!< configunitdiag1_x[2] CU_DIAG1 - x input*/
+    int32_t configunitdiag1_x[2];
+    /*!< configunitdiag2_x[2] CU_DIAG2 - x input*/
+    int32_t configunitdiag2_x[2];
+    /*!< configunitdiag3_x[2] CU_DIAG3 - x input*/
+    int32_t configunitdiag3_x[2];
+    /*!< configunitcar_sat_x[2] CU_CAR_SAT - x input*/
+    int32_t configunitcar_sat_x[2];
+    /*!< configunitdiag1_y[1] CU_DIAG1 - y input*/
+    int32_t configunitdiag1_y[1];
+    /*!< configunitdiag1_slope[1] CU_DIAG1 - slope input*/
+    int32_t configunitdiag1_slope[1];
+    /*!< configunitdiag2_y[1] CU_DIAG2 - y input*/
+    int32_t configunitdiag2_y[1];
+    /*!< configunitdiag2_slope[1] CU_DIAG2 - slope input*/
+    int32_t configunitdiag2_slope[1];
+    /*!< configunitdiag3_y[1] CU_DIAG3 - y input*/
+    int32_t configunitdiag3_y[1];
+    /*!< configunitdiag3_slope[1] CU_DIAG3 - slope input*/
+    int32_t configunitdiag3_slope[1];
+    /*!< configunitcar_sat_y[1] CU_CAR_SAT - y input*/
+    int32_t configunitcar_sat_y[1];
+    /*!< configunitcar_sat_slope[1] CU_CAR_SAT - slope input*/
+    int32_t configunitcar_sat_slope[1];
+
+} ia_pal_isp_bxt_demosaic_t;
+
+/*! \isp struct bxt_disparity
+
+*/
+typedef struct
+{
+    /*!< green_pos gb position*/
+    int32_t green_pos;
+    /*!< lc_cu_x[4] local contrast config unit x*/
+    int32_t lc_cu_x[4];
+    /*!< lc_cu_y[3] local contrast config unit y*/
+    int32_t lc_cu_y[3];
+    /*!< lc_cu_slope[3] local contrast config unit slope*/
+    int32_t lc_cu_slope[3];
+    /*!< delta_cu_x[4] delta config unit x*/
+    int32_t delta_cu_x[4];
+    /*!< delta_cu_y[3] delta config unit y*/
+    int32_t delta_cu_y[3];
+    /*!< delta_cu_slope[3] delta config unit slope*/
+    int32_t delta_cu_slope[3];
+    /*!< inv_lc_cu_x[8] inverse local contarst config unit x*/
+    int32_t inv_lc_cu_x[8];
+    /*!< inv_lc_cu_y[7] inverse local contarst config unit y*/
+    int32_t inv_lc_cu_y[7];
+    /*!< inv_lc_cu_slope[7] inverse local contarst config unit slope*/
+    int32_t inv_lc_cu_slope[7];
+    /*!< inv_delta_cu_x[8] inverse delta config unit x*/
+    int32_t inv_delta_cu_x[8];
+    /*!< inv_delta_cu_y[7] inverse delta config unit y*/
+    int32_t inv_delta_cu_y[7];
+    /*!< inv_delta_cu_slope[7] inverse delta config unit slope*/
+    int32_t inv_delta_cu_slope[7];
+    /*!< detail_pres detail preservation factor*/
+    int32_t detail_pres;
+    /*!< invscale scale factor after normalizing by inverse*/
+    int32_t invscale;
+
+} ia_pal_isp_bxt_disparity_t;
+
+/*! \isp struct bxt_dpc
+
+*/
+typedef struct
+{
+    /*!< afxoffset[8] 8 Autofocus pixels X axis offset U14.0, should be smaller than afxperiod*/
+    int32_t afxoffset[8];
+    /*!< afxperiod[8] 8 Autofocus pixels X axis period*/
+    int32_t afxperiod[8];
+    /*!< afyoffset[8] 8 Autofocus pixels Y axis offset U14.0, should be smaller than afyperiod*/
+    int32_t afyoffset[8];
+    /*!< afyperiod[8] 8 Autofocus pixels Y axis period*/
+    int32_t afyperiod[8];
+    /*!< hdrfactors[16] 4x4 HDR exposure factor U6.8*/
+    int32_t hdrfactors[16];
+    /*!< hdrfactorsinverse[16] 4x4 HDR exposure inverse factor U6.8 - should be inverse of hdrfactors*/
+    int32_t hdrfactorsinverse[16];
+    /*!< configunitcolddistvsmedian_slope[7] cold dist vs median config unit classifier*/
+    int32_t configunitcolddistvsmedian_slope[7];
+    /*!< configunitcolddistvsmedian_x[8] cold dist vs median config unit classifier*/
+    int32_t configunitcolddistvsmedian_x[8];
+    /*!< configunitcolddistvsmedian_y[7] cold dist vs median config unit classifier*/
+    int32_t configunitcolddistvsmedian_y[7];
+    /*!< configunitcolddistvsneighb_slope[7] cold dist vs neigb config unit classifier*/
+    int32_t configunitcolddistvsneighb_slope[7];
+    /*!< configunitcolddistvsneighb_x[8] cold dist vs neigb config unit classifier*/
+    int32_t configunitcolddistvsneighb_x[8];
+    /*!< configunitcolddistvsneighb_y[7] cold dist vs neigb config unit classifier*/
+    int32_t configunitcolddistvsneighb_y[7];
+    /*!< configunitfix_slope[3] fix config unit*/
+    int32_t configunitfix_slope[3];
+    /*!< configunitfix_x[4] fix config unit*/
+    int32_t configunitfix_x[4];
+    /*!< configunitfix_y[3] fix config unit*/
+    int32_t configunitfix_y[3];
+    /*!< configunithotdistvsmedian_slope[7] hot dist vs median classifier*/
+    int32_t configunithotdistvsmedian_slope[7];
+    /*!< configunithotdistvsmedian_x[8] hot dist vs median classifier*/
+    int32_t configunithotdistvsmedian_x[8];
+    /*!< configunithotdistvsmedian_y[7] hot dist vs median classifier*/
+    int32_t configunithotdistvsmedian_y[7];
+    /*!< configunithotdistvsneighb_slope[7] hot dist vs neigb config unit classifier*/
+    int32_t configunithotdistvsneighb_slope[7];
+    /*!< configunithotdistvsneighb_x[8] hot dist vs neigb config unit classifier*/
+    int32_t configunithotdistvsneighb_x[8];
+    /*!< configunithotdistvsneighb_y[7] hot dist vs neigb config unit classifier*/
+    int32_t configunithotdistvsneighb_y[7];
+    /*!< configunitrawvslb_slope[7] configunitrawvslb_slope*/
+    int32_t configunitrawvslb_slope[7];
+    /*!< configunitrawvslb_x[8] configunitrawvslb_x*/
+    int32_t configunitrawvslb_x[8];
+    /*!< configunitrawvslb_y[7] configunitrawvslb_y*/
+    int32_t configunitrawvslb_y[7];
+    /*!< configunitrawvsub_slope[7] configunitrawvsub_slope*/
+    int32_t configunitrawvsub_slope[7];
+    /*!< configunitrawvsub_x[8] configunitrawvsub_x*/
+    int32_t configunitrawvsub_x[8];
+    /*!< configunitrawvsub_y[7] configunitrawvsub_y*/
+    int32_t configunitrawvsub_y[7];
+    /*!< curx[1024] x locations of the static bad pixels*/
+    int32_t curx[1024];
+    /*!< cury[1024] y locations of the static bad pixels*/
+    int32_t cury[1024];
+    /*!< lbtype[16] 0 - B1,   1 - B2,  2 - B3*/
+    int32_t lbtype[16];
+    /*!< ubtype[16] 0 - B1,   1 - B2,  2 - B3*/
+    int32_t ubtype[16];
+    /*!< pelesttype[16] 0-P1, 1-P2, 2-P3, 3-P4, 4-P5, 5-P6*/
+    int32_t pelesttype[16];
+    /*!< dtype[16] 0-D1 1-D2  2-D3*/
+    int32_t dtype[16];
+    /*!< lbmasks[64] configurations related to the bayer pattern*/
+    int32_t lbmasks[64];
+    /*!< ubmasks[64] configurations related to the bayer pattern*/
+    int32_t ubmasks[64];
+    /*!< pmasks[384] configurations related to the bayer pattern*/
+    int32_t pmasks[384];
+    /*!< dmasks[48] configurations related to the bayer pattern*/
+    int32_t dmasks[48];
+    /*!< bitreduceshift Shift value for bit reduce block*/
+    int32_t bitreduceshift;
+    /*!< afenable enable for the AF unit block*/
+    int32_t afenable;
+    /*!< staticenable enable for the static LUT block*/
+    int32_t staticenable;
+    /*!< dynamicenable enable for the dynamic detection block*/
+    int32_t dynamicenable;
+    /*!< n_static_lut_entries number of static lut entries*/
+    int32_t n_static_lut_entries;
+    /*!< frame_width frame width*/
+    int32_t frame_width;
+    /*!< frame_height frame height*/
+    int32_t frame_height;
+    /*!< paf_grid0_en paf enable0*/
+    int32_t paf_grid0_en;
+    /*!< paf_grid1_en paf enable1*/
+    int32_t paf_grid1_en;
+    /*!< paf_grid2_en paf enable2*/
+    int32_t paf_grid2_en;
+    /*!< paf_grid3_en paf enable3*/
+    int32_t paf_grid3_en;
+    /*!< paf_grid4_en paf enable4*/
+    int32_t paf_grid4_en;
+    /*!< paf_grid5_en paf enable5*/
+    int32_t paf_grid5_en;
+    /*!< paf_grid6_en paf enable6*/
+    int32_t paf_grid6_en;
+    /*!< paf_grid7_en paf enable7*/
+    int32_t paf_grid7_en;
+
+} ia_pal_isp_bxt_dpc_t;
+
+/*! \isp struct bxt_dpcm_decode
+
+*/
+typedef struct
+{
+    /*!< first_pix_res first pixel resolution*/
+    int32_t first_pix_res;
+    /*!< bypass block bypass bit*/
+    int32_t bypass;
+    /*!< code[6] The codes array*/
+    int32_t code[6];
+    /*!< codethr[6] The threshold for using the next code*/
+    int32_t codethr[6];
+    /*!< codemask[6] Used for extracting the code from the coded word*/
+    int32_t codemask[6];
+    /*!< valuemask[6] Used for extracting the value from the coded word*/
+    int32_t valuemask[6];
+    /*!< signmask[6] Used for extracting the sign from the coded word*/
+    int32_t signmask[6];
+    /*!< lowresthrnum Code threshold for lower resolution coding*/
+    int32_t lowresthrnum;
+
+} ia_pal_isp_bxt_dpcm_decode_t;
+
+/*! \isp struct bxt_dpcm_encode
+
+*/
+typedef struct
+{
+    /*!< first_pix_res first pixel resolution*/
+    int32_t first_pix_res;
+    /*!< bypass block bypass bit*/
+    int32_t bypass;
+    /*!< code[6] The codes array*/
+    int32_t code[6];
+    /*!< codethr[6] The threshold for using the next code*/
+    int32_t codethr[6];
+    /*!< codemask[6] Used for extracting the code from the coded word*/
+    int32_t codemask[6];
+    /*!< valuemask[6] Used for extracting the value from the coded word*/
+    int32_t valuemask[6];
+    /*!< signmask[6] Used for extracting the sign from the coded word*/
+    int32_t signmask[6];
+    /*!< lowresthrnum Code threshold for lower resolution coding*/
+    int32_t lowresthrnum;
+
+} ia_pal_isp_bxt_dpcm_encode_t;
+
+/*! \isp struct bxt_dvsstatistics
+
+*/
+typedef struct
+{
+    /*!< kappa Global configuration - kappa*/
+    int32_t kappa;
+    /*!< match_shift Global configuration - match_shift*/
+    int32_t match_shift;
+    /*!< ybin_mode Global configuration - y binning mode*/
+    int32_t ybin_mode;
+    /*!< grid_width_l0 DVS statistics grid width level 0*/
+    int32_t grid_width_l0;
+    /*!< grid_height_l0 DVS statistics grid height level 0*/
+    int32_t grid_height_l0;
+    /*!< block_width_l0 DVS statistics block width level 0*/
+    int32_t block_width_l0;
+    /*!< block_height_l0 DVS statistics block height level 0*/
+    int32_t block_height_l0;
+    /*!< x_start_l0 DVS statistics level 0 x start*/
+    int32_t x_start_l0;
+    /*!< y_start_l0 DVS statistics level 0 y start*/
+    int32_t y_start_l0;
+    /*!< enabled_l0 DVS statistics level 0 enable*/
+    int32_t enabled_l0;
+    /*!< x_end_l0 DVS statistics level 0 x end*/
+    int32_t x_end_l0;
+    /*!< y_end_l0 DVS statistics level 0 y end*/
+    int32_t y_end_l0;
+    /*!< grid_width_l1 DVS statistics grid width level 1*/
+    int32_t grid_width_l1;
+    /*!< grid_height_l1 DVS statistics grid height level 1*/
+    int32_t grid_height_l1;
+    /*!< block_width_l1 DVS statistics block width level 1*/
+    int32_t block_width_l1;
+    /*!< block_height_l1 DVS statistics block height level 1*/
+    int32_t block_height_l1;
+    /*!< x_start_l1 DVS statistics level 1 x start*/
+    int32_t x_start_l1;
+    /*!< y_start_l1 DVS statistics level 1 y start*/
+    int32_t y_start_l1;
+    /*!< enabled_l1 DVS statistics level 1 enable*/
+    int32_t enabled_l1;
+    /*!< x_end_l1 DVS statistics level 1 x end*/
+    int32_t x_end_l1;
+    /*!< y_end_l1 DVS statistics level 1 y end*/
+    int32_t y_end_l1;
+    /*!< grid_width_l2 DVS statistics grid width level 2*/
+    int32_t grid_width_l2;
+    /*!< grid_height_l2 DVS statistics grid height level 2*/
+    int32_t grid_height_l2;
+    /*!< block_width_l2 DVS statistics block width level 2*/
+    int32_t block_width_l2;
+    /*!< block_height_l2 DVS statistics block height level 2*/
+    int32_t block_height_l2;
+    /*!< x_start_l2 DVS statistics level 2 x start*/
+    int32_t x_start_l2;
+    /*!< y_start_l2 DVS statistics level 2 y start*/
+    int32_t y_start_l2;
+    /*!< enabled_l2 DVS statistics level 2 enable*/
+    int32_t enabled_l2;
+    /*!< x_end_l2 DVS statistics level 2 x end*/
+    int32_t x_end_l2;
+    /*!< y_end_l2 DVS statistics level 2 y end*/
+    int32_t y_end_l2;
+    /*!< feroi_x_start_l0 DVS statistics fe-roi level 0 x start*/
+    int32_t feroi_x_start_l0;
+    /*!< feroi_y_start_l0 DVS statistics fe-roi level 0 y start*/
+    int32_t feroi_y_start_l0;
+    /*!< feroi_x_end_l0 DVS statistics fe-roi level 0 x end*/
+    int32_t feroi_x_end_l0;
+    /*!< feroi_y_end_l0 DVS statistics fe-roi level 0 y end*/
+    int32_t feroi_y_end_l0;
+    /*!< feroi_x_start_l1 DVS statistics fe-roi level 1 x start*/
+    int32_t feroi_x_start_l1;
+    /*!< feroi_y_start_l1 DVS statistics fe-roi level 1 y start*/
+    int32_t feroi_y_start_l1;
+    /*!< feroi_x_end_l1 DVS statistics fe-roi level 1 x end*/
+    int32_t feroi_x_end_l1;
+    /*!< feroi_y_end_l1 DVS statistics fe-roi level 1 y end*/
+    int32_t feroi_y_end_l1;
+    /*!< feroi_x_start_l2 DVS statistics fe-roi level 2 x start*/
+    int32_t feroi_x_start_l2;
+    /*!< feroi_y_start_l2 DVS statistics fe-roi level 2 y start*/
+    int32_t feroi_y_start_l2;
+    /*!< feroi_x_end_l2 DVS statistics fe-roi level 2 x end*/
+    int32_t feroi_x_end_l2;
+    /*!< feroi_y_end_l2 DVS statistics fe-roi level 2 y end*/
+    int32_t feroi_y_end_l2;
+
+} ia_pal_isp_bxt_dvsstatistics_t;
+
+/*! \isp struct bxt_gammatm
+
+*/
+typedef struct
+{
+    /*!< enable enable for the filter*/
+    int32_t enable;
+    /*!< gammaBeforeTM order of operations whether Gamma correction should precede TM or vise versa. 0- TM --> Gamma. 1- Gamma-->TM*/
+    int32_t gammaBeforeTM;
+    /*!< a1 shift amount at stage 1*/
+    int32_t a1;
+    /*!< a2 shift amount at stage 2*/
+    int32_t a2;
+    /*!< a3 shift amount at stage 3*/
+    int32_t a3;
+    /*!< gamma_lut_enable enable for gamma lut*/
+    int32_t gamma_lut_enable;
+    /*!< gamma_lut_base_level[5] base level for gamma lut*/
+    int32_t gamma_lut_base_level[5];
+    /*!< gamma_lut_step[5] step for gamma lut*/
+    int32_t gamma_lut_step[5];
+    /*!< gamma_lut_start_bin[5] start bin for gamma lut*/
+    int32_t gamma_lut_start_bin[5];
+    /*!< gamma_lut_size gamma lut size*/
+    int32_t gamma_lut_size;
+    /*!< gamma_lut_gen_lut[385] generalized lut for gamma lut*/
+    int32_t gamma_lut_gen_lut[385];
+    /*!< tm_lut_enable enable for tone mapping lut*/
+    int32_t tm_lut_enable;
+    /*!< tm_lut_base_level[1] base level for  tone mapping lut*/
+    int32_t tm_lut_base_level[1];
+    /*!< tm_lut_step[1] step for  tone mapping lut*/
+    int32_t tm_lut_step[1];
+    /*!< tm_lut_start_bin[1] start bin for  tone mapping lut*/
+    int32_t tm_lut_start_bin[1];
+    /*!< tm_lut_size tone mapping lut size*/
+    int32_t tm_lut_size;
+    /*!< tm_lut_gen_lut[513] generalized lut for tone mapping lut*/
+    int32_t tm_lut_gen_lut[513];
+
+} ia_pal_isp_bxt_gammatm_t;
+
+/*! \isp struct bxt_gridbaseob
+
+*/
+typedef struct
+{
+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/
+    int32_t cfa_type;
+    /*!< blc_log2gridwidth log2 of grid of each subplane width*/
+    int32_t blc_log2gridwidth;
+    /*!< blc_log2gridheight log2 of grid of each subplane height*/
+    int32_t blc_log2gridheight;
+    /*!< blc_col_start X value of top left corner of sensor relative to ROI*/
+    int32_t blc_col_start;
+    /*!< blc_row_start Y value of top left corner of sensor relative to ROI*/
+    int32_t blc_row_start;
+    /*!< blc_grid_tablec00[4096] gridob grid table*/
+    int32_t blc_grid_tablec00[4096];
+    /*!< blc_grid_tablec01[4096] gridob grid table*/
+    int32_t blc_grid_tablec01[4096];
+    /*!< blc_grid_tablec02[4096] gridob grid table*/
+    int32_t blc_grid_tablec02[4096];
+    /*!< blc_grid_tablec03[4096] gridob grid table*/
+    int32_t blc_grid_tablec03[4096];
+    /*!< blc_grid_tablec10[4096] gridob grid table*/
+    int32_t blc_grid_tablec10[4096];
+    /*!< blc_grid_tablec11[4096] gridob grid table*/
+    int32_t blc_grid_tablec11[4096];
+    /*!< blc_grid_tablec12[4096] gridob grid table*/
+    int32_t blc_grid_tablec12[4096];
+    /*!< blc_grid_tablec13[4096] gridob grid table*/
+    int32_t blc_grid_tablec13[4096];
+    /*!< blc_grid_tablec20[4096] gridob grid table*/
+    int32_t blc_grid_tablec20[4096];
+    /*!< blc_grid_tablec21[4096] gridob grid table*/
+    int32_t blc_grid_tablec21[4096];
+    /*!< blc_grid_tablec22[4096] gridob grid table*/
+    int32_t blc_grid_tablec22[4096];
+    /*!< blc_grid_tablec23[4096] gridob grid table*/
+    int32_t blc_grid_tablec23[4096];
+    /*!< blc_grid_tablec30[4096] gridob grid table*/
+    int32_t blc_grid_tablec30[4096];
+    /*!< blc_grid_tablec31[4096] gridob grid table*/
+    int32_t blc_grid_tablec31[4096];
+    /*!< blc_grid_tablec32[4096] gridob grid table*/
+    int32_t blc_grid_tablec32[4096];
+    /*!< blc_grid_tablec33[4096] gridob grid table*/
+    int32_t blc_grid_tablec33[4096];
+    /*!< blc_table_width table width*/
+    int32_t blc_table_width;
+    /*!< blc_table_height table height*/
+    int32_t blc_table_height;
+    /*!< bypass bypass for the filter*/
+    int32_t bypass;
+
+} ia_pal_isp_bxt_gridbaseob_t;
+
+/*! \isp struct bxt_gridbaseob_b
+
+*/
+typedef struct
+{
+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/
+    int32_t cfa_type;
+    /*!< blc_log2gridwidth log2 of grid of each subplane width*/
+    int32_t blc_log2gridwidth;
+    /*!< blc_log2gridheight log2 of grid of each subplane height*/
+    int32_t blc_log2gridheight;
+    /*!< blc_col_start X value of top left corner of sensor relative to ROI*/
+    int32_t blc_col_start;
+    /*!< blc_row_start Y value of top left corner of sensor relative to ROI*/
+    int32_t blc_row_start;
+    /*!< blc_grid_tablec00[4096] gridob grid table*/
+    int32_t blc_grid_tablec00[4096];
+    /*!< blc_grid_tablec01[4096] gridob grid table*/
+    int32_t blc_grid_tablec01[4096];
+    /*!< blc_grid_tablec02[4096] gridob grid table*/
+    int32_t blc_grid_tablec02[4096];
+    /*!< blc_grid_tablec03[4096] gridob grid table*/
+    int32_t blc_grid_tablec03[4096];
+    /*!< blc_grid_tablec10[4096] gridob grid table*/
+    int32_t blc_grid_tablec10[4096];
+    /*!< blc_grid_tablec11[4096] gridob grid table*/
+    int32_t blc_grid_tablec11[4096];
+    /*!< blc_grid_tablec12[4096] gridob grid table*/
+    int32_t blc_grid_tablec12[4096];
+    /*!< blc_grid_tablec13[4096] gridob grid table*/
+    int32_t blc_grid_tablec13[4096];
+    /*!< blc_grid_tablec20[4096] gridob grid table*/
+    int32_t blc_grid_tablec20[4096];
+    /*!< blc_grid_tablec21[4096] gridob grid table*/
+    int32_t blc_grid_tablec21[4096];
+    /*!< blc_grid_tablec22[4096] gridob grid table*/
+    int32_t blc_grid_tablec22[4096];
+    /*!< blc_grid_tablec23[4096] gridob grid table*/
+    int32_t blc_grid_tablec23[4096];
+    /*!< blc_grid_tablec30[4096] gridob grid table*/
+    int32_t blc_grid_tablec30[4096];
+    /*!< blc_grid_tablec31[4096] gridob grid table*/
+    int32_t blc_grid_tablec31[4096];
+    /*!< blc_grid_tablec32[4096] gridob grid table*/
+    int32_t blc_grid_tablec32[4096];
+    /*!< blc_grid_tablec33[4096] gridob grid table*/
+    int32_t blc_grid_tablec33[4096];
+    /*!< blc_table_width table width*/
+    int32_t blc_table_width;
+    /*!< blc_table_height table height*/
+    int32_t blc_table_height;
+    /*!< bypass bypass for the filter*/
+    int32_t bypass;
+
+} ia_pal_isp_bxt_gridbaseob_b_t;
+
+/*! \isp struct bxt_gridbaseob_c
+
+*/
+typedef struct
+{
+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/
+    int32_t cfa_type;
+    /*!< blc_log2gridwidth log2 of grid of each subplane width*/
+    int32_t blc_log2gridwidth;
+    /*!< blc_log2gridheight log2 of grid of each subplane height*/
+    int32_t blc_log2gridheight;
+    /*!< blc_col_start X value of top left corner of sensor relative to ROI*/
+    int32_t blc_col_start;
+    /*!< blc_row_start Y value of top left corner of sensor relative to ROI*/
+    int32_t blc_row_start;
+    /*!< blc_grid_tablec00[4096] gridob grid table*/
+    int32_t blc_grid_tablec00[4096];
+    /*!< blc_grid_tablec01[4096] gridob grid table*/
+    int32_t blc_grid_tablec01[4096];
+    /*!< blc_grid_tablec02[4096] gridob grid table*/
+    int32_t blc_grid_tablec02[4096];
+    /*!< blc_grid_tablec03[4096] gridob grid table*/
+    int32_t blc_grid_tablec03[4096];
+    /*!< blc_grid_tablec10[4096] gridob grid table*/
+    int32_t blc_grid_tablec10[4096];
+    /*!< blc_grid_tablec11[4096] gridob grid table*/
+    int32_t blc_grid_tablec11[4096];
+    /*!< blc_grid_tablec12[4096] gridob grid table*/
+    int32_t blc_grid_tablec12[4096];
+    /*!< blc_grid_tablec13[4096] gridob grid table*/
+    int32_t blc_grid_tablec13[4096];
+    /*!< blc_grid_tablec20[4096] gridob grid table*/
+    int32_t blc_grid_tablec20[4096];
+    /*!< blc_grid_tablec21[4096] gridob grid table*/
+    int32_t blc_grid_tablec21[4096];
+    /*!< blc_grid_tablec22[4096] gridob grid table*/
+    int32_t blc_grid_tablec22[4096];
+    /*!< blc_grid_tablec23[4096] gridob grid table*/
+    int32_t blc_grid_tablec23[4096];
+    /*!< blc_grid_tablec30[4096] gridob grid table*/
+    int32_t blc_grid_tablec30[4096];
+    /*!< blc_grid_tablec31[4096] gridob grid table*/
+    int32_t blc_grid_tablec31[4096];
+    /*!< blc_grid_tablec32[4096] gridob grid table*/
+    int32_t blc_grid_tablec32[4096];
+    /*!< blc_grid_tablec33[4096] gridob grid table*/
+    int32_t blc_grid_tablec33[4096];
+    /*!< blc_table_width table width*/
+    int32_t blc_table_width;
+    /*!< blc_table_height table height*/
+    int32_t blc_table_height;
+    /*!< bypass bypass for the filter*/
+    int32_t bypass;
+
+} ia_pal_isp_bxt_gridbaseob_c_t;
+
+/*! \isp struct bxt_inputscaler
+
+*/
+typedef struct
+{
+    /*!< block_bypass block bypass bit. Note that in ATE this parameters is 'bypass' (0 - enable. 1 - disable) while in HW it is 'enable' (0 - bypass. 1 - enable). In case block_bypass = 1, demo_bypass and scaler_bypass will turn to 1.*/
+    int32_t block_bypass;
+    /*!< demo_bypass demosaic bypass bit.  Note that in ATE this parameters is 'bypass' (0 - enable. 1 - disable) while in HW it is 'enable' (0 - bypass. 1 - enable).*/
+    int32_t demo_bypass;
+    /*!< scaler_bypass scaler bypass bit.  Note that in ATE this parameters is 'bypass' (0 - enable. 1 - disable) while in HW it is 'enable' (0 - bypass. 1 - enable).*/
+    int32_t scaler_bypass;
+    /*!< vnumerator Vertical SF Numerator*/
+    int32_t vnumerator;
+    /*!< hnumerator Horizontal SF Numerator*/
+    int32_t hnumerator;
+    /*!< vdenominator Vertical SF Denominator*/
+    int32_t vdenominator;
+    /*!< hdenominator Horizontal SF Denominator*/
+    int32_t hdenominator;
+    /*!< norm_mul Normalization multiply coefficient*/
+    int32_t norm_mul;
+    /*!< norm_shift Normalization shift*/
+    int32_t norm_shift;
+    /*!< output_sensor_mode Output Sensor mode 0-1x1, 1-2x2, 2-4x4. Input scaler can't work in 1x1 sensor mode.*/
+    int32_t output_sensor_mode;
+    /*!< output_format_matrix[16] Output format matrix [4,4]. 0=R. 1=G. 2=G. 3=W*/
+    int32_t output_format_matrix[16];
+    /*!< Input_Frame_Width Input frame width.*/
+    int32_t Input_Frame_Width;
+    /*!< input_is_bayer 0 - RGBC, 1 - Bayer,*/
+    int32_t input_is_bayer;
+    /*!< output_height Has to be a multiple of 4.*/
+    int32_t output_height;
+    /*!< output_width Better be a mutiplication of 32 to avoid RTL zero padding (?). When block is stationed in isla (isla=on) then maximum is 2560. Has to be a multiple of 4.*/
+    int32_t output_width;
+    /*!< shift_to_lb Shifting before LB*/
+    int32_t shift_to_lb;
+    /*!< input_sensor_mode Input Sensor mode 0-1x1, 1-2x2, 2-4x4. Input scaler can't work in 1x1 sensor mode.*/
+    int32_t input_sensor_mode;
+    /*!< is_ul_w Is the first pixel in frame G/W 1-true, 0-false*/
+    int32_t is_ul_w;
+    /*!< bayer_type Bayer Type - BGGR(0), RGGB(1), GRBG(2), GBRG(3)*/
+    int32_t bayer_type;
+    /*!< lut_values[16] QNN LUT - Values. Restriction - rising monotonic.*/
+    int32_t lut_values[16];
+    /*!< lut_shifts1[16] QNN LUT - Shift1. lut_shift2 >= lut_shift1.*/
+    int32_t lut_shifts1[16];
+    /*!< lut_shifts2[16] QNN LUT - Shift2. lut_shift2 >= lut_shift1.*/
+    int32_t lut_shifts2[16];
+    /*!< lut_subtraction_flags[16] QNN LUT - Flags*/
+    int32_t lut_subtraction_flags[16];
+    /*!< lut_output_values[16] QNN LUT - Output Values*/
+    int32_t lut_output_values[16];
+    /*!< kernel_g_coef[6] G kernel - Coefs*/
+    int32_t kernel_g_coef[6];
+    /*!< kernel_g_norm File for G kernel - Norm*/
+    int32_t kernel_g_norm;
+    /*!< cbf_div_cu_x[12] Config unit division - X points*/
+    int32_t cbf_div_cu_x[12];
+    /*!< cbf_div_cu_y[11] Config unit division - Y points*/
+    int32_t cbf_div_cu_y[11];
+    /*!< cbf_div_cu_slope[11] Config unit division - Slopes*/
+    int32_t cbf_div_cu_slope[11];
+    /*!< cbi_r_pos[96] .CBI R Positions. Valid range {0-17}*/
+    int32_t cbi_r_pos[96];
+    /*!< cbi_r_wgt[96] CBI R Weights. Valid range: {0-4 , 7}*/
+    int32_t cbi_r_wgt[96];
+    /*!< cbi_g_pos[96] CBI G Positions. Valid range {0-17}*/
+    int32_t cbi_g_pos[96];
+    /*!< cbi_g_wgt[96] CBI G Weights. Valid range {0-4 , 7}*/
+    int32_t cbi_g_wgt[96];
+    /*!< cbi_b_pos[96] CBI B Positions. Valid range {0-17}*/
+    int32_t cbi_b_pos[96];
+    /*!< cbi_b_wgt[96] CBI B Weights. Valid range {0-4 , 7}*/
+    int32_t cbi_b_wgt[96];
+    /*!< wb_matrix[16] Matrix[4][4] for WB. 0=no gain. 1=R. 2=B. 3=G. (in each quad must use at least two zeros (no gain)).*/
+    int32_t wb_matrix[16];
+    /*!< r_wb_gain WB R gain*/
+    int32_t r_wb_gain;
+    /*!< g_wb_gain WB G gain*/
+    int32_t g_wb_gain;
+    /*!< b_wb_gain WB B gain*/
+    int32_t b_wb_gain;
+
+} ia_pal_isp_bxt_inputscaler_t;
+
+/*! \isp struct bxt_inputscalerv2
+
+*/
+typedef struct
+{
+    /*!< block_bypass block bypass bit. Note that in ATE this parameters is 'bypass' (0 - enable. 1 - disable) while in HW it is 'enable' (0 - bypass. 1 - enable). In case block_bypass = 1, demo_bypass and scaler_bypass will turn to 1.*/
+    int32_t block_bypass;
+    /*!< demo_bypass demosaic bypass bit.  Note that in ATE this parameters is 'bypass' (0 - enable. 1 - disable) while in HW it is 'enable' (0 - bypass. 1 - enable).*/
+    int32_t demo_bypass;
+    /*!< scaler_bypass scaler bypass bit.  Note that in ATE this parameters is 'bypass' (0 - enable. 1 - disable) while in HW it is 'enable' (0 - bypass. 1 - enable).*/
+    int32_t scaler_bypass;
+    /*!< vnumerator Vertical   SF Numerator*/
+    int32_t vnumerator;
+    /*!< hnumerator Horizontal SF Numerator*/
+    int32_t hnumerator;
+    /*!< vdenominator Vertical   SF Denominator*/
+    int32_t vdenominator;
+    /*!< hdenominator Horizontal SF Denominator*/
+    int32_t hdenominator;
+    /*!< norm_mul Normalization multiply coeffiecient*/
+    int32_t norm_mul;
+    /*!< norm_shift Normalization shift*/
+    int32_t norm_shift;
+    /*!< output_sensor_mode Output Sensor mode 0-1x1, 1-2x2, 2-4x4. Input scaler can't work in 1x1 sensor mode.*/
+    int32_t output_sensor_mode;
+    /*!< output_format_matrix[16] Output format matrix [4,4]. 0=R. 1=G. 2=G. 3=W*/
+    int32_t output_format_matrix[16];
+    /*!< Input_Frame_Width Input frame width. Has to be a multiple of 4.*/
+    int32_t Input_Frame_Width;
+    /*!< input_is_bayer 0 - RGBC, 1 - Bayer,*/
+    int32_t input_is_bayer;
+    /*!< output_height Has to be a multiple of 4.*/
+    int32_t output_height;
+    /*!< output_width Better be a mutiplication of 32 to avoid RTL zero padding (?). When block is stationed in isla (isla=on) then maximum is 2560. Has to be a multiple of 4.*/
+    int32_t output_width;
+    /*!< shift_to_lb Shifting before LB*/
+    int32_t shift_to_lb;
+    /*!< input_sensor_mode Input Sensor mode 0-1x1, 1-2x2, 2-4x4. Input scaler can't work in 1x1 sensor mode.*/
+    int32_t input_sensor_mode;
+    /*!< is_ul_w Is the first pixel in frame G/W 1-true, 0-false*/
+    int32_t is_ul_w;
+    /*!< bayer_type Bayer Type - BGGR(0), RGGB(1), GRBG(2), GBRG(3)*/
+    int32_t bayer_type;
+    /*!< lut_values[16] QNN LUT - Values. Restriction - rising monotonic.*/
+    int32_t lut_values[16];
+    /*!< lut_shifts1[16] QNN LUT - Shift1. lut_shift2 >= lut_shift1.*/
+    int32_t lut_shifts1[16];
+    /*!< lut_shifts2[16] QNN LUT - Shift2. lut_shift2 >= lut_shift1.*/
+    int32_t lut_shifts2[16];
+    /*!< lut_subtraction_flags[16] QNN LUT - Flags*/
+    int32_t lut_subtraction_flags[16];
+    /*!< lut_output_values[16] QNN LUT - Output Values*/
+    int32_t lut_output_values[16];
+    /*!< kernel_g_coef[6] G kernel - Coefs*/
+    int32_t kernel_g_coef[6];
+    /*!< kernel_g_norm File for G kernel - Norm*/
+    int32_t kernel_g_norm;
+    /*!< cbf_div_cu_x[12] Config unit division - X points*/
+    int32_t cbf_div_cu_x[12];
+    /*!< cbf_div_cu_y[11] Config unit division - Y points*/
+    int32_t cbf_div_cu_y[11];
+    /*!< cbf_div_cu_slope[11] Config unit division - Slopes*/
+    int32_t cbf_div_cu_slope[11];
+    /*!< cbi_r_pos[96] .CBI R Positions. Valid range {0-17}*/
+    int32_t cbi_r_pos[96];
+    /*!< cbi_r_wgt[96] CBI R Weights. Valid range: {0-4 , 7}*/
+    int32_t cbi_r_wgt[96];
+    /*!< cbi_g_pos[96] CBI G Positions. Valid range {0-17}. Not used in Bayer (only in RGBC).*/
+    int32_t cbi_g_pos[96];
+    /*!< cbi_g_wgt[96] CBI G Weights. Valid range {0-4 , 7}. Not used in Bayer (only in RGBC).*/
+    int32_t cbi_g_wgt[96];
+    /*!< cbi_b_pos[96] CBI B Positions. Valid range {0-17}*/
+    int32_t cbi_b_pos[96];
+    /*!< cbi_b_wgt[96] CBI B Weights. Valid range {0-4 , 7}*/
+    int32_t cbi_b_wgt[96];
+    /*!< wb_matrix[16] Matrix[4][4] for WB. 0=no gain. 1=R. 2=B. 3=G. (in each quad must use at least two zeros (no gain)).*/
+    int32_t wb_matrix[16];
+    /*!< r_wb_gain WB R gain. 4096 is equal to gain 1.*/
+    int32_t r_wb_gain;
+    /*!< g_wb_gain WB G gain. 4096 is equal to gain 1.*/
+    int32_t g_wb_gain;
+    /*!< b_wb_gain WB B gain. 4096 is equal to gain 1.*/
+    int32_t b_wb_gain;
+    /*!< g_min_r_en Enable 'G-R' mode*/
+    int32_t g_min_r_en;
+
+} ia_pal_isp_bxt_inputscalerv2_t;
+
+/*! \isp struct bxt_isl_inputcrop
+
+*/
+typedef struct
+{
+    /*!< m_xstart Horizontal Starting Pixel. FIXME: Put correct max and default values*/
+    int32_t m_xstart;
+    /*!< m_ystart Vertical   Starting Pixel. FIXME: Put correct max and default values*/
+    int32_t m_ystart;
+    /*!< m_xsize Horizontal Frame Size. FIXME: Put correct max and default values*/
+    int32_t m_xsize;
+    /*!< m_ysize Vertical   Frame Size. FIXME: Put correct max and default values*/
+    int32_t m_ysize;
+
+} ia_pal_isp_bxt_isl_inputcrop_t;
+
+/*! \isp struct bxt_linearization
+
+*/
+typedef struct
+{
+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/
+    int32_t cfa_type;
+    /*!< linc00[65] linearization grid table*/
+    int32_t linc00[65];
+    /*!< linc01[65] linearization grid table*/
+    int32_t linc01[65];
+    /*!< linc02[65] linearization grid table*/
+    int32_t linc02[65];
+    /*!< linc03[65] linearization grid table*/
+    int32_t linc03[65];
+    /*!< linc10[65] linearization grid table*/
+    int32_t linc10[65];
+    /*!< linc11[65] linearization grid table*/
+    int32_t linc11[65];
+    /*!< linc12[65] linearization grid table*/
+    int32_t linc12[65];
+    /*!< linc13[65] linearization grid table*/
+    int32_t linc13[65];
+    /*!< linc20[65] linearization grid table*/
+    int32_t linc20[65];
+    /*!< linc21[65] linearization grid table*/
+    int32_t linc21[65];
+    /*!< linc22[65] linearization grid table*/
+    int32_t linc22[65];
+    /*!< linc23[65] linearization grid table*/
+    int32_t linc23[65];
+    /*!< linc30[65] linearization grid table*/
+    int32_t linc30[65];
+    /*!< linc31[65] linearization grid table*/
+    int32_t linc31[65];
+    /*!< linc32[65] linearization grid table*/
+    int32_t linc32[65];
+    /*!< linc33[65] linearization grid table*/
+    int32_t linc33[65];
+    /*!< bypass bypass for the filter*/
+    int32_t bypass;
+
+} ia_pal_isp_bxt_linearization_t;
+
+/*! \isp struct bxt_lsc
+
+*/
+typedef struct
+{
+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/
+    int32_t cfa_type;
+    /*!< lsclog2gridwidth log2 width of each subplane*/
+    int32_t lsclog2gridwidth;
+    /*!< lsclog2gridheight log2 height of each subplane*/
+    int32_t lsclog2gridheight;
+    /*!< lsc_col_start X value of top left corner of sensor relative to ROI*/
+    int32_t lsc_col_start;
+    /*!< lsc_row_start Y value of top left corner of sensor relative to ROI*/
+    int32_t lsc_row_start;
+    /*!< lsc_exp resolution modifier of the lsc tables*/
+    int32_t lsc_exp;
+    /*!< lsc_grid_tablec00[4096] lsc grid table*/
+    int32_t lsc_grid_tablec00[4096];
+    /*!< lsc_grid_tablec01[4096] lsc grid table*/
+    int32_t lsc_grid_tablec01[4096];
+    /*!< lsc_grid_tablec02[4096] lsc grid table*/
+    int32_t lsc_grid_tablec02[4096];
+    /*!< lsc_grid_tablec03[4096] lsc grid table*/
+    int32_t lsc_grid_tablec03[4096];
+    /*!< lsc_grid_tablec10[4096] lsc grid table*/
+    int32_t lsc_grid_tablec10[4096];
+    /*!< lsc_grid_tablec11[4096] lsc grid table*/
+    int32_t lsc_grid_tablec11[4096];
+    /*!< lsc_grid_tablec12[4096] lsc grid table*/
+    int32_t lsc_grid_tablec12[4096];
+    /*!< lsc_grid_tablec13[4096] lsc grid table*/
+    int32_t lsc_grid_tablec13[4096];
+    /*!< lsc_grid_tablec20[4096] lsc grid table*/
+    int32_t lsc_grid_tablec20[4096];
+    /*!< lsc_grid_tablec21[4096] lsc grid table*/
+    int32_t lsc_grid_tablec21[4096];
+    /*!< lsc_grid_tablec22[4096] lsc grid table*/
+    int32_t lsc_grid_tablec22[4096];
+    /*!< lsc_grid_tablec23[4096] lsc grid table*/
+    int32_t lsc_grid_tablec23[4096];
+    /*!< lsc_grid_tablec30[4096] lsc grid table*/
+    int32_t lsc_grid_tablec30[4096];
+    /*!< lsc_grid_tablec31[4096] lsc grid table*/
+    int32_t lsc_grid_tablec31[4096];
+    /*!< lsc_grid_tablec32[4096] lsc grid table*/
+    int32_t lsc_grid_tablec32[4096];
+    /*!< lsc_grid_tablec33[4096] lsc grid table*/
+    int32_t lsc_grid_tablec33[4096];
+    /*!< lsc_table_width table width*/
+    int32_t lsc_table_width;
+    /*!< lsc_table_height table height*/
+    int32_t lsc_table_height;
+    /*!< bypass bypass for the filter*/
+    int32_t bypass;
+
+} ia_pal_isp_bxt_lsc_t;
+
+/*! \isp struct bxt_norm_lin
+
+*/
+typedef struct
+{
+    /*!< lut[257] Normalization lut*/
+    int32_t lut[257];
+    /*!< lin_en Linearization enable*/
+    int32_t lin_en;
+    /*!< lshift The size of normalized shift (signed)*/
+    int32_t lshift;
+    /*!< bypass bypass*/
+    int32_t bypass;
+
+} ia_pal_isp_bxt_norm_lin_t;
+
+/*! \isp struct bxt_norm_lin_b
+
+*/
+typedef struct
+{
+    /*!< lut[257] Normalization lut*/
+    int32_t lut[257];
+    /*!< lin_en Linearization enable*/
+    int32_t lin_en;
+    /*!< lshift The size of normalized shift (signed)*/
+    int32_t lshift;
+    /*!< bypass bypass*/
+    int32_t bypass;
+
+} ia_pal_isp_bxt_norm_lin_b_t;
+
+/*! \isp struct bxt_norm_lin_c
+
+*/
+typedef struct
+{
+    /*!< lut[257] Normalization lut*/
+    int32_t lut[257];
+    /*!< lin_en Linearization enable*/
+    int32_t lin_en;
+    /*!< lshift The size of normalized shift (signed)*/
+    int32_t lshift;
+    /*!< bypass bypass*/
+    int32_t bypass;
+
+} ia_pal_isp_bxt_norm_lin_c_t;
+
+/*! \isp struct bxt_ofa_dp
+
+*/
+typedef struct
+{
+    /*!< y_tiling tiling parameter for NV12 y_tiled format*/
+    int32_t y_tiling;
+    /*!< pack_mode pack mode for packer*/
+    int32_t pack_mode;
+    /*!< bypass_flip bypass flip*/
+    int32_t bypass_flip;
+    /*!< bypass_mirror bypass mirror*/
+    int32_t bypass_mirror;
+    /*!< bypass_reduced_range bypass reduced range*/
+    int32_t bypass_reduced_range;
+    /*!< p_e[2] Multiplication parameters for pixel with even vertical index*/
+    int32_t p_e[2];
+    /*!< p_o[2] Multiplication parameters for pixel with odd vertical index*/
+    int32_t p_o[2];
+
+} ia_pal_isp_bxt_ofa_dp_t;
+
+/*! \isp struct bxt_ofa_mp
+
+*/
+typedef struct
+{
+    /*!< y_tiling tiling parameter for NV12 y_tiled format*/
+    int32_t y_tiling;
+    /*!< pack_mode pack mode for packer*/
+    int32_t pack_mode;
+    /*!< bypass_flip bypass flip*/
+    int32_t bypass_flip;
+    /*!< bypass_mirror bypass mirror*/
+    int32_t bypass_mirror;
+    /*!< bypass_reduced_range bypass reduced range*/
+    int32_t bypass_reduced_range;
+    /*!< p_e[2] Multiplication parameters for pixel with even vertical index*/
+    int32_t p_e[2];
+    /*!< p_o[2] Multiplication parameters for pixel with odd vertical index*/
+    int32_t p_o[2];
+
+} ia_pal_isp_bxt_ofa_mp_t;
+
+/*! \isp struct bxt_ofa_ppp
+
+*/
+typedef struct
+{
+    /*!< y_tiling tiling parameter for NV12 y_tiled format*/
+    int32_t y_tiling;
+    /*!< pack_mode pack mode for packer*/
+    int32_t pack_mode;
+    /*!< bypass_flip bypass flip*/
+    int32_t bypass_flip;
+    /*!< bypass_mirror bypass mirror*/
+    int32_t bypass_mirror;
+    /*!< bypass_reduced_range bypass reduced range*/
+    int32_t bypass_reduced_range;
+    /*!< p_e[2] Multiplication parameters for pixel with even vertical index*/
+    int32_t p_e[2];
+    /*!< p_o[2] Multiplication parameters for pixel with odd vertical index*/
+    int32_t p_o[2];
+
+} ia_pal_isp_bxt_ofa_ppp_t;
+
+/*! \isp struct bxt_paddingsupport
+
+*/
+typedef struct
+{
+    /*!< m_bypass Bypass     {0,1}*/
+    int32_t m_bypass;
+    /*!< m_xsize Horizontal Frame Size. FIXME: Put correct max and default values*/
+    int32_t m_xsize;
+    /*!< m_ysize Vertical   Frame Size. FIXME: Put correct max and default values*/
+    int32_t m_ysize;
+    /*!< m_padval Padding value : zero(0), MaxVal(1), DuplicateLast(2)*/
+    int32_t m_padval;
+
+} ia_pal_isp_bxt_paddingsupport_t;
+
+/*! \isp struct bxt_pafstatistics
+
+*/
+typedef struct
+{
+    /*!< paf_en 0: FF will not write to the PAF  array; 1: FF will write*/
+    int32_t paf_en;
+    /*!< paf_frame_width width of PAF frame (in PAF pixels)*/
+    int32_t paf_frame_width;
+    /*!< paf_frame_height height of PAF frame (in PAF lines)*/
+    int32_t paf_frame_height;
+    /*!< skip_horizontal_start number of skipped PAF pixel pairs at the start of each line pair*/
+    int32_t skip_horizontal_start;
+    /*!< skip_vertical_start number of skipped PAF line pairs at the start of the frame*/
+    int32_t skip_vertical_start;
+    /*!< block_width number of PAF pixel pairs per block in horizontal direction*/
+    int32_t block_width;
+    /*!< block_height number of PAF pixel pairs per block in vertical direction*/
+    int32_t block_height;
+    /*!< accum_horizontal number of consecutive PAF pixel pairs accumulated in horizontal direction*/
+    int32_t accum_horizontal;
+    /*!< skip_horizontal number of PAF pixel pairs skipped between accumulated pixel pairs in horizontal direction*/
+    int32_t skip_horizontal;
+    /*!< accum_vertical number of consecutive PAF pixel pairs accumulated in vertical direction*/
+    int32_t accum_vertical;
+    /*!< skip_vertical number of PAF line pairs skipped between accumulated pixel pairs in vertical direction*/
+    int32_t skip_vertical;
+    /*!< min_shift minimum evaluation shift in steps*/
+    int32_t min_shift;
+    /*!< shift_steps number of evaluation points, starting from m_paf_min_shift*/
+    int32_t shift_steps;
+    /*!< paf_shift_step_size phase evaluation step size in pixels*/
+    int32_t paf_shift_step_size;
+    /*!< paf_shifter configured so that the accumulated phase difference fits in the output register*/
+    int32_t paf_shifter;
+    /*!< split_accross_multiple_lines 0: SOP = SOL, EOP = EOL; 1: SOF determined by the reset, EOL determined by pixels per line*/
+    int32_t split_accross_multiple_lines;
+    /*!< pixels_per_line number of pixels per line; pixels_per_line <= paf_frame_width*/
+    int32_t pixels_per_line;
+    /*!< input_modes 0: RRRR + LLLL; 1: LLLL + RRRR; 2: RLRL; 3: LRLR; 4: RRRR + LLLL alternate; 5: LLLL + RRRR alternate; 6: RLRL alternate; 7: LRLR alternate*/
+    int32_t input_modes;
+    /*!< input_bpp 0: 8 bits; 1: 10 bits; 2: 12 bits; 3: 14 bits; 4: 16 bits*/
+    int32_t input_bpp;
+    /*!< int_prec internal precision of PAF pixels*/
+    int32_t int_prec;
+
+} ia_pal_isp_bxt_pafstatistics_t;
+
+/*! \isp struct bxt_pixelformatter
+
+*/
+typedef struct
+{
+    /*!< m_bypass Bypass     {0,1}*/
+    int32_t m_bypass;
+    /*!< m_ColRemoval col removal- for setting bayer pattern*/
+    int32_t m_ColRemoval;
+    /*!< m_RowRemoval row removal- for setting bayer pattern*/
+    int32_t m_RowRemoval;
+    /*!< m_xstart Horizontal Starting Pixel. FIXME: Put correct max and default values*/
+    int32_t m_xstart;
+    /*!< m_ystart Vertical   Starting Pixel. FIXME: Put correct max and default values*/
+    int32_t m_ystart;
+    /*!< m_xsize Horizontal Frame Size. FIXME: Put correct max and default values*/
+    int32_t m_xsize;
+    /*!< m_ysize Vertical   Frame Size. FIXME: Put correct max and default values*/
+    int32_t m_ysize;
+    /*!< m_padval Padding value : zero(0), MaxVal(1), DuplicateLast(2)*/
+    int32_t m_padval;
+
+} ia_pal_isp_bxt_pixelformatter_t;
+
+/*! \isp struct bxt_pixprecadapter
+
+*/
+typedef struct
+{
+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixinprec;
+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixoutprec;
+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixminprec;
+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/
+    int32_t m_isbayer;
+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/
+    int32_t m_cliptous;
+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/
+    int32_t m_shiftlen;
+    /*!< m_shiftval Shift Value {0..7}*/
+    int32_t m_shiftval;
+
+} ia_pal_isp_bxt_pixprecadapter_t;
+
+/*! \isp struct bxt_pixprecadapter_postvcr
+
+*/
+typedef struct
+{
+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixinprec;
+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixoutprec;
+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixminprec;
+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/
+    int32_t m_isbayer;
+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/
+    int32_t m_cliptous;
+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/
+    int32_t m_shiftlen;
+    /*!< m_shiftval Shift Value {0..7}*/
+    int32_t m_shiftval;
+
+} ia_pal_isp_bxt_pixprecadapter_postvcr_t;
+
+/*! \isp struct bxt_pixprecadapter_precropstills
+
+*/
+typedef struct
+{
+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixinprec;
+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixoutprec;
+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixminprec;
+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/
+    int32_t m_isbayer;
+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/
+    int32_t m_cliptous;
+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/
+    int32_t m_shiftlen;
+    /*!< m_shiftval Shift Value {0..7}*/
+    int32_t m_shiftval;
+
+} ia_pal_isp_bxt_pixprecadapter_precropstills_t;
+
+/*! \isp struct bxt_pixprecadapter_precropvideo
+
+*/
+typedef struct
+{
+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixinprec;
+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixoutprec;
+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixminprec;
+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/
+    int32_t m_isbayer;
+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/
+    int32_t m_cliptous;
+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/
+    int32_t m_shiftlen;
+    /*!< m_shiftval Shift Value {0..7}*/
+    int32_t m_shiftval;
+
+} ia_pal_isp_bxt_pixprecadapter_precropvideo_t;
+
+/*! \isp struct bxt_pixprecadapter_precsc2
+
+*/
+typedef struct
+{
+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixinprec;
+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixoutprec;
+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixminprec;
+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/
+    int32_t m_isbayer;
+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/
+    int32_t m_cliptous;
+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/
+    int32_t m_shiftlen;
+    /*!< m_shiftval Shift Value {0..7}*/
+    int32_t m_shiftval;
+
+} ia_pal_isp_bxt_pixprecadapter_precsc2_t;
+
+/*! \isp struct bxt_pixprecadapter_pregdc
+
+*/
+typedef struct
+{
+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixinprec;
+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixoutprec;
+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixminprec;
+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/
+    int32_t m_isbayer;
+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/
+    int32_t m_cliptous;
+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/
+    int32_t m_shiftlen;
+    /*!< m_shiftval Shift Value {0..7}*/
+    int32_t m_shiftval;
+
+} ia_pal_isp_bxt_pixprecadapter_pregdc_t;
+
+/*! \isp struct bxt_pixprecadapter_prevcud
+
+*/
+typedef struct
+{
+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixinprec;
+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixoutprec;
+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixminprec;
+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/
+    int32_t m_isbayer;
+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/
+    int32_t m_cliptous;
+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/
+    int32_t m_shiftlen;
+    /*!< m_shiftval Shift Value {0..7}*/
+    int32_t m_shiftval;
+
+} ia_pal_isp_bxt_pixprecadapter_prevcud_t;
+
+/*! \isp struct bxt_pixprecadapter_prewb
+
+*/
+typedef struct
+{
+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixinprec;
+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixoutprec;
+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixminprec;
+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/
+    int32_t m_isbayer;
+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/
+    int32_t m_cliptous;
+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/
+    int32_t m_shiftlen;
+    /*!< m_shiftval Shift Value {0..7}*/
+    int32_t m_shiftval;
+
+} ia_pal_isp_bxt_pixprecadapter_prewb_t;
+
+/*! \isp struct bxt_rynr_collector
+
+*/
+typedef struct
+{
+    /*!< input_pin dummy parameter for HW purpose; 1 - Stills, 0 - Video*/
+    int32_t input_pin;
+
+} ia_pal_isp_bxt_rynr_collector_t;
+
+/*! \isp struct bxt_rynr_splitter
+
+*/
+typedef struct
+{
+    /*!< input_pin Which input pin connect to output: if 1 (Stills), output pin is InputPin1 (pcsBayer), if 0 (Video), output pin is InputPin0 (pcsYUV420)*/
+    int32_t input_pin;
+
+} ia_pal_isp_bxt_rynr_splitter_t;
+
+/*! \isp struct bxt_shift14to16bit
+
+*/
+typedef struct
+{
+    /*!< m_bypass Bypass        {0,1}*/
+    int32_t m_bypass;
+    /*!< m_shiftmode Shift : 14To16(0), 16To14(1)*/
+    int32_t m_shiftmode;
+    /*!< m_isbayer Is Bayer? - Bayer(0) RGB(1)*/
+    int32_t m_isbayer;
+
+} ia_pal_isp_bxt_shift14to16bit_t;
+
+/*! \isp struct bxt_tnr5v1
+
+*/
+typedef struct
+{
+    /*!< nm_luma_lut[64] Noise model LUMA lut (for I core)*/
+    int32_t nm_luma_lut[64];
+    /*!< nm_chroma_lut[64] Noise model Chroma LUT (for I core)*/
+    int32_t nm_chroma_lut[64];
+    /*!< nm_spnr_lut[64] Noise model LUMA lut, for II core, beem used by spNR*/
+    int32_t nm_spnr_lut[64];
+    /*!< nm_radial_lut[128] Noise model radial Lut*/
+    int32_t nm_radial_lut[128];
+    /*!< nm_radial_r2_shift Noise model radial shift*/
+    int32_t nm_radial_r2_shift;
+    /*!< nm_radial_x_center Noise model radial- center of image x corr*/
+    int32_t nm_radial_x_center;
+    /*!< nm_radial_y_center Noise model radial- center of image y corr*/
+    int32_t nm_radial_y_center;
+    /*!< co_max_content maximal value for the content*/
+    int32_t co_max_content;
+    /*!< co_content_shift shift right for content*/
+    int32_t co_content_shift;
+    /*!< fm_sim_lut[64] FMVE Similarity LUT for grade calculation*/
+    int32_t fm_sim_lut[64];
+    /*!< fm_dist_weights[128] FMVE distance weight for the tow BMA unit*/
+    int32_t fm_dist_weights[128];
+    /*!< fm_sad_shift shift for the SAD values in the FMVE sub-block (using realigning)*/
+    int32_t fm_sad_shift;
+    /*!< fm_sim_arg_shift shift for FMVE similarity arg values.*/
+    int32_t fm_sim_arg_shift;
+    /*!< mvd_sim_lut[64] MVD Similarity LUT*/
+    int32_t mvd_sim_lut[64];
+    /*!< mvd_sad_shift shift for the SAD values in the MVD sub-block (using realigning)*/
+    int32_t mvd_sad_shift;
+    /*!< mvd_arg_g_static The gain for the recursive similarity at case of static MV . together  with neighbors*/
+    int32_t mvd_arg_g_static;
+    /*!< mvd_arg_g_static_local The gain for the recursive similarity at case of static MV, neighbors have a different MV*/
+    int32_t mvd_arg_g_static_local;
+    /*!< mvd_arg_g_move The gain for the recursive similarity at case of non-static MV,  together  with neighbors*/
+    int32_t mvd_arg_g_move;
+    /*!< mvd_arg_g_move_local The gain for the recursive similarity at case of non-static MV,neighbors have a different MV*/
+    int32_t mvd_arg_g_move_local;
+    /*!< spnr_lut_h[64] spNR BF lut for horizontal direction*/
+    int32_t spnr_lut_h[64];
+    /*!< spnr_lut_v[64] spNR BF lut for vertical direction*/
+    int32_t spnr_lut_v[64];
+    /*!< pb_weight_pre_max maximal spTNR weight*/
+    int32_t pb_weight_pre_max;
+    /*!< pb_weight_in_min The minimal weight of the input frame at the blended output image.*/
+    int32_t pb_weight_in_min;
+    /*!< no_fmve FMVE debug flag, 0-run, 1-don't run, 2- don't run, but run content*/
+    int32_t no_fmve;
+    /*!< bypass bypass flag, output is 4 bit shifted input*/
+    int32_t bypass;
+    /*!< framenumber frame number. Should be in PAL*/
+    int32_t framenumber;
+    /*!< g_mv_x global  MV_X. Should be in PAL*/
+    int32_t g_mv_x;
+    /*!< g_mv_y global  MV_Y. Should be in PAL*/
+    int32_t g_mv_y;
+
+} ia_pal_isp_bxt_tnr5v1_t;
+
+/*! \isp struct bxt_vcr
+
+*/
+typedef struct
+{
+    /*!< bypass_0_1 Bypass VCR*/
+    int32_t bypass_0_1;
+
+} ia_pal_isp_bxt_vcr_t;
+
+/*! \isp struct bxt_vcr2
+
+*/
+typedef struct
+{
+    /*!< bypass_0_1 Bypass VCR2*/
+    int32_t bypass_0_1;
+    /*!< input_format_420 0 - input 4:4:4 , 1 - input 4:2:0*/
+    int32_t input_format_420;
+    /*!< lpf_p0_c0 Phase 0 - coef 0*/
+    int32_t lpf_p0_c0;
+    /*!< lpf_p0_c1 Phase 0 - coef 1*/
+    int32_t lpf_p0_c1;
+    /*!< lpf_p0_c2 Phase 0 - coef 2*/
+    int32_t lpf_p0_c2;
+    /*!< lpf_p0_c3 Phase 0 - coef 3*/
+    int32_t lpf_p0_c3;
+    /*!< lpf_p1_c0 Phase 1 - coef 0*/
+    int32_t lpf_p1_c0;
+    /*!< lpf_p1_c1 Phase 1 - coef 1*/
+    int32_t lpf_p1_c1;
+    /*!< lpf_p1_c2 Phase 1 - coef 2*/
+    int32_t lpf_p1_c2;
+    /*!< lpf_p1_c3 Phase 1 - coef 3*/
+    int32_t lpf_p1_c3;
+
+} ia_pal_isp_bxt_vcr2_t;
+
+/*! \isp struct bxt_vcsc
+
+*/
+typedef struct
+{
+    /*!< bypass Block bypass for HW use*/
+    int32_t bypass;
+    /*!< gain Matrix table gain exponent*/
+    int32_t gain;
+    /*!< coef_matrix[12] 3x4 Matrix coeffcients, Q10*/
+    int32_t coef_matrix[12];
+    /*!< t0 matrix offeset 0 (y)*/
+    int32_t t0;
+    /*!< t1 matrix offeset 1 (u)*/
+    int32_t t1;
+    /*!< t2 matrix offeset y (v)*/
+    int32_t t2;
+    /*!< fir_alpha_h Horizontal filter 2nd tap coeffcient [0.0…0.33], Q10*/
+    int32_t fir_alpha_h;
+    /*!< fir_alpha_v Vertical filter 2nd tap coeffcient [0.0…0.33], Q10*/
+    int32_t fir_alpha_v;
+
+} ia_pal_isp_bxt_vcsc_t;
+
+/*! \isp struct bxt_vcsc_stills
+
+*/
+typedef struct
+{
+    /*!< bypass Block bypass for HW use*/
+    int32_t bypass;
+    /*!< gain Matrix table gain exponent*/
+    int32_t gain;
+    /*!< coef_matrix[12] 3x4 Matrix coeffcients, Q10*/
+    int32_t coef_matrix[12];
+    /*!< t0 matrix offeset 0 (y)*/
+    int32_t t0;
+    /*!< t1 matrix offeset 1 (u)*/
+    int32_t t1;
+    /*!< t2 matrix offeset y (v)*/
+    int32_t t2;
+    /*!< fir_alpha_h Horizontal filter 2nd tap coeffcient [0.0…0.33], Q10*/
+    int32_t fir_alpha_h;
+    /*!< fir_alpha_v Vertical filter 2nd tap coeffcient [0.0…0.33], Q10*/
+    int32_t fir_alpha_v;
+
+} ia_pal_isp_bxt_vcsc_stills_t;
+
+/*! \isp struct bxt_vcsc_video
+
+*/
+typedef struct
+{
+    /*!< bypass Block bypass for HW use*/
+    int32_t bypass;
+    /*!< gain Matrix table gain exponent*/
+    int32_t gain;
+    /*!< coef_matrix[12] 3x4 Matrix coeffcients, Q10*/
+    int32_t coef_matrix[12];
+    /*!< t0 matrix offeset 0 (y)*/
+    int32_t t0;
+    /*!< t1 matrix offeset 1 (u)*/
+    int32_t t1;
+    /*!< t2 matrix offeset y (v)*/
+    int32_t t2;
+    /*!< fir_alpha_h Horizontal filter 2nd tap coeffcient [0.0…0.33], Q10*/
+    int32_t fir_alpha_h;
+    /*!< fir_alpha_v Vertical filter 2nd tap coeffcient [0.0…0.33], Q10*/
+    int32_t fir_alpha_v;
+
+} ia_pal_isp_bxt_vcsc_video_t;
+
+/*! \isp struct bxt_vcud
+
+*/
+typedef struct
+{
+    /*!< bypass Block bypass for HW use*/
+    int32_t bypass;
+    /*!< chm_offset_u U bias*/
+    int32_t chm_offset_u;
+    /*!< chm_offset_v V bias*/
+    int32_t chm_offset_v;
+    /*!< chm_gain gain exponent of chroma metric*/
+    int32_t chm_gain;
+    /*!< lcs_th_low Low Chroma suppression threshold low*/
+    int32_t lcs_th_low;
+    /*!< lcs_th_high Low Chroma suppression threshold high*/
+    int32_t lcs_th_high;
+    /*!< cu_lcs_x_points[6] CU LCS X points*/
+    int32_t cu_lcs_x_points[6];
+    /*!< cu_lcs_y_points[5] CU LCS Y points*/
+    int32_t cu_lcs_y_points[5];
+    /*!< cu_lcs_slopes[5] CU LCS Slopes, Q4*/
+    int32_t cu_lcs_slopes[5];
+    /*!< cu_noise_x_points[7] CU Noise X points*/
+    int32_t cu_noise_x_points[7];
+    /*!< cu_noise_y_points[6] CU Noise Y points*/
+    int32_t cu_noise_y_points[6];
+    /*!< cu_noise_slopes[6] CU Noise Slopes, Q5*/
+    int32_t cu_noise_slopes[6];
+    /*!< cu_radial_x_points[6] CU Radial X points*/
+    int32_t cu_radial_x_points[6];
+    /*!< cu_radial_y_points[5] CU Radial Y points*/
+    int32_t cu_radial_y_points[5];
+    /*!< cu_radial_slopes[5] CU Radial Slopes, Q8*/
+    int32_t cu_radial_slopes[5];
+    /*!< cu_psdiv_lcs_x_points[12] CU psdiv_lcs X points*/
+    int32_t cu_psdiv_lcs_x_points[12];
+    /*!< cu_psdiv_lcs_y_points[11] CU psdiv_lcs Y points*/
+    int32_t cu_psdiv_lcs_y_points[11];
+    /*!< cu_psdiv_lcs_slopes[11] CU psdiv_lcs Slopes, Q10*/
+    int32_t cu_psdiv_lcs_slopes[11];
+    /*!< cu_psdiv_jbl_x_points[12] CU psdiv_jbl X points*/
+    int32_t cu_psdiv_jbl_x_points[12];
+    /*!< cu_psdiv_jbl_y_points[11] CU psdiv_jbl Y points*/
+    int32_t cu_psdiv_jbl_y_points[11];
+    /*!< cu_psdiv_jbl_slopes[11] CU psdiv_jbl Slopes, Q10*/
+    int32_t cu_psdiv_jbl_slopes[11];
+    /*!< noise_beta[9] Noise model Beta coefficients*/
+    int32_t noise_beta[9];
+    /*!< lpf_coefs[6] Bilatheral Spatial filter coefficients , Q10, {c0, c3,c4,c6,c7,c8}*/
+    int32_t lpf_coefs[6];
+    /*!< jbl_center_loc JBL center location for noise model*/
+    int32_t jbl_center_loc;
+    /*!< jbl_sigma_y JBL Y noise sigma power, Q6*/
+    int32_t jbl_sigma_y;
+    /*!< jbl_sigma_u JBL U noise  sigma power, Q6*/
+    int32_t jbl_sigma_u;
+    /*!< jbl_sigma_v JBL V noise sigma power, Q6*/
+    int32_t jbl_sigma_v;
+    /*!< jbl_dist_epsilon JBL minmum distance*/
+    int32_t jbl_dist_epsilon;
+    /*!< jbl_noise_epsilon2 JBL minimum noise estimation*/
+    int32_t jbl_noise_epsilon2;
+    /*!< jbl_exp2_min JBL minimum value similarity weight (exp^1/2x^2)*/
+    int32_t jbl_exp2_min;
+    /*!< jbl_weight_th JBL minimum weight threshold*/
+    int32_t jbl_weight_th;
+    /*!< upscale_only_en 0 - VCUD do denoising and duplicate chroma to 4:4:4, 1 - VCUD do only bicubic chroma upsampling to 4:4:4*/
+    int32_t upscale_only_en;
+    /*!< rad_en Enable Radial parameters*/
+    int32_t rad_en;
+    /*!< rad_x_reset top left pixel X location relative to the optical center point*/
+    int32_t rad_x_reset;
+    /*!< rad_y_reset top left pixel Y location relative to the optical center point*/
+    int32_t rad_y_reset;
+    /*!< rad_x2_reset rad_x_reset * rad_x_reset*/
+    int32_t rad_x2_reset;
+    /*!< rad_y2_reset rad_y_reset * rad_y_reset*/
+    int32_t rad_y2_reset;
+    /*!< rad_nf exponent gain for rad_inv_r2*/
+    int32_t rad_nf;
+    /*!< rad_inv_r2 1/radius * 2^???*/
+    int32_t rad_inv_r2;
+    /*!< rad_jbl_sigma_y Radial*/
+    int32_t rad_jbl_sigma_y;
+    /*!< rad_jbl_sigma_u Radial*/
+    int32_t rad_jbl_sigma_u;
+    /*!< rad_jbl_sigma_v Radial*/
+    int32_t rad_jbl_sigma_v;
+    /*!< rad_jbl_dist_epsilon Radial*/
+    int32_t rad_jbl_dist_epsilon;
+    /*!< rad_jbl_noise_epsilon2 Radial*/
+    int32_t rad_jbl_noise_epsilon2;
+
+} ia_pal_isp_bxt_vcud_t;
+
+/*! \isp struct bxt_wb
+
+*/
+typedef struct
+{
+    /*!< m_bypass Bypass            {0,1}*/
+    int32_t m_bypass;
+    /*!< m_gainch0 Gain Channel0 (Gr) (U4.12)*/
+    int32_t m_gainch0;
+    /*!< m_gainch1 Gain Channel1 (Gb) (U4.12)*/
+    int32_t m_gainch1;
+    /*!< m_gainch2 Gain Channel2 (G)  (U4.12)*/
+    int32_t m_gainch2;
+    /*!< m_gainch3 Gain Channel3 (B)  (U4.12)*/
+    int32_t m_gainch3;
+    /*!< m_gainch4 Gain Channel4 (R)  (U4.12)*/
+    int32_t m_gainch4;
+    /*!< m_gainch5 Gain Channel5 (W)  (U4.12)*/
+    int32_t m_gainch5;
+    /*!< m_gainch6 Gain Channel6 (U4.12)*/
+    int32_t m_gainch6;
+    /*!< m_gainch7 Gain Channel7 (U4.12)*/
+    int32_t m_gainch7;
+    /*!< m_sensormode 1x1 (0), 2x2 (1), 4x4 (2)*/
+    int32_t m_sensormode;
+    /*!< m_wbindmat[16] Vector WB matrix*/
+    int32_t m_wbindmat[16];
+
+} ia_pal_isp_bxt_wb_t;
+
+/*! \isp struct bxt_wb_stills
+
+*/
+typedef struct
+{
+    /*!< m_bypass Bypass            {0,1}*/
+    int32_t m_bypass;
+    /*!< m_gainch0 Gain Channel0 (Gr) (U4.12)*/
+    int32_t m_gainch0;
+    /*!< m_gainch1 Gain Channel1 (Gb) (U4.12)*/
+    int32_t m_gainch1;
+    /*!< m_gainch2 Gain Channel2 (G)  (U4.12)*/
+    int32_t m_gainch2;
+    /*!< m_gainch3 Gain Channel3 (B)  (U4.12)*/
+    int32_t m_gainch3;
+    /*!< m_gainch4 Gain Channel4 (R)  (U4.12)*/
+    int32_t m_gainch4;
+    /*!< m_gainch5 Gain Channel5 (W)  (U4.12)*/
+    int32_t m_gainch5;
+    /*!< m_gainch6 Gain Channel6 (U4.12)*/
+    int32_t m_gainch6;
+    /*!< m_gainch7 Gain Channel7 (U4.12)*/
+    int32_t m_gainch7;
+    /*!< m_sensormode 1x1 (0), 2x2 (1), 4x4 (2)*/
+    int32_t m_sensormode;
+    /*!< m_wbindmat[16] Vector WB matrix*/
+    int32_t m_wbindmat[16];
+
+} ia_pal_isp_bxt_wb_stills_t;
+
+/*! \isp struct bxt_xnr4_m
+Scalable Chroma and Luma Denoise, Medium and High Frequency
+*/
+typedef struct
+{
+    /*!< jbl_mf_bypass_y Bypass JBL MF Luma*/
+    int32_t jbl_mf_bypass_y;
+    /*!< jbl_mf_bypass_c Bypass MF Chroma*/
+    int32_t jbl_mf_bypass_c;
+    /*!< noise_sigma_mf_y_y Noise Sigma MF Luma per Luma*/
+    int32_t noise_sigma_mf_y_y;
+    /*!< noise_sigma_mf_y_s Noise Sigma MF Luma per Satoration*/
+    int32_t noise_sigma_mf_y_s;
+    /*!< noise_sigma_mf_c_y Noise Sigma MF Chroma per Luma*/
+    int32_t noise_sigma_mf_c_y;
+    /*!< noise_sigma_mf_c_u Noise Sigma MF Chroma per U*/
+    int32_t noise_sigma_mf_c_u;
+    /*!< noise_sigma_mf_c_v Noise Sigma MF Chroma per V*/
+    int32_t noise_sigma_mf_c_v;
+    /*!< rad_noise_sigma_mf_y_y Noise Sigma MF Luma per Luma - radial*/
+    int32_t rad_noise_sigma_mf_y_y;
+    /*!< rad_noise_sigma_mf_y_s Noise Sigma MF Luma per Satoration - radial*/
+    int32_t rad_noise_sigma_mf_y_s;
+    /*!< rad_noise_sigma_mf_c_y Noise Sigma MF Chroma per Luma - radial*/
+    int32_t rad_noise_sigma_mf_c_y;
+    /*!< rad_noise_sigma_mf_c_u Noise Sigma MF Chroma per U - radial*/
+    int32_t rad_noise_sigma_mf_c_u;
+    /*!< rad_noise_sigma_mf_c_v Noise Sigma MF Chroma per V - radial*/
+    int32_t rad_noise_sigma_mf_c_v;
+    /*!< noise_epsilon_mf_y_y Luma min noise variance per Luma , Q12*/
+    int32_t noise_epsilon_mf_y_y;
+    /*!< noise_epsilon_mf_c_y Chroma min noise variance per Luma , Q12*/
+    int32_t noise_epsilon_mf_c_y;
+    /*!< noise_epsilon_mf_c_u Chroma min noise variance per U , Q12*/
+    int32_t noise_epsilon_mf_c_u;
+    /*!< noise_epsilon_mf_c_v Chroma min noise variance per V , Q12*/
+    int32_t noise_epsilon_mf_c_v;
+    /*!< rad_noise_epsilon_mf_y_y Luma min noise variance per Luma , Q12 - radial*/
+    int32_t rad_noise_epsilon_mf_y_y;
+    /*!< rad_noise_epsilon_mf_c_y Chroma min noise variance per Luma , Q12 - radial*/
+    int32_t rad_noise_epsilon_mf_c_y;
+    /*!< rad_noise_epsilon_mf_c_u Chroma min noise variance per U , Q12 - radial*/
+    int32_t rad_noise_epsilon_mf_c_u;
+    /*!< rad_noise_epsilon_mf_c_v Chroma min noise variance per V , Q12 - radial*/
+    int32_t rad_noise_epsilon_mf_c_v;
+    /*!< jbl_weight_th_mf_y Luma Weight threshold of MF JBL*/
+    int32_t jbl_weight_th_mf_y;
+    /*!< jbl_weight_th_mf_c Chroma Weight threshold of MF JBL*/
+    int32_t jbl_weight_th_mf_c;
+    /*!< lpf_mf_coef_y[49] MF JBL Spatial coefs for Luma*/
+    int32_t lpf_mf_coef_y[49];
+    /*!< lpf_mf_coef_c[49] MF JBL Spatial coefs for Chroma*/
+    int32_t lpf_mf_coef_c[49];
+    /*!< range_weight_lut[7] JBL range Weight LUT*/
+    int32_t range_weight_lut[7];
+    /*!< blend_mf_power_y MF denoise blending power y*/
+    int32_t blend_mf_power_y;
+    /*!< blend_mf_power_c MF denoise blending power chroma*/
+    int32_t blend_mf_power_c;
+    /*!< rad_blend_mf_power_y MF denoise blending power y - radial*/
+    int32_t rad_blend_mf_power_y;
+    /*!< rad_blend_mf_power_c MF denoise blending power chroma -radial*/
+    int32_t rad_blend_mf_power_c;
+    /*!< noise_beta_y_0 noise model for y - coef 0, Q12*/
+    int32_t noise_beta_y_0;
+    /*!< noise_beta_u_0 noise model for u - coef 0, Q12*/
+    int32_t noise_beta_u_0;
+    /*!< noise_beta_u_1 noise model for u - coef 1, Q12*/
+    int32_t noise_beta_u_1;
+    /*!< noise_beta_v_0 noise model for v - coef 0, Q12*/
+    int32_t noise_beta_v_0;
+    /*!< noise_beta_v_2 noise model for v - coef 2, Q12*/
+    int32_t noise_beta_v_2;
+    /*!< rad_center_x X location of the radial center location relative to the top left pixel*/
+    int32_t rad_center_x;
+    /*!< rad_center_y Y location of the radial center location relative to the top left pixel*/
+    int32_t rad_center_y;
+    /*!< rad_exp Radial scale bit into the Lut*/
+    int32_t rad_exp;
+    /*!< rad_lut[128] Radial LUT*/
+    int32_t rad_lut[128];
+    /*!< one_div_64_lut[64] 1/SQRT(x), first 64 values LUT*/
+    int32_t one_div_64_lut[64];
+    /*!< xcu_divsqrt_exp XCU divsqrt exponent*/
+    int32_t xcu_divsqrt_exp;
+    /*!< xcu_divsqrt_slp_a_res XCU divsqrt slope precision*/
+    int32_t xcu_divsqrt_slp_a_res;
+    /*!< xcu_divsqrt_offset[16] XCU divsqrt offset(y) vector*/
+    int32_t xcu_divsqrt_offset[16];
+    /*!< xcu_divsqrt_slope[16] XCU divsqrt slope vector*/
+    int32_t xcu_divsqrt_slope[16];
+    /*!< xcu_divsqrt_x[17] XCU divsqrt x points vector + maximal x value*/
+    int32_t xcu_divsqrt_x[17];
+
+} ia_pal_isp_bxt_xnr4_m_t;
+
+/*! \isp struct bxt_xnr4_mh
+Scalable Chroma and Luma Denoise, Medium and High Frequency
+*/
+typedef struct
+{
+    /*!< jbl_mf_bypass_y Bypass JBL MF Luma*/
+    int32_t jbl_mf_bypass_y;
+    /*!< jbl_mf_bypass_c Bypass MF Chroma*/
+    int32_t jbl_mf_bypass_c;
+    /*!< noise_sigma_mf_y_y Noise Sigma MF Luma per Luma*/
+    int32_t noise_sigma_mf_y_y;
+    /*!< noise_sigma_mf_y_s Noise Sigma MF Luma per Satoration*/
+    int32_t noise_sigma_mf_y_s;
+    /*!< noise_sigma_mf_c_y Noise Sigma MF Chroma per Luma*/
+    int32_t noise_sigma_mf_c_y;
+    /*!< noise_sigma_mf_c_u Noise Sigma MF Chroma per U*/
+    int32_t noise_sigma_mf_c_u;
+    /*!< noise_sigma_mf_c_v Noise Sigma MF Chroma per V*/
+    int32_t noise_sigma_mf_c_v;
+    /*!< rad_noise_sigma_mf_y_y Noise Sigma MF Luma per Luma - radial*/
+    int32_t rad_noise_sigma_mf_y_y;
+    /*!< rad_noise_sigma_mf_y_s Noise Sigma MF Luma per Satoration - radial*/
+    int32_t rad_noise_sigma_mf_y_s;
+    /*!< rad_noise_sigma_mf_c_y Noise Sigma MF Chroma per Luma - radial*/
+    int32_t rad_noise_sigma_mf_c_y;
+    /*!< rad_noise_sigma_mf_c_u Noise Sigma MF Chroma per U - radial*/
+    int32_t rad_noise_sigma_mf_c_u;
+    /*!< rad_noise_sigma_mf_c_v Noise Sigma MF Chroma per V - radial*/
+    int32_t rad_noise_sigma_mf_c_v;
+    /*!< noise_epsilon_mf_y_y Luma min noise variance per Luma , Q12*/
+    int32_t noise_epsilon_mf_y_y;
+    /*!< noise_epsilon_mf_c_y Chroma min noise variance per Luma , Q12*/
+    int32_t noise_epsilon_mf_c_y;
+    /*!< noise_epsilon_mf_c_u Chroma min noise variance per U , Q12*/
+    int32_t noise_epsilon_mf_c_u;
+    /*!< noise_epsilon_mf_c_v Chroma min noise variance per V , Q12*/
+    int32_t noise_epsilon_mf_c_v;
+    /*!< rad_noise_epsilon_mf_y_y Luma min noise variance per Luma , Q12 - radial*/
+    int32_t rad_noise_epsilon_mf_y_y;
+    /*!< rad_noise_epsilon_mf_c_y Chroma min noise variance per Luma , Q12 - radial*/
+    int32_t rad_noise_epsilon_mf_c_y;
+    /*!< rad_noise_epsilon_mf_c_u Chroma min noise variance per U , Q12 - radial*/
+    int32_t rad_noise_epsilon_mf_c_u;
+    /*!< rad_noise_epsilon_mf_c_v Chroma min noise variance per V , Q12 - radial*/
+    int32_t rad_noise_epsilon_mf_c_v;
+    /*!< jbl_weight_th_mf_y Luma Weight threshold of MF JBL*/
+    int32_t jbl_weight_th_mf_y;
+    /*!< jbl_weight_th_mf_c Chroma Weight threshold of MF JBL*/
+    int32_t jbl_weight_th_mf_c;
+    /*!< lpf_mf_coef_y[49] MF JBL Spatial coefs for Luma*/
+    int32_t lpf_mf_coef_y[49];
+    /*!< lpf_mf_coef_c[49] MF JBL Spatial coefs for Chroma*/
+    int32_t lpf_mf_coef_c[49];
+    /*!< range_weight_lut[7] JBL range Weight LUT*/
+    int32_t range_weight_lut[7];
+    /*!< blend_mf_power_y MF denoise blending power y*/
+    int32_t blend_mf_power_y;
+    /*!< blend_mf_power_c MF denoise blending power chroma*/
+    int32_t blend_mf_power_c;
+    /*!< rad_blend_mf_power_y MF denoise blending power y - radial*/
+    int32_t rad_blend_mf_power_y;
+    /*!< rad_blend_mf_power_c MF denoise blending power chroma -radial*/
+    int32_t rad_blend_mf_power_c;
+    /*!< noise_beta_y_0 noise model for y - coef 0, Q12*/
+    int32_t noise_beta_y_0;
+    /*!< noise_beta_u_0 noise model for u - coef 0, Q12*/
+    int32_t noise_beta_u_0;
+    /*!< noise_beta_u_1 noise model for u - coef 1, Q12*/
+    int32_t noise_beta_u_1;
+    /*!< noise_beta_v_0 noise model for v - coef 0, Q12*/
+    int32_t noise_beta_v_0;
+    /*!< noise_beta_v_2 noise model for v - coef 2, Q12*/
+    int32_t noise_beta_v_2;
+    /*!< rad_center_x X location of the radial center location relative to the top left pixel*/
+    int32_t rad_center_x;
+    /*!< rad_center_y Y location of the radial center location relative to the top left pixel*/
+    int32_t rad_center_y;
+    /*!< rad_exp Radial scale bit into the Lut*/
+    int32_t rad_exp;
+    /*!< rad_lut[128] Radial LUT*/
+    int32_t rad_lut[128];
+    /*!< one_div_64_lut[64] 1/SQRT(x), first 64 values LUT*/
+    int32_t one_div_64_lut[64];
+    /*!< xcu_divsqrt_exp XCU divsqrt exponent*/
+    int32_t xcu_divsqrt_exp;
+    /*!< xcu_divsqrt_slp_a_res XCU divsqrt slope precision*/
+    int32_t xcu_divsqrt_slp_a_res;
+    /*!< xcu_divsqrt_offset[16] XCU divsqrt offset(y) vector*/
+    int32_t xcu_divsqrt_offset[16];
+    /*!< xcu_divsqrt_slope[16] XCU divsqrt slope vector*/
+    int32_t xcu_divsqrt_slope[16];
+    /*!< xcu_divsqrt_x[17] XCU divsqrt x points vector + maximal x value*/
+    int32_t xcu_divsqrt_x[17];
+    /*!< jbl_hf_bypass_c Bypass HF Chroma*/
+    int32_t jbl_hf_bypass_c;
+    /*!< noise_sigma_hf_c_y Noise Sigma HF Chroma per Luma*/
+    int32_t noise_sigma_hf_c_y;
+    /*!< noise_sigma_hf_c_u Noise Sigma HF Chroma per U*/
+    int32_t noise_sigma_hf_c_u;
+    /*!< noise_sigma_hf_c_v Noise Sigma HF Chroma per V*/
+    int32_t noise_sigma_hf_c_v;
+    /*!< rad_noise_sigma_hf_c_y Noise Sigma HF Chroma per Luma - radial*/
+    int32_t rad_noise_sigma_hf_c_y;
+    /*!< rad_noise_sigma_hf_c_u Noise Sigma HF Chroma per U - radial*/
+    int32_t rad_noise_sigma_hf_c_u;
+    /*!< rad_noise_sigma_hf_c_v Noise Sigma HF Chroma per V - radial*/
+    int32_t rad_noise_sigma_hf_c_v;
+    /*!< noise_epsilon_hf_c_y Chroma min noise variance per Luma , Q12*/
+    int32_t noise_epsilon_hf_c_y;
+    /*!< noise_epsilon_hf_c_u Chroma min noise variance per U , Q12*/
+    int32_t noise_epsilon_hf_c_u;
+    /*!< noise_epsilon_hf_c_v Chroma min noise variance per V , Q12*/
+    int32_t noise_epsilon_hf_c_v;
+    /*!< rad_noise_epsilon_hf_c_y Chroma min noise variance per Luma , Q12 - radial*/
+    int32_t rad_noise_epsilon_hf_c_y;
+    /*!< rad_noise_epsilon_hf_c_u Chroma min noise variance per U , Q12 -radial*/
+    int32_t rad_noise_epsilon_hf_c_u;
+    /*!< rad_noise_epsilon_hf_c_v Chroma min noise variance per V , Q12 -radial*/
+    int32_t rad_noise_epsilon_hf_c_v;
+    /*!< lpf_hf_coef_c[49] HF JBL Spatial coefs for Chroma*/
+    int32_t lpf_hf_coef_c[49];
+    /*!< jbl_weight_th_hf_c Chroma Weight threshold of HF JBL*/
+    int32_t jbl_weight_th_hf_c;
+    /*!< lcs_th_low Low Chroma Suppertion threshold for black level*/
+    int32_t lcs_th_low;
+    /*!< lcs_th_high_delta Low Chroma Suppertion threshold for white level (delta from black)*/
+    int32_t lcs_th_high_delta;
+    /*!< rad_lcs_th_low Low Chroma Suppertion threshold for black level - radial (delta from low)*/
+    int32_t rad_lcs_th_low;
+    /*!< rad_lcs_th_high_delta Low Chroma Suppertion threshold for white level -radial (delta form high delta)*/
+    int32_t rad_lcs_th_high_delta;
+    /*!< xcu_lcs_exp XCU ed exponent*/
+    int32_t xcu_lcs_exp;
+    /*!< xcu_lcs_slp_a_res XCU ed slope precision*/
+    int32_t xcu_lcs_slp_a_res;
+    /*!< xcu_lcs_offset[32] XCU ed offset(y) vector*/
+    int32_t xcu_lcs_offset[32];
+    /*!< xcu_lcs_slope[32] XCU ed slope vector*/
+    int32_t xcu_lcs_slope[32];
+    /*!< xcu_lcs_x[33] XCU ed x points vector + maximal x value*/
+    int32_t xcu_lcs_x[33];
+    /*!< nncu_hf_luma_blend_exp NNCU HF Luma blend  exponent*/
+    int32_t nncu_hf_luma_blend_exp;
+    /*!< nncu_hf_luma_blend_offset[64] NNCU HF Luma blend offset vector*/
+    int32_t nncu_hf_luma_blend_offset[64];
+    /*!< nncu_hf_luma_blend_x_0 NNCU HF Luma blend first X cordinate*/
+    int32_t nncu_hf_luma_blend_x_0;
+    /*!< nncu_hf_luma_blend_x_max NNCU HF Luma blend last X cordinate ( the #65 corrdinate -1)*/
+    int32_t nncu_hf_luma_blend_x_max;
+    /*!< hf_luma_power HF Luma denoise power, Q15*/
+    int32_t hf_luma_power;
+    /*!< rad_hf_luma_power HF Luma denoise power, Q15 -radial*/
+    int32_t rad_hf_luma_power;
+    /*!< blend_hf_power_c blend_mf_power_c HF denoise blending power chroma*/
+    int32_t blend_hf_power_c;
+
+} ia_pal_isp_bxt_xnr4_mh_t;
+
+/*! \isp struct call_info
+Call info contains timestamp of current call to calculate ISP parameters. This information is used to determine run rate of each PAL component.
+*/
+typedef struct
+{
+    /*!< timestamp[2] Timestamp of current iteration. 64 bit value (using both int32 values in the array as one).*/
+    int32_t timestamp[2];
+
+} ia_pal_isp_call_info_t;
+
+/*! \isp struct cas_1_0
+
+*/
+typedef struct
+{
+    /*!< enable Block enable for HW use*/
+    int32_t enable;
+    /*!< x_center Optical center x. Bittage is enough to fit 16K resolution*/
+    int32_t x_center;
+    /*!< y_center Optical center y. Bittage is enough to fit 16K resolution*/
+    int32_t y_center;
+    /*!< x_start Starting column of the fragment. Max number of pixels per line in a stripe is 4096*/
+    int32_t x_start;
+    /*!< y_start Starting row of the fragment (Usualy will be 0)*/
+    int32_t y_start;
+    /*!< inv_spatial_model[16] Describes the inverse spatial noise*/
+    int32_t inv_spatial_model[16];
+    /*!< spatial_step_log2 log2 of spatial lut step size. Bittage is enough for supporting 8192x4320 resulotion*/
+    int32_t spatial_step_log2;
+    /*!< nm_lut[16] noise model for luma. Save&restore register (will be ovveride in video mode)*/
+    int32_t nm_lut[16];
+    /*!< apu_alpha_limit update mechanism in apu - as limit increases, we need more measurements for the histogram bins to be considered as reliable.*/
+    int32_t apu_alpha_limit;
+    /*!< apu_alpha_power update mechanism in apu - as power increase, we count more on the new val calculated then the one from previous frame.*/
+    int32_t apu_alpha_power;
+    /*!< hist_vals[256] histogram valuse of APU to flow between fragments. save and restore. 2D array of size 16*(2^(4))( HWP_APU_N_VALUES*(1<<HWP_APU_HIST_N_BINS_EXP)). precision is 20 (HWP_APU_HIST_BIN_BITTAGE)*/
+    int32_t hist_vals[256];
+    /*!< skin_sharp_suppression_power Suppress sharpening in human skin areas*/
+    int32_t skin_sharp_suppression_power;
+    /*!< signal_metric_low_th low threshold for normalizing signal metric map*/
+    int32_t signal_metric_low_th;
+    /*!< signal_metric_slope slope for normalizing signal metric map*/
+    int32_t signal_metric_slope;
+    /*!< texture_noise_regulator detects less textures for higher values [0,0.2]*/
+    int32_t texture_noise_regulator;
+    /*!< texture_low_th low threshold for normalizing texture map. Values below this threshold will be consider as none texture.*/
+    int32_t texture_low_th;
+    /*!< texture_slope slope for normalizing texture map. This will be used to calculate the high threshold*/
+    int32_t texture_slope;
+    /*!< unsharpfilter[15] Unsharp-mask filter coefficients*/
+    int32_t unsharpfilter[15];
+    /*!< power_luma_control_enable enables the luma control mechanism*/
+    int32_t power_luma_control_enable;
+    /*!< cu_power_luma_control_x[4] x axis values for luma sharpening config-unit*/
+    int32_t cu_power_luma_control_x[4];
+    /*!< cu_power_luma_control_y[3] y axis values for luma sharpening config-unit*/
+    int32_t cu_power_luma_control_y[3];
+    /*!< cu_power_luma_control_slope[3] slope values for luma sharpening config-unit*/
+    int32_t cu_power_luma_control_slope[3];
+    /*!< power_spatial_control_th adapts the power sharpening to spatial location - this threshold is the distance from which the adaptation begins*/
+    int32_t power_spatial_control_th;
+    /*!< power_spatial_control_multiply_factor adapts the power sharpening to spatial location - this it the factor for the power sharpening in the periphrial regions.*/
+    int32_t power_spatial_control_multiply_factor;
+    /*!< power_spatial_control_slope adapts the power sharpening to spatial location - this slope is how fast the adaptation with respect to the distance from the center. In order to bypass spatial control mechanism assign this variable to 0*/
+    int32_t power_spatial_control_slope;
+    /*!< sharpening_power_texture Power of unsharp-mask sharpening for texture regions*/
+    int32_t sharpening_power_texture;
+    /*!< sharpening_power_edges Power of unsharp-mask sharpening for edges regions*/
+    int32_t sharpening_power_edges;
+    /*!< skin_uv_center[2] center of the UV ellipse in UV space*/
+    int32_t skin_uv_center[2];
+    /*!< skin_uv_ellipse[3] minor and major axis UV ellipse. Symetric matrix therfore reducing values to 3 instead of 4*/
+    int32_t skin_uv_ellipse[3];
+    /*!< skin_uv_low_th low threshold for normalizing non-skin area map. Values below this threshold will be consider as skin.*/
+    int32_t skin_uv_low_th;
+    /*!< skin_uv_slope slope for normalizing non-skin map. This will be used to calculate the high threshold*/
+    int32_t skin_uv_slope;
+    /*!< skin_smoothing blending factor for smooting human skin using the bilateral*/
+    int32_t skin_smoothing;
+    /*!< inv_denoise_power 0 - strong denoiser, 63 - weak denoiser*/
+    int32_t inv_denoise_power;
+    /*!< sort_low_undershoots Sorting low undershoots*/
+    int32_t sort_low_undershoots;
+    /*!< alfa_os controls edged overshoot. 0 - no overshoot allowed, 63 - max overshoot allowed*/
+    int32_t alfa_os;
+    /*!< alfa_us controls edged undershoot. 0 - no undershoot allowed, 63 - max undershoot allowed*/
+    int32_t alfa_us;
+    /*!< os_us_delta_compression_threshold overshood/undershood delta which exceed threshold will be compressed. 0-no OS/US allowed. 511-no OS/US clipping.*/
+    int32_t os_us_delta_compression_threshold;
+    /*!< saturated_color_shrap_suppression_th the sharpening for max(u,v) above this threshold wll be suppressed*/
+    int32_t saturated_color_shrap_suppression_th;
+    /*!< saturated_color_shrap_suppression_factor the sharpening for max(u,v) above threshold wll be suppressed by this factor*/
+    int32_t saturated_color_shrap_suppression_factor;
+    /*!< os_us_delta_compression_factor overshoot / undershoot compression factor*/
+    int32_t os_us_delta_compression_factor;
+    /*!< conf_low_th the minimum number of samples consider reliable for APU estimation*/
+    int32_t conf_low_th;
+    /*!< conf_slope slope for normalizing confidence map. This will be used to calculate the high threshold*/
+    int32_t conf_slope;
+
+} ia_pal_isp_cas_1_0_t;
+
+/*! \isp struct ccm_3a_2_0
+AE color correction
+*/
+typedef struct
+{
+    /*!< gain_cx[8] WB coefficients*/
+    int32_t gain_cx[8];
+    /*!< m_1x[4] CCM matrix coefficients M11 - M14 (-4..4)*/
+    int32_t m_1x[4];
+    /*!< m_2x[4] CCM matrix coefficients M21 - M24 (-4..4)*/
+    int32_t m_2x[4];
+    /*!< m_3x[4] CCM matrix coefficients M21 - M24 (-4..4)*/
+    int32_t m_3x[4];
+    /*!< c_x[4] Y-calc matrix coefficients C01 - C04*/
+    int32_t c_x[4];
+    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/
+    int32_t sensor_mode;
+    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_00;
+    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_01;
+    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_02;
+    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_03;
+    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_10;
+    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_11;
+    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_12;
+    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_13;
+    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_20;
+    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_21;
+    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_22;
+    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_23;
+    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_30;
+    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_31;
+    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_32;
+    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_33;
+
+} ia_pal_isp_ccm_3a_2_0_t;
+
+/*! \isp struct comp_spliter
+
+*/
+typedef struct
+{
+    /*!< m_bypass bypass*/
+    int32_t m_bypass;
+
+} ia_pal_isp_comp_spliter_t;
+
+/*! \isp struct compand_1_0
+Companding 24bit --> 15bit
+*/
+typedef struct
+{
+    /*!< enable enable the companding*/
+    int32_t enable;
+    /*!< compand_enable enable the companding CU*/
+    int32_t compand_enable;
+    /*!< cu_companding_x[13] U24 linear, default log-limited*/
+    int32_t cu_companding_x[13];
+    /*!< cu_companding_y[12] U15 companded output*/
+    int32_t cu_companding_y[12];
+    /*!< cu_companding_slope[12] U1.14 15bit slopes for companding*/
+    int32_t cu_companding_slope[12];
+    /*!< linear_pedestal U24, Pedestal added in linear domain*/
+    int32_t linear_pedestal;
+
+} ia_pal_isp_compand_1_0_t;
+
+/*! \isp struct crop_sis
+
+*/
+typedef struct
+{
+    /*!< enable Enable pre SIS crop*/
+    int32_t enable;
+    /*!< crop_col_start crop_col_start*/
+    int32_t crop_col_start;
+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/
+    int32_t crop_row_start;
+    /*!< crop_col_end End column of image data (excess will be cropped)*/
+    int32_t crop_col_end;
+    /*!< crop_row_end End line of image data (excess will be cropped)*/
+    int32_t crop_row_end;
+
+} ia_pal_isp_crop_sis_t;
+
+/*! \isp struct cvt_1_0
+
+*/
+typedef struct
+{
+    /*!< enable enables the filter*/
+    int32_t enable;
+    /*!< enable_upsample enables upsampling (YUV422 --> YUV444)*/
+    int32_t enable_upsample;
+    /*!< enable_downsample enables downsampling (YUV444 --> YUV422)*/
+    int32_t enable_downsample;
+    /*!< enable_csc enables color space conversion (YUV  <--> RGB)*/
+    int32_t enable_csc;
+    /*!< enable_vertical_decimation enables vertical decimation*/
+    int32_t enable_vertical_decimation;
+    /*!< enable_horizontal_decimation enabled horizontal decimation*/
+    int32_t enable_horizontal_decimation;
+    /*!< enable_shuffle enables_shuffle*/
+    int32_t enable_shuffle;
+    /*!< csc_matrix[9] yuv to rgb to yuv conversion matrix, S4.11*/
+    int32_t csc_matrix[9];
+    /*!< shuffle_map_component_0 shuffle mapping of component 0*/
+    int32_t shuffle_map_component_0;
+    /*!< shuffle_map_component_1 shuffle mapping of component 1*/
+    int32_t shuffle_map_component_1;
+    /*!< shuffle_map_component_2 shuffle mapping of component 2*/
+    int32_t shuffle_map_component_2;
+    /*!< shuffle_map_component_3 shuffle mapping of component 3*/
+    int32_t shuffle_map_component_3;
+    /*!< shuffle_map_component_4 shuffle mapping of component 4*/
+    int32_t shuffle_map_component_4;
+    /*!< shuffle_map_component_5 shuffle mapping of component 5*/
+    int32_t shuffle_map_component_5;
+
+} ia_pal_isp_cvt_1_0_t;
+
+/*! \isp struct debug_info
+
+*/
+typedef struct
+{
+    /*!< output_data_id Output data ID. Debugging data to match P2P call sequence with correct PAL output data. AIC increments this value by 1 on every call to ia_isp_bxt_run().*/
+    int32_t output_data_id;
+
+} ia_pal_isp_debug_info_t;
+
+/*! \isp struct decompand_1_0
+Decompanding 15bit --> 24bit
+*/
+typedef struct
+{
+    /*!< enable enable the decompanding*/
+    int32_t enable;
+    /*!< decompand_enable enable the decompanding CU*/
+    int32_t decompand_enable;
+    /*!< cu_decompanding_x[13] U15 linear, companded*/
+    int32_t cu_decompanding_x[13];
+    /*!< cu_decompanding_y[12] U24 decompanded output, default log-limited*/
+    int32_t cu_decompanding_y[12];
+    /*!< cu_decompanding_slope[12] U20.6 26bit slopes for companding*/
+    int32_t cu_decompanding_slope[12];
+    /*!< linear_pedestal U24, Pedestal added in linear domain*/
+    int32_t linear_pedestal;
+
+} ia_pal_isp_decompand_1_0_t;
+
+/*! \isp struct dehaze_1_0
+
+*/
+typedef struct
+{
+    /*!< enable enabling the block. If enable is false, output is RGB obtained w/o 'dehazing'*/
+    int32_t enable;
+    /*!< dehaze_power the strength of the dehazing - obtained from previous frame*/
+    int32_t dehaze_power;
+    /*!< coeff_al overall airlight intrusion parameter*/
+    int32_t coeff_al;
+    /*!< airlight_color[3] airlight color - obtained from previouse frame*/
+    int32_t airlight_color[3];
+    /*!< trans_min minimal accepted tranmission used for transmition map calculation*/
+    int32_t trans_min;
+    /*!< trans_max maximal accepted tranmission used for transmition map calculation*/
+    int32_t trans_max;
+    /*!< quasi_satur_coeff quasi saturation coefficient*/
+    int32_t quasi_satur_coeff;
+    /*!< high_th threshold defining 'edges'*/
+    int32_t high_th;
+    /*!< low_th threshold defining 'flats'*/
+    int32_t low_th;
+    /*!< low_sim_alpha weight of the haze calculated on area used on 'edges'*/
+    int32_t low_sim_alpha;
+    /*!< med_sim_alpha weigh of the haze calculated on area used everwhere except edges and 'flats'*/
+    int32_t med_sim_alpha;
+    /*!< saturation_amp color saturation boost*/
+    int32_t saturation_amp;
+    /*!< update_power_weight mixing coefficient between the old and the new power (defines dynamic behaviour)*/
+    int32_t update_power_weight;
+    /*!< update_haze_color_weight mixing coefficient between the old and the new haze color (defines dynamic behaviour)*/
+    int32_t update_haze_color_weight;
+    /*!< min_tr_for_haze_color minimal transmision value for haze color calculation*/
+    int32_t min_tr_for_haze_color;
+    /*!< max_tr_for_haze_color maximal transmision value for haze color calculation*/
+    int32_t max_tr_for_haze_color;
+    /*!< cu_trans_x[7] power config unit x values*/
+    int32_t cu_trans_x[7];
+    /*!< cu_trans_y[6] power config unit y values*/
+    int32_t cu_trans_y[6];
+    /*!< cu_trans_slopes[6] power config unit slopes values*/
+    int32_t cu_trans_slopes[6];
+    /*!< cu_power_x[4] transmission config unit x values*/
+    int32_t cu_power_x[4];
+    /*!< cu_power_y[3] transmission config unit y values*/
+    int32_t cu_power_y[3];
+    /*!< cu_power_slopes[3] transmission config unit y values*/
+    int32_t cu_power_slopes[3];
+    /*!< max_h_for_update max H value to use for haze color and power updates*/
+    int32_t max_h_for_update;
+    /*!< CCM_yuv2rgb_matrix[9] matrix for conversion from Yuv to RGB*/
+    int32_t CCM_yuv2rgb_matrix[9];
+    /*!< max_uv_haze_color maximal u and v values of haze color*/
+    int32_t max_uv_haze_color;
+    /*!< fragment_h_acc accumulator for haze coordinate value sum on the fragment*/
+    int32_t fragment_h_acc;
+    /*!< fragment_x1_acc accumulator for x1 coordinate value sum on the fragment*/
+    int32_t fragment_x1_acc;
+    /*!< fragment_x2_acc accumulator for x2 coordinate value sum on the fragment*/
+    int32_t fragment_x2_acc;
+    /*!< fragment_pixel_counter accumulator for pixel counter on the fragment*/
+    int32_t fragment_pixel_counter;
+    /*!< fragment_number number of the fragment [0..15]*/
+    int32_t fragment_number;
+    /*!< fragments_in_total fragments in total*/
+    int32_t fragments_in_total;
+    /*!< fragments_overlap fragments overlap*/
+    int32_t fragments_overlap;
+    /*!< pixels_in_total overall pixels in the frame (fragmentation support for 8K maximum)*/
+    int32_t pixels_in_total;
+    /*!< fragment_height fragment height*/
+    int32_t fragment_height;
+    /*!< fragment_width fragment width*/
+    int32_t fragment_width;
+
+} ia_pal_isp_dehaze_1_0_t;
+
+/*! \isp struct dma_cropper_dp
+
+*/
+typedef struct
+{
+    /*!< Bypass bypass the DMA_Cropper*/
+    int32_t Bypass;
+    /*!< crop_left number of pixels to crop from left*/
+    int32_t crop_left;
+    /*!< crop_top number of pixels to crop from top*/
+    int32_t crop_top;
+    /*!< uncropped_output_width output width before any cropping is done*/
+    int32_t uncropped_output_width;
+    /*!< uncropped_output_height output height before any cropping is done*/
+    int32_t uncropped_output_height;
+    /*!< cropped_width input crop width*/
+    int32_t cropped_width;
+    /*!< cropped_height input crop height*/
+    int32_t cropped_height;
+
+} ia_pal_isp_dma_cropper_dp_t;
+
+/*! \isp struct dma_cropper_mp
+
+*/
+typedef struct
+{
+    /*!< Bypass bypass the DMA_Cropper*/
+    int32_t Bypass;
+    /*!< crop_left number of pixels to crop from left*/
+    int32_t crop_left;
+    /*!< crop_top number of pixels to crop from top*/
+    int32_t crop_top;
+    /*!< uncropped_output_width output width before any cropping is done*/
+    int32_t uncropped_output_width;
+    /*!< uncropped_output_height output height before any cropping is done*/
+    int32_t uncropped_output_height;
+    /*!< cropped_width input crop width*/
+    int32_t cropped_width;
+    /*!< cropped_height input crop height*/
+    int32_t cropped_height;
+
+} ia_pal_isp_dma_cropper_mp_t;
+
+/*! \isp struct dma_cropper_ppp
+
+*/
+typedef struct
+{
+    /*!< Bypass bypass the DMA_Cropper*/
+    int32_t Bypass;
+    /*!< crop_left number of pixels to crop from left*/
+    int32_t crop_left;
+    /*!< crop_top number of pixels to crop from top*/
+    int32_t crop_top;
+    /*!< uncropped_output_width output width before any cropping is done*/
+    int32_t uncropped_output_width;
+    /*!< uncropped_output_height output height before any cropping is done*/
+    int32_t uncropped_output_height;
+    /*!< cropped_width input crop width*/
+    int32_t cropped_width;
+    /*!< cropped_height input crop height*/
+    int32_t cropped_height;
+
+} ia_pal_isp_dma_cropper_ppp_t;
+
+/*! \isp struct dol_1_0
+Digital OverLap images 3 to 1 merge
+*/
+typedef struct
+{
+    /*!< enable enabling the block. If enable == false, Output = input_long*/
+    int32_t enable;
+    /*!< wb_multiplied_etr_short[4] U4.14, exposure ratio of short / short multiplied by WB gains, {Gr,R,B Gb}, 0…1*/
+    int32_t wb_multiplied_etr_short[4];
+    /*!< wb_multiplied_etr_med[4] U4.14, exposure ratio of med / short multiplied by WB gains, {Gr,R,B Gb}, 0…1*/
+    int32_t wb_multiplied_etr_med[4];
+    /*!< wb_multiplied_etr_long[4] U4.19, exposure ratio of long / short multiplied by WB gains, {Gr,R,B Gb}, 0…1*/
+    int32_t wb_multiplied_etr_long[4];
+    /*!< max_input_val U.0.20 - max value of input pixel*/
+    int32_t max_input_val;
+    /*!< is_medium_used indicates if medium image is valid*/
+    int32_t is_medium_used;
+    /*!< noise_model_beta_0_short[4] U.0.30, short exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_0 by PAL*/
+    int32_t noise_model_beta_0_short[4];
+    /*!< noise_model_beta_1_short[4] U.0.15, short exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_1 by PAL, {R,G,B}, 0…1*/
+    int32_t noise_model_beta_1_short[4];
+    /*!< noise_model_beta_2_short[4] U.0.15, short exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_2 by PAL, {R,G,B}, 0…1*/
+    int32_t noise_model_beta_2_short[4];
+    /*!< noise_model_beta_0_med[4] U.0.30, medium/LCG exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_0 by PAL*/
+    int32_t noise_model_beta_0_med[4];
+    /*!< noise_model_beta_1_med[4] U.0.15, medium/LCG exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_1 by PAL, {R,G,B}, 0…1*/
+    int32_t noise_model_beta_1_med[4];
+    /*!< noise_model_beta_2_med[4] U.0.15, medium/LCG exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_2 by PAL, {R,G,B}, 0…1*/
+    int32_t noise_model_beta_2_med[4];
+    /*!< noise_model_beta_0_long[4] U.0.30, long/HCG exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_0 by PAL*/
+    int32_t noise_model_beta_0_long[4];
+    /*!< noise_model_beta_1_long[4] U.0.15, long/HCG exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_1 by PAL, {R,G,B}, 0…1*/
+    int32_t noise_model_beta_1_long[4];
+    /*!< noise_model_beta_2_long[4] U.0.15, long/HCG exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_2 by PAL, {R,G,B}, 0…1*/
+    int32_t noise_model_beta_2_long[4];
+    /*!< motion_detector_gain U.2.7 motion detector gain, g_md*/
+    int32_t motion_detector_gain;
+    /*!< motion_detector_falarm_th U.3.5 motion detector false alarm threshold, FM_md*/
+    int32_t motion_detector_falarm_th;
+    /*!< cu_long_not_burnt_x[4] U 15.0 long exposure not-burnt soft threshold - x values*/
+    int32_t cu_long_not_burnt_x[4];
+    /*!< cu_long_not_burnt_y[3] U 1.7 long exposure not-burnt soft threshold  - y values*/
+    int32_t cu_long_not_burnt_y[3];
+    /*!< cu_long_not_burnt_slope[3] S 3.12 long exposure not-burnt soft threshold  - slope values*/
+    int32_t cu_long_not_burnt_slope[3];
+    /*!< cu_med_not_burnt_x[4] U 15.0 medium exposure not-burnt soft threshold  - x values*/
+    int32_t cu_med_not_burnt_x[4];
+    /*!< cu_med_not_burnt_y[3] U 1.7 medium exposure not-burnt soft threshold - y values*/
+    int32_t cu_med_not_burnt_y[3];
+    /*!< cu_med_not_burnt_slope[3] S 3.12 medium exposure not-burnt soft threshold - slope values*/
+    int32_t cu_med_not_burnt_slope[3];
+    /*!< cu_short_not_shadow_x[4] U 15.0 short exposure not-shadow soft threshold  - x values*/
+    int32_t cu_short_not_shadow_x[4];
+    /*!< cu_short_not_shadow_y[3] U 1.7 short exposure not-shadow soft threshold - y values*/
+    int32_t cu_short_not_shadow_y[3];
+    /*!< cu_short_not_shadow_slope[3] S 3.12 short exposure not-shadow soft threshold - slope values*/
+    int32_t cu_short_not_shadow_slope[3];
+    /*!< rad_blur_not_shadow_not_burnt_power U.1.7 the power of the blurred vs. blurred not shadow not burnt*/
+    int32_t rad_blur_not_shadow_not_burnt_power;
+    /*!< hdr_blending_weight_1 U.1.7 - HDR blending weight 1*/
+    int32_t hdr_blending_weight_1;
+    /*!< hdr_blending_weight_2 U.1.7 - HDR blending weight 2*/
+    int32_t hdr_blending_weight_2;
+    /*!< hdr_blending_weight_3 U.1.7 - HDR blending weight 3*/
+    int32_t hdr_blending_weight_3;
+    /*!< hdr_blending_weight_4 U.1.7 - HDR blending weight 4*/
+    int32_t hdr_blending_weight_4;
+    /*!< radiance_long_max_val_for_motion[4] U.0.20 - long max radiance value for motion detector, {Gr,R,B Gb}, 0…1*/
+    int32_t radiance_long_max_val_for_motion[4];
+    /*!< radiance_long_min_val_for_motion[4] S.0.21 - long min radiance value for motion detector, {Gr,R,B Gb}, 0…1*/
+    int32_t radiance_long_min_val_for_motion[4];
+    /*!< radiance_med_max_val_for_motion[4] U.0.20 - med max radiance value for motion detector, {Gr,R,B Gb}, 0…1*/
+    int32_t radiance_med_max_val_for_motion[4];
+    /*!< radiance_med_min_val_for_motion[4] S.0.21 - med min radiance value for motion detector, {Gr,R,B Gb}, 0…1*/
+    int32_t radiance_med_min_val_for_motion[4];
+    /*!< radiance_short_or_med_max_val_for_motion_vs_long[4] U.0.20 - short or med max radiance value vs long for motion detector, {Gr,R,B Gb}, 0…1*/
+    int32_t radiance_short_or_med_max_val_for_motion_vs_long[4];
+    /*!< radiance_short_or_med_min_val_for_motion_vs_long[4] S.0.21 - short or med min radiance value vs long for motion detector, {Gr,R,B Gb}, 0…1*/
+    int32_t radiance_short_or_med_min_val_for_motion_vs_long[4];
+    /*!< radiance_short_max_val_for_motion_vs_med[4] U.0.20 - short max radiance value vs medium for motion detector, {Gr,R,B Gb}, 0…1*/
+    int32_t radiance_short_max_val_for_motion_vs_med[4];
+    /*!< radiance_short_min_val_for_motion[4] S.0.21 - short min radiacne value for motion detector, {Gr,R,B Gb}, 0…1*/
+    int32_t radiance_short_min_val_for_motion[4];
+    /*!< cu_compression_x[8] U.20 cu_compression_x*/
+    int32_t cu_compression_x[8];
+    /*!< cu_compression_y[7] U.15 cu_compression_y*/
+    int32_t cu_compression_y[7];
+    /*!< cu_compression_slope[7] S.2.10 cu_compression_slope (12 bit include sign)*/
+    int32_t cu_compression_slope[7];
+    /*!< motion_dilation_enable enabling dilation on motion-detection map.*/
+    int32_t motion_dilation_enable;
+    /*!< noise_model_var_min_val_long[4] U.0.30 - min value of noise model variance for long/HCG exposure, {Gr,R,B Gb}*/
+    int32_t noise_model_var_min_val_long[4];
+    /*!< noise_model_var_min_val_med[4] U.0.30- min value of noise model variance for medium exposure, {Gr,R,B Gb}*/
+    int32_t noise_model_var_min_val_med[4];
+    /*!< noise_model_var_min_val_short[4] U.0.30 - min value of noise model variance for short exposure, {Gr,R,B Gb}*/
+    int32_t noise_model_var_min_val_short[4];
+    /*!< noise_norm_shift_long U.4.0 long exposure variance normalization*/
+    int32_t noise_norm_shift_long;
+    /*!< noise_norm_shift_med U.4.0 medium exposure variance normalization*/
+    int32_t noise_norm_shift_med;
+    /*!< noise_norm_shift_short U.4.0 short exposure variance normalization*/
+    int32_t noise_norm_shift_short;
+    /*!< dp_enable U1.0 bypass defective pixel sensitive motion detection*/
+    int32_t dp_enable;
+    /*!< dpreduce_prec_long U4.0 long exposure DP sensitive motion detection parameter precision*/
+    int32_t dpreduce_prec_long;
+    /*!< dpreduce_prec_med U4.0 medium exposure DP sensitive motion detection parameter precision*/
+    int32_t dpreduce_prec_med;
+    /*!< dpreduce_slope_long[4] U0.16 long exposure slope value for DP sensitive motion detection*/
+    int32_t dpreduce_slope_long[4];
+    /*!< dpreduce_slope_med[4] U0.16 medium exposure slope value for DP sensitive motion detection*/
+    int32_t dpreduce_slope_med[4];
+    /*!< dpreduce_thre_long[4] U0.16 long exposure threshold for DP sensitive motion detection*/
+    int32_t dpreduce_thre_long[4];
+    /*!< dpreduce_thre_med[4] U0.16 medium exposure threshold for DP sensitive motion detection*/
+    int32_t dpreduce_thre_med[4];
+    /*!< blf_scale_med U0.8 bilateral filter noise model scaling factor for medium exposure*/
+    int32_t blf_scale_med;
+    /*!< blf_scale_short U0.8 bilateral filter noise model scaling factor for short exposure*/
+    int32_t blf_scale_short;
+    /*!< chroma_coring_med U0.8 moving object chroma coring in medium exposure*/
+    int32_t chroma_coring_med;
+    /*!< chroma_coring_short U0.8 moving object chroma coring in short exposure*/
+    int32_t chroma_coring_short;
+    /*!< lfm_enable enabling LFM function*/
+    int32_t lfm_enable;
+    /*!< lfm_rshift1 U5.0*/
+    int32_t lfm_rshift1;
+    /*!< lfm_rshift2 U5.0*/
+    int32_t lfm_rshift2;
+    /*!< lfm_rshift3 S16.0*/
+    int32_t lfm_rshift3;
+    /*!< lfm_clipval1 U5.0*/
+    int32_t lfm_clipval1;
+    /*!< lfm_clipval2 U5.0*/
+    int32_t lfm_clipval2;
+    /*!< lfm_clipval3 U5.0*/
+    int32_t lfm_clipval3;
+    /*!< lfm_maxval_long U20.0*/
+    int32_t lfm_maxval_long;
+    /*!< lfm_maxval_med U20.0*/
+    int32_t lfm_maxval_med;
+    /*!< lfm_smf_th U5.0*/
+    int32_t lfm_smf_th;
+    /*!< lfm_flicker_thre U5.0*/
+    int32_t lfm_flicker_thre;
+    /*!< lfm_flicker_gain U3.6*/
+    int32_t lfm_flicker_gain;
+    /*!< lfm_a2 U5.6*/
+    int32_t lfm_a2;
+    /*!< lfm_b2 U10.0*/
+    int32_t lfm_b2;
+    /*!< lfm_a3 U5.6*/
+    int32_t lfm_a3;
+    /*!< lfm_b3 U10.0*/
+    int32_t lfm_b3;
+    /*!< lfm_blend_shift_long U4.0*/
+    int32_t lfm_blend_shift_long;
+    /*!< lfm_blend_shift_long_med U4.0*/
+    int32_t lfm_blend_shift_long_med;
+    /*!< lfm_blend_shift_long_med_short U4.0*/
+    int32_t lfm_blend_shift_long_med_short;
+
+} ia_pal_isp_dol_1_0_t;
+
+/*! \isp struct dol_2_0
+Exposure image merger
+*/
+typedef struct
+{
+    /*!< bypass Bypass mode; 0: HDR image, 1: long exposure image*/
+    int32_t bypass;
+    /*!< cfaBayer[4] Bayer CFA descriptor; 0: R, 1: Gr; 2: Gb, 3: B*/
+    int32_t cfaBayer[4];
+    /*!< decompandX0[5] Decompanding input 0*/
+    int32_t decompandX0[5];
+    /*!< decompandY0[4] Decompanding output 0*/
+    int32_t decompandY0[4];
+    /*!< decompandS0[4] Decompanding slope 0*/
+    int32_t decompandS0[4];
+    /*!< decompandX1[5] Decompanding input 1*/
+    int32_t decompandX1[5];
+    /*!< decompandY1[4] Decompanding output 1*/
+    int32_t decompandY1[4];
+    /*!< decompandS1[4] Decompanding slope 1*/
+    int32_t decompandS1[4];
+    /*!< decompandX2[5] Decompanding input 2*/
+    int32_t decompandX2[5];
+    /*!< decompandY2[4] Decompanding output 2*/
+    int32_t decompandY2[4];
+    /*!< decompandS2[4] Decompanding slope 2*/
+    int32_t decompandS2[4];
+    /*!< decompandX3[5] Decompanding input 3*/
+    int32_t decompandX3[5];
+    /*!< decompandY3[4] Decompanding output 3*/
+    int32_t decompandY3[4];
+    /*!< decompandS3[4] Decompanding slope 3*/
+    int32_t decompandS3[4];
+    /*!< dolStats[16] DOL statistic extraction descriptor*/
+    int32_t dolStats[16];
+    /*!< dolStatsMode DOL statistic extraction mode, 0: single, 1: pair, 2:  quad*/
+    int32_t dolStatsMode;
+    /*!< wbGains[16] White balancing gains {R G G B}; 1 refers to 4096*/
+    int32_t wbGains[16];
+    /*!< combGains[16] Additional gains {LEr, LEg, LEg, LEb, MEr,…, VEb}; 1 refers to 4096*/
+    int32_t combGains[16];
+    /*!< blackLevel[16] Black level {LEr, LEg, LEg, LEb, MEr,…, VEb};*/
+    int32_t blackLevel[16];
+    /*!< residualBlackLevel[16] Residual black level {LEr, LEg, LEg, LEb, MEr,…, VEb}; 1 refers to 4096*/
+    int32_t residualBlackLevel[16];
+    /*!< residualBlackLevel2[4] Residual black level {LE, ME, SE, VE} for luma; 1 refers to 4096*/
+    int32_t residualBlackLevel2[4];
+    /*!< numExp Number of exposure images*/
+    int32_t numExp;
+    /*!< expRatio[4] Exposure ratios {LE, ME, SE, VE}*/
+    int32_t expRatio[4];
+    /*!< satvalMax[4] Saturation value {LE, ME, SE, VE}*/
+    int32_t satvalMax[4];
+    /*!< satThr[4] Saturation range as bit shift {LE, ME, SE, VE}*/
+    int32_t satThr[4];
+    /*!< satvalMin[4] Minimum saturation value {LE, ME, SE, VE}*/
+    int32_t satvalMin[4];
+    /*!< desatModel[3] Desaturation model; details TBA*/
+    int32_t desatModel[3];
+    /*!< motionIndex Baseline exposure image for motion detection*/
+    int32_t motionIndex;
+    /*!< motionModel[6] Motion model {LM, LM, LM, MS, MS, MS}; details TBA*/
+    int32_t motionModel[6];
+    /*!< motionLo[4] Low signal range {L, L, M, M}; details TBA*/
+    int32_t motionLo[4];
+    /*!< motionHi[4] High signal range; details TBA*/
+    int32_t motionHi[4];
+    /*!< motionLimit[2] Motion map limits {Lo, Hi}*/
+    int32_t motionLimit[2];
+    /*!< flickerModel[6] Flicker model {LE, LE, LE, ME, ME, ME, SE, SE, SE}*/
+    int32_t flickerModel[6];
+    /*!< flickerMaxval[4] Flicker signal upper threshold {LE, ME, SE, VE}*/
+    int32_t flickerMaxval[4];
+    /*!< flickerLimit[2] Flicker map limits {Lo, Hi}*/
+    int32_t flickerLimit[2];
+    /*!< blendingLimit[2] Blending map limits {Lo, Hi}*/
+    int32_t blendingLimit[2];
+    /*!< pedestal Linear output image pedestal*/
+    int32_t pedestal;
+    /*!< compandX[12] Input*/
+    int32_t compandX[12];
+    /*!< compandY[11] Output*/
+    int32_t compandY[11];
+    /*!< compandS[11] Slope*/
+    int32_t compandS[11];
+
+} ia_pal_isp_dol_2_0_t;
+
+/*! \isp struct dol_mapper
+DOL color ID mapper
+*/
+typedef struct
+{
+    /*!< bypass Bypass mode; 0: HDR image, 1: long exposure image*/
+    int32_t bypass;
+    /*!< exposures Number of exposure images*/
+    int32_t exposures;
+    /*!< mapping[16] Pixel extraction descriptor*/
+    int32_t mapping[16];
+    /*!< mode Extraction mode: single (0), pair (1), quad (2)*/
+    int32_t mode;
+
+} ia_pal_isp_dol_mapper_t;
+
+/*! \isp struct dol_parser
+
+*/
+typedef struct
+{
+    /*!< vbp Vertical Blanking Period Before SE starts*/
+    int32_t vbp;
+    /*!< crop_x Pixels to be cropped along the width of the fragment*/
+    int32_t crop_x;
+    /*!< crop_y Pixels to be cropped along the height of the fragment*/
+    int32_t crop_y;
+    /*!< cropped_width Width of the fragment*/
+    int32_t cropped_width;
+    /*!< cropped_height Height of the fragment*/
+    int32_t cropped_height;
+
+} ia_pal_isp_dol_parser_t;
+
+/*! \isp struct dpc_1_1
+
+*/
+typedef struct
+{
+    /*!< afxoffset[32] 8 Autofocus pixels X axis offset U14.0, should be smaller than afxperiod*/
+    int32_t afxoffset[32];
+    /*!< afxperiod[32] 8 Autofocus pixels X axis period*/
+    int32_t afxperiod[32];
+    /*!< afyoffset[32] 8 Autofocus pixels Y axis offset U14.0, should be smaller than afyperiod*/
+    int32_t afyoffset[32];
+    /*!< afyperiod[32] 8 Autofocus pixels Y axis period*/
+    int32_t afyperiod[32];
+    /*!< hdrfactors[16] 4x4 HDR exposure factor U6.8*/
+    int32_t hdrfactors[16];
+    /*!< hdrfactorsinverse[16] 4x4 HDR exposure inverse factor U6.8 - should be inverse of hdrfactors*/
+    int32_t hdrfactorsinverse[16];
+    /*!< configunitcolddistvsmedian_slope[7] cold dist vs median config unit classifier*/
+    int32_t configunitcolddistvsmedian_slope[7];
+    /*!< configunitcolddistvsmedian_x[8] cold dist vs median config unit classifier*/
+    int32_t configunitcolddistvsmedian_x[8];
+    /*!< configunitcolddistvsmedian_y[7] cold dist vs median config unit classifier*/
+    int32_t configunitcolddistvsmedian_y[7];
+    /*!< configunitcolddistvsneighb_slope[7] cold dist vs neigb config unit classifier*/
+    int32_t configunitcolddistvsneighb_slope[7];
+    /*!< configunitcolddistvsneighb_x[8] cold dist vs neigb config unit classifier*/
+    int32_t configunitcolddistvsneighb_x[8];
+    /*!< configunitcolddistvsneighb_y[7] cold dist vs neigb config unit classifier*/
+    int32_t configunitcolddistvsneighb_y[7];
+    /*!< configunitfix_slope[3] fix config unit*/
+    int32_t configunitfix_slope[3];
+    /*!< configunitfix_x[4] fix config unit*/
+    int32_t configunitfix_x[4];
+    /*!< configunitfix_y[3] fix config unit*/
+    int32_t configunitfix_y[3];
+    /*!< configunithotdistvsmedian_slope[7] hot dist vs median classifier*/
+    int32_t configunithotdistvsmedian_slope[7];
+    /*!< configunithotdistvsmedian_x[8] hot dist vs median classifier*/
+    int32_t configunithotdistvsmedian_x[8];
+    /*!< configunithotdistvsmedian_y[7] hot dist vs median classifier*/
+    int32_t configunithotdistvsmedian_y[7];
+    /*!< configunithotdistvsneighb_slope[7] hot dist vs neigb config unit classifier*/
+    int32_t configunithotdistvsneighb_slope[7];
+    /*!< configunithotdistvsneighb_x[8] hot dist vs neigb config unit classifier*/
+    int32_t configunithotdistvsneighb_x[8];
+    /*!< configunithotdistvsneighb_y[7] hot dist vs neigb config unit classifier*/
+    int32_t configunithotdistvsneighb_y[7];
+    /*!< configunitrawvslb_slope[7] configunitrawvslb_slope*/
+    int32_t configunitrawvslb_slope[7];
+    /*!< configunitrawvslb_x[8] configunitrawvslb_x*/
+    int32_t configunitrawvslb_x[8];
+    /*!< configunitrawvslb_y[7] configunitrawvslb_y*/
+    int32_t configunitrawvslb_y[7];
+    /*!< configunitrawvsub_slope[7] configunitrawvsub_slope*/
+    int32_t configunitrawvsub_slope[7];
+    /*!< configunitrawvsub_x[8] configunitrawvsub_x*/
+    int32_t configunitrawvsub_x[8];
+    /*!< configunitrawvsub_y[7] configunitrawvsub_y*/
+    int32_t configunitrawvsub_y[7];
+    /*!< curx[1024] x locations of the static bad pixels*/
+    int32_t curx[1024];
+    /*!< cury[1024] y locations of the static bad pixels*/
+    int32_t cury[1024];
+    /*!< lbtype[16] 0 - B1,   1 - B2,  2 - B3*/
+    int32_t lbtype[16];
+    /*!< ubtype[16] 0 - B1,   1 - B2,  2 - B3*/
+    int32_t ubtype[16];
+    /*!< pelesttype[16] 0-P1, 1-P2, 2-P3, 3-P4, 4-P5, 5-P6*/
+    int32_t pelesttype[16];
+    /*!< dtype[16] 0-D1 1-D2  2-D3*/
+    int32_t dtype[16];
+    /*!< lbmasks[64] configurations related to the bayer pattern*/
+    int32_t lbmasks[64];
+    /*!< ubmasks[64] configurations related to the bayer pattern*/
+    int32_t ubmasks[64];
+    /*!< pmasks[384] configurations related to the bayer pattern*/
+    int32_t pmasks[384];
+    /*!< dmasks[48] configurations related to the bayer pattern*/
+    int32_t dmasks[48];
+    /*!< bitreduceshift Shift value for bit reduce block*/
+    int32_t bitreduceshift;
+    /*!< afenable enable for the AF unit block*/
+    int32_t afenable;
+    /*!< staticenable enable for the static LUT block*/
+    int32_t staticenable;
+    /*!< dynamicenable enable for the dynamic detection block*/
+    int32_t dynamicenable;
+    /*!< n_static_lut_entries number of static lut entries*/
+    int32_t n_static_lut_entries;
+    /*!< frame_width frame width*/
+    int32_t frame_width;
+    /*!< frame_height frame height*/
+    int32_t frame_height;
+    /*!< paf_grid_en[32] paf grid enables*/
+    int32_t paf_grid_en[32];
+    /*!< paf_output_mode 0)disables, do not pass anything 1) first line sent to memset0 second line sent to memset1  2)first line sent to memset0 second to memset 1 and afterward alternate every two lines 3) passthrough –send to memset0 everything*/
+    int32_t paf_output_mode;
+    /*!< swapping1stbc Apply swapping of BC inputs for 1st/3rd/etc.  0: no swapping  1: swap B/C inputs*/
+    int32_t swapping1stbc;
+    /*!< swapping1stcd Apply swapping of CD inputs for 1st/3rd/etc.  0: no swapping 1: swap C/D inputs*/
+    int32_t swapping1stcd;
+    /*!< swapping2ndbc Apply swapping of BC inputs for 2nd/4th/etc. lines  0: no swapping  1: swap A/B inputs*/
+    int32_t swapping2ndbc;
+    /*!< swapping2ndcd Apply swapping of CD inputs for 2nd/4th/etc. lines  0: no swapping 1: swap C/D inputs*/
+    int32_t swapping2ndcd;
+    /*!< pdaf_width Width in units of PDAF pixels. After Width pixels – Pext knows there is a new line coming in. In Modes1..3 – max line length is as in the internal buffer size which is 1024 pixels.*/
+    int32_t pdaf_width;
+    /*!< pdaf_height Height in units of pdaf lines*/
+    int32_t pdaf_height;
+    /*!< drop_pattern[32] Drop pattern for AF pixels. 1=drop the lines 0=use the line*/
+    int32_t drop_pattern[32];
+    /*!< drop_period Period of the drop pattern*/
+    int32_t drop_period;
+
+} ia_pal_isp_dpc_1_1_t;
+
+/*! \isp struct dpc_1_3
+
+*/
+typedef struct
+{
+    /*!< afxoffset[32] 8 Autofocus pixels X axis offset U14.0, should be smaller than afxperiod*/
+    int32_t afxoffset[32];
+    /*!< afxperiod[32] 8 Autofocus pixels X axis period*/
+    int32_t afxperiod[32];
+    /*!< afyoffset[32] 8 Autofocus pixels Y axis offset U14.0, should be smaller than afyperiod*/
+    int32_t afyoffset[32];
+    /*!< afyperiod[32] 8 Autofocus pixels Y axis period*/
+    int32_t afyperiod[32];
+    /*!< hdrfactors[16] 4x4 HDR exposure factor U6.8*/
+    int32_t hdrfactors[16];
+    /*!< hdrfactorsinverse[16] 4x4 HDR exposure inverse factor U6.8 - should be inverse of hdrfactors*/
+    int32_t hdrfactorsinverse[16];
+    /*!< configunitcolddistvsmedian_slope[7] cold dist vs median config unit classifier*/
+    int32_t configunitcolddistvsmedian_slope[7];
+    /*!< configunitcolddistvsmedian_x[8] cold dist vs median config unit classifier*/
+    int32_t configunitcolddistvsmedian_x[8];
+    /*!< configunitcolddistvsmedian_y[7] cold dist vs median config unit classifier*/
+    int32_t configunitcolddistvsmedian_y[7];
+    /*!< configunitcolddistvsneighb_slope[7] cold dist vs neigb config unit classifier*/
+    int32_t configunitcolddistvsneighb_slope[7];
+    /*!< configunitcolddistvsneighb_x[8] cold dist vs neigb config unit classifier*/
+    int32_t configunitcolddistvsneighb_x[8];
+    /*!< configunitcolddistvsneighb_y[7] cold dist vs neigb config unit classifier*/
+    int32_t configunitcolddistvsneighb_y[7];
+    /*!< configunitfix_slope[3] fix config unit*/
+    int32_t configunitfix_slope[3];
+    /*!< configunitfix_x[4] fix config unit*/
+    int32_t configunitfix_x[4];
+    /*!< configunitfix_y[3] fix config unit*/
+    int32_t configunitfix_y[3];
+    /*!< configunithotdistvsmedian_slope[7] hot dist vs median classifier*/
+    int32_t configunithotdistvsmedian_slope[7];
+    /*!< configunithotdistvsmedian_x[8] hot dist vs median classifier*/
+    int32_t configunithotdistvsmedian_x[8];
+    /*!< configunithotdistvsmedian_y[7] hot dist vs median classifier*/
+    int32_t configunithotdistvsmedian_y[7];
+    /*!< configunithotdistvsneighb_slope[7] hot dist vs neigb config unit classifier*/
+    int32_t configunithotdistvsneighb_slope[7];
+    /*!< configunithotdistvsneighb_x[8] hot dist vs neigb config unit classifier*/
+    int32_t configunithotdistvsneighb_x[8];
+    /*!< configunithotdistvsneighb_y[7] hot dist vs neigb config unit classifier*/
+    int32_t configunithotdistvsneighb_y[7];
+    /*!< configunitrawvslb_slope[7] configunitrawvslb_slope*/
+    int32_t configunitrawvslb_slope[7];
+    /*!< configunitrawvslb_x[8] configunitrawvslb_x*/
+    int32_t configunitrawvslb_x[8];
+    /*!< configunitrawvslb_y[7] configunitrawvslb_y*/
+    int32_t configunitrawvslb_y[7];
+    /*!< configunitrawvsub_slope[7] configunitrawvsub_slope*/
+    int32_t configunitrawvsub_slope[7];
+    /*!< configunitrawvsub_x[8] configunitrawvsub_x*/
+    int32_t configunitrawvsub_x[8];
+    /*!< configunitrawvsub_y[7] configunitrawvsub_y*/
+    int32_t configunitrawvsub_y[7];
+    /*!< curx[1024] x locations of the static bad pixels*/
+    int32_t curx[1024];
+    /*!< cury[1024] y locations of the static bad pixels*/
+    int32_t cury[1024];
+    /*!< lbtype[16] 0 - B1,   1 - B2,  2 - B3*/
+    int32_t lbtype[16];
+    /*!< ubtype[16] 0 - B1,   1 - B2,  2 - B3*/
+    int32_t ubtype[16];
+    /*!< pelesttype[16] 0-P1, 1-P2, 2-P3, 3-P4, 4-P5, 5-P6*/
+    int32_t pelesttype[16];
+    /*!< dtype[16] 0-D1 1-D2  2-D3*/
+    int32_t dtype[16];
+    /*!< lbmasks[64] configurations related to the bayer pattern*/
+    int32_t lbmasks[64];
+    /*!< ubmasks[64] configurations related to the bayer pattern*/
+    int32_t ubmasks[64];
+    /*!< pmasks[384] configurations related to the bayer pattern*/
+    int32_t pmasks[384];
+    /*!< dmasks[48] configurations related to the bayer pattern*/
+    int32_t dmasks[48];
+    /*!< bitreduceshift Shift value for bit reduce block*/
+    int32_t bitreduceshift;
+    /*!< afenable enable for the AF unit block*/
+    int32_t afenable;
+    /*!< staticenable enable for the static LUT block*/
+    int32_t staticenable;
+    /*!< dynamicenable enable for the dynamic detection block*/
+    int32_t dynamicenable;
+    /*!< n_static_lut_entries number of static lut entries*/
+    int32_t n_static_lut_entries;
+    /*!< frame_width frame width*/
+    int32_t frame_width;
+    /*!< paf_grid_en[32] paf grid enables*/
+    int32_t paf_grid_en[32];
+    /*!< paf_output_mode 0)disables, do not pass anything\n 1) first line sent to memset0 second\n line sent to memset1\n 2)first line sent to memset0 second to memset 1 and afterward alternate every two lines 3) passthrough –send to memset0 everything*/
+    int32_t paf_output_mode;
+    /*!< swapping1stbc Apply swapping of BC inputs for 1st/3rd/etc.\n0: no swapping\n1: swap B/C inputs*/
+    int32_t swapping1stbc;
+    /*!< swapping1stcd Apply swapping of CD inputs for 1st/3rd/etc.\n0: no swapping\n1: swap C/D inputs*/
+    int32_t swapping1stcd;
+    /*!< swapping2ndbc Apply swapping of BC inputs for 2nd/4th/etc. lines\n0: no swapping\n1: swap A/B inputs*/
+    int32_t swapping2ndbc;
+    /*!< swapping2ndcd Apply swapping of CD inputs for 2nd/4th/etc. lines\n0: no swapping\n1: swap C/D inputs*/
+    int32_t swapping2ndcd;
+    /*!< pdaf_width Width in units of PDAF pixels. After Width pixels – Pext knows there is a new line coming in. In Modes1..3 – max line length is as in the internal buffer size which is 1024 pixels.*/
+    int32_t pdaf_width;
+    /*!< pdaf_height Height in units of pdaf lines*/
+    int32_t pdaf_height;
+    /*!< drop_pattern[32] Drop pattern for AF pixels. 1=drop the lines\n0=use the line*/
+    int32_t drop_pattern[32];
+    /*!< drop_period Period of the drop pattern*/
+    int32_t drop_period;
+    /*!< paf_pattern_rearrangement_en Enable pattern rearrangement unit after AF Pels detection*/
+    int32_t paf_pattern_rearrangement_en;
+    /*!< afsXStart AF pixel detection crop - start X position*/
+    int32_t afsXStart;
+    /*!< afsYStart AF pixel detection crop - start Y position*/
+    int32_t afsYStart;
+    /*!< afsXEnd AF pixel detection crop - end X position*/
+    int32_t afsXEnd;
+    /*!< afsYEnd AF pixel detection crop - end Y position*/
+    int32_t afsYEnd;
+    /*!< afsXStartCropEn AF pixel crop enable - start X position*/
+    int32_t afsXStartCropEn;
+    /*!< afsYStartCropEn AF pixel crop enable - start Y position*/
+    int32_t afsYStartCropEn;
+    /*!< afsXEndCropEn AF pixel crop enable - end X position*/
+    int32_t afsXEndCropEn;
+    /*!< afsYEndCropEn AF pixel crop enable - end Y position*/
+    int32_t afsYEndCropEn;
+    /*!< bypass bypass to the block*/
+    int32_t bypass;
+    /*!< use_nlm[16] use non local means mechanism*/
+    int32_t use_nlm[16];
+    /*!< sad1_thr threshold on the first sad*/
+    int32_t sad1_thr;
+    /*!< sad2_thr threshold on the second sad*/
+    int32_t sad2_thr;
+    /*!< pixel_diff_thr threshold on the pixel difference*/
+    int32_t pixel_diff_thr;
+    /*!< min_direction_sad_thr threshold on the min direction*/
+    int32_t min_direction_sad_thr;
+    /*!< max_direction_sad_thr threshold on the max direction*/
+    int32_t max_direction_sad_thr;
+    /*!< saturation_thr protect pixels in saturated areas*/
+    int32_t saturation_thr;
+    /*!< ignore_ver_direction[16] ignore vertical direction for certain types of pdaf sensors*/
+    int32_t ignore_ver_direction[16];
+    /*!< configunit_med_protection_slope[3] nlm fix config unit*/
+    int32_t configunit_med_protection_slope[3];
+    /*!< configunit_med_protection_x[4] nlm fix config unit*/
+    int32_t configunit_med_protection_x[4];
+    /*!< configunit_med_protection_y[3] nlm fix config unit*/
+    int32_t configunit_med_protection_y[3];
+    /*!< clamping_disable disable clamping to support previous version of dpc*/
+    int32_t clamping_disable;
+    /*!< median_blend_coef median blending parameter*/
+    int32_t median_blend_coef;
+
+} ia_pal_isp_dpc_1_3_t;
+
+/*! \isp struct dpc_2_0
+
+*/
+typedef struct
+{
+    /*!< afxoffset[32] 8 Autofocus pixels X axis offset U14.0, should be smaller than afxperiod*/
+    int32_t afxoffset[32];
+    /*!< afxperiod[32] 8 Autofocus pixels X axis period*/
+    int32_t afxperiod[32];
+    /*!< afyoffset[32] 8 Autofocus pixels Y axis offset U14.0, should be smaller than afyperiod*/
+    int32_t afyoffset[32];
+    /*!< afyperiod[32] 8 Autofocus pixels Y axis period*/
+    int32_t afyperiod[32];
+    /*!< hdrfactors[16] 4x4 HDR exposure factor U6.8*/
+    int32_t hdrfactors[16];
+    /*!< hdrfactorsinverse[16] 4x4 HDR exposure inverse factor U6.8 - should be inverse of hdrfactors*/
+    int32_t hdrfactorsinverse[16];
+    /*!< configunitcolddistvsmedian_slope[7] cold dist vs median config unit classifier*/
+    int32_t configunitcolddistvsmedian_slope[7];
+    /*!< configunitcolddistvsmedian_x[8] cold dist vs median config unit classifier*/
+    int32_t configunitcolddistvsmedian_x[8];
+    /*!< configunitcolddistvsmedian_y[7] cold dist vs median config unit classifier*/
+    int32_t configunitcolddistvsmedian_y[7];
+    /*!< configunitcolddistvsneighb_slope[7] cold dist vs neigb config unit classifier*/
+    int32_t configunitcolddistvsneighb_slope[7];
+    /*!< configunitcolddistvsneighb_x[8] cold dist vs neigb config unit classifier*/
+    int32_t configunitcolddistvsneighb_x[8];
+    /*!< configunitcolddistvsneighb_y[7] cold dist vs neigb config unit classifier*/
+    int32_t configunitcolddistvsneighb_y[7];
+    /*!< configunitfix_slope[3] fix config unit*/
+    int32_t configunitfix_slope[3];
+    /*!< configunitfix_x[4] fix config unit*/
+    int32_t configunitfix_x[4];
+    /*!< configunitfix_y[3] fix config unit*/
+    int32_t configunitfix_y[3];
+    /*!< configunithotdistvsmedian_slope[7] hot dist vs median classifier*/
+    int32_t configunithotdistvsmedian_slope[7];
+    /*!< configunithotdistvsmedian_x[8] hot dist vs median classifier*/
+    int32_t configunithotdistvsmedian_x[8];
+    /*!< configunithotdistvsmedian_y[7] hot dist vs median classifier*/
+    int32_t configunithotdistvsmedian_y[7];
+    /*!< configunithotdistvsneighb_slope[7] hot dist vs neigb config unit classifier*/
+    int32_t configunithotdistvsneighb_slope[7];
+    /*!< configunithotdistvsneighb_x[8] hot dist vs neigb config unit classifier*/
+    int32_t configunithotdistvsneighb_x[8];
+    /*!< configunithotdistvsneighb_y[7] hot dist vs neigb config unit classifier*/
+    int32_t configunithotdistvsneighb_y[7];
+    /*!< pelesttype[16] 0-P1, 1-P2, 2-P3, 3-P4, 4-P5, 5-P6*/
+    int32_t pelesttype[16];
+    /*!< dtype[16] 0-D1 1-D2  2-D3*/
+    int32_t dtype[16];
+    /*!< pmasks[384] configurations related to the bayer pattern*/
+    int32_t pmasks[384];
+    /*!< dmasks[48] configurations related to the bayer pattern*/
+    int32_t dmasks[48];
+    /*!< bitreduceshift Shift value for bit reduce block*/
+    int32_t bitreduceshift;
+    /*!< afenable enable for the AF unit block*/
+    int32_t afenable;
+    /*!< dynamicenable enable for the dynamic detection block*/
+    int32_t dynamicenable;
+    /*!< frame_width frame width*/
+    int32_t frame_width;
+    /*!< paf_grid_en[32] paf grid enables*/
+    int32_t paf_grid_en[32];
+    /*!< paf_output_mode 0)disables, do not pass anything\n 1) first line sent to memset0 second\n line sent to memset1\n 2)first line sent to memset0 second to memset 1 and afterward alternate every two lines 3) passthrough –send to memset0 everything*/
+    int32_t paf_output_mode;
+    /*!< swapping1stbc Apply swapping of BC inputs for 1st/3rd/etc.\n0: no swapping\n1: swap B/C inputs*/
+    int32_t swapping1stbc;
+    /*!< swapping1stcd Apply swapping of CD inputs for 1st/3rd/etc.\n0: no swapping\n1: swap C/D inputs*/
+    int32_t swapping1stcd;
+    /*!< swapping2ndbc Apply swapping of BC inputs for 2nd/4th/etc. lines\n0: no swapping\n1: swap A/B inputs*/
+    int32_t swapping2ndbc;
+    /*!< swapping2ndcd Apply swapping of CD inputs for 2nd/4th/etc. lines\n0: no swapping\n1: swap C/D inputs*/
+    int32_t swapping2ndcd;
+    /*!< pdaf_width Width in units of PDAF pixels. After Width pixels – Pext knows there is a new line coming in. In Modes1..3 – max line length is as in the internal buffer size which is 1024 pixels.*/
+    int32_t pdaf_width;
+    /*!< pdaf_height Height in units of pdaf lines*/
+    int32_t pdaf_height;
+    /*!< drop_pattern[32] Drop pattern for AF pixels. 1=drop the lines\n0=use the line*/
+    int32_t drop_pattern[32];
+    /*!< drop_period Period of the drop pattern*/
+    int32_t drop_period;
+    /*!< paf_pattern_rearrangement_en Enable pattern rearrangement unit after AF Pels detection*/
+    int32_t paf_pattern_rearrangement_en;
+    /*!< afsXStart AF pixel detection crop - start X position*/
+    int32_t afsXStart;
+    /*!< afsYStart AF pixel detection crop - start Y position*/
+    int32_t afsYStart;
+    /*!< afsXEnd AF pixel detection crop - end X position*/
+    int32_t afsXEnd;
+    /*!< afsYEnd AF pixel detection crop - end Y position*/
+    int32_t afsYEnd;
+    /*!< afsXStartCropEn AF pixel crop enable - start X position*/
+    int32_t afsXStartCropEn;
+    /*!< afsYStartCropEn AF pixel crop enable - start Y position*/
+    int32_t afsYStartCropEn;
+    /*!< afsXEndCropEn AF pixel crop enable - end X position*/
+    int32_t afsXEndCropEn;
+    /*!< afsYEndCropEn AF pixel crop enable - end Y position*/
+    int32_t afsYEndCropEn;
+    /*!< bypass bypass to the block*/
+    int32_t bypass;
+    /*!< use_nlm[16] use non local means mechanism*/
+    int32_t use_nlm[16];
+    /*!< sad1_thr threshold on the first sad*/
+    int32_t sad1_thr;
+    /*!< sad2_thr threshold on the second sad*/
+    int32_t sad2_thr;
+    /*!< pixel_diff_thr threshold on the pixel difference*/
+    int32_t pixel_diff_thr;
+    /*!< min_direction_sad_thr threshold on the min direction*/
+    int32_t min_direction_sad_thr;
+    /*!< max_direction_sad_thr threshold on the max direction*/
+    int32_t max_direction_sad_thr;
+    /*!< saturation_thr protect pixels in saturated areas*/
+    int32_t saturation_thr;
+    /*!< ignore_ver_direction[16] ignore vertical direction for certain types of pdaf sensors*/
+    int32_t ignore_ver_direction[16];
+    /*!< configunit_med_protection_slope[3] nlm fix config unit*/
+    int32_t configunit_med_protection_slope[3];
+    /*!< configunit_med_protection_x[4] nlm fix config unit*/
+    int32_t configunit_med_protection_x[4];
+    /*!< configunit_med_protection_y[3] nlm fix config unit*/
+    int32_t configunit_med_protection_y[3];
+    /*!< clamping_disable disable clamping to support previous version of dpc*/
+    int32_t clamping_disable;
+    /*!< sensor_type 0=simple_bayer 1=2pd 2=sve_2pd 3=sve_zigzag1 4=sve_zigzag2*/
+    int32_t sensor_type;
+    /*!< fix_dist when 0 - opposite sign distances around the pixel are ignored*/
+    int32_t fix_dist;
+    /*!< flip_neigb_axis flip neigb vs dist axis*/
+    int32_t flip_neigb_axis;
+    /*!< g_locations_for_sve[16] g on 4x4 grid*/
+    int32_t g_locations_for_sve[16];
+    /*!< config_median_blend_slope[3] blend coef cfg*/
+    int32_t config_median_blend_slope[3];
+    /*!< config_median_blend_x[4] blend coef cfg*/
+    int32_t config_median_blend_x[4];
+    /*!< config_median_blend_y[3] blend coef cfg*/
+    int32_t config_median_blend_y[3];
+    /*!< config_ridges_slope[3] ridge coef cfg*/
+    int32_t config_ridges_slope[3];
+    /*!< config_ridges_x[4] ridge coef cfg*/
+    int32_t config_ridges_x[4];
+    /*!< config_ridges_y[3] ridge coef cfg*/
+    int32_t config_ridges_y[3];
+
+} ia_pal_isp_dpc_2_0_t;
+
+/*! \isp struct drc_1
+DRC filter
+*/
+typedef struct
+{
+    /*!< Bypass Bypass filter*/
+    int32_t Bypass;
+    /*!< blus_ds_factor downscale factor: 8 or 16*/
+    int32_t blus_ds_factor;
+    /*!< blus_sp_coef_a[256] spatial coefficients A (top left), 0.0.15*/
+    int32_t blus_sp_coef_a[256];
+    /*!< blus_sp_coef_b[256] spatial coefficients B (top right), 0.0.15*/
+    int32_t blus_sp_coef_b[256];
+    /*!< blus_sp_coef_c[256] spatial coefficients C (bottom left), 0.0.15*/
+    int32_t blus_sp_coef_c[256];
+    /*!< blus_sp_coef_d[256] spatial coefficients D (bottom right), 0.0.15*/
+    int32_t blus_sp_coef_d[256];
+    /*!< blus_sim_min min value of similarity, 0.0.15*/
+    int32_t blus_sim_min;
+    /*!< lce_bypass LCE bypass*/
+    int32_t lce_bypass;
+    /*!< lce_model_slope LCE model slope, 1.7.8*/
+    int32_t lce_model_slope;
+    /*!< lce_model_offset LCE model offset, 1.7.8*/
+    int32_t lce_model_offset;
+    /*!< lce_viir_sp_weight VIIR spatial weight, 1.0.15*/
+    int32_t lce_viir_sp_weight;
+    /*!< lce_power LCE power, 0.3.12*/
+    int32_t lce_power;
+    /*!< lce_deadzone LCE deadzone, 0.0.15*/
+    int32_t lce_deadzone;
+    /*!< lce_clip LCE clip, 0.0.15*/
+    int32_t lce_clip;
+    /*!< lr_gain_map[133584] LRGain, 0.7.8*/
+    int32_t lr_gain_map[133584];
+    /*!< lr_wgt_map[133584] LRWgt*/
+    int32_t lr_wgt_map[133584];
+    /*!< lr_map_width map width*/
+    int32_t lr_map_width;
+    /*!< lr_map_height map height*/
+    int32_t lr_map_height;
+    /*!< gtm_bypass GTM bypass*/
+    int32_t gtm_bypass;
+    /*!< xcu_gtm_slope_vec[32] GTM xcu slope vector, 1.15-xcu_gtm_slope_resolution.xcu_gtm_slope_resolution*/
+    int32_t xcu_gtm_slope_vec[32];
+    /*!< xcu_gtm_offset_vec[32] GTM xcu offset vector, 0.0.15*/
+    int32_t xcu_gtm_offset_vec[32];
+    /*!< xcu_gtm_x_cord_vec[32] GTM xcu x cord vector, 0.0.15*/
+    int32_t xcu_gtm_x_cord_vec[32];
+    /*!< xcu_gtm_x_cord_max GTM xcu x cord max, 0.0.15*/
+    int32_t xcu_gtm_x_cord_max;
+    /*!< xcu_gtm_exponent GTM xcu exponent*/
+    int32_t xcu_gtm_exponent;
+    /*!< xcu_gtm_slope_resolution GTM xcu slope resolution*/
+    int32_t xcu_gtm_slope_resolution;
+    /*!< gtm_gain_frac_bit GTM gain fractional bit*/
+    int32_t gtm_gain_frac_bit;
+
+} ia_pal_isp_drc_1_t;
+
+/*! \isp struct drc_2
+LUT based DRC and Defog
+*/
+typedef struct
+{
+    /*!< bypass Bypass filter*/
+    int32_t bypass;
+    /*!< gtm_resolution GTM slope resolution*/
+    int32_t gtm_resolution;
+    /*!< gtm_slope_vec[32] GTM slope vector*/
+    int32_t gtm_slope_vec[32];
+    /*!< gtm_offset_vec[32] GTM offset vector*/
+    int32_t gtm_offset_vec[32];
+    /*!< gtm_x_cord_vec[32] GTM x cord vector*/
+    int32_t gtm_x_cord_vec[32];
+    /*!< gtm_x_cord_max GTM xcu x cord max, 0.0.15(for assertion)*/
+    int32_t gtm_x_cord_max;
+    /*!< gtm_exponent GTM xcu exponent(for assertion)*/
+    int32_t gtm_exponent;
+    /*!< gce_defog_resolution LCE&Defog slope resolution*/
+    int32_t gce_defog_resolution;
+    /*!< gce_defog_slope_vec[64] LCE&Defog slope vector*/
+    int32_t gce_defog_slope_vec[64];
+    /*!< gce_defog_offset_vec[64] LCE&Defog offset vector*/
+    int32_t gce_defog_offset_vec[64];
+    /*!< gce_defog_x_cord_vec[64] LCE&Defog x cord vector*/
+    int32_t gce_defog_x_cord_vec[64];
+    /*!< gce_defog_x_cord_max LCE&Defog xcu x cord max, 0.0.15(for assertion)*/
+    int32_t gce_defog_x_cord_max;
+    /*!< gce_defog_exponent LCE&Defog xcu exponent(for assertion)*/
+    int32_t gce_defog_exponent;
+    /*!< defog_A0 Control threshold for defog*/
+    int32_t defog_A0;
+    /*!< defog_A1 Control threshold for defog*/
+    int32_t defog_A1;
+    /*!< sharp_amountL Control sharpening strength L*/
+    int32_t sharp_amountL;
+    /*!< sharp_maxL Control sharpening max L*/
+    int32_t sharp_maxL;
+    /*!< sharp_thrL Control sharpening threshold L*/
+    int32_t sharp_thrL;
+    /*!< sharp_amountS Control sharpening strength S*/
+    int32_t sharp_amountS;
+    /*!< sharp_maxS Control sharpening max S*/
+    int32_t sharp_maxS;
+    /*!< sharp_thrS Control sharpening threshold S*/
+    int32_t sharp_thrS;
+    /*!< ltm_enable ltm enable*/
+    int32_t ltm_enable;
+    /*!< ltm_weight ltm weight*/
+    int32_t ltm_weight;
+
+} ia_pal_isp_drc_2_t;
+
+/*! \isp struct ds_dynamic
+Position in 2x2 QUAD form
+*/
+typedef struct
+{
+    /*!< extract_pos Position in 2x2 QUAD form - to extract pixel or pixel position in (00, 01, 10, 11) to perform downscale*/
+    int32_t extract_pos;
+
+} ia_pal_isp_ds_dynamic_t;
+
+/*! \isp struct dvsstatistics_2
+
+*/
+typedef struct
+{
+    /*!< kappa Global configuration - kappa*/
+    int32_t kappa;
+    /*!< match_shift Global configuration - match_shift*/
+    int32_t match_shift;
+    /*!< ybin_mode Global configuration - y binning mode*/
+    int32_t ybin_mode;
+    /*!< grid_width_l0 DVS statistics grid width level 0*/
+    int32_t grid_width_l0;
+    /*!< grid_height_l0 DVS statistics grid height level 0*/
+    int32_t grid_height_l0;
+    /*!< block_width_l0 DVS statistics block width level 0*/
+    int32_t block_width_l0;
+    /*!< block_height_l0 DVS statistics block height level 0*/
+    int32_t block_height_l0;
+    /*!< x_start_l0 DVS statistics level 0 x start*/
+    int32_t x_start_l0;
+    /*!< y_start_l0 DVS statistics level 0 y start*/
+    int32_t y_start_l0;
+    /*!< enabled_l0 DVS statistics level 0 enable*/
+    int32_t enabled_l0;
+    /*!< x_end_l0 DVS statistics level 0 x end*/
+    int32_t x_end_l0;
+    /*!< y_end_l0 DVS statistics level 0 y end*/
+    int32_t y_end_l0;
+    /*!< grid_width_l1 DVS statistics grid width level 1*/
+    int32_t grid_width_l1;
+    /*!< grid_height_l1 DVS statistics grid height level 1*/
+    int32_t grid_height_l1;
+    /*!< block_width_l1 DVS statistics block width level 1*/
+    int32_t block_width_l1;
+    /*!< block_height_l1 DVS statistics block height level 1*/
+    int32_t block_height_l1;
+    /*!< x_start_l1 DVS statistics level 1 x start*/
+    int32_t x_start_l1;
+    /*!< y_start_l1 DVS statistics level 1 y start*/
+    int32_t y_start_l1;
+    /*!< enabled_l1 DVS statistics level 1 enable*/
+    int32_t enabled_l1;
+    /*!< x_end_l1 DVS statistics level 1 x end*/
+    int32_t x_end_l1;
+    /*!< y_end_l1 DVS statistics level 1 y end*/
+    int32_t y_end_l1;
+    /*!< grid_width_l2 DVS statistics grid width level 2*/
+    int32_t grid_width_l2;
+    /*!< grid_height_l2 DVS statistics grid height level 2*/
+    int32_t grid_height_l2;
+    /*!< block_width_l2 DVS statistics block width level 2*/
+    int32_t block_width_l2;
+    /*!< block_height_l2 DVS statistics block height level 2*/
+    int32_t block_height_l2;
+    /*!< x_start_l2 DVS statistics level 2 x start*/
+    int32_t x_start_l2;
+    /*!< y_start_l2 DVS statistics level 2 y start*/
+    int32_t y_start_l2;
+    /*!< enabled_l2 DVS statistics level 2 enable*/
+    int32_t enabled_l2;
+    /*!< x_end_l2 DVS statistics level 2 x end*/
+    int32_t x_end_l2;
+    /*!< y_end_l2 DVS statistics level 2 y end*/
+    int32_t y_end_l2;
+    /*!< feroi_x_start_l0 DVS statistics fe-roi level 0 x start*/
+    int32_t feroi_x_start_l0;
+    /*!< feroi_y_start_l0 DVS statistics fe-roi level 0 y start*/
+    int32_t feroi_y_start_l0;
+    /*!< feroi_x_end_l0 DVS statistics fe-roi level 0 x end*/
+    int32_t feroi_x_end_l0;
+    /*!< feroi_y_end_l0 DVS statistics fe-roi level 0 y end*/
+    int32_t feroi_y_end_l0;
+    /*!< feroi_x_start_l1 DVS statistics fe-roi level 1 x start*/
+    int32_t feroi_x_start_l1;
+    /*!< feroi_y_start_l1 DVS statistics fe-roi level 1 y start*/
+    int32_t feroi_y_start_l1;
+    /*!< feroi_x_end_l1 DVS statistics fe-roi level 1 x end*/
+    int32_t feroi_x_end_l1;
+    /*!< feroi_y_end_l1 DVS statistics fe-roi level 1 y end*/
+    int32_t feroi_y_end_l1;
+    /*!< feroi_x_start_l2 DVS statistics fe-roi level 2 x start*/
+    int32_t feroi_x_start_l2;
+    /*!< feroi_y_start_l2 DVS statistics fe-roi level 2 y start*/
+    int32_t feroi_y_start_l2;
+    /*!< feroi_x_end_l2 DVS statistics fe-roi level 2 x end*/
+    int32_t feroi_x_end_l2;
+    /*!< feroi_y_end_l2 DVS statistics fe-roi level 2 y end*/
+    int32_t feroi_y_end_l2;
+
+} ia_pal_isp_dvsstatistics_2_t;
+
+/*! \isp struct espa_1_0
+Extendedn Stream Precsion Adapter
+*/
+typedef struct
+{
+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_0;
+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_1;
+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_2;
+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_3;
+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_4;
+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_5;
+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/
+    int32_t Shift_val_comp_0;
+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/
+    int32_t Shift_val_comp_1;
+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/
+    int32_t Shift_val_comp_2;
+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/
+    int32_t Shift_val_comp_3;
+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/
+    int32_t Shift_val_comp_4;
+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/
+    int32_t Shift_val_comp_5;
+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/
+    int32_t Clip_min_comp_0;
+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/
+    int32_t Clip_min_comp_1;
+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/
+    int32_t Clip_min_comp_2;
+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/
+    int32_t Clip_min_comp_3;
+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/
+    int32_t Clip_min_comp_4;
+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/
+    int32_t Clip_min_comp_5;
+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/
+    int32_t Clip_max_comp_0;
+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/
+    int32_t Clip_max_comp_1;
+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/
+    int32_t Clip_max_comp_2;
+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/
+    int32_t Clip_max_comp_3;
+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/
+    int32_t Clip_max_comp_4;
+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/
+    int32_t Clip_max_comp_5;
+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/
+    int32_t Offset_comp_0;
+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/
+    int32_t Offset_comp_1;
+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/
+    int32_t Offset_comp_2;
+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/
+    int32_t Offset_comp_3;
+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/
+    int32_t Offset_comp_4;
+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/
+    int32_t Offset_comp_5;
+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/
+    int32_t Clip_min_val_0;
+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/
+    int32_t Clip_max_val_0;
+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/
+    int32_t Clip_min_val_1;
+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/
+    int32_t Clip_max_val_1;
+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/
+    int32_t Clip_min_val_2;
+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/
+    int32_t Clip_max_val_2;
+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/
+    int32_t Clip_min_val_3;
+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/
+    int32_t Clip_max_val_3;
+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/
+    int32_t Clip_min_val_4;
+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/
+    int32_t Clip_max_val_4;
+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/
+    int32_t Clip_min_val_5;
+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/
+    int32_t Clip_max_val_5;
+
+} ia_pal_isp_espa_1_0_t;
+
+/*! \isp struct espa_1_1
+Extended Stream Precsion Adapter
+*/
+typedef struct
+{
+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_0;
+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_1;
+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_2;
+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_3;
+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_4;
+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_5;
+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/
+    int32_t Shift_val_comp_0;
+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/
+    int32_t Shift_val_comp_1;
+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/
+    int32_t Shift_val_comp_2;
+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/
+    int32_t Shift_val_comp_3;
+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/
+    int32_t Shift_val_comp_4;
+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/
+    int32_t Shift_val_comp_5;
+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/
+    int32_t Clip_min_comp_0;
+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/
+    int32_t Clip_min_comp_1;
+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/
+    int32_t Clip_min_comp_2;
+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/
+    int32_t Clip_min_comp_3;
+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/
+    int32_t Clip_min_comp_4;
+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/
+    int32_t Clip_min_comp_5;
+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/
+    int32_t Clip_max_comp_0;
+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/
+    int32_t Clip_max_comp_1;
+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/
+    int32_t Clip_max_comp_2;
+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/
+    int32_t Clip_max_comp_3;
+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/
+    int32_t Clip_max_comp_4;
+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/
+    int32_t Clip_max_comp_5;
+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/
+    int32_t Offset_comp_0;
+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/
+    int32_t Offset_comp_1;
+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/
+    int32_t Offset_comp_2;
+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/
+    int32_t Offset_comp_3;
+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/
+    int32_t Offset_comp_4;
+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/
+    int32_t Offset_comp_5;
+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/
+    int32_t Clip_min_val_0;
+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/
+    int32_t Clip_max_val_0;
+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/
+    int32_t Clip_min_val_1;
+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/
+    int32_t Clip_max_val_1;
+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/
+    int32_t Clip_min_val_2;
+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/
+    int32_t Clip_max_val_2;
+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/
+    int32_t Clip_min_val_3;
+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/
+    int32_t Clip_max_val_3;
+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/
+    int32_t Clip_min_val_4;
+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/
+    int32_t Clip_max_val_4;
+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/
+    int32_t Clip_min_val_5;
+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/
+    int32_t Clip_max_val_5;
+    /*!< range_reduction_en range_reduction_en*/
+    int32_t range_reduction_en;
+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/
+    int32_t output_resolution;
+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/
+    int32_t MSB_alignment_en;
+
+} ia_pal_isp_espa_1_1_t;
+
+/*! \isp struct espa_isa_bayer_a
+Extended Stream Precsion Adapter
+*/
+typedef struct
+{
+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_0;
+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_1;
+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_2;
+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_3;
+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_4;
+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_5;
+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/
+    int32_t Shift_val_comp_0;
+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/
+    int32_t Shift_val_comp_1;
+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/
+    int32_t Shift_val_comp_2;
+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/
+    int32_t Shift_val_comp_3;
+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/
+    int32_t Shift_val_comp_4;
+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/
+    int32_t Shift_val_comp_5;
+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/
+    int32_t Clip_min_comp_0;
+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/
+    int32_t Clip_min_comp_1;
+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/
+    int32_t Clip_min_comp_2;
+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/
+    int32_t Clip_min_comp_3;
+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/
+    int32_t Clip_min_comp_4;
+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/
+    int32_t Clip_min_comp_5;
+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/
+    int32_t Clip_max_comp_0;
+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/
+    int32_t Clip_max_comp_1;
+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/
+    int32_t Clip_max_comp_2;
+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/
+    int32_t Clip_max_comp_3;
+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/
+    int32_t Clip_max_comp_4;
+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/
+    int32_t Clip_max_comp_5;
+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/
+    int32_t Offset_comp_0;
+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/
+    int32_t Offset_comp_1;
+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/
+    int32_t Offset_comp_2;
+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/
+    int32_t Offset_comp_3;
+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/
+    int32_t Offset_comp_4;
+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/
+    int32_t Offset_comp_5;
+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/
+    int32_t Clip_min_val_0;
+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/
+    int32_t Clip_max_val_0;
+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/
+    int32_t Clip_min_val_1;
+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/
+    int32_t Clip_max_val_1;
+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/
+    int32_t Clip_min_val_2;
+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/
+    int32_t Clip_max_val_2;
+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/
+    int32_t Clip_min_val_3;
+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/
+    int32_t Clip_max_val_3;
+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/
+    int32_t Clip_min_val_4;
+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/
+    int32_t Clip_max_val_4;
+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/
+    int32_t Clip_min_val_5;
+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/
+    int32_t Clip_max_val_5;
+    /*!< range_reduction_en range_reduction_en*/
+    int32_t range_reduction_en;
+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/
+    int32_t output_resolution;
+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/
+    int32_t MSB_alignment_en;
+
+} ia_pal_isp_espa_isa_bayer_a_t;
+
+/*! \isp struct espa_isa_ir_md
+Extended Stream Precision Adapter
+*/
+typedef struct
+{
+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_0;
+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_1;
+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_2;
+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_3;
+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_4;
+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_5;
+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/
+    int32_t Shift_val_comp_0;
+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/
+    int32_t Shift_val_comp_1;
+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/
+    int32_t Shift_val_comp_2;
+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/
+    int32_t Shift_val_comp_3;
+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/
+    int32_t Shift_val_comp_4;
+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/
+    int32_t Shift_val_comp_5;
+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/
+    int32_t Clip_min_comp_0;
+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/
+    int32_t Clip_min_comp_1;
+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/
+    int32_t Clip_min_comp_2;
+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/
+    int32_t Clip_min_comp_3;
+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/
+    int32_t Clip_min_comp_4;
+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/
+    int32_t Clip_min_comp_5;
+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/
+    int32_t Clip_max_comp_0;
+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/
+    int32_t Clip_max_comp_1;
+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/
+    int32_t Clip_max_comp_2;
+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/
+    int32_t Clip_max_comp_3;
+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/
+    int32_t Clip_max_comp_4;
+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/
+    int32_t Clip_max_comp_5;
+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/
+    int32_t Offset_comp_0;
+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/
+    int32_t Offset_comp_1;
+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/
+    int32_t Offset_comp_2;
+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/
+    int32_t Offset_comp_3;
+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/
+    int32_t Offset_comp_4;
+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/
+    int32_t Offset_comp_5;
+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/
+    int32_t Clip_min_val_0;
+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/
+    int32_t Clip_max_val_0;
+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/
+    int32_t Clip_min_val_1;
+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/
+    int32_t Clip_max_val_1;
+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/
+    int32_t Clip_min_val_2;
+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/
+    int32_t Clip_max_val_2;
+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/
+    int32_t Clip_min_val_3;
+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/
+    int32_t Clip_max_val_3;
+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/
+    int32_t Clip_min_val_4;
+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/
+    int32_t Clip_max_val_4;
+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/
+    int32_t Clip_min_val_5;
+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/
+    int32_t Clip_max_val_5;
+    /*!< range_reduction_en range_reduction_en*/
+    int32_t range_reduction_en;
+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/
+    int32_t output_resolution;
+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/
+    int32_t MSB_alignment_en;
+
+} ia_pal_isp_espa_isa_ir_md_t;
+
+/*! \isp struct espa_isa_sis_a
+Extended Stream Precsion Adapter
+*/
+typedef struct
+{
+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_0;
+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_1;
+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_2;
+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_3;
+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_4;
+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_5;
+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/
+    int32_t Shift_val_comp_0;
+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/
+    int32_t Shift_val_comp_1;
+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/
+    int32_t Shift_val_comp_2;
+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/
+    int32_t Shift_val_comp_3;
+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/
+    int32_t Shift_val_comp_4;
+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/
+    int32_t Shift_val_comp_5;
+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/
+    int32_t Clip_min_comp_0;
+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/
+    int32_t Clip_min_comp_1;
+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/
+    int32_t Clip_min_comp_2;
+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/
+    int32_t Clip_min_comp_3;
+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/
+    int32_t Clip_min_comp_4;
+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/
+    int32_t Clip_min_comp_5;
+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/
+    int32_t Clip_max_comp_0;
+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/
+    int32_t Clip_max_comp_1;
+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/
+    int32_t Clip_max_comp_2;
+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/
+    int32_t Clip_max_comp_3;
+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/
+    int32_t Clip_max_comp_4;
+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/
+    int32_t Clip_max_comp_5;
+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/
+    int32_t Offset_comp_0;
+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/
+    int32_t Offset_comp_1;
+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/
+    int32_t Offset_comp_2;
+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/
+    int32_t Offset_comp_3;
+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/
+    int32_t Offset_comp_4;
+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/
+    int32_t Offset_comp_5;
+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/
+    int32_t Clip_min_val_0;
+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/
+    int32_t Clip_max_val_0;
+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/
+    int32_t Clip_min_val_1;
+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/
+    int32_t Clip_max_val_1;
+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/
+    int32_t Clip_min_val_2;
+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/
+    int32_t Clip_max_val_2;
+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/
+    int32_t Clip_min_val_3;
+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/
+    int32_t Clip_max_val_3;
+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/
+    int32_t Clip_min_val_4;
+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/
+    int32_t Clip_max_val_4;
+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/
+    int32_t Clip_min_val_5;
+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/
+    int32_t Clip_max_val_5;
+    /*!< range_reduction_en range_reduction_en*/
+    int32_t range_reduction_en;
+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/
+    int32_t output_resolution;
+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/
+    int32_t MSB_alignment_en;
+
+} ia_pal_isp_espa_isa_sis_a_t;
+
+/*! \isp struct espa_isa_sis_b
+Extended Stream Precsion Adapter
+*/
+typedef struct
+{
+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_0;
+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_1;
+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_2;
+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_3;
+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_4;
+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_5;
+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/
+    int32_t Shift_val_comp_0;
+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/
+    int32_t Shift_val_comp_1;
+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/
+    int32_t Shift_val_comp_2;
+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/
+    int32_t Shift_val_comp_3;
+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/
+    int32_t Shift_val_comp_4;
+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/
+    int32_t Shift_val_comp_5;
+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/
+    int32_t Clip_min_comp_0;
+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/
+    int32_t Clip_min_comp_1;
+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/
+    int32_t Clip_min_comp_2;
+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/
+    int32_t Clip_min_comp_3;
+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/
+    int32_t Clip_min_comp_4;
+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/
+    int32_t Clip_min_comp_5;
+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/
+    int32_t Clip_max_comp_0;
+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/
+    int32_t Clip_max_comp_1;
+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/
+    int32_t Clip_max_comp_2;
+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/
+    int32_t Clip_max_comp_3;
+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/
+    int32_t Clip_max_comp_4;
+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/
+    int32_t Clip_max_comp_5;
+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/
+    int32_t Offset_comp_0;
+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/
+    int32_t Offset_comp_1;
+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/
+    int32_t Offset_comp_2;
+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/
+    int32_t Offset_comp_3;
+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/
+    int32_t Offset_comp_4;
+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/
+    int32_t Offset_comp_5;
+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/
+    int32_t Clip_min_val_0;
+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/
+    int32_t Clip_max_val_0;
+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/
+    int32_t Clip_min_val_1;
+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/
+    int32_t Clip_max_val_1;
+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/
+    int32_t Clip_min_val_2;
+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/
+    int32_t Clip_max_val_2;
+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/
+    int32_t Clip_min_val_3;
+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/
+    int32_t Clip_max_val_3;
+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/
+    int32_t Clip_min_val_4;
+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/
+    int32_t Clip_max_val_4;
+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/
+    int32_t Clip_min_val_5;
+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/
+    int32_t Clip_max_val_5;
+    /*!< range_reduction_en range_reduction_en*/
+    int32_t range_reduction_en;
+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/
+    int32_t output_resolution;
+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/
+    int32_t MSB_alignment_en;
+
+} ia_pal_isp_espa_isa_sis_b_t;
+
+/*! \isp struct espa_isa_wb
+Extended Stream Precsion Adapter
+*/
+typedef struct
+{
+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_0;
+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_1;
+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_2;
+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_3;
+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_4;
+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_5;
+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/
+    int32_t Shift_val_comp_0;
+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/
+    int32_t Shift_val_comp_1;
+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/
+    int32_t Shift_val_comp_2;
+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/
+    int32_t Shift_val_comp_3;
+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/
+    int32_t Shift_val_comp_4;
+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/
+    int32_t Shift_val_comp_5;
+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/
+    int32_t Clip_min_comp_0;
+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/
+    int32_t Clip_min_comp_1;
+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/
+    int32_t Clip_min_comp_2;
+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/
+    int32_t Clip_min_comp_3;
+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/
+    int32_t Clip_min_comp_4;
+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/
+    int32_t Clip_min_comp_5;
+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/
+    int32_t Clip_max_comp_0;
+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/
+    int32_t Clip_max_comp_1;
+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/
+    int32_t Clip_max_comp_2;
+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/
+    int32_t Clip_max_comp_3;
+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/
+    int32_t Clip_max_comp_4;
+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/
+    int32_t Clip_max_comp_5;
+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/
+    int32_t Offset_comp_0;
+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/
+    int32_t Offset_comp_1;
+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/
+    int32_t Offset_comp_2;
+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/
+    int32_t Offset_comp_3;
+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/
+    int32_t Offset_comp_4;
+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/
+    int32_t Offset_comp_5;
+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/
+    int32_t Clip_min_val_0;
+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/
+    int32_t Clip_max_val_0;
+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/
+    int32_t Clip_min_val_1;
+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/
+    int32_t Clip_max_val_1;
+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/
+    int32_t Clip_min_val_2;
+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/
+    int32_t Clip_max_val_2;
+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/
+    int32_t Clip_min_val_3;
+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/
+    int32_t Clip_max_val_3;
+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/
+    int32_t Clip_min_val_4;
+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/
+    int32_t Clip_max_val_4;
+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/
+    int32_t Clip_min_val_5;
+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/
+    int32_t Clip_max_val_5;
+    /*!< range_reduction_en range_reduction_en*/
+    int32_t range_reduction_en;
+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/
+    int32_t output_resolution;
+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/
+    int32_t MSB_alignment_en;
+
+} ia_pal_isp_espa_isa_wb_t;
+
+/*! \isp struct espa_isa_yuv_a
+Extended Stream Precsion Adapter
+*/
+typedef struct
+{
+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_0;
+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_1;
+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_2;
+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_3;
+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_4;
+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_5;
+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/
+    int32_t Shift_val_comp_0;
+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/
+    int32_t Shift_val_comp_1;
+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/
+    int32_t Shift_val_comp_2;
+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/
+    int32_t Shift_val_comp_3;
+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/
+    int32_t Shift_val_comp_4;
+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/
+    int32_t Shift_val_comp_5;
+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/
+    int32_t Clip_min_comp_0;
+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/
+    int32_t Clip_min_comp_1;
+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/
+    int32_t Clip_min_comp_2;
+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/
+    int32_t Clip_min_comp_3;
+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/
+    int32_t Clip_min_comp_4;
+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/
+    int32_t Clip_min_comp_5;
+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/
+    int32_t Clip_max_comp_0;
+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/
+    int32_t Clip_max_comp_1;
+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/
+    int32_t Clip_max_comp_2;
+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/
+    int32_t Clip_max_comp_3;
+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/
+    int32_t Clip_max_comp_4;
+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/
+    int32_t Clip_max_comp_5;
+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/
+    int32_t Offset_comp_0;
+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/
+    int32_t Offset_comp_1;
+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/
+    int32_t Offset_comp_2;
+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/
+    int32_t Offset_comp_3;
+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/
+    int32_t Offset_comp_4;
+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/
+    int32_t Offset_comp_5;
+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/
+    int32_t Clip_min_val_0;
+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/
+    int32_t Clip_max_val_0;
+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/
+    int32_t Clip_min_val_1;
+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/
+    int32_t Clip_max_val_1;
+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/
+    int32_t Clip_min_val_2;
+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/
+    int32_t Clip_max_val_2;
+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/
+    int32_t Clip_min_val_3;
+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/
+    int32_t Clip_max_val_3;
+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/
+    int32_t Clip_min_val_4;
+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/
+    int32_t Clip_max_val_4;
+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/
+    int32_t Clip_min_val_5;
+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/
+    int32_t Clip_max_val_5;
+    /*!< range_reduction_en range_reduction_en*/
+    int32_t range_reduction_en;
+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/
+    int32_t output_resolution;
+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/
+    int32_t MSB_alignment_en;
+
+} ia_pal_isp_espa_isa_yuv_a_t;
+
+/*! \isp struct espa_isa_yuv_b
+Extended Stream Precsion Adapter
+*/
+typedef struct
+{
+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_0;
+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_1;
+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_2;
+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_3;
+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_4;
+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_5;
+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/
+    int32_t Shift_val_comp_0;
+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/
+    int32_t Shift_val_comp_1;
+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/
+    int32_t Shift_val_comp_2;
+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/
+    int32_t Shift_val_comp_3;
+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/
+    int32_t Shift_val_comp_4;
+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/
+    int32_t Shift_val_comp_5;
+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/
+    int32_t Clip_min_comp_0;
+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/
+    int32_t Clip_min_comp_1;
+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/
+    int32_t Clip_min_comp_2;
+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/
+    int32_t Clip_min_comp_3;
+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/
+    int32_t Clip_min_comp_4;
+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/
+    int32_t Clip_min_comp_5;
+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/
+    int32_t Clip_max_comp_0;
+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/
+    int32_t Clip_max_comp_1;
+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/
+    int32_t Clip_max_comp_2;
+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/
+    int32_t Clip_max_comp_3;
+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/
+    int32_t Clip_max_comp_4;
+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/
+    int32_t Clip_max_comp_5;
+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/
+    int32_t Offset_comp_0;
+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/
+    int32_t Offset_comp_1;
+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/
+    int32_t Offset_comp_2;
+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/
+    int32_t Offset_comp_3;
+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/
+    int32_t Offset_comp_4;
+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/
+    int32_t Offset_comp_5;
+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/
+    int32_t Clip_min_val_0;
+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/
+    int32_t Clip_max_val_0;
+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/
+    int32_t Clip_min_val_1;
+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/
+    int32_t Clip_max_val_1;
+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/
+    int32_t Clip_min_val_2;
+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/
+    int32_t Clip_max_val_2;
+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/
+    int32_t Clip_min_val_3;
+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/
+    int32_t Clip_max_val_3;
+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/
+    int32_t Clip_min_val_4;
+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/
+    int32_t Clip_max_val_4;
+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/
+    int32_t Clip_min_val_5;
+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/
+    int32_t Clip_max_val_5;
+    /*!< range_reduction_en range_reduction_en*/
+    int32_t range_reduction_en;
+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/
+    int32_t output_resolution;
+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/
+    int32_t MSB_alignment_en;
+
+} ia_pal_isp_espa_isa_yuv_b_t;
+
+/*! \isp struct espa_isa_yuv_c
+Extended Stream Precsion Adapter
+*/
+typedef struct
+{
+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_0;
+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_1;
+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_2;
+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_3;
+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_4;
+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_5;
+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/
+    int32_t Shift_val_comp_0;
+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/
+    int32_t Shift_val_comp_1;
+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/
+    int32_t Shift_val_comp_2;
+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/
+    int32_t Shift_val_comp_3;
+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/
+    int32_t Shift_val_comp_4;
+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/
+    int32_t Shift_val_comp_5;
+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/
+    int32_t Clip_min_comp_0;
+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/
+    int32_t Clip_min_comp_1;
+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/
+    int32_t Clip_min_comp_2;
+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/
+    int32_t Clip_min_comp_3;
+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/
+    int32_t Clip_min_comp_4;
+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/
+    int32_t Clip_min_comp_5;
+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/
+    int32_t Clip_max_comp_0;
+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/
+    int32_t Clip_max_comp_1;
+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/
+    int32_t Clip_max_comp_2;
+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/
+    int32_t Clip_max_comp_3;
+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/
+    int32_t Clip_max_comp_4;
+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/
+    int32_t Clip_max_comp_5;
+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/
+    int32_t Offset_comp_0;
+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/
+    int32_t Offset_comp_1;
+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/
+    int32_t Offset_comp_2;
+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/
+    int32_t Offset_comp_3;
+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/
+    int32_t Offset_comp_4;
+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/
+    int32_t Offset_comp_5;
+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/
+    int32_t Clip_min_val_0;
+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/
+    int32_t Clip_max_val_0;
+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/
+    int32_t Clip_min_val_1;
+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/
+    int32_t Clip_max_val_1;
+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/
+    int32_t Clip_min_val_2;
+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/
+    int32_t Clip_max_val_2;
+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/
+    int32_t Clip_min_val_3;
+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/
+    int32_t Clip_max_val_3;
+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/
+    int32_t Clip_min_val_4;
+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/
+    int32_t Clip_max_val_4;
+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/
+    int32_t Clip_min_val_5;
+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/
+    int32_t Clip_max_val_5;
+    /*!< range_reduction_en range_reduction_en*/
+    int32_t range_reduction_en;
+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/
+    int32_t output_resolution;
+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/
+    int32_t MSB_alignment_en;
+
+} ia_pal_isp_espa_isa_yuv_c_t;
+
+/*! \isp struct espa_psa_1
+
+*/
+typedef struct
+{
+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_0;
+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_1;
+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_2;
+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_3;
+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_4;
+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_5;
+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/
+    int32_t Shift_val_comp_0;
+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/
+    int32_t Shift_val_comp_1;
+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/
+    int32_t Shift_val_comp_2;
+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/
+    int32_t Shift_val_comp_3;
+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/
+    int32_t Shift_val_comp_4;
+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/
+    int32_t Shift_val_comp_5;
+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/
+    int32_t Clip_min_comp_0;
+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/
+    int32_t Clip_min_comp_1;
+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/
+    int32_t Clip_min_comp_2;
+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/
+    int32_t Clip_min_comp_3;
+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/
+    int32_t Clip_min_comp_4;
+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/
+    int32_t Clip_min_comp_5;
+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/
+    int32_t Clip_max_comp_0;
+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/
+    int32_t Clip_max_comp_1;
+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/
+    int32_t Clip_max_comp_2;
+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/
+    int32_t Clip_max_comp_3;
+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/
+    int32_t Clip_max_comp_4;
+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/
+    int32_t Clip_max_comp_5;
+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/
+    int32_t Offset_comp_0;
+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/
+    int32_t Offset_comp_1;
+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/
+    int32_t Offset_comp_2;
+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/
+    int32_t Offset_comp_3;
+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/
+    int32_t Offset_comp_4;
+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/
+    int32_t Offset_comp_5;
+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/
+    int32_t Clip_min_val_0;
+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/
+    int32_t Clip_max_val_0;
+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/
+    int32_t Clip_min_val_1;
+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/
+    int32_t Clip_max_val_1;
+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/
+    int32_t Clip_min_val_2;
+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/
+    int32_t Clip_max_val_2;
+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/
+    int32_t Clip_min_val_3;
+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/
+    int32_t Clip_max_val_3;
+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/
+    int32_t Clip_min_val_4;
+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/
+    int32_t Clip_max_val_4;
+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/
+    int32_t Clip_min_val_5;
+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/
+    int32_t Clip_max_val_5;
+    /*!< range_reduction_en range_reduction_en*/
+    int32_t range_reduction_en;
+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/
+    int32_t output_resolution;
+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/
+    int32_t MSB_alignment_en;
+
+} ia_pal_isp_espa_psa_1_t;
+
+/*! \isp struct espa_psa_4
+
+*/
+typedef struct
+{
+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_0;
+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_1;
+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_2;
+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_3;
+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_4;
+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_5;
+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/
+    int32_t Shift_val_comp_0;
+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/
+    int32_t Shift_val_comp_1;
+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/
+    int32_t Shift_val_comp_2;
+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/
+    int32_t Shift_val_comp_3;
+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/
+    int32_t Shift_val_comp_4;
+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/
+    int32_t Shift_val_comp_5;
+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/
+    int32_t Clip_min_comp_0;
+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/
+    int32_t Clip_min_comp_1;
+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/
+    int32_t Clip_min_comp_2;
+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/
+    int32_t Clip_min_comp_3;
+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/
+    int32_t Clip_min_comp_4;
+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/
+    int32_t Clip_min_comp_5;
+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/
+    int32_t Clip_max_comp_0;
+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/
+    int32_t Clip_max_comp_1;
+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/
+    int32_t Clip_max_comp_2;
+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/
+    int32_t Clip_max_comp_3;
+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/
+    int32_t Clip_max_comp_4;
+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/
+    int32_t Clip_max_comp_5;
+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/
+    int32_t Offset_comp_0;
+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/
+    int32_t Offset_comp_1;
+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/
+    int32_t Offset_comp_2;
+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/
+    int32_t Offset_comp_3;
+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/
+    int32_t Offset_comp_4;
+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/
+    int32_t Offset_comp_5;
+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/
+    int32_t Clip_min_val_0;
+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/
+    int32_t Clip_max_val_0;
+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/
+    int32_t Clip_min_val_1;
+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/
+    int32_t Clip_max_val_1;
+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/
+    int32_t Clip_min_val_2;
+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/
+    int32_t Clip_max_val_2;
+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/
+    int32_t Clip_min_val_3;
+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/
+    int32_t Clip_max_val_3;
+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/
+    int32_t Clip_min_val_4;
+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/
+    int32_t Clip_max_val_4;
+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/
+    int32_t Clip_min_val_5;
+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/
+    int32_t Clip_max_val_5;
+    /*!< range_reduction_en range_reduction_en*/
+    int32_t range_reduction_en;
+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/
+    int32_t output_resolution;
+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/
+    int32_t MSB_alignment_en;
+
+} ia_pal_isp_espa_psa_4_t;
+
+/*! \isp struct espa_psa_5
+
+*/
+typedef struct
+{
+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_0;
+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_1;
+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_2;
+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_3;
+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_4;
+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_5;
+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/
+    int32_t Shift_val_comp_0;
+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/
+    int32_t Shift_val_comp_1;
+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/
+    int32_t Shift_val_comp_2;
+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/
+    int32_t Shift_val_comp_3;
+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/
+    int32_t Shift_val_comp_4;
+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/
+    int32_t Shift_val_comp_5;
+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/
+    int32_t Clip_min_comp_0;
+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/
+    int32_t Clip_min_comp_1;
+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/
+    int32_t Clip_min_comp_2;
+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/
+    int32_t Clip_min_comp_3;
+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/
+    int32_t Clip_min_comp_4;
+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/
+    int32_t Clip_min_comp_5;
+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/
+    int32_t Clip_max_comp_0;
+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/
+    int32_t Clip_max_comp_1;
+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/
+    int32_t Clip_max_comp_2;
+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/
+    int32_t Clip_max_comp_3;
+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/
+    int32_t Clip_max_comp_4;
+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/
+    int32_t Clip_max_comp_5;
+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/
+    int32_t Offset_comp_0;
+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/
+    int32_t Offset_comp_1;
+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/
+    int32_t Offset_comp_2;
+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/
+    int32_t Offset_comp_3;
+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/
+    int32_t Offset_comp_4;
+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/
+    int32_t Offset_comp_5;
+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/
+    int32_t Clip_min_val_0;
+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/
+    int32_t Clip_max_val_0;
+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/
+    int32_t Clip_min_val_1;
+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/
+    int32_t Clip_max_val_1;
+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/
+    int32_t Clip_min_val_2;
+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/
+    int32_t Clip_max_val_2;
+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/
+    int32_t Clip_min_val_3;
+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/
+    int32_t Clip_max_val_3;
+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/
+    int32_t Clip_min_val_4;
+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/
+    int32_t Clip_max_val_4;
+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/
+    int32_t Clip_min_val_5;
+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/
+    int32_t Clip_max_val_5;
+    /*!< range_reduction_en range_reduction_en*/
+    int32_t range_reduction_en;
+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/
+    int32_t output_resolution;
+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/
+    int32_t MSB_alignment_en;
+
+} ia_pal_isp_espa_psa_5_t;
+
+/*! \isp struct espa_psa_c
+
+*/
+typedef struct
+{
+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_0;
+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_1;
+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_2;
+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_3;
+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_4;
+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_5;
+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/
+    int32_t Shift_val_comp_0;
+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/
+    int32_t Shift_val_comp_1;
+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/
+    int32_t Shift_val_comp_2;
+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/
+    int32_t Shift_val_comp_3;
+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/
+    int32_t Shift_val_comp_4;
+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/
+    int32_t Shift_val_comp_5;
+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/
+    int32_t Clip_min_comp_0;
+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/
+    int32_t Clip_min_comp_1;
+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/
+    int32_t Clip_min_comp_2;
+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/
+    int32_t Clip_min_comp_3;
+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/
+    int32_t Clip_min_comp_4;
+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/
+    int32_t Clip_min_comp_5;
+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/
+    int32_t Clip_max_comp_0;
+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/
+    int32_t Clip_max_comp_1;
+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/
+    int32_t Clip_max_comp_2;
+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/
+    int32_t Clip_max_comp_3;
+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/
+    int32_t Clip_max_comp_4;
+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/
+    int32_t Clip_max_comp_5;
+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/
+    int32_t Offset_comp_0;
+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/
+    int32_t Offset_comp_1;
+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/
+    int32_t Offset_comp_2;
+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/
+    int32_t Offset_comp_3;
+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/
+    int32_t Offset_comp_4;
+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/
+    int32_t Offset_comp_5;
+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/
+    int32_t Clip_min_val_0;
+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/
+    int32_t Clip_max_val_0;
+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/
+    int32_t Clip_min_val_1;
+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/
+    int32_t Clip_max_val_1;
+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/
+    int32_t Clip_min_val_2;
+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/
+    int32_t Clip_max_val_2;
+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/
+    int32_t Clip_min_val_3;
+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/
+    int32_t Clip_max_val_3;
+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/
+    int32_t Clip_min_val_4;
+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/
+    int32_t Clip_max_val_4;
+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/
+    int32_t Clip_min_val_5;
+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/
+    int32_t Clip_max_val_5;
+    /*!< range_reduction_en range_reduction_en*/
+    int32_t range_reduction_en;
+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/
+    int32_t output_resolution;
+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/
+    int32_t MSB_alignment_en;
+
+} ia_pal_isp_espa_psa_c_t;
+
+/*! \isp struct espa_psa_d
+
+*/
+typedef struct
+{
+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_0;
+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_1;
+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_2;
+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_3;
+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_4;
+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_5;
+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/
+    int32_t Shift_val_comp_0;
+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/
+    int32_t Shift_val_comp_1;
+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/
+    int32_t Shift_val_comp_2;
+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/
+    int32_t Shift_val_comp_3;
+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/
+    int32_t Shift_val_comp_4;
+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/
+    int32_t Shift_val_comp_5;
+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/
+    int32_t Clip_min_comp_0;
+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/
+    int32_t Clip_min_comp_1;
+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/
+    int32_t Clip_min_comp_2;
+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/
+    int32_t Clip_min_comp_3;
+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/
+    int32_t Clip_min_comp_4;
+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/
+    int32_t Clip_min_comp_5;
+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/
+    int32_t Clip_max_comp_0;
+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/
+    int32_t Clip_max_comp_1;
+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/
+    int32_t Clip_max_comp_2;
+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/
+    int32_t Clip_max_comp_3;
+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/
+    int32_t Clip_max_comp_4;
+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/
+    int32_t Clip_max_comp_5;
+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/
+    int32_t Offset_comp_0;
+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/
+    int32_t Offset_comp_1;
+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/
+    int32_t Offset_comp_2;
+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/
+    int32_t Offset_comp_3;
+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/
+    int32_t Offset_comp_4;
+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/
+    int32_t Offset_comp_5;
+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/
+    int32_t Clip_min_val_0;
+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/
+    int32_t Clip_max_val_0;
+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/
+    int32_t Clip_min_val_1;
+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/
+    int32_t Clip_max_val_1;
+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/
+    int32_t Clip_min_val_2;
+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/
+    int32_t Clip_max_val_2;
+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/
+    int32_t Clip_min_val_3;
+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/
+    int32_t Clip_max_val_3;
+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/
+    int32_t Clip_min_val_4;
+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/
+    int32_t Clip_max_val_4;
+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/
+    int32_t Clip_min_val_5;
+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/
+    int32_t Clip_max_val_5;
+    /*!< range_reduction_en range_reduction_en*/
+    int32_t range_reduction_en;
+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/
+    int32_t output_resolution;
+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/
+    int32_t MSB_alignment_en;
+
+} ia_pal_isp_espa_psa_d_t;
+
+/*! \isp struct espa_psa_e
+
+*/
+typedef struct
+{
+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_0;
+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_1;
+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_2;
+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_3;
+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_4;
+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_5;
+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/
+    int32_t Shift_val_comp_0;
+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/
+    int32_t Shift_val_comp_1;
+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/
+    int32_t Shift_val_comp_2;
+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/
+    int32_t Shift_val_comp_3;
+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/
+    int32_t Shift_val_comp_4;
+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/
+    int32_t Shift_val_comp_5;
+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/
+    int32_t Clip_min_comp_0;
+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/
+    int32_t Clip_min_comp_1;
+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/
+    int32_t Clip_min_comp_2;
+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/
+    int32_t Clip_min_comp_3;
+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/
+    int32_t Clip_min_comp_4;
+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/
+    int32_t Clip_min_comp_5;
+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/
+    int32_t Clip_max_comp_0;
+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/
+    int32_t Clip_max_comp_1;
+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/
+    int32_t Clip_max_comp_2;
+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/
+    int32_t Clip_max_comp_3;
+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/
+    int32_t Clip_max_comp_4;
+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/
+    int32_t Clip_max_comp_5;
+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/
+    int32_t Offset_comp_0;
+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/
+    int32_t Offset_comp_1;
+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/
+    int32_t Offset_comp_2;
+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/
+    int32_t Offset_comp_3;
+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/
+    int32_t Offset_comp_4;
+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/
+    int32_t Offset_comp_5;
+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/
+    int32_t Clip_min_val_0;
+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/
+    int32_t Clip_max_val_0;
+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/
+    int32_t Clip_min_val_1;
+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/
+    int32_t Clip_max_val_1;
+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/
+    int32_t Clip_min_val_2;
+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/
+    int32_t Clip_max_val_2;
+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/
+    int32_t Clip_min_val_3;
+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/
+    int32_t Clip_max_val_3;
+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/
+    int32_t Clip_min_val_4;
+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/
+    int32_t Clip_max_val_4;
+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/
+    int32_t Clip_min_val_5;
+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/
+    int32_t Clip_max_val_5;
+    /*!< range_reduction_en range_reduction_en*/
+    int32_t range_reduction_en;
+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/
+    int32_t output_resolution;
+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/
+    int32_t MSB_alignment_en;
+
+} ia_pal_isp_espa_psa_e_t;
+
+/*! \isp struct espa_psa_f
+Extended Stream Precsion Adapter
+*/
+typedef struct
+{
+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_0;
+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_1;
+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_2;
+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_3;
+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_4;
+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_5;
+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/
+    int32_t Shift_val_comp_0;
+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/
+    int32_t Shift_val_comp_1;
+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/
+    int32_t Shift_val_comp_2;
+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/
+    int32_t Shift_val_comp_3;
+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/
+    int32_t Shift_val_comp_4;
+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/
+    int32_t Shift_val_comp_5;
+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/
+    int32_t Clip_min_comp_0;
+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/
+    int32_t Clip_min_comp_1;
+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/
+    int32_t Clip_min_comp_2;
+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/
+    int32_t Clip_min_comp_3;
+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/
+    int32_t Clip_min_comp_4;
+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/
+    int32_t Clip_min_comp_5;
+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/
+    int32_t Clip_max_comp_0;
+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/
+    int32_t Clip_max_comp_1;
+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/
+    int32_t Clip_max_comp_2;
+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/
+    int32_t Clip_max_comp_3;
+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/
+    int32_t Clip_max_comp_4;
+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/
+    int32_t Clip_max_comp_5;
+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/
+    int32_t Offset_comp_0;
+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/
+    int32_t Offset_comp_1;
+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/
+    int32_t Offset_comp_2;
+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/
+    int32_t Offset_comp_3;
+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/
+    int32_t Offset_comp_4;
+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/
+    int32_t Offset_comp_5;
+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/
+    int32_t Clip_min_val_0;
+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/
+    int32_t Clip_max_val_0;
+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/
+    int32_t Clip_min_val_1;
+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/
+    int32_t Clip_max_val_1;
+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/
+    int32_t Clip_min_val_2;
+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/
+    int32_t Clip_max_val_2;
+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/
+    int32_t Clip_min_val_3;
+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/
+    int32_t Clip_max_val_3;
+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/
+    int32_t Clip_min_val_4;
+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/
+    int32_t Clip_max_val_4;
+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/
+    int32_t Clip_min_val_5;
+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/
+    int32_t Clip_max_val_5;
+    /*!< range_reduction_en range_reduction_en*/
+    int32_t range_reduction_en;
+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/
+    int32_t output_resolution;
+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/
+    int32_t MSB_alignment_en;
+
+} ia_pal_isp_espa_psa_f_t;
+
+/*! \isp struct espa_psa_g
+
+*/
+typedef struct
+{
+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_0;
+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_1;
+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_2;
+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_3;
+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_4;
+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_5;
+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/
+    int32_t Shift_val_comp_0;
+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/
+    int32_t Shift_val_comp_1;
+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/
+    int32_t Shift_val_comp_2;
+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/
+    int32_t Shift_val_comp_3;
+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/
+    int32_t Shift_val_comp_4;
+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/
+    int32_t Shift_val_comp_5;
+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/
+    int32_t Clip_min_comp_0;
+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/
+    int32_t Clip_min_comp_1;
+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/
+    int32_t Clip_min_comp_2;
+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/
+    int32_t Clip_min_comp_3;
+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/
+    int32_t Clip_min_comp_4;
+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/
+    int32_t Clip_min_comp_5;
+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/
+    int32_t Clip_max_comp_0;
+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/
+    int32_t Clip_max_comp_1;
+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/
+    int32_t Clip_max_comp_2;
+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/
+    int32_t Clip_max_comp_3;
+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/
+    int32_t Clip_max_comp_4;
+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/
+    int32_t Clip_max_comp_5;
+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/
+    int32_t Offset_comp_0;
+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/
+    int32_t Offset_comp_1;
+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/
+    int32_t Offset_comp_2;
+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/
+    int32_t Offset_comp_3;
+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/
+    int32_t Offset_comp_4;
+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/
+    int32_t Offset_comp_5;
+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/
+    int32_t Clip_min_val_0;
+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/
+    int32_t Clip_max_val_0;
+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/
+    int32_t Clip_min_val_1;
+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/
+    int32_t Clip_max_val_1;
+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/
+    int32_t Clip_min_val_2;
+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/
+    int32_t Clip_max_val_2;
+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/
+    int32_t Clip_min_val_3;
+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/
+    int32_t Clip_max_val_3;
+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/
+    int32_t Clip_min_val_4;
+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/
+    int32_t Clip_max_val_4;
+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/
+    int32_t Clip_min_val_5;
+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/
+    int32_t Clip_max_val_5;
+    /*!< range_reduction_en range_reduction_en*/
+    int32_t range_reduction_en;
+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/
+    int32_t output_resolution;
+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/
+    int32_t MSB_alignment_en;
+
+} ia_pal_isp_espa_psa_g_t;
+
+/*! \isp struct espa_psa_h
+
+*/
+typedef struct
+{
+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_0;
+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_1;
+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_2;
+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_3;
+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_4;
+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/
+    int32_t Shift_l_comp_5;
+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/
+    int32_t Shift_val_comp_0;
+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/
+    int32_t Shift_val_comp_1;
+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/
+    int32_t Shift_val_comp_2;
+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/
+    int32_t Shift_val_comp_3;
+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/
+    int32_t Shift_val_comp_4;
+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/
+    int32_t Shift_val_comp_5;
+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/
+    int32_t Clip_min_comp_0;
+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/
+    int32_t Clip_min_comp_1;
+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/
+    int32_t Clip_min_comp_2;
+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/
+    int32_t Clip_min_comp_3;
+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/
+    int32_t Clip_min_comp_4;
+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/
+    int32_t Clip_min_comp_5;
+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/
+    int32_t Clip_max_comp_0;
+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/
+    int32_t Clip_max_comp_1;
+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/
+    int32_t Clip_max_comp_2;
+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/
+    int32_t Clip_max_comp_3;
+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/
+    int32_t Clip_max_comp_4;
+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/
+    int32_t Clip_max_comp_5;
+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/
+    int32_t Offset_comp_0;
+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/
+    int32_t Offset_comp_1;
+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/
+    int32_t Offset_comp_2;
+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/
+    int32_t Offset_comp_3;
+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/
+    int32_t Offset_comp_4;
+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/
+    int32_t Offset_comp_5;
+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/
+    int32_t Clip_min_val_0;
+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/
+    int32_t Clip_max_val_0;
+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/
+    int32_t Clip_min_val_1;
+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/
+    int32_t Clip_max_val_1;
+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/
+    int32_t Clip_min_val_2;
+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/
+    int32_t Clip_max_val_2;
+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/
+    int32_t Clip_min_val_3;
+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/
+    int32_t Clip_max_val_3;
+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/
+    int32_t Clip_min_val_4;
+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/
+    int32_t Clip_max_val_4;
+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/
+    int32_t Clip_min_val_5;
+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/
+    int32_t Clip_max_val_5;
+    /*!< range_reduction_en range_reduction_en*/
+    int32_t range_reduction_en;
+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/
+    int32_t output_resolution;
+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/
+    int32_t MSB_alignment_en;
+
+} ia_pal_isp_espa_psa_h_t;
+
+/*! \isp struct exy
+
+*/
+typedef struct
+{
+    /*!< bypass Bypass filter*/
+    int32_t bypass;
+    /*!< Coef[2] filter coefficients*/
+    int32_t Coef[2];
+    /*!< NS_shift shifting noise stream to the relevant range*/
+    int32_t NS_shift;
+
+} ia_pal_isp_exy_t;
+
+/*! \isp struct fr_grid_1_0
+FR Statistics
+*/
+typedef struct
+{
+    /*!< grid_width represents number of horizontal grid cells*/
+    int32_t grid_width;
+    /*!< grid_height represents number of vertical grid cells*/
+    int32_t grid_height;
+    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128,256)*/
+    int32_t block_width;
+    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128,256)*/
+    int32_t block_height;
+    /*!< y_fr_en 0: FF will not write to the Y  array; 1: FF will write  to the Y  array*/
+    int32_t y_fr_en;
+    /*!< x_start X top left corner of the grid*/
+    int32_t x_start;
+    /*!< y_start Y top left corner of the grid*/
+    int32_t y_start;
+    /*!< x_end X bottom right corner of the grid*/
+    int32_t x_end;
+    /*!< y_end Y bottom right corner of the grid*/
+    int32_t y_end;
+    /*!< shftr_val_x[4] Log2(num pixels of estimated colour component in a block). The binding as follows: m_ShftR_val_Y00 = shftr_val_x[0]; m_ShftR_val_Y01 = shftr_val_x[1];m_ShftR_val_Y10 = shftr_val_x[2];m_ShftR_val_Y11 = shftr_val_x[3];*/
+    int32_t shftr_val_x[4];
+    /*!< gx_0[4] gx0 Y_calc contribution ratio for Pat_ij*/
+    int32_t gx_0[4];
+    /*!< gx_1[4] gx1 Y_calc contribution ratio for Pat_ij*/
+    int32_t gx_1[4];
+    /*!< gx_2[4] gx2 Y_calc contribution ratio for Pat_ij*/
+    int32_t gx_2[4];
+    /*!< gx_3[4] gx3 Y_calc contribution ratio for Pat_ij*/
+    int32_t gx_3[4];
+    /*!< mask_y0 selecting the relevant pixels for Y0; bit k = row * 4 + column*/
+    int32_t mask_y0;
+    /*!< mask_y1 selecting the relevant pixels for Y1; bit k = row * 4 + column*/
+    int32_t mask_y1;
+    /*!< oe_y0 output enable for Y0; bit k corresponds to row * 2 + column*/
+    int32_t oe_y0;
+    /*!< oe_y1 output enable for Y1; bit k corresponds to row * 2 + column*/
+    int32_t oe_y1;
+    /*!< on_x_y0[4] Y0 estimation normalization (00, 01, 10, 11)*/
+    int32_t on_x_y0[4];
+    /*!< on_x_y1[4] Y1 estimation normalization (00, 01, 10, 11)*/
+    int32_t on_x_y1[4];
+    /*!< y00_filter_coeff[6] filter coefficients for Y00 (A1, A2, A3, A4, A5, A6)*/
+    int32_t y00_filter_coeff[6];
+    /*!< y00_filter_sign_vec sign vector for Y00*/
+    int32_t y00_filter_sign_vec;
+    /*!< y01_filter_coeff[6] filter coefficients for Y01 (A1, A2, A3, A4, A5, A6)*/
+    int32_t y01_filter_coeff[6];
+    /*!< y01_filter_sign_vec sign vector for Y01*/
+    int32_t y01_filter_sign_vec;
+    /*!< y10_filter_coeff[6] filter coefficients for Y10 (A1, A2, A3, A4, A5, A6)*/
+    int32_t y10_filter_coeff[6];
+    /*!< y10_filter_sign_vec sign vector for Y10*/
+    int32_t y10_filter_sign_vec;
+    /*!< y11_filter_coeff[6] filter coefficients for Y11 (A1, A2, A3, A4, A5, A6)*/
+    int32_t y11_filter_coeff[6];
+    /*!< y11_filter_sign_vec sign vector for Y11*/
+    int32_t y11_filter_sign_vec;
+    /*!< nf_x[4] Filter response normalization factors for Y00, Y01, Y10, Y11*/
+    int32_t nf_x[4];
+    /*!< sensor_mode Sensor mode 0: 1x1,  1: 2x2, 2: 4x4*/
+    int32_t sensor_mode;
+    /*!< downscaling_factor Downscaling factor 0: 1x, 1: 2x, 2: 4x*/
+    int32_t downscaling_factor;
+    /*!< y00_blending_weight Median filter weight for Y00*/
+    int32_t y00_blending_weight;
+    /*!< y01_blending_weight Median filter weight for Y01*/
+    int32_t y01_blending_weight;
+    /*!< y10_blending_weight Median filter weight for Y10*/
+    int32_t y10_blending_weight;
+    /*!< y11_blending_weight Median filter weight for Y11*/
+    int32_t y11_blending_weight;
+
+} ia_pal_isp_fr_grid_1_0_t;
+
+/*! \isp struct gammastar_1
+Initial Gamma* filter
+*/
+typedef struct
+{
+    /*!< gamma_star_en Bypass filter*/
+    int32_t gamma_star_en;
+    /*!< crop_enable Enable Crop by EDE block*/
+    int32_t crop_enable;
+    /*!< crop_parameters[4] Crop parameters*/
+    int32_t crop_parameters[4];
+    /*!< saturation_enable Saturation sub-block bypass*/
+    int32_t saturation_enable;
+    /*!< frame_width frame width*/
+    int32_t frame_width;
+    /*!< rgb2y_coef[5] RGB to luma conversion coefficients*/
+    int32_t rgb2y_coef[5];
+    /*!< extrap_blend_alpha blending coefficient used in extrapolation*/
+    int32_t extrap_blend_alpha;
+    /*!< tm_num_rows number of rows in TM grid*/
+    int32_t tm_num_rows;
+    /*!< tm_num_cols number of columns in TM grid*/
+    int32_t tm_num_cols;
+    /*!< spatial_weight[64] List of spatial weights*/
+    int32_t spatial_weight[64];
+    /*!< tm_blk_sz_shift Log2 of Number of pixels in row/column of TM block*/
+    int32_t tm_blk_sz_shift;
+    /*!< init_row First image pixel offset relative to the TM grid and the initial pixel*/
+    int32_t init_row;
+    /*!< init_col First image pixel offset relative to the TM grid and the initial pixel*/
+    int32_t init_col;
+    /*!< spatial_index_shift Shift value between index in Blk and index in spatial weights vector*/
+    int32_t spatial_index_shift;
+    /*!< output_shift Final shift, at end of block, converting working precision to required output precision*/
+    int32_t output_shift;
+    /*!< cu_similarity_weight_mapping_x[11] config unit mapping luma diff to similarity weights , X values*/
+    int32_t cu_similarity_weight_mapping_x[11];
+    /*!< cu_similarity_weight_mapping_b[10] config unit mapping luma diff to similarity weights,  Y values*/
+    int32_t cu_similarity_weight_mapping_b[10];
+    /*!< cu_similarity_weight_mapping_a[10] config unit mapping luma diff to similarity weights, Slope values*/
+    int32_t cu_similarity_weight_mapping_a[10];
+    /*!< cu_chroma_control_x[10] config unit for chroma control, X values*/
+    int32_t cu_chroma_control_x[10];
+    /*!< cu_chroma_control_b[9] config unit for chroma control, Y values*/
+    int32_t cu_chroma_control_b[9];
+    /*!< cu_chroma_control_a[9] config unit for chroma control, Slope values*/
+    int32_t cu_chroma_control_a[9];
+    /*!< tm_grid_xay[1595000] LUT that holds gammastar grid points x, slope and y values*/
+    uint16_t tm_grid_xay[1595000];
+
+} ia_pal_isp_gammastar_1_t;
+
+/*! \isp struct gammatm_v3
+
+*/
+typedef struct
+{
+    /*!< enable enable for the filter*/
+    int32_t enable;
+    /*!< gammaBeforeTM order of operations whether Gamma correction should precede TM or vise versa*/
+    int32_t gammaBeforeTM;
+    /*!< a1 shift amount at stage 1*/
+    int32_t a1;
+    /*!< a2 shift amount at stage 2*/
+    int32_t a2;
+    /*!< a3 shift amount at stage 3*/
+    int32_t a3;
+    /*!< gamma_lut_enable enable for gamma lut*/
+    int32_t gamma_lut_enable;
+    /*!< gamma_lut_base_level[8] base level for gamma lut*/
+    int32_t gamma_lut_base_level[8];
+    /*!< gamma_lut_step[8] step for gamma lut*/
+    int32_t gamma_lut_step[8];
+    /*!< gamma_lut_start_bin[8] start bin for gamma lut*/
+    int32_t gamma_lut_start_bin[8];
+    /*!< gamma_lut_size gamma lut size*/
+    int32_t gamma_lut_size;
+    /*!< gamma_lut_gen_lut[1537] generalized lut for gamma lut*/
+    int32_t gamma_lut_gen_lut[1537];
+    /*!< tm_lut_enable enable for tone mapping lut*/
+    int32_t tm_lut_enable;
+    /*!< tm_lut_base_level[3] base level for  tone mapping lut*/
+    int32_t tm_lut_base_level[3];
+    /*!< tm_lut_step[3] step for  tone mapping lut*/
+    int32_t tm_lut_step[3];
+    /*!< tm_lut_start_bin[3] start bin for  tone mapping lut*/
+    int32_t tm_lut_start_bin[3];
+    /*!< tm_lut_size tone mapping lut size*/
+    int32_t tm_lut_size;
+    /*!< tm_lut_gen_lut[2049] generalized lut for tone mapping lut*/
+    int32_t tm_lut_gen_lut[2049];
+    /*!< prog_shift programable shift for the gamma output*/
+    int32_t prog_shift;
+
+} ia_pal_isp_gammatm_v3_t;
+
+/*! \isp struct gd_dpc_2_1
+
+*/
+typedef struct
+{
+    /*!< green_pos gb position*/
+    int32_t green_pos;
+    /*!< lc_cu_x[4] local contrast config unit x*/
+    int32_t lc_cu_x[4];
+    /*!< lc_cu_y[3] local contrast config unit y*/
+    int32_t lc_cu_y[3];
+    /*!< lc_cu_slope[3] local contrast config unit slope*/
+    int32_t lc_cu_slope[3];
+    /*!< delta_cu_x[4] delta config unit x*/
+    int32_t delta_cu_x[4];
+    /*!< delta_cu_y[3] delta config unit y*/
+    int32_t delta_cu_y[3];
+    /*!< delta_cu_slope[3] delta config unit slope*/
+    int32_t delta_cu_slope[3];
+    /*!< inv_lc_cu_x[8] inverse local contarst config unit x*/
+    int32_t inv_lc_cu_x[8];
+    /*!< inv_lc_cu_y[7] inverse local contarst config unit y*/
+    int32_t inv_lc_cu_y[7];
+    /*!< inv_lc_cu_slope[7] inverse local contarst config unit slope*/
+    int32_t inv_lc_cu_slope[7];
+    /*!< inv_delta_cu_x[8] inverse delta config unit x*/
+    int32_t inv_delta_cu_x[8];
+    /*!< inv_delta_cu_y[7] inverse delta config unit y*/
+    int32_t inv_delta_cu_y[7];
+    /*!< inv_delta_cu_slope[7] inverse delta config unit slope*/
+    int32_t inv_delta_cu_slope[7];
+    /*!< detail_pres detail preservation factor*/
+    int32_t detail_pres;
+    /*!< invscale scale factor after normalizing by inverse*/
+    int32_t invscale;
+    /*!< afxoffset[32] 8 Autofocus pixels X axis offset U14.0, should be smaller than afxperiod*/
+    int32_t afxoffset[32];
+    /*!< afxperiod[32] 8 Autofocus pixels X axis period*/
+    int32_t afxperiod[32];
+    /*!< afyoffset[32] 8 Autofocus pixels Y axis offset U14.0, should be smaller than afyperiod*/
+    int32_t afyoffset[32];
+    /*!< afyperiod[32] 8 Autofocus pixels Y axis period*/
+    int32_t afyperiod[32];
+    /*!< hdrfactors[16] 4x4 HDR exposure factor U6.8*/
+    int32_t hdrfactors[16];
+    /*!< hdrfactorsinverse[16] 4x4 HDR exposure inverse factor U6.8 - should be inverse of hdrfactors*/
+    int32_t hdrfactorsinverse[16];
+    /*!< configunitcolddistvsmedian_slope[7] cold dist vs median config unit classifier*/
+    int32_t configunitcolddistvsmedian_slope[7];
+    /*!< configunitcolddistvsmedian_x[8] cold dist vs median config unit classifier*/
+    int32_t configunitcolddistvsmedian_x[8];
+    /*!< configunitcolddistvsmedian_y[7] cold dist vs median config unit classifier*/
+    int32_t configunitcolddistvsmedian_y[7];
+    /*!< configunitcolddistvsneighb_slope[7] cold dist vs neigb config unit classifier*/
+    int32_t configunitcolddistvsneighb_slope[7];
+    /*!< configunitcolddistvsneighb_x[8] cold dist vs neigb config unit classifier*/
+    int32_t configunitcolddistvsneighb_x[8];
+    /*!< configunitcolddistvsneighb_y[7] cold dist vs neigb config unit classifier*/
+    int32_t configunitcolddistvsneighb_y[7];
+    /*!< configunitfix_slope[3] fix config unit*/
+    int32_t configunitfix_slope[3];
+    /*!< configunitfix_x[4] fix config unit*/
+    int32_t configunitfix_x[4];
+    /*!< configunitfix_y[3] fix config unit*/
+    int32_t configunitfix_y[3];
+    /*!< configunithotdistvsmedian_slope[7] hot dist vs median classifier*/
+    int32_t configunithotdistvsmedian_slope[7];
+    /*!< configunithotdistvsmedian_x[8] hot dist vs median classifier*/
+    int32_t configunithotdistvsmedian_x[8];
+    /*!< configunithotdistvsmedian_y[7] hot dist vs median classifier*/
+    int32_t configunithotdistvsmedian_y[7];
+    /*!< configunithotdistvsneighb_slope[7] hot dist vs neigb config unit classifier*/
+    int32_t configunithotdistvsneighb_slope[7];
+    /*!< configunithotdistvsneighb_x[8] hot dist vs neigb config unit classifier*/
+    int32_t configunithotdistvsneighb_x[8];
+    /*!< configunithotdistvsneighb_y[7] hot dist vs neigb config unit classifier*/
+    int32_t configunithotdistvsneighb_y[7];
+    /*!< pelesttype[16] 0-P1, 1-P2, 2-P3, 3-P4, 4-P5, 5-P6*/
+    int32_t pelesttype[16];
+    /*!< dtype[16] 0-D1 1-D2  2-D3*/
+    int32_t dtype[16];
+    /*!< pmasks[384] configurations related to the bayer pattern*/
+    int32_t pmasks[384];
+    /*!< dmasks[48] configurations related to the bayer pattern*/
+    int32_t dmasks[48];
+    /*!< bitreduceshift Shift value for bit reduce block*/
+    int32_t bitreduceshift;
+    /*!< afenable enable for the AF unit block*/
+    int32_t afenable;
+    /*!< dynamicenable enable for the dynamic detection block*/
+    int32_t dynamicenable;
+    /*!< frame_width frame width*/
+    int32_t frame_width;
+    /*!< paf_grid_en[32] paf grid enables*/
+    int32_t paf_grid_en[32];
+    /*!< paf_pattern_rearrangement_en Enable pattern rearrangement unit after AF Pels detection*/
+    int32_t paf_pattern_rearrangement_en;
+    /*!< afsXStart AF pixel detection crop - start X position*/
+    int32_t afsXStart;
+    /*!< afsYStart AF pixel detection crop - start Y position*/
+    int32_t afsYStart;
+    /*!< afsXEnd AF pixel detection crop - end X position*/
+    int32_t afsXEnd;
+    /*!< afsYEnd AF pixel detection crop - end Y position*/
+    int32_t afsYEnd;
+    /*!< afsXStartCropEn AF pixel crop enable - start X position*/
+    int32_t afsXStartCropEn;
+    /*!< afsYStartCropEn AF pixel crop enable - start Y position*/
+    int32_t afsYStartCropEn;
+    /*!< afsXEndCropEn AF pixel crop enable - end X position*/
+    int32_t afsXEndCropEn;
+    /*!< afsYEndCropEn AF pixel crop enable - end Y position*/
+    int32_t afsYEndCropEn;
+    /*!< use_nlm[16] use non local means mechanism*/
+    int32_t use_nlm[16];
+    /*!< sad1_thr threshold on the first sad*/
+    int32_t sad1_thr;
+    /*!< sad2_thr threshold on the second sad*/
+    int32_t sad2_thr;
+    /*!< pixel_diff_thr threshold on the pixel difference*/
+    int32_t pixel_diff_thr;
+    /*!< min_direction_sad_thr threshold on the min direction*/
+    int32_t min_direction_sad_thr;
+    /*!< max_direction_sad_thr threshold on the max direction*/
+    int32_t max_direction_sad_thr;
+    /*!< saturation_thr protect pixels in saturated areas*/
+    int32_t saturation_thr;
+    /*!< ignore_ver_direction[16] ignore vertical direction for certain types of pdaf sensors*/
+    int32_t ignore_ver_direction[16];
+    /*!< configunit_med_protection_slope[3] nlm fix config unit*/
+    int32_t configunit_med_protection_slope[3];
+    /*!< configunit_med_protection_x[4] nlm fix config unit*/
+    int32_t configunit_med_protection_x[4];
+    /*!< configunit_med_protection_y[3] nlm fix config unit*/
+    int32_t configunit_med_protection_y[3];
+    /*!< clamping_disable disable clamping to support previous version of dpc*/
+    int32_t clamping_disable;
+    /*!< sensor_type 0=simple_bayer 1=2pd 2=sve_2pd 3=sve_zigzag1 4=sve_zigzag2*/
+    int32_t sensor_type;
+    /*!< fix_dist when 0 - opposite sign distances around the pixel are ignored*/
+    int32_t fix_dist;
+    /*!< flip_neigb_axis flip neigb vs dist axis*/
+    int32_t flip_neigb_axis;
+    /*!< g_locations_for_sve[16] g on 4x4 grid*/
+    int32_t g_locations_for_sve[16];
+    /*!< config_median_blend_slope[3] blend coef cfg*/
+    int32_t config_median_blend_slope[3];
+    /*!< config_median_blend_x[4] blend coef cfg*/
+    int32_t config_median_blend_x[4];
+    /*!< config_median_blend_y[3] blend coef cfg*/
+    int32_t config_median_blend_y[3];
+    /*!< config_ridges_slope[3] ridge coef cfg*/
+    int32_t config_ridges_slope[3];
+    /*!< config_ridges_x[4] ridge coef cfg*/
+    int32_t config_ridges_x[4];
+    /*!< config_ridges_y[3] ridge coef cfg*/
+    int32_t config_ridges_y[3];
+    /*!< global_enable global enable*/
+    int32_t global_enable;
+    /*!< gdc_enable gdc enable*/
+    int32_t gdc_enable;
+    /*!< dpc_enable dpc enable*/
+    int32_t dpc_enable;
+
+} ia_pal_isp_gd_dpc_2_1_t;
+
+/*! \isp struct gdc3
+HW filter reference with FW ISP API
+*/
+typedef struct
+{
+    /*!< filter_size filter size. {4-BCI, 6-Lancos}*/
+    int32_t filter_size;
+    /*!< nums_luts number of LUTs partioning. {1-4}*/
+    int32_t nums_luts;
+    /*!< lut_sel LUT part selection. {0:nums_lut}*/
+    int32_t lut_sel;
+    /*!< lut[1536] LUT s5.10*/
+    int32_t lut[1536];
+    /*!< interpolation_type interpolation type*/
+    int32_t interpolation_type;
+    /*!< nums_hgrid_luma size of horizontal grig for luma. {}*/
+    int32_t nums_hgrid_luma;
+    /*!< nums_vgrid_luma size of vertical grig for luma. {}*/
+    int32_t nums_vgrid_luma;
+    /*!< nums_hgrid_chroma size of horizontal grig for chroma. {}*/
+    int32_t nums_hgrid_chroma;
+    /*!< nums_vgrid_chroma size of vertical grig for chroma {}*/
+    int32_t nums_vgrid_chroma;
+    /*!< luma_block_width_power luma_block_width_power*/
+    int32_t luma_block_width_power;
+    /*!< luma_block_height_power luma_block_height_power*/
+    int32_t luma_block_height_power;
+    /*!< chroma_block_width_power chroma_block_width_power*/
+    int32_t chroma_block_width_power;
+    /*!< chroma_block_height_power chroma_block_height_power*/
+    int32_t chroma_block_height_power;
+    /*!< luma_origin_x[10584] luma_origin_x*/
+    int32_t luma_origin_x[10584];
+    /*!< luma_origin_y[10584] luma_origin_y*/
+    int32_t luma_origin_y[10584];
+    /*!< luma_in_block_width[10584] luma_in_block_width*/
+    int32_t luma_in_block_width[10584];
+    /*!< luma_in_block_height[10584] luma_in_block_heght*/
+    int32_t luma_in_block_height[10584];
+    /*!< luma_p0_x[10584] luma_p0_x*/
+    int32_t luma_p0_x[10584];
+    /*!< luma_p0_y[10584] luma_p0_y*/
+    int32_t luma_p0_y[10584];
+    /*!< luma_p1_x[10584] luma_p1_x*/
+    int32_t luma_p1_x[10584];
+    /*!< luma_p1_y[10584] luma_p1_y*/
+    int32_t luma_p1_y[10584];
+    /*!< luma_p2_x[10584] luma_p2_x*/
+    int32_t luma_p2_x[10584];
+    /*!< luma_p2_y[10584] luma_p2_y*/
+    int32_t luma_p2_y[10584];
+    /*!< luma_p3_x[10584] luma_p3_x*/
+    int32_t luma_p3_x[10584];
+    /*!< luma_p3_y[10584] luma_p3_y*/
+    int32_t luma_p3_y[10584];
+    /*!< chroma_origin_x[10584] chroma_origin_x*/
+    int32_t chroma_origin_x[10584];
+    /*!< chroma_origin_y[10584] chroma_origin_y*/
+    int32_t chroma_origin_y[10584];
+    /*!< chroma_in_block_width[10584] chroma_in_block_width*/
+    int32_t chroma_in_block_width[10584];
+    /*!< chroma_in_block_height[10584] chroma_in_block_heght*/
+    int32_t chroma_in_block_height[10584];
+    /*!< chroma_p0_x[10584] chroma_p0_x*/
+    int32_t chroma_p0_x[10584];
+    /*!< chroma_p0_y[10584] chroma_p0_y*/
+    int32_t chroma_p0_y[10584];
+    /*!< chroma_p1_x[10584] chroma_p1_x*/
+    int32_t chroma_p1_x[10584];
+    /*!< chroma_p1_y[10584] chroma_p1_y*/
+    int32_t chroma_p1_y[10584];
+    /*!< chroma_p2_x[10584] chroma_p2_x*/
+    int32_t chroma_p2_x[10584];
+    /*!< chroma_p2_y[10584] chroma_p2_y*/
+    int32_t chroma_p2_y[10584];
+    /*!< chroma_p3_x[10584] chroma_p3_x*/
+    int32_t chroma_p3_x[10584];
+    /*!< chroma_p3_y[10584] chroma_p3_y*/
+    int32_t chroma_p3_y[10584];
+
+} ia_pal_isp_gdc3_t;
+
+/*! \isp struct gdc3_1
+HW filter reference with FW ISP API
+*/
+typedef struct
+{
+    /*!< filter_size */
+    int32_t filter_size;
+    /*!< nums_luts */
+    int32_t nums_luts;
+    /*!< lut_sel */
+    int32_t lut_sel;
+    /*!< lut[1536] */
+    int32_t lut[1536];
+    /*!< interpolation_type */
+    int32_t interpolation_type;
+    /*!< nums_hgrid_luma */
+    int32_t nums_hgrid_luma;
+    /*!< nums_vgrid_luma */
+    int32_t nums_vgrid_luma;
+    /*!< nums_hgrid_chroma */
+    int32_t nums_hgrid_chroma;
+    /*!< nums_vgrid_chroma */
+    int32_t nums_vgrid_chroma;
+    /*!< luma_block_width_power */
+    int32_t luma_block_width_power;
+    /*!< luma_block_height_power */
+    int32_t luma_block_height_power;
+    /*!< chroma_block_width_power */
+    int32_t chroma_block_width_power;
+    /*!< chroma_block_height_power */
+    int32_t chroma_block_height_power;
+    /*!< luma_origin_x[5292] */
+    int32_t luma_origin_x[5292];
+    /*!< luma_origin_y[5292] */
+    int32_t luma_origin_y[5292];
+    /*!< luma_in_block_width[5292] */
+    int32_t luma_in_block_width[5292];
+    /*!< luma_in_block_height[5292] */
+    int32_t luma_in_block_height[5292];
+    /*!< luma_p0_x[5292] */
+    int32_t luma_p0_x[5292];
+    /*!< luma_p0_y[5292] */
+    int32_t luma_p0_y[5292];
+    /*!< luma_p1_x[5292] */
+    int32_t luma_p1_x[5292];
+    /*!< luma_p1_y[5292] */
+    int32_t luma_p1_y[5292];
+    /*!< luma_p2_x[5292] */
+    int32_t luma_p2_x[5292];
+    /*!< luma_p2_y[5292] */
+    int32_t luma_p2_y[5292];
+    /*!< luma_p3_x[5292] */
+    int32_t luma_p3_x[5292];
+    /*!< luma_p3_y[5292] */
+    int32_t luma_p3_y[5292];
+    /*!< chroma_origin_x[5292] */
+    int32_t chroma_origin_x[5292];
+    /*!< chroma_origin_y[5292] */
+    int32_t chroma_origin_y[5292];
+    /*!< chroma_in_block_width[5292] */
+    int32_t chroma_in_block_width[5292];
+    /*!< chroma_in_block_height[5292] */
+    int32_t chroma_in_block_height[5292];
+    /*!< chroma_p0_x[5292] */
+    int32_t chroma_p0_x[5292];
+    /*!< chroma_p0_y[5292] */
+    int32_t chroma_p0_y[5292];
+    /*!< chroma_p1_x[5292] */
+    int32_t chroma_p1_x[5292];
+    /*!< chroma_p1_y[5292] */
+    int32_t chroma_p1_y[5292];
+    /*!< chroma_p2_x[5292] */
+    int32_t chroma_p2_x[5292];
+    /*!< chroma_p2_y[5292] */
+    int32_t chroma_p2_y[5292];
+    /*!< chroma_p3_x[5292] */
+    int32_t chroma_p3_x[5292];
+    /*!< chroma_p3_y[5292] */
+    int32_t chroma_p3_y[5292];
+
+} ia_pal_isp_gdc3_1_t;
+
+/*! \isp struct gdc3_1_1
+HW filter reference with FW ISP API
+*/
+typedef struct
+{
+    /*!< filter_size filter size. {4-BCI, 6-Lancos}*/
+    int32_t filter_size;
+    /*!< nums_luts number of LUTs partioning. {1-4}*/
+    int32_t nums_luts;
+    /*!< lut_sel LUT part selection. {0:nums_lut}*/
+    int32_t lut_sel;
+    /*!< lut[1536] LUT s5.10*/
+    int32_t lut[1536];
+    /*!< interpolation_type interpolation type*/
+    int32_t interpolation_type;
+    /*!< nums_hgrid_luma size of horizontal grig for luma. {}*/
+    int32_t nums_hgrid_luma;
+    /*!< nums_vgrid_luma size of vertical grig for luma. {}*/
+    int32_t nums_vgrid_luma;
+    /*!< nums_hgrid_chroma size of horizontal grig for chroma. {}*/
+    int32_t nums_hgrid_chroma;
+    /*!< nums_vgrid_chroma size of vertical grig for chroma {}*/
+    int32_t nums_vgrid_chroma;
+    /*!< luma_block_width_power luma_block_width_power*/
+    int32_t luma_block_width_power;
+    /*!< luma_block_height_power luma_block_height_power*/
+    int32_t luma_block_height_power;
+    /*!< chroma_block_width_power chroma_block_width_power*/
+    int32_t chroma_block_width_power;
+    /*!< chroma_block_height_power chroma_block_height_power*/
+    int32_t chroma_block_height_power;
+    /*!< gdc_warp_grid_luma[84672] gdc_warp_grid_luma*/
+    int32_t gdc_warp_grid_luma[84672];
+    /*!< gdc_warp_grid_chroma[84672] gdc_warp_grid_chroma*/
+    int32_t gdc_warp_grid_chroma[84672];
+
+} ia_pal_isp_gdc3_1_1_t;
+
+/*! \isp struct gdc4_2
+HW filter reference with FW ISP API
+*/
+typedef struct
+{
+    /*!< in_bpp image input bpp*/
+    int32_t in_bpp;
+    /*!< interpolation_type */
+    int32_t interpolation_type;
+    /*!< filter_size */
+    int32_t filter_size;
+    /*!< lut_sel */
+    int32_t lut_sel;
+    /*!< out_bpp image output bpp*/
+    int32_t out_bpp;
+    /*!< gro Group reorder, convert 2D to 1D access, 0: bypass, 1: reorder (needed for 2y mode)*/
+    int32_t gro;
+    /*!< perf_mode Perf mode, 0: 1x1y, 1: 2x1y, 2: 1x2y, 3: 2x2y*/
+    int32_t perf_mode;
+    /*!< ch1_in_bpp image input bpp*/
+    int32_t ch1_in_bpp;
+    /*!< ch1_interpolation_type */
+    int32_t ch1_interpolation_type;
+    /*!< ch1_filter_size */
+    int32_t ch1_filter_size;
+    /*!< ch1_lut_sel */
+    int32_t ch1_lut_sel;
+    /*!< ch1_out_bpp image output bpp*/
+    int32_t ch1_out_bpp;
+    /*!< ch1_gro Group reorder, convert 2D to 1D access, 0: bypass, 1: reorder (needed for 2y mode)*/
+    int32_t ch1_gro;
+    /*!< ch1_perf_mode Perf mode, 0: 1x1y, 1: 2x1y, 2: 1x2y, 3: 2x2y*/
+    int32_t ch1_perf_mode;
+    /*!< ch2_in_bpp image input bpp*/
+    int32_t ch2_in_bpp;
+    /*!< ch2_interpolation_type */
+    int32_t ch2_interpolation_type;
+    /*!< ch2_filter_size */
+    int32_t ch2_filter_size;
+    /*!< ch2_lut_sel */
+    int32_t ch2_lut_sel;
+    /*!< ch2_out_bpp image output bpp*/
+    int32_t ch2_out_bpp;
+    /*!< ch2_gro Group reorder, convert 2D to 1D access, 0: bypass, 1: reorder (needed for 2y mode)*/
+    int32_t ch2_gro;
+    /*!< ch2_perf_mode Perf mode, 0: 1x1y, 1: 2x1y, 2: 1x2y, 3: 2x2y*/
+    int32_t ch2_perf_mode;
+    /*!< nums_luts */
+    int32_t nums_luts;
+    /*!< lut[1536] */
+    int32_t lut[1536];
+    /*!< nums_hgrid_luma */
+    int32_t nums_hgrid_luma;
+    /*!< nums_vgrid_luma */
+    int32_t nums_vgrid_luma;
+    /*!< nums_hgrid_chroma */
+    int32_t nums_hgrid_chroma;
+    /*!< nums_vgrid_chroma */
+    int32_t nums_vgrid_chroma;
+    /*!< luma_block_width_power */
+    int32_t luma_block_width_power;
+    /*!< luma_block_height_power */
+    int32_t luma_block_height_power;
+    /*!< chroma_block_width_power */
+    int32_t chroma_block_width_power;
+    /*!< chroma_block_height_power */
+    int32_t chroma_block_height_power;
+    /*!< luma_tetragons[84672] */
+    int32_t luma_tetragons[84672];
+    /*!< chroma_tetragons[84672] */
+    int32_t chroma_tetragons[84672];
+
+} ia_pal_isp_gdc4_2_t;
+
+/*! \isp struct gdc5
+HW filter reference with FW ISP API
+*/
+typedef struct
+{
+    /*!< filter_size filter size. {4-BCI, 6-Lancos}*/
+    int32_t filter_size;
+    /*!< nums_luts number of LUTs partioning. {1-4}*/
+    int32_t nums_luts;
+    /*!< lut_sel LUT part selection. {0:nums_lut}*/
+    int32_t lut_sel;
+    /*!< lut[1536] LUT s1.10*/
+    int32_t lut[1536];
+    /*!< interpolation_type interpolation type*/
+    int32_t interpolation_type;
+    /*!< nums_hgrid_luma size of horizontal grig for luma. {}*/
+    int32_t nums_hgrid_luma;
+    /*!< nums_vgrid_luma size of vertical grig for luma. {}*/
+    int32_t nums_vgrid_luma;
+    /*!< nums_hgrid_chroma size of horizontal grig for chroma. {}*/
+    int32_t nums_hgrid_chroma;
+    /*!< nums_vgrid_chroma size of vertical grig for chroma {}*/
+    int32_t nums_vgrid_chroma;
+    /*!< luma_block_width_power luma_block_width_power*/
+    int32_t luma_block_width_power;
+    /*!< luma_block_height_power luma_block_height_power*/
+    int32_t luma_block_height_power;
+    /*!< chroma_block_width_power chroma_block_width_power*/
+    int32_t chroma_block_width_power;
+    /*!< chroma_block_height_power chroma_block_height_power*/
+    int32_t chroma_block_height_power;
+    /*!< luma_origin_x[10584] luma_origin_x*/
+    int32_t luma_origin_x[10584];
+    /*!< luma_origin_y[10584] luma_origin_y*/
+    int32_t luma_origin_y[10584];
+    /*!< luma_in_block_width[10584] luma_in_block_width*/
+    int32_t luma_in_block_width[10584];
+    /*!< luma_in_block_height[10584] luma_in_block_heght*/
+    int32_t luma_in_block_height[10584];
+    /*!< luma_p0_x[10584] luma_p0_x*/
+    int32_t luma_p0_x[10584];
+    /*!< luma_p0_y[10584] luma_p0_y*/
+    int32_t luma_p0_y[10584];
+    /*!< luma_p1_x[10584] luma_p1_x*/
+    int32_t luma_p1_x[10584];
+    /*!< luma_p1_y[10584] luma_p1_y*/
+    int32_t luma_p1_y[10584];
+    /*!< luma_p2_x[10584] luma_p2_x*/
+    int32_t luma_p2_x[10584];
+    /*!< luma_p2_y[10584] luma_p2_y*/
+    int32_t luma_p2_y[10584];
+    /*!< luma_p3_x[10584] luma_p3_x*/
+    int32_t luma_p3_x[10584];
+    /*!< luma_p3_y[10584] luma_p3_y*/
+    int32_t luma_p3_y[10584];
+    /*!< chroma_origin_x[10584] chroma_origin_x*/
+    int32_t chroma_origin_x[10584];
+    /*!< chroma_origin_y[10584] chroma_origin_y*/
+    int32_t chroma_origin_y[10584];
+    /*!< chroma_in_block_width[10584] chroma_in_block_width*/
+    int32_t chroma_in_block_width[10584];
+    /*!< chroma_in_block_height[10584] chroma_in_block_heght*/
+    int32_t chroma_in_block_height[10584];
+    /*!< chroma_p0_x[10584] chroma_p0_x*/
+    int32_t chroma_p0_x[10584];
+    /*!< chroma_p0_y[10584] chroma_p0_y*/
+    int32_t chroma_p0_y[10584];
+    /*!< chroma_p1_x[10584] chroma_p1_x*/
+    int32_t chroma_p1_x[10584];
+    /*!< chroma_p1_y[10584] chroma_p1_y*/
+    int32_t chroma_p1_y[10584];
+    /*!< chroma_p2_x[10584] chroma_p2_x*/
+    int32_t chroma_p2_x[10584];
+    /*!< chroma_p2_y[10584] chroma_p2_y*/
+    int32_t chroma_p2_y[10584];
+    /*!< chroma_p3_x[10584] chroma_p3_x*/
+    int32_t chroma_p3_x[10584];
+    /*!< chroma_p3_y[10584] chroma_p3_y*/
+    int32_t chroma_p3_y[10584];
+    /*!< in_bpp image input bpp*/
+    int32_t in_bpp;
+    /*!< out_bpp image output bpp*/
+    int32_t out_bpp;
+    /*!< gdc_operating_mode 0: GDC calculates tetragons; 1: tetragons from API are used, 2: GDC5_1 WFOV*/
+    int32_t gdc_operating_mode;
+    /*!< gdc_mode 0: bypass, 1: High Distortion only, 2: Homography only, 6: Homography and high distortion, 9: High distortion and homography*/
+    int32_t gdc_mode;
+    /*!< crop_top Top border for cropping*/
+    int32_t crop_top;
+    /*!< crop_left Left border for cropping*/
+    int32_t crop_left;
+    /*!< crop_bottom Bottom border for cropping*/
+    int32_t crop_bottom;
+    /*!< crop_right Right border for cropping*/
+    int32_t crop_right;
+    /*!< homography_transformation_luma_0[64] homography transformation matrices for luma channel,  1, 2, 4, 5. elements S2.20,*/
+    int32_t homography_transformation_luma_0[64];
+    /*!< homography_transformation_luma_1[32] homography transformation matrices for luma channel,  7. and 8. S0.31 but only 25 lower bits used*/
+    int32_t homography_transformation_luma_1[32];
+    /*!< homography_transformation_luma_2[48] homography transformation matrices for luma channel, 3, 6, 9. S15.16*/
+    int32_t homography_transformation_luma_2[48];
+    /*!< homography_matrices_offset[16] Offsets from the top for homography matrices*/
+    int32_t homography_matrices_offset[16];
+    /*!< homography_matrices_count number of homography matrices*/
+    int32_t homography_matrices_count;
+    /*!< ldc_r_lut[256] LDC (R) LUT table, format Q14.16*/
+    int32_t ldc_r_lut[256];
+    /*!< ldc_max_distance_from_center Maximum distance from the radial center from the full sensor resolution. Q16.8*/
+    int32_t ldc_max_distance_from_center;
+    /*!< ldc_r_x_center x coordinate of LDC (R) correction center of symmerty*/
+    int32_t ldc_r_x_center;
+    /*!< ldc_r_y_center y coordinate of LDC (R) correction center of symmerty*/
+    int32_t ldc_r_y_center;
+    /*!< ldc_r_y_scale_factor y coordinate scaling factor for elliptical distortion of LDC (R) correction, format Q4.16*/
+    int32_t ldc_r_y_scale_factor;
+    /*!< gdc_modep 0:PreAffine/Projections/LDC/PostAffine, 1:PreAffine/Projections/Rotation/LDC/PostAffine, 2:PreAffine/Projections/Rotation/PostAffine, 3:Homography/PreAffine/Projections/Rotation/LDC/PostAffine, 4:PreAffine/Homography/Projections/Rotation/LDC/PostAffine*/
+    int32_t gdc_modep;
+    /*!< rotationmatrix[9] Rotational Matrix for applying rotation (S1.20)*/
+    int32_t rotationmatrix[9];
+    /*!< projectionsf_1[2] Scaling factor for Projections. (Elements 1 and 2 of scaling factor: S4.20)*/
+    int32_t projectionsf_1[2];
+    /*!< projectionsf_2[2] Scaling factor for Projections. (Elements 3 and 4 of scaling factor: S14.8)*/
+    int32_t projectionsf_2[2];
+    /*!< projection_type 0: Rectilinear, 1: Conic, 2: Equirectangular*/
+    int32_t projection_type;
+    /*!< projections_inv_f_pi Inv_f_pi = (1/f*pi) where f corresponds to View_Width/HFOV (Q0.31)*/
+    int32_t projections_inv_f_pi;
+    /*!< ldc_mode 0:Rd/Ru mode, 1: SqLUT mode, 2: Rd/Ru mode with normalization*/
+    int32_t ldc_mode;
+    /*!< ldc_max_a Maximum distance from the radial center from the full sensor resolution. Q3.16*/
+    int32_t ldc_max_a;
+    /*!< ldc_inv_max_a Inv of ldc_max_a, Q0.26*/
+    int32_t ldc_inv_max_a;
+    /*!< ldc_lut_shift_bits LDC LUT Shift bits*/
+    int32_t ldc_lut_shift_bits;
+    /*!< preaffine_matrix_scale[4] PreAffine Matrix for scale S4.15*/
+    int32_t preaffine_matrix_scale[4];
+    /*!< preaffine_matrix_translation[2] PreAffine Matrix for translation integer value S18.8*/
+    int32_t preaffine_matrix_translation[2];
+    /*!< postaffine_matrix_scale[4] PostAffine Matrix for scale S4.15*/
+    int32_t postaffine_matrix_scale[4];
+    /*!< postaffine_matrix_translation[2] PostAffine Matrix for translation integer value S18.8*/
+    int32_t postaffine_matrix_translation[2];
+    /*!< invalid_coord_mask[4] Invalid Coordinate Mask to be set. Default value set is for 8 bits.*/
+    int32_t invalid_coord_mask[4];
+    /*!< normalization_sf Normalization scaling factor (Q20)*/
+    int32_t normalization_sf;
+    /*!< MSB_alignment_en 0: LSB Alignment 1:MSB Alignment*/
+    int32_t MSB_alignment_en;
+
+} ia_pal_isp_gdc5_t;
+
+/*! \isp struct gdc7
+
+*/
+typedef struct
+{
+    /*!< gdc_coord_enable coord calculation bypass*/
+    int32_t gdc_coord_enable;
+    /*!< gdc_operating_mode 0: GDC calculates tetragons; 1: tetragons from API are used, 2: GDC5_1 WFOV*/
+    int32_t gdc_operating_mode;
+    /*!< crop_top Top border for cropping*/
+    int32_t crop_top;
+    /*!< crop_left Left border for cropping*/
+    int32_t crop_left;
+    /*!< crop_bottom Bottom border for cropping*/
+    int32_t crop_bottom;
+    /*!< crop_right Right border for cropping*/
+    int32_t crop_right;
+    /*!< homography_transformation_luma_0[64] homography transformation matrices for luma channel,  1, 2, 4, 5. elements S4.18,*/
+    int32_t homography_transformation_luma_0[64];
+    /*!< homography_transformation_luma_1[32] homography transformation matrices for luma channel,  7. and 8. S0.31 but only 25 lower bits used*/
+    int32_t homography_transformation_luma_1[32];
+    /*!< homography_transformation_luma_2[48] homography transformation matrices for luma channel, 3, 6, 9. S18.13*/
+    int32_t homography_transformation_luma_2[48];
+    /*!< homography_matrices_offset[16] Offsets from the top for homography matrices*/
+    int32_t homography_matrices_offset[16];
+    /*!< homography_matrices_count number of homography matrices*/
+    int32_t homography_matrices_count;
+    /*!< ldc_r_lut[256] LDC (R) LUT table, format Q14.16*/
+    int32_t ldc_r_lut[256];
+    /*!< ldc_max_distance_from_center Maximum distance from the radial center from the full sensor resolution. Q16.8*/
+    int32_t ldc_max_distance_from_center;
+    /*!< ldc_r_x_center x coordinate of LDC (R) correction center of symmerty*/
+    int32_t ldc_r_x_center;
+    /*!< ldc_r_y_center y coordinate of LDC (R) correction center of symmerty*/
+    int32_t ldc_r_y_center;
+    /*!< ldc_r_y_scale_factor y coordinate scaling factor for elliptical distortion of LDC (R) correction, format Q4.16*/
+    int32_t ldc_r_y_scale_factor;
+    /*!< gdc_modep 0:Homography/Projections/LDC/PostAffine, 1:Homography/Projections/Rotation/LDC/PostAffine, 2:Homography/Projections/Rotation/PostAffine, 3:Grid/Rotation/LDC/PostAffine, 4:Grid/LDC/PostAffine, 5:Grid/PreAffine/Projections/Rotation/LDC/PostAffine, 6: Grid*/
+    int32_t gdc_modep;
+    /*!< rotationmatrix[9] Rotational Matrix for applying rotation (S1.20)*/
+    int32_t rotationmatrix[9];
+    /*!< projectionsf_1[2] Scaling factor for Projections. (Elements 1 and 2 of scaling factor: S4.20)*/
+    int32_t projectionsf_1[2];
+    /*!< projectionsf_2[2] Scaling factor for Projections. (Elements 3 and 4 of scaling factor: S14.8)*/
+    int32_t projectionsf_2[2];
+    /*!< projection_type 0: Rectilinear, 1: Conic, 2: Equirectangular, 3: 2D Bowl*/
+    int32_t projection_type;
+    /*!< projections_inv_f_pi Inv_f_pi = (1/f*pi) where f corresponds to View_Width/HFOV (Q0.31)*/
+    int32_t projections_inv_f_pi;
+    /*!< ldc_max_a Maximum distance from the radial center from the full sensor resolution. Q3.16*/
+    int32_t ldc_max_a;
+    /*!< ldc_inv_max_a Inv of ldc_max_a, Q0.26*/
+    int32_t ldc_inv_max_a;
+    /*!< ldc_lut_shift_bits LDC LUT Shift bits*/
+    int32_t ldc_lut_shift_bits;
+    /*!< postaffine_matrix_scale[4] PostAffine Matrix for scale S4.15*/
+    int32_t postaffine_matrix_scale[4];
+    /*!< postaffine_matrix_translation[2] PostAffine Matrix for translation integer value S18.8*/
+    int32_t postaffine_matrix_translation[2];
+    /*!< invalid_coord_mask[4] Invalid Coordinate Mask to be set. Default value set is for 8 bits.*/
+    int32_t invalid_coord_mask[4];
+    /*!< normalization_sf Normalization scaling factor (Q20)*/
+    int32_t normalization_sf;
+    /*!< translation3d[3] 3D translation for bowl projection (S14.8)*/
+    int32_t translation3d[3];
+    /*!< bowl_radius_sqr_2d 2D Bowl Radius Square (Q28.0)*/
+    int32_t bowl_radius_sqr_2d;
+    /*!< bowl_scale_2d 2D Bowl Scale Value (Q0.31)*/
+    int32_t bowl_scale_2d;
+    /*!< IRS_interpolation_enable Use NN for interpolation*/
+    int32_t IRS_interpolation_enable;
+    /*!< input_height input image height*/
+    int32_t input_height;
+    /*!< input_width input image width*/
+    int32_t input_width;
+    /*!< GDC_SP_coord_conv_enable GDC SP 1:4 coord conversion mechanism*/
+    int32_t GDC_SP_coord_conv_enable;
+    /*!< max_distortion_reporting_enable Report position within input image of last processed row for internal rolling buffer support 0-off, 1-on*/
+    int32_t max_distortion_reporting_enable;
+    /*!< max_distortion Maximum lens distortion in input image domain, which defines stagger of last processed input row relative to output row*/
+    int32_t max_distortion;
+
+} ia_pal_isp_gdc7_t;
+
+/*! \isp struct glim_1_0
+Global inverse tone mapping
+*/
+typedef struct
+{
+    /*!< glim_enable Enable GLIM*/
+    int32_t glim_enable;
+    /*!< glu_base_level[8] GLU base level offset*/
+    int32_t glu_base_level[8];
+    /*!< glu_step[8] GLU step amount per stage*/
+    int32_t glu_step[8];
+    /*!< glu_start_bin[8] GLU stage start offset in LUT*/
+    int32_t glu_start_bin[8];
+    /*!< glu_gen_lut_size Utilized LUT size*/
+    int32_t glu_gen_lut_size;
+    /*!< glu_gen_lut[385] LUT samples*/
+    int32_t glu_gen_lut[385];
+    /*!< gain_prec Gain precision bits*/
+    int32_t gain_prec;
+
+} ia_pal_isp_glim_1_0_t;
+
+/*! \isp struct glim_2_0
+Global inverse tone mapping
+*/
+typedef struct
+{
+    /*!< glim_enable Enable GLIM*/
+    int32_t glim_enable;
+    /*!< glu_base_level[8] GLU base level offset*/
+    int32_t glu_base_level[8];
+    /*!< glu_step[8] GLU step amount per stage*/
+    int32_t glu_step[8];
+    /*!< glu_start_bin[8] GLU stage start offset in LUT*/
+    int32_t glu_start_bin[8];
+    /*!< glu_gen_lut_size Utilized LUT size*/
+    int32_t glu_gen_lut_size;
+    /*!< glu_gen_lut[385] LUT samples*/
+    int32_t glu_gen_lut[385];
+    /*!< gain_prec Gain precision bits*/
+    int32_t gain_prec;
+
+} ia_pal_isp_glim_2_0_t;
+
+/*! \isp struct gltm_1_0
+Global tone mapping
+*/
+typedef struct
+{
+    /*!< gltm_enable Enable GLTM*/
+    int32_t gltm_enable;
+    /*!< fc_m[9] YUV2RGB format conversion matrix (coeffs S2.13)*/
+    int32_t fc_m[9];
+    /*!< glu_base_level[8] GLU base level offset*/
+    int32_t glu_base_level[8];
+    /*!< glu_step[8] GLU step amount per stage*/
+    int32_t glu_step[8];
+    /*!< glu_start_bin[8] GLU stage start offset in LUT*/
+    int32_t glu_start_bin[8];
+    /*!< glu_gen_lut_size Utilized LUT size*/
+    int32_t glu_gen_lut_size;
+    /*!< glu_gen_lut[385] LUT samples*/
+    int32_t glu_gen_lut[385];
+    /*!< gain_prec Gain precision bits*/
+    int32_t gain_prec;
+
+} ia_pal_isp_gltm_1_0_t;
+
+/*! \isp struct gltm_2_0
+Global tone mapping
+*/
+typedef struct
+{
+    /*!< gltm_enable Enable GLTM*/
+    int32_t gltm_enable;
+    /*!< fc_m[9] YUV2RGB format conversion matrix (coeffs S2.13)*/
+    int32_t fc_m[9];
+    /*!< glu_base_level[8] GLU base level offset*/
+    int32_t glu_base_level[8];
+    /*!< glu_step[8] GLU step amount per stage*/
+    int32_t glu_step[8];
+    /*!< glu_start_bin[8] GLU stage start offset in LUT*/
+    int32_t glu_start_bin[8];
+    /*!< glu_gen_lut_size Utilized LUT size*/
+    int32_t glu_gen_lut_size;
+    /*!< glu_gen_lut[385] LUT samples*/
+    int32_t glu_gen_lut[385];
+    /*!< gain_prec Gain precision bits*/
+    int32_t gain_prec;
+
+} ia_pal_isp_gltm_2_0_t;
+
+/*! \isp struct gmv_statistics_1_0
+
+*/
+typedef struct
+{
+    /*!< gmv_en ff enable/disable flag*/
+    int32_t gmv_en;
+    /*!< additional_bin_input set to 1 if 4x binning is required before processing, otherwise image is binned 2x*/
+    int32_t additional_bin_input;
+    /*!< kappa kappa for Harris grade calculation*/
+    int32_t kappa;
+    /*!< counter_shifter Shifter for the good feature point and good match point counter*/
+    int32_t counter_shifter;
+    /*!< good_corner_threshold Threshold for the good corner counter.*/
+    int32_t good_corner_threshold;
+    /*!< good_match_threshold Threshold for the good match counter.*/
+    int32_t good_match_threshold;
+    /*!< block_width Block width*/
+    int32_t block_width;
+    /*!< block_height Block height*/
+    int32_t block_height;
+    /*!< x_start x start for best feature search*/
+    int32_t x_start;
+    /*!< y_start y start for best feature search*/
+    int32_t y_start;
+    /*!< x_end x end for best feature search*/
+    int32_t x_end;
+    /*!< y_end y end for best feature search*/
+    int32_t y_end;
+
+} ia_pal_isp_gmv_statistics_1_0_t;
+
+/*! \isp struct hdr_blc_1
+HDR black level correction filter
+*/
+typedef struct
+{
+    /*!< bl_cc00 Black level, color channel (0,0) (adjusted for MSB aligned image)*/
+    int32_t bl_cc00;
+    /*!< bl_cc01 Black level, color channel (0,1) (adjusted for MSB aligned image)*/
+    int32_t bl_cc01;
+    /*!< bl_cc10 Black level, color channel (1,0) (adjusted for MSB aligned image)*/
+    int32_t bl_cc10;
+    /*!< bl_cc11 Black level, color channel (1,1) (adjusted for MSB aligned image)*/
+    int32_t bl_cc11;
+
+} ia_pal_isp_hdr_blc_1_t;
+
+/*! \isp struct hdr_pwldecomp_1
+PWL decompression filter
+*/
+typedef struct
+{
+    /*!< idx_shift Shift for computing LUT index*/
+    int32_t idx_shift;
+    /*!< delta_x_0_to_31[32] PWL decompression curve delta x (for each segment)*/
+    int32_t delta_x_0_to_31[32];
+    /*!< delta_x_32_to_63[32] PWL decompression curve delta x (for each segment)*/
+    int32_t delta_x_32_to_63[32];
+    /*!< slope_shift_0_to_31[32] PWL decompression curve shift representing slope (for each segment)*/
+    int32_t slope_shift_0_to_31[32];
+    /*!< slope_shift_32_to_63[32] PWL decompression curve shift representing slope (for each segment)*/
+    int32_t slope_shift_32_to_63[32];
+    /*!< offset_y_0_to_31[32] PWL decompression curve y offset (for each segment)*/
+    int32_t offset_y_0_to_31[32];
+    /*!< offset_y_32_to_63[32] PWL decompression curve y offset (for each segment)*/
+    int32_t offset_y_32_to_63[32];
+    /*!< use64 Switch for using 64-element LUTs*/
+    int32_t use64;
+    /*!< range_shift Shift for MSB alignment*/
+    int32_t range_shift;
+
+} ia_pal_isp_hdr_pwldecomp_1_t;
+
+/*! \isp struct hdr_sqrtcomp_2
+HDR compression filter
+*/
+typedef struct
+{
+    /*!< noSQRTcomp SQRT compression switch: 0 - enable SQRT compression, 1 - no SQRT compression, pass top 15-bits (approx.)*/
+    int32_t noSQRTcomp;
+
+} ia_pal_isp_hdr_sqrtcomp_2_t;
+
+/*! \isp struct hdr_sqrtcomp_3
+
+*/
+typedef struct
+{
+    /*!< bypass SQRT compression switch: 0 - enable SQRT compression, 1 - no SQRT compression, pass top 15-bits (approx.)*/
+    int32_t bypass;
+    /*!< invsqrt_offset_vec[128] */
+    int32_t invsqrt_offset_vec[128];
+    /*!< invsqrt_slope_vec[128] */
+    int32_t invsqrt_slope_vec[128];
+    /*!< invsqrt_x_cord_vec[128] */
+    int32_t invsqrt_x_cord_vec[128];
+    /*!< invsqrt_exponent */
+    int32_t invsqrt_exponent;
+    /*!< invsqrt_resolution */
+    int32_t invsqrt_resolution;
+    /*!< invsqrt_x_cord_max */
+    int32_t invsqrt_x_cord_max;
+
+} ia_pal_isp_hdr_sqrtcomp_3_t;
+
+/*! \isp struct hdr_stitch_1w
+
+*/
+typedef struct
+{
+    /*!< blend_hithr Blending mask transfer fn upper threshold*/
+    int32_t blend_hithr;
+    /*!< blend_maxblendval Max. blending mask value before normalization*/
+    int32_t blend_maxblendval;
+    /*!< blend_blendshift Normalization shift for blending mask values*/
+    int32_t blend_blendshift;
+    /*!< blend_maxblendval2 Max. blending mask value after normalization*/
+    int32_t blend_maxblendval2;
+    /*!< dg_Yshift Shift for luminance in deghosting*/
+    int32_t dg_Yshift;
+    /*!< dg_A Ghost map transfer fn. parameter A*/
+    int32_t dg_A;
+    /*!< dg_S Ghost map transfer fn. parameter S*/
+    int32_t dg_S;
+    /*!< dg_Yfactshift Shift for luminance factor in deghosting*/
+    int32_t dg_Yfactshift;
+    /*!< dg_Yfactoffset Offset for luminance factor in deghosting*/
+    int32_t dg_Yfactoffset;
+    /*!< dg_ylothr Low threshold deghosting luminance sensitivity (15bit)*/
+    int32_t dg_ylothr;
+    /*!< dg_blur Factor for controling blurring in ghost locations (0 no blur , 128 max blur)*/
+    int32_t dg_blur;
+    /*!< ng_factor Normalization gain factor (ISP gain * HDR gain)*/
+    int32_t ng_factor;
+    /*!< ng_shift Normalization gain shift*/
+    int32_t ng_shift;
+    /*!< cgl_R Long exposure channel gain, R (fixed point)*/
+    int32_t cgl_R;
+    /*!< cgl_Gr Long exposure channel gain, Gr (fixed point)*/
+    int32_t cgl_Gr;
+    /*!< cgl_Gb Long exposure channel gain, Gb (fixed point)*/
+    int32_t cgl_Gb;
+    /*!< cgl_B Long exposure channel gain, B (fixed point)*/
+    int32_t cgl_B;
+    /*!< cgs_R Short exposure channel gain, R (fixed point)*/
+    int32_t cgs_R;
+    /*!< cgs_Gr Short exposure channel gain, Gr (fixed point)*/
+    int32_t cgs_Gr;
+    /*!< cgs_Gb Short exposure channel gain, Gb (fixed point)*/
+    int32_t cgs_Gb;
+    /*!< cgs_B Short exposure channel gain, B (fixed point)*/
+    int32_t cgs_B;
+    /*!< bll_cc00 Long exposure black level, color channel (0,0), WB corrected*/
+    int32_t bll_cc00;
+    /*!< bll_cc01 Long exposure black level, color channel (0,0), WB corrected*/
+    int32_t bll_cc01;
+    /*!< bll_cc10 Long exposure black level, color channel (0,0), WB corrected*/
+    int32_t bll_cc10;
+    /*!< bll_cc11 Long exposure black level, color channel (0,0), WB corrected*/
+    int32_t bll_cc11;
+    /*!< bls_cc00 Short exposure black level, color channel (0,0), fixed point*/
+    int32_t bls_cc00;
+    /*!< bls_cc01 Short exposure black level, color channel (0,1), fixed point*/
+    int32_t bls_cc01;
+    /*!< bls_cc10 Short exposure black level, color channel (1,0), fixed point*/
+    int32_t bls_cc10;
+    /*!< bls_cc11 Short exposure black level, color channel (1,1), fixed point*/
+    int32_t bls_cc11;
+    /*!< blr_cc00 Short exposure residual black level, color channel (0,0), WB corrected and exposure aligned*/
+    int32_t blr_cc00;
+    /*!< blr_cc01 Short exposure residual black level, color channel (0,1), WB corrected and exposure aligned*/
+    int32_t blr_cc01;
+    /*!< blr_cc10 Short exposure residual black level, color channel (1,0), WB corrected and exposure aligned*/
+    int32_t blr_cc10;
+    /*!< blr_cc11 Short exposure residual black level, color channel (1,1), WB corrected and exposure aligned*/
+    int32_t blr_cc11;
+    /*!< dpc_enable DPC weight parameter*/
+    int32_t dpc_enable;
+    /*!< lowlight_value Low light threshold*/
+    int32_t lowlight_value;
+    /*!< lowlight_shift Low light filter shift*/
+    int32_t lowlight_shift;
+    /*!< lowlight_filterStrength Low light filter strength*/
+    int32_t lowlight_filterStrength;
+
+} ia_pal_isp_hdr_stitch_1w_t;
+
+/*! \isp struct hdr_wb_1
+HDR white balance correction filter
+*/
+typedef struct
+{
+    /*!< gain_R Integer representation of adjusted WB gain, R*/
+    int32_t gain_R;
+    /*!< gain_Gr Integer representation of adjusted WB gain, Gr*/
+    int32_t gain_Gr;
+    /*!< gain_Gb Integer representation of adjusted WB gain, Gb*/
+    int32_t gain_Gb;
+    /*!< gain_B Integer representation of adjusted WB gain, B*/
+    int32_t gain_B;
+    /*!< gain_shift_R Adjusted WB gain shift, R*/
+    int32_t gain_shift_R;
+    /*!< gain_shift_Gr Adjusted WB gain shift, Gr*/
+    int32_t gain_shift_Gr;
+    /*!< gain_shift_Gb Adjusted WB gain shift, Gb*/
+    int32_t gain_shift_Gb;
+    /*!< gain_shift_B Adjusted WB gain shift, B*/
+    int32_t gain_shift_B;
+    /*!< clipval Clip value for input signal*/
+    int32_t clipval;
+
+} ia_pal_isp_hdr_wb_1_t;
+
+/*! \isp struct hdrstats_1
+HDR Statistics Extraction filter
+*/
+typedef struct
+{
+    /*!< rgbsstat_en StatR/G/B/S enable: 0 - disable, 1 - enable*/
+    int32_t rgbsstat_en;
+    /*!< histstat_en HistStatR/G/B/Y enable: 0 - disable, 1 - enable*/
+    int32_t histstat_en;
+    /*!< drcstat_en DRCStatY/V enable: 0 - disable, 1 - enable*/
+    int32_t drcstat_en;
+    /*!< bayer_startcolor Bayer Start Color: 0 - R, 1 - Gr, 2 - Gb, 3 - B*/
+    int32_t bayer_startcolor;
+    /*!< dcn_mode DCN mode: 0 - bypass, 1 - DC2, 2 - DC4, 3 - DC8, Saturation grid size: 0 - 8x8, 1 - 16x16, 2 - 32x32, 3 - 64x64*/
+    int32_t dcn_mode;
+    /*!< sat_thrsh Saturation threshold*/
+    int32_t sat_thrsh;
+    /*!< sat_rshift Saturation right shift value for converting to saturation ratio: DCN mode * 2*/
+    int32_t sat_rshift;
+    /*!< drcstat_xx2x_bypass Bypass XX2x sub-block*/
+    int32_t drcstat_xx2x_bypass;
+    /*!< decomp_bypass Bypass decompression sub-block*/
+    int32_t decomp_bypass;
+    /*!< decomp_y_mode decompression Y mode: 0 - average, 1 - max*/
+    int32_t decomp_y_mode;
+    /*!< rgbs_grid_width StatR/G/B/S grid width*/
+    int32_t rgbs_grid_width;
+    /*!< rgbs_grid_height StatR/G/B/S grid height*/
+    int32_t rgbs_grid_height;
+    /*!< hist_grid_width HistStatR/G/B/Y grid width*/
+    int32_t hist_grid_width;
+    /*!< hist_grid_height HistStatR/G/B/Y grid height*/
+    int32_t hist_grid_height;
+    /*!< drc_grid_width DRCStatY/V grid width*/
+    int32_t drc_grid_width;
+    /*!< drc_grid_height DRCStatY/V grid height*/
+    int32_t drc_grid_height;
+
+} ia_pal_isp_hdrstats_1_t;
+
+/*! \isp struct input_system_drainer
+
+*/
+typedef struct
+{
+    /*!< binning_bayer_enable Bayer binning enable*/
+    int32_t binning_bayer_enable;
+    /*!< binning_4cell_enable 4cell binning enable*/
+    int32_t binning_4cell_enable;
+    /*!< crop_enable 0 - Line cropping enabled, 1 - Line cropping enabled*/
+    int32_t crop_enable;
+    /*!< crop_line_top When cropping is enabled, all lines before this line will be cropped*/
+    int32_t crop_line_top;
+    /*!< crop_line_bot When cropping is enabled, all lines after this line will be cropped*/
+    int32_t crop_line_bot;
+
+} ia_pal_isp_input_system_drainer_t;
+
+/*! \isp struct io_buffer
+
+*/
+typedef struct
+{
+    /*!< input_width Input width counted in number of pixels components per line*/
+    int32_t input_width;
+    /*!< input_height Input height counted in number of lines*/
+    int32_t input_height;
+    /*!< output_width Output width counted in number of pixels components per line*/
+    int32_t output_width;
+    /*!< output_height Output height counted in number of lines*/
+    int32_t output_height;
+    /*!< x_output_offset Output horizontal offset from the input, counted in number of pixels components per line, 16b signed (if negative padding is required)*/
+    int32_t x_output_offset;
+    /*!< y_output_offset Output vertical offset from the input counted in number of lines, 16b signed*/
+    int32_t y_output_offset;
+    /*!< espa_luma_shift_left 1-perform shift left on the luma/bayer componenets, 0-perfrom shift right on the luma/bayer components*/
+    int32_t espa_luma_shift_left;
+    /*!< espa_luma_shift_count shift amount to the luma/bayer component where sign is kept and shift right done with rounding*/
+    int32_t espa_luma_shift_count;
+    /*!< espa_chroma_shift_left 1-perform shift left on the chroma componenets, 0-perfrom shift right on the chroma components*/
+    int32_t espa_chroma_shift_left;
+    /*!< espa_chroma_shift_count shift amount to the chroma component where sign is kept and shift right done with rounding*/
+    int32_t espa_chroma_shift_count;
+    /*!< espa_range_reduction_output_resolution Set the output resolution to be used at the range reduction calculation*/
+    int32_t espa_range_reduction_output_resolution;
+    /*!< espa_range_reduction_enable enable range reduction calculation for all components*/
+    int32_t espa_range_reduction_enable;
+    /*!< espa_luma_clipping_min_enable clipping the luma components to clipping_min value*/
+    int32_t espa_luma_clipping_min_enable;
+    /*!< espa_luma_clipping_max_enable clipping the luma components to clipping_max value*/
+    int32_t espa_luma_clipping_max_enable;
+    /*!< espa_chroma_clipping_min_enable clipping the chroma components to clipping_min value*/
+    int32_t espa_chroma_clipping_min_enable;
+    /*!< espa_chroma_clipping_max_enable clipping the chroma components to clipping_max value*/
+    int32_t espa_chroma_clipping_max_enable;
+    /*!< espa_luma_clipping_min_value Min value (S15) to clip the component after the shift using sign arithmetic*/
+    int32_t espa_luma_clipping_min_value;
+    /*!< espa_luma_clipping_max_value Max value (S15) to clip the component after the shift using sign arithmetic*/
+    int32_t espa_luma_clipping_max_value;
+    /*!< espa_luma_offset_value Offset value (S15) to be added to the component using sign arithmetic*/
+    int32_t espa_luma_offset_value;
+    /*!< espa_chroma_clipping_min_value Min value (S15) to clip the component after the shift using sign arithmetic*/
+    int32_t espa_chroma_clipping_min_value;
+    /*!< espa_chroma_clipping_max_value Max value (S15) to clip the component after the shift using sign arithmetic*/
+    int32_t espa_chroma_clipping_max_value;
+    /*!< espa_chroma_offset_value Offset value (S15) to be added to the component using sign arithmetic*/
+    int32_t espa_chroma_offset_value;
+    /*!< espa_enable Enable espa*/
+    int32_t espa_enable;
+    /*!< component_precision Pixel element precision in bits: 0=>8b, 1=>10b, 2=>12b, 3=>16, 4=>32, 5=>2, 6=>4, 7..15=>reserved*/
+    int32_t component_precision;
+    /*!< unpack_alignment Valid for unpacked vectors: 0-element located at LSB and MSB is zero; 1-element located at MSB and LSB is zero*/
+    int32_t unpack_alignment;
+    /*!< vertical_ordering_enable If set, the walking order should be vertical using the sub_line value to indicate how many CL generate vertical movement*/
+    int32_t vertical_ordering_enable;
+    /*!< vertical_ordering_sub_line valid when vertical_ordering is set, indicates the size of the sub line to generate vertical step in CL granularity*/
+    int32_t vertical_ordering_sub_line;
+    /*!< burst_align 0-each request should be aligned to burst size except first request in line (alignment done at first request since the burst size is power of 2),  1-each request should be at burst size except page boundry and EOL*/
+    int32_t burst_align;
+    /*!< num_of_queues Amount of total active queues (YUV FP - 4, YUV SP - 3 YUV SP Tile - 2. RGB - 1,1,1. Bayer -2). Must be up to amount of maximum queue supported. Can be changed per frame. At LBFF used dynamicly for PDAF*/
+    int32_t num_of_queues;
+    /*!< vector_format Vector CL format: 0-unpacked using 2B container; 1-packed*/
+    int32_t vector_format;
+    /*!< tile_mode Valid for IO that can provide tile format: 0-no tiling; 1-the IO should use tiling with the configured height, width, and tiling type (internal tiling or external Tile-4)*/
+    int32_t tile_mode;
+    /*!< tiling_type Tiling Type: 0 - internal tiling; 1 - external tiling (Tile-4)*/
+    int32_t tiling_type;
+    /*!< compression_mode Valid for streaming that are tiled: 1-the stream is written/fetched to/from DDR through compression engine; 0-not going through compression*/
+    int32_t compression_mode;
+    /*!< buffer_1d_enable Valid only for 1 plane and 1 queue streams. 0-the buffer is described as 2D; 1-the buffer is described as 1D (continues from start to end w/o stride ignoring lines)*/
+    int32_t buffer_1d_enable;
+    /*!< num_of_planes Amount of valid planes (supported 1, 2, 3, 4 - depends also on HW parameter of max planes and data type)*/
+    int32_t num_of_planes;
+    /*!< plane_stride[3] Per plane: provides the difference between two horizontal pixels, in bytes, CL aligned, unsigned.  At tile mode - provide the difference between two lines of tiles in bytes*/
+    uint32_t plane_stride[3];
+    /*!< plane_offset_start_address[3] Per plane: Start offset address of plane with regarding to the base_offset, in bytes, CL aligned, unsigned.*/
+    uint32_t plane_offset_start_address[3];
+    /*!< plane_offset_end_address[3] Per plane: End offset address of plane with regarding to the base_offset, in bytes, CL aligned, unsigned.*/
+    uint32_t plane_offset_end_address[3];
+    /*!< plane_tile_width[3] Per plane: buffer tile width configuration in bytes*/
+    int32_t plane_tile_width[3];
+    /*!< plane_tile_height[3] Per plane: buffer tile height configuration in lines*/
+    int32_t plane_tile_height[3];
+    /*!< chroma_planes_order Chroma planes ordering: 0 - U before V; 1 - V before U (valid for half planer configuration)*/
+    int32_t chroma_planes_order;
+    /*!< chroma_duplication Valid when format 420 is configured to provide 422 (2P2Q with SIF count of 4 or 2). when reset - duplicate the chroma and provide the same value each two Y lines, when set - send the chroma components only with the even Y (at odd Y lines doesn’t send any chroma)*/
+    int32_t chroma_duplication;
+    /*!< onep_pixel_order Set the ordering of the first plane (lines-N, pixels-M) 4PPC: 0-(N, M), (N, M+1), (N+1, M), (N+1, M+1), horizontal raster; 1-(N, M), (N+1, M), (N, M+1), (N+1, M+1), vertical raster 2PPC: 0-first cyc: (N, M), (N+1, M), second cyc: (N, M+1), (N+1, M+1); 1-first cyc: (N, M), (N, M+1),*/
+    int32_t onep_pixel_order;
+    /*!< zlr_transaction_enable when set enable sending zlr request for prefetch address translation and compression status*/
+    int32_t zlr_transaction_enable;
+    /*!< streaming_mode The streaming unified buffer protocol:  0-static offline (producer/consumer write/read from DDR after kick);  1-dynamic offline (producer/consumer send wr/rd EOF/SOF, producer write after kick, consumer read after full frame at DDR);  2-buffer chasing large memory (producer/consumer send wr/rd EOF/SOF, producer send wr update, consumer read according to wr update);  3-buffer chasing on small memory (producer/consumer send wr/rd EOF/SOF, producer write released buffers and sends wr pointers, consumer read valid buffer and sends rd pointer);  4-S&R like 3 with option to change the link (supporting modes 2 and 3 with dynamic change) 5-buffer chasing small memory - fix starting point, single buffer 6-buffer chasing small memory - float starting point 7-buffer chasing small memory - fix starting point, double buffer*/
+    int32_t streaming_mode;
+    /*!< streaming_sw_managed When set - the SW verify the shared buffer is fully consumed by  the producer and can be written immediately*/
+    int32_t streaming_sw_managed;
+    /*!< local_link_id indicates the stream used at the current connectlon*/
+    int32_t local_link_id;
+    /*!< stride_ratio provides the BCSM max_stride/stride ratio with possible values of 1-8, 16, 32, 64, 128*/
+    int32_t stride_ratio;
+    /*!< granularity_pointer_update Valid according the streaming mode: number of lines (LB)/lines of blocks (BB) to be written/release before sending a pointer update (reporting always done with producer view)*/
+    int32_t granularity_pointer_update;
+    /*!< max_stride provides the maximum stride value to be used at the connection*/
+    int32_t max_stride;
+    /*!< block_width buffer block width configuration in pixels*/
+    int32_t block_width;
+    /*!< block_height buffer block height configuration in lines*/
+    int32_t block_height;
+    /*!< first_row_blocks_height buffer block height configuration in lines of all the blocks in the first row of blocks. If zero - use streaming_buffer_blocks_height*/
+    int32_t first_row_blocks_height;
+    /*!< last_row_blocks_height buffer block height configuration in lines of all the blocks in the last row of blocks. If zero - use streaming_buffer_blocks_height*/
+    int32_t last_row_blocks_height;
+    /*!< plane_max_burst_size[3] Plane maximum burst size: used to specify the transfer size in CL granularity (Max limited to 16, possible values - 1, 2, 4, 8, 16)*/
+    int32_t plane_max_burst_size[3];
+    /*!< plane_horiz_subsample_config[3] Plane Horiz subsample (width>>N).  Affect tile width and width resolution=>Bayer - 0, Y/UV at YUV SP - 0, Y at YUV FP -0, UV U/V at YUV FP-1)*/
+    int32_t plane_horiz_subsample_config[3];
+    /*!< plane_vert_subsample_config[3] Plane Vertical subsample (height>>N). Affect tile highet and highet resolution=>Bayer - 0, Y atYUV SP - 0, UV at YUV SP - 1, Y at YUV FP -0, U/V at YUV FP-1)*/
+    int32_t plane_vert_subsample_config[3];
+    /*!< plane_zlr_granularity[3] Plane ZLR page granularity: if 0 - 4KB, if 1 - 2KB. Valid only if ZLR is enalbe*/
+    int32_t plane_zlr_granularity[3];
+    /*!< progress_message_line Provides the line number that when is done generate progress message (IFD - last byte of the line arrive, ODR - last byte of the line acked by nbuf)*/
+    int32_t progress_message_line;
+    /*!< pace_message_ref_line Provides the line number that when start indicating start measuring the pace and active  (ODR - send first WR of the line, IFD send first RD of line)*/
+    int32_t pace_message_ref_line;
+    /*!< pace_message_pace_line Provides the line number indicating to stop measuring the activity and pace and sending pace meesage (at IFD - get the last data of the line, at ODR - getnon-buf ack on last data of the line)*/
+    int32_t pace_message_pace_line;
+    /*!< component_in_valid_pixel Provides amount of valid component per valid pixel*/
+    int32_t component_in_valid_pixel;
+    /*!< pixels_in_valid_cycle Provides amount of valid pixels per valid cycle*/
+    int32_t pixels_in_valid_cycle;
+    /*!< subsample_YUV444_to_YUV422 Used by ODR to convert YUV444 to YUV422: 0-use amount of element as written at components_in_valid_cycle, 1-drop the chroma components any odd cycle*/
+    int32_t subsample_YUV444_to_YUV422;
+    /*!< middle_ack_line_number Valid if ack enable  If enabled, the device should generate middle ack when delivers the EOL of the configured line (global number) assuming the first line delievered at SOF is zero.  In case of multiple planes the counting is done using plane1 but only when all the planes are synced*/
+    int32_t middle_ack_line_number;
+    /*!< middle_ack_enable If set, enable the mechansim to generate middle ack when consumed amount of configured lines*/
+    int32_t middle_ack_enable;
+    /*!< middle_ack_mode_stall Valid only when ack_enable is set When set, the device should stall once sending the middle ack*/
+    int32_t middle_ack_mode_stall;
+    /*!< stream_dt stream data type as need to be used by the MIPI*/
+    int32_t stream_dt;
+    /*!< stream_vc stream virtual channel number as need to be used in MIPI*/
+    int32_t stream_vc;
+    /*!< proc_ff_bypass when set indicates the FF in the pipe (FCVT & ESPA) need to be bypass*/
+    int32_t proc_ff_bypass;
+    /*!< dpa_bypass When set indicate the end of MIPI frame (used for MIPI CSI sub frames)*/
+    int32_t dpa_bypass;
+    /*!< sif_user_info2 information to be given by FW and used in the pipeline (driven by IFD). Read bus width defined by HWP*/
+    uint32_t sif_user_info2;
+    /*!< mipi_csi_eof When set indicate the end of MIPI frame (used for MIPI CSI sub frames)*/
+    int32_t mipi_csi_eof;
+    /*!< ppc provides the amount of pixel per cycle*/
+    int32_t ppc;
+    /*!< stream_wc stream word count as need to be used by the MIPI*/
+    int32_t stream_wc;
+    /*!< max_credits provides the maximum amount of credits for eliminating the need to calculate it in HW according the next formula: (end_address-start_address)/Max_Stride*/
+    uint32_t max_credits;
+
+} ia_pal_isp_io_buffer_t;
+
+/*! \isp struct irs_1_0
+
+*/
+typedef struct
+{
+    /*!< enable Enable IRS*/
+    int32_t enable;
+    /*!< passThrough Pass throught algorithm*/
+    int32_t passThrough;
+    /*!< block_height */
+    int32_t block_height;
+    /*!< block_width */
+    int32_t block_width;
+    /*!< top_left_x */
+    int32_t top_left_x;
+    /*!< top_left_y */
+    int32_t top_left_y;
+    /*!< interpolation_enable */
+    int32_t interpolation_enable;
+    /*!< unclipped_a_max */
+    int32_t unclipped_a_max;
+    /*!< mask_val_Y */
+    int32_t mask_val_Y;
+    /*!< mask_val_U */
+    int32_t mask_val_U;
+    /*!< mask_val_V */
+    int32_t mask_val_V;
+    /*!< mask_val_Z */
+    int32_t mask_val_Z;
+    /*!< coord_stride stride of the given coordinates grid*/
+    int32_t coord_stride;
+    /*!< mode MC1/MC2/MCFR/GDC_SP/GDC_FR mode*/
+    int32_t mode;
+
+} ia_pal_isp_irs_1_0_t;
+
+/*! \isp struct lca_1_0
+Lateral Chromatic Aberration Correction
+*/
+typedef struct
+{
+    /*!< radial_enable radial_enable*/
+    int32_t radial_enable;
+    /*!< grid_enable grid_enable*/
+    int32_t grid_enable;
+    /*!< bypass bypass flag*/
+    int32_t bypass;
+    /*!< pixel_format_matrix[4] Bayer type: Gr -> 0, Gb ->1, R -> 2, B -> 3*/
+    int32_t pixel_format_matrix[4];
+    /*!< rx_initial rx_initial*/
+    int32_t rx_initial;
+    /*!< ry_initial ry_initial*/
+    int32_t ry_initial;
+    /*!< opt_center_x opt_center_x*/
+    int32_t opt_center_x;
+    /*!< opt_center_y opt_center_y*/
+    int32_t opt_center_y;
+    /*!< bits_per_pixel_in_map_x bits_per_pixel_in_map_x*/
+    int32_t bits_per_pixel_in_map_x;
+    /*!< bits_per_pixel_in_map_y bits_per_pixel_in_map_y*/
+    int32_t bits_per_pixel_in_map_y;
+    /*!< grid_shift_map_blue_x[324] grid_shift_map_blue_x*/
+    int32_t grid_shift_map_blue_x[324];
+    /*!< grid_shift_map_blue_y[324] grid_shift_map_blue_y*/
+    int32_t grid_shift_map_blue_y[324];
+    /*!< grid_shift_map_red_x[324] grid_shift_map_red_x*/
+    int32_t grid_shift_map_red_x[324];
+    /*!< grid_shift_map_red_y[324] grid_shift_map_red_y*/
+    int32_t grid_shift_map_red_y[324];
+    /*!< cu_blue_rad_shift_x[16] cu_blue_rad_shift_x*/
+    int32_t cu_blue_rad_shift_x[16];
+    /*!< cu_blue_rad_shift_y[15] cu_blue_rad_shift_y*/
+    int32_t cu_blue_rad_shift_y[15];
+    /*!< cu_blue_rad_shift_slope[15] cu_blue_rad_shift_slope*/
+    int32_t cu_blue_rad_shift_slope[15];
+    /*!< cu_red_rad_shift_x[16] cu_red_rad_shift_x*/
+    int32_t cu_red_rad_shift_x[16];
+    /*!< cu_red_rad_shift_y[15] cu_red_rad_shift_y*/
+    int32_t cu_red_rad_shift_y[15];
+    /*!< cu_red_rad_shift_slope[15] cu_red_rad_shift_slope*/
+    int32_t cu_red_rad_shift_slope[15];
+    /*!< resample_type resample type: 0 - bilinear, 1 - bicubic*/
+    int32_t resample_type;
+    /*!< rad_sqr_prec_reduction radius square precision reduction*/
+    int32_t rad_sqr_prec_reduction;
+    /*!< grid_shift_precision_increment grid shift precision increment*/
+    int32_t grid_shift_precision_increment;
+    /*!< radial_shift_precision_alignment radial shift precision alignment*/
+    int32_t radial_shift_precision_alignment;
+    /*!< correction_power sensitivity correction*/
+    int32_t correction_power;
+    /*!< binning_factor_x binnig factor for x dimension*/
+    int32_t binning_factor_x;
+    /*!< binning_factor_y binning factor for y dimension*/
+    int32_t binning_factor_y;
+
+} ia_pal_isp_lca_1_0_t;
+
+/*! \isp struct ldr_blc_1
+LDR black level correction filter
+*/
+typedef struct
+{
+    /*!< bl_cc00 Black level, color channel (0,0)*/
+    int32_t bl_cc00;
+    /*!< bl_cc01 Black level, color channel (0,1)*/
+    int32_t bl_cc01;
+    /*!< bl_cc10 Black level, color channel (1,0)*/
+    int32_t bl_cc10;
+    /*!< bl_cc11 Black level, color channel (1,1)*/
+    int32_t bl_cc11;
+
+} ia_pal_isp_ldr_blc_1_t;
+
+/*! \isp struct ldr_wb_1
+LDR white balance correction filter
+*/
+typedef struct
+{
+    /*!< gain_R WB gain, R (fixed point)*/
+    int32_t gain_R;
+    /*!< gain_Gr WB gain, Gr (fixed point)*/
+    int32_t gain_Gr;
+    /*!< gain_Gb WB gain, Gb (fixed point)*/
+    int32_t gain_Gb;
+    /*!< gain_B WB gain, B (fixed point)*/
+    int32_t gain_B;
+    /*!< gain_fract No. of fractional places in WB gain fixed pt. representation*/
+    int32_t gain_fract;
+    /*!< saturation_value Saturation value after WB*/
+    int32_t saturation_value;
+
+} ia_pal_isp_ldr_wb_1_t;
+
+/*! \isp struct linearization2_0
+Linearization
+*/
+typedef struct
+{
+    /*!< Linearization2_0_enable Enable Linearization2_0*/
+    int32_t Linearization2_0_enable;
+    /*!< glu_base_level0[5] GLU base level offset*/
+    int32_t glu_base_level0[5];
+    /*!< glu_base_level1[5] GLU1 base level offset*/
+    int32_t glu_base_level1[5];
+    /*!< glu_base_level2[5] GLU2 base level offset*/
+    int32_t glu_base_level2[5];
+    /*!< glu_base_level3[5] GLU3 base level offset*/
+    int32_t glu_base_level3[5];
+    /*!< glu_base_level4[5] GLU4 base level offset*/
+    int32_t glu_base_level4[5];
+    /*!< glu_base_level5[5] GLU5 base level offset*/
+    int32_t glu_base_level5[5];
+    /*!< glu_base_level6[5] GLU6 base level offset*/
+    int32_t glu_base_level6[5];
+    /*!< glu_base_level7[5] GLU7 base level offset*/
+    int32_t glu_base_level7[5];
+    /*!< glu_step0[5] GLU step amount per stage*/
+    int32_t glu_step0[5];
+    /*!< glu_step1[5] GLU1 step amount per stage*/
+    int32_t glu_step1[5];
+    /*!< glu_step2[5] GLU2 step amount per stage*/
+    int32_t glu_step2[5];
+    /*!< glu_step3[5] GLU3 step amount per stage*/
+    int32_t glu_step3[5];
+    /*!< glu_step4[5] GLU4 step amount per stage*/
+    int32_t glu_step4[5];
+    /*!< glu_step5[5] GLU5 step amount per stage*/
+    int32_t glu_step5[5];
+    /*!< glu_step6[5] GLU6 step amount per stage*/
+    int32_t glu_step6[5];
+    /*!< glu_step7[5] GLU7 step amount per stage*/
+    int32_t glu_step7[5];
+    /*!< glu_start_bin0[5] GLU stage start offset in LUT*/
+    int32_t glu_start_bin0[5];
+    /*!< glu_start_bin1[5] GLU stage start offset in LUT1*/
+    int32_t glu_start_bin1[5];
+    /*!< glu_start_bin2[5] GLU stage start offset in LUT2*/
+    int32_t glu_start_bin2[5];
+    /*!< glu_start_bin3[5] GLU stage start offset in LUT3*/
+    int32_t glu_start_bin3[5];
+    /*!< glu_start_bin4[5] GLU stage start offset in LUT4*/
+    int32_t glu_start_bin4[5];
+    /*!< glu_start_bin5[5] GLU stage start offset in LUT5*/
+    int32_t glu_start_bin5[5];
+    /*!< glu_start_bin6[5] GLU stage start offset in LUT6*/
+    int32_t glu_start_bin6[5];
+    /*!< glu_start_bin7[5] GLU stage start offset in LUT7*/
+    int32_t glu_start_bin7[5];
+    /*!< glu_gen_lut_size0 Utilized LUT size*/
+    int32_t glu_gen_lut_size0;
+    /*!< glu_gen_lut_size1 Utilized LUT1 size*/
+    int32_t glu_gen_lut_size1;
+    /*!< glu_gen_lut_size2 Utilized LUT2 size*/
+    int32_t glu_gen_lut_size2;
+    /*!< glu_gen_lut_size3 Utilized LUT3 size*/
+    int32_t glu_gen_lut_size3;
+    /*!< glu_gen_lut_size4 Utilized LUT4 size*/
+    int32_t glu_gen_lut_size4;
+    /*!< glu_gen_lut_size5 Utilized LUT5 size*/
+    int32_t glu_gen_lut_size5;
+    /*!< glu_gen_lut_size6 Utilized LUT6 size*/
+    int32_t glu_gen_lut_size6;
+    /*!< glu_gen_lut_size7 Utilized LUT7 size*/
+    int32_t glu_gen_lut_size7;
+    /*!< glu_gen_lut0[512] LUT samples*/
+    int32_t glu_gen_lut0[512];
+    /*!< glu_gen_lut1[512] LUT1 samples*/
+    int32_t glu_gen_lut1[512];
+    /*!< glu_gen_lut2[512] LUT2 samples*/
+    int32_t glu_gen_lut2[512];
+    /*!< glu_gen_lut3[512] LUT3 samples*/
+    int32_t glu_gen_lut3[512];
+    /*!< glu_gen_lut4[512] LUT4 samples*/
+    int32_t glu_gen_lut4[512];
+    /*!< glu_gen_lut5[512] LUT5 samples*/
+    int32_t glu_gen_lut5[512];
+    /*!< glu_gen_lut6[512] LUT6 samples*/
+    int32_t glu_gen_lut6[512];
+    /*!< glu_gen_lut7[512] LUT7 samples*/
+    int32_t glu_gen_lut7[512];
+    /*!< mask0[4] Mask of quad 0*/
+    int32_t mask0[4];
+    /*!< mask1[4] Mask of quad 1*/
+    int32_t mask1[4];
+    /*!< mask2[4] Mask of quad 2*/
+    int32_t mask2[4];
+    /*!< mask3[4] Mask of quad 3*/
+    int32_t mask3[4];
+
+} ia_pal_isp_linearization2_0_t;
+
+/*! \isp struct linearization2_0_b
+Linearization
+*/
+typedef struct
+{
+    /*!< Linearization2_0_enable Enable Linearization2_0*/
+    int32_t Linearization2_0_enable;
+    /*!< glu_base_level0[5] GLU base level offset*/
+    int32_t glu_base_level0[5];
+    /*!< glu_base_level1[5] GLU1 base level offset*/
+    int32_t glu_base_level1[5];
+    /*!< glu_base_level2[5] GLU2 base level offset*/
+    int32_t glu_base_level2[5];
+    /*!< glu_base_level3[5] GLU3 base level offset*/
+    int32_t glu_base_level3[5];
+    /*!< glu_base_level4[5] GLU4 base level offset*/
+    int32_t glu_base_level4[5];
+    /*!< glu_base_level5[5] GLU5 base level offset*/
+    int32_t glu_base_level5[5];
+    /*!< glu_base_level6[5] GLU6 base level offset*/
+    int32_t glu_base_level6[5];
+    /*!< glu_base_level7[5] GLU7 base level offset*/
+    int32_t glu_base_level7[5];
+    /*!< glu_step0[5] GLU step amount per stage*/
+    int32_t glu_step0[5];
+    /*!< glu_step1[5] GLU1 step amount per stage*/
+    int32_t glu_step1[5];
+    /*!< glu_step2[5] GLU2 step amount per stage*/
+    int32_t glu_step2[5];
+    /*!< glu_step3[5] GLU3 step amount per stage*/
+    int32_t glu_step3[5];
+    /*!< glu_step4[5] GLU4 step amount per stage*/
+    int32_t glu_step4[5];
+    /*!< glu_step5[5] GLU5 step amount per stage*/
+    int32_t glu_step5[5];
+    /*!< glu_step6[5] GLU6 step amount per stage*/
+    int32_t glu_step6[5];
+    /*!< glu_step7[5] GLU7 step amount per stage*/
+    int32_t glu_step7[5];
+    /*!< glu_start_bin0[5] GLU stage start offset in LUT*/
+    int32_t glu_start_bin0[5];
+    /*!< glu_start_bin1[5] GLU stage start offset in LUT1*/
+    int32_t glu_start_bin1[5];
+    /*!< glu_start_bin2[5] GLU stage start offset in LUT2*/
+    int32_t glu_start_bin2[5];
+    /*!< glu_start_bin3[5] GLU stage start offset in LUT3*/
+    int32_t glu_start_bin3[5];
+    /*!< glu_start_bin4[5] GLU stage start offset in LUT4*/
+    int32_t glu_start_bin4[5];
+    /*!< glu_start_bin5[5] GLU stage start offset in LUT5*/
+    int32_t glu_start_bin5[5];
+    /*!< glu_start_bin6[5] GLU stage start offset in LUT6*/
+    int32_t glu_start_bin6[5];
+    /*!< glu_start_bin7[5] GLU stage start offset in LUT7*/
+    int32_t glu_start_bin7[5];
+    /*!< glu_gen_lut_size0 Utilized LUT size*/
+    int32_t glu_gen_lut_size0;
+    /*!< glu_gen_lut_size1 Utilized LUT1 size*/
+    int32_t glu_gen_lut_size1;
+    /*!< glu_gen_lut_size2 Utilized LUT2 size*/
+    int32_t glu_gen_lut_size2;
+    /*!< glu_gen_lut_size3 Utilized LUT3 size*/
+    int32_t glu_gen_lut_size3;
+    /*!< glu_gen_lut_size4 Utilized LUT4 size*/
+    int32_t glu_gen_lut_size4;
+    /*!< glu_gen_lut_size5 Utilized LUT5 size*/
+    int32_t glu_gen_lut_size5;
+    /*!< glu_gen_lut_size6 Utilized LUT6 size*/
+    int32_t glu_gen_lut_size6;
+    /*!< glu_gen_lut_size7 Utilized LUT7 size*/
+    int32_t glu_gen_lut_size7;
+    /*!< glu_gen_lut0[512] LUT samples*/
+    int32_t glu_gen_lut0[512];
+    /*!< glu_gen_lut1[512] LUT1 samples*/
+    int32_t glu_gen_lut1[512];
+    /*!< glu_gen_lut2[512] LUT2 samples*/
+    int32_t glu_gen_lut2[512];
+    /*!< glu_gen_lut3[512] LUT3 samples*/
+    int32_t glu_gen_lut3[512];
+    /*!< glu_gen_lut4[512] LUT4 samples*/
+    int32_t glu_gen_lut4[512];
+    /*!< glu_gen_lut5[512] LUT5 samples*/
+    int32_t glu_gen_lut5[512];
+    /*!< glu_gen_lut6[512] LUT6 samples*/
+    int32_t glu_gen_lut6[512];
+    /*!< glu_gen_lut7[512] LUT7 samples*/
+    int32_t glu_gen_lut7[512];
+    /*!< mask0[4] Mask of quad 0*/
+    int32_t mask0[4];
+    /*!< mask1[4] Mask of quad 1*/
+    int32_t mask1[4];
+    /*!< mask2[4] Mask of quad 2*/
+    int32_t mask2[4];
+    /*!< mask3[4] Mask of quad 3*/
+    int32_t mask3[4];
+
+} ia_pal_isp_linearization2_0_b_t;
+
+/*! \isp struct linearization2_0_c
+Linearization
+*/
+typedef struct
+{
+    /*!< Linearization2_0_enable Enable Linearization2_0*/
+    int32_t Linearization2_0_enable;
+    /*!< glu_base_level0[5] GLU base level offset*/
+    int32_t glu_base_level0[5];
+    /*!< glu_base_level1[5] GLU1 base level offset*/
+    int32_t glu_base_level1[5];
+    /*!< glu_base_level2[5] GLU2 base level offset*/
+    int32_t glu_base_level2[5];
+    /*!< glu_base_level3[5] GLU3 base level offset*/
+    int32_t glu_base_level3[5];
+    /*!< glu_base_level4[5] GLU4 base level offset*/
+    int32_t glu_base_level4[5];
+    /*!< glu_base_level5[5] GLU5 base level offset*/
+    int32_t glu_base_level5[5];
+    /*!< glu_base_level6[5] GLU6 base level offset*/
+    int32_t glu_base_level6[5];
+    /*!< glu_base_level7[5] GLU7 base level offset*/
+    int32_t glu_base_level7[5];
+    /*!< glu_step0[5] GLU step amount per stage*/
+    int32_t glu_step0[5];
+    /*!< glu_step1[5] GLU1 step amount per stage*/
+    int32_t glu_step1[5];
+    /*!< glu_step2[5] GLU2 step amount per stage*/
+    int32_t glu_step2[5];
+    /*!< glu_step3[5] GLU3 step amount per stage*/
+    int32_t glu_step3[5];
+    /*!< glu_step4[5] GLU4 step amount per stage*/
+    int32_t glu_step4[5];
+    /*!< glu_step5[5] GLU5 step amount per stage*/
+    int32_t glu_step5[5];
+    /*!< glu_step6[5] GLU6 step amount per stage*/
+    int32_t glu_step6[5];
+    /*!< glu_step7[5] GLU7 step amount per stage*/
+    int32_t glu_step7[5];
+    /*!< glu_start_bin0[5] GLU stage start offset in LUT*/
+    int32_t glu_start_bin0[5];
+    /*!< glu_start_bin1[5] GLU stage start offset in LUT1*/
+    int32_t glu_start_bin1[5];
+    /*!< glu_start_bin2[5] GLU stage start offset in LUT2*/
+    int32_t glu_start_bin2[5];
+    /*!< glu_start_bin3[5] GLU stage start offset in LUT3*/
+    int32_t glu_start_bin3[5];
+    /*!< glu_start_bin4[5] GLU stage start offset in LUT4*/
+    int32_t glu_start_bin4[5];
+    /*!< glu_start_bin5[5] GLU stage start offset in LUT5*/
+    int32_t glu_start_bin5[5];
+    /*!< glu_start_bin6[5] GLU stage start offset in LUT6*/
+    int32_t glu_start_bin6[5];
+    /*!< glu_start_bin7[5] GLU stage start offset in LUT7*/
+    int32_t glu_start_bin7[5];
+    /*!< glu_gen_lut_size0 Utilized LUT size*/
+    int32_t glu_gen_lut_size0;
+    /*!< glu_gen_lut_size1 Utilized LUT1 size*/
+    int32_t glu_gen_lut_size1;
+    /*!< glu_gen_lut_size2 Utilized LUT2 size*/
+    int32_t glu_gen_lut_size2;
+    /*!< glu_gen_lut_size3 Utilized LUT3 size*/
+    int32_t glu_gen_lut_size3;
+    /*!< glu_gen_lut_size4 Utilized LUT4 size*/
+    int32_t glu_gen_lut_size4;
+    /*!< glu_gen_lut_size5 Utilized LUT5 size*/
+    int32_t glu_gen_lut_size5;
+    /*!< glu_gen_lut_size6 Utilized LUT6 size*/
+    int32_t glu_gen_lut_size6;
+    /*!< glu_gen_lut_size7 Utilized LUT7 size*/
+    int32_t glu_gen_lut_size7;
+    /*!< glu_gen_lut0[512] LUT samples*/
+    int32_t glu_gen_lut0[512];
+    /*!< glu_gen_lut1[512] LUT1 samples*/
+    int32_t glu_gen_lut1[512];
+    /*!< glu_gen_lut2[512] LUT2 samples*/
+    int32_t glu_gen_lut2[512];
+    /*!< glu_gen_lut3[512] LUT3 samples*/
+    int32_t glu_gen_lut3[512];
+    /*!< glu_gen_lut4[512] LUT4 samples*/
+    int32_t glu_gen_lut4[512];
+    /*!< glu_gen_lut5[512] LUT5 samples*/
+    int32_t glu_gen_lut5[512];
+    /*!< glu_gen_lut6[512] LUT6 samples*/
+    int32_t glu_gen_lut6[512];
+    /*!< glu_gen_lut7[512] LUT7 samples*/
+    int32_t glu_gen_lut7[512];
+    /*!< mask0[4] Mask of quad 0*/
+    int32_t mask0[4];
+    /*!< mask1[4] Mask of quad 1*/
+    int32_t mask1[4];
+    /*!< mask2[4] Mask of quad 2*/
+    int32_t mask2[4];
+    /*!< mask3[4] Mask of quad 3*/
+    int32_t mask3[4];
+
+} ia_pal_isp_linearization2_0_c_t;
+
+/*! \isp struct linearization2hdr
+
+*/
+typedef struct
+{
+    /*!< bypass */
+    int32_t bypass;
+    /*!< lut_vec_00[128] */
+    int32_t lut_vec_00[128];
+    /*!< lut_vec_01[128] */
+    int32_t lut_vec_01[128];
+    /*!< lut_vec_10[128] */
+    int32_t lut_vec_10[128];
+    /*!< lut_vec_11[128] */
+    int32_t lut_vec_11[128];
+    /*!< base_level[16] */
+    int32_t base_level[16];
+    /*!< start_bin[16] */
+    int32_t start_bin[16];
+    /*!< step[16] */
+    int32_t step[16];
+    /*!< slope_vec_00[128] */
+    int32_t slope_vec_00[128];
+    /*!< slope_vec_01[128] */
+    int32_t slope_vec_01[128];
+    /*!< slope_vec_10[128] */
+    int32_t slope_vec_10[128];
+    /*!< slope_vec_11[128] */
+    int32_t slope_vec_11[128];
+    /*!< slope_resolution[16] */
+    int32_t slope_resolution[16];
+
+} ia_pal_isp_linearization2hdr_t;
+
+/*! \isp struct linearizationdg_dss
+
+*/
+typedef struct
+{
+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/
+    int32_t cfa_type;
+    /*!< linc00[65] linearization grid table*/
+    int32_t linc00[65];
+    /*!< linc01[65] linearization grid table*/
+    int32_t linc01[65];
+    /*!< linc02[65] linearization grid table*/
+    int32_t linc02[65];
+    /*!< linc03[65] linearization grid table*/
+    int32_t linc03[65];
+    /*!< linc10[65] linearization grid table*/
+    int32_t linc10[65];
+    /*!< linc11[65] linearization grid table*/
+    int32_t linc11[65];
+    /*!< linc12[65] linearization grid table*/
+    int32_t linc12[65];
+    /*!< linc13[65] linearization grid table*/
+    int32_t linc13[65];
+    /*!< linc20[65] linearization grid table*/
+    int32_t linc20[65];
+    /*!< linc21[65] linearization grid table*/
+    int32_t linc21[65];
+    /*!< linc22[65] linearization grid table*/
+    int32_t linc22[65];
+    /*!< linc23[65] linearization grid table*/
+    int32_t linc23[65];
+    /*!< linc30[65] linearization grid table*/
+    int32_t linc30[65];
+    /*!< linc31[65] linearization grid table*/
+    int32_t linc31[65];
+    /*!< linc32[65] linearization grid table*/
+    int32_t linc32[65];
+    /*!< linc33[65] linearization grid table*/
+    int32_t linc33[65];
+    /*!< bypass bypass for the filter*/
+    int32_t bypass;
+
+} ia_pal_isp_linearizationdg_dss_t;
+
+/*! \isp struct linearizationwb_dss
+
+*/
+typedef struct
+{
+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/
+    int32_t cfa_type;
+    /*!< linc00[65] linearization grid table*/
+    int32_t linc00[65];
+    /*!< linc01[65] linearization grid table*/
+    int32_t linc01[65];
+    /*!< linc02[65] linearization grid table*/
+    int32_t linc02[65];
+    /*!< linc03[65] linearization grid table*/
+    int32_t linc03[65];
+    /*!< linc10[65] linearization grid table*/
+    int32_t linc10[65];
+    /*!< linc11[65] linearization grid table*/
+    int32_t linc11[65];
+    /*!< linc12[65] linearization grid table*/
+    int32_t linc12[65];
+    /*!< linc13[65] linearization grid table*/
+    int32_t linc13[65];
+    /*!< linc20[65] linearization grid table*/
+    int32_t linc20[65];
+    /*!< linc21[65] linearization grid table*/
+    int32_t linc21[65];
+    /*!< linc22[65] linearization grid table*/
+    int32_t linc22[65];
+    /*!< linc23[65] linearization grid table*/
+    int32_t linc23[65];
+    /*!< linc30[65] linearization grid table*/
+    int32_t linc30[65];
+    /*!< linc31[65] linearization grid table*/
+    int32_t linc31[65];
+    /*!< linc32[65] linearization grid table*/
+    int32_t linc32[65];
+    /*!< linc33[65] linearization grid table*/
+    int32_t linc33[65];
+    /*!< bypass bypass for the filter*/
+    int32_t bypass;
+
+} ia_pal_isp_linearizationwb_dss_t;
+
+/*! \isp struct lossycomp_1_0
+Lossy compression for DDR
+*/
+typedef struct
+{
+    /*!< enable enable the lossy compression*/
+    int32_t enable;
+
+} ia_pal_isp_lossycomp_1_0_t;
+
+/*! \isp struct lossydecomp_1_0
+Lossy decompression for DDR
+*/
+typedef struct
+{
+    /*!< enable enable the lossy decompression*/
+    int32_t enable;
+
+} ia_pal_isp_lossydecomp_1_0_t;
+
+/*! \isp struct lsc_1_1
+
+*/
+typedef struct
+{
+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/
+    int32_t cfa_type;
+    /*!< lsclog2gridwidth log2 width of each subplane*/
+    int32_t lsclog2gridwidth;
+    /*!< lsclog2gridheight log2 height of each subplane*/
+    int32_t lsclog2gridheight;
+    /*!< lsc_col_start X value of top left corner of sensor relative to ROI*/
+    int32_t lsc_col_start;
+    /*!< lsc_row_start Y value of top left corner of sensor relative to ROI*/
+    int32_t lsc_row_start;
+    /*!< lsc_exp resolution modifier of the lsc tables*/
+    int32_t lsc_exp;
+    /*!< lsc_grid_tablec00[4096] lsc grid table*/
+    int32_t lsc_grid_tablec00[4096];
+    /*!< lsc_grid_tablec01[4096] lsc grid table*/
+    int32_t lsc_grid_tablec01[4096];
+    /*!< lsc_grid_tablec02[4096] lsc grid table*/
+    int32_t lsc_grid_tablec02[4096];
+    /*!< lsc_grid_tablec03[4096] lsc grid table*/
+    int32_t lsc_grid_tablec03[4096];
+    /*!< lsc_grid_tablec10[4096] lsc grid table*/
+    int32_t lsc_grid_tablec10[4096];
+    /*!< lsc_grid_tablec11[4096] lsc grid table*/
+    int32_t lsc_grid_tablec11[4096];
+    /*!< lsc_grid_tablec12[4096] lsc grid table*/
+    int32_t lsc_grid_tablec12[4096];
+    /*!< lsc_grid_tablec13[4096] lsc grid table*/
+    int32_t lsc_grid_tablec13[4096];
+    /*!< lsc_grid_tablec20[4096] lsc grid table*/
+    int32_t lsc_grid_tablec20[4096];
+    /*!< lsc_grid_tablec21[4096] lsc grid table*/
+    int32_t lsc_grid_tablec21[4096];
+    /*!< lsc_grid_tablec22[4096] lsc grid table*/
+    int32_t lsc_grid_tablec22[4096];
+    /*!< lsc_grid_tablec23[4096] lsc grid table*/
+    int32_t lsc_grid_tablec23[4096];
+    /*!< lsc_grid_tablec30[4096] lsc grid table*/
+    int32_t lsc_grid_tablec30[4096];
+    /*!< lsc_grid_tablec31[4096] lsc grid table*/
+    int32_t lsc_grid_tablec31[4096];
+    /*!< lsc_grid_tablec32[4096] lsc grid table*/
+    int32_t lsc_grid_tablec32[4096];
+    /*!< lsc_grid_tablec33[4096] lsc grid table*/
+    int32_t lsc_grid_tablec33[4096];
+    /*!< lsc_table_width table width*/
+    int32_t lsc_table_width;
+    /*!< lsc_table_height table height*/
+    int32_t lsc_table_height;
+    /*!< bypass bypass for the filter*/
+    int32_t bypass;
+    /*!< bypass_compression bypass for the compression/decompression*/
+    int32_t bypass_compression;
+    /*!< cu_compression_x[8] U.20 cu_compression_x*/
+    int32_t cu_compression_x[8];
+    /*!< cu_compression_y[7] U.15 cu_compression_y*/
+    int32_t cu_compression_y[7];
+    /*!< cu_compression_slope[7] U.1.10 cu_compression_slope (11 bit)*/
+    int32_t cu_compression_slope[7];
+    /*!< cu_decompression_x[8] U.15 cu_decompression_y*/
+    int32_t cu_decompression_x[8];
+    /*!< cu_decompression_y[7] U.20 cu_decompression_x*/
+    int32_t cu_decompression_y[7];
+    /*!< cu_decompression_slope[7] U.8.6 cu_decompression_slope (14 bit)*/
+    int32_t cu_decompression_slope[7];
+
+} ia_pal_isp_lsc_1_1_t;
+
+/*! \isp struct lsc_1_2
+Lens shading correction up to 24 bit
+*/
+typedef struct
+{
+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/
+    int32_t cfa_type;
+    /*!< lsclog2gridwidth log2 width of each subplane*/
+    int32_t lsclog2gridwidth;
+    /*!< lsclog2gridheight log2 height of each subplane*/
+    int32_t lsclog2gridheight;
+    /*!< lsc_col_start X value of top left corner of sensor relative to ROI*/
+    int32_t lsc_col_start;
+    /*!< lsc_row_start Y value of top left corner of sensor relative to ROI*/
+    int32_t lsc_row_start;
+    /*!< lsc_exp resolution modifier of the lsc tables*/
+    int32_t lsc_exp;
+    /*!< lsc_grid_tablec00[4096] lsc grid table*/
+    int32_t lsc_grid_tablec00[4096];
+    /*!< lsc_grid_tablec01[4096] lsc grid table*/
+    int32_t lsc_grid_tablec01[4096];
+    /*!< lsc_grid_tablec02[4096] lsc grid table*/
+    int32_t lsc_grid_tablec02[4096];
+    /*!< lsc_grid_tablec03[4096] lsc grid table*/
+    int32_t lsc_grid_tablec03[4096];
+    /*!< lsc_grid_tablec10[4096] lsc grid table*/
+    int32_t lsc_grid_tablec10[4096];
+    /*!< lsc_grid_tablec11[4096] lsc grid table*/
+    int32_t lsc_grid_tablec11[4096];
+    /*!< lsc_grid_tablec12[4096] lsc grid table*/
+    int32_t lsc_grid_tablec12[4096];
+    /*!< lsc_grid_tablec13[4096] lsc grid table*/
+    int32_t lsc_grid_tablec13[4096];
+    /*!< lsc_grid_tablec20[4096] lsc grid table*/
+    int32_t lsc_grid_tablec20[4096];
+    /*!< lsc_grid_tablec21[4096] lsc grid table*/
+    int32_t lsc_grid_tablec21[4096];
+    /*!< lsc_grid_tablec22[4096] lsc grid table*/
+    int32_t lsc_grid_tablec22[4096];
+    /*!< lsc_grid_tablec23[4096] lsc grid table*/
+    int32_t lsc_grid_tablec23[4096];
+    /*!< lsc_grid_tablec30[4096] lsc grid table*/
+    int32_t lsc_grid_tablec30[4096];
+    /*!< lsc_grid_tablec31[4096] lsc grid table*/
+    int32_t lsc_grid_tablec31[4096];
+    /*!< lsc_grid_tablec32[4096] lsc grid table*/
+    int32_t lsc_grid_tablec32[4096];
+    /*!< lsc_grid_tablec33[4096] lsc grid table*/
+    int32_t lsc_grid_tablec33[4096];
+    /*!< lsc_table_width table width*/
+    int32_t lsc_table_width;
+    /*!< lsc_table_height table height*/
+    int32_t lsc_table_height;
+    /*!< bypass bypass for the filter*/
+    int32_t bypass;
+    /*!< enable_compand enable for the (de)companding*/
+    int32_t enable_compand;
+    /*!< cu_compression_x[13] U.24 linear, default log-limited*/
+    int32_t cu_compression_x[13];
+    /*!< cu_compression_y[12] U.15 companded output*/
+    int32_t cu_compression_y[12];
+    /*!< cu_compression_slope[12] U1.14 15bit slopes for companding*/
+    int32_t cu_compression_slope[12];
+    /*!< cu_decompression_x[13] U.15 companded input, default log-limited*/
+    int32_t cu_decompression_x[13];
+    /*!< cu_decompression_y[12] U.24 linear*/
+    int32_t cu_decompression_y[12];
+    /*!< cu_decompression_slope[12] U20.6 26bit slopes for decompanding*/
+    int32_t cu_decompression_slope[12];
+    /*!< linear_pedestal Pedestal subtracted (and added later) in linear domain, U.24*/
+    int32_t linear_pedestal;
+    /*!< use_pedestal If true, pedestal is used and the companded signal should be U15. If false, linear_pedestal should be 0*/
+    int32_t use_pedestal;
+
+} ia_pal_isp_lsc_1_2_t;
+
+/*! \isp struct ltm_cd_1_0
+Local Tone Maping Coarse Detail Extruction
+*/
+typedef struct
+{
+    /*!< enable enabling the block. If enable == false, Output is zero*/
+    int32_t enable;
+    /*!< LTM_Power_8 Power gain for 1/8 band*/
+    int32_t LTM_Power_8;
+    /*!< LTM_Power_16 Power gain for 1/16 band*/
+    int32_t LTM_Power_16;
+    /*!< cu_thr8_x[15] threshold for variance - x values*/
+    int32_t cu_thr8_x[15];
+    /*!< cu_thr8_y[14] threshold for variance - y values*/
+    int32_t cu_thr8_y[14];
+    /*!< cu_thr8_slopes[14] threshold for variance - slopes values*/
+    int32_t cu_thr8_slopes[14];
+    /*!< cu_thr16_x[15] threshold for variance - x values*/
+    int32_t cu_thr16_x[15];
+    /*!< cu_thr16_y[14] threshold for variance - y values*/
+    int32_t cu_thr16_y[14];
+    /*!< cu_thr16_slopes[14] threshold for variance - slopes values*/
+    int32_t cu_thr16_slopes[14];
+    /*!< cu_sqrt_x[15] sqrt-x values*/
+    int32_t cu_sqrt_x[15];
+    /*!< cu_sqrt_y[14] sqrt-y values*/
+    int32_t cu_sqrt_y[14];
+    /*!< cu_sqrt_slopes[14] sqrt-slopes values*/
+    int32_t cu_sqrt_slopes[14];
+    /*!< cu_gtm_x[15] gtm-x values*/
+    int32_t cu_gtm_x[15];
+    /*!< cu_gtm_y[14] gtm-y values*/
+    int32_t cu_gtm_y[14];
+    /*!< cu_gtm_slopes[14] gtm-slopes values*/
+    int32_t cu_gtm_slopes[14];
+    /*!< gradual_saturation_on enable gradual saturaion*/
+    int32_t gradual_saturation_on;
+    /*!< frame_width width of current frame*/
+    int32_t frame_width;
+    /*!< frame_height only for HW purposes*/
+    int32_t frame_height;
+    /*!< luma_correction_on enable luma correction*/
+    int32_t luma_correction_on;
+
+} ia_pal_isp_ltm_cd_1_0_t;
+
+/*! \isp struct ltm_de_gamma_1_0
+
+*/
+typedef struct
+{
+    /*!< enable enable for the filter*/
+    int32_t enable;
+    /*!< enable_decomp enabling the tone mapping*/
+    int32_t enable_decomp;
+    /*!< enable_gtm enabling the tone mapping*/
+    int32_t enable_gtm;
+    /*!< enable_df enabling the ltm*/
+    int32_t enable_df;
+    /*!< enable_gamma enabling the gamma*/
+    int32_t enable_gamma;
+    /*!< gamma_lut_base_level[8] base level for gamma lut*/
+    int32_t gamma_lut_base_level[8];
+    /*!< gamma_lut_step[8] step for gamma lut*/
+    int32_t gamma_lut_step[8];
+    /*!< gamma_lut_start_bin[8] start bin for gamma lut*/
+    int32_t gamma_lut_start_bin[8];
+    /*!< gamma_lut_size gamma lut size*/
+    int32_t gamma_lut_size;
+    /*!< gamma_lut_gen_lut[1537] generalized lut for gamma lut*/
+    int32_t gamma_lut_gen_lut[1537];
+    /*!< tm_lut_base_level[7] base level for  tone mapping lut*/
+    int32_t tm_lut_base_level[7];
+    /*!< tm_lut_start_bin[7] start bin for  tone mapping lut*/
+    int32_t tm_lut_start_bin[7];
+    /*!< tm_lut_size tone mapping lut size*/
+    int32_t tm_lut_size;
+    /*!< tm_lut_step[7] step size for generalized LUT*/
+    int32_t tm_lut_step[7];
+    /*!< tm_lut_gen_lut[2049] generalized lut for tone mapping lut. The lut is with the fixed point format 9.10*/
+    int32_t tm_lut_gen_lut[2049];
+    /*!< gtm_gain_shift shift for gain*/
+    int32_t gtm_gain_shift;
+    /*!< cu_decompand_x[13] cu_decompand_x*/
+    int32_t cu_decompand_x[13];
+    /*!< cu_decompand_y[12] cu_decompand_y*/
+    int32_t cu_decompand_y[12];
+    /*!< cu_decompand_slopes[12] cu_decompand_slopes*/
+    int32_t cu_decompand_slopes[12];
+    /*!< linear_pedestal Pedestal subtracted in linear domain*/
+    int32_t linear_pedestal;
+    /*!< use_pedestal If true, pedestal is used and the companded signal should be U15. If false, linear_pedestal should be 0*/
+    int32_t use_pedestal;
+
+} ia_pal_isp_ltm_de_gamma_1_0_t;
+
+/*! \isp struct ltm_fd_1_0
+Local Tone Maping Fine Detail Extruction
+*/
+typedef struct
+{
+    /*!< enable enabling the block. If enable == false, Output is zero*/
+    int32_t enable;
+    /*!< LTM_Power_4 Power gain for 1/4 band*/
+    int32_t LTM_Power_4;
+    /*!< LTM_Power_2 Power gain for 1/2 band*/
+    int32_t LTM_Power_2;
+    /*!< LTM_Power_1 Power gain for full band*/
+    int32_t LTM_Power_1;
+    /*!< cu_thr1_x[15] threshold for variance - x values*/
+    int32_t cu_thr1_x[15];
+    /*!< cu_thr1_y[14] threshold for variance - y values*/
+    int32_t cu_thr1_y[14];
+    /*!< cu_thr1_slopes[14] threshold for variance - slopes values*/
+    int32_t cu_thr1_slopes[14];
+    /*!< cu_thr2_x[15] threshold for variance - x values*/
+    int32_t cu_thr2_x[15];
+    /*!< cu_thr2_y[14] threshold for variance - y values*/
+    int32_t cu_thr2_y[14];
+    /*!< cu_thr2_slopes[14] threshold for variance - slopes values*/
+    int32_t cu_thr2_slopes[14];
+    /*!< cu_thr4_x[15] threshold for variance - x values*/
+    int32_t cu_thr4_x[15];
+    /*!< cu_thr4_y[14] threshold for variance - y values*/
+    int32_t cu_thr4_y[14];
+    /*!< cu_thr4_slopes[14] threshold for variance - slopes values*/
+    int32_t cu_thr4_slopes[14];
+    /*!< cu_sqrt_x[15] sqrt-x values*/
+    int32_t cu_sqrt_x[15];
+    /*!< cu_sqrt_y[14] sqrt-y values*/
+    int32_t cu_sqrt_y[14];
+    /*!< cu_sqrt_slopes[14] sqrt-slopes values*/
+    int32_t cu_sqrt_slopes[14];
+    /*!< cu_gtm_x[15] gtm-x values*/
+    int32_t cu_gtm_x[15];
+    /*!< cu_gtm_y[14] gtm-y values*/
+    int32_t cu_gtm_y[14];
+    /*!< cu_gtm_slopes[14] gtm-slopes values*/
+    int32_t cu_gtm_slopes[14];
+    /*!< gradual_saturation_on enable gradual saturaion*/
+    int32_t gradual_saturation_on;
+    /*!< luma_correction_on enable luma correction*/
+    int32_t luma_correction_on;
+    /*!< cu_norm_x[15] norm-x values*/
+    int32_t cu_norm_x[15];
+    /*!< cu_norm_y[14] norm-y values*/
+    int32_t cu_norm_y[14];
+    /*!< cu_norm_slopes[14] norm-slopes values*/
+    int32_t cu_norm_slopes[14];
+    /*!< frame_height frame height - only for HW needs*/
+    int32_t frame_height;
+    /*!< frame_width frame width - only for HW needs*/
+    int32_t frame_width;
+
+} ia_pal_isp_ltm_fd_1_0_t;
+
+/*! \isp struct ltm_vrt_ctrl
+vertical controller for LTM complex
+*/
+typedef struct
+{
+    /*!< enable enabling the block. If enable == false, Output is zero*/
+    int32_t enable;
+    /*!< frame_height height of current frame*/
+    int32_t frame_height;
+    /*!< frame_width width of current frame*/
+    int32_t frame_width;
+
+} ia_pal_isp_ltm_vrt_ctrl_t;
+
+/*! \isp struct mas
+Motion artifact suppression ofr IMX185
+*/
+typedef struct
+{
+    /*!< gain_motion Threshold for MapMotion*/
+    int32_t gain_motion;
+    /*!< th_low_r Threshold for MapRange Rmin*/
+    int32_t th_low_r;
+    /*!< th_high_r Threshold for MapRange Gmax*/
+    int32_t th_high_r;
+    /*!< th_low_g Threshold for MapRange Gmin*/
+    int32_t th_low_g;
+    /*!< th_high_g Threshold for MapRange Gmax*/
+    int32_t th_high_g;
+    /*!< th_low_b Threshold for MapRange Bmin*/
+    int32_t th_low_b;
+    /*!< th_high_b Threshold for MapRange Bmax*/
+    int32_t th_high_b;
+    /*!< index_color Gain for MapColor*/
+    int32_t index_color;
+    /*!< offset_color Offset for MapColor*/
+    int32_t offset_color;
+    /*!< th_map Threshold for Map*/
+    int32_t th_map;
+    /*!< enable enable:1, bypass:0*/
+    int32_t enable;
+    /*!< frame_id first frame:0, second or after:1*/
+    int32_t frame_id;
+    /*!< flag_by Flag for color map. 0:magenta/green, 1:blue/yellow*/
+    int32_t flag_by;
+
+} ia_pal_isp_mas_t;
+
+/*! \isp struct mrc_1_0
+Motion refinement and compensation - standalone algorithm
+*/
+typedef struct
+{
+    /*!< bypass bypass*/
+    int32_t bypass;
+    /*!< reference_image_bittage bittage of reference input image*/
+    int32_t reference_image_bittage;
+    /*!< low_res_search_range_y low res search range - bottom*/
+    int32_t low_res_search_range_y;
+    /*!< low_res_search_range_x low res search range - left*/
+    int32_t low_res_search_range_x;
+    /*!< invalid_search_edge_y motion refinement range - bottom*/
+    int32_t invalid_search_edge_y;
+    /*!< invalid_search_edge_x motion refinement range - left*/
+    int32_t invalid_search_edge_x;
+    /*!< SAD_chroma_weight weight of chroma in SAD calculation*/
+    int32_t SAD_chroma_weight;
+    /*!< std_thr_flat confidenceSTD lower limit (dY below this value considered flat)*/
+    int32_t std_thr_flat;
+    /*!< std_thr_info confidenceSTD upper limit (dY above this value considered informative)*/
+    int32_t std_thr_info;
+    /*!< alpha_confidence bla bla*/
+    int32_t alpha_confidence;
+    /*!< center_motion_bias_LUT[18] bla bla*/
+    int32_t center_motion_bias_LUT[18];
+    /*!< neighbor_motion_bias_LUT[18] bla bla*/
+    int32_t neighbor_motion_bias_LUT[18];
+    /*!< full_res_center_bias_LUT[18] bla bla*/
+    int32_t full_res_center_bias_LUT[18];
+    /*!< full_res_neighbor_bias_LUT[18] bla bla*/
+    int32_t full_res_neighbor_bias_LUT[18];
+    /*!< motion_magnitude_low bla bla*/
+    int32_t motion_magnitude_low;
+    /*!< motion_magnitude_coeff bla bla*/
+    int32_t motion_magnitude_coeff;
+    /*!< motion_magnitude_platau bla bla*/
+    int32_t motion_magnitude_platau;
+    /*!< rad_sqr_prec_reduction Bit shift bumber to calculate index for nm_R_xcu*/
+    int32_t rad_sqr_prec_reduction;
+    /*!< ry_initial Opical center y coordinate in chroma resolution*/
+    int32_t ry_initial;
+    /*!< rx_initial Opical center x coordinate in chroma resolution*/
+    int32_t rx_initial;
+    /*!< nm_R_xcu[128] LUT for radial noise model*/
+    int32_t nm_R_xcu[128];
+    /*!< nm_Y_xcu[128] LUT for C noise model – Y dependency*/
+    int32_t nm_Y_xcu[128];
+    /*!< nm_C_xcu[128] LUT for C noise model – C dependency*/
+    int32_t nm_C_xcu[128];
+    /*!< nm_Y_log_est_min Min value for log space Y noise model*/
+    int32_t nm_Y_log_est_min;
+    /*!< nm_Y_log_est_max Max value for log space Y noise model*/
+    int32_t nm_Y_log_est_max;
+    /*!< nm_C_log_est_min Min value for log space C noise model*/
+    int32_t nm_C_log_est_min;
+    /*!< nm_C_log_est_max Max value for log space C noise model*/
+    int32_t nm_C_log_est_max;
+    /*!< nm_lut_frac Fractional bit for noise model LUT*/
+    int32_t nm_lut_frac;
+    /*!< nm_idx_frac Bit number for adjusting to POW LUT index*/
+    int32_t nm_idx_frac;
+    /*!< nm_pow[64] LUT for power function*/
+    int32_t nm_pow[64];
+    /*!< nm_pow_frac Fractional bit for POW LUT*/
+    int32_t nm_pow_frac;
+    /*!< nm_shift_num Pre-calculation of nm_lut_frac - nm_idx_frac*/
+    int32_t nm_shift_num;
+    /*!< nm_Y_alpha Scaling coefficient for Y noise model*/
+    int32_t nm_Y_alpha;
+    /*!< nm_C_alpha Scaling coefficient for C noise model*/
+    int32_t nm_C_alpha;
+    /*!< co_var_thres Variance threshold*/
+    int32_t co_var_thres;
+    /*!< co_var_gain Variance gain*/
+    int32_t co_var_gain;
+    /*!< alignment_control Control alignement confidence*/
+    int32_t alignment_control;
+    /*!< alignment_confidence_control Control alignement confidence*/
+    int32_t alignment_confidence_control;
+    /*!< min_normed_sad minimal normed y sad value*/
+    int32_t min_normed_sad;
+    /*!< max_normed_sad maximal normed y sad value*/
+    int32_t max_normed_sad;
+    /*!< min_normed_sad_c minimal normed c sad value*/
+    int32_t min_normed_sad_c;
+    /*!< max_normed_sad_c maximal normed c sad value*/
+    int32_t max_normed_sad_c;
+    /*!< input_bpp bit reduction in feedback loop*/
+    int32_t input_bpp;
+    /*!< output_bpp bit reduction in feedback loop*/
+    int32_t output_bpp;
+
+} ia_pal_isp_mrc_1_0_t;
+
+/*! \isp struct norm_lin_dss
+
+*/
+typedef struct
+{
+    /*!< lut[257] Normalization lut*/
+    int32_t lut[257];
+    /*!< lin_en Linearization enable*/
+    int32_t lin_en;
+    /*!< lshift The size of normalized shift (signed)*/
+    int32_t lshift;
+    /*!< bypass bypass*/
+    int32_t bypass;
+
+} ia_pal_isp_norm_lin_dss_t;
+
+/*! \isp struct nrf_6_00
+
+*/
+typedef struct
+{
+    /*!< Bypass iBypass*/
+    int32_t Bypass;
+    /*!< GNE_consistency_check iGNE consistency check*/
+    int32_t GNE_consistency_check;
+    /*!< GNE_luma_threshold_for_consistency_check iGNE luma threshold for consistency check*/
+    int32_t GNE_luma_threshold_for_consistency_check;
+    /*!< GNE_chroma_threshold_for_consistency_check iGNE chroma threshold for consistency check*/
+    int32_t GNE_chroma_threshold_for_consistency_check;
+    /*!< Block_Noise_Estimate_Edge_Threshold iBlock Noise Estimate Edge Threshold (u14)*/
+    int32_t Block_Noise_Estimate_Edge_Threshold;
+    /*!< Block_Noise_Estimate_Noise_Threshold iBlock Noise Estimate Noise Threshold (u14)*/
+    int32_t Block_Noise_Estimate_Noise_Threshold;
+    /*!< Eight_edge_Threshold iEight-edge Threshold (u16)*/
+    int32_t Eight_edge_Threshold;
+    /*!< Valid_Pixel_Range iValid Pixel Range (u12)*/
+    int32_t Valid_Pixel_Range;
+    /*!< Small_Sobel_Threshold iSmall Sobel Threshold (u14)*/
+    int32_t Small_Sobel_Threshold;
+    /*!< Large_Sobel_Threshold iLarge Sobel Threshold (u14)*/
+    int32_t Large_Sobel_Threshold;
+    /*!< Number_of_Large_Sobel_Threshold iNumber of Large Sobel Threshold (u6)*/
+    int32_t Number_of_Large_Sobel_Threshold;
+    /*!< Number_of_Mediam_Sobel_Threshold iNumber of Mediam Sobel Threshold (u6)*/
+    int32_t Number_of_Mediam_Sobel_Threshold;
+    /*!< Number_of_Small_Sobel_Threshold iNumber of Small Sobel Threshold (u6)*/
+    int32_t Number_of_Small_Sobel_Threshold;
+    /*!< Block_Sigma_Diff_Threshold iBlock Sigma Diff Threshold (u14)*/
+    int32_t Block_Sigma_Diff_Threshold;
+    /*!< Max_Sobel_Threshold iMax Sobel Threshold (u14)*/
+    int32_t Max_Sobel_Threshold;
+    /*!< Denoise_Maximum_History iDenoise Maximum History (u8)*/
+    int32_t Denoise_Maximum_History;
+    /*!< Denoise_History_Increase iDenoise History Increase (u4)*/
+    int32_t Denoise_History_Increase;
+    /*!< Denoise_Moving_Pixel_Threshold iDenoise Moving Pixel Threshold (u5)*/
+    int32_t Denoise_Moving_Pixel_Threshold;
+    /*!< Denoise_Threshold_for_Sum_of_Complexity_Measure iDenoise Threshold for Sum of Complexity Measure (u12)*/
+    int32_t Denoise_Threshold_for_Sum_of_Complexity_Measure;
+    /*!< Denoise_ASD_Threshold iDenoise ASD Threshold (u12)*/
+    int32_t Denoise_ASD_Threshold;
+    /*!< Progressive_DN iProgressive DN (0, 1)*/
+    int32_t Progressive_DN;
+    /*!< Initial_Denoise_History iInitial Denoise History (u6)*/
+    int32_t Initial_Denoise_History;
+    /*!< Denoise_STAD_Threshold iDenoise STAD Threshold (u15)*/
+    int32_t Denoise_STAD_Threshold;
+    /*!< Temporal_Difference_Threshold iTemporal Difference Threshold (u12)*/
+    int32_t Temporal_Difference_Threshold;
+    /*!< Low_Temporal_Difference_Threshold iLow Temporal Difference Threshold (u12)*/
+    int32_t Low_Temporal_Difference_Threshold;
+    /*!< Chroma_Denoise_Enable iChroma Denoise Enable*/
+    int32_t Chroma_Denoise_Enable;
+    /*!< Chroma_Denoise_Moving_Pixel_Threshold iChroma Denoise Moving Pixel Threshold (u5)*/
+    int32_t Chroma_Denoise_Moving_Pixel_Threshold;
+    /*!< Chroma_Denoise_Threshold_for_Sum_of_Complexity_Measure iChroma Denoise Threshold for Sum of Complexity Measure (u12)*/
+    int32_t Chroma_Denoise_Threshold_for_Sum_of_Complexity_Measure;
+    /*!< Chroma_Denoise_ASD_Threshold iChroma Denoise ASD Threshold (u12)*/
+    int32_t Chroma_Denoise_ASD_Threshold;
+    /*!< Chroma_Denoise_Temporal_Difference_Threshold iChroma Denoise Temporal Difference Threshold (u12)*/
+    int32_t Chroma_Denoise_Temporal_Difference_Threshold;
+    /*!< Chroma_Low_Temporal_Difference_Threshold iChroma Low Temporal Difference Threshold (u12)*/
+    int32_t Chroma_Low_Temporal_Difference_Threshold;
+    /*!< Chroma_Denoise_STAD_Threshold iChroma Denoise STAD Threshold (u15)*/
+    int32_t Chroma_Denoise_STAD_Threshold;
+    /*!< Low_Noise_Level iLow Noise Level*/
+    int32_t Low_Noise_Level;
+    /*!< Strong_Noise_Level iStrong Noise Level*/
+    int32_t Strong_Noise_Level;
+    /*!< DnY_prt0 iDnY_prt0 (RangeThreshold 0, u13)*/
+    int32_t DnY_prt0;
+    /*!< DnY_prt1 iDnY_prt1 (RangeThreshold 1, u13)*/
+    int32_t DnY_prt1;
+    /*!< DnY_prt2 iDnY_prt2 (RangeThreshold 2, u13)*/
+    int32_t DnY_prt2;
+    /*!< DnY_prt3 iDnY_prt3 (RangeThreshold 3, u13)*/
+    int32_t DnY_prt3;
+    /*!< DnY_prt4 iDnY_prt4 (RangeThreshold 4, u13)*/
+    int32_t DnY_prt4;
+    /*!< DnY_prt5 iDnY_prt5 (RangeThreshold 5, u13)*/
+    int32_t DnY_prt5;
+    /*!< DnY_Wr0 iDnY_Wr0 (RangeWgt0, u5)*/
+    int32_t DnY_Wr0;
+    /*!< DnY_Wr1 iDnY_Wr1 (RangeWgt1, u5)*/
+    int32_t DnY_Wr1;
+    /*!< DnY_Wr2 iDnY_Wr2 (RangeWgt2, u5)*/
+    int32_t DnY_Wr2;
+    /*!< DnY_Wr3 iDnY_Wr3 (RangeWgt3, u5)*/
+    int32_t DnY_Wr3;
+    /*!< DnY_Wr4 iDnY_Wr4 (RangeWgt4, u5)*/
+    int32_t DnY_Wr4;
+    /*!< DnY_Wr5 iDnY_Wr5 (RangeWgt5, u5)*/
+    int32_t DnY_Wr5;
+    /*!< DnY_wd00 iDnY_wd00 (DistWeight[0][0], u5)*/
+    int32_t DnY_wd00;
+    /*!< DnY_wd01 iDnY_wd01 (DistWeight[0][1], u5)*/
+    int32_t DnY_wd01;
+    /*!< DnY_wd02 iDnY_wd02 (DistWeight[0][2], u5)*/
+    int32_t DnY_wd02;
+    /*!< DnY_wd10 iDnY_wd10 (DistWeight[1][0], u5)*/
+    int32_t DnY_wd10;
+    /*!< DnY_wd11 iDnY_wd11 (DistWeight[1][1], u5)*/
+    int32_t DnY_wd11;
+    /*!< DnY_wd12 iDnY_wd12 (DistWeight[1][2], u5)*/
+    int32_t DnY_wd12;
+    /*!< DnY_wd20 iDnY_wd20 (DistWeight[2][0], u5)*/
+    int32_t DnY_wd20;
+    /*!< DnY_wd21 iDnY_wd21 (DistWeight[2][1], u5)*/
+    int32_t DnY_wd21;
+    /*!< DnY_wd22 iDnY_wd22 (DistWeight[2][2], u5)*/
+    int32_t DnY_wd22;
+    /*!< DnY_dyn_thmin iDnY_dyn_thmin (Min Dynamic Threshold, u13)*/
+    int32_t DnY_dyn_thmin;
+    /*!< DnY_thmin iDnY_thmin (Min Threshold Value for luma, u13)*/
+    int32_t DnY_thmin;
+    /*!< DnY_thmax iDnY_thmax (Max Threshold Value for luma, u13)*/
+    int32_t DnY_thmax;
+    /*!< DnU_prt0 iDnU_prt0 (U RangeThreshold 0, u13)*/
+    int32_t DnU_prt0;
+    /*!< DnU_prt1 iDnU_prt1 (U RangeThreshold 1, u13)*/
+    int32_t DnU_prt1;
+    /*!< DnU_prt2 iDnU_prt2 (U RangeThreshold 2, u13)*/
+    int32_t DnU_prt2;
+    /*!< DnU_prt3 iDnU_prt3 (U RangeThreshold 3, u13)*/
+    int32_t DnU_prt3;
+    /*!< DnU_prt4 iDnU_prt4 (U RangeThreshold 4, u13)*/
+    int32_t DnU_prt4;
+    /*!< DnU_prt5 iDnU_prt5 (U RangeThreshold 5, u13)*/
+    int32_t DnU_prt5;
+    /*!< DnU_Wr0 iDnU_Wr0 (U RangeWgt0, u5)*/
+    int32_t DnU_Wr0;
+    /*!< DnU_Wr1 iDnU_Wr1 (U RangeWgt1, u5)*/
+    int32_t DnU_Wr1;
+    /*!< DnU_Wr2 iDnU_Wr2 (U RangeWgt2, u5)*/
+    int32_t DnU_Wr2;
+    /*!< DnU_Wr3 iDnU_Wr3 (U RangeWgt3, u5)*/
+    int32_t DnU_Wr3;
+    /*!< DnU_Wr4 iDnU_Wr4 (U RangeWgt4, u5)*/
+    int32_t DnU_Wr4;
+    /*!< DnU_Wr5 iDnU_Wr5 (U RangeWgt5, u5)*/
+    int32_t DnU_Wr5;
+    /*!< DnU_wd00 iDnU_wd00 (U DistWeight[0][0], u5)*/
+    int32_t DnU_wd00;
+    /*!< DnU_wd01 iDnU_wd01 (U DistWeight[0][1], u5)*/
+    int32_t DnU_wd01;
+    /*!< DnU_wd02 iDnU_wd02 (U DistWeight[0][2], u5)*/
+    int32_t DnU_wd02;
+    /*!< DnU_wd10 iDnU_wd10 (U DistWeight[1][0], u5)*/
+    int32_t DnU_wd10;
+    /*!< DnU_wd11 iDnU_wd11 (U DistWeight[1][1], u5)*/
+    int32_t DnU_wd11;
+    /*!< DnU_wd12 iDnU_wd12 (U DistWeight[1][2], u5)*/
+    int32_t DnU_wd12;
+    /*!< DnU_wd20 iDnU_wd20 (U DistWeight[2][0], u5)*/
+    int32_t DnU_wd20;
+    /*!< DnU_wd21 iDnU_wd21 (U DistWeight[2][1], u5)*/
+    int32_t DnU_wd21;
+    /*!< DnU_wd22 iDnU_wd22 (U DistWeight[2][2], u5)*/
+    int32_t DnU_wd22;
+    /*!< DnU_dyn_thmin iDnU_dyn_thmin (U Min Dynamic Threshold, u13)*/
+    int32_t DnU_dyn_thmin;
+    /*!< DnU_thmin iDnU_thmin (Min Threshold Value for U, u13)*/
+    int32_t DnU_thmin;
+    /*!< DnU_thmax iDnU_thmax (Max Threshold Value for U, u13)*/
+    int32_t DnU_thmax;
+    /*!< DnV_prt0 iDnV_prt0 (V RangeThreshold 0, u13)*/
+    int32_t DnV_prt0;
+    /*!< DnV_prt1 iDnV_prt1 (V RangeThreshold 1, u13)*/
+    int32_t DnV_prt1;
+    /*!< DnV_prt2 iDnV_prt2 (V RangeThreshold 2, u13)*/
+    int32_t DnV_prt2;
+    /*!< DnV_prt3 iDnV_prt3 (V RangeThreshold 3, u13)*/
+    int32_t DnV_prt3;
+    /*!< DnV_prt4 iDnV_prt4 (V RangeThreshold 4, u13)*/
+    int32_t DnV_prt4;
+    /*!< DnV_prt5 iDnV_prt5 (V RangeThreshold 5, u13)*/
+    int32_t DnV_prt5;
+    /*!< DnV_Wr0 iDnV_Wr0 (V RangeWgt0, u5)*/
+    int32_t DnV_Wr0;
+    /*!< DnV_Wr1 iDnV_Wr1 (V RangeWgt1, u5)*/
+    int32_t DnV_Wr1;
+    /*!< DnV_Wr2 iDnV_Wr2 (V RangeWgt2, u5)*/
+    int32_t DnV_Wr2;
+    /*!< DnV_Wr3 iDnV_Wr3 (V RangeWgt3, u5)*/
+    int32_t DnV_Wr3;
+    /*!< DnV_Wr4 iDnV_Wr4 (V RangeWgt4, u5)*/
+    int32_t DnV_Wr4;
+    /*!< DnV_Wr5 iDnV_Wr5 (V RangeWgt5, u5)*/
+    int32_t DnV_Wr5;
+    /*!< DnV_wd00 iDnV_wd00 (V DistWeight[0][0], u5)*/
+    int32_t DnV_wd00;
+    /*!< DnV_wd01 iDnV_wd01 (V DistWeight[0][1], u5)*/
+    int32_t DnV_wd01;
+    /*!< DnV_wd02 iDnV_wd02 (V DistWeight[0][2], u5)*/
+    int32_t DnV_wd02;
+    /*!< DnV_wd10 iDnV_wd10 (V DistWeight[1][0], u5)*/
+    int32_t DnV_wd10;
+    /*!< DnV_wd11 iDnV_wd11 (V DistWeight[1][1], u5)*/
+    int32_t DnV_wd11;
+    /*!< DnV_wd12 iDnV_wd12 (V DistWeight[1][2], u5)*/
+    int32_t DnV_wd12;
+    /*!< DnV_wd20 iDnV_wd20 (V DistWeight[2][0], u5)*/
+    int32_t DnV_wd20;
+    /*!< DnV_wd21 iDnV_wd21 (V DistWeight[2][1], u5)*/
+    int32_t DnV_wd21;
+    /*!< DnV_wd22 iDnV_wd22 (V DistWeight[2][2], u5)*/
+    int32_t DnV_wd22;
+    /*!< DnV_dyn_thmin iDnV_dyn_thmin (V Min Dynamic Threshold, u13)*/
+    int32_t DnV_dyn_thmin;
+    /*!< DnV_thmin iDnV_thmin (Min Threshold Value for V, u13)*/
+    int32_t DnV_thmin;
+    /*!< DnV_thmax iDnV_thmax (Max Threshold Value for V, u13)*/
+    int32_t DnV_thmax;
+    /*!< Y_RangeThr_Adp2NLvl iY RangeThr Adp2NLvl {0/1}*/
+    int32_t Y_RangeThr_Adp2NLvl;
+    /*!< Y_RangeThr_Adp2NLvl_Min iY RangeThr Adp2NLvl Min*/
+    int32_t Y_RangeThr_Adp2NLvl_Min;
+    /*!< Y_RangeThr_Adp2NLvl_Max iY RangeThr Adp2NLvl Max*/
+    int32_t Y_RangeThr_Adp2NLvl_Max;
+    /*!< Y_RangeThrNLvlMaxIncr0 iY RangeThrNLvlMaxIncr0*/
+    int32_t Y_RangeThrNLvlMaxIncr0;
+    /*!< Y_RangeThrNLvlMaxIncr1 iY RangeThrNLvlMaxIncr1*/
+    int32_t Y_RangeThrNLvlMaxIncr1;
+    /*!< Y_RangeThrNLvlMaxIncr2 iY RangeThrNLvlMaxIncr2*/
+    int32_t Y_RangeThrNLvlMaxIncr2;
+    /*!< Y_RangeThrNLvlMaxIncr3 iY RangeThrNLvlMaxIncr3*/
+    int32_t Y_RangeThrNLvlMaxIncr3;
+    /*!< Y_RangeThrNLvlMaxIncr4 iY RangeThrNLvlMaxIncr4*/
+    int32_t Y_RangeThrNLvlMaxIncr4;
+    /*!< Y_RangeThrNLvlMaxIncr5 iY RangeThrNLvlMaxIncr5*/
+    int32_t Y_RangeThrNLvlMaxIncr5;
+    /*!< U_RangeThr_Adp2NLvl iU RangeThr Adp2NLvl {0/1}*/
+    int32_t U_RangeThr_Adp2NLvl;
+    /*!< U_RangeThr_Adp2NLvl_Min iU RangeThr Adp2NLvl Min*/
+    int32_t U_RangeThr_Adp2NLvl_Min;
+    /*!< U_RangeThr_Adp2NLvl_Max iU RangeThr Adp2NLvl Max*/
+    int32_t U_RangeThr_Adp2NLvl_Max;
+    /*!< U_RangeThrNLvlMaxIncr0 iU RangeThrNLvlMaxIncr0*/
+    int32_t U_RangeThrNLvlMaxIncr0;
+    /*!< U_RangeThrNLvlMaxIncr1 iU RangeThrNLvlMaxIncr1*/
+    int32_t U_RangeThrNLvlMaxIncr1;
+    /*!< U_RangeThrNLvlMaxIncr2 iU RangeThrNLvlMaxIncr2*/
+    int32_t U_RangeThrNLvlMaxIncr2;
+    /*!< U_RangeThrNLvlMaxIncr3 iU RangeThrNLvlMaxIncr3*/
+    int32_t U_RangeThrNLvlMaxIncr3;
+    /*!< U_RangeThrNLvlMaxIncr4 iU RangeThrNLvlMaxIncr4*/
+    int32_t U_RangeThrNLvlMaxIncr4;
+    /*!< U_RangeThrNLvlMaxIncr5 iU RangeThrNLvlMaxIncr5*/
+    int32_t U_RangeThrNLvlMaxIncr5;
+    /*!< V_RangeThr_Adp2NLvl iV RangeThr Adp2NLvl {0/1}*/
+    int32_t V_RangeThr_Adp2NLvl;
+    /*!< V_RangeThr_Adp2NLvl_Min iV RangeThr Adp2NLvl Min*/
+    int32_t V_RangeThr_Adp2NLvl_Min;
+    /*!< V_RangeThr_Adp2NLvl_Max iV RangeThr Adp2NLvl Max*/
+    int32_t V_RangeThr_Adp2NLvl_Max;
+    /*!< V_RangeThrNLvlMaxIncr0 iV RangeThrNLvlMaxIncr0*/
+    int32_t V_RangeThrNLvlMaxIncr0;
+    /*!< V_RangeThrNLvlMaxIncr1 iV RangeThrNLvlMaxIncr1*/
+    int32_t V_RangeThrNLvlMaxIncr1;
+    /*!< V_RangeThrNLvlMaxIncr2 iV RangeThrNLvlMaxIncr2*/
+    int32_t V_RangeThrNLvlMaxIncr2;
+    /*!< V_RangeThrNLvlMaxIncr3 iV RangeThrNLvlMaxIncr3*/
+    int32_t V_RangeThrNLvlMaxIncr3;
+    /*!< V_RangeThrNLvlMaxIncr4 iV RangeThrNLvlMaxIncr4*/
+    int32_t V_RangeThrNLvlMaxIncr4;
+    /*!< V_RangeThrNLvlMaxIncr5 iV RangeThrNLvlMaxIncr5*/
+    int32_t V_RangeThrNLvlMaxIncr5;
+    /*!< Hot_Pixel_Enable iHot Pixel Enable (0,1)*/
+    int32_t Hot_Pixel_Enable;
+    /*!< Hot_Pixel_Y_Threshold iHot Pixel Y Threshold (u8)*/
+    int32_t Hot_Pixel_Y_Threshold;
+    /*!< Hot_Pixel_Y_Count iHot Pixel Y Count (u4)*/
+    int32_t Hot_Pixel_Y_Count;
+    /*!< Hot_Pixel_U_Threshold iHot Pixel U Threshold (u8)*/
+    int32_t Hot_Pixel_U_Threshold;
+    /*!< Hot_Pixel_U_Count iHot Pixel U Count (u4)*/
+    int32_t Hot_Pixel_U_Count;
+    /*!< Hot_Pixel_V_Threshold iHot Pixel V Threshold (u8)*/
+    int32_t Hot_Pixel_V_Threshold;
+    /*!< Hot_Pixel_V_Count iHot Pixel V Count (u4)*/
+    int32_t Hot_Pixel_V_Count;
+    /*!< Validation_mode iValidation mode*/
+    int32_t Validation_mode;
+    /*!< Block_Width iBlock Width*/
+    int32_t Block_Width;
+    /*!< Block_Height iBlock Height*/
+    int32_t Block_Height;
+    /*!< Block_Size iBlock Size*/
+    int32_t Block_Size;
+    /*!< Chroma_Denoise_Block_Size_H iChroma Denoise Block Size H*/
+    int32_t Chroma_Denoise_Block_Size_H;
+    /*!< Chroma_Denoise_Block_Size_V iChroma Denoise Block Size V*/
+    int32_t Chroma_Denoise_Block_Size_V;
+    /*!< Bayer_input_for_capture_pipe iBayer input for capture pipe*/
+    int32_t Bayer_input_for_capture_pipe;
+    /*!< RGB_input iRGB input*/
+    int32_t RGB_input;
+    /*!< Right_Edge iRight Edge*/
+    int32_t Right_Edge;
+    /*!< Left_Edge iLeft Edge*/
+    int32_t Left_Edge;
+    /*!< PADDING_X_MARGIN_LEFT iPADDING X_MARGIN_LEFT*/
+    int32_t PADDING_X_MARGIN_LEFT;
+    /*!< PADDING_X_MARGIN_RIGHT iPADDING X_MARGIN_RIGHT*/
+    int32_t PADDING_X_MARGIN_RIGHT;
+    /*!< PADDING_Y_MARGIN_TOP iPADDING Y_MARGIN_TOP*/
+    int32_t PADDING_Y_MARGIN_TOP;
+    /*!< PADDING_Y_MARGIN_BOTTOM iPADDING Y_MARGIN_BOTTOM*/
+    int32_t PADDING_Y_MARGIN_BOTTOM;
+    /*!< Bayer_Partial_Column_Padding iBayer Partial Column Padding*/
+    int32_t Bayer_Partial_Column_Padding;
+    /*!< Bayer_Partial_Row_Padding iBayer Partial Row Padding*/
+    int32_t Bayer_Partial_Row_Padding;
+    /*!< Enable_CUI_Manual_Bar iEnable CUI Manual Bar*/
+    int32_t Enable_CUI_Manual_Bar;
+    /*!< CUI_Strength_Value iCUI Strength Value[0 - 64]*/
+    int32_t CUI_Strength_Value;
+    /*!< Monochrome_Support_Force_Zero_UV_OUTPUT iMonochrome Support : Force Zero UV OUTPUT*/
+    int32_t Monochrome_Support_Force_Zero_UV_OUTPUT;
+    /*!< Only_enable_spatial_denoise iOnly enable spatial denoise*/
+    int32_t Only_enable_spatial_denoise;
+    /*!< Treat_frame_as_first_frame_for_still_image_sequence iTreat frame as first frame for still image sequence*/
+    int32_t Treat_frame_as_first_frame_for_still_image_sequence;
+    /*!< Fulsim_Output_Bit_Precision iFulsim Output Bit Precision*/
+    int32_t Fulsim_Output_Bit_Precision;
+
+} ia_pal_isp_nrf_6_00_t;
+
+/*! \isp struct nv12reader
+
+*/
+typedef struct
+{
+    /*!< im_width input image width*/
+    int32_t im_width;
+    /*!< im_height input image height*/
+    int32_t im_height;
+    /*!< input_bpp input image bpp*/
+    int32_t input_bpp;
+    /*!< output_bpp output image bpp*/
+    int32_t output_bpp;
+    /*!< input_pixel_container input pixel container (in bits)*/
+    int32_t input_pixel_container;
+
+} ia_pal_isp_nv12reader_t;
+
+/*! \isp struct nv12writer
+
+*/
+typedef struct
+{
+    /*!< output_bpp output image bpp*/
+    int32_t output_bpp;
+    /*!< input_pixel_container input pixel container (in bits)*/
+    int32_t input_pixel_container;
+
+} ia_pal_isp_nv12writer_t;
+
+/*! \isp struct ofa_1_dp
+Output Fornatting Accelerator
+*/
+typedef struct
+{
+    /*!< y_tiling_dp tiling parameter for NV12 y_tiled format*/
+    int32_t y_tiling_dp;
+    /*!< pack_mode_dp pack mode for packer*/
+    int32_t pack_mode_dp;
+    /*!< enable_flip_dp bypass flip*/
+    int32_t enable_flip_dp;
+    /*!< enable_mirror_dp bypass mirror*/
+    int32_t enable_mirror_dp;
+    /*!< enable_reduced_range_dp bypass reduced range*/
+    int32_t enable_reduced_range_dp;
+    /*!< p_e_0 Multiplication parameters for pixel with even vertical index*/
+    int32_t p_e_0;
+    /*!< p_e_1 Multiplication parameters for pixel with even vertical index*/
+    int32_t p_e_1;
+    /*!< p_o_0 Multiplication parameters for pixel with odd vertical index*/
+    int32_t p_o_0;
+    /*!< p_o_1 Multiplication parameters for pixel with odd vertical index*/
+    int32_t p_o_1;
+    /*!< enable_dp display pin is active*/
+    int32_t enable_dp;
+
+} ia_pal_isp_ofa_1_dp_t;
+
+/*! \isp struct ofa_1_mp
+Output Fornatting Accelerator
+*/
+typedef struct
+{
+    /*!< y_tiling_mp tiling parameter for NV12 y_tiled format*/
+    int32_t y_tiling_mp;
+    /*!< pack_mode_mp pack mode for packer*/
+    int32_t pack_mode_mp;
+    /*!< enable_flip_mp bypass flip*/
+    int32_t enable_flip_mp;
+    /*!< enable_mirror_mp bypass mirror*/
+    int32_t enable_mirror_mp;
+    /*!< enable_reduced_range_mp bypass reduced range*/
+    int32_t enable_reduced_range_mp;
+    /*!< p_e_0 Multiplication parameters for pixel with even vertical index*/
+    int32_t p_e_0;
+    /*!< p_e_1 Multiplication parameters for pixel with even vertical index*/
+    int32_t p_e_1;
+    /*!< p_o_0 Multiplication parameters for pixel with odd vertical index*/
+    int32_t p_o_0;
+    /*!< p_o_1 Multiplication parameters for pixel with odd vertical index*/
+    int32_t p_o_1;
+    /*!< enable_mp main pin is active*/
+    int32_t enable_mp;
+
+} ia_pal_isp_ofa_1_mp_t;
+
+/*! \isp struct ofa_1_ppp
+Output Fornatting Accelerator
+*/
+typedef struct
+{
+    /*!< y_tiling_ppp tiling parameter for NV12 y_tiled format*/
+    int32_t y_tiling_ppp;
+    /*!< pack_mode_ppp pack mode for packer*/
+    int32_t pack_mode_ppp;
+    /*!< enable_flip_ppp bypass flip*/
+    int32_t enable_flip_ppp;
+    /*!< enable_mirror_ppp bypass mirror*/
+    int32_t enable_mirror_ppp;
+    /*!< enable_reduced_range_ppp bypass reduced range*/
+    int32_t enable_reduced_range_ppp;
+    /*!< p_e_0 Multiplication parameters for pixel with even vertical index*/
+    int32_t p_e_0;
+    /*!< p_e_1 Multiplication parameters for pixel with even vertical index*/
+    int32_t p_e_1;
+    /*!< p_o_0 Multiplication parameters for pixel with odd vertical index*/
+    int32_t p_o_0;
+    /*!< p_o_1 Multiplication parameters for pixel with odd vertical index*/
+    int32_t p_o_1;
+    /*!< enable_ppp post proc. Pin is active*/
+    int32_t enable_ppp;
+
+} ia_pal_isp_ofa_1_ppp_t;
+
+/*! \isp struct ofa_2_dp
+Output Fornatting Accelerator
+*/
+typedef struct
+{
+    /*!< y_tiling_dp tiling parameter for NV12 y_tiled format*/
+    int32_t y_tiling_dp;
+    /*!< input_bpp_dp input bpp parameter for OFA*/
+    int32_t input_bpp_dp;
+    /*!< pack_mode_dp pack mode for packer*/
+    int32_t pack_mode_dp;
+    /*!< enable_flip_dp bypass flip*/
+    int32_t enable_flip_dp;
+    /*!< enable_mirror_dp bypass mirror*/
+    int32_t enable_mirror_dp;
+    /*!< enable_reduced_range_dp bypass reduced range*/
+    int32_t enable_reduced_range_dp;
+    /*!< p_e_0 Multiplication parameters for pixel with even vertical index*/
+    int32_t p_e_0;
+    /*!< p_e_1 Multiplication parameters for pixel with even vertical index*/
+    int32_t p_e_1;
+    /*!< p_o_0 Multiplication parameters for pixel with odd vertical index*/
+    int32_t p_o_0;
+    /*!< p_o_1 Multiplication parameters for pixel with odd vertical index*/
+    int32_t p_o_1;
+    /*!< enable_dp display pin is active*/
+    int32_t enable_dp;
+    /*!< input_left_crop_pixels_dp left pixels to crop*/
+    int32_t input_left_crop_pixels_dp;
+    /*!< input_top_crop_pixels_dp top pixels to crop*/
+    int32_t input_top_crop_pixels_dp;
+    /*!< output_height_dp output height after padding*/
+    int32_t output_height_dp;
+    /*!< output_width_dp output width after padding*/
+    int32_t output_width_dp;
+
+} ia_pal_isp_ofa_2_dp_t;
+
+/*! \isp struct ofa_2_mp
+Output Fornatting Accelerator
+*/
+typedef struct
+{
+    /*!< y_tiling_mp tiling parameter for NV12 y_tiled format*/
+    int32_t y_tiling_mp;
+    /*!< input_bpp_mp input bpp parameter for OFA*/
+    int32_t input_bpp_mp;
+    /*!< pack_mode_mp pack mode for packer*/
+    int32_t pack_mode_mp;
+    /*!< enable_flip_mp bypass flip*/
+    int32_t enable_flip_mp;
+    /*!< enable_mirror_mp bypass mirror*/
+    int32_t enable_mirror_mp;
+    /*!< enable_reduced_range_mp bypass reduced range*/
+    int32_t enable_reduced_range_mp;
+    /*!< p_e_0 Multiplication parameters for pixel with even vertical index*/
+    int32_t p_e_0;
+    /*!< p_e_1 Multiplication parameters for pixel with even vertical index*/
+    int32_t p_e_1;
+    /*!< p_o_0 Multiplication parameters for pixel with odd vertical index*/
+    int32_t p_o_0;
+    /*!< p_o_1 Multiplication parameters for pixel with odd vertical index*/
+    int32_t p_o_1;
+    /*!< enable_mp main pin is active*/
+    int32_t enable_mp;
+    /*!< input_left_crop_pixels_mp left pixels to crop*/
+    int32_t input_left_crop_pixels_mp;
+    /*!< input_top_crop_pixels_mp top pixels to crop*/
+    int32_t input_top_crop_pixels_mp;
+    /*!< output_height_mp output height after padding*/
+    int32_t output_height_mp;
+    /*!< output_width_mp output width after padding*/
+    int32_t output_width_mp;
+
+} ia_pal_isp_ofa_2_mp_t;
+
+/*! \isp struct ofa_2_ppp
+Output Fornatting Accelerator
+*/
+typedef struct
+{
+    /*!< y_tiling_ppp tiling parameter for NV12 y_tiled format*/
+    int32_t y_tiling_ppp;
+    /*!< input_bpp_ppp input bpp parameter for OFA*/
+    int32_t input_bpp_ppp;
+    /*!< pack_mode_ppp pack mode for packer*/
+    int32_t pack_mode_ppp;
+    /*!< enable_flip_ppp bypass flip*/
+    int32_t enable_flip_ppp;
+    /*!< enable_mirror_ppp bypass mirror*/
+    int32_t enable_mirror_ppp;
+    /*!< enable_reduced_range_ppp bypass reduced range*/
+    int32_t enable_reduced_range_ppp;
+    /*!< p_e_0 Multiplication parameters for pixel with even vertical index*/
+    int32_t p_e_0;
+    /*!< p_e_1 Multiplication parameters for pixel with even vertical index*/
+    int32_t p_e_1;
+    /*!< p_o_0 Multiplication parameters for pixel with odd vertical index*/
+    int32_t p_o_0;
+    /*!< p_o_1 Multiplication parameters for pixel with odd vertical index*/
+    int32_t p_o_1;
+    /*!< enable_ppp post proc. Pin is active*/
+    int32_t enable_ppp;
+    /*!< input_left_crop_pixels_ppp left pixels to crop*/
+    int32_t input_left_crop_pixels_ppp;
+    /*!< input_top_crop_pixels_ppp top pixels to crop*/
+    int32_t input_top_crop_pixels_ppp;
+    /*!< output_height_pp output height after padding*/
+    int32_t output_height_pp;
+    /*!< output_width_pp output width after padding*/
+    int32_t output_width_pp;
+
+} ia_pal_isp_ofa_2_ppp_t;
+
+/*! \isp struct outputscaler_2_0
+
+*/
+typedef struct
+{
+    /*!< enable enable scaling filter*/
+    int32_t enable;
+    /*!< scaling_ratio U5.16 , downscale - greater than 1*/
+    int32_t scaling_ratio;
+    /*!< horizontal_offset_luma S13.16,Position of first output pixel luma channel for scaler*/
+    int32_t horizontal_offset_luma;
+    /*!< vertical_offset_luma S13.16, Position of first output line luma channel for scaler*/
+    int32_t vertical_offset_luma;
+    /*!< horizontal_offset_chroma S13.16, Position of first output pixel chroma channel for scaler*/
+    int32_t horizontal_offset_chroma;
+    /*!< vertical_offset_chroma S13.16, Position of first output line chroma channel for scaler*/
+    int32_t vertical_offset_chroma;
+    /*!< output_height U13.0, Height of output image Y plane for scaler (even)*/
+    int32_t output_height;
+    /*!< output_width U13.0, Width of output image Y plane for scaler (even)*/
+    int32_t output_width;
+    /*!< kernel_LUT[129] S1.10 Y channel Interpolation vertical kernel coefficients for scaler*/
+    int32_t kernel_LUT[129];
+    /*!< chroma_kernel_LUT[129] S1.10 UV channel Interpolation vertical kernel coefficients for scaler*/
+    int32_t chroma_kernel_LUT[129];
+
+} ia_pal_isp_outputscaler_2_0_t;
+
+/*! \isp struct packer_isa_bayer_a
+Bayer Planar output formatter
+*/
+typedef struct
+{
+    /*!< format Output format: 0 - Bayer planar, 1 - Bayer packed*/
+    int32_t format;
+
+} ia_pal_isp_packer_isa_bayer_a_t;
+
+/*! \isp struct packer_isa_yuv_a
+NV12 output formatter
+*/
+typedef struct
+{
+    /*!< format Output format: 0 - I420, 1 - NV12, 2 - NV21, 3 - P010MSB, 4 - P016MSB*/
+    int32_t format;
+
+} ia_pal_isp_packer_isa_yuv_a_t;
+
+/*! \isp struct packer_isa_yuv_b
+NV12 output formatter
+*/
+typedef struct
+{
+    /*!< format Output format: 0 - I420, 1 - NV12, 2 - NV21, 3 - P010MSB, 4 - P016MSB*/
+    int32_t format;
+
+} ia_pal_isp_packer_isa_yuv_b_t;
+
+/*! \isp struct packer_isa_yuv_c
+NV12 output formatter
+*/
+typedef struct
+{
+    /*!< format Output format: 0 - I420, 1 - NV12, 2 - NV21, 3 - P010MSB, 4 - P016MSB*/
+    int32_t format;
+
+} ia_pal_isp_packer_isa_yuv_c_t;
+
+/*! \isp struct padder_bayer_a
+
+*/
+typedef struct
+{
+    /*!< Padder_en 0- disable filter. 1- enable filter.*/
+    int32_t Padder_en;
+    /*!< sol_pad Left side padding quad number.*/
+    int32_t sol_pad;
+    /*!< eol_pad Right side padding quad number.*/
+    int32_t eol_pad;
+    /*!< Frame_width The width of the frame in number of quads.*/
+    int32_t Frame_width;
+    /*!< Strm_format 0- YUV. 1- Bayer.*/
+    int32_t Strm_format;
+
+} ia_pal_isp_padder_bayer_a_t;
+
+/*! \isp struct padder_yuv_a
+
+*/
+typedef struct
+{
+    /*!< Padder_en 0- disable filter. 1- enable filter.*/
+    int32_t Padder_en;
+    /*!< sol_pad Left side padding quad number.*/
+    int32_t sol_pad;
+    /*!< eol_pad Right side padding quad number.*/
+    int32_t eol_pad;
+    /*!< Frame_width The width of the frame in number of quads.*/
+    int32_t Frame_width;
+    /*!< Strm_format 0- YUV. 1- Bayer.*/
+    int32_t Strm_format;
+
+} ia_pal_isp_padder_yuv_a_t;
+
+/*! \isp struct padder_yuv_b
+
+*/
+typedef struct
+{
+    /*!< Padder_en 0- disable filter. 1- enable filter.*/
+    int32_t Padder_en;
+    /*!< sol_pad Left side padding quad number.*/
+    int32_t sol_pad;
+    /*!< eol_pad Right side padding quad number.*/
+    int32_t eol_pad;
+    /*!< Frame_width The width of the frame in number of quads.*/
+    int32_t Frame_width;
+    /*!< Strm_format 0- YUV. 1- Bayer.*/
+    int32_t Strm_format;
+
+} ia_pal_isp_padder_yuv_b_t;
+
+/*! \isp struct padder_yuv_c
+
+*/
+typedef struct
+{
+    /*!< Padder_en 0- disable filter. 1- enable filter.*/
+    int32_t Padder_en;
+    /*!< sol_pad Left side padding quad number.*/
+    int32_t sol_pad;
+    /*!< eol_pad Right side padding quad number.*/
+    int32_t eol_pad;
+    /*!< Frame_width The width of the frame in number of quads.*/
+    int32_t Frame_width;
+    /*!< Strm_format 0- YUV. 1- Bayer.*/
+    int32_t Strm_format;
+
+} ia_pal_isp_padder_yuv_c_t;
+
+/*! \isp struct pafstatistics_1
+PAF Statistics
+*/
+typedef struct
+{
+    /*!< paf_en 0: FF will not write to the PAF  array; 1: FF will write*/
+    int32_t paf_en;
+    /*!< paf_frame_width width of PAF frame (in PAF pixels)*/
+    int32_t paf_frame_width;
+    /*!< paf_frame_height height of PAF frame (in PAF lines)*/
+    int32_t paf_frame_height;
+    /*!< skip_horizontal_start number of skipped PAF pixel pairs at the start of each line pair*/
+    int32_t skip_horizontal_start;
+    /*!< skip_vertical_start number of skipped PAF line pairs at the start of the frame*/
+    int32_t skip_vertical_start;
+    /*!< block_width number of PAF pixel pairs per block in horizontal direction*/
+    int32_t block_width;
+    /*!< block_height number of PAF pixel pairs per block in vertical direction*/
+    int32_t block_height;
+    /*!< accum_horizontal number of consecutive PAF pixel pairs accumulated in horizontal direction*/
+    int32_t accum_horizontal;
+    /*!< skip_horizontal number of PAF pixel pairs skipped between accumulated pixel pairs in horizontal direction*/
+    int32_t skip_horizontal;
+    /*!< accum_vertical number of consecutive PAF pixel pairs accumulated in vertical direction*/
+    int32_t accum_vertical;
+    /*!< skip_vertical number of PAF line pairs skipped between accumulated pixel pairs in vertical direction*/
+    int32_t skip_vertical;
+    /*!< min_shift minimum evaluation shift in steps*/
+    int32_t min_shift;
+    /*!< shift_steps number of evaluation points, starting from m_paf_min_shift*/
+    int32_t shift_steps;
+    /*!< paf_shift_step_size phase evaluation step size in pixels*/
+    int32_t paf_shift_step_size;
+    /*!< paf_shifter configured so that the accumulated phase difference fits in the output register*/
+    int32_t paf_shifter;
+    /*!< split_accross_multiple_lines 0: SOP = SOL, EOP = EOL; 1: SOF determined by the reset, EOL determined by pixels per line*/
+    int32_t split_accross_multiple_lines;
+    /*!< pixels_per_line number of pixels per line; pixels_per_line <= paf_frame_width*/
+    int32_t pixels_per_line;
+    /*!< input_modes 0: RRRR+LLLL; 1: LLLL+RRRR; 2: RLRL; 3: LRLR; 4: RRRR+LLLL_ALT; 5: LLLL+RRRR_ALT; 6: RLRL_ALT; 7: LRLR_ALT*/
+    int32_t input_modes;
+    /*!< input_bpp 0: 8 bits; 1: 10 bits; 2: 12 bits; 3: 14 bits; 4: 16 bits*/
+    int32_t input_bpp;
+    /*!< int_prec internal precision of PAF pixels*/
+    int32_t int_prec;
+    /*!< paf_blacklevel Black level to be subtracted from raw PDAF pixel values*/
+    int32_t paf_blacklevel;
+    /*!< shading_coeff_l[192] Shading correction coefficients for L PDAF values (arrangement is the same as PDAF grid: 16x12)*/
+    int32_t shading_coeff_l[192];
+    /*!< shading_coeff_r[192] Shading correction coefficients for R PDAF values (arrangement is the same as PDAF grid: 16x12)*/
+    int32_t shading_coeff_r[192];
+    /*!< paf_abs_shifter Bit right shift after abs-operation, to compensate for the shading gains*/
+    int32_t paf_abs_shifter;
+
+} ia_pal_isp_pafstatistics_1_t;
+
+/*! \isp struct pafstatistics_1_1
+PAF Statistics
+*/
+typedef struct
+{
+    /*!< paf_en 0: FF will not write to the PAF  array; 1: FF will write*/
+    int32_t paf_en;
+    /*!< paf_frame_width width of PAF frame (in PAF pixels)*/
+    int32_t paf_frame_width;
+    /*!< paf_frame_height height of PAF frame (in PAF lines)*/
+    int32_t paf_frame_height;
+    /*!< skip_horizontal_start number of skipped PAF pixel pairs at the start of each line pair*/
+    int32_t skip_horizontal_start;
+    /*!< skip_vertical_start number of skipped PAF line pairs at the start of the frame*/
+    int32_t skip_vertical_start;
+    /*!< block_width number of PAF pixel pairs per block in horizontal direction*/
+    int32_t block_width;
+    /*!< block_height number of PAF pixel pairs per block in vertical direction*/
+    int32_t block_height;
+    /*!< accum_horizontal number of consecutive PAF pixel pairs accumulated in horizontal direction*/
+    int32_t accum_horizontal;
+    /*!< skip_horizontal number of PAF pixel pairs skipped between accumulated pixel pairs in horizontal direction*/
+    int32_t skip_horizontal;
+    /*!< accum_vertical number of consecutive PAF pixel pairs accumulated in vertical direction*/
+    int32_t accum_vertical;
+    /*!< skip_vertical number of PAF line pairs skipped between accumulated pixel pairs in vertical direction*/
+    int32_t skip_vertical;
+    /*!< min_shift minimum evaluation shift in steps*/
+    int32_t min_shift;
+    /*!< shift_steps number of evaluation points, starting from m_paf_min_shift*/
+    int32_t shift_steps;
+    /*!< paf_shift_step_size phase evaluation step size in pixels*/
+    int32_t paf_shift_step_size;
+    /*!< paf_shifter configured so that the accumulated phase difference fits in the output register*/
+    int32_t paf_shifter;
+    /*!< split_accross_multiple_lines 0: SOP = SOL, EOP = EOL; 1: SOF determined by the reset, EOL determined by pixels per line*/
+    int32_t split_accross_multiple_lines;
+    /*!< pixels_per_line number of pixels per line; pixels_per_line <= paf_frame_width*/
+    int32_t pixels_per_line;
+    /*!< input_modes 0: RRRR+LLLL; 1: LLLL+RRRR; 2: RLRL; 3: LRLR; 4: RRRR+LLLL_ALT; 5: LLLL+RRRR_ALT; 6: RLRL_ALT; 7: LRLR_ALT*/
+    int32_t input_modes;
+    /*!< input_bpp 0: 8 bits; 1: 10 bits; 2: 12 bits; 3: 14 bits; 4: 16 bits*/
+    int32_t input_bpp;
+    /*!< int_prec internal precision of PAF pixels*/
+    int32_t int_prec;
+    /*!< paf_blacklevel Black level to be subtracted from raw PDAF pixel values*/
+    int32_t paf_blacklevel;
+    /*!< shading_coeff_l[192] Shading correction coefficients for L PDAF values (arrangement is the same as PDAF grid: 16x12)*/
+    int32_t shading_coeff_l[192];
+    /*!< shading_coeff_r[192] Shading correction coefficients for R PDAF values (arrangement is the same as PDAF grid: 16x12)*/
+    int32_t shading_coeff_r[192];
+    /*!< paf_abs_shifter Bit right shift after abs-operation, to compensate for the shading gains*/
+    int32_t paf_abs_shifter;
+
+} ia_pal_isp_pafstatistics_1_1_t;
+
+/*! \isp struct pext_1_0
+
+*/
+typedef struct
+{
+    /*!< paf_output_mode 0)disables, do not pass anything\n 1) first line sent to memset0 second\n line sent to memset1\n 2)first line sent to memset0 second to memset 1 and afterward alternate every two lines 3) passthrough –send to memset0 everything*/
+    int32_t paf_output_mode;
+    /*!< swapping1stbc Apply swapping of BC inputs for 1st/3rd/etc.\n0: no swapping\n1: swap B/C inputs*/
+    int32_t swapping1stbc;
+    /*!< swapping1stcd Apply swapping of CD inputs for 1st/3rd/etc.\n0: no swapping\n1: swap C/D inputs*/
+    int32_t swapping1stcd;
+    /*!< swapping2ndbc Apply swapping of BC inputs for 2nd/4th/etc. lines\n0: no swapping\n1: swap A/B inputs*/
+    int32_t swapping2ndbc;
+    /*!< swapping2ndcd Apply swapping of CD inputs for 2nd/4th/etc. lines\n0: no swapping\n1: swap C/D inputs*/
+    int32_t swapping2ndcd;
+    /*!< pdaf_width Width in units of PDAF pixels. After Width pixels – Pext knows there is a new line coming in. In Modes1..3 – max line length is as in the internal buffer size which is 1024 pixels.*/
+    int32_t pdaf_width;
+    /*!< pdaf_height Height in units of pdaf lines*/
+    int32_t pdaf_height;
+    /*!< drop_pattern[32] Drop pattern for AF pixels. 1=drop the lines\n0=use the line*/
+    int32_t drop_pattern[32];
+    /*!< drop_period Period of the drop pattern*/
+    int32_t drop_period;
+
+} ia_pal_isp_pext_1_0_t;
+
+/*! \isp struct pix_crop_ir_md
+
+*/
+typedef struct
+{
+    /*!< enable Enable Crop for IR MD output*/
+    int32_t enable;
+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/
+    int32_t crop_col_start;
+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/
+    int32_t crop_row_start;
+    /*!< crop_col_end End column of image data (excess will be cropped)*/
+    int32_t crop_col_end;
+    /*!< crop_row_end End line of image data (excess will be cropped)*/
+    int32_t crop_row_end;
+
+} ia_pal_isp_pix_crop_ir_md_t;
+
+/*! \isp struct pixcomp_1_0
+Input system pixel compression
+*/
+typedef struct
+{
+    /*!< pixcomp_enable Enable PixComp*/
+    int32_t pixcomp_enable;
+    /*!< glu_base_level[6] GLU base level offset*/
+    int32_t glu_base_level[6];
+    /*!< glu_step[6] GLU step amount per stage*/
+    int32_t glu_step[6];
+    /*!< glu_start_bin[6] GLU stage start offset in LUT*/
+    int32_t glu_start_bin[6];
+    /*!< glu_gen_lut_size Utilized LUT size*/
+    int32_t glu_gen_lut_size;
+    /*!< glu_gen_lut[128] LUT samples*/
+    int32_t glu_gen_lut[128];
+
+} ia_pal_isp_pixcomp_1_0_t;
+
+/*! \isp struct pixelformatter
+
+*/
+typedef struct
+{
+    /*!< m_bypass Bypass     {0,1}*/
+    int32_t m_bypass;
+    /*!< m_ColRemoval col removal- for setting bayer pattern*/
+    int32_t m_ColRemoval;
+    /*!< m_xstart Horizontal Starting Pixel. FIXME: Put correct max and default values*/
+    int32_t m_xstart;
+    /*!< m_ystart Vertical   Starting Pixel. FIXME: Put correct max and default values*/
+    int32_t m_ystart;
+    /*!< m_xsize Horizontal Frame Size. FIXME: Put correct max and default values*/
+    int32_t m_xsize;
+    /*!< m_ysize Vertical   Frame Size. FIXME: Put correct max and default values*/
+    int32_t m_ysize;
+
+} ia_pal_isp_pixelformatter_t;
+
+/*! \isp struct pixelformatter_b
+
+*/
+typedef struct
+{
+    /*!< m_bypass Bypass     {0,1}*/
+    int32_t m_bypass;
+    /*!< m_ColRemoval col removal- for setting bayer pattern*/
+    int32_t m_ColRemoval;
+    /*!< m_xstart Horizontal Starting Pixel. FIXME: Put correct max and default values*/
+    int32_t m_xstart;
+    /*!< m_ystart Vertical   Starting Pixel. FIXME: Put correct max and default values*/
+    int32_t m_ystart;
+    /*!< m_xsize Horizontal Frame Size. FIXME: Put correct max and default values*/
+    int32_t m_xsize;
+    /*!< m_ysize Vertical   Frame Size. FIXME: Put correct max and default values*/
+    int32_t m_ysize;
+
+} ia_pal_isp_pixelformatter_b_t;
+
+/*! \isp struct pixelformatter_c
+
+*/
+typedef struct
+{
+    /*!< m_bypass Bypass     {0,1}*/
+    int32_t m_bypass;
+    /*!< m_ColRemoval col removal- for setting bayer pattern*/
+    int32_t m_ColRemoval;
+    /*!< m_xstart Horizontal Starting Pixel. FIXME: Put correct max and default values*/
+    int32_t m_xstart;
+    /*!< m_ystart Vertical   Starting Pixel. FIXME: Put correct max and default values*/
+    int32_t m_ystart;
+    /*!< m_xsize Horizontal Frame Size. FIXME: Put correct max and default values*/
+    int32_t m_xsize;
+    /*!< m_ysize Vertical   Frame Size. FIXME: Put correct max and default values*/
+    int32_t m_ysize;
+
+} ia_pal_isp_pixelformatter_c_t;
+
+/*! \isp struct pixprecadapter_post_sis
+
+*/
+typedef struct
+{
+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixinprec;
+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixoutprec;
+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixminprec;
+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/
+    int32_t m_isbayer;
+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/
+    int32_t m_cliptous;
+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/
+    int32_t m_shiftlen;
+    /*!< m_shiftval Shift Value {0..7}*/
+    int32_t m_shiftval;
+
+} ia_pal_isp_pixprecadapter_post_sis_t;
+
+/*! \isp struct pixprecadapter_s2v_c
+
+*/
+typedef struct
+{
+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixinprec;
+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixoutprec;
+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixminprec;
+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/
+    int32_t m_isbayer;
+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/
+    int32_t m_cliptous;
+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/
+    int32_t m_shiftlen;
+    /*!< m_shiftval Shift Value {0..7}*/
+    int32_t m_shiftval;
+
+} ia_pal_isp_pixprecadapter_s2v_c_t;
+
+/*! \isp struct pixprecadapter_v2s_4
+
+*/
+typedef struct
+{
+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixinprec;
+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixoutprec;
+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixminprec;
+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/
+    int32_t m_isbayer;
+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/
+    int32_t m_cliptous;
+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/
+    int32_t m_shiftlen;
+    /*!< m_shiftval Shift Value {0..7}*/
+    int32_t m_shiftval;
+
+} ia_pal_isp_pixprecadapter_v2s_4_t;
+
+/*! \isp struct pme_1_0
+PME for 'standalone TNR6'
+*/
+typedef struct
+{
+    /*!< bypass bypass*/
+    int32_t bypass;
+    /*!< frame_height frame height*/
+    int32_t frame_height;
+    /*!< frame_width frame width*/
+    int32_t frame_width;
+    /*!< search_range_y search range - bottom*/
+    int32_t search_range_y;
+    /*!< search_range_x search range - left*/
+    int32_t search_range_x;
+    /*!< dest_block_size_max_y[4] maximal block size - vertical*/
+    int32_t dest_block_size_max_y[4];
+    /*!< dest_block_size_max_x maximal block size - horizontal*/
+    int32_t dest_block_size_max_x;
+    /*!< iy_dest_image_min the first row of the destination image available in the DDR buffer*/
+    int32_t iy_dest_image_min;
+    /*!< ix_dest_image_min the first column of the destination image available in the DDR buffer*/
+    int32_t ix_dest_image_min;
+    /*!< homography_matrix_0[4] homography base->destination; elements 1,2,4,5 [S2.20]*/
+    int32_t homography_matrix_0[4];
+    /*!< homography_matrix_1[2] homography base->destination; elements 7, 8 [S0.31, only 25 LSBs used]*/
+    int32_t homography_matrix_1[2];
+    /*!< homography_matrix_2[3] homography base->destination; elements 3, 6, 9 [S15.16]*/
+    int32_t homography_matrix_2[3];
+    /*!< homography_confidence the confidence of the homography model*/
+    int32_t homography_confidence;
+    /*!< no_motion_confidence the confidence of the no-motion model*/
+    int32_t no_motion_confidence;
+    /*!< motion_complexity[2176] bypass*/
+    int32_t motion_complexity[2176];
+    /*!< motion_complexity_bin_exp_y motion-complexity read configuration*/
+    int32_t motion_complexity_bin_exp_y;
+
+} ia_pal_isp_pme_1_0_t;
+
+/*! \isp struct pxl_crop_bayer_a
+
+*/
+typedef struct
+{
+    /*!< enable Enable Crop for bayer output A*/
+    int32_t enable;
+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/
+    int32_t crop_col_start;
+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/
+    int32_t crop_row_start;
+    /*!< crop_col_end End column of image data (excess will be cropped)*/
+    int32_t crop_col_end;
+    /*!< crop_row_end End line of image data (excess will be cropped)*/
+    int32_t crop_row_end;
+
+} ia_pal_isp_pxl_crop_bayer_a_t;
+
+/*! \isp struct pxl_crop_psa
+
+*/
+typedef struct
+{
+    /*!< enable Enable Crop for bayer output A*/
+    int32_t enable;
+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/
+    int32_t crop_col_start;
+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/
+    int32_t crop_row_start;
+    /*!< crop_col_end End column of image data (excess will be cropped)*/
+    int32_t crop_col_end;
+    /*!< crop_row_end End line of image data (excess will be cropped)*/
+    int32_t crop_row_end;
+
+} ia_pal_isp_pxl_crop_psa_t;
+
+/*! \isp struct pxl_crop_sis_a
+
+*/
+typedef struct
+{
+    /*!< enable Enable post SIS Crop*/
+    int32_t enable;
+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/
+    int32_t crop_col_start;
+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/
+    int32_t crop_row_start;
+    /*!< crop_col_end End column of image data (excess will be cropped)*/
+    int32_t crop_col_end;
+    /*!< crop_row_end End line of image data (excess will be cropped)*/
+    int32_t crop_row_end;
+
+} ia_pal_isp_pxl_crop_sis_a_t;
+
+/*! \isp struct pxl_crop_sis_b
+
+*/
+typedef struct
+{
+    /*!< enable Enable post SIS Crop*/
+    int32_t enable;
+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/
+    int32_t crop_col_start;
+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/
+    int32_t crop_row_start;
+    /*!< crop_col_end End column of image data (excess will be cropped)*/
+    int32_t crop_col_end;
+    /*!< crop_row_end End line of image data (excess will be cropped)*/
+    int32_t crop_row_end;
+
+} ia_pal_isp_pxl_crop_sis_b_t;
+
+/*! \isp struct pxl_crop_yuv_a
+
+*/
+typedef struct
+{
+    /*!< enable Enable Crop for YUV output A*/
+    int32_t enable;
+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/
+    int32_t crop_col_start;
+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/
+    int32_t crop_row_start;
+    /*!< crop_col_end End column of image data (excess will be cropped)*/
+    int32_t crop_col_end;
+    /*!< crop_row_end End line of image data (excess will be cropped)*/
+    int32_t crop_row_end;
+
+} ia_pal_isp_pxl_crop_yuv_a_t;
+
+/*! \isp struct pxl_crop_yuv_b
+
+*/
+typedef struct
+{
+    /*!< enable Enable Crop for YUV output B*/
+    int32_t enable;
+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/
+    int32_t crop_col_start;
+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/
+    int32_t crop_row_start;
+    /*!< crop_col_end End column of image data (excess will be cropped)*/
+    int32_t crop_col_end;
+    /*!< crop_row_end End line of image data (excess will be cropped)*/
+    int32_t crop_row_end;
+
+} ia_pal_isp_pxl_crop_yuv_b_t;
+
+/*! \isp struct pxl_crop_yuv_c
+
+*/
+typedef struct
+{
+    /*!< enable Enable Crop for YUV output C*/
+    int32_t enable;
+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/
+    int32_t crop_col_start;
+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/
+    int32_t crop_row_start;
+    /*!< crop_col_end End column of image data (excess will be cropped)*/
+    int32_t crop_col_end;
+    /*!< crop_row_end End line of image data (excess will be cropped)*/
+    int32_t crop_row_end;
+
+} ia_pal_isp_pxl_crop_yuv_c_t;
+
+/*! \isp struct rgb_ir_2_0
+RGB-IR
+*/
+typedef struct
+{
+    /*!< Bypass Bypass (0,1)*/
+    int32_t Bypass;
+    /*!< CFArgbir[16] RGB-IR CFA descriptor for 4x4 repetitive pattern (0: R, 1: G, 2: B, 3: IR)*/
+    int32_t CFArgbir[16];
+    /*!< CFAbayer[4] Bayer CFA descriptor for 2x2 repetitive pattern (0: R, 1: G, 2: B)*/
+    int32_t CFAbayer[4];
+    /*!< SensorDim[2] Sensor dimensions (height,width) for IR contamination correction (optical center calculation)*/
+    int32_t SensorDim[2];
+    /*!< ImageDim[2] Image dimensions (height,width)*/
+    int32_t ImageDim[2];
+    /*!< IRimageDim[2] IR image dimensions (height,width)*/
+    int32_t IRimageDim[2];
+    /*!< IRtype Type of IR pixel layout (2: IRtype2, 1: IRtype1, 0: any other supported, -1: unsupported)*/
+    int32_t IRtype;
+    /*!< IRrefloc Pixel location corresponding to the reference (first) IR pixel within a 4x4 repetitive pattern*/
+    int32_t IRrefloc;
+    /*!< LumaWeights11[25] Filter mask for luminance calculations in CFA locations 11; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights11[25];
+    /*!< LumaWeights12[25] Filter mask for luminance calculations in CFA locations 12; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights12[25];
+    /*!< LumaWeights13[25] Filter mask for luminance calculations in CFA locations 13; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights13[25];
+    /*!< LumaWeights14[25] Filter mask for luminance calculations in CFA locations 14; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights14[25];
+    /*!< LumaWeights21[25] Filter mask for luminance calculations in CFA locations 21; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights21[25];
+    /*!< LumaWeights22[25] Filter mask for luminance calculations in CFA locations 22; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights22[25];
+    /*!< LumaWeights23[25] Filter mask for luminance calculations in CFA locations 23; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights23[25];
+    /*!< LumaWeights24[25] Filter mask for luminance calculations in CFA locations 24; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights24[25];
+    /*!< LumaWeights31[25] Filter mask for luminance calculations in CFA locations 31; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights31[25];
+    /*!< LumaWeights32[25] Filter mask for luminance calculations in CFA locations 32; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights32[25];
+    /*!< LumaWeights33[25] Filter mask for luminance calculations in CFA locations 33; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights33[25];
+    /*!< LumaWeights34[25] Filter mask for luminance calculations in CFA locations 34; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights34[25];
+    /*!< LumaWeights41[25] Filter mask for luminance calculations in CFA locations 41; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights41[25];
+    /*!< LumaWeights42[25] Filter mask for luminance calculations in CFA locations 42; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights42[25];
+    /*!< LumaWeights43[25] Filter mask for luminance calculations in CFA locations 43; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights43[25];
+    /*!< LumaWeights44[25] Filter mask for luminance calculations in CFA locations 44; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights44[25];
+    /*!< LumaWeightSums[16] Right bit shifts equivalent to the sum of the luminance filter mask coefficients for all 16 channels (11,12,44) within 4x4 repetitive pattern.*/
+    int32_t LumaWeightSums[16];
+    /*!< BayerRestNeighbors11[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 11; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors11[8];
+    /*!< BayerRestNeighbors12[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 12; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors12[8];
+    /*!< BayerRestNeighbors13[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations ; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors13[8];
+    /*!< BayerRestNeighbors14[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 14; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors14[8];
+    /*!< BayerRestNeighbors21[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 21; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors21[8];
+    /*!< BayerRestNeighbors22[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 22; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors22[8];
+    /*!< BayerRestNeighbors23[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 23; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors23[8];
+    /*!< BayerRestNeighbors24[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 24; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors24[8];
+    /*!< BayerRestNeighbors31[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 31; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors31[8];
+    /*!< BayerRestNeighbors32[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 32; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors32[8];
+    /*!< BayerRestNeighbors33[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 33; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors33[8];
+    /*!< BayerRestNeighbors34[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 34; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors34[8];
+    /*!< BayerRestNeighbors41[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 41; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors41[8];
+    /*!< BayerRestNeighbors42[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 42; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors42[8];
+    /*!< BayerRestNeighbors43[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 43; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors43[8];
+    /*!< BayerRestNeighbors44[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 44; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors44[8];
+    /*!< BayerRestLuma Disable the use of the luminance in Bayer CFA restoration (0: disable, 1: enable)*/
+    int32_t BayerRestLuma;
+    /*!< BayerRestWeights Disable the use of the weights in Bayer CFA restoration (0: disable, 1: enable)*/
+    int32_t BayerRestWeights;
+    /*!< IRspatialOffset[2] Spatial shift (y,x) of pixel locations for IR contamination correction*/
+    int32_t IRspatialOffset[2];
+    /*!< IRbinningFactor[2] Binning factors (y,x) for IR contamination correction*/
+    int32_t IRbinningFactor[2];
+    /*!< IRcormode IR contamination correction mode (0: disable, 1: enable)*/
+    int32_t IRcormode;
+    /*!< IRmodelSigma[3] IR contamination model sigma (R,G,B)*/
+    int32_t IRmodelSigma[3];
+    /*!< IRmodelOffset[3] IR contamination model offset (R,G,B)*/
+    int32_t IRmodelOffset[3];
+    /*!< IRmodelHeight[3] IR contamination model height (R,G,B)*/
+    int32_t IRmodelHeight[3];
+    /*!< IRmodelWidth[3] IR contamination model width (R,G,B)*/
+    int32_t IRmodelWidth[3];
+    /*!< IRmodelMax[3] IR contamination model maximum (R,G,B)*/
+    int32_t IRmodelMax[3];
+    /*!< IRmodelCUxR[12] IR contamination model configuration unit parameter set X for R channel*/
+    int32_t IRmodelCUxR[12];
+    /*!< IRmodelCUaR[11] IR contamination model configuration unit parameter set A for R channel*/
+    int32_t IRmodelCUaR[11];
+    /*!< IRmodelCUbR[11] IR contamination model configuration unit parameter set B for R channel*/
+    int32_t IRmodelCUbR[11];
+    /*!< IRmodelCUxG[12] IR contamination model configuration unit parameter set X for G channel*/
+    int32_t IRmodelCUxG[12];
+    /*!< IRmodelCUaG[11] IR contamination model configuration unit parameter set A for G channel*/
+    int32_t IRmodelCUaG[11];
+    /*!< IRmodelCUbG[11] IR contamination model configuration unit parameter set B for G channel*/
+    int32_t IRmodelCUbG[11];
+    /*!< IRmodelCUxB[12] IR contamination model configuration unit parameter set X for B channel*/
+    int32_t IRmodelCUxB[12];
+    /*!< IRmodelCUaB[11] IR contamination model configuration unit parameter set A for B channel*/
+    int32_t IRmodelCUaB[11];
+    /*!< IRmodelCUbB[11] IR contamination model configuration unit parameter set B for B channel*/
+    int32_t IRmodelCUbB[11];
+    /*!< IRinterpNeighbors11[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 11*/
+    int32_t IRinterpNeighbors11[12];
+    /*!< IRinterpNeighbors12[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 12*/
+    int32_t IRinterpNeighbors12[12];
+    /*!< IRinterpNeighbors13[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 13*/
+    int32_t IRinterpNeighbors13[12];
+    /*!< IRinterpNeighbors14[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 14*/
+    int32_t IRinterpNeighbors14[12];
+    /*!< IRinterpNeighbors21[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 21*/
+    int32_t IRinterpNeighbors21[12];
+    /*!< IRinterpNeighbors22[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 22*/
+    int32_t IRinterpNeighbors22[12];
+    /*!< IRinterpNeighbors23[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 23*/
+    int32_t IRinterpNeighbors23[12];
+    /*!< IRinterpNeighbors24[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 24*/
+    int32_t IRinterpNeighbors24[12];
+    /*!< IRinterpNeighbors31[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 31*/
+    int32_t IRinterpNeighbors31[12];
+    /*!< IRinterpNeighbors32[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 32*/
+    int32_t IRinterpNeighbors32[12];
+    /*!< IRinterpNeighbors33[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 33*/
+    int32_t IRinterpNeighbors33[12];
+    /*!< IRinterpNeighbors34[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 34*/
+    int32_t IRinterpNeighbors34[12];
+    /*!< IRinterpNeighbors41[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 41*/
+    int32_t IRinterpNeighbors41[12];
+    /*!< IRinterpNeighbors42[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 42*/
+    int32_t IRinterpNeighbors42[12];
+    /*!< IRinterpNeighbors43[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 43*/
+    int32_t IRinterpNeighbors43[12];
+    /*!< IRinterpNeighbors44[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 44*/
+    int32_t IRinterpNeighbors44[12];
+    /*!< IRscaledSensorDim[2] Scaled sensor dimensions (height,width) for IR contamination correction (optical center calculation); (1 << SHVAL)/SensorDim, for SHVAL = 24. Maximum value assumes that sensor dimensions are larger than 256*/
+    int32_t IRscaledSensorDim[2];
+    /*!< IRscaledModelSigma[3] Scaled IR contamination model sigma (R,G,B); (1 << SMVAL)/IRmodelSigma, for SMVAL = 16*/
+    int32_t IRscaledModelSigma[3];
+
+} ia_pal_isp_rgb_ir_2_0_t;
+
+/*! \isp struct rgb_ir_2_1
+RGB-IR
+*/
+typedef struct
+{
+    /*!< Bypass Bypass (0,1)*/
+    int32_t Bypass;
+    /*!< CFArgbir[16] RGB-IR CFA descriptor for 4x4 repetitive pattern (0: R, 1: G, 2: B, 3: IR)*/
+    int32_t CFArgbir[16];
+    /*!< CFAbayer[4] Bayer CFA descriptor for 2x2 repetitive pattern (0: R, 1: G, 2: B)*/
+    int32_t CFAbayer[4];
+    /*!< SensorDim[2] Sensor dimensions (height,width) for IR contamination correction (optical center calculation)*/
+    int32_t SensorDim[2];
+    /*!< ImageDim[2] Image dimensions (height,width)*/
+    int32_t ImageDim[2];
+    /*!< IRimageDim[2] IR image dimensions (height,width)*/
+    int32_t IRimageDim[2];
+    /*!< IRtype Type of IR pixel layout (2: IRtype2, 1: IRtype1, 0: any other supported, -1: unsupported)*/
+    int32_t IRtype;
+    /*!< IRrefloc Pixel location corresponding to the reference (first) IR pixel within a 4x4 repetitive pattern*/
+    int32_t IRrefloc;
+    /*!< LumaWeights11[25] Filter mask for luminance calculations in CFA locations 11; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights11[25];
+    /*!< LumaWeights12[25] Filter mask for luminance calculations in CFA locations 12; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights12[25];
+    /*!< LumaWeights13[25] Filter mask for luminance calculations in CFA locations 13; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights13[25];
+    /*!< LumaWeights14[25] Filter mask for luminance calculations in CFA locations 14; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights14[25];
+    /*!< LumaWeights21[25] Filter mask for luminance calculations in CFA locations 21; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights21[25];
+    /*!< LumaWeights22[25] Filter mask for luminance calculations in CFA locations 22; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights22[25];
+    /*!< LumaWeights23[25] Filter mask for luminance calculations in CFA locations 23; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights23[25];
+    /*!< LumaWeights24[25] Filter mask for luminance calculations in CFA locations 24; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights24[25];
+    /*!< LumaWeights31[25] Filter mask for luminance calculations in CFA locations 31; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights31[25];
+    /*!< LumaWeights32[25] Filter mask for luminance calculations in CFA locations 32; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights32[25];
+    /*!< LumaWeights33[25] Filter mask for luminance calculations in CFA locations 33; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights33[25];
+    /*!< LumaWeights34[25] Filter mask for luminance calculations in CFA locations 34; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights34[25];
+    /*!< LumaWeights41[25] Filter mask for luminance calculations in CFA locations 41; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights41[25];
+    /*!< LumaWeights42[25] Filter mask for luminance calculations in CFA locations 42; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights42[25];
+    /*!< LumaWeights43[25] Filter mask for luminance calculations in CFA locations 43; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights43[25];
+    /*!< LumaWeights44[25] Filter mask for luminance calculations in CFA locations 44; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights44[25];
+    /*!< LumaWeightSums[16] Right bit shifts equivalent to the sum of the luminance filter mask coefficients for all 16 channels (11,12,44) within 4x4 repetitive pattern.*/
+    int32_t LumaWeightSums[16];
+    /*!< BayerRestNeighbors11[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 11; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors11[8];
+    /*!< BayerRestNeighbors12[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 12; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors12[8];
+    /*!< BayerRestNeighbors13[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations ; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors13[8];
+    /*!< BayerRestNeighbors14[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 14; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors14[8];
+    /*!< BayerRestNeighbors21[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 21; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors21[8];
+    /*!< BayerRestNeighbors22[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 22; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors22[8];
+    /*!< BayerRestNeighbors23[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 23; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors23[8];
+    /*!< BayerRestNeighbors24[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 24; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors24[8];
+    /*!< BayerRestNeighbors31[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 31; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors31[8];
+    /*!< BayerRestNeighbors32[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 32; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors32[8];
+    /*!< BayerRestNeighbors33[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 33; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors33[8];
+    /*!< BayerRestNeighbors34[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 34; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors34[8];
+    /*!< BayerRestNeighbors41[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 41; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors41[8];
+    /*!< BayerRestNeighbors42[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 42; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors42[8];
+    /*!< BayerRestNeighbors43[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 43; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors43[8];
+    /*!< BayerRestNeighbors44[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 44; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors44[8];
+    /*!< BayerRestLuma Disable the use of the luminance in Bayer CFA restoration (0: disable, 1: enable)*/
+    int32_t BayerRestLuma;
+    /*!< BayerRestWeights Disable the use of the weights in Bayer CFA restoration (0: disable, 1: enable)*/
+    int32_t BayerRestWeights;
+    /*!< IRspatialOffset[2] Spatial shift (y,x) of pixel locations for IR contamination correction*/
+    int32_t IRspatialOffset[2];
+    /*!< IRbinningFactor[2] Binning factors (y,x) for IR contamination correction*/
+    int32_t IRbinningFactor[2];
+    /*!< IRcormode IR contamination correction mode (0: disable, 1: enable)*/
+    int32_t IRcormode;
+    /*!< IRmodelSigma[3] IR contamination model sigma (R,G,B)*/
+    int32_t IRmodelSigma[3];
+    /*!< IRmodelOffset[3] IR contamination model offset (R,G,B)*/
+    int32_t IRmodelOffset[3];
+    /*!< IRmodelHeight[3] IR contamination model height (R,G,B)*/
+    int32_t IRmodelHeight[3];
+    /*!< IRmodelWidth[3] IR contamination model width (R,G,B)*/
+    int32_t IRmodelWidth[3];
+    /*!< IRmodelMax[3] IR contamination model maximum (R,G,B)*/
+    int32_t IRmodelMax[3];
+    /*!< IRmodelCUxR[12] IR contamination model configuration unit parameter set X for R channel*/
+    int32_t IRmodelCUxR[12];
+    /*!< IRmodelCUaR[11] IR contamination model configuration unit parameter set A for R channel*/
+    int32_t IRmodelCUaR[11];
+    /*!< IRmodelCUbR[11] IR contamination model configuration unit parameter set B for R channel*/
+    int32_t IRmodelCUbR[11];
+    /*!< IRmodelCUxG[12] IR contamination model configuration unit parameter set X for G channel*/
+    int32_t IRmodelCUxG[12];
+    /*!< IRmodelCUaG[11] IR contamination model configuration unit parameter set A for G channel*/
+    int32_t IRmodelCUaG[11];
+    /*!< IRmodelCUbG[11] IR contamination model configuration unit parameter set B for G channel*/
+    int32_t IRmodelCUbG[11];
+    /*!< IRmodelCUxB[12] IR contamination model configuration unit parameter set X for B channel*/
+    int32_t IRmodelCUxB[12];
+    /*!< IRmodelCUaB[11] IR contamination model configuration unit parameter set A for B channel*/
+    int32_t IRmodelCUaB[11];
+    /*!< IRmodelCUbB[11] IR contamination model configuration unit parameter set B for B channel*/
+    int32_t IRmodelCUbB[11];
+    /*!< IRinterpNeighbors11[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 11*/
+    int32_t IRinterpNeighbors11[12];
+    /*!< IRinterpNeighbors12[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 12*/
+    int32_t IRinterpNeighbors12[12];
+    /*!< IRinterpNeighbors13[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 13*/
+    int32_t IRinterpNeighbors13[12];
+    /*!< IRinterpNeighbors14[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 14*/
+    int32_t IRinterpNeighbors14[12];
+    /*!< IRinterpNeighbors21[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 21*/
+    int32_t IRinterpNeighbors21[12];
+    /*!< IRinterpNeighbors22[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 22*/
+    int32_t IRinterpNeighbors22[12];
+    /*!< IRinterpNeighbors23[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 23*/
+    int32_t IRinterpNeighbors23[12];
+    /*!< IRinterpNeighbors24[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 24*/
+    int32_t IRinterpNeighbors24[12];
+    /*!< IRinterpNeighbors31[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 31*/
+    int32_t IRinterpNeighbors31[12];
+    /*!< IRinterpNeighbors32[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 32*/
+    int32_t IRinterpNeighbors32[12];
+    /*!< IRinterpNeighbors33[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 33*/
+    int32_t IRinterpNeighbors33[12];
+    /*!< IRinterpNeighbors34[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 34*/
+    int32_t IRinterpNeighbors34[12];
+    /*!< IRinterpNeighbors41[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 41*/
+    int32_t IRinterpNeighbors41[12];
+    /*!< IRinterpNeighbors42[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 42*/
+    int32_t IRinterpNeighbors42[12];
+    /*!< IRinterpNeighbors43[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 43*/
+    int32_t IRinterpNeighbors43[12];
+    /*!< IRinterpNeighbors44[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 44*/
+    int32_t IRinterpNeighbors44[12];
+    /*!< IRscaledSensorDim[2] Scaled sensor dimensions (height,width) for IR contamination correction (optical center calculation); (1 << SHVAL)/SensorDim, for SHVAL = 24. Maximum value assumes that sensor dimensions are larger than 256*/
+    int32_t IRscaledSensorDim[2];
+    /*!< IRscaledModelSigma[3] Scaled IR contamination model sigma (R,G,B); (1 << SMVAL)/IRmodelSigma, for SMVAL = 16*/
+    int32_t IRscaledModelSigma[3];
+    /*!< NormLinLshift NormLin lshift*/
+    int32_t NormLinLshift;
+    /*!< BL[16] Black level values for 4x4 CFA repetitive pattern*/
+    int32_t BL[16];
+    /*!< DPCmode DPC mode (0: disable, 1: enable)*/
+    int32_t DPCmode;
+    /*!< DPCneighbors11[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 11*/
+    int32_t DPCneighbors11[16];
+    /*!< DPCneighbors12[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 12*/
+    int32_t DPCneighbors12[16];
+    /*!< DPCneighbors13[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 13*/
+    int32_t DPCneighbors13[16];
+    /*!< DPCneighbors14[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 14*/
+    int32_t DPCneighbors14[16];
+    /*!< DPCneighbors21[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 21*/
+    int32_t DPCneighbors21[16];
+    /*!< DPCneighbors22[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 22*/
+    int32_t DPCneighbors22[16];
+    /*!< DPCneighbors23[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 23*/
+    int32_t DPCneighbors23[16];
+    /*!< DPCneighbors24[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 24*/
+    int32_t DPCneighbors24[16];
+    /*!< DPCneighbors31[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 31*/
+    int32_t DPCneighbors31[16];
+    /*!< DPCneighbors32[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 32*/
+    int32_t DPCneighbors32[16];
+    /*!< DPCneighbors33[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 33*/
+    int32_t DPCneighbors33[16];
+    /*!< DPCneighbors34[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 34*/
+    int32_t DPCneighbors34[16];
+    /*!< DPCneighbors41[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 41*/
+    int32_t DPCneighbors41[16];
+    /*!< DPCneighbors42[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 42*/
+    int32_t DPCneighbors42[16];
+    /*!< DPCneighbors43[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 43*/
+    int32_t DPCneighbors43[16];
+    /*!< DPCneighbors44[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 44*/
+    int32_t DPCneighbors44[16];
+    /*!< DPCnoiseModel[2] Noise model {a,b} with offset term a and linear term b to calculate noise variance as a+(b*x)>>8*/
+    int32_t DPCnoiseModel[2];
+    /*!< DPCnorm[5] DPC normalization*/
+    int32_t DPCnorm[5];
+    /*!< IRblocksize_log2 log2 of IR Block size*/
+    int32_t IRblocksize_log2;
+    /*!< IRgridX IR grid width*/
+    int32_t IRgridX;
+    /*!< IRgridY IR grid height*/
+    int32_t IRgridY;
+    /*!< IRweightsR[170] IR weights (R channel)*/
+    int32_t IRweightsR[170];
+    /*!< IRweightsG[170] IR weights (G channel)*/
+    int32_t IRweightsG[170];
+    /*!< IRweightsB[170] IR weights (B channel)*/
+    int32_t IRweightsB[170];
+
+} ia_pal_isp_rgb_ir_2_1_t;
+
+/*! \isp struct rgb_ir_2_1_bbb
+RGB-IR_BBB Filter
+*/
+typedef struct
+{
+    /*!< Bypass Bypass (0,1)*/
+    int32_t Bypass;
+    /*!< CFArgbir[16] RGB-IR CFA descriptor for 4x4 repetitive pattern (0: R, 1: G, 2: B, 3: IR)*/
+    int32_t CFArgbir[16];
+    /*!< CFAbayer[4] Bayer CFA descriptor for 2x2 repetitive pattern (0: R, 1: G, 2: B)*/
+    int32_t CFAbayer[4];
+    /*!< SensorDim[2] Sensor dimensions (height,width) for IR contamination correction (optical center calculation)*/
+    int32_t SensorDim[2];
+    /*!< ImageDim[2] Image dimensions (height,width)*/
+    int32_t ImageDim[2];
+    /*!< IRimageDim[2] IR image dimensions (height,width)*/
+    int32_t IRimageDim[2];
+    /*!< IRtype Type of IR pixel layout (2: IRtype2, 1: IRtype1, 0: any other supported, -1: unsupported)*/
+    int32_t IRtype;
+    /*!< IRrefloc Pixel location corresponding to the reference (first) IR pixel within a 4x4 repetitive pattern*/
+    int32_t IRrefloc;
+    /*!< LumaWeights11[9] Filter mask for luminance calculations in CFA locations 11; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights11[9];
+    /*!< LumaWeights12[9] Filter mask for luminance calculations in CFA locations 12; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights12[9];
+    /*!< LumaWeights13[9] Filter mask for luminance calculations in CFA locations 13; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights13[9];
+    /*!< LumaWeights14[9] Filter mask for luminance calculations in CFA locations 14; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights14[9];
+    /*!< LumaWeights21[9] Filter mask for luminance calculations in CFA locations 21; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights21[9];
+    /*!< LumaWeights22[9] Filter mask for luminance calculations in CFA locations 22; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights22[9];
+    /*!< LumaWeights23[9] Filter mask for luminance calculations in CFA locations 23; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights23[9];
+    /*!< LumaWeights24[9] Filter mask for luminance calculations in CFA locations 24; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights24[9];
+    /*!< LumaWeights31[9] Filter mask for luminance calculations in CFA locations 31; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights31[9];
+    /*!< LumaWeights32[9] Filter mask for luminance calculations in CFA locations 32; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights32[9];
+    /*!< LumaWeights33[9] Filter mask for luminance calculations in CFA locations 33; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights33[9];
+    /*!< LumaWeights34[9] Filter mask for luminance calculations in CFA locations 34; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights34[9];
+    /*!< LumaWeights41[9] Filter mask for luminance calculations in CFA locations 41; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights41[9];
+    /*!< LumaWeights42[9] Filter mask for luminance calculations in CFA locations 42; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights42[9];
+    /*!< LumaWeights43[9] Filter mask for luminance calculations in CFA locations 43; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights43[9];
+    /*!< LumaWeights44[9] Filter mask for luminance calculations in CFA locations 44; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/
+    int32_t LumaWeights44[9];
+    /*!< LumaWeightSums[16] Right bit shifts equivalent to the sum of the luminance filter mask coefficients for all 16 channels (11,12,44) within 4x4 repetitive pattern.*/
+    int32_t LumaWeightSums[16];
+    /*!< BayerRestNeighbors11[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 11; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors11[8];
+    /*!< BayerRestNeighbors12[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 12; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors12[8];
+    /*!< BayerRestNeighbors13[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations ; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors13[8];
+    /*!< BayerRestNeighbors14[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 14; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors14[8];
+    /*!< BayerRestNeighbors21[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 21; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors21[8];
+    /*!< BayerRestNeighbors22[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 22; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors22[8];
+    /*!< BayerRestNeighbors23[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 23; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors23[8];
+    /*!< BayerRestNeighbors24[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 24; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors24[8];
+    /*!< BayerRestNeighbors31[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 31; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors31[8];
+    /*!< BayerRestNeighbors32[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 32; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors32[8];
+    /*!< BayerRestNeighbors33[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 33; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors33[8];
+    /*!< BayerRestNeighbors34[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 34; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors34[8];
+    /*!< BayerRestNeighbors41[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 41; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors41[8];
+    /*!< BayerRestNeighbors42[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 42; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors42[8];
+    /*!< BayerRestNeighbors43[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 43; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors43[8];
+    /*!< BayerRestNeighbors44[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 44; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/
+    int32_t BayerRestNeighbors44[8];
+    /*!< BayerRestLuma Disable the use of the luminance in Bayer CFA restoration (0: disable, 1: enable)*/
+    int32_t BayerRestLuma;
+    /*!< BayerRestWeights Disable the use of the weights in Bayer CFA restoration (0: disable, 1: enable)*/
+    int32_t BayerRestWeights;
+    /*!< IRspatialOffset[2] Spatial shift (y,x) of pixel locations for IR contamination correction*/
+    int32_t IRspatialOffset[2];
+    /*!< IRbinningFactor[2] Binning factors (y,x) for IR contamination correction*/
+    int32_t IRbinningFactor[2];
+    /*!< IRcormode IR contamination correction mode (0: disable, 1: enable)*/
+    int32_t IRcormode;
+    /*!< IRmodelSigma[3] IR contamination model sigma (R,G,B)*/
+    int32_t IRmodelSigma[3];
+    /*!< IRmodelOffset[3] IR contamination model offset (R,G,B)*/
+    int32_t IRmodelOffset[3];
+    /*!< IRmodelHeight[3] IR contamination model height (R,G,B)*/
+    int32_t IRmodelHeight[3];
+    /*!< IRmodelWidth[3] IR contamination model width (R,G,B)*/
+    int32_t IRmodelWidth[3];
+    /*!< IRmodelMax[3] IR contamination model maximum (R,G,B)*/
+    int32_t IRmodelMax[3];
+    /*!< IRmodelCUxR[12] IR contamination model configuration unit parameter set X for R channel*/
+    int32_t IRmodelCUxR[12];
+    /*!< IRmodelCUaR[11] IR contamination model configuration unit parameter set A for R channel*/
+    int32_t IRmodelCUaR[11];
+    /*!< IRmodelCUbR[11] IR contamination model configuration unit parameter set B for R channel*/
+    int32_t IRmodelCUbR[11];
+    /*!< IRmodelCUxG[12] IR contamination model configuration unit parameter set X for G channel*/
+    int32_t IRmodelCUxG[12];
+    /*!< IRmodelCUaG[11] IR contamination model configuration unit parameter set A for G channel*/
+    int32_t IRmodelCUaG[11];
+    /*!< IRmodelCUbG[11] IR contamination model configuration unit parameter set B for G channel*/
+    int32_t IRmodelCUbG[11];
+    /*!< IRmodelCUxB[12] IR contamination model configuration unit parameter set X for B channel*/
+    int32_t IRmodelCUxB[12];
+    /*!< IRmodelCUaB[11] IR contamination model configuration unit parameter set A for B channel*/
+    int32_t IRmodelCUaB[11];
+    /*!< IRmodelCUbB[11] IR contamination model configuration unit parameter set B for B channel*/
+    int32_t IRmodelCUbB[11];
+    /*!< IRinterpNeighbors11[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 11*/
+    int32_t IRinterpNeighbors11[12];
+    /*!< IRinterpNeighbors12[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 12*/
+    int32_t IRinterpNeighbors12[12];
+    /*!< IRinterpNeighbors13[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 13*/
+    int32_t IRinterpNeighbors13[12];
+    /*!< IRinterpNeighbors14[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 14*/
+    int32_t IRinterpNeighbors14[12];
+    /*!< IRinterpNeighbors21[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 21*/
+    int32_t IRinterpNeighbors21[12];
+    /*!< IRinterpNeighbors22[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 22*/
+    int32_t IRinterpNeighbors22[12];
+    /*!< IRinterpNeighbors23[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 23*/
+    int32_t IRinterpNeighbors23[12];
+    /*!< IRinterpNeighbors24[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 24*/
+    int32_t IRinterpNeighbors24[12];
+    /*!< IRinterpNeighbors31[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 31*/
+    int32_t IRinterpNeighbors31[12];
+    /*!< IRinterpNeighbors32[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 32*/
+    int32_t IRinterpNeighbors32[12];
+    /*!< IRinterpNeighbors33[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 33*/
+    int32_t IRinterpNeighbors33[12];
+    /*!< IRinterpNeighbors34[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 34*/
+    int32_t IRinterpNeighbors34[12];
+    /*!< IRinterpNeighbors41[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 41*/
+    int32_t IRinterpNeighbors41[12];
+    /*!< IRinterpNeighbors42[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 42*/
+    int32_t IRinterpNeighbors42[12];
+    /*!< IRinterpNeighbors43[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 43*/
+    int32_t IRinterpNeighbors43[12];
+    /*!< IRinterpNeighbors44[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 44*/
+    int32_t IRinterpNeighbors44[12];
+    /*!< IRscaledSensorDim[2] Scaled sensor dimensions (height,width) for IR contamination correction (optical center calculation); (1 << SHVAL)/SensorDim, for SHVAL = 24. Maximum value assumes that sensor dimensions are larger than 256*/
+    int32_t IRscaledSensorDim[2];
+    /*!< IRscaledModelSigma[3] Scaled IR contamination model sigma (R,G,B); (1 << SMVAL)/IRmodelSigma, for SMVAL = 16*/
+    int32_t IRscaledModelSigma[3];
+    /*!< NormLinLshift NormLin lshift*/
+    int32_t NormLinLshift;
+    /*!< BL[16] Black level values for 4x4 CFA repetitive pattern*/
+    int32_t BL[16];
+    /*!< DPCmode DPC mode (0: disable, 1: enable)*/
+    int32_t DPCmode;
+    /*!< DPCneighbors11[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 11*/
+    int32_t DPCneighbors11[16];
+    /*!< DPCneighbors12[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 12*/
+    int32_t DPCneighbors12[16];
+    /*!< DPCneighbors13[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 13*/
+    int32_t DPCneighbors13[16];
+    /*!< DPCneighbors14[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 14*/
+    int32_t DPCneighbors14[16];
+    /*!< DPCneighbors21[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 21*/
+    int32_t DPCneighbors21[16];
+    /*!< DPCneighbors22[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 22*/
+    int32_t DPCneighbors22[16];
+    /*!< DPCneighbors23[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 23*/
+    int32_t DPCneighbors23[16];
+    /*!< DPCneighbors24[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 24*/
+    int32_t DPCneighbors24[16];
+    /*!< DPCneighbors31[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 31*/
+    int32_t DPCneighbors31[16];
+    /*!< DPCneighbors32[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 32*/
+    int32_t DPCneighbors32[16];
+    /*!< DPCneighbors33[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 33*/
+    int32_t DPCneighbors33[16];
+    /*!< DPCneighbors34[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 34*/
+    int32_t DPCneighbors34[16];
+    /*!< DPCneighbors41[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 41*/
+    int32_t DPCneighbors41[16];
+    /*!< DPCneighbors42[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 42*/
+    int32_t DPCneighbors42[16];
+    /*!< DPCneighbors43[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 43*/
+    int32_t DPCneighbors43[16];
+    /*!< DPCneighbors44[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 44*/
+    int32_t DPCneighbors44[16];
+    /*!< DPCnoiseModel[2] Noise model {a,b} with offset term a and linear term b to calculate noise variance as a+(b*x)>>8*/
+    int32_t DPCnoiseModel[2];
+    /*!< IRbinningH Horizontal binning IR output (0 no-binning, 1 2x horizontal binning)*/
+    int32_t IRbinningH;
+    /*!< IRbinningV Vertical binning IR output (0 no-binning, 1 2x vertical binning)*/
+    int32_t IRbinningV;
+    /*!< OutputMode Output Mode (0 bayer, 1 ir)*/
+    int32_t OutputMode;
+    /*!< block_dim Block_dimension (WxH). Log2 block dimension of each grid cell (8x8,16x16,32x32,64x64,128x128, 256x256)*/
+    int32_t block_dim;
+    /*!< awb_en Enable IR AWB statistics output (0 disable, 1 enable)*/
+    int32_t awb_en;
+    /*!< shftr_val Shift right average value. Derived from log2 number of pixels in a cell). Note: 1) RGB_IR_2_1 AWB works internally with U11 input. 2) Val will be clipped to U15 after shift*/
+    int32_t shftr_val;
+    /*!< shftr_sat Shift right saturation. Represents log2(num of pixels in cell). Note: Sat value will be clipped to U8 after shift.*/
+    int32_t shftr_sat;
+    /*!< rgbs_thr Threshold value for IR saturation calculation. Note: RGB_IR_2_1 AWB works internally with U11 input, so limit max value to (1<<11)-1'))*/
+    int32_t rgbs_thr;
+    /*!< DPCnorm[5] DPC normalization*/
+    int32_t DPCnorm[5];
+    /*!< IRblocksize_log2 log2 of IR Block size*/
+    int32_t IRblocksize_log2;
+    /*!< IRgridX IR grid width*/
+    int32_t IRgridX;
+    /*!< IRgridY IR grid height*/
+    int32_t IRgridY;
+    /*!< IRweightsR[170] IR weights (R channel)*/
+    int32_t IRweightsR[170];
+    /*!< IRweightsG[170] IR weights (G channel)*/
+    int32_t IRweightsG[170];
+    /*!< IRweightsB[170] IR weights (B channel)*/
+    int32_t IRweightsB[170];
+
+} ia_pal_isp_rgb_ir_2_1_bbb_t;
+
+/*! \isp struct rgbs_grid_1_0
+RGBS grid (AWB statistics)
+*/
+typedef struct
+{
+    /*!< grid_width represents number of horizontal grid cells*/
+    int32_t grid_width;
+    /*!< grid_height represents number of vertical grid cells*/
+    int32_t grid_height;
+    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128)*/
+    int32_t block_width;
+    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128)*/
+    int32_t block_height;
+    /*!< min_out_bytes_per_cell Minimum bytes per grid cell in output buffer (pad with '0's in MSB side if not met otherwise)*/
+    int32_t min_out_bytes_per_cell;
+    /*!< rgbs_en 0: FF will not write to the RGBS array; 1: FF will write*/
+    int32_t rgbs_en;
+    /*!< rgbs_incl_sat 0: do not include saturated quads in the average; 1: include saturated quads in the average*/
+    int32_t rgbs_incl_sat;
+    /*!< x_start X top left corner of the grid. 0 <= x_start <= (frame_width - 1)*/
+    int32_t x_start;
+    /*!< y_start Y top left corner of the grid. 0 <= y_start <= (frame_height - 1)*/
+    int32_t y_start;
+    /*!< x_end X bottom right corner of the grid. x_end = x_start + (grid_width << block_width) - 1*/
+    int32_t x_end;
+    /*!< y_end Y bottom right corner of the grid. y_end = y_start + (grid_height << block_height) - 1*/
+    int32_t y_end;
+    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/
+    int32_t sensor_mode;
+    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_00;
+    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_01;
+    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_02;
+    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_03;
+    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_10;
+    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_11;
+    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_12;
+    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_13;
+    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_20;
+    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_21;
+    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_22;
+    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_23;
+    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_30;
+    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_31;
+    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_32;
+    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_33;
+    /*!< rgbs_thr_cx[8] RGBS threshold value (C0, C1, C2, C3, C4, C5, C6, C7)*/
+    int32_t rgbs_thr_cx[8];
+    /*!< shftr_val_cx[8] ShiftVal is derived from log2(number of pixels from C0-C7 color channel in a cell)*/
+    int32_t shftr_val_cx[8];
+    /*!< shftr_sat represents log2(num of pixels in cell)*/
+    int32_t shftr_sat;
+    /*!< output_packed Enabling Output packing. Use 0 if ColorID [0 3] are used, Use 1 if all ColorIDs i.e. [0 7] are used (i.e. multi-exposure (e.g. SVE) use-cases)*/
+    int32_t output_packed;
+    /*!< copy_out_components bit0: copy_enable_colorid0, bit1..3: copy_src_colorid, bit4: copy_enable_colorid1, bit5..7: copy_src_colorid, ... , bit28: copy_enable_colorid7, bit29..31: copy_src_colorid*/
+    uint32_t copy_out_components;
+
+} ia_pal_isp_rgbs_grid_1_0_t;
+
+/*! \isp struct rgbs_statistics_1_0
+
+*/
+typedef struct
+{
+    /*!< grid_width represents number of horizontal grid cells*/
+    int32_t grid_width;
+    /*!< grid_height represents number of vertical grid cells*/
+    int32_t grid_height;
+    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128)*/
+    int32_t block_width;
+    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128)*/
+    int32_t block_height;
+    /*!< grid_height_per_slice # of blocks in vert.axis per Meta-Data Slice (grid_height_per_slice * grid_width <= 192)*/
+    int32_t grid_height_per_slice;
+    /*!< awb_en 0: FF will not write to the AWB  array; 1: FF will write*/
+    int32_t awb_en;
+    /*!< rgbs_incl_sat 0: do not include saturated quads in the average; 1: include saturated quads in the average*/
+    int32_t rgbs_incl_sat;
+    /*!< x_start X top left corner of the grid. 0 <= x_start <= (frame_width - 1)*/
+    int32_t x_start;
+    /*!< y_start Y top left corner of the grid. 0 <= y_start <= (frame_height - 1)*/
+    int32_t y_start;
+    /*!< x_end X bottom right corner of the grid. x_end = x_start + (grid_width << block_width) - 1*/
+    int32_t x_end;
+    /*!< y_end Y bottom right corner of the grid. y_end = y_start + (grid_height << block_height) - 1*/
+    int32_t y_end;
+    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/
+    int32_t sensor_mode;
+    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_00;
+    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_01;
+    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_02;
+    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_03;
+    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_10;
+    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_11;
+    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_12;
+    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_13;
+    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_20;
+    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_21;
+    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_22;
+    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_23;
+    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_30;
+    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_31;
+    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_32;
+    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/
+    int32_t pat_33;
+    /*!< rgbs_thr_cx[8] RGBS threshold value (C0, C1, C2, C3, C4, C5, C6, C7)*/
+    int32_t rgbs_thr_cx[8];
+    /*!< shftr_val_cx[8] ShiftVal is derived from log2(number of pixels from C0-C7 color channel in a cell)*/
+    int32_t shftr_val_cx[8];
+    /*!< shftr_sat Shifter for saturation grid. Represents log2(num of pixels in cell) + 1. In SVE/RGB-IR use cases represent the shifter for saturation grid 0. In SVE, this correspond to long exposure colorIDs[0-3]. In RGB-IR this correspond to RGB colorID[0-2]*/
+    int32_t shftr_sat;
+    /*!< output_packed Enabling Output packing. Use 0 if ColorID [0 3] are used, Use 1 if all ColorIDs i.e. [0 7] are used (i.e. multi-exposure (e.g. SVE) use-cases)*/
+    int32_t output_packed;
+    /*!< output_sat_packed Enabling Saturation Output packing for SVE & RGB-IR so that two saturation grids can be used to represent short/long in SVE and  RGB/IR in RGB-IR use cases.*/
+    int32_t output_sat_packed;
+    /*!< cx_sat_id mapping of ColorIDs 0-7 to saturation grid 0(long exp) or 1(short exp/IR)*/
+    int32_t cx_sat_id;
+    /*!< shftr_sat_1 Shifter for saturation grid 1. Used only in SVE & RGB-IR. In SVE, this correspond to short exposure colorIDs[4-7]. In RGB-IR this correspond to IR colorID[3]. Represents log2(num of pixels in cell) + 1.*/
+    int32_t shftr_sat_1;
+
+} ia_pal_isp_rgbs_statistics_1_0_t;
+
+/*! \isp struct sc_iefd
+
+*/
+typedef struct
+{
+    /*!< bypass Block bypass for HW use*/
+    int32_t bypass;
+    /*!< horver_diag_coeff Coefficient that compensates for different distnace of vertical/horizontal and diagonal gradient metric*/
+    int32_t horver_diag_coeff;
+    /*!< ed_horver_diag_coeff Coefficient that compensates for different distnace of vertical/horizontal and diagonal edge metric*/
+    int32_t ed_horver_diag_coeff;
+    /*!< dir_far_sharp_w Weight of wide kernel direct sharpening*/
+    int32_t dir_far_sharp_w;
+    /*!< dir_far_dns_w Weight of wide kernel direct denoising*/
+    int32_t dir_far_dns_w;
+    /*!< ndir_dns_power Power of non-direct denoising*/
+    int32_t ndir_dns_power;
+    /*!< shrpn_posi_lmt_dir Overshoot limit for edge*/
+    int32_t shrpn_posi_lmt_dir;
+    /*!< shrpn_nega_lmt_dir Undershoot limit for edge*/
+    int32_t shrpn_nega_lmt_dir;
+    /*!< shrpn_posi_lmt_txt Overshoot limit for texture*/
+    int32_t shrpn_posi_lmt_txt;
+    /*!< shrpn_nega_lmt_txt Undershoot limit for texture*/
+    int32_t shrpn_nega_lmt_txt;
+    /*!< clamp_stitch Slope to stitch between clamped and unclamped edge values*/
+    int32_t clamp_stitch;
+    /*!< denoise_en Denoise enable flag*/
+    int32_t denoise_en;
+    /*!< cu6_ndir_shrpn_pwr Power of direct sharpening*/
+    int32_t cu6_ndir_shrpn_pwr;
+    /*!< cuunsharpen_power Power of unsharp-mask sharpening*/
+    int32_t cuunsharpen_power;
+    /*!< unsharp_weight Blending weight between unsharp-mask and direct sharpening*/
+    int32_t unsharp_weight;
+    /*!< unsharp_amount Unsharp-mask extra sharpening power*/
+    int32_t unsharp_amount;
+    /*!< direct_metric_update Update coefficient for direction metric with 2nd direction*/
+    int32_t direct_metric_update;
+    /*!< directional_smooth_en Enable smoothing of best direction with second best direction*/
+    int32_t directional_smooth_en;
+    /*!< rad_enable Enable radial dependency flag*/
+    int32_t rad_enable;
+    /*!< rad_xreset Radial reset of  x (width)*/
+    int32_t rad_xreset;
+    /*!< rad_yreset Radial reset of y (height)*/
+    int32_t rad_yreset;
+    /*!< rad_x2reset Radial reset of x^2 (width^2)*/
+    int32_t rad_x2reset;
+    /*!< rad_y2reset Radial reset of y^2 (height^2)*/
+    int32_t rad_y2reset;
+    /*!< rad_nf Scaling down factor of radius^2*/
+    int32_t rad_nf;
+    /*!< rad_inv_r2 Normalization factor of inverse of radius^2*/
+    int32_t rad_inv_r2;
+    /*!< rad_dir_far_sharp_w Weight of wide kernel direct sharpening in the periphery*/
+    int32_t rad_dir_far_sharp_w;
+    /*!< rad_cu6_ndir_shrpn_pwr Power of direct sharpening n the periphery*/
+    int32_t rad_cu6_ndir_shrpn_pwr;
+    /*!< rad_cuun_shrpn_pwr Power of unsharp-mask sharpening in the periphery*/
+    int32_t rad_cuun_shrpn_pwr;
+    /*!< rad_cu6_x1 X1 point of ConfigUnit1 in the periphery*/
+    int32_t rad_cu6_x1;
+    /*!< rad_cuunshrp_x1 X1 point of ConfigUnitUnsharpMask in the periphery*/
+    int32_t rad_cuunshrp_x1;
+    /*!< rad_dir_far_dns_w Weight of wide kernel direct denoising in the periphery*/
+    int32_t rad_dir_far_dns_w;
+    /*!< rad_ndir_dns_power Power of non-direct denoising in the periphery*/
+    int32_t rad_ndir_dns_power;
+    /*!< vssnlm_enable Enable of edge denoising flag*/
+    int32_t vssnlm_enable;
+    /*!< vs_x0 Edge denoising LUT x0*/
+    int32_t vs_x0;
+    /*!< vs_x1 Edge denoising LUT x1*/
+    int32_t vs_x1;
+    /*!< vs_x2 Edge denoising LUT x2*/
+    int32_t vs_x2;
+    /*!< vs_y1 Edge denoising LUT y0*/
+    int32_t vs_y1;
+    /*!< vs_y2 Edge denoising LUT y1*/
+    int32_t vs_y2;
+    /*!< vs_y3 Edge denoising LUT y2*/
+    int32_t vs_y3;
+    /*!< unsharpfilter[15] Unsharp-mask filter coefficients*/
+    int32_t unsharpfilter[15];
+    /*!< denoisefilter[6] Denoising filter coefficients*/
+    int32_t denoisefilter[6];
+    /*!< configunit1_x[2] CU1 x points*/
+    int32_t configunit1_x[2];
+    /*!< configunit1_slope[1] CU1 slope vlaues*/
+    int32_t configunit1_slope[1];
+    /*!< configunit3_x[2] CU3 x points*/
+    int32_t configunit3_x[2];
+    /*!< configunit3_slope[1] CU3 slope vlaues*/
+    int32_t configunit3_slope[1];
+    /*!< configunit5_x[2] CU5 x points*/
+    int32_t configunit5_x[2];
+    /*!< configunit5_y[1] CU5 y points*/
+    int32_t configunit5_y[1];
+    /*!< configunit5_slope[1] CU5 x slope values*/
+    int32_t configunit5_slope[1];
+    /*!< configunit6_opt_x[4] CU6 x points*/
+    int32_t configunit6_opt_x[4];
+    /*!< configunit6_opt_y[3] CU6 y points*/
+    int32_t configunit6_opt_y[3];
+    /*!< configunit6_opt_slope[3] CU6 slope values*/
+    int32_t configunit6_opt_slope[3];
+    /*!< configunit7_x[2] CU7 x points*/
+    int32_t configunit7_x[2];
+    /*!< configunit7_slope[1] CU7 slope vlaues*/
+    int32_t configunit7_slope[1];
+    /*!< configunited_x[6] CU_ED x points*/
+    int32_t configunited_x[6];
+    /*!< configunited_y[5] CU_ED y points*/
+    int32_t configunited_y[5];
+    /*!< configunited_slope[5] CU_ED slope vlaues*/
+    int32_t configunited_slope[5];
+    /*!< configunitunsharp_opt_x[4] CU_UnsharpMask x points*/
+    int32_t configunitunsharp_opt_x[4];
+    /*!< configunitunsharp_opt_y[3] CU_UnsharpMask y points*/
+    int32_t configunitunsharp_opt_y[3];
+    /*!< configunitunsharp_opt_slope[3] CU_UnsharpMask slope vlaues*/
+    int32_t configunitunsharp_opt_slope[3];
+    /*!< configunitradial_x[6] CU_RAD x points*/
+    int32_t configunitradial_x[6];
+    /*!< configunitradial_y[5] CU_RAD y points*/
+    int32_t configunitradial_y[5];
+    /*!< configunitradial_slope[5] CU_RAD slope vlaues*/
+    int32_t configunitradial_slope[5];
+    /*!< configunitvssnlm_x[2] CU_VSSNLM x points*/
+    int32_t configunitvssnlm_x[2];
+    /*!< configunitvssnlm_slope[1] C_VSSNLM slope vlaues*/
+    int32_t configunitvssnlm_slope[1];
+
+} ia_pal_isp_sc_iefd_t;
+
+/*! \isp struct sc_iefd_v2
+
+*/
+typedef struct
+{
+    /*!< enable Block enable for HW use*/
+    int32_t enable;
+    /*!< horver_diag_coeff Coefficient that compensates for different distnace of vertical/horizontal and diagonal gradient metric*/
+    int32_t horver_diag_coeff;
+    /*!< ed_horver_diag_coeff Coefficient that compensates for different distnace of vertical/horizontal and diagonal edge metric*/
+    int32_t ed_horver_diag_coeff;
+    /*!< dir_far_sharp_w Weight of wide kernel direct sharpening*/
+    int32_t dir_far_sharp_w;
+    /*!< dir_far_dns_w Weight of wide kernel direct denoising*/
+    int32_t dir_far_dns_w;
+    /*!< ndir_dns_power Power of non-direct denoising*/
+    int32_t ndir_dns_power;
+    /*!< shrpn_posi_lmt_dir Overshoot limit for edge*/
+    int32_t shrpn_posi_lmt_dir;
+    /*!< shrpn_nega_lmt_dir Undershoot limit for edge*/
+    int32_t shrpn_nega_lmt_dir;
+    /*!< shrpn_posi_lmt_txt Overshoot limit for texture*/
+    int32_t shrpn_posi_lmt_txt;
+    /*!< shrpn_nega_lmt_txt Undershoot limit for texture*/
+    int32_t shrpn_nega_lmt_txt;
+    /*!< clamp_stitch Slope to stitch between clamped and unclamped edge values*/
+    int32_t clamp_stitch;
+    /*!< denoise_en Denoise enable flag*/
+    int32_t denoise_en;
+    /*!< cu6_ndir_shrpn_pwr Power of direct sharpening*/
+    int32_t cu6_ndir_shrpn_pwr;
+    /*!< cuunsharpen_power Power of unsharp-mask sharpening*/
+    int32_t cuunsharpen_power;
+    /*!< unsharp_weight Blending weight between unsharp-mask and direct sharpening*/
+    int32_t unsharp_weight;
+    /*!< unsharp_amount Unsharp-mask extra sharpening power*/
+    int32_t unsharp_amount;
+    /*!< direct_metric_update Update coefficient for direction metric with 2nd direction*/
+    int32_t direct_metric_update;
+    /*!< directional_smooth_en Enable smoothing of best direction with second best direction*/
+    int32_t directional_smooth_en;
+    /*!< rad_enable Enable radial dependency flag*/
+    int32_t rad_enable;
+    /*!< rad_xreset Radial reset of  x (width)*/
+    int32_t rad_xreset;
+    /*!< rad_yreset Radial reset of y (height)*/
+    int32_t rad_yreset;
+    /*!< rad_x2reset Radial reset of x^2 (width^2)*/
+    int32_t rad_x2reset;
+    /*!< rad_y2reset Radial reset of y^2 (height^2)*/
+    int32_t rad_y2reset;
+    /*!< rad_nf Scaling down factor of radius^2*/
+    int32_t rad_nf;
+    /*!< rad_inv_r2 Normalization factor of inverse of radius^2*/
+    int32_t rad_inv_r2;
+    /*!< rad_dir_far_sharp_w Weight of wide kernel direct sharpening in the periphery*/
+    int32_t rad_dir_far_sharp_w;
+    /*!< rad_cu6_ndir_shrpn_pwr Power of direct sharpening n the periphery*/
+    int32_t rad_cu6_ndir_shrpn_pwr;
+    /*!< rad_cuun_shrpn_pwr Power of unsharp-mask sharpening in the periphery*/
+    int32_t rad_cuun_shrpn_pwr;
+    /*!< rad_cu6_x1 X1 point of ConfigUnit1 in the periphery*/
+    int32_t rad_cu6_x1;
+    /*!< rad_cuunshrp_x1 X1 point of ConfigUnitUnsharpMask in the periphery*/
+    int32_t rad_cuunshrp_x1;
+    /*!< rad_dir_far_dns_w Weight of wide kernel direct denoising in the periphery*/
+    int32_t rad_dir_far_dns_w;
+    /*!< rad_ndir_dns_power Power of non-direct denoising in the periphery*/
+    int32_t rad_ndir_dns_power;
+    /*!< vssnlm_enable Enable of edge denoising flag*/
+    int32_t vssnlm_enable;
+    /*!< vs_x0 Edge denoising LUT x0*/
+    int32_t vs_x0;
+    /*!< vs_x1 Edge denoising LUT x1*/
+    int32_t vs_x1;
+    /*!< vs_x2 Edge denoising LUT x2*/
+    int32_t vs_x2;
+    /*!< vs_y1 Edge denoising LUT y0*/
+    int32_t vs_y1;
+    /*!< vs_y2 Edge denoising LUT y1*/
+    int32_t vs_y2;
+    /*!< vs_y3 Edge denoising LUT y2*/
+    int32_t vs_y3;
+    /*!< unsharpfilter[15] Unsharp-mask filter coefficients*/
+    int32_t unsharpfilter[15];
+    /*!< denoisefilter[6] Denoising filter coefficients*/
+    int32_t denoisefilter[6];
+    /*!< configunit1_x[2] CU1 x points*/
+    int32_t configunit1_x[2];
+    /*!< configunit1_slope[1] CU1 slope values*/
+    int32_t configunit1_slope[1];
+    /*!< configunit3_x[2] CU3 x points*/
+    int32_t configunit3_x[2];
+    /*!< configunit3_slope[1] CU3 slope values*/
+    int32_t configunit3_slope[1];
+    /*!< configunit5_x[2] CU5 x points*/
+    int32_t configunit5_x[2];
+    /*!< configunit5_y[1] CU5 y points*/
+    int32_t configunit5_y[1];
+    /*!< configunit5_slope[1] CU5 x slope values*/
+    int32_t configunit5_slope[1];
+    /*!< configunit6_opt_x[4] CU6 x points*/
+    int32_t configunit6_opt_x[4];
+    /*!< configunit6_opt_y[3] CU6 y points*/
+    int32_t configunit6_opt_y[3];
+    /*!< configunit6_opt_slope[3] CU6 slope values*/
+    int32_t configunit6_opt_slope[3];
+    /*!< configunit7_x[2] CU7 x points*/
+    int32_t configunit7_x[2];
+    /*!< configunit7_slope[1] CU7 slope vlaues*/
+    int32_t configunit7_slope[1];
+    /*!< configunited_x[6] CU_ED x points*/
+    int32_t configunited_x[6];
+    /*!< configunited_y[5] CU_ED y points*/
+    int32_t configunited_y[5];
+    /*!< configunited_slope[5] CU_ED slope values*/
+    int32_t configunited_slope[5];
+    /*!< configunitunsharp_opt_x[4] CU_UnsharpMask x points*/
+    int32_t configunitunsharp_opt_x[4];
+    /*!< configunitunsharp_opt_y[3] CU_UnsharpMask y points*/
+    int32_t configunitunsharp_opt_y[3];
+    /*!< configunitunsharp_opt_slope[3] CU_UnsharpMask slope values*/
+    int32_t configunitunsharp_opt_slope[3];
+    /*!< configunitradial_x[6] CU_RAD x points*/
+    int32_t configunitradial_x[6];
+    /*!< configunitradial_y[5] CU_RAD y points*/
+    int32_t configunitradial_y[5];
+    /*!< configunitradial_slope[5] CU_RAD slope values*/
+    int32_t configunitradial_slope[5];
+    /*!< configunitvssnlm_x[2] CU_VSSNLM x points*/
+    int32_t configunitvssnlm_x[2];
+    /*!< configunitvssnlm_slope[1] CU_VSSNLM slope values*/
+    int32_t configunitvssnlm_slope[1];
+    /*!< configunitusmpownorm_x[6] CU_USM_POW x points*/
+    int32_t configunitusmpownorm_x[6];
+    /*!< configunitusmpownorm_y[5] CU_USM_POW y points*/
+    int32_t configunitusmpownorm_y[5];
+    /*!< configunitusmpownorm_slope[5] CU_USM_POW slope values*/
+    int32_t configunitusmpownorm_slope[5];
+    /*!< unsharpmet Enable gradient protection*/
+    int32_t unsharpmet;
+    /*!< gradth Threshold for zeroing derivative*/
+    int32_t gradth;
+
+} ia_pal_isp_sc_iefd_v2_t;
+
+/*! \isp struct sc_outputscaler_dp
+
+*/
+typedef struct
+{
+    /*!< bypass bypass the scaler*/
+    int32_t bypass;
+    /*!< block_width Horizontal size of output block*/
+    int32_t block_width;
+    /*!< block_height Vertical size of output block*/
+    int32_t block_height;
+    /*!< chunk_width Horizontal size of input chunk*/
+    int32_t chunk_width;
+    /*!< chunk_height Vertical size of input chunk*/
+    int32_t chunk_height;
+    /*!< input_image_y_start_column AKA 'Start column' of the Y plane: support for left croping. Always 0 unless striping mode is applied.*/
+    int32_t input_image_y_start_column;
+    /*!< input_image_uv_start_column AKA 'Start column' of the UV plane: support for left croping. Always 0 unless striping mode is applied.*/
+    int32_t input_image_uv_start_column;
+    /*!< in_width_y Width of the input image Y plane (in pixels)*/
+    int32_t in_width_y;
+    /*!< in_height_y Height of the input image Y plane (in pixels)*/
+    int32_t in_height_y;
+    /*!< in_width_uv Width of the input image UV plane (in pixels)*/
+    int32_t in_width_uv;
+    /*!< in_height_uv Height of the input image UV plane (in pixels)*/
+    int32_t in_height_uv;
+    /*!< out_width_y Width of the output image Y plane (in pixels)*/
+    int32_t out_width_y;
+    /*!< out_height_y Height of the output image Y plane (in pixels)*/
+    int32_t out_height_y;
+    /*!< out_width_uv Width of the output image UV plane (in pixels)*/
+    int32_t out_width_uv;
+    /*!< out_height_uv Height of the output image UV plane (in pixels)*/
+    int32_t out_height_uv;
+    /*!< updown_sel Processing mode: 0-bypass. 1-upscale. 2-downscale*/
+    int32_t updown_sel;
+    /*!< coeff_lut_y[128] Polyphase Y look-up table*/
+    int32_t coeff_lut_y[128];
+    /*!< coeff_lut_uv[64] Polyphase U/V look-up table*/
+    int32_t coeff_lut_uv[64];
+    /*!< scaling_ratio AKA 'phase_step' - defines up- or downscaling factor. For up-scaling minimum is 682 and for down scaling minimum is 171. maximum is for both 2048.*/
+    int32_t scaling_ratio;
+    /*!< phase_init_y_top Starting phase of polyphase Y filter on top image boundary*/
+    int32_t phase_init_y_top;
+    /*!< phase_init_y_left Starting phase of polyphase Y filter on left image boundary*/
+    int32_t phase_init_y_left;
+    /*!< phase_init_uv_top Starting phase of polyphase U/V filter on top image boundary*/
+    int32_t phase_init_uv_top;
+    /*!< phase_init_uv_left Starting phase of polyphase U/V filter on left image boundary*/
+    int32_t phase_init_uv_left;
+    /*!< pad_left_y Image left padding: Y component*/
+    int32_t pad_left_y;
+    /*!< pad_left_uv Image left padding: U/V components*/
+    int32_t pad_left_uv;
+    /*!< pad_right_y Image right padding: Y component*/
+    int32_t pad_right_y;
+    /*!< pad_right_uv Image right padding: U/V components*/
+    int32_t pad_right_uv;
+    /*!< pad_top_y Image top padding: Y component*/
+    int32_t pad_top_y;
+    /*!< pad_top_uv Image top padding: U/V components*/
+    int32_t pad_top_uv;
+    /*!< pad_bttm_y Image bottom padding: Y component*/
+    int32_t pad_bttm_y;
+    /*!< pad_bttm_uv Image bottom padding: U/V components*/
+    int32_t pad_bttm_uv;
+    /*!< exp_shift Scaling filter coefficients exponent shift*/
+    int32_t exp_shift;
+    /*!< output0_out_y_left_crop Left cropping of filter output Y plane*/
+    int32_t output0_out_y_left_crop;
+    /*!< output0_out_uv_left_crop Left cropping of filter output U/V planes*/
+    int32_t output0_out_uv_left_crop;
+    /*!< output0_out_y_top_crop Top cropping of filter output Y plane*/
+    int32_t output0_out_y_top_crop;
+    /*!< output0_out_uv_top_crop Top cropping of filter output U/V planes*/
+    int32_t output0_out_uv_top_crop;
+
+} ia_pal_isp_sc_outputscaler_dp_t;
+
+/*! \isp struct sc_outputscaler_dp_1_1
+
+*/
+typedef struct
+{
+    /*!< bypass bypass the scaler*/
+    int32_t bypass;
+    /*!< block_width Horizontal size of output block*/
+    int32_t block_width;
+    /*!< block_height Vertical size of output block*/
+    int32_t block_height;
+    /*!< chunk_width Horizontal size of input chunk*/
+    int32_t chunk_width;
+    /*!< chunk_height Vertical size of input chunk*/
+    int32_t chunk_height;
+    /*!< input_image_y_start_column AKA 'Start column' of the Y plane: support for left croping. Always 0 unless striping mode is applied.*/
+    int32_t input_image_y_start_column;
+    /*!< input_image_uv_start_column AKA 'Start column' of the UV plane: support for left croping. Always 0 unless striping mode is applied.*/
+    int32_t input_image_uv_start_column;
+    /*!< in_width_y Width of the input image Y plane (in pixels)*/
+    int32_t in_width_y;
+    /*!< in_height_y Height of the input image Y plane (in pixels)*/
+    int32_t in_height_y;
+    /*!< in_width_uv Width of the input image UV plane (in pixels)*/
+    int32_t in_width_uv;
+    /*!< in_height_uv Height of the input image UV plane (in pixels)*/
+    int32_t in_height_uv;
+    /*!< out_width_y Width of the output image Y plane (in pixels)*/
+    int32_t out_width_y;
+    /*!< out_height_y Height of the output image Y plane (in pixels)*/
+    int32_t out_height_y;
+    /*!< out_width_uv Width of the output image UV plane (in pixels)*/
+    int32_t out_width_uv;
+    /*!< out_height_uv Height of the output image UV plane (in pixels)*/
+    int32_t out_height_uv;
+    /*!< updown_sel Processing mode: 0-bypass. 1-upscale. 2-downscale*/
+    int32_t updown_sel;
+    /*!< coeff_lut_y[128] Polyphase Y look-up table*/
+    int32_t coeff_lut_y[128];
+    /*!< coeff_lut_uv[64] Polyphase U/V look-up table*/
+    int32_t coeff_lut_uv[64];
+    /*!< scaling_ratio AKA 'phase_step' - defines up- or downscaling factor. For up-scaling minimum is 682 and for down scaling minimum is 171. maximum is for both 2048.*/
+    int32_t scaling_ratio;
+    /*!< phase_init_y_top Starting phase of polyphase Y filter on top image boundary*/
+    int32_t phase_init_y_top;
+    /*!< phase_init_y_left Starting phase of polyphase Y filter on left image boundary*/
+    int32_t phase_init_y_left;
+    /*!< phase_init_uv_top Starting phase of polyphase U/V filter on top image boundary*/
+    int32_t phase_init_uv_top;
+    /*!< phase_init_uv_left Starting phase of polyphase U/V filter on left image boundary*/
+    int32_t phase_init_uv_left;
+    /*!< pad_left_y Image left padding: Y component*/
+    int32_t pad_left_y;
+    /*!< pad_left_uv Image left padding: U/V components*/
+    int32_t pad_left_uv;
+    /*!< pad_right_y Image right padding: Y component*/
+    int32_t pad_right_y;
+    /*!< pad_right_uv Image right padding: U/V components*/
+    int32_t pad_right_uv;
+    /*!< pad_top_y Image top padding: Y component*/
+    int32_t pad_top_y;
+    /*!< pad_top_uv Image top padding: U/V components*/
+    int32_t pad_top_uv;
+    /*!< pad_bttm_y Image bottom padding: Y component*/
+    int32_t pad_bttm_y;
+    /*!< pad_bttm_uv Image bottom padding: U/V components*/
+    int32_t pad_bttm_uv;
+    /*!< exp_shift Scaling filter coefficients exponent shift*/
+    int32_t exp_shift;
+    /*!< output0_out_y_left_crop Left cropping of filter output Y plane*/
+    int32_t output0_out_y_left_crop;
+    /*!< output0_out_uv_left_crop Left cropping of filter output U/V planes*/
+    int32_t output0_out_uv_left_crop;
+    /*!< output0_out_y_top_crop Top cropping of filter output Y plane*/
+    int32_t output0_out_y_top_crop;
+    /*!< output0_out_uv_top_crop Top cropping of filter output U/V planes*/
+    int32_t output0_out_uv_top_crop;
+    /*!< input_bpp 0- 8 bpp 1 -10 bpp 2- 12 bpp*/
+    int32_t input_bpp;
+
+} ia_pal_isp_sc_outputscaler_dp_1_1_t;
+
+/*! \isp struct sc_outputscaler_ppp
+
+*/
+typedef struct
+{
+    /*!< bypass bypass the scaler*/
+    int32_t bypass;
+    /*!< block_width Horizontal size of output block*/
+    int32_t block_width;
+    /*!< block_height Vertical size of output block*/
+    int32_t block_height;
+    /*!< chunk_width Horizontal size of input chunk*/
+    int32_t chunk_width;
+    /*!< chunk_height Vertical size of input chunk*/
+    int32_t chunk_height;
+    /*!< input_image_y_start_column AKA 'Start column' of the Y plane: support for left croping. Always 0 unless striping mode is applied.*/
+    int32_t input_image_y_start_column;
+    /*!< input_image_uv_start_column AKA 'Start column' of the UV plane: support for left croping. Always 0 unless striping mode is applied.*/
+    int32_t input_image_uv_start_column;
+    /*!< in_width_y Width of the input image Y plane (in pixels)*/
+    int32_t in_width_y;
+    /*!< in_height_y Height of the input image Y plane (in pixels)*/
+    int32_t in_height_y;
+    /*!< in_width_uv Width of the input image UV plane (in pixels)*/
+    int32_t in_width_uv;
+    /*!< in_height_uv Height of the input image UV plane (in pixels)*/
+    int32_t in_height_uv;
+    /*!< out_width_y Width of the output image Y plane (in pixels)*/
+    int32_t out_width_y;
+    /*!< out_height_y Height of the output image Y plane (in pixels)*/
+    int32_t out_height_y;
+    /*!< out_width_uv Width of the output image UV plane (in pixels)*/
+    int32_t out_width_uv;
+    /*!< out_height_uv Height of the output image UV plane (in pixels)*/
+    int32_t out_height_uv;
+    /*!< updown_sel Processing mode: 0-bypass. 1-upscale. 2-downscale*/
+    int32_t updown_sel;
+    /*!< coeff_lut_y[128] Polyphase Y look-up table*/
+    int32_t coeff_lut_y[128];
+    /*!< coeff_lut_uv[64] Polyphase U/V look-up table*/
+    int32_t coeff_lut_uv[64];
+    /*!< scaling_ratio AKA 'phase_step' - defines up- or downscaling factor. For up-scaling minimum is 682 and for down scaling minimum is 171. maximum is for both 2048.*/
+    int32_t scaling_ratio;
+    /*!< phase_init_y_top Starting phase of polyphase Y filter on top image boundary*/
+    int32_t phase_init_y_top;
+    /*!< phase_init_y_left Starting phase of polyphase Y filter on left image boundary*/
+    int32_t phase_init_y_left;
+    /*!< phase_init_uv_top Starting phase of polyphase U/V filter on top image boundary*/
+    int32_t phase_init_uv_top;
+    /*!< phase_init_uv_left Starting phase of polyphase U/V filter on left image boundary*/
+    int32_t phase_init_uv_left;
+    /*!< pad_left_y Image left padding: Y component*/
+    int32_t pad_left_y;
+    /*!< pad_left_uv Image left padding: U/V components*/
+    int32_t pad_left_uv;
+    /*!< pad_right_y Image right padding: Y component*/
+    int32_t pad_right_y;
+    /*!< pad_right_uv Image right padding: U/V components*/
+    int32_t pad_right_uv;
+    /*!< pad_top_y Image top padding: Y component*/
+    int32_t pad_top_y;
+    /*!< pad_top_uv Image top padding: U/V components*/
+    int32_t pad_top_uv;
+    /*!< pad_bttm_y Image bottom padding: Y component*/
+    int32_t pad_bttm_y;
+    /*!< pad_bttm_uv Image bottom padding: U/V components*/
+    int32_t pad_bttm_uv;
+    /*!< exp_shift Scaling filter coefficients exponent shift*/
+    int32_t exp_shift;
+    /*!< output0_out_y_left_crop Left cropping of filter output Y plane*/
+    int32_t output0_out_y_left_crop;
+    /*!< output0_out_uv_left_crop Left cropping of filter output U/V planes*/
+    int32_t output0_out_uv_left_crop;
+    /*!< output0_out_y_top_crop Top cropping of filter output Y plane*/
+    int32_t output0_out_y_top_crop;
+    /*!< output0_out_uv_top_crop Top cropping of filter output U/V planes*/
+    int32_t output0_out_uv_top_crop;
+
+} ia_pal_isp_sc_outputscaler_ppp_t;
+
+/*! \isp struct sc_outputscaler_ppp_1_1
+
+*/
+typedef struct
+{
+    /*!< bypass bypass the scaler*/
+    int32_t bypass;
+    /*!< block_width Horizontal size of output block*/
+    int32_t block_width;
+    /*!< block_height Vertical size of output block*/
+    int32_t block_height;
+    /*!< chunk_width Horizontal size of input chunk*/
+    int32_t chunk_width;
+    /*!< chunk_height Vertical size of input chunk*/
+    int32_t chunk_height;
+    /*!< input_image_y_start_column AKA 'Start column' of the Y plane: support for left croping. Always 0 unless striping mode is applied.*/
+    int32_t input_image_y_start_column;
+    /*!< input_image_uv_start_column AKA 'Start column' of the UV plane: support for left croping. Always 0 unless striping mode is applied.*/
+    int32_t input_image_uv_start_column;
+    /*!< in_width_y Width of the input image Y plane (in pixels)*/
+    int32_t in_width_y;
+    /*!< in_height_y Height of the input image Y plane (in pixels)*/
+    int32_t in_height_y;
+    /*!< in_width_uv Width of the input image UV plane (in pixels)*/
+    int32_t in_width_uv;
+    /*!< in_height_uv Height of the input image UV plane (in pixels)*/
+    int32_t in_height_uv;
+    /*!< out_width_y Width of the output image Y plane (in pixels)*/
+    int32_t out_width_y;
+    /*!< out_height_y Height of the output image Y plane (in pixels)*/
+    int32_t out_height_y;
+    /*!< out_width_uv Width of the output image UV plane (in pixels)*/
+    int32_t out_width_uv;
+    /*!< out_height_uv Height of the output image UV plane (in pixels)*/
+    int32_t out_height_uv;
+    /*!< updown_sel Processing mode: 0-bypass. 1-upscale. 2-downscale*/
+    int32_t updown_sel;
+    /*!< coeff_lut_y[128] Polyphase Y look-up table*/
+    int32_t coeff_lut_y[128];
+    /*!< coeff_lut_uv[64] Polyphase U/V look-up table*/
+    int32_t coeff_lut_uv[64];
+    /*!< scaling_ratio AKA 'phase_step' - defines up- or downscaling factor. For up-scaling minimum is 682 and for down scaling minimum is 171. maximum is for both 2048.*/
+    int32_t scaling_ratio;
+    /*!< phase_init_y_top Starting phase of polyphase Y filter on top image boundary*/
+    int32_t phase_init_y_top;
+    /*!< phase_init_y_left Starting phase of polyphase Y filter on left image boundary*/
+    int32_t phase_init_y_left;
+    /*!< phase_init_uv_top Starting phase of polyphase U/V filter on top image boundary*/
+    int32_t phase_init_uv_top;
+    /*!< phase_init_uv_left Starting phase of polyphase U/V filter on left image boundary*/
+    int32_t phase_init_uv_left;
+    /*!< pad_left_y Image left padding: Y component*/
+    int32_t pad_left_y;
+    /*!< pad_left_uv Image left padding: U/V components*/
+    int32_t pad_left_uv;
+    /*!< pad_right_y Image right padding: Y component*/
+    int32_t pad_right_y;
+    /*!< pad_right_uv Image right padding: U/V components*/
+    int32_t pad_right_uv;
+    /*!< pad_top_y Image top padding: Y component*/
+    int32_t pad_top_y;
+    /*!< pad_top_uv Image top padding: U/V components*/
+    int32_t pad_top_uv;
+    /*!< pad_bttm_y Image bottom padding: Y component*/
+    int32_t pad_bttm_y;
+    /*!< pad_bttm_uv Image bottom padding: U/V components*/
+    int32_t pad_bttm_uv;
+    /*!< exp_shift Scaling filter coefficients exponent shift*/
+    int32_t exp_shift;
+    /*!< output0_out_y_left_crop Left cropping of filter output Y plane*/
+    int32_t output0_out_y_left_crop;
+    /*!< output0_out_uv_left_crop Left cropping of filter output U/V planes*/
+    int32_t output0_out_uv_left_crop;
+    /*!< output0_out_y_top_crop Top cropping of filter output Y plane*/
+    int32_t output0_out_y_top_crop;
+    /*!< output0_out_uv_top_crop Top cropping of filter output U/V planes*/
+    int32_t output0_out_uv_top_crop;
+    /*!< input_bpp 0- 8 bpp 1 -10 bpp 2- 12 bpp*/
+    int32_t input_bpp;
+
+} ia_pal_isp_sc_outputscaler_ppp_1_1_t;
+
+/*! \isp struct sc_ylpf
+
+*/
+typedef struct
+{
+    /*!< m_bypass Block Bypass. Must be set to 0 for operatinal mode*/
+    int32_t m_bypass;
+    /*!< m_vec_kernels[8] configuration DS kernel vector*/
+    int32_t m_vec_kernels[8];
+    /*!< m_decimationmode decimationMode{0.m444,1.m422,2.m420}*/
+    int32_t m_decimationmode;
+
+} ia_pal_isp_sc_ylpf_t;
+
+/*! \isp struct sdp_rec
+
+*/
+typedef struct
+{
+    /*!< vblank */
+    uint32_t vblank;
+    /*!< right_offset */
+    uint32_t right_offset;
+    /*!< pacing_sclk_count register value plus 5 is number of sclks per pixel*/
+    uint32_t pacing_sclk_count;
+    /*!< input_line_count extra input lines buffered*/
+    uint32_t input_line_count;
+    /*!< halt_line_margin number of lines (times four) between write and read buffer locations to restart data flow, enter ignore vdf_halt.*/
+    uint32_t halt_line_margin;
+    /*!< halt_line_hysteresis number of lines (times four) between write and read buffer locations to exit ignore vdf_halt.*/
+    uint32_t halt_line_hysteresis;
+    /*!< m_on_frame_count number of frames the Rec processes*/
+    uint32_t m_on_frame_count;
+    /*!< n_off_frame_count number of frames the Rec skips*/
+    uint32_t n_off_frame_count;
+    /*!< a11_l */
+    uint32_t a11_l;
+    /*!< a12_l */
+    uint32_t a12_l;
+    /*!< a13_l */
+    uint32_t a13_l;
+    /*!< a21_l */
+    uint32_t a21_l;
+    /*!< a22_l */
+    uint32_t a22_l;
+    /*!< a23_l */
+    uint32_t a23_l;
+    /*!< a31_l */
+    uint32_t a31_l;
+    /*!< a32_l */
+    uint32_t a32_l;
+    /*!< a33_l */
+    uint32_t a33_l;
+    /*!< k0_l */
+    uint32_t k0_l;
+    /*!< k1_l */
+    uint32_t k1_l;
+    /*!< k2_l */
+    uint32_t k2_l;
+    /*!< k3_l */
+    uint32_t k3_l;
+    /*!< k4_l */
+    uint32_t k4_l;
+    /*!< f0_l */
+    uint32_t f0_l;
+    /*!< f1_l */
+    uint32_t f1_l;
+    /*!< c0_l */
+    uint32_t c0_l;
+    /*!< c1_l */
+    uint32_t c1_l;
+    /*!< a11_r */
+    uint32_t a11_r;
+    /*!< a12_r */
+    uint32_t a12_r;
+    /*!< a13_r */
+    uint32_t a13_r;
+    /*!< a21_r */
+    uint32_t a21_r;
+    /*!< a22_r */
+    uint32_t a22_r;
+    /*!< a23_r */
+    uint32_t a23_r;
+    /*!< a31_r */
+    uint32_t a31_r;
+    /*!< a32_r */
+    uint32_t a32_r;
+    /*!< a33_r */
+    uint32_t a33_r;
+    /*!< k0_r */
+    uint32_t k0_r;
+    /*!< k1_r */
+    uint32_t k1_r;
+    /*!< k2_r */
+    uint32_t k2_r;
+    /*!< k3_r */
+    uint32_t k3_r;
+    /*!< k4_r */
+    uint32_t k4_r;
+    /*!< f0_r */
+    uint32_t f0_r;
+    /*!< f1_r */
+    uint32_t f1_r;
+    /*!< c0_r */
+    uint32_t c0_r;
+    /*!< c1_r */
+    uint32_t c1_r;
+    /*!< splerp 1=Splerp mode, 0=Bilerp mode*/
+    uint32_t splerp;
+    /*!< color_mode 1=Color mode, use RGB Interpolation and Bayer demosaicing; 0 = Monochrome cameras bypass Bayer demosaicing and set RGB to constant.*/
+    uint32_t color_mode;
+    /*!< zero_coefficients Force address coefficients to register values in address generation for identity mode.*/
+    uint32_t zero_coefficients;
+    /*!< rcolumn Bayer pattern orientation, 1=red column, 0=blue column*/
+    uint32_t rcolumn;
+    /*!< rrow Bayer pattern orientation, 1=red row, 0=blue row*/
+    uint32_t rrow;
+    /*!< brown_model 0: A0 functionality; 1: select BrownModel, use val6 and val7 instead of val17 and val18*/
+    uint32_t brown_model;
+    /*!< identity_left_xcoeff */
+    uint32_t identity_left_xcoeff;
+    /*!< identity_left_ycoeff */
+    uint32_t identity_left_ycoeff;
+    /*!< identity_right_xcoeff */
+    uint32_t identity_right_xcoeff;
+    /*!< identity_right_ycoeff */
+    uint32_t identity_right_ycoeff;
+    /*!< pixels_per_line_rec Pixels per line in the rectified output image.*/
+    uint32_t pixels_per_line_rec;
+    /*!< lines_per_frame_rec Lines per frame in the rectified output image.*/
+    uint32_t lines_per_frame_rec;
+    /*!< pixels_per_line_in Pixels per line in the input image.*/
+    uint32_t pixels_per_line_in;
+    /*!< lines_per_frame_in Lines per frame in the input image.*/
+    uint32_t lines_per_frame_in;
+    /*!< exposuretopedge Top Edge limit for exposure control*/
+    uint32_t exposuretopedge;
+    /*!< exposurebottomedge Bottom Edge limit for exposure control*/
+    uint32_t exposurebottomedge;
+    /*!< exposureleftedge Left Edge limit for exposure control*/
+    uint32_t exposureleftedge;
+    /*!< exposurerightedge Right Edge limit for exposure control*/
+    uint32_t exposurerightedge;
+    /*!< exposureleftdarkthreshold Left camera dark threshold*/
+    uint32_t exposureleftdarkthreshold;
+    /*!< exposureleftbright_threshold Left camera maximum value*/
+    uint32_t exposureleftbright_threshold;
+    /*!< exposurerightdarkthreshold Right camera minimum value*/
+    uint32_t exposurerightdarkthreshold;
+    /*!< exposurerightbrightthreshold Right camera maximum value*/
+    uint32_t exposurerightbrightthreshold;
+    /*!< yuv_matrix_entry_00 */
+    uint32_t yuv_matrix_entry_00;
+    /*!< yuv_matrix_entry_10 */
+    uint32_t yuv_matrix_entry_10;
+    /*!< yuv_matrix_entry_20 */
+    uint32_t yuv_matrix_entry_20;
+    /*!< yuv_matrix_entry_30 */
+    uint32_t yuv_matrix_entry_30;
+    /*!< yuv_matrix_entry_01 */
+    uint32_t yuv_matrix_entry_01;
+    /*!< yuv_matrix_entry_11 */
+    uint32_t yuv_matrix_entry_11;
+    /*!< yuv_matrix_entry_21 */
+    uint32_t yuv_matrix_entry_21;
+    /*!< yuv_matrix_entry_31 */
+    uint32_t yuv_matrix_entry_31;
+    /*!< yuv_matrix_entry_02 */
+    uint32_t yuv_matrix_entry_02;
+    /*!< yuv_matrix_entry_12 */
+    uint32_t yuv_matrix_entry_12;
+    /*!< yuv_matrix_entry_22 */
+    uint32_t yuv_matrix_entry_22;
+    /*!< yuv_matrix_entry_32 */
+    uint32_t yuv_matrix_entry_32;
+    /*!< yuv_vector_0 */
+    uint32_t yuv_vector_0;
+    /*!< yuv_vector_1 */
+    uint32_t yuv_vector_1;
+    /*!< yuv_vector_2 */
+    uint32_t yuv_vector_2;
+
+} ia_pal_isp_sdp_rec_t;
+
+/*! \isp struct sdp_scp
+
+*/
+typedef struct
+{
+    /*!< remove_thresh Threshold for Outlier removal in RSM. 8bit integer (8.0)*/
+    uint32_t remove_thresh;
+    /*!< slo_rau_diff_thresh Threshold for SLO and RAU disparity difference in RSM. Fixed point 7bit (2.5)*/
+    uint32_t slo_rau_diff_thresh;
+    /*!< diff_thresh Threshold for SLO disparity difference to Center in RSM. Fixed point 8bit (3.5)*/
+    uint32_t diff_thresh;
+    /*!< rsm_bypass RSM Bypass mode. 1=Bypass (default). At Bypass mode, SLO disparity input will be bypassed to RSM disparity output.*/
+    uint32_t rsm_bypass;
+    /*!< rsm_bypass_cg Clock gate control for the block which is not used at RSM Bypass mode. 1=Clock gate. 0=Clock enabled (default). RSM_Bypass_CG must be 0 (=clock enabled) at least 1 clock period before and after RSM_Bypass_SD transition.*/
+    uint32_t rsm_bypass_cg;
+    /*!< rsm_bypass_sd SRAM shutdown control for SRAM1 which is not used at RSM Bypass mode in RSM. 1=Shutdown. 0=Enabled (default). RSM_Bypass_CG must be 0 (=clock enabled) at least 1 clock period before and after RSM_Bypass_SD transition. Also need to not read/write SRAM for 30 sclk cycle when SD goes low (waking up)*/
+    uint32_t rsm_bypass_sd;
+    /*!< additional_vblank Define number of scan line to add to 4 scan line censusPipeStall for V blank. When set N at this additional_vblank, censusPipeStall will be high for 4 + N scan line period for V blank. N can be set as 0 (default) to 15. For RSM bypass mode, please set 3. For RSM mode, please set 9.*/
+    uint32_t additional_vblank;
+    /*!< en_scp_local_clk_gate Enable SCP local clock gate for DS5-B0. 1=Enable (default). 0=Disable.*/
+    uint32_t en_scp_local_clk_gate;
+    /*!< en One bit per census pixel*/
+    uint32_t en;
+    /*!< width Number of pixels per line in the input/output images. Valid values 256 to 1280*/
+    uint32_t width;
+    /*!< height Number of lines in the input/output images. Valid values 40 to 1024*/
+    uint32_t height;
+    /*!< plus_increment This value is added to the running-median estimate of the estimate is below the sequentially-sampled correlation score.*/
+    uint32_t plus_increment;
+    /*!< minus_decrement This value is subtracted from the running-median estimate of the estimate is above the sequentially-sampled correlation score.*/
+    uint32_t minus_decrement;
+    /*!< score_thresh_a Contains a 10-bit binary number used directly as a threshold for the winning Left-Right score. Interest operator bit 0 asserts if the winning score is greater than or equal Score Thresh A .*/
+    uint32_t score_thresh_a;
+    /*!< score_thresh_b Contains a 12-bit binary threshold for the winning Left-Right score. Interest operator bit 1 asserts if the winning score is greater than Score Thresh B.*/
+    uint32_t score_thresh_b;
+    /*!< deepsea_neighbor_threshold Contains a 10-bit binary number compared against the difference of the pre (and post) score and the winning score. Interest operator bit 2 asserts if the post score is greater than Neighbor Threshold. Interest operator bit 3 asserts if the pre score is greater than Neighbor Threshold.*/
+    uint32_t deepsea_neighbor_threshold;
+    /*!< lr_agree_threshold Contain an 11-bit binary number used directly as LR threshold. Interest operator bit 8 asserts if difference between the LR and RL disparities are less than threshold.*/
+    uint32_t lr_agree_threshold;
+    /*!< lr_score_average_disable Disables the averaging of LR and RL scores when set.*/
+    uint32_t lr_score_average_disable;
+    /*!< texture_difference_threshold Bits 0..11 of the {Texture Thresh} configuration register contain a 12-bit binary number which is used directly. This value defines the threshold to use in the the Texture operator difference calculation.*/
+    uint32_t texture_difference_threshold;
+    /*!< texture_count_threshold Bits 12..17 of the {Texture Thresh} configuration register contain a 5-bit binary number which is used directly to compare to the count of the number of significantly different pixel locations in the active census kernel neighborhood.*/
+    uint32_t texture_count_threshold;
+    /*!< deepsea_second_peak_threshold Second Peak Threshold*/
+    uint32_t deepsea_second_peak_threshold;
+    /*!< deepsea_median_threshold Median Threshold*/
+    uint32_t deepsea_median_threshold;
+    /*!< or_mask_bits_zencoder0 Bits [15:0] are ORed with the Z output data to generate prs_dout*/
+    uint32_t or_mask_bits_zencoder0;
+    /*!< and_mask_bits_zencoder0 Bits [31:16] are ANDed with the Z output data to generate prs_dout*/
+    uint32_t and_mask_bits_zencoder0;
+    /*!< or_mask_bits_zencoder1 Bits [15:0] are ORed with the Z output data to generate prs_dout*/
+    uint32_t or_mask_bits_zencoder1;
+    /*!< and_mask_bits_zencoder1 Bits [31:16] are ANDed with the Z output data to generate prs_dout*/
+    uint32_t and_mask_bits_zencoder1;
+    /*!< minwest Sets the left Horizontal Minimum when the color differences calculation has Fewer than horizontalSumMin pixels. If the Color Control register has RAU color disabled, then minWest defines the west offset for a fixed region.*/
+    uint32_t minwest;
+    /*!< mineast Sets the right Horizontal Minimum when the color differences calculation has Fewer than horizontalSumMin pixels. If the Color Control register has RAU color disabled, then minEast defines the east offset for a fixed region.*/
+    uint32_t mineast;
+    /*!< minwesum Sets the horizontal sum minimum, usually leftMin + rightMin +1. Valid values 3 through 15.*/
+    uint32_t minwesum;
+    /*!< minnorth Sets the up vertical minimimum when the color differences calculation has Fewer than verticalSumMin pixels. If the Color Control register has RAU color disabled, then minNorth defines the north offset for a fixed region.*/
+    uint32_t minnorth;
+    /*!< minsouth Sets the down Vertical Minimum when the color differences calculation has Fewer than verticalSumMin pixels. If the Color Control register has RAU color disabled, then minSouth defines the south offset for a fixed region.*/
+    uint32_t minsouth;
+    /*!< minnssum Sets the vertical sum minimum- usually upMin+downMin+1. Valid values 1 through 7.*/
+    uint32_t minnssum;
+    /*!< ushrink Sets the horizontal shrink factor. Valid values 0 through 4.*/
+    uint32_t ushrink;
+    /*!< vshrink Sets the vertical shrink factor. Valid values 0 and 1.*/
+    uint32_t vshrink;
+    /*!< disablesadcolor Disables Sum of Absolute Differences function*/
+    uint32_t disablesadcolor;
+    /*!< disableraucolor disable RAU color function and use region defined by minimum support vectors*/
+    uint32_t disableraucolor;
+    /*!< disableslorightcolor disable SLO right image color function and use default penalties*/
+    uint32_t disableslorightcolor;
+    /*!< disablesloleftcolor disable SLO left image color function and use default penalties*/
+    uint32_t disablesloleftcolor;
+    /*!< disablesadnormalize In the SAD function, disable normalization and use the unmodified RGB values.*/
+    uint32_t disablesadnormalize;
+    /*!< raudiffthresholdred Sets the RAU color difference comparison threshold for the Red component.*/
+    uint32_t raudiffthresholdred;
+    /*!< raudiffthresholdgreen Sets the RAU color difference comparison threshold for the Green component.*/
+    uint32_t raudiffthresholdgreen;
+    /*!< raudiffthresholdblue Sets the RAU color difference comparison threshold for the Blue component.*/
+    uint32_t raudiffthresholdblue;
+    /*!< diffthresholdred Sets the SLO color difference comparison threshold for the Red component.*/
+    uint32_t diffthresholdred;
+    /*!< diffthresholdgreen Sets the SLO color difference comparison threshold for the Green component.*/
+    uint32_t diffthresholdgreen;
+    /*!< diffthresholdblue Sets the SLO color difference comparison threshold for the Blue component.*/
+    uint32_t diffthresholdblue;
+    /*!< k1penalty Sets the SLO K1 Penalty to apply when not modified by color comparisons. Valid values 1 through 511.*/
+    uint32_t k1penalty;
+    /*!< k2penalty Sets the SLO K2 Penalty to apply when not modified by color comparisons. Valid values 1 through 511.*/
+    uint32_t k2penalty;
+    /*!< k1penaltymod1 Sets the SLO K1 Penalty to apply when modified by one color comparison. Valid values 1 through 511.*/
+    uint32_t k1penaltymod1;
+    /*!< k1penaltymod2 Sets the SLO K2 Penalty to apply when not modified by color comparisons. Valid values 1 through 511.*/
+    uint32_t k1penaltymod2;
+    /*!< k2penaltymod1 Sets the SLO K1 Penalty to apply when modified by one color comparison. Valid values 1 through 511.*/
+    uint32_t k2penaltymod1;
+    /*!< k2penaltymod2 Sets the SLO K2 Penalty to apply when modified by one color comparison. Valid values 1 through 511.*/
+    uint32_t k2penaltymod2;
+    /*!< data_range_lookup[16384] Data is the 16 bit range value*/
+    uint32_t data_range_lookup[16384];
+
+} ia_pal_isp_sdp_scp_t;
+
+/*! \isp struct see
+
+*/
+typedef struct
+{
+    /*!< Alpha_LUT[64] edge enhance gain*/
+    int32_t Alpha_LUT[64];
+    /*!< Edge_Max max edge value for clamping*/
+    int32_t Edge_Max;
+    /*!< Edge_Thres threshold for coring*/
+    int32_t Edge_Thres;
+
+} ia_pal_isp_see_t;
+
+/*! \isp struct see2
+
+*/
+typedef struct
+{
+    /*!< Alpha_LUT[64] edge enhance gain*/
+    int32_t Alpha_LUT[64];
+    /*!< Edge_Max max edge value for clamping*/
+    int32_t Edge_Max;
+    /*!< Edge_Thres threshold for coring*/
+    int32_t Edge_Thres;
+
+} ia_pal_isp_see2_t;
+
+/*! \isp struct sharpening_1_0
+
+*/
+typedef struct
+{
+    /*!< enable Enable sharpening*/
+    int32_t enable;
+
+} ia_pal_isp_sharpening_1_0_t;
+
+/*! \isp struct sie_vcsc1_1
+
+*/
+typedef struct
+{
+    /*!< csc_enable csc_bypass*/
+    int32_t csc_enable;
+    /*!< csc_matrix[9] conversion matrix for RGB2YUV*/
+    int32_t csc_matrix[9];
+    /*!< csc_matrix_norm normalization factor for RGB2YUV*/
+    int32_t csc_matrix_norm;
+    /*!< csc_bias_vec[3] conversion bias for RGB2YUV*/
+    int32_t csc_bias_vec[3];
+    /*!< cds_coeff_array[8] conversion kernel from 444->420*/
+    int32_t cds_coeff_array[8];
+    /*!< cds_coeff_array_norm normalization factor for 444->420 kernel*/
+    int32_t cds_coeff_array_norm;
+
+} ia_pal_isp_sie_vcsc1_1_t;
+
+/*! \isp struct sis_1
+
+*/
+typedef struct
+{
+    /*!< enable 0- disable filter. 1- enable filter.*/
+    int32_t enable;
+    /*!< DSF Down Scale Factor: 0- scale factor 2. 1- scale factor 4. 2- scale factor 8. 3- scale factor 16.*/
+    int32_t DSF;
+
+} ia_pal_isp_sis_1_t;
+
+/*! \isp struct sis_1_0_a
+
+*/
+typedef struct
+{
+    /*!< enable 0- disable filter. 1- enable filter.*/
+    int32_t enable;
+    /*!< DSF Down Scale Factor: 0- scale factor 2. 1- scale factor 4. 2- scale factor 8. 3- scale factor 16.*/
+    int32_t DSF;
+
+} ia_pal_isp_sis_1_0_a_t;
+
+/*! \isp struct sis_1_0_b
+
+*/
+typedef struct
+{
+    /*!< enable 0- disable filter. 1- enable filter.*/
+    int32_t enable;
+    /*!< DSF Down Scale Factor: 0- scale factor 2. 1- scale factor 4. 2- scale factor 8. 3- scale factor 16.*/
+    int32_t DSF;
+
+} ia_pal_isp_sis_1_0_b_t;
+
+/*! \isp struct spa_sis_a
+
+*/
+typedef struct
+{
+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixinprec;
+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixoutprec;
+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/
+    int32_t m_pixminprec;
+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/
+    int32_t m_isbayer;
+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/
+    int32_t m_cliptous;
+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/
+    int32_t m_shiftlen;
+    /*!< m_shiftval Shift Value {0..7}*/
+    int32_t m_shiftval;
+
+} ia_pal_isp_spa_sis_a_t;
+
+/*! \isp struct stream2mmio
+Stream2mmio
+*/
+typedef struct
+{
+    /*!< m_bypass bypass*/
+    int32_t m_bypass;
+    /*!< m_TopCrop Top crop; the row cropping is enabled when this value is odd*/
+    int32_t m_TopCrop;
+
+} ia_pal_isp_stream2mmio_t;
+
+/*! \isp struct stream2mmio_b
+Stream2mmio
+*/
+typedef struct
+{
+    /*!< m_bypass bypass*/
+    int32_t m_bypass;
+    /*!< m_TopCrop Top crop; the row cropping is enabled when this value is odd*/
+    int32_t m_TopCrop;
+
+} ia_pal_isp_stream2mmio_b_t;
+
+/*! \isp struct stream2mmio_c
+Stream2mmio
+*/
+typedef struct
+{
+    /*!< m_bypass bypass*/
+    int32_t m_bypass;
+    /*!< m_TopCrop Top crop; the row cropping is enabled when this value is odd*/
+    int32_t m_TopCrop;
+
+} ia_pal_isp_stream2mmio_c_t;
+
+/*! \isp struct strm_crop_psa
+
+*/
+typedef struct
+{
+    /*!< enable Enable PSA Crop*/
+    int32_t enable;
+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/
+    int32_t crop_col_start;
+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/
+    int32_t crop_row_start;
+    /*!< crop_col_end End column of image data (excess will be cropped)*/
+    int32_t crop_col_end;
+    /*!< crop_row_end End line of image data (excess will be cropped)*/
+    int32_t crop_row_end;
+
+} ia_pal_isp_strm_crop_psa_t;
+
+/*! \isp struct strm_crop_psa_c
+
+*/
+typedef struct
+{
+    /*!< enable Enable PSA C Crop*/
+    int32_t enable;
+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/
+    int32_t crop_col_start;
+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/
+    int32_t crop_row_start;
+    /*!< crop_col_end End column of image data (excess will be cropped)*/
+    int32_t crop_col_end;
+    /*!< crop_row_end End line of image data (excess will be cropped)*/
+    int32_t crop_row_end;
+
+} ia_pal_isp_strm_crop_psa_c_t;
+
+/*! \isp struct strm_crop_psa_d
+
+*/
+typedef struct
+{
+    /*!< enable Enable PSA D Crop*/
+    int32_t enable;
+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/
+    int32_t crop_col_start;
+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/
+    int32_t crop_row_start;
+    /*!< crop_col_end End column of image data (excess will be cropped)*/
+    int32_t crop_col_end;
+    /*!< crop_row_end End line of image data (excess will be cropped)*/
+    int32_t crop_row_end;
+
+} ia_pal_isp_strm_crop_psa_d_t;
+
+/*! \isp struct strm_crop_psa_e
+
+*/
+typedef struct
+{
+    /*!< enable Enable PSA E Crop*/
+    int32_t enable;
+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/
+    int32_t crop_col_start;
+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/
+    int32_t crop_row_start;
+    /*!< crop_col_end End column of image data (excess will be cropped)*/
+    int32_t crop_col_end;
+    /*!< crop_row_end End line of image data (excess will be cropped)*/
+    int32_t crop_row_end;
+
+} ia_pal_isp_strm_crop_psa_e_t;
+
+/*! \isp struct strm_crop_psa_f
+
+*/
+typedef struct
+{
+    /*!< enable Enable PSA J Crop*/
+    int32_t enable;
+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/
+    int32_t crop_col_start;
+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/
+    int32_t crop_row_start;
+    /*!< crop_col_end End column of image data (excess will be cropped)*/
+    int32_t crop_col_end;
+    /*!< crop_row_end End line of image data (excess will be cropped)*/
+    int32_t crop_row_end;
+
+} ia_pal_isp_strm_crop_psa_f_t;
+
+/*! \isp struct strm_crop_psa_g
+
+*/
+typedef struct
+{
+    /*!< enable Enable PSA G Crop*/
+    int32_t enable;
+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/
+    int32_t crop_col_start;
+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/
+    int32_t crop_row_start;
+    /*!< crop_col_end End column of image data (excess will be cropped)*/
+    int32_t crop_col_end;
+    /*!< crop_row_end End line of image data (excess will be cropped)*/
+    int32_t crop_row_end;
+
+} ia_pal_isp_strm_crop_psa_g_t;
+
+/*! \isp struct strm_crop_psa_h
+
+*/
+typedef struct
+{
+    /*!< enable Enable PSA H Crop*/
+    int32_t enable;
+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/
+    int32_t crop_col_start;
+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/
+    int32_t crop_row_start;
+    /*!< crop_col_end End column of image data (excess will be cropped)*/
+    int32_t crop_col_end;
+    /*!< crop_row_end End line of image data (excess will be cropped)*/
+    int32_t crop_row_end;
+
+} ia_pal_isp_strm_crop_psa_h_t;
+
+/*! \isp struct strm_crop_sis_a
+
+*/
+typedef struct
+{
+    /*!< enable Enable pre SIS crop*/
+    int32_t enable;
+    /*!< crop_col_start crop_col_start*/
+    int32_t crop_col_start;
+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/
+    int32_t crop_row_start;
+    /*!< crop_col_end End column of image data (excess will be cropped)*/
+    int32_t crop_col_end;
+    /*!< crop_row_end End line of image data (excess will be cropped)*/
+    int32_t crop_row_end;
+
+} ia_pal_isp_strm_crop_sis_a_t;
+
+/*! \isp struct strm_crop_sis_b
+
+*/
+typedef struct
+{
+    /*!< enable Enable post SIS Crop*/
+    int32_t enable;
+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/
+    int32_t crop_col_start;
+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/
+    int32_t crop_row_start;
+    /*!< crop_col_end End column of image data (excess will be cropped)*/
+    int32_t crop_col_end;
+    /*!< crop_row_end End line of image data (excess will be cropped)*/
+    int32_t crop_row_end;
+
+} ia_pal_isp_strm_crop_sis_b_t;
+
+/*! \isp struct sve_1_0
+SVE
+*/
+typedef struct
+{
+    /*!< enable enable*/
+    int32_t enable;
+    /*!< sve_bayer_pattern_cropped_mask_bit[16] bit mask define pixel type, according to exp length and bayer color*/
+    int32_t sve_bayer_pattern_cropped_mask_bit[16];
+    /*!< label_long_pixels_mask bit mask for define long pixels in radiance*/
+    int32_t label_long_pixels_mask;
+    /*!< max_saturation_val U.0.15 define pixel saturation level in radiance*/
+    int32_t max_saturation_val;
+    /*!< wb_multiplied_etr[16] U.4.14 - WB * ETR*/
+    int32_t wb_multiplied_etr[16];
+    /*!< max_input_val U.0.20 - max value of input pixel*/
+    int32_t max_input_val;
+    /*!< wb_etr_post_noise_beta0[16] U.0.30 - noise model alpha_0*WB * ETR*POST_NOISE_GAIN*/
+    int32_t wb_etr_post_noise_beta0[16];
+    /*!< wb_etr_post_noise_beta1[16] U.0.15 - noise model alpha_1*WB * ETR*POST_NOISE_GAIN*/
+    int32_t wb_etr_post_noise_beta1[16];
+    /*!< wb_etr_post_noise_beta2[16] U.0.15 - noise model alpha_2*WB * ETR*POST_NOISE_GAIN*/
+    int32_t wb_etr_post_noise_beta2[16];
+    /*!< wb_etr_post_noise_clip_negative[16] U.0.30 - noise model clip negative values*/
+    int32_t wb_etr_post_noise_clip_negative[16];
+    /*!< etr_noise_norm_shift[16] U.4.0 - etr normalization*/
+    int32_t etr_noise_norm_shift[16];
+    /*!< sve_bayer_pattern_cropped_mask[16] enum define pixel type, according to exp length and bayer color*/
+    int32_t sve_bayer_pattern_cropped_mask[16];
+    /*!< interp_kernels_arr[64] U.6.0 define which pixel to use for interpolation according to pattern, 3lsb X 3msb Y location*/
+    int32_t interp_kernels_arr[64];
+    /*!< interp_max_weight_th U.1.7 max weight threshold for interpolation*/
+    int32_t interp_max_weight_th;
+    /*!< interp_bayer_pattern_mask bit mask for define pixels for interpolation*/
+    int32_t interp_bayer_pattern_mask;
+    /*!< short_blur_kernels_arr[144] U.6.0 define which pixel to use for short blur according to pattern,  val 63 mens pixel not valid for filtering 3lsb X 3msb Y location*/
+    int32_t short_blur_kernels_arr[144];
+    /*!< short_blur_sow_th U.4.7 sow threshold for pixel blur*/
+    int32_t short_blur_sow_th;
+    /*!< short_blur_power U.1.7 power for pixel blur*/
+    int32_t short_blur_power;
+    /*!< content_short_kernels_arr[144] U.6.0 define which short pixel to use for content detector according to pattern,  val 63 mens pixel not valid for filtering 3lsb X 3msb Y location*/
+    int32_t content_short_kernels_arr[144];
+    /*!< content_long_kernels_arr[144] U.6.0 define which long pixel to use for content detector according to pattern, val 63 mens pixel not valid for filtering 3lsb X 3msb Y location*/
+    int32_t content_long_kernels_arr[144];
+    /*!< motion_short_g_th U.0.15 threshold for content*/
+    int32_t motion_short_g_th;
+    /*!< motion_detector_gain U.4.4  motion detector sensitivity for content*/
+    int32_t motion_detector_gain;
+    /*!< motion_detector_power U.1.7 motion detector power for content*/
+    int32_t motion_detector_power;
+    /*!< signal_detector_power U.1.7 signal detector power for content*/
+    int32_t signal_detector_power;
+    /*!< signal_detector_gain S.4.0 signal detector sensitivity for content (4bit include sign )*/
+    int32_t signal_detector_gain;
+    /*!< enable_wh_interp U.1 allow to ignore the horizontal interpolation in interlace use case*/
+    int32_t enable_wh_interp;
+    /*!< enable_wv_interp U.1 allow to ignore the vertical interpolation in interlace use case*/
+    int32_t enable_wv_interp;
+    /*!< cu_blend_x[4] U.20 cu_blend_x*/
+    int32_t cu_blend_x[4];
+    /*!< cu_blend_y[3] U.11 cu_compression_y*/
+    int32_t cu_blend_y[3];
+    /*!< cu_blend_slope[3] U.6.10 cu_blend_slope (16 bit )*/
+    int32_t cu_blend_slope[3];
+    /*!< cu_compression_x[8] U.20 cu_compression_x*/
+    int32_t cu_compression_x[8];
+    /*!< cu_compression_y[7] U.15 cu_compression_y*/
+    int32_t cu_compression_y[7];
+    /*!< cu_compression_slope[7] U.1.10 cu_compression_slope (11 bit )*/
+    int32_t cu_compression_slope[7];
+    /*!< long_burnt_dilut_mode U.2, 0 - pass-through, 1 - directional dilation 2 - traditional dilation*/
+    int32_t long_burnt_dilut_mode;
+    /*!< max_resolution_quantization_th S.1.20 define max resolution quantization threshold in signal detector (21 bit include sign)*/
+    int32_t max_resolution_quantization_th;
+    /*!< rad_enable U.1.0 enable radial compensation when LSC before SVE*/
+    int32_t rad_enable;
+    /*!< rad_x_center U.13.0 rad_x_center*/
+    int32_t rad_x_center;
+    /*!< rad_y_center U.13.0 rad_y_center*/
+    int32_t rad_y_center;
+    /*!< rad_norm_shift U.5.0 radial normalization factor according to image resolution*/
+    int32_t rad_norm_shift;
+    /*!< rad_lut_4_channels[256] U.4.6 - 4 radial luts each lut 64 entries for radial compensation according to LSC tables*/
+    int32_t rad_lut_4_channels[256];
+
+} ia_pal_isp_sve_1_0_t;
+
+/*! \isp struct sve_1_1
+SVE
+*/
+typedef struct
+{
+    /*!< enable enable*/
+    int32_t enable;
+    /*!< sve_bayer_pattern_cropped_mask_bit[16] bit mask define pixel type, according to exp length and bayer color*/
+    int32_t sve_bayer_pattern_cropped_mask_bit[16];
+    /*!< label_long_pixels_mask bit mask for define long pixels in radiance*/
+    int32_t label_long_pixels_mask;
+    /*!< max_saturation_val U.0.15 define pixel saturation level in radiance*/
+    int32_t max_saturation_val;
+    /*!< wb_multiplied_etr[16] U.4.14 - WB * ETR*/
+    int32_t wb_multiplied_etr[16];
+    /*!< max_input_val U.0.20 - max value of input pixel*/
+    int32_t max_input_val;
+    /*!< wb_etr_post_noise_beta0[16] U.0.30 - noise model alpha_0*WB * ETR*POST_NOISE_GAIN*/
+    int32_t wb_etr_post_noise_beta0[16];
+    /*!< wb_etr_post_noise_beta1[16] U.0.15 - noise model alpha_1*WB * ETR*POST_NOISE_GAIN*/
+    int32_t wb_etr_post_noise_beta1[16];
+    /*!< wb_etr_post_noise_beta2[16] U.0.15 - noise model alpha_2*WB * ETR*POST_NOISE_GAIN*/
+    int32_t wb_etr_post_noise_beta2[16];
+    /*!< wb_etr_post_noise_clip_negative[16] U.0.30 - noise model clip negative values*/
+    int32_t wb_etr_post_noise_clip_negative[16];
+    /*!< etr_noise_norm_shift[16] U.4.0 - etr normalization*/
+    int32_t etr_noise_norm_shift[16];
+    /*!< sve_bayer_pattern_cropped_mask[16] enum define pixel type, according to exp length and bayer color*/
+    int32_t sve_bayer_pattern_cropped_mask[16];
+    /*!< interp_kernels_arr[64] U.6.0 define which pixel to use for interpolation according to pattern, 3lsb X 3msb Y location*/
+    int32_t interp_kernels_arr[64];
+    /*!< interp_max_weight_th U.1.7 max weight threshold for interpolation*/
+    int32_t interp_max_weight_th;
+    /*!< interp_bayer_pattern_mask bit mask for define pixels for interpolation*/
+    int32_t interp_bayer_pattern_mask;
+    /*!< short_blur_kernels_arr[144] U.6.0 define which pixel to use for short blur according to pattern,  val 63 mens pixel not valid for filtering 3lsb X 3msb Y location*/
+    int32_t short_blur_kernels_arr[144];
+    /*!< short_blur_sow_th U.4.7 sow threshold for pixel blur*/
+    int32_t short_blur_sow_th;
+    /*!< short_blur_power U.1.7 power for pixel blur*/
+    int32_t short_blur_power;
+    /*!< content_short_kernels_arr[144] U.6.0 define which short pixel to use for content detector according to pattern,  val 63 mens pixel not valid for filtering 3lsb X 3msb Y location*/
+    int32_t content_short_kernels_arr[144];
+    /*!< content_long_kernels_arr[144] U.6.0 define which long pixel to use for content detector according to pattern, val 63 mens pixel not valid for filtering 3lsb X 3msb Y location*/
+    int32_t content_long_kernels_arr[144];
+    /*!< motion_short_g_th U.0.15 threshold for content*/
+    int32_t motion_short_g_th;
+    /*!< motion_detector_gain U.4.4  motion detector sensitivity for content*/
+    int32_t motion_detector_gain;
+    /*!< motion_detector_power U.1.7 motion detector power for content*/
+    int32_t motion_detector_power;
+    /*!< signal_detector_power U.1.7 signal detector power for content*/
+    int32_t signal_detector_power;
+    /*!< signal_detector_gain S.4.0 signal detector sensitivity for content (4bit include sign )*/
+    int32_t signal_detector_gain;
+    /*!< enable_wh_interp U.1 allow to ignore the horizontal interpolation in interlace use case*/
+    int32_t enable_wh_interp;
+    /*!< enable_wv_interp U.1 allow to ignore the vertical interpolation in interlace use case*/
+    int32_t enable_wv_interp;
+    /*!< cu_blend_x[4] U.20 cu_blend_x*/
+    int32_t cu_blend_x[4];
+    /*!< cu_blend_y[3] U.11 cu_compression_y*/
+    int32_t cu_blend_y[3];
+    /*!< cu_blend_slope[3] U.6.10 cu_blend_slope (16 bit )*/
+    int32_t cu_blend_slope[3];
+    /*!< cu_compression_x[8] U.20 cu_compression_x*/
+    int32_t cu_compression_x[8];
+    /*!< cu_compression_y[7] U.15 cu_compression_y*/
+    int32_t cu_compression_y[7];
+    /*!< cu_compression_slope[7] U.1.10 cu_compression_slope (11 bit )*/
+    int32_t cu_compression_slope[7];
+    /*!< long_burnt_dilut_mode U.2, 0 - pass-through, 1 - directional dilation 2 - traditional dilation*/
+    int32_t long_burnt_dilut_mode;
+    /*!< max_resolution_quantization_th S.1.20 define max resolution quantization threshold in signal detector (21 bit include sign)*/
+    int32_t max_resolution_quantization_th;
+    /*!< rad_enable U.1.0 enable radial compensation when LSC before SVE*/
+    int32_t rad_enable;
+    /*!< rad_x_center U.13.0 rad_x_center*/
+    int32_t rad_x_center;
+    /*!< rad_y_center U.13.0 rad_y_center*/
+    int32_t rad_y_center;
+    /*!< rad_norm_shift U.5.0 radial normalization factor according to image resolution*/
+    int32_t rad_norm_shift;
+    /*!< rad_lut_4_channels[256] U.4.6 - 4 radial luts each lut 64 entries for radial compensation according to LSC tables*/
+    int32_t rad_lut_4_channels[256];
+    /*!< enable_four_cell U.1 Allows the block to work in 4Cell mode*/
+    int32_t enable_four_cell;
+    /*!< four_cell_pattern[16] 4Cell pattern of CFA and exposures, 0-3 - RGGB short, 4-7 - RGGB long*/
+    int32_t four_cell_pattern[16];
+
+} ia_pal_isp_sve_1_1_t;
+
+/*! \isp struct tnr_6_0
+Hardware fixed-function temporal noise reduction
+*/
+typedef struct
+{
+    /*!< bypass bypass*/
+    int32_t bypass;
+    /*!< feedback_image_bittage bit reduction in feedback loop*/
+    int32_t feedback_image_bittage;
+    /*!< spatial_luma_kernel[25] Spatial filtering spatial kernel (Luma, 5x5)*/
+    int32_t spatial_luma_kernel[25];
+    /*!< spatial_chroma_kernel[9] Spatial filtering spatial kernel (Chroma, 3x3)*/
+    int32_t spatial_chroma_kernel[9];
+    /*!< spatial_luma_denoise_control Control weight deviation in Luma spatial denoising*/
+    int32_t spatial_luma_denoise_control;
+    /*!< spatial_chroma_denoise_luma_control Control weight deviation in Chroma spatial denoising*/
+    int32_t spatial_chroma_denoise_luma_control;
+    /*!< spatial_chroma_denoise_chroma_control Control weight deviation in Chroma spatial denoising*/
+    int32_t spatial_chroma_denoise_chroma_control;
+    /*!< blending_inlier_th_motion blending:*/
+    int32_t blending_inlier_th_motion;
+    /*!< blending_inlier_th_static blending:*/
+    int32_t blending_inlier_th_static;
+    /*!< blending_inlier_gain blending:*/
+    int32_t blending_inlier_gain;
+    /*!< blending_da_rec_sim_motion_knees[2] blending:*/
+    int32_t blending_da_rec_sim_motion_knees[2];
+    /*!< blending_da_rec_sim_motion_a[2] blending:*/
+    int32_t blending_da_rec_sim_motion_a[2];
+    /*!< blending_da_rec_sim_motion_b[2] blending:*/
+    int32_t blending_da_rec_sim_motion_b[2];
+    /*!< blending_da_rec_sim_static_knees[2] blending:*/
+    int32_t blending_da_rec_sim_static_knees[2];
+    /*!< blending_da_rec_sim_static_a[2] blending:*/
+    int32_t blending_da_rec_sim_static_a[2];
+    /*!< blending_da_rec_sim_static_b[2] blending:*/
+    int32_t blending_da_rec_sim_static_b[2];
+    /*!< blending_da_winp_knees[2] blending:*/
+    int32_t blending_da_winp_knees[2];
+    /*!< blending_da_winp_a[2] blending:*/
+    int32_t blending_da_winp_a[2];
+    /*!< blending_da_winp_b[2] blending:*/
+    int32_t blending_da_winp_b[2];
+    /*!< sharpening_rec_sim_damp sharpening: rec-sim based damping*/
+    int32_t sharpening_rec_sim_damp;
+    /*!< sharpening_texture_coeff_norm sharpening: texture metric normalization power*/
+    int32_t sharpening_texture_coeff_norm;
+    /*!< sharpening_texture_undershoot sharpening: allowed undershoot for textured pixels*/
+    int32_t sharpening_texture_undershoot;
+    /*!< sharpening_edge_undershoot sharpening: allowed undershoot for edge pixels*/
+    int32_t sharpening_edge_undershoot;
+    /*!< sharpening_texture_overshoot sharpening: allowed overshoot for textured pixels*/
+    int32_t sharpening_texture_overshoot;
+    /*!< sharpening_edge_overshoot sharpening: allowed overshoot for edge pixels*/
+    int32_t sharpening_edge_overshoot;
+    /*!< sharpening_undershoot_power sharpening: undershoot enhancement. To enhance use positive, to weaken use a negative.*/
+    int32_t sharpening_undershoot_power;
+    /*!< sharpening_overshoot_power sharpening: overshoot enhancement. To enhance use positive, to weaken use a negative.*/
+    int32_t sharpening_overshoot_power;
+    /*!< sharpening_cu_x_points_pos_th[6] sharpening: x points for overshoot config unit*/
+    int32_t sharpening_cu_x_points_pos_th[6];
+    /*!< sharpening_cu_a_points_pos_th[5] sharpening: a points for overshoot config unit*/
+    int32_t sharpening_cu_a_points_pos_th[5];
+    /*!< sharpening_cu_b_points_pos_th[5] sharpening: b points for overshoot config unit*/
+    int32_t sharpening_cu_b_points_pos_th[5];
+    /*!< sharpening_cu_x_points_neg_th[6] sharpening: x points for undershoot config unit*/
+    int32_t sharpening_cu_x_points_neg_th[6];
+    /*!< sharpening_cu_a_points_neg_th[5] sharpening: a points for undershoot config unit*/
+    int32_t sharpening_cu_a_points_neg_th[5];
+    /*!< sharpening_cu_b_points_neg_th[5] sharpening: b points for undershoot config unit*/
+    int32_t sharpening_cu_b_points_neg_th[5];
+    /*!< sharpening_cu_x_points_pixval_th[6] sharpening: x points for pixel value config unit*/
+    int32_t sharpening_cu_x_points_pixval_th[6];
+    /*!< sharpening_cu_a_points_pixval_th[5] sharpening: a points for pixel value config unit*/
+    int32_t sharpening_cu_a_points_pixval_th[5];
+    /*!< sharpening_cu_b_points_pixval_th[5] sharpening: b points for pixel value config unit*/
+    int32_t sharpening_cu_b_points_pixval_th[5];
+    /*!< sharpening_cu_x_points_noise_th[6] sharpening: x points for noise th config unit*/
+    int32_t sharpening_cu_x_points_noise_th[6];
+    /*!< sharpening_cu_a_points_noise_th[5] sharpening: a  points for noise th config unit*/
+    int32_t sharpening_cu_a_points_noise_th[5];
+    /*!< sharpening_cu_b_points_noise_th[5] sharpening: b  points for noise th config unit*/
+    int32_t sharpening_cu_b_points_noise_th[5];
+    /*!< sharpening_kernel_coeffs[6] sharpening: kernel coefficients*/
+    int32_t sharpening_kernel_coeffs[6];
+    /*!< op_fragment_width fragmentation*/
+    int32_t op_fragment_width;
+    /*!< op_fragment_height fragmentation*/
+    int32_t op_fragment_height;
+    /*!< start_block_id_X fragmentation*/
+    int32_t start_block_id_X;
+    /*!< start_block_id_Y fragmentation*/
+    int32_t start_block_id_Y;
+    /*!< frame_width fragmentation*/
+    int32_t frame_width;
+    /*!< frame_height fragmentation*/
+    int32_t frame_height;
+    /*!< tnr_top_i_tnr6_reg_tnr6_bpp_control_Info_type bit reduction in feedback loop*/
+    int32_t tnr_top_i_tnr6_reg_tnr6_bpp_control_Info_type;
+    /*!< output_bpp bit reduction in feedback loop*/
+    int32_t output_bpp;
+
+} ia_pal_isp_tnr_6_0_t;
+
+/*! \isp struct tnr_scale_1_0
+
+*/
+typedef struct
+{
+    /*!< enable enable TNR_SCALE_1_0 filter*/
+    int32_t enable;
+    /*!< inWidth Number of pixels per row at output*/
+    int32_t inWidth;
+    /*!< inHeight Number of rows at output*/
+    int32_t inHeight;
+    /*!< bitReductionBypass bypass of bit reduction of input pixels*/
+    int32_t bitReductionBypass;
+    /*!< inputShift shift on input pixels*/
+    int32_t inputShift;
+    /*!< cu_bit_reduce_x[6] input bit reduction config unit - x values*/
+    int32_t cu_bit_reduce_x[6];
+    /*!< cu_bit_reduce_y[5] input bit reduction config unit - y values*/
+    int32_t cu_bit_reduce_y[5];
+    /*!< cu_bit_reduce_slope[5] input bit reduction config unit - slope values*/
+    int32_t cu_bit_reduce_slope[5];
+
+} ia_pal_isp_tnr_scale_1_0_t;
+
+/*! \isp struct tnr5_21
+
+*/
+typedef struct
+{
+    /*!< NM_Rad2_Shift Bit shift bumber to calculate index for nm_R_xcu*/
+    int32_t NM_Rad2_Shift;
+    /*!< nm_radial_y_center Opical center y coordinate in chroma resolution*/
+    int32_t nm_radial_y_center;
+    /*!< nm_radial_x_center Opical center x coordinate in chroma resolution*/
+    int32_t nm_radial_x_center;
+    /*!< nm_R_xcu[128] LUT for radial noise model*/
+    int32_t nm_R_xcu[128];
+    /*!< nm_YY_xcu[64] LUT for Y noise model – Y dependency*/
+    int32_t nm_YY_xcu[64];
+    /*!< nm_YC_xcu[64] LUT for Y noise model – C dependency*/
+    int32_t nm_YC_xcu[64];
+    /*!< nm_CY_xcu[64] LUT for C noise model – Y dependency*/
+    int32_t nm_CY_xcu[64];
+    /*!< nm_CC_xcu[64] LUT for C noise model – C dependency*/
+    int32_t nm_CC_xcu[64];
+    /*!< nm_Y_log_est_min Min value for log space Y noise model*/
+    int32_t nm_Y_log_est_min;
+    /*!< nm_Y_log_est_max Max value for log space Y noise model*/
+    int32_t nm_Y_log_est_max;
+    /*!< nm_C_log_est_min Min value for log space C noise model*/
+    int32_t nm_C_log_est_min;
+    /*!< nm_C_log_est_max Max value for log space C noise model*/
+    int32_t nm_C_log_est_max;
+    /*!< nm_lut_frac Fractional bit for noise model LUT*/
+    int32_t nm_lut_frac;
+    /*!< nm_idx_frac Bit number for adjusting to POW LUT index*/
+    int32_t nm_idx_frac;
+    /*!< nm_pow[64] LUT for power function*/
+    int32_t nm_pow[64];
+    /*!< nm_pow_frac Fractional bit for POW LUT*/
+    int32_t nm_pow_frac;
+    /*!< nm_shift_num Pre-calculation of nm_lut_frac - nm_idx_frac*/
+    int32_t nm_shift_num;
+    /*!< nm_Y_alpha Scaling coefficient for Y noise model*/
+    int32_t nm_Y_alpha;
+    /*!< nm_C_alpha Scaling coefficient for C noise model*/
+    int32_t nm_C_alpha;
+    /*!< co_var_thres Variance threshold*/
+    int32_t co_var_thres;
+    /*!< co_var_gain Variance gain*/
+    int32_t co_var_gain;
+    /*!< tbd_sad_Y_gain Y SAD sensitivity gain*/
+    int32_t tbd_sad_Y_gain;
+    /*!< tbd_sim_arg_gain_m Similarity argument gain for dynamic*/
+    int32_t tbd_sim_arg_gain_m;
+    /*!< tbd_con_thres Content level threshold*/
+    int32_t tbd_con_thres;
+    /*!< tbd_con_gain Content level gain*/
+    int32_t tbd_con_gain;
+    /*!< tbd_sim_lut[64] Similarity LUT*/
+    int32_t tbd_sim_lut[64];
+    /*!< tbd_rec_sim_thres Similarity threshold for recursive filter*/
+    int32_t tbd_rec_sim_thres;
+    /*!< tbd_rec_gain0 Gain of recursive filter for static region*/
+    int32_t tbd_rec_gain0;
+    /*!< tbd_rec_gain1 Gain of recursive filter for dynamic region*/
+    int32_t tbd_rec_gain1;
+    /*!< pb_weight_in input weight*/
+    int32_t pb_weight_in;
+    /*!< pb_weight_pre_max max weight of temporal filter output*/
+    int32_t pb_weight_pre_max;
+    /*!< pb_weight_sp_thres Spatial filter weight threshold*/
+    int32_t pb_weight_sp_thres;
+    /*!< pb_weight_sp_gain Spatial filter weight gain*/
+    int32_t pb_weight_sp_gain;
+    /*!< pb_weight_sp_max0 Spatial filter weight max at high similarity region*/
+    int32_t pb_weight_sp_max0;
+    /*!< pb_weight_sp_max1 Spatial filter weight max at low similarity region*/
+    int32_t pb_weight_sp_max1;
+    /*!< NS_weight_LUT[64] LUT for Noise stream weight control by similarity*/
+    int32_t NS_weight_LUT[64];
+    /*!< NS_ConLv_w_LUT[64] LUT for Noise stream weight control by content*/
+    int32_t NS_ConLv_w_LUT[64];
+    /*!< NS_out_max Max value for clipping noise stream*/
+    int32_t NS_out_max;
+    /*!< NS_Norm_bias Bias for noise stream luma dependency model*/
+    int32_t NS_Norm_bias;
+    /*!< NS_Norm_coef Slope for noise stream luma dependency model*/
+    int32_t NS_Norm_coef;
+    /*!< bypass bypass*/
+    int32_t bypass;
+    /*!< framenumber frame number*/
+    int32_t framenumber;
+    /*!< g_mv_x global  MV_X*/
+    int32_t g_mv_x;
+    /*!< g_mv_y global  MV_Y*/
+    int32_t g_mv_y;
+    /*!< bypass_NS bypass noise stream*/
+    int32_t bypass_NS;
+
+} ia_pal_isp_tnr5_21_t;
+
+/*! \isp struct tnr5_22
+
+*/
+typedef struct
+{
+    /*!< NM_Rad2_Shift Bit shift bumber to calculate index for nm_R_xcu*/
+    int32_t NM_Rad2_Shift;
+    /*!< nm_radial_y_center Opical center y coordinate in chroma resolution*/
+    int32_t nm_radial_y_center;
+    /*!< nm_radial_x_center Opical center x coordinate in chroma resolution*/
+    int32_t nm_radial_x_center;
+    /*!< nm_R_xcu[128] LUT for radial noise model*/
+    int32_t nm_R_xcu[128];
+    /*!< nm_YY_xcu[64] LUT for Y noise model – Y dependency*/
+    int32_t nm_YY_xcu[64];
+    /*!< nm_YC_xcu[64] LUT for Y noise model – C dependency*/
+    int32_t nm_YC_xcu[64];
+    /*!< nm_CY_xcu[64] LUT for C noise model – Y dependency*/
+    int32_t nm_CY_xcu[64];
+    /*!< nm_CC_xcu[64] LUT for C noise model – C dependency*/
+    int32_t nm_CC_xcu[64];
+    /*!< nm_Y_log_est_min Min value for log space Y noise model*/
+    int32_t nm_Y_log_est_min;
+    /*!< nm_Y_log_est_max Max value for log space Y noise model*/
+    int32_t nm_Y_log_est_max;
+    /*!< nm_C_log_est_min Min value for log space C noise model*/
+    int32_t nm_C_log_est_min;
+    /*!< nm_C_log_est_max Max value for log space C noise model*/
+    int32_t nm_C_log_est_max;
+    /*!< nm_lut_frac Fractional bit for noise model LUT*/
+    int32_t nm_lut_frac;
+    /*!< nm_idx_frac Bit number for adjusting to POW LUT index*/
+    int32_t nm_idx_frac;
+    /*!< nm_pow_Y[64] LUT for power function for Y*/
+    int32_t nm_pow_Y[64];
+    /*!< nm_pow_C[64] LUT for power function for C*/
+    int32_t nm_pow_C[64];
+    /*!< nm_pow_frac Fractional bit for POW LUT*/
+    int32_t nm_pow_frac;
+    /*!< nm_shift_num Pre-calculation of nm_lut_frac - nm_idx_frac*/
+    int32_t nm_shift_num;
+    /*!< co_var_thres Variance threshold*/
+    int32_t co_var_thres;
+    /*!< co_var_gain Variance gain*/
+    int32_t co_var_gain;
+    /*!< tbd_sad_Y_gain Y SAD sensitivity gain*/
+    int32_t tbd_sad_Y_gain;
+    /*!< tbd_sim_arg_gain_m Similarity argument gain for dynamic*/
+    int32_t tbd_sim_arg_gain_m;
+    /*!< tbd_con_thres Content level threshold*/
+    int32_t tbd_con_thres;
+    /*!< tbd_con_gain Content level gain*/
+    int32_t tbd_con_gain;
+    /*!< tbd_sim_lut[64] Similarity LUT*/
+    int32_t tbd_sim_lut[64];
+    /*!< tbd_rec_sim_thres Similarity threshold for recursive filter*/
+    int32_t tbd_rec_sim_thres;
+    /*!< tbd_rec_gain0 Gain of recursive filter for static region*/
+    int32_t tbd_rec_gain0;
+    /*!< tbd_rec_gain1 Gain of recursive filter for dynamic region*/
+    int32_t tbd_rec_gain1;
+    /*!< pb_weight_in input weight*/
+    int32_t pb_weight_in;
+    /*!< pb_weight_pre_max max weight of temporal filter output*/
+    int32_t pb_weight_pre_max;
+    /*!< pb_weight_sp_thres Spatial filter weight threshold*/
+    int32_t pb_weight_sp_thres;
+    /*!< pb_weight_sp_gain Spatial filter weight gain*/
+    int32_t pb_weight_sp_gain;
+    /*!< pb_weight_sp_max0 Spatial filter weight max at high similarity region*/
+    int32_t pb_weight_sp_max0;
+    /*!< pb_weight_sp_max1 Spatial filter weight max at low similarity region*/
+    int32_t pb_weight_sp_max1;
+    /*!< NS_weight_LUT[64] LUT for Noise stream weight control by similarity*/
+    int32_t NS_weight_LUT[64];
+    /*!< NS_ConLv_w_LUT[64] LUT for Noise stream weight control by content*/
+    int32_t NS_ConLv_w_LUT[64];
+    /*!< NS_out_max Max value for clipping noise stream*/
+    int32_t NS_out_max;
+    /*!< NS_Norm_bias Bias for noise stream luma dependency model*/
+    int32_t NS_Norm_bias;
+    /*!< NS_Norm_coef Slope for noise stream luma dependency model*/
+    int32_t NS_Norm_coef;
+    /*!< bypass bypass*/
+    int32_t bypass;
+    /*!< framenumber frame number*/
+    int32_t framenumber;
+    /*!< g_mv_x global  MV_X*/
+    int32_t g_mv_x;
+    /*!< g_mv_y global  MV_Y*/
+    int32_t g_mv_y;
+    /*!< bypass_NS bypass noise stream*/
+    int32_t bypass_NS;
+
+} ia_pal_isp_tnr5_22_t;
+
+/*! \isp struct tnr5_25
+
+*/
+typedef struct
+{
+    /*!< NM_Rad2_Shift Bit shift bumber to calculate index for nm_R_xcu*/
+    int32_t NM_Rad2_Shift;
+    /*!< nm_radial_y_center Opical center y coordinate in chroma resolution*/
+    int32_t nm_radial_y_center;
+    /*!< nm_radial_x_center Opical center x coordinate in chroma resolution*/
+    int32_t nm_radial_x_center;
+    /*!< nm_R_xcu[128] LUT for radial noise model*/
+    int32_t nm_R_xcu[128];
+    /*!< nm_YY_xcu[64] LUT for Y noise model – Y dependency*/
+    int32_t nm_YY_xcu[64];
+    /*!< nm_YC_xcu[64] LUT for Y noise model – C dependency*/
+    int32_t nm_YC_xcu[64];
+    /*!< nm_CY_xcu[64] LUT for C noise model – Y dependency*/
+    int32_t nm_CY_xcu[64];
+    /*!< nm_CC_xcu[64] LUT for C noise model – C dependency*/
+    int32_t nm_CC_xcu[64];
+    /*!< nm_Y_log_est_min Min value for log space Y noise model*/
+    int32_t nm_Y_log_est_min;
+    /*!< nm_Y_log_est_max Max value for log space Y noise model*/
+    int32_t nm_Y_log_est_max;
+    /*!< nm_C_log_est_min Min value for log space C noise model*/
+    int32_t nm_C_log_est_min;
+    /*!< nm_C_log_est_max Max value for log space C noise model*/
+    int32_t nm_C_log_est_max;
+    /*!< nm_lut_frac Fractional bit for noise model LUT*/
+    int32_t nm_lut_frac;
+    /*!< nm_idx_frac Bit number for adjusting to POW LUT index*/
+    int32_t nm_idx_frac;
+    /*!< nm_pow[64] LUT for power function*/
+    int32_t nm_pow[64];
+    /*!< nm_pow_frac Fractional bit for POW LUT*/
+    int32_t nm_pow_frac;
+    /*!< nm_shift_num Pre-calculation of nm_lut_frac - nm_idx_frac*/
+    int32_t nm_shift_num;
+    /*!< nm_Y_alpha Scaling coefficient for Y noise model*/
+    int32_t nm_Y_alpha;
+    /*!< nm_C_alpha Scaling coefficient for C noise model*/
+    int32_t nm_C_alpha;
+    /*!< tbd_sad_Y_gain Y SAD sensitivity gain*/
+    int32_t tbd_sad_Y_gain;
+    /*!< tbd_sim_arg_gain_m Similarity argument gain for dynamic*/
+    int32_t tbd_sim_arg_gain_m;
+    /*!< tbd_sim_lut[64] Similarity LUT*/
+    int32_t tbd_sim_lut[64];
+    /*!< tbd_rec_sim_thres Similarity threshold for recursive filter*/
+    int32_t tbd_rec_sim_thres;
+    /*!< tbd_rec_gain0 Gain of recursive filter for static region*/
+    int32_t tbd_rec_gain0;
+    /*!< tbd_rec_gain1 Gain of recursive filter for dynamic region*/
+    int32_t tbd_rec_gain1;
+    /*!< pb_weight_in input weight*/
+    int32_t pb_weight_in;
+    /*!< pb_weight_pre_max max weight of temporal filter output*/
+    int32_t pb_weight_pre_max;
+    /*!< bypass bypass*/
+    int32_t bypass;
+    /*!< framenumber frame number*/
+    int32_t framenumber;
+    /*!< g_mv_x global  MV_X*/
+    int32_t g_mv_x;
+    /*!< g_mv_y global  MV_Y*/
+    int32_t g_mv_y;
+
+} ia_pal_isp_tnr5_25_t;
+
+/*! \isp struct tnr5_3
+
+*/
+typedef struct
+{
+    /*!< nm_luma_lut[256] Noise model LUMA lut (for I core)*/
+    int32_t nm_luma_lut[256];
+    /*!< nm_chroma_lut[256] Noise model Chroma LUT (for I core)*/
+    int32_t nm_chroma_lut[256];
+    /*!< nm_radial_lut[128] Noise model radial Lut*/
+    int32_t nm_radial_lut[128];
+    /*!< nm_radial_r2_shift Noise model radial shift*/
+    int32_t nm_radial_r2_shift;
+    /*!< nm_radial_x_center Noise model radial- center of image x corr*/
+    int32_t nm_radial_x_center;
+    /*!< nm_radial_y_center Noise model radial- center of image y corr*/
+    int32_t nm_radial_y_center;
+    /*!< co_max_content maximal value for the content*/
+    int32_t co_max_content;
+    /*!< co_content_shift shift right for content*/
+    int32_t co_content_shift;
+    /*!< fm_bma_sad_shift shift value for the BMA*/
+    int32_t fm_bma_sad_shift;
+    /*!< fm_chroma_shift shift value for chroma in fmve*/
+    int32_t fm_chroma_shift;
+    /*!< fm_sim_lut[256] FMVE Similarity LUT for grade calculation*/
+    int32_t fm_sim_lut[256];
+    /*!< fm_dist_weights[128] FMVE distance weight for the tow BMA unit*/
+    int32_t fm_dist_weights[128];
+    /*!< mvd_sim_lut[256] MVD Similarity LUT*/
+    int32_t mvd_sim_lut[256];
+    /*!< mvd_sad_shift shift for the SAD values in the MVD sub-block (using realigning)*/
+    int32_t mvd_sad_shift;
+    /*!< mvd_arg_g_static The gain for the recursive similarity at case of static MV . together  with neighbors*/
+    int32_t mvd_arg_g_static;
+    /*!< mvd_arg_g_static_local The gain for the recursive similarity at case of static MV, neighbors have a different MV*/
+    int32_t mvd_arg_g_static_local;
+    /*!< mvd_arg_g_move The gain for the recursive similarity at case of non-static MV,  together  with neighbors*/
+    int32_t mvd_arg_g_move;
+    /*!< mvd_arg_g_move_local The gain for the recursive similarity at case of non-static MV,neighbors have a different MV*/
+    int32_t mvd_arg_g_move_local;
+    /*!< mvd_chroma_l_shift shift value for chroma in mvd*/
+    int32_t mvd_chroma_l_shift;
+    /*!< mvd_central_pix_l_shift shift value for centeral pixel in mvd*/
+    int32_t mvd_central_pix_l_shift;
+    /*!< spnr_range_lut[7] range lut for the BFA*/
+    int32_t spnr_range_lut[7];
+    /*!< spnr_spatial_lut[25] spatial lut for the BFA*/
+    int32_t spnr_spatial_lut[25];
+    /*!< spnr_shift shift value for the BFA*/
+    int32_t spnr_shift;
+    /*!< spnr_nm_shift shift value for the noise model of SPNR*/
+    int32_t spnr_nm_shift;
+    /*!< pb_weight_pre_max maximal spTNR weight*/
+    int32_t pb_weight_pre_max;
+    /*!< pb_weight_spnr_max maximal spNR weight (vs. input)*/
+    int32_t pb_weight_spnr_max;
+    /*!< g_mv_x global  MV_X. Should be in PAL*/
+    int32_t g_mv_x;
+    /*!< g_mv_y global  MV_Y. Should be in PAL*/
+    int32_t g_mv_y;
+
+} ia_pal_isp_tnr5_3_t;
+
+/*! \isp struct tnr5_3_1
+
+*/
+typedef struct
+{
+    /*!< nm_luma_lut[256] Noise model LUMA lut (for I core)*/
+    int32_t nm_luma_lut[256];
+    /*!< nm_chroma_lut[256] Noise model Chroma LUT (for I core)*/
+    int32_t nm_chroma_lut[256];
+    /*!< nm_radial_lut[128] Noise model radial Lut*/
+    int32_t nm_radial_lut[128];
+    /*!< nm_radial_r2_shift Noise model radial shift*/
+    int32_t nm_radial_r2_shift;
+    /*!< nm_radial_x_center Noise model radial- center of image x corr*/
+    int32_t nm_radial_x_center;
+    /*!< nm_radial_y_center Noise model radial- center of image y corr*/
+    int32_t nm_radial_y_center;
+    /*!< co_max_content maximal value for the content*/
+    int32_t co_max_content;
+    /*!< co_content_shift shift right for content*/
+    int32_t co_content_shift;
+    /*!< fm_bma_sad_shift shift value for the BMA*/
+    int32_t fm_bma_sad_shift;
+    /*!< fm_chroma_shift shift value for chroma in fmve*/
+    int32_t fm_chroma_shift;
+    /*!< fm_sim_lut[256] FMVE Similarity LUT for grade calculation*/
+    int32_t fm_sim_lut[256];
+    /*!< fm_dist_weights[128] FMVE distance weight for the tow BMA unit*/
+    int32_t fm_dist_weights[128];
+    /*!< mvd_sim_lut[256] MVD Similarity LUT*/
+    int32_t mvd_sim_lut[256];
+    /*!< mvd_sad_shift shift for the SAD values in the MVD sub-block (using realigning)*/
+    int32_t mvd_sad_shift;
+    /*!< mvd_arg_g_static The gain for the recursive similarity at case of static MV . together  with neighbors*/
+    int32_t mvd_arg_g_static;
+    /*!< mvd_arg_g_static_local The gain for the recursive similarity at case of static MV, neighbors have a different MV*/
+    int32_t mvd_arg_g_static_local;
+    /*!< mvd_arg_g_move The gain for the recursive similarity at case of non-static MV,  together  with neighbors*/
+    int32_t mvd_arg_g_move;
+    /*!< mvd_arg_g_move_local The gain for the recursive similarity at case of non-static MV,neighbors have a different MV*/
+    int32_t mvd_arg_g_move_local;
+    /*!< mvd_chroma_l_shift shift value for chroma in mvd*/
+    int32_t mvd_chroma_l_shift;
+    /*!< mvd_central_pix_l_shift shift value for centeral pixel in mvd*/
+    int32_t mvd_central_pix_l_shift;
+    /*!< spnr_range_lut[7] range lut for the BFA*/
+    int32_t spnr_range_lut[7];
+    /*!< spnr_spatial_lut[25] spatial lut for the BFA*/
+    int32_t spnr_spatial_lut[25];
+    /*!< spnr_shift shift value for the BFA*/
+    int32_t spnr_shift;
+    /*!< spnr_nm_shift shift value for the noise model of SPNR*/
+    int32_t spnr_nm_shift;
+    /*!< pb_weight_pre_max maximal spTNR weight*/
+    int32_t pb_weight_pre_max;
+    /*!< pb_weight_spnr_max maximal spNR weight (vs. input)*/
+    int32_t pb_weight_spnr_max;
+    /*!< g_mv_x global  MV_X. Should be in PAL*/
+    int32_t g_mv_x;
+    /*!< g_mv_y global  MV_Y. Should be in PAL*/
+    int32_t g_mv_y;
+
+} ia_pal_isp_tnr5_3_1_t;
+
+/*! \isp struct tnr7_bc_1_0
+
+*/
+typedef struct
+{
+    /*!< enable block enable*/
+    int32_t enable;
+    /*!< is_first_frame If first frame, ignore input rec-sim*/
+    int32_t is_first_frame;
+    /*!< do_update Limit of S&R parameter update mechanism*/
+    int32_t do_update;
+    /*!< coeffs[3] Per-region mult-and-clamp coefficients*/
+    int32_t coeffs[3];
+    /*!< coeffs_user[3] Per-region mult-and-clamp coefficients (specified by user during offline calibration)*/
+    int32_t coeffs_user[3];
+    /*!< gpu_mode meta parameter controlling convolution implementation: 0 - HW implementation  1 - GPU implementation*/
+    int32_t gpu_mode;
+    /*!< tune_sensitivity user tuning - alignment-conf sensitivity*/
+    int32_t tune_sensitivity;
+
+} ia_pal_isp_tnr7_bc_1_0_t;
+
+/*! \isp struct tnr7_blend_1_0
+
+*/
+typedef struct
+{
+    /*!< enable Enable TNR7 blend*/
+    int32_t enable;
+    /*!< enable_main_output Enable blend main output*/
+    int32_t enable_main_output;
+    /*!< enable_vision_output Enable blend computer vision output*/
+    int32_t enable_vision_output;
+    /*!< single_output_mode Both outputs use the same blend*/
+    int32_t single_output_mode;
+    /*!< spatial_weight_coeff Spatial weight coeff to be used in single_output_mode*/
+    int32_t spatial_weight_coeff;
+    /*!< max_recursive_similarity Maximum value of recursive similarity*/
+    int32_t max_recursive_similarity;
+    /*!< spatial_alpha Use of spatial filtering in the feedback output*/
+    int32_t spatial_alpha;
+    /*!< w_out_prev_LUT[32] Weight of reference in the main output*/
+    int32_t w_out_prev_LUT[32];
+    /*!< w_out_spl_LUT[32] Weight of spatial in the main output*/
+    int32_t w_out_spl_LUT[32];
+    /*!< output_cu_x[6] output config unit - x values*/
+    int32_t output_cu_x[6];
+    /*!< output_cu_a[5] output config unit - slope values*/
+    int32_t output_cu_a[5];
+    /*!< output_cu_b[5] output config unit - b values*/
+    int32_t output_cu_b[5];
+    /*!< max_recursive_similarity_vsn Vision - Maximum value of recursive similarity*/
+    int32_t max_recursive_similarity_vsn;
+    /*!< w_vsn_out_prev_LUT[32] Vision - Weight of reference in the main output*/
+    int32_t w_vsn_out_prev_LUT[32];
+    /*!< w_vsn_out_spl_LUT[32] Vision - Weight of spatial in the main output*/
+    int32_t w_vsn_out_spl_LUT[32];
+
+} ia_pal_isp_tnr7_blend_1_0_t;
+
+/*! \isp struct tnr7_cme_1_0
+
+*/
+typedef struct
+{
+    /*!< enable Enable TNR7 CME (Course Motion Estimation)*/
+    int32_t enable;
+    /*!< input_width Input Base and Dest Image Width*/
+    int32_t input_width;
+    /*!< input_height Input Base and Dest Image Height*/
+    int32_t input_height;
+    /*!< hor_search_enable Enable Horizontal MV Estimation*/
+    int32_t hor_search_enable;
+    /*!< ver_search_enable Enable Vertical MV Estimation*/
+    int32_t ver_search_enable;
+    /*!< half_pel_enable Enable Half-Pixel MV Estimation*/
+    int32_t half_pel_enable;
+    /*!< quarter_pel_enable Enable Quarter-Pixel MV Estimation*/
+    int32_t quarter_pel_enable;
+    /*!< search_range_x Integer MV Search Displacement X*/
+    int32_t search_range_x;
+    /*!< search_range_y Integer MV Search Displacement Y*/
+    int32_t search_range_y;
+    /*!< spatial_reg_mod_factor Spatial Noise Level to Regularization Factor*/
+    int32_t spatial_reg_mod_factor;
+    /*!< temporal_reg_mod_factor Temporal Noise Level to Regularization Factor*/
+    int32_t temporal_reg_mod_factor;
+    /*!< noise_confidence_factor Confidence Base Noise Scale Factor*/
+    int32_t noise_confidence_factor;
+    /*!< confidence_thr High Confidence Model Minimum Threshold*/
+    int32_t confidence_thr;
+    /*!< model_confidence_deadzone Valid Confidence Model Minimum Threshold*/
+    int32_t model_confidence_deadzone;
+    /*!< noise_thr_est_enable Enable Automatic Noise Level Estimation*/
+    int32_t noise_thr_est_enable;
+    /*!< noise_thr Characterization Specified Noise Level*/
+    int32_t noise_thr;
+    /*!< noise_apu_min Noise APU Minimum Threshold*/
+    int32_t noise_apu_min;
+    /*!< noise_apu_alpha_limit Noise APU Alpha Limit*/
+    int32_t noise_apu_alpha_limit;
+    /*!< noise_apu_alpha_power Noise APU Alpha Power*/
+    int32_t noise_apu_alpha_power;
+    /*!< predictor_enable Enable Predictor (Parametric Model)*/
+    int32_t predictor_enable;
+    /*!< model_valid SaveRestore Predictor Model Valid*/
+    int32_t model_valid;
+    /*!< model_confidence SaveRestore Predictor Model Confidence*/
+    int32_t model_confidence;
+    /*!< model_ax0 SaveRestore Predictor Model X Component Shift*/
+    int32_t model_ax0;
+    /*!< model_ay0 SaveRestore Predictor Model Y Component Shift*/
+    int32_t model_ay0;
+    /*!< model_ax1 SaveRestore Predictor Model X Component Scale*/
+    int32_t model_ax1;
+    /*!< model_ay1 SaveRestore Predictor Model Y Component Scale*/
+    int32_t model_ay1;
+    /*!< noise_estimator_level_valid SaveRestore Noise Estimator Level Valid*/
+    int32_t noise_estimator_level_valid;
+    /*!< noise_estimator_level SaveRestore Noise Estimator Level*/
+    int32_t noise_estimator_level;
+
+} ia_pal_isp_tnr7_cme_1_0_t;
+
+/*! \isp struct tnr7_ims_1_0
+
+*/
+typedef struct
+{
+    /*!< enable block enable*/
+    int32_t enable;
+    /*!< update_limit Limit of S&R parameter update mechanism*/
+    int32_t update_limit;
+    /*!< update_coeff S&R parameter update coefficient*/
+    int32_t update_coeff;
+    /*!< do_update Enables S&R update mechanism for distance log-likelihood distribution*/
+    int32_t do_update;
+    /*!< d_ml[16] Maximum-likelihood of distance distribution*/
+    int32_t d_ml[16];
+    /*!< d_slopes[16] Distance log-likelihood slopes*/
+    int32_t d_slopes[16];
+    /*!< d_top[16] Distance log-likelihood constants*/
+    int32_t d_top[16];
+    /*!< outofbounds[16] Is ml value out-of-hostogram-bounds?*/
+    int32_t outofbounds[16];
+    /*!< d_ml_user[16] Maximum-likelihood of distance distribution (specified by user during offline calibration)*/
+    int32_t d_ml_user[16];
+    /*!< d_slopes_user[16] Distance log-likelihood slopes (specified by user during offline calibration)*/
+    int32_t d_slopes_user[16];
+    /*!< d_top_user[16] Distance log-likelihood constants (specified by user during offline calibration)*/
+    int32_t d_top_user[16];
+    /*!< gpu_mode meta parameter for controlling convolution implementation: 0 - HW implementation  1 - GPU implementation*/
+    int32_t gpu_mode;
+    /*!< mbd_enable Enable bit of motion boundary detection submodule*/
+    int32_t mbd_enable;
+    /*!< mbd_sensitivity Gradient threshold sensitivity modifer parameter U3.6*/
+    int32_t mbd_sensitivity;
+    /*!< mbd_gradient_threshold Automatically estimated gradient threshold U1.8*/
+    int32_t mbd_gradient_threshold;
+    /*!< mbd_global_mag Automatically estimated global motion vector magnitude U9.3*/
+    int32_t mbd_global_mag;
+    /*!< mbd_stationary_mag_offset Global motion soft threshold - offset U9.3*/
+    int32_t mbd_stationary_mag_offset;
+    /*!< mbd_stationary_mag_slope Global motion soft threshold - slope S+3.10*/
+    int32_t mbd_stationary_mag_slope;
+    /*!< mbd_gradient_percentile Gradient CDF search threshold U0.7*/
+    int32_t mbd_gradient_percentile;
+    /*!< mbd_gradient_thr_user 1) When > 0, statically specified gradient threshold 2) When == 0, dynamic threshold estimated from histogram U1.8*/
+    int32_t mbd_gradient_thr_user;
+    /*!< mbd_gradient_thr_update Gradient estimate update rate U1.6*/
+    int32_t mbd_gradient_thr_update;
+    /*!< mbd_threshold_slope Slope of normalized gradient mult&clamp curve*/
+    int32_t mbd_threshold_slope;
+    /*!< mbd_mag_alpha_limit Global magnitude APU alpha limit*/
+    int32_t mbd_mag_alpha_limit;
+    /*!< mbd_mag_alpha_power Global magnitude alpha power*/
+    int32_t mbd_mag_alpha_power;
+    /*!< mbd_safe_pixel_thr IMS threshold for rejecting safe pixels based on MBS score Rejected pixels are > mbd_safe_pixel_thr*/
+    int32_t mbd_safe_pixel_thr;
+
+} ia_pal_isp_tnr7_ims_1_0_t;
+
+/*! \isp struct tnr7_mc_1_0
+
+*/
+typedef struct
+{
+    /*!< passThrough Passthrough (set the motion vectors to zero when enabled)*/
+    int32_t passThrough;
+    /*!< imageHeightFR Height (pixels) of the full-resolution image*/
+    int32_t imageHeightFR;
+    /*!< imageWidthFR Width (pixels) of the full-resolution image*/
+    int32_t imageWidthFR;
+    /*!< imageHeightDS Height (pixels) of the small-resoltion image*/
+    int32_t imageHeightDS;
+    /*!< imageWidthDS Width (pixels) of the small-resoltion image*/
+    int32_t imageWidthDS;
+
+} ia_pal_isp_tnr7_mc_1_0_t;
+
+/*! \isp struct tnr7_rme_1_0
+
+*/
+typedef struct
+{
+    /*!< rme16_image_height The height of base16y_in*/
+    int32_t rme16_image_height;
+    /*!< rme16_image_width The width of base16y_in*/
+    int32_t rme16_image_width;
+    /*!< rme4_image_height The height of base4y_in*/
+    int32_t rme4_image_height;
+    /*!< rme4_image_width The width of base4y_in*/
+    int32_t rme4_image_width;
+    /*!< rme_mv64_grid_height The height of the input motion grid*/
+    int32_t rme_mv64_grid_height;
+    /*!< rme_mv64_grid_width The width of the input motion grid*/
+    int32_t rme_mv64_grid_width;
+    /*!< rme_mv16y_max Maximal |mv16y| value*/
+    int32_t rme_mv16y_max;
+    /*!< rme_mv16x_max Maximal |mv16x| value*/
+    int32_t rme_mv16x_max;
+    /*!< rme16_band_height The height of the band update by rem16. Valid values: 1, 2, 4*/
+    int32_t rme16_band_height;
+    /*!< rme16_n_iterations Number of update iterations for each window location of the rme16 run. 0 = bypass update stage.*/
+    int32_t rme16_n_iterations;
+    /*!< rme4_n_iterations Number of update iterations for each window location of the rme4 run. 0 = bypass update stage.*/
+    int32_t rme4_n_iterations;
+    /*!< rme16_sv_wd_int Motion regulation parameter for rme16: SvWd*/
+    int32_t rme16_sv_wd_int;
+    /*!< rme4_sv_wd_int Motion regulation parameter for rme4: SvWd*/
+    int32_t rme4_sv_wd_int;
+    /*!< rme16_sv2_inv_man_int Motion regulation parameter for rme16: sv2inv = sv2inv_man * 2^sv2inv_exp*/
+    int32_t rme16_sv2_inv_man_int;
+    /*!< rme4_sv2_inv_man_int Motion regulation parameter for rme4: sv2inv = sv2inv_man * 2^sv2inv_exp*/
+    int32_t rme4_sv2_inv_man_int;
+    /*!< rme16_sv2_inv_exp Motion regulation parameter for rme16: sv2inv = sv2inv_man * 2^sv2inv_exp*/
+    int32_t rme16_sv2_inv_exp;
+    /*!< rme4_sv2_inv_exp Motion regulation parameter for rme4: sv2inv = sv2inv_man * 2^sv2inv_exp*/
+    int32_t rme4_sv2_inv_exp;
+    /*!< rme16_median_enable Enable median for rme16, when rme is not in pass-through mode*/
+    int32_t rme16_median_enable;
+    /*!< rme4_median_enable Enable median for rme4, when rme is not in pass-through mode*/
+    int32_t rme4_median_enable;
+    /*!< rme_out_resample_enable enable down-sampling of the final output, when resampling is enabled. 0: disabled, base4 density. 1: enabled, base16 density*/
+    int32_t rme_out_resample_enable;
+    /*!< rme_out_down_sample_enable down-sampling ratio of the final output, when resampling is enabled. 0 means no down-sampling, i.e. base4 density. 1 means down sampling x4, i.e. base 16 density*/
+    int32_t rme_out_down_sample_enable;
+    /*!< rme16_mc_pass_through motion compensation in pass through mode during rme16 run (for validation purposes). 0: normal operation. 1: pass-through mode (assu,es zero motion)*/
+    int32_t rme16_mc_pass_through;
+    /*!< rme4_mc_pass_through motion compensation in pass through mode during rme4 run (for validation purposes). 0: normal operation. 1: pass-through mode (assu,es zero motion)*/
+    int32_t rme4_mc_pass_through;
+
+} ia_pal_isp_tnr7_rme_1_0_t;
+
+/*! \isp struct tnr7_spatial_1_0
+
+*/
+typedef struct
+{
+    /*!< enable Enable TNR7 spatial fallback filter*/
+    int32_t enable;
+    /*!< noise_model_radius Controls noise model radius*/
+    int32_t noise_model_radius;
+    /*!< iir_luma_power iir luma filtering strength (0-only fir, 64-only iir)*/
+    int32_t iir_luma_power;
+    /*!< iir_chroma_power iir chroma filtering strength (0-only fir, 64-only iir)*/
+    int32_t iir_chroma_power;
+    /*!< luma_strength blending coef for luma channel (blend with input)*/
+    int32_t luma_strength;
+    /*!< chroma_strength blending coef for chroma channel (blend with input)*/
+    int32_t chroma_strength;
+    /*!< lumaLUT_v[16] self calibrating noise model (NM) state variables, luma*/
+    int32_t lumaLUT_v[16];
+    /*!< lumaLUT_v_bins[16] self calibrating noise model (NM) state variables, luma*/
+    int32_t lumaLUT_v_bins[16];
+    /*!< lumaLUT_v_limits[2] vertical luma NM limnits*/
+    int32_t lumaLUT_v_limits[2];
+    /*!< nmGain_h_limits[2] horizontal luma NM limnits*/
+    int32_t nmGain_h_limits[2];
+    /*!< nmGain_iir_limits[2] iir luma NM limnits*/
+    int32_t nmGain_iir_limits[2];
+    /*!< nmGain_h horizontal NM gain*/
+    int32_t nmGain_h;
+    /*!< nmGain_iir iir NM gain*/
+    int32_t nmGain_iir;
+    /*!< update_limit update rate of N lut (0-no update, 256-current frame only)*/
+    int32_t update_limit;
+    /*!< update_coeff slope of the update rate as a function of #samples*/
+    int32_t update_coeff;
+
+} ia_pal_isp_tnr7_spatial_1_0_t;
+
+/*! \isp struct tvs_1_0
+Trainable visual scaler
+*/
+typedef struct
+{
+    /*!< bypass Bypass TVS*/
+    int32_t bypass;
+    /*!< ds_bypass Bypass downscale computation in TVS*/
+    int32_t ds_bypass;
+    /*!< metadata_bypass Bypass metadata of TVS output*/
+    int32_t metadata_bypass;
+    /*!< ds_factor_hor_int Integer part of downscale factor in horizontal*/
+    int32_t ds_factor_hor_int;
+    /*!< ds_factor_hor_frac Fractional part of downscale factor in horizontal (Must be 0 when ds_factor_hor_int=1)*/
+    int32_t ds_factor_hor_frac;
+    /*!< ds_factor_ver_int Integer part of downscale factor in vertical*/
+    int32_t ds_factor_ver_int;
+    /*!< ds_factor_ver_frac Fractional part of downscale factor in vertical (Must be 0 when ds_factor_ver_int=1)*/
+    int32_t ds_factor_ver_frac;
+    /*!< input_frame_width Input frame width (must be even number)*/
+    int32_t input_frame_width;
+    /*!< input_frame_height Input frame height (must be even number)*/
+    int32_t input_frame_height;
+    /*!< csc_kernels[9] CSC layer kernel weights*/
+    int32_t csc_kernels[9];
+    /*!< csc_kernels_shift CSC layer kernels fixed point value shift*/
+    int32_t csc_kernels_shift;
+    /*!< csc_biases[3] CSC layer bias weights*/
+    int32_t csc_biases[3];
+    /*!< csc_biases_shift_offset CSC layer biases fixed point value shift offset compared with csc_kernels_shift*/
+    int32_t csc_biases_shift_offset;
+    /*!< csc_data_shift CSC layer output data value shift*/
+    int32_t csc_data_shift;
+    /*!< conv_depth_kernels[588] Conv layer deptheise kernel weights*/
+    int32_t conv_depth_kernels[588];
+    /*!< conv_depth_kernels_shift Conv layer depthwise kernels fixed point value shift*/
+    int32_t conv_depth_kernels_shift;
+    /*!< conv_point_kernels[360] Conv layer pointwise kernel weights*/
+    int32_t conv_point_kernels[360];
+    /*!< conv_point_kernels_shift Conv layer pointwise kernels fixed point value shift*/
+    int32_t conv_point_kernels_shift;
+    /*!< conv_biases[30] Conv layer bias weights*/
+    int32_t conv_biases[30];
+    /*!< conv_biases_shift_offset Conv layer biases fixed point value shift offset compared with conv_point_kernels_shift*/
+    int32_t conv_biases_shift_offset;
+    /*!< conv_data_shift Conv layer output data value shift*/
+    int32_t conv_data_shift;
+    /*!< cu_act_func_x[15] Activation function ConfigUnit x vector*/
+    int32_t cu_act_func_x[15];
+    /*!< cu_act_func_y[14] Activation function ConfigUnit y vector*/
+    int32_t cu_act_func_y[14];
+    /*!< cu_act_func_slope[14] Activation function ConfigUnit slope vector*/
+    int32_t cu_act_func_slope[14];
+    /*!< act_func_output_offset Offset after Activation function*/
+    int32_t act_func_output_offset;
+    /*!< avg_weights[30] Avg layer weights*/
+    int32_t avg_weights[30];
+    /*!< avg_weights_shift[3] Avg layer weights fixed point value shift for each output channel*/
+    int32_t avg_weights_shift[3];
+    /*!< avg_biases[3] Avg layer biases*/
+    int32_t avg_biases[3];
+    /*!< avg_biases_shift_offset[3] Avg layer biases fixed point value shift offet compared with avg_weights_shift for each output channel*/
+    int32_t avg_biases_shift_offset[3];
+    /*!< avg_data_shift[3] Weighted averaging fixed point value shift for each output channel*/
+    int32_t avg_data_shift[3];
+    /*!< output_format_420 Output data format (0: YUV444; 1: YUV420. It will be forced to 1 if either ds_bypass or bypass is enabled)*/
+    int32_t output_format_420;
+    /*!< output_bpp_scale Bit precision scale of output data (1: 2bpp; 2: 4bpp; 3:8bpp)*/
+    int32_t output_bpp_scale;
+    /*!< metadata_avg_factor Division approximated factor for metadata average*/
+    int32_t metadata_avg_factor;
+    /*!< metadata_avg_shift Division approximated shift for metadata average*/
+    int32_t metadata_avg_shift;
+
+} ia_pal_isp_tvs_1_0_t;
+
+/*! \isp struct vcr_3_1
+
+*/
+typedef struct
+{
+    /*!< enable enables the filter (YUV420 --> RGB444)*/
+    int32_t enable;
+    /*!< nb1 offset 1 yuv2rgb conversion, rgb = m * yuv + nb*/
+    int32_t nb1;
+    /*!< nb2 offset 2 yuv2rgb conversion, rgb = m * yuv + nb*/
+    int32_t nb2;
+    /*!< nb3 offset 3 yuv2rgb conversion, rgb = m * yuv + nb*/
+    int32_t nb3;
+    /*!< yuv2rgb_matrix[9] yuv to rgb conversion matrix, S4.11*/
+    int32_t yuv2rgb_matrix[9];
+
+} ia_pal_isp_vcr_3_1_t;
+
+/*! \isp struct vcr3
+
+*/
+typedef struct
+{
+    /*!< bypass_0_1 Bypass VCR2*/
+    int32_t bypass_0_1;
+    /*!< input_format_420 0 - input 4:4:4 , 1 - input 4:2:0*/
+    int32_t input_format_420;
+
+} ia_pal_isp_vcr3_t;
+
+/*! \isp struct vcsc_2_0
+
+*/
+typedef struct
+{
+    /*!< csc_c_matrix_arr[9] CSC Matrix components (S0.15)*/
+    int32_t csc_c_matrix_arr[9];
+    /*!< csc_b_vec_arr[3] CSC Vector components (S0.15)*/
+    int32_t csc_b_vec_arr[3];
+    /*!< chroma_ds_coeff_arr[8] Chroma downsample 4x2 filter coefficients (U2.0)*/
+    int32_t chroma_ds_coeff_arr[8];
+    /*!< chroma_ds_nf Chroma downsample 4x2 filter normalization factor*/
+    int32_t chroma_ds_nf;
+    /*!< enable Bypassing CSC. Outputting RGB to the Chroma downscale*/
+    int32_t enable;
+    /*!< uv_bin_output 0 = YUV4:2:0 output, 1 = YUV4:2:2 output*/
+    int32_t uv_bin_output;
+
+} ia_pal_isp_vcsc_2_0_t;
+
+/*! \isp struct vertical_padding_1_0
+padding
+*/
+typedef struct
+{
+    /*!< padding_top lines padding top*/
+    int32_t padding_top;
+    /*!< padding_bottom lines padding bottom*/
+    int32_t padding_bottom;
+
+} ia_pal_isp_vertical_padding_1_0_t;
+
+/*! \isp struct vltm_1_0
+
+*/
+typedef struct
+{
+    /*!< bypass bypass*/
+    int32_t bypass;
+    /*!< alpha U4.12 boost factor*/
+    int32_t alpha;
+    /*!< alpha_shift_factor U4.0 shift_factor for fixed point conversion*/
+    int32_t alpha_shift_factor;
+    /*!< cu_vltm_x[6] U12.0 cu_vltm_x*/
+    int32_t cu_vltm_x[6];
+    /*!< cu_vltm_y[5] U12.0 cu_vltm_y*/
+    int32_t cu_vltm_y[5];
+    /*!< cu_vltm_slope[5] S.12.4 cu_vltm_slope (16 bits including sign)*/
+    int32_t cu_vltm_slope[5];
+
+} ia_pal_isp_vltm_1_0_t;
+
+/*! \isp struct wb_1_1
+
+*/
+typedef struct
+{
+    /*!< bypass Bypass            {0,1}*/
+    int32_t bypass;
+    /*!< gainch0 Gain Channel0 (Gr) (U8.12)*/
+    int32_t gainch0;
+    /*!< gainch1 Gain Channel1 (Gb) (U8.12)*/
+    int32_t gainch1;
+    /*!< gainch2 Gain Channel2 (G)  (U8.12)*/
+    int32_t gainch2;
+    /*!< gainch3 Gain Channel3 (B)  (U8.12)*/
+    int32_t gainch3;
+    /*!< gainch4 Gain Channel4 (R)  (U8.12)*/
+    int32_t gainch4;
+    /*!< gainch5 Gain Channel5 (W)  (U8.12)*/
+    int32_t gainch5;
+    /*!< gainch6 Gain Channel6 (U8.12)*/
+    int32_t gainch6;
+    /*!< gainch7 Gain Channel7 (U8.12)*/
+    int32_t gainch7;
+    /*!< sensormode Sensor CFA size: 1x1 (0), 2x2 (1), 4x4 (2)*/
+    int32_t sensormode;
+    /*!< wbindmat[16] Vector WB matrix*/
+    int32_t wbindmat[16];
+
+} ia_pal_isp_wb_1_1_t;
+
+/*! \isp struct wb_sis
+
+*/
+typedef struct
+{
+    /*!< m_bypass Bypass            {0,1}*/
+    int32_t m_bypass;
+    /*!< m_gainch0 Gain Channel0 (Gr) (U4.12)*/
+    int32_t m_gainch0;
+    /*!< m_gainch1 Gain Channel1 (Gb) (U4.12)*/
+    int32_t m_gainch1;
+    /*!< m_gainch2 Gain Channel2 (G)  (U4.12)*/
+    int32_t m_gainch2;
+    /*!< m_gainch3 Gain Channel3 (B)  (U4.12)*/
+    int32_t m_gainch3;
+    /*!< m_gainch4 Gain Channel4 (R)  (U4.12)*/
+    int32_t m_gainch4;
+    /*!< m_gainch5 Gain Channel5 (W)  (U4.12)*/
+    int32_t m_gainch5;
+    /*!< m_gainch6 Gain Channel6 (U4.12)*/
+    int32_t m_gainch6;
+    /*!< m_gainch7 Gain Channel7 (U4.12)*/
+    int32_t m_gainch7;
+    /*!< m_sensormode 1x1 (0), 2x2 (1), 4x4 (2)*/
+    int32_t m_sensormode;
+    /*!< m_wbindmat[16] Vector WB matrix*/
+    int32_t m_wbindmat[16];
+
+} ia_pal_isp_wb_sis_t;
+
+/*! \isp struct x2i_md_1_0
+Monocular Depth
+*/
+typedef struct
+{
+    /*!< bypass by pass*/
+    int32_t bypass;
+    /*!< ver_bin_bypass bypass vertical binning when input is 2x4 PDAF*/
+    int32_t ver_bin_bypass;
+    /*!< bin_only do binning only and not calculate depth information*/
+    int32_t bin_only;
+    /*!< depth_map_bypass bypass depth map generation*/
+    int32_t depth_map_bypass;
+    /*!< bayer2y_bypass bypass bayer2y estimation when input is single channel phase disparity*/
+    int32_t bayer2y_bypass;
+    /*!< is_sve is input sve signal? If not, use simple Y computation; otherwise, use special Y computation*/
+    int32_t is_sve;
+    /*!< ver_bin_by_averaging whether to do vertical binning by averaging (0: by adding; 1: by averaging)*/
+    int32_t ver_bin_by_averaging;
+    /*!< hor_bin_by_averaging whether to do horizontal binning by averaging (0: by adding; 1: by averaging)*/
+    int32_t hor_bin_by_averaging;
+    /*!< win_width sliding window width for SAD computation*/
+    int32_t win_width;
+    /*!< min_shift minimum possible phase shift that estimation process will search*/
+    int32_t min_shift;
+    /*!< max_shift maximum possible phase shift that estimation process will search*/
+    int32_t max_shift;
+    /*!< shift_steps phase shift candidate steps*/
+    int32_t shift_steps;
+    /*!< y_compute_weights[16] Weights for y computation 3x3 filter (row by row, 6th, 7th, 8th, 10th, 11th, 12th, 14th, 15th, and 16th elements are used) in 2PD/4PD mode or 4x4 filter (row by row) in SVE mode. Sum of weights should be power of 2.*/
+    int32_t y_compute_weights[16];
+    /*!< y_compute_shift_0 shift scale of weight value for y computation at first stage  (the shift before saving to local buffer). The bit precision in local buffer is S18.*/
+    int32_t y_compute_shift_0;
+    /*!< y_compute_shift_1 shift scale of weight value for y computation at second stage (the shift before outputing final value)*/
+    int32_t y_compute_shift_1;
+    /*!< min_depth minimum depth showed in depth map (uint: mm) for visualization purpose*/
+    int32_t min_depth;
+    /*!< max_depth maximum depth showed in depth map (uint: mm) for visualization purpose*/
+    int32_t max_depth;
+    /*!< mono_radius number of neighbors at each side of SAD minimum point is monotonously increasing to be regarded as valid estimation result*/
+    int32_t mono_radius;
+    /*!< sad_diff_thresh_scale local SAD difference threshold dividing factor of power 2*/
+    int32_t sad_diff_thresh_scale;
+    /*!< min_sad_diff_thresh minimum SAD difference threshold to be considered as valid point*/
+    int32_t min_sad_diff_thresh;
+    /*!< max_sad_diff_thresh maximum SAD difference threshold to be considered as valid point*/
+    int32_t max_sad_diff_thresh;
+    /*!< interp_div_value_shift shift scale of division result used in equi-angle v interpolation*/
+    int32_t interp_div_value_shift;
+    /*!< vcm_value_shift shift scale of VCM value*/
+    int32_t vcm_value_shift;
+    /*!< phase_vcm_mapping_grid_width grid width of phase shift vs VCM mapping slope table in power of 2*/
+    int32_t phase_vcm_mapping_grid_width;
+    /*!< phase_vcm_mapping_grid_height grid height of phase shift vs VCM mapping slope table in power of 2*/
+    int32_t phase_vcm_mapping_grid_height;
+    /*!< phase_vcm_mapping_grid_block_num_hor horizontal block number in grid of phase shift vs VCM mapping slope table*/
+    int32_t phase_vcm_mapping_grid_block_num_hor;
+    /*!< phase_vcm_mapping_grid_block_num_ver vertical block number in grid of phase shift vs VCM mapping slope table*/
+    int32_t phase_vcm_mapping_grid_block_num_ver;
+    /*!< phase_vcm_mapping_slope[256] phase shift vs VCM mapping slope table*/
+    int32_t phase_vcm_mapping_slope[256];
+    /*!< current_vcm current VCM value*/
+    int32_t current_vcm;
+    /*!< phase_value_shift shift scale of phase shift value*/
+    int32_t phase_value_shift;
+    /*!< depth_lut_size size of depth look-up table*/
+    int32_t depth_lut_size;
+    /*!< depth_lutbase_levels[2] base levels of depth look-up table*/
+    int32_t depth_lutbase_levels[2];
+    /*!< depth_lut_start_bins[2] number of bins in depth look-up table*/
+    int32_t depth_lut_start_bins[2];
+    /*!< depth_lut_steps[2] step sizes of bins in depth look-up table in power of 2*/
+    int32_t depth_lut_steps[2];
+    /*!< depth_lut_values[187] value of depth look-up tables*/
+    int32_t depth_lut_values[187];
+
+} ia_pal_isp_x2i_md_1_0_t;
+
+/*! \isp struct xnr_5_1
+Low Frequency Chroma Denoiser
+*/
+typedef struct
+{
+    /*!< top_frame_width XNR5 input frame width*/
+    int32_t top_frame_width;
+    /*!< top_frame_height XNR5 input frame height*/
+    int32_t top_frame_height;
+    /*!< top_xnr_bypass Bypass entire xnr*/
+    int32_t top_xnr_bypass;
+    /*!< vhf_frame_width XNR5 input frame width*/
+    int32_t vhf_frame_width;
+    /*!< vhf_frame_height XNR5 input frame height*/
+    int32_t vhf_frame_height;
+    /*!< vhf_low_band_disable Lower band is disabled and zero on inputs*/
+    int32_t vhf_low_band_disable;
+    /*!< vhf_low_band_only Lower band directly goes to output and other inputs are zeroes*/
+    int32_t vhf_low_band_only;
+    /*!< hf_frame_width XNR5 input frame width*/
+    int32_t hf_frame_width;
+    /*!< hf_frame_height XNR5 input frame height*/
+    int32_t hf_frame_height;
+    /*!< hf_low_band_disable Lower band is disabled and zero on inputs*/
+    int32_t hf_low_band_disable;
+    /*!< hf_low_band_only Lower band directly goes to output and other inputs are zeroes*/
+    int32_t hf_low_band_only;
+    /*!< hf_nr_bypass Input YUV goes directly to output after vertical delay*/
+    int32_t hf_nr_bypass;
+    /*!< hf_se_bypass Replace all SE outputs with se_bypass_val*/
+    int32_t hf_se_bypass;
+    /*!< hf_se_bypass_val SE bypass value*/
+    int32_t hf_se_bypass_val;
+    /*!< mf_frame_width XNR5 input frame width*/
+    int32_t mf_frame_width;
+    /*!< mf_frame_height XNR5 input frame height*/
+    int32_t mf_frame_height;
+    /*!< mf_low_band_disable Lower band is disabled and zero on inputs*/
+    int32_t mf_low_band_disable;
+    /*!< mf_low_band_only Lower band directly goes to output and other inputs are zeroes*/
+    int32_t mf_low_band_only;
+    /*!< mf_nr_bypass Input YUV goes directly to output after vertical delay*/
+    int32_t mf_nr_bypass;
+    /*!< mf_se_bypass Replace all SE outputs with se_bypass_val*/
+    int32_t mf_se_bypass;
+    /*!< mf_se_bypass_val SE bypass value*/
+    int32_t mf_se_bypass_val;
+    /*!< lf_frame_width XNR5 input frame width*/
+    int32_t lf_frame_width;
+    /*!< lf_frame_height XNR5 input frame height*/
+    int32_t lf_frame_height;
+    /*!< lf_low_band_disable Lower band is disabled and zero on inputs*/
+    int32_t lf_low_band_disable;
+    /*!< lf_low_band_only Lower band directly goes to output and other inputs are zeroes*/
+    int32_t lf_low_band_only;
+    /*!< lf_nr_bypass Input YUV goes directly to output after vertical delay*/
+    int32_t lf_nr_bypass;
+    /*!< lf_se_bypass Replace all SE outputs with se_bypass_val*/
+    int32_t lf_se_bypass;
+    /*!< lf_se_bypass_val SE bypass value*/
+    int32_t lf_se_bypass_val;
+    /*!< vlf_frame_width XNR5 input frame width*/
+    int32_t vlf_frame_width;
+    /*!< vlf_frame_height XNR5 input frame height*/
+    int32_t vlf_frame_height;
+    /*!< vlf_low_band_disable Lower band is disabled and zero on inputs*/
+    int32_t vlf_low_band_disable;
+    /*!< vlf_low_band_only Lower band directly goes to output and other inputs are zeroes*/
+    int32_t vlf_low_band_only;
+    /*!< vlf_nr_bypass Input YUV goes directly to output after vertical delay*/
+    int32_t vlf_nr_bypass;
+    /*!< vlf_se_bypass Replace all SE outputs with se_bypass_val*/
+    int32_t vlf_se_bypass;
+    /*!< vlf_se_bypass_val SE bypass value*/
+    int32_t vlf_se_bypass_val;
+    /*!< Bypass Deprecated bypass parameter - to be removed!*/
+    int32_t Bypass;
+    /*!< top_viir_coefs_b[3] Param_Top_VIIR_b*/
+    int32_t top_viir_coefs_b[3];
+    /*!< top_viir_coefs_a[2] Param_Top_VIIR_a*/
+    int32_t top_viir_coefs_a[2];
+    /*!< top_viir_offset Param_Top_VIIR_offset*/
+    int32_t top_viir_offset;
+    /*!< top_viir_alpha Param_Top_VIIR_alpha*/
+    int32_t top_viir_alpha;
+    /*!< top_hus_vlf_image_coefs[9] Param_Top_HUS_VLF_Image_func*/
+    int32_t top_hus_vlf_image_coefs[9];
+    /*!< top_hus_vlf_delta_coefs[9] Param_Top_HUS_VLF_Delta_func*/
+    int32_t top_hus_vlf_delta_coefs[9];
+    /*!< top_hus_lf_image_coefs[5] Param_Top_HUS_LF_Image_func*/
+    int32_t top_hus_lf_image_coefs[5];
+    /*!< top_hus_lf_delta_coefs[5] Param_Top_HUS_LF_Delta_func*/
+    int32_t top_hus_lf_delta_coefs[5];
+    /*!< top_hus_mf_image_coefs[5] Param_Top_HUS_MF_Image_func*/
+    int32_t top_hus_mf_image_coefs[5];
+    /*!< top_hus_mf_delta_coefs[5] Param_Top_HUS_MF_Delta_func*/
+    int32_t top_hus_mf_delta_coefs[5];
+    /*!< hf_blf_2dfir_filter_length Param_HFC_BLF_FIR_BfLen*/
+    int32_t hf_blf_2dfir_filter_length;
+    /*!< hf_blf_2dfir_dcdc_bypass_y Param_HFC_BLF_FIR_bypassDCDifferentialCompensationY*/
+    int32_t hf_blf_2dfir_dcdc_bypass_y;
+    /*!< hf_blf_2dfir_dcdc_thresh_y_y Param_HFC_BLF_FIR_DCDiffThYy*/
+    uint32_t hf_blf_2dfir_dcdc_thresh_y_y;
+    /*!< hf_blf_2dfir_dcdc_thresh_y_u Param_HFC_BLF_FIR_DCDiffThYu*/
+    uint32_t hf_blf_2dfir_dcdc_thresh_y_u;
+    /*!< hf_blf_2dfir_dcdc_thresh_y_v Param_HFC_BLF_FIR_DCDiffThYv*/
+    uint32_t hf_blf_2dfir_dcdc_thresh_y_v;
+    /*!< hf_blf_2dfir_dcdc_bypass_uv Param_HFC_BLF_FIR_bypassDCDifferentialCompensationUV*/
+    int32_t hf_blf_2dfir_dcdc_bypass_uv;
+    /*!< hf_blf_2dfir_dcdc_thresh_uv_y Param_HFC_BLF_FIR_DCDiffThUVy*/
+    uint32_t hf_blf_2dfir_dcdc_thresh_uv_y;
+    /*!< hf_blf_2dfir_dcdc_thresh_uv_u Param_HFC_BLF_FIR_DCDiffThUVu*/
+    uint32_t hf_blf_2dfir_dcdc_thresh_uv_u;
+    /*!< hf_blf_2dfir_dcdc_thresh_uv_v Param_HFC_BLF_FIR_DCDiffThUVv*/
+    uint32_t hf_blf_2dfir_dcdc_thresh_uv_v;
+    /*!< hf_blf_colorspace Param_HFC_BLF_colorspaceYRB*/
+    int32_t hf_blf_colorspace;
+    /*!< hf_blf_noisemodel_basefunc_y_a_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacY_A_X*/
+    int32_t hf_blf_noisemodel_basefunc_y_a_x[5];
+    /*!< hf_blf_noisemodel_basefunc_y_a_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_A_Y*/
+    int32_t hf_blf_noisemodel_basefunc_y_a_y[4];
+    /*!< hf_blf_noisemodel_basefunc_y_a_slope[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_A_Slope*/
+    int32_t hf_blf_noisemodel_basefunc_y_a_slope[4];
+    /*!< hf_blf_noisemodel_basefunc_y_b_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacY_B_X*/
+    int32_t hf_blf_noisemodel_basefunc_y_b_x[5];
+    /*!< hf_blf_noisemodel_basefunc_y_b_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/
+    int32_t hf_blf_noisemodel_basefunc_y_b_y[4];
+    /*!< hf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/
+    int32_t hf_blf_noisemodel_basefunc_y_b_slope[4];
+    /*!< hf_blf_noisemodel_basefunc_y_c_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacY_C_X*/
+    int32_t hf_blf_noisemodel_basefunc_y_c_x[5];
+    /*!< hf_blf_noisemodel_basefunc_y_c_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/
+    int32_t hf_blf_noisemodel_basefunc_y_c_y[4];
+    /*!< hf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/
+    int32_t hf_blf_noisemodel_basefunc_y_c_slope[4];
+    /*!< hf_blf_noisemodel_basefunc_y_wbg Param_HFC_BLF_NoiseModel_sigmaParafacY_DEF*/
+    int32_t hf_blf_noisemodel_basefunc_y_wbg;
+    /*!< hf_blf_noisemodel_basefunc_u_a_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacU_A_X*/
+    int32_t hf_blf_noisemodel_basefunc_u_a_x[5];
+    /*!< hf_blf_noisemodel_basefunc_u_a_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/
+    int32_t hf_blf_noisemodel_basefunc_u_a_y[4];
+    /*!< hf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/
+    int32_t hf_blf_noisemodel_basefunc_u_a_slope[4];
+    /*!< hf_blf_noisemodel_basefunc_u_b_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacU_B_X*/
+    int32_t hf_blf_noisemodel_basefunc_u_b_x[5];
+    /*!< hf_blf_noisemodel_basefunc_u_b_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/
+    int32_t hf_blf_noisemodel_basefunc_u_b_y[4];
+    /*!< hf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/
+    int32_t hf_blf_noisemodel_basefunc_u_b_slope[4];
+    /*!< hf_blf_noisemodel_basefunc_u_c_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacU_C_X*/
+    int32_t hf_blf_noisemodel_basefunc_u_c_x[5];
+    /*!< hf_blf_noisemodel_basefunc_u_c_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/
+    int32_t hf_blf_noisemodel_basefunc_u_c_y[4];
+    /*!< hf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/
+    int32_t hf_blf_noisemodel_basefunc_u_c_slope[4];
+    /*!< hf_blf_noisemodel_basefunc_u_wbg Param_HFC_BLF_NoiseModel_sigmaParafacU_DEF*/
+    int32_t hf_blf_noisemodel_basefunc_u_wbg;
+    /*!< hf_blf_noisemodel_basefunc_v_a_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacV_A_X*/
+    int32_t hf_blf_noisemodel_basefunc_v_a_x[5];
+    /*!< hf_blf_noisemodel_basefunc_v_a_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/
+    int32_t hf_blf_noisemodel_basefunc_v_a_y[4];
+    /*!< hf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/
+    int32_t hf_blf_noisemodel_basefunc_v_a_slope[4];
+    /*!< hf_blf_noisemodel_basefunc_v_b_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacV_B_X*/
+    int32_t hf_blf_noisemodel_basefunc_v_b_x[5];
+    /*!< hf_blf_noisemodel_basefunc_v_b_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/
+    int32_t hf_blf_noisemodel_basefunc_v_b_y[4];
+    /*!< hf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/
+    int32_t hf_blf_noisemodel_basefunc_v_b_slope[4];
+    /*!< hf_blf_noisemodel_basefunc_v_c_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacV_C_X*/
+    int32_t hf_blf_noisemodel_basefunc_v_c_x[5];
+    /*!< hf_blf_noisemodel_basefunc_v_c_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/
+    int32_t hf_blf_noisemodel_basefunc_v_c_y[4];
+    /*!< hf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/
+    int32_t hf_blf_noisemodel_basefunc_v_c_slope[4];
+    /*!< hf_blf_noisemodel_basefunc_v_wbg Param_HFC_BLF_NoiseModel_sigmaParafacV_DEF*/
+    int32_t hf_blf_noisemodel_basefunc_v_wbg;
+    /*!< hf_blf_noisemodel_weight_uv_y Param_HFC_BLF_NoiseModel_sigmaWgtUVy*/
+    int32_t hf_blf_noisemodel_weight_uv_y;
+    /*!< hf_blf_noisemodel_weight_uv_u Param_HFC_BLF_NoiseModel_sigmaWgtUVu*/
+    int32_t hf_blf_noisemodel_weight_uv_u;
+    /*!< hf_blf_noisemodel_weight_uv_v Param_HFC_BLF_NoiseModel_sigmaWgtUVv*/
+    int32_t hf_blf_noisemodel_weight_uv_v;
+    /*!< hf_blf_noisemodel_radialdependent_bypass Param_HFC_BLF_NoiseModel_bypassRadialCorrection*/
+    int32_t hf_blf_noisemodel_radialdependent_bypass;
+    /*!< hf_blf_noisemodel_colordependent_bypass Param_HFC_BLF_NoiseModel_bypassColorDependent*/
+    int32_t hf_blf_noisemodel_colordependent_bypass;
+    /*!< hf_blf_noisemodel_graydependent_bypass Param_HFC_BLF_NoiseModel_bypassGrayDependent*/
+    int32_t hf_blf_noisemodel_graydependent_bypass;
+    /*!< hf_blf_noisemodel_radialdependent_x0_square Param_HFC_BLF_NoiseModel_radialDependent_x0_square*/
+    int32_t hf_blf_noisemodel_radialdependent_x0_square;
+    /*!< hf_blf_noisemodel_radialdependent_x0 Param_HFC_BLF_NoiseModel_radialDependent_x0*/
+    int32_t hf_blf_noisemodel_radialdependent_x0;
+    /*!< hf_blf_noisemodel_radialdependent_y0_square Param_HFC_BLF_NoiseModel_radialDependent_y0_square*/
+    int32_t hf_blf_noisemodel_radialdependent_y0_square;
+    /*!< hf_blf_noisemodel_radialdependent_y0 Param_HFC_BLF_NoiseModel_radialDependent_y0*/
+    int32_t hf_blf_noisemodel_radialdependent_y0;
+    /*!< hf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_HFC_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/
+    int32_t hf_blf_noisemodel_radialdependent_rshift_norm_square_distance;
+    /*!< hf_blf_noisemodel_radialdependent_gain_x[4] Param_HFC_BLF_NoiseModel_radialDependent_radialLut_X*/
+    int32_t hf_blf_noisemodel_radialdependent_gain_x[4];
+    /*!< hf_blf_noisemodel_radialdependent_gain_y[3] Param_HFC_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/
+    int32_t hf_blf_noisemodel_radialdependent_gain_y[3];
+    /*!< hf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/
+    int32_t hf_blf_noisemodel_radialdependent_gain_slope[3];
+    /*!< hf_blf_noisemodel_colordependent_a[32] Param_HFC_BLF_NoiseModel_colorDependent_A*/
+    int32_t hf_blf_noisemodel_colordependent_a[32];
+    /*!< hf_blf_noisemodel_colordependent_b[32] Param_HFC_BLF_NoiseModel_colorDependent_B*/
+    int32_t hf_blf_noisemodel_colordependent_b[32];
+    /*!< hf_blf_noisemodel_colordependent_c[32] Param_HFC_BLF_NoiseModel_colorDependent_C*/
+    int32_t hf_blf_noisemodel_colordependent_c[32];
+    /*!< hf_blf_noisemodel_colordependent_norm_offset Param_HFC_BLF_NoiseModel_colorDependent_normalization_offset*/
+    int32_t hf_blf_noisemodel_colordependent_norm_offset;
+    /*!< hf_blf_noisemodel_colordependent_gain_x[6] Param_HFC_BLF_NoiseModel_colorDependent_Lut_X*/
+    int32_t hf_blf_noisemodel_colordependent_gain_x[6];
+    /*!< hf_blf_noisemodel_colordependent_gain_y[5] Param_HFC_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/
+    int32_t hf_blf_noisemodel_colordependent_gain_y[5];
+    /*!< hf_blf_noisemodel_colordependent_gain_slope[5] Slope*/
+    int32_t hf_blf_noisemodel_colordependent_gain_slope[5];
+    /*!< hf_blf_noisemodel_graydependent_graylevel_thresh Param_HFC_BLF_NoiseModel_grayDependent_grayThrsh*/
+    int32_t hf_blf_noisemodel_graydependent_graylevel_thresh;
+    /*!< hf_blf_noisemodel_graydependent_graylevel_slope Param_HFC_BLF_NoiseModel_grayDependent_graySlope*/
+    int32_t hf_blf_noisemodel_graydependent_graylevel_slope;
+    /*!< hf_blf_noisemodel_graydependent_gain_x[6] Param_HFC_BLF_NoiseModel_grayDependent_transLut_X*/
+    int32_t hf_blf_noisemodel_graydependent_gain_x[6];
+    /*!< hf_blf_noisemodel_graydependent_gain_y[5] Param_HFC_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/
+    int32_t hf_blf_noisemodel_graydependent_gain_y[5];
+    /*!< hf_blf_noisemodel_graydependent_gain_slope[5] Slope*/
+    int32_t hf_blf_noisemodel_graydependent_gain_slope[5];
+    /*!< hf_blf_noisemodel_normfactor_uv_y Param_HFC_BLF_NoiseModel_invSigmaUVy*/
+    int32_t hf_blf_noisemodel_normfactor_uv_y;
+    /*!< hf_blf_noisemodel_normfactor_uv_u Param_HFC_BLF_NoiseModel_invSigmaUVu*/
+    int32_t hf_blf_noisemodel_normfactor_uv_u;
+    /*!< hf_blf_noisemodel_normfactor_uv_v Param_HFC_BLF_NoiseModel_invSigmaUVv*/
+    int32_t hf_blf_noisemodel_normfactor_uv_v;
+    /*!< hf_blf_snrm_bypass Param_HFC_BLF_SNRM_bypassSNRManagement*/
+    int32_t hf_blf_snrm_bypass;
+    /*!< hf_blf_snrm_slope_uv Param_HFC_BLF_SNRM_slopeUV*/
+    int32_t hf_blf_snrm_slope_uv;
+    /*!< hf_blf_snrm_xoffset_uv Param_HFC_BLF_SNRM_xoffsetUV*/
+    int32_t hf_blf_snrm_xoffset_uv;
+    /*!< hf_blf_snrm_maxval_uv Param_HFC_BLF_SNRM_maxValUV*/
+    int32_t hf_blf_snrm_maxval_uv;
+    /*!< hf_blf_snrm_minval_uv Param_HFC_BLF_SNRM_minValUV*/
+    int32_t hf_blf_snrm_minval_uv;
+    /*!< hf_afc_bypass Param_HFC_AFC_bypassAntiFalseColor*/
+    int32_t hf_afc_bypass;
+    /*!< hf_afc_weight_snr Param_HFC_AFC_wgtSnr*/
+    int32_t hf_afc_weight_snr;
+    /*!< hf_afc_weight_chroma Param_HFC_AFC_wgtC*/
+    int32_t hf_afc_weight_chroma;
+    /*!< hf_min_distance_clamp Param_HFC_min_distance_clamp*/
+    int32_t hf_min_distance_clamp;
+    /*!< mf_blf_2dfir_filter_length Param_MF_BLF_FIR_BfLen*/
+    int32_t mf_blf_2dfir_filter_length;
+    /*!< mf_blf_2dfir_luma_coefs[10] Param_MF_BLF_FIR_Kn_coef*/
+    int32_t mf_blf_2dfir_luma_coefs[10];
+    /*!< mf_blf_2dfir_luma_denom_bits Param_MF_BLF_FIR_Kn_denom_bits*/
+    int32_t mf_blf_2dfir_luma_denom_bits;
+    /*!< mf_blf_2dfir_dcdc_bypass_y Param_MF_BLF_FIR_bypassDCDifferentialCompensationY*/
+    int32_t mf_blf_2dfir_dcdc_bypass_y;
+    /*!< mf_blf_2dfir_dcdc_thresh_y_y Param_MF_BLF_FIR_DCDiffThYy*/
+    uint32_t mf_blf_2dfir_dcdc_thresh_y_y;
+    /*!< mf_blf_2dfir_dcdc_thresh_y_u Param_MF_BLF_FIR_DCDiffThYu*/
+    uint32_t mf_blf_2dfir_dcdc_thresh_y_u;
+    /*!< mf_blf_2dfir_dcdc_thresh_y_v Param_MF_BLF_FIR_DCDiffThYv*/
+    uint32_t mf_blf_2dfir_dcdc_thresh_y_v;
+    /*!< mf_blf_2dfir_dcdc_bypass_uv Param_MF_BLF_FIR_bypassDCDifferentialCompensationUV*/
+    int32_t mf_blf_2dfir_dcdc_bypass_uv;
+    /*!< mf_blf_2dfir_dcdc_thresh_uv_y Param_MF_BLF_FIR_DCDiffThUVy*/
+    uint32_t mf_blf_2dfir_dcdc_thresh_uv_y;
+    /*!< mf_blf_2dfir_dcdc_thresh_uv_u Param_MF_BLF_FIR_DCDiffThUVu*/
+    uint32_t mf_blf_2dfir_dcdc_thresh_uv_u;
+    /*!< mf_blf_2dfir_dcdc_thresh_uv_v Param_MF_BLF_FIR_DCDiffThUVv*/
+    uint32_t mf_blf_2dfir_dcdc_thresh_uv_v;
+    /*!< mf_blf_2dfir_bypass_snr_y Param_MF_BLF_FIR_bypasssSnrY*/
+    int32_t mf_blf_2dfir_bypass_snr_y;
+    /*!< mf_blf_colorspace Param_MF_BLF_colorspaceYRB*/
+    int32_t mf_blf_colorspace;
+    /*!< mf_blf_noisemodel_basefunc_y_a_x[5] Param_MF_BLF_NoiseModel_sigmaParafacY_A_X*/
+    int32_t mf_blf_noisemodel_basefunc_y_a_x[5];
+    /*!< mf_blf_noisemodel_basefunc_y_a_y[4] Param_MF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/
+    int32_t mf_blf_noisemodel_basefunc_y_a_y[4];
+    /*!< mf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/
+    int32_t mf_blf_noisemodel_basefunc_y_a_slope[4];
+    /*!< mf_blf_noisemodel_basefunc_y_b_x[5] Param_MF_BLF_NoiseModel_sigmaParafacY_B_X*/
+    int32_t mf_blf_noisemodel_basefunc_y_b_x[5];
+    /*!< mf_blf_noisemodel_basefunc_y_b_y[4] Param_MF_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/
+    int32_t mf_blf_noisemodel_basefunc_y_b_y[4];
+    /*!< mf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/
+    int32_t mf_blf_noisemodel_basefunc_y_b_slope[4];
+    /*!< mf_blf_noisemodel_basefunc_y_c_x[5] Param_MF_BLF_NoiseModel_sigmaParafacY_C_X*/
+    int32_t mf_blf_noisemodel_basefunc_y_c_x[5];
+    /*!< mf_blf_noisemodel_basefunc_y_c_y[4] Param_MF_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/
+    int32_t mf_blf_noisemodel_basefunc_y_c_y[4];
+    /*!< mf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/
+    int32_t mf_blf_noisemodel_basefunc_y_c_slope[4];
+    /*!< mf_blf_noisemodel_basefunc_y_wbg Param_MF_BLF_NoiseModel_sigmaParafacY_DEF*/
+    int32_t mf_blf_noisemodel_basefunc_y_wbg;
+    /*!< mf_blf_noisemodel_basefunc_u_a_x[5] Param_MF_BLF_NoiseModel_sigmaParafacU_A_X*/
+    int32_t mf_blf_noisemodel_basefunc_u_a_x[5];
+    /*!< mf_blf_noisemodel_basefunc_u_a_y[4] Param_MF_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/
+    int32_t mf_blf_noisemodel_basefunc_u_a_y[4];
+    /*!< mf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/
+    int32_t mf_blf_noisemodel_basefunc_u_a_slope[4];
+    /*!< mf_blf_noisemodel_basefunc_u_b_x[5] Param_MF_BLF_NoiseModel_sigmaParafacU_B_X*/
+    int32_t mf_blf_noisemodel_basefunc_u_b_x[5];
+    /*!< mf_blf_noisemodel_basefunc_u_b_y[4] Param_MF_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/
+    int32_t mf_blf_noisemodel_basefunc_u_b_y[4];
+    /*!< mf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/
+    int32_t mf_blf_noisemodel_basefunc_u_b_slope[4];
+    /*!< mf_blf_noisemodel_basefunc_u_c_x[5] Param_MF_BLF_NoiseModel_sigmaParafacU_C_X*/
+    int32_t mf_blf_noisemodel_basefunc_u_c_x[5];
+    /*!< mf_blf_noisemodel_basefunc_u_c_y[4] Param_MF_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/
+    int32_t mf_blf_noisemodel_basefunc_u_c_y[4];
+    /*!< mf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/
+    int32_t mf_blf_noisemodel_basefunc_u_c_slope[4];
+    /*!< mf_blf_noisemodel_basefunc_u_wbg Param_MF_BLF_NoiseModel_sigmaParafacU_DEF*/
+    int32_t mf_blf_noisemodel_basefunc_u_wbg;
+    /*!< mf_blf_noisemodel_basefunc_v_a_x[5] Param_MF_BLF_NoiseModel_sigmaParafacV_A_X*/
+    int32_t mf_blf_noisemodel_basefunc_v_a_x[5];
+    /*!< mf_blf_noisemodel_basefunc_v_a_y[4] Param_MF_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/
+    int32_t mf_blf_noisemodel_basefunc_v_a_y[4];
+    /*!< mf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/
+    int32_t mf_blf_noisemodel_basefunc_v_a_slope[4];
+    /*!< mf_blf_noisemodel_basefunc_v_b_x[5] Param_MF_BLF_NoiseModel_sigmaParafacV_B_X*/
+    int32_t mf_blf_noisemodel_basefunc_v_b_x[5];
+    /*!< mf_blf_noisemodel_basefunc_v_b_y[4] Param_MF_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/
+    int32_t mf_blf_noisemodel_basefunc_v_b_y[4];
+    /*!< mf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/
+    int32_t mf_blf_noisemodel_basefunc_v_b_slope[4];
+    /*!< mf_blf_noisemodel_basefunc_v_c_x[5] Param_MF_BLF_NoiseModel_sigmaParafacV_C_X*/
+    int32_t mf_blf_noisemodel_basefunc_v_c_x[5];
+    /*!< mf_blf_noisemodel_basefunc_v_c_y[4] Param_MF_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/
+    int32_t mf_blf_noisemodel_basefunc_v_c_y[4];
+    /*!< mf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/
+    int32_t mf_blf_noisemodel_basefunc_v_c_slope[4];
+    /*!< mf_blf_noisemodel_basefunc_v_wbg Param_MF_BLF_NoiseModel_sigmaParafacV_DEF*/
+    int32_t mf_blf_noisemodel_basefunc_v_wbg;
+    /*!< mf_blf_noisemodel_weight_y_y Param_MF_BLF_NoiseModel_sigmaWgtYy*/
+    int32_t mf_blf_noisemodel_weight_y_y;
+    /*!< mf_blf_noisemodel_weight_y_u Param_MF_BLF_NoiseModel_sigmaWgtYu*/
+    int32_t mf_blf_noisemodel_weight_y_u;
+    /*!< mf_blf_noisemodel_weight_y_v Param_MF_BLF_NoiseModel_sigmaWgtYv*/
+    int32_t mf_blf_noisemodel_weight_y_v;
+    /*!< mf_blf_noisemodel_weight_uv_y Param_MF_BLF_NoiseModel_sigmaWgtUVy*/
+    int32_t mf_blf_noisemodel_weight_uv_y;
+    /*!< mf_blf_noisemodel_weight_uv_u Param_MF_BLF_NoiseModel_sigmaWgtUVu*/
+    int32_t mf_blf_noisemodel_weight_uv_u;
+    /*!< mf_blf_noisemodel_weight_uv_v Param_MF_BLF_NoiseModel_sigmaWgtUVv*/
+    int32_t mf_blf_noisemodel_weight_uv_v;
+    /*!< mf_blf_noisemodel_radialdependent_bypass Param_MF_BLF_NoiseModel_bypassRadialCorrection*/
+    int32_t mf_blf_noisemodel_radialdependent_bypass;
+    /*!< mf_blf_noisemodel_colordependent_bypass Param_MF_BLF_NoiseModel_bypassColorDependent*/
+    int32_t mf_blf_noisemodel_colordependent_bypass;
+    /*!< mf_blf_noisemodel_graydependent_bypass Param_MF_BLF_NoiseModel_bypassGrayDependent*/
+    int32_t mf_blf_noisemodel_graydependent_bypass;
+    /*!< mf_blf_noisemodel_radialdependent_x0_square Param_MF_BLF_NoiseModel_radialDependent_x0_square*/
+    int32_t mf_blf_noisemodel_radialdependent_x0_square;
+    /*!< mf_blf_noisemodel_radialdependent_x0 Param_MF_BLF_NoiseModel_radialDependent_x0*/
+    int32_t mf_blf_noisemodel_radialdependent_x0;
+    /*!< mf_blf_noisemodel_radialdependent_y0_square Param_MF_BLF_NoiseModel_radialDependent_y0_square*/
+    int32_t mf_blf_noisemodel_radialdependent_y0_square;
+    /*!< mf_blf_noisemodel_radialdependent_y0 Param_MF_BLF_NoiseModel_radialDependent_y0*/
+    int32_t mf_blf_noisemodel_radialdependent_y0;
+    /*!< mf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_MF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/
+    int32_t mf_blf_noisemodel_radialdependent_rshift_norm_square_distance;
+    /*!< mf_blf_noisemodel_radialdependent_gain_x[4] Param_MF_BLF_NoiseModel_radialDependent_radialLut_X*/
+    int32_t mf_blf_noisemodel_radialdependent_gain_x[4];
+    /*!< mf_blf_noisemodel_radialdependent_gain_y[3] Param_MF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/
+    int32_t mf_blf_noisemodel_radialdependent_gain_y[3];
+    /*!< mf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/
+    int32_t mf_blf_noisemodel_radialdependent_gain_slope[3];
+    /*!< mf_blf_noisemodel_colordependent_a[32] Param_MF_BLF_NoiseModel_colorDependent_A*/
+    int32_t mf_blf_noisemodel_colordependent_a[32];
+    /*!< mf_blf_noisemodel_colordependent_b[32] Param_MF_BLF_NoiseModel_colorDependent_B*/
+    int32_t mf_blf_noisemodel_colordependent_b[32];
+    /*!< mf_blf_noisemodel_colordependent_c[32] Param_MF_BLF_NoiseModel_colorDependent_C*/
+    int32_t mf_blf_noisemodel_colordependent_c[32];
+    /*!< mf_blf_noisemodel_colordependent_norm_offset Param_MF_BLF_NoiseModel_colorDependent_normalization_offset*/
+    int32_t mf_blf_noisemodel_colordependent_norm_offset;
+    /*!< mf_blf_noisemodel_colordependent_gain_x[6] Param_MF_BLF_NoiseModel_colorDependent_Lut_X*/
+    int32_t mf_blf_noisemodel_colordependent_gain_x[6];
+    /*!< mf_blf_noisemodel_colordependent_gain_y[5] Param_MF_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/
+    int32_t mf_blf_noisemodel_colordependent_gain_y[5];
+    /*!< mf_blf_noisemodel_colordependent_gain_slope[5] Slope*/
+    int32_t mf_blf_noisemodel_colordependent_gain_slope[5];
+    /*!< mf_blf_noisemodel_graydependent_graylevel_thresh Param_MF_BLF_NoiseModel_grayDependent_grayThrsh*/
+    int32_t mf_blf_noisemodel_graydependent_graylevel_thresh;
+    /*!< mf_blf_noisemodel_graydependent_graylevel_slope Param_MF_BLF_NoiseModel_grayDependent_graySlope*/
+    int32_t mf_blf_noisemodel_graydependent_graylevel_slope;
+    /*!< mf_blf_noisemodel_graydependent_gain_x[6] Param_MF_BLF_NoiseModel_grayDependent_transLut_X*/
+    int32_t mf_blf_noisemodel_graydependent_gain_x[6];
+    /*!< mf_blf_noisemodel_graydependent_gain_y[5] Param_MF_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/
+    int32_t mf_blf_noisemodel_graydependent_gain_y[5];
+    /*!< mf_blf_noisemodel_graydependent_gain_slope[5] Slope*/
+    int32_t mf_blf_noisemodel_graydependent_gain_slope[5];
+    /*!< mf_blf_noisemodel_normfactor_y_y Param_MF_BLF_NoiseModel_invSigmaYy*/
+    int32_t mf_blf_noisemodel_normfactor_y_y;
+    /*!< mf_blf_noisemodel_normfactor_y_u Param_MF_BLF_NoiseModel_invSigmaYu*/
+    int32_t mf_blf_noisemodel_normfactor_y_u;
+    /*!< mf_blf_noisemodel_normfactor_y_v Param_MF_BLF_NoiseModel_invSigmaYv*/
+    int32_t mf_blf_noisemodel_normfactor_y_v;
+    /*!< mf_blf_noisemodel_normfactor_uv_y Param_MF_BLF_NoiseModel_invSigmaUVy*/
+    int32_t mf_blf_noisemodel_normfactor_uv_y;
+    /*!< mf_blf_noisemodel_normfactor_uv_u Param_MF_BLF_NoiseModel_invSigmaUVu*/
+    int32_t mf_blf_noisemodel_normfactor_uv_u;
+    /*!< mf_blf_noisemodel_normfactor_uv_v Param_MF_BLF_NoiseModel_invSigmaUVv*/
+    int32_t mf_blf_noisemodel_normfactor_uv_v;
+    /*!< mf_blf_snrm_bypass Param_MF_BLF_SNRM_bypassSNRManagement*/
+    int32_t mf_blf_snrm_bypass;
+    /*!< mf_blf_snrm_bypass_y Param_MF_BLF_SNRM_bypassY*/
+    int32_t mf_blf_snrm_bypass_y;
+    /*!< mf_blf_snrm_slope_y Param_MF_BLF_SNRM_slopeY*/
+    int32_t mf_blf_snrm_slope_y;
+    /*!< mf_blf_snrm_xoffset_y Param_MF_BLF_SNRM_xoffsetY*/
+    int32_t mf_blf_snrm_xoffset_y;
+    /*!< mf_blf_snrm_maxval_y Param_MF_BLF_SNRM_maxValY*/
+    int32_t mf_blf_snrm_maxval_y;
+    /*!< mf_blf_snrm_minval_y Param_MF_BLF_SNRM_minValY*/
+    int32_t mf_blf_snrm_minval_y;
+    /*!< mf_blf_snrm_slope_uv Param_MF_BLF_SNRM_slopeUV*/
+    int32_t mf_blf_snrm_slope_uv;
+    /*!< mf_blf_snrm_xoffset_uv Param_MF_BLF_SNRM_xoffsetUV*/
+    int32_t mf_blf_snrm_xoffset_uv;
+    /*!< mf_blf_snrm_maxval_uv Param_MF_BLF_SNRM_maxValUV*/
+    int32_t mf_blf_snrm_maxval_uv;
+    /*!< mf_blf_snrm_minval_uv Param_MF_BLF_SNRM_minValUV*/
+    int32_t mf_blf_snrm_minval_uv;
+    /*!< mf_afc_bypass Param_MF_AFC_bypassAntiFalseColor*/
+    int32_t mf_afc_bypass;
+    /*!< mf_afc_weight_snr Param_MF_AFC_wgtSnr*/
+    int32_t mf_afc_weight_snr;
+    /*!< mf_afc_weight_chroma Param_MF_AFC_wgtC*/
+    int32_t mf_afc_weight_chroma;
+    /*!< mf_min_distance_clamp Param_MF_min_distance_clamp*/
+    int32_t mf_min_distance_clamp;
+    /*!< lf_blf_fir_filter_length Param_LF_BLF_FIR_BfLen*/
+    int32_t lf_blf_fir_filter_length;
+    /*!< lf_blf_fir_luma_coefs[6] Param_LF_BLF_FIR_Kn_coef*/
+    int32_t lf_blf_fir_luma_coefs[6];
+    /*!< lf_blf_fir_luma_denom_bits Param_LF_BLF_FIR_Kn_denom_bits*/
+    int32_t lf_blf_fir_luma_denom_bits;
+    /*!< lf_blf_fir_bypass_snr_y Param_LF_BLF_FIR_bypasssSnrY*/
+    int32_t lf_blf_fir_bypass_snr_y;
+    /*!< lf_blf_colorspace Param_LF_BLF_colorspaceYRB*/
+    int32_t lf_blf_colorspace;
+    /*!< lf_blf_noisemodel_basefunc_y_a_x[5] Param_LF_BLF_NoiseModel_sigmaParafacY_A_X*/
+    int32_t lf_blf_noisemodel_basefunc_y_a_x[5];
+    /*!< lf_blf_noisemodel_basefunc_y_a_y[4] Param_LF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/
+    int32_t lf_blf_noisemodel_basefunc_y_a_y[4];
+    /*!< lf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/
+    int32_t lf_blf_noisemodel_basefunc_y_a_slope[4];
+    /*!< lf_blf_noisemodel_basefunc_y_b_x[5] Param_LF_BLF_NoiseModel_sigmaParafacY_B_X*/
+    int32_t lf_blf_noisemodel_basefunc_y_b_x[5];
+    /*!< lf_blf_noisemodel_basefunc_y_b_y[4] Param_LF_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/
+    int32_t lf_blf_noisemodel_basefunc_y_b_y[4];
+    /*!< lf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/
+    int32_t lf_blf_noisemodel_basefunc_y_b_slope[4];
+    /*!< lf_blf_noisemodel_basefunc_y_c_x[5] Param_LF_BLF_NoiseModel_sigmaParafacY_C_X*/
+    int32_t lf_blf_noisemodel_basefunc_y_c_x[5];
+    /*!< lf_blf_noisemodel_basefunc_y_c_y[4] Param_LF_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/
+    int32_t lf_blf_noisemodel_basefunc_y_c_y[4];
+    /*!< lf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/
+    int32_t lf_blf_noisemodel_basefunc_y_c_slope[4];
+    /*!< lf_blf_noisemodel_basefunc_y_wbg Param_LF_BLF_NoiseModel_sigmaParafacY_DEF*/
+    int32_t lf_blf_noisemodel_basefunc_y_wbg;
+    /*!< lf_blf_noisemodel_basefunc_u_a_x[5] Param_LF_BLF_NoiseModel_sigmaParafacU_A_X*/
+    int32_t lf_blf_noisemodel_basefunc_u_a_x[5];
+    /*!< lf_blf_noisemodel_basefunc_u_a_y[4] Param_LF_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/
+    int32_t lf_blf_noisemodel_basefunc_u_a_y[4];
+    /*!< lf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/
+    int32_t lf_blf_noisemodel_basefunc_u_a_slope[4];
+    /*!< lf_blf_noisemodel_basefunc_u_b_x[5] Param_LF_BLF_NoiseModel_sigmaParafacU_B_X*/
+    int32_t lf_blf_noisemodel_basefunc_u_b_x[5];
+    /*!< lf_blf_noisemodel_basefunc_u_b_y[4] Param_LF_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/
+    int32_t lf_blf_noisemodel_basefunc_u_b_y[4];
+    /*!< lf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/
+    int32_t lf_blf_noisemodel_basefunc_u_b_slope[4];
+    /*!< lf_blf_noisemodel_basefunc_u_c_x[5] Param_LF_BLF_NoiseModel_sigmaParafacU_C_X*/
+    int32_t lf_blf_noisemodel_basefunc_u_c_x[5];
+    /*!< lf_blf_noisemodel_basefunc_u_c_y[4] Param_LF_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/
+    int32_t lf_blf_noisemodel_basefunc_u_c_y[4];
+    /*!< lf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/
+    int32_t lf_blf_noisemodel_basefunc_u_c_slope[4];
+    /*!< lf_blf_noisemodel_basefunc_u_wbg Param_LF_BLF_NoiseModel_sigmaParafacU_DEF*/
+    int32_t lf_blf_noisemodel_basefunc_u_wbg;
+    /*!< lf_blf_noisemodel_basefunc_v_a_x[5] Param_LF_BLF_NoiseModel_sigmaParafacV_A_X*/
+    int32_t lf_blf_noisemodel_basefunc_v_a_x[5];
+    /*!< lf_blf_noisemodel_basefunc_v_a_y[4] Param_LF_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/
+    int32_t lf_blf_noisemodel_basefunc_v_a_y[4];
+    /*!< lf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/
+    int32_t lf_blf_noisemodel_basefunc_v_a_slope[4];
+    /*!< lf_blf_noisemodel_basefunc_v_b_x[5] Param_LF_BLF_NoiseModel_sigmaParafacV_B_X*/
+    int32_t lf_blf_noisemodel_basefunc_v_b_x[5];
+    /*!< lf_blf_noisemodel_basefunc_v_b_y[4] Param_LF_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/
+    int32_t lf_blf_noisemodel_basefunc_v_b_y[4];
+    /*!< lf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/
+    int32_t lf_blf_noisemodel_basefunc_v_b_slope[4];
+    /*!< lf_blf_noisemodel_basefunc_v_c_x[5] Param_LF_BLF_NoiseModel_sigmaParafacV_C_X*/
+    int32_t lf_blf_noisemodel_basefunc_v_c_x[5];
+    /*!< lf_blf_noisemodel_basefunc_v_c_y[4] Param_LF_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/
+    int32_t lf_blf_noisemodel_basefunc_v_c_y[4];
+    /*!< lf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/
+    int32_t lf_blf_noisemodel_basefunc_v_c_slope[4];
+    /*!< lf_blf_noisemodel_basefunc_v_wbg Param_LF_BLF_NoiseModel_sigmaParafacV_DEF*/
+    int32_t lf_blf_noisemodel_basefunc_v_wbg;
+    /*!< lf_blf_noisemodel_weight_y_y Param_LF_BLF_NoiseModel_sigmaWgtYy*/
+    int32_t lf_blf_noisemodel_weight_y_y;
+    /*!< lf_blf_noisemodel_weight_y_u Param_LF_BLF_NoiseModel_sigmaWgtYu*/
+    int32_t lf_blf_noisemodel_weight_y_u;
+    /*!< lf_blf_noisemodel_weight_y_v Param_LF_BLF_NoiseModel_sigmaWgtYv*/
+    int32_t lf_blf_noisemodel_weight_y_v;
+    /*!< lf_blf_noisemodel_weight_uv_y Param_LF_BLF_NoiseModel_sigmaWgtUVy*/
+    int32_t lf_blf_noisemodel_weight_uv_y;
+    /*!< lf_blf_noisemodel_weight_uv_u Param_LF_BLF_NoiseModel_sigmaWgtUVu*/
+    int32_t lf_blf_noisemodel_weight_uv_u;
+    /*!< lf_blf_noisemodel_weight_uv_v Param_LF_BLF_NoiseModel_sigmaWgtUVv*/
+    int32_t lf_blf_noisemodel_weight_uv_v;
+    /*!< lf_blf_noisemodel_radialdependent_bypass Param_LF_BLF_NoiseModel_bypassRadialCorrection*/
+    int32_t lf_blf_noisemodel_radialdependent_bypass;
+    /*!< lf_blf_noisemodel_colordependent_bypass Param_LF_BLF_NoiseModel_bypassColorDependent*/
+    int32_t lf_blf_noisemodel_colordependent_bypass;
+    /*!< lf_blf_noisemodel_graydependent_bypass Param_LF_BLF_NoiseModel_bypassGrayDependent*/
+    int32_t lf_blf_noisemodel_graydependent_bypass;
+    /*!< lf_blf_noisemodel_radialdependent_x0_square Param_LF_BLF_NoiseModel_radialDependent_x0_square*/
+    int32_t lf_blf_noisemodel_radialdependent_x0_square;
+    /*!< lf_blf_noisemodel_radialdependent_x0 Param_LF_BLF_NoiseModel_radialDependent_x0*/
+    int32_t lf_blf_noisemodel_radialdependent_x0;
+    /*!< lf_blf_noisemodel_radialdependent_y0_square Param_LF_BLF_NoiseModel_radialDependent_y0_square*/
+    int32_t lf_blf_noisemodel_radialdependent_y0_square;
+    /*!< lf_blf_noisemodel_radialdependent_y0 Param_LF_BLF_NoiseModel_radialDependent_y0*/
+    int32_t lf_blf_noisemodel_radialdependent_y0;
+    /*!< lf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_LF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/
+    int32_t lf_blf_noisemodel_radialdependent_rshift_norm_square_distance;
+    /*!< lf_blf_noisemodel_radialdependent_gain_x[4] Param_LF_BLF_NoiseModel_radialDependent_radialLut_X*/
+    int32_t lf_blf_noisemodel_radialdependent_gain_x[4];
+    /*!< lf_blf_noisemodel_radialdependent_gain_y[3] Param_LF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/
+    int32_t lf_blf_noisemodel_radialdependent_gain_y[3];
+    /*!< lf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/
+    int32_t lf_blf_noisemodel_radialdependent_gain_slope[3];
+    /*!< lf_blf_noisemodel_colordependent_a[32] Param_LF_BLF_NoiseModel_colorDependent_A*/
+    int32_t lf_blf_noisemodel_colordependent_a[32];
+    /*!< lf_blf_noisemodel_colordependent_b[32] Param_LF_BLF_NoiseModel_colorDependent_B*/
+    int32_t lf_blf_noisemodel_colordependent_b[32];
+    /*!< lf_blf_noisemodel_colordependent_c[32] Param_LF_BLF_NoiseModel_colorDependent_C*/
+    int32_t lf_blf_noisemodel_colordependent_c[32];
+    /*!< lf_blf_noisemodel_colordependent_norm_offset Param_LF_BLF_NoiseModel_colorDependent_normalization_offset*/
+    int32_t lf_blf_noisemodel_colordependent_norm_offset;
+    /*!< lf_blf_noisemodel_colordependent_gain_x[6] Param_LF_BLF_NoiseModel_colorDependent_Lut_X*/
+    int32_t lf_blf_noisemodel_colordependent_gain_x[6];
+    /*!< lf_blf_noisemodel_colordependent_gain_y[5] Param_LF_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/
+    int32_t lf_blf_noisemodel_colordependent_gain_y[5];
+    /*!< lf_blf_noisemodel_colordependent_gain_slope[5] Slope*/
+    int32_t lf_blf_noisemodel_colordependent_gain_slope[5];
+    /*!< lf_blf_noisemodel_graydependent_graylevel_thresh Param_LF_BLF_NoiseModel_grayDependent_grayThrsh*/
+    int32_t lf_blf_noisemodel_graydependent_graylevel_thresh;
+    /*!< lf_blf_noisemodel_graydependent_graylevel_slope Param_LF_BLF_NoiseModel_grayDependent_graySlope*/
+    int32_t lf_blf_noisemodel_graydependent_graylevel_slope;
+    /*!< lf_blf_noisemodel_graydependent_gain_x[6] Param_LF_BLF_NoiseModel_grayDependent_transLut_X*/
+    int32_t lf_blf_noisemodel_graydependent_gain_x[6];
+    /*!< lf_blf_noisemodel_graydependent_gain_y[5] Param_LF_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/
+    int32_t lf_blf_noisemodel_graydependent_gain_y[5];
+    /*!< lf_blf_noisemodel_graydependent_gain_slope[5] Slope*/
+    int32_t lf_blf_noisemodel_graydependent_gain_slope[5];
+    /*!< lf_blf_noisemodel_normfactor_y_y Param_LF_BLF_NoiseModel_invSigmaYy*/
+    int32_t lf_blf_noisemodel_normfactor_y_y;
+    /*!< lf_blf_noisemodel_normfactor_y_u Param_LF_BLF_NoiseModel_invSigmaYu*/
+    int32_t lf_blf_noisemodel_normfactor_y_u;
+    /*!< lf_blf_noisemodel_normfactor_y_v Param_LF_BLF_NoiseModel_invSigmaYv*/
+    int32_t lf_blf_noisemodel_normfactor_y_v;
+    /*!< lf_blf_noisemodel_normfactor_uv_y Param_LF_BLF_NoiseModel_invSigmaUVy*/
+    int32_t lf_blf_noisemodel_normfactor_uv_y;
+    /*!< lf_blf_noisemodel_normfactor_uv_u Param_LF_BLF_NoiseModel_invSigmaUVu*/
+    int32_t lf_blf_noisemodel_normfactor_uv_u;
+    /*!< lf_blf_noisemodel_normfactor_uv_v Param_LF_BLF_NoiseModel_invSigmaUVv*/
+    int32_t lf_blf_noisemodel_normfactor_uv_v;
+    /*!< lf_blf_snrm_bypass Param_LF_BLF_SNRM_bypassSNRManagement*/
+    int32_t lf_blf_snrm_bypass;
+    /*!< lf_blf_snrm_bypass_y Param_LF_BLF_SNRM_bypassY*/
+    int32_t lf_blf_snrm_bypass_y;
+    /*!< lf_blf_snrm_slope_y Param_LF_BLF_SNRM_slopeY*/
+    int32_t lf_blf_snrm_slope_y;
+    /*!< lf_blf_snrm_xoffset_y Param_LF_BLF_SNRM_xoffsetY*/
+    int32_t lf_blf_snrm_xoffset_y;
+    /*!< lf_blf_snrm_maxval_y Param_LF_BLF_SNRM_maxValY*/
+    int32_t lf_blf_snrm_maxval_y;
+    /*!< lf_blf_snrm_minval_y Param_LF_BLF_SNRM_minValY*/
+    int32_t lf_blf_snrm_minval_y;
+    /*!< lf_blf_snrm_slope_uv Param_LF_BLF_SNRM_slopeUV*/
+    int32_t lf_blf_snrm_slope_uv;
+    /*!< lf_blf_snrm_xoffset_uv Param_LF_BLF_SNRM_xoffsetUV*/
+    int32_t lf_blf_snrm_xoffset_uv;
+    /*!< lf_blf_snrm_maxval_uv Param_LF_BLF_SNRM_maxValUV*/
+    int32_t lf_blf_snrm_maxval_uv;
+    /*!< lf_blf_snrm_minval_uv Param_LF_BLF_SNRM_minValUV*/
+    int32_t lf_blf_snrm_minval_uv;
+    /*!< lf_blf_iir_alpha_y Param_LF_BLF_IIR_alphaY*/
+    int32_t lf_blf_iir_alpha_y;
+    /*!< lf_blf_iir_alpha_uv Param_LF_BLF_IIR_alphaUV*/
+    int32_t lf_blf_iir_alpha_uv;
+    /*!< lf_cs_bypass Param_LF_CS_bypassChromaSuppression*/
+    int32_t lf_cs_bypass;
+    /*!< lf_cs_coef Param_LF_CS_coef*/
+    int32_t lf_cs_coef;
+    /*!< lf_min_distance_clamp Param_LF_min_distance_clamp*/
+    int32_t lf_min_distance_clamp;
+    /*!< vlf_blf_fir_filter_length Param_VLF_BLF_FIR_BfLen*/
+    int32_t vlf_blf_fir_filter_length;
+    /*!< vlf_blf_fir_luma_coefs[6] Param_VLF_BLF_FIR_Kn_coef*/
+    int32_t vlf_blf_fir_luma_coefs[6];
+    /*!< vlf_blf_fir_luma_denom_bits Param_VLF_BLF_FIR_Kn_denom_bits*/
+    int32_t vlf_blf_fir_luma_denom_bits;
+    /*!< vlf_blf_fir_bypass_snr_y Param_VLF_BLF_FIR_bypasssSnrY*/
+    int32_t vlf_blf_fir_bypass_snr_y;
+    /*!< vlf_blf_colorspace Param_VLF_BLF_colorspaceYRB*/
+    int32_t vlf_blf_colorspace;
+    /*!< vlf_blf_noisemodel_basefunc_y_a_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacY_A_X*/
+    int32_t vlf_blf_noisemodel_basefunc_y_a_x[5];
+    /*!< vlf_blf_noisemodel_basefunc_y_a_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/
+    int32_t vlf_blf_noisemodel_basefunc_y_a_y[4];
+    /*!< vlf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/
+    int32_t vlf_blf_noisemodel_basefunc_y_a_slope[4];
+    /*!< vlf_blf_noisemodel_basefunc_y_b_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacY_B_X*/
+    int32_t vlf_blf_noisemodel_basefunc_y_b_x[5];
+    /*!< vlf_blf_noisemodel_basefunc_y_b_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/
+    int32_t vlf_blf_noisemodel_basefunc_y_b_y[4];
+    /*!< vlf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/
+    int32_t vlf_blf_noisemodel_basefunc_y_b_slope[4];
+    /*!< vlf_blf_noisemodel_basefunc_y_c_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacY_C_X*/
+    int32_t vlf_blf_noisemodel_basefunc_y_c_x[5];
+    /*!< vlf_blf_noisemodel_basefunc_y_c_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/
+    int32_t vlf_blf_noisemodel_basefunc_y_c_y[4];
+    /*!< vlf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/
+    int32_t vlf_blf_noisemodel_basefunc_y_c_slope[4];
+    /*!< vlf_blf_noisemodel_basefunc_y_wbg Param_VLF_BLF_NoiseModel_sigmaParafacY_DEF*/
+    int32_t vlf_blf_noisemodel_basefunc_y_wbg;
+    /*!< vlf_blf_noisemodel_basefunc_u_a_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacU_A_X*/
+    int32_t vlf_blf_noisemodel_basefunc_u_a_x[5];
+    /*!< vlf_blf_noisemodel_basefunc_u_a_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/
+    int32_t vlf_blf_noisemodel_basefunc_u_a_y[4];
+    /*!< vlf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/
+    int32_t vlf_blf_noisemodel_basefunc_u_a_slope[4];
+    /*!< vlf_blf_noisemodel_basefunc_u_b_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacU_B_X*/
+    int32_t vlf_blf_noisemodel_basefunc_u_b_x[5];
+    /*!< vlf_blf_noisemodel_basefunc_u_b_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/
+    int32_t vlf_blf_noisemodel_basefunc_u_b_y[4];
+    /*!< vlf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/
+    int32_t vlf_blf_noisemodel_basefunc_u_b_slope[4];
+    /*!< vlf_blf_noisemodel_basefunc_u_c_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacU_C_X*/
+    int32_t vlf_blf_noisemodel_basefunc_u_c_x[5];
+    /*!< vlf_blf_noisemodel_basefunc_u_c_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/
+    int32_t vlf_blf_noisemodel_basefunc_u_c_y[4];
+    /*!< vlf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/
+    int32_t vlf_blf_noisemodel_basefunc_u_c_slope[4];
+    /*!< vlf_blf_noisemodel_basefunc_u_wbg Param_VLF_BLF_NoiseModel_sigmaParafacU_DEF*/
+    int32_t vlf_blf_noisemodel_basefunc_u_wbg;
+    /*!< vlf_blf_noisemodel_basefunc_v_a_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacV_A_X*/
+    int32_t vlf_blf_noisemodel_basefunc_v_a_x[5];
+    /*!< vlf_blf_noisemodel_basefunc_v_a_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/
+    int32_t vlf_blf_noisemodel_basefunc_v_a_y[4];
+    /*!< vlf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/
+    int32_t vlf_blf_noisemodel_basefunc_v_a_slope[4];
+    /*!< vlf_blf_noisemodel_basefunc_v_b_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacV_B_X*/
+    int32_t vlf_blf_noisemodel_basefunc_v_b_x[5];
+    /*!< vlf_blf_noisemodel_basefunc_v_b_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/
+    int32_t vlf_blf_noisemodel_basefunc_v_b_y[4];
+    /*!< vlf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/
+    int32_t vlf_blf_noisemodel_basefunc_v_b_slope[4];
+    /*!< vlf_blf_noisemodel_basefunc_v_c_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacV_C_X*/
+    int32_t vlf_blf_noisemodel_basefunc_v_c_x[5];
+    /*!< vlf_blf_noisemodel_basefunc_v_c_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/
+    int32_t vlf_blf_noisemodel_basefunc_v_c_y[4];
+    /*!< vlf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/
+    int32_t vlf_blf_noisemodel_basefunc_v_c_slope[4];
+    /*!< vlf_blf_noisemodel_basefunc_v_wbg Param_VLF_BLF_NoiseModel_sigmaParafacV_DEF*/
+    int32_t vlf_blf_noisemodel_basefunc_v_wbg;
+    /*!< vlf_blf_noisemodel_weight_y_y Param_VLF_BLF_NoiseModel_sigmaWgtYy*/
+    int32_t vlf_blf_noisemodel_weight_y_y;
+    /*!< vlf_blf_noisemodel_weight_y_u Param_VLF_BLF_NoiseModel_sigmaWgtYu*/
+    int32_t vlf_blf_noisemodel_weight_y_u;
+    /*!< vlf_blf_noisemodel_weight_y_v Param_VLF_BLF_NoiseModel_sigmaWgtYv*/
+    int32_t vlf_blf_noisemodel_weight_y_v;
+    /*!< vlf_blf_noisemodel_weight_uv_y Param_VLF_BLF_NoiseModel_sigmaWgtUVy*/
+    int32_t vlf_blf_noisemodel_weight_uv_y;
+    /*!< vlf_blf_noisemodel_weight_uv_u Param_VLF_BLF_NoiseModel_sigmaWgtUVu*/
+    int32_t vlf_blf_noisemodel_weight_uv_u;
+    /*!< vlf_blf_noisemodel_weight_uv_v Param_VLF_BLF_NoiseModel_sigmaWgtUVv*/
+    int32_t vlf_blf_noisemodel_weight_uv_v;
+    /*!< vlf_blf_noisemodel_radialdependent_bypass Param_VLF_BLF_NoiseModel_bypassRadialCorrection*/
+    int32_t vlf_blf_noisemodel_radialdependent_bypass;
+    /*!< vlf_blf_noisemodel_colordependent_bypass Param_VLF_BLF_NoiseModel_bypassColorDependent*/
+    int32_t vlf_blf_noisemodel_colordependent_bypass;
+    /*!< vlf_blf_noisemodel_radialdependent_x0_square Param_VLF_BLF_NoiseModel_radialDependent_x0_square*/
+    int32_t vlf_blf_noisemodel_radialdependent_x0_square;
+    /*!< vlf_blf_noisemodel_radialdependent_x0 Param_VLF_BLF_NoiseModel_radialDependent_x0*/
+    int32_t vlf_blf_noisemodel_radialdependent_x0;
+    /*!< vlf_blf_noisemodel_radialdependent_y0_square Param_VLF_BLF_NoiseModel_radialDependent_y0_square*/
+    int32_t vlf_blf_noisemodel_radialdependent_y0_square;
+    /*!< vlf_blf_noisemodel_radialdependent_y0 Param_VLF_BLF_NoiseModel_radialDependent_y0*/
+    int32_t vlf_blf_noisemodel_radialdependent_y0;
+    /*!< vlf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_VLF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/
+    int32_t vlf_blf_noisemodel_radialdependent_rshift_norm_square_distance;
+    /*!< vlf_blf_noisemodel_radialdependent_gain_x[4] Param_VLF_BLF_NoiseModel_radialDependent_radialLut_X*/
+    int32_t vlf_blf_noisemodel_radialdependent_gain_x[4];
+    /*!< vlf_blf_noisemodel_radialdependent_gain_y[3] Param_VLF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/
+    int32_t vlf_blf_noisemodel_radialdependent_gain_y[3];
+    /*!< vlf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/
+    int32_t vlf_blf_noisemodel_radialdependent_gain_slope[3];
+    /*!< vlf_blf_noisemodel_colordependent_a[32] Param_VLF_BLF_NoiseModel_colorDependent_A*/
+    int32_t vlf_blf_noisemodel_colordependent_a[32];
+    /*!< vlf_blf_noisemodel_colordependent_b[32] Param_VLF_BLF_NoiseModel_colorDependent_B*/
+    int32_t vlf_blf_noisemodel_colordependent_b[32];
+    /*!< vlf_blf_noisemodel_colordependent_c[32] Param_VLF_BLF_NoiseModel_colorDependent_C*/
+    int32_t vlf_blf_noisemodel_colordependent_c[32];
+    /*!< vlf_blf_noisemodel_colordependent_norm_offset Param_VLF_BLF_NoiseModel_colorDependent_normalization_offset*/
+    int32_t vlf_blf_noisemodel_colordependent_norm_offset;
+    /*!< vlf_blf_noisemodel_colordependent_gain_x[6] Param_VLF_BLF_NoiseModel_colorDependent_Lut_X*/
+    int32_t vlf_blf_noisemodel_colordependent_gain_x[6];
+    /*!< vlf_blf_noisemodel_colordependent_gain_y[5] Param_VLF_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/
+    int32_t vlf_blf_noisemodel_colordependent_gain_y[5];
+    /*!< vlf_blf_noisemodel_colordependent_gain_slope[5] Slope*/
+    int32_t vlf_blf_noisemodel_colordependent_gain_slope[5];
+    /*!< vlf_blf_noisemodel_graydependent_gain_x[6] Param_VLF_BLF_NoiseModel_grayDependent_transLut_X*/
+    int32_t vlf_blf_noisemodel_graydependent_gain_x[6];
+    /*!< vlf_blf_noisemodel_graydependent_gain_y[5] Param_VLF_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/
+    int32_t vlf_blf_noisemodel_graydependent_gain_y[5];
+    /*!< vlf_blf_noisemodel_graydependent_gain_slope[5] Slope*/
+    int32_t vlf_blf_noisemodel_graydependent_gain_slope[5];
+    /*!< vlf_blf_noisemodel_normfactor_y_y Param_VLF_BLF_NoiseModel_invSigmaYy*/
+    int32_t vlf_blf_noisemodel_normfactor_y_y;
+    /*!< vlf_blf_noisemodel_normfactor_y_u Param_VLF_BLF_NoiseModel_invSigmaYu*/
+    int32_t vlf_blf_noisemodel_normfactor_y_u;
+    /*!< vlf_blf_noisemodel_normfactor_y_v Param_VLF_BLF_NoiseModel_invSigmaYv*/
+    int32_t vlf_blf_noisemodel_normfactor_y_v;
+    /*!< vlf_blf_noisemodel_normfactor_uv_y Param_VLF_BLF_NoiseModel_invSigmaUVy*/
+    int32_t vlf_blf_noisemodel_normfactor_uv_y;
+    /*!< vlf_blf_noisemodel_normfactor_uv_u Param_VLF_BLF_NoiseModel_invSigmaUVu*/
+    int32_t vlf_blf_noisemodel_normfactor_uv_u;
+    /*!< vlf_blf_noisemodel_normfactor_uv_v Param_VLF_BLF_NoiseModel_invSigmaUVv*/
+    int32_t vlf_blf_noisemodel_normfactor_uv_v;
+    /*!< vlf_blf_iir_alpha_y Param_VLF_BLF_IIR_alphaY*/
+    int32_t vlf_blf_iir_alpha_y;
+    /*!< vlf_blf_iir_alpha_uv Param_VLF_BLF_IIR_alphaUV*/
+    int32_t vlf_blf_iir_alpha_uv;
+    /*!< vlf_cs_bypass Param_VLF_CS_bypassChromaSuppression*/
+    int32_t vlf_cs_bypass;
+    /*!< vlf_cs_coef Param_VLF_CS_coef*/
+    int32_t vlf_cs_coef;
+    /*!< vlf_min_distance_clamp Param_VLF_min_distance_clamp*/
+    int32_t vlf_min_distance_clamp;
+    /*!< vhf_blf_noisemodel_basefunc_y_a_x[5] Param_VHF_BLF_NoiseModel_sigmaParafacY_A_X*/
+    int32_t vhf_blf_noisemodel_basefunc_y_a_x[5];
+    /*!< vhf_blf_noisemodel_basefunc_y_a_y[4] Param_VHF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/
+    int32_t vhf_blf_noisemodel_basefunc_y_a_y[4];
+    /*!< vhf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/
+    int32_t vhf_blf_noisemodel_basefunc_y_a_slope[4];
+    /*!< vhf_blf_noisemodel_basefunc_y_wbg Param_VHF_BLF_NoiseModel_sigmaParafacY_DEF*/
+    int32_t vhf_blf_noisemodel_basefunc_y_wbg;
+    /*!< vhf_blf_noisemodel_weight_y_y Param_VHF_BLF_NoiseModel_sigmaWgtYy*/
+    int32_t vhf_blf_noisemodel_weight_y_y;
+    /*!< vhf_blf_noisemodel_radialdependent_bypass Param_VHF_BLF_NoiseModel_bypassRadialCorrection*/
+    int32_t vhf_blf_noisemodel_radialdependent_bypass;
+    /*!< vhf_blf_noisemodel_radialdependent_x0_square Param_VHF_BLF_NoiseModel_radialDependent_x0_square*/
+    int32_t vhf_blf_noisemodel_radialdependent_x0_square;
+    /*!< vhf_blf_noisemodel_radialdependent_x0 Param_VHF_BLF_NoiseModel_radialDependent_x0*/
+    int32_t vhf_blf_noisemodel_radialdependent_x0;
+    /*!< vhf_blf_noisemodel_radialdependent_y0_square Param_VHF_BLF_NoiseModel_radialDependent_y0_square*/
+    int32_t vhf_blf_noisemodel_radialdependent_y0_square;
+    /*!< vhf_blf_noisemodel_radialdependent_y0 Param_VHF_BLF_NoiseModel_radialDependent_y0*/
+    int32_t vhf_blf_noisemodel_radialdependent_y0;
+    /*!< vhf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_VHF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/
+    int32_t vhf_blf_noisemodel_radialdependent_rshift_norm_square_distance;
+    /*!< vhf_blf_noisemodel_radialdependent_gain_x[4] Param_VHF_BLF_NoiseModel_radialDependent_radialLut_X*/
+    int32_t vhf_blf_noisemodel_radialdependent_gain_x[4];
+    /*!< vhf_blf_noisemodel_radialdependent_gain_y[3] Param_VHF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/
+    int32_t vhf_blf_noisemodel_radialdependent_gain_y[3];
+    /*!< vhf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/
+    int32_t vhf_blf_noisemodel_radialdependent_gain_slope[3];
+    /*!< vhf_blf_noisemodel_normfactor_y_y Param_VHF_BLF_NoiseModel_invSigmaYy*/
+    int32_t vhf_blf_noisemodel_normfactor_y_y;
+    /*!< vhf_blf_bypass Param_VHF_BLF_bypass*/
+    int32_t vhf_blf_bypass;
+    /*!< vhf_min_distance_clamp Param_VHF_min_distance_clamp*/
+    int32_t vhf_min_distance_clamp;
+
+} ia_pal_isp_xnr_5_1_t;
+
+/*! \isp struct xnr_5_2
+Low Frequency Chroma Denoiser
+*/
+typedef struct
+{
+    /*!< top_frame_width XNR5 input frame width*/
+    int32_t top_frame_width;
+    /*!< top_frame_height XNR5 input frame height*/
+    int32_t top_frame_height;
+    /*!< top_xnr_bypass Bypass entire xnr*/
+    int32_t top_xnr_bypass;
+    /*!< vhf_frame_width XNR5 input frame width*/
+    int32_t vhf_frame_width;
+    /*!< vhf_frame_height XNR5 input frame height*/
+    int32_t vhf_frame_height;
+    /*!< vhf_low_band_disable Lower band is disabled and zero on inputs*/
+    int32_t vhf_low_band_disable;
+    /*!< vhf_low_band_only Lower band directly goes to output and other inputs are zeroes*/
+    int32_t vhf_low_band_only;
+    /*!< hf_frame_width XNR5 input frame width*/
+    int32_t hf_frame_width;
+    /*!< hf_frame_height XNR5 input frame height*/
+    int32_t hf_frame_height;
+    /*!< hf_low_band_disable Lower band is disabled and zero on inputs*/
+    int32_t hf_low_band_disable;
+    /*!< hf_low_band_only Lower band directly goes to output and other inputs are zeroes*/
+    int32_t hf_low_band_only;
+    /*!< hf_nr_bypass Input YUV goes directly to output after vertical delay*/
+    int32_t hf_nr_bypass;
+    /*!< hf_se_bypass Replace all SE outputs with se_bypass_val*/
+    int32_t hf_se_bypass;
+    /*!< hf_se_bypass_val SE bypass value*/
+    int32_t hf_se_bypass_val;
+    /*!< mf_frame_width XNR5 input frame width*/
+    int32_t mf_frame_width;
+    /*!< mf_frame_height XNR5 input frame height*/
+    int32_t mf_frame_height;
+    /*!< mf_low_band_disable Lower band is disabled and zero on inputs*/
+    int32_t mf_low_band_disable;
+    /*!< mf_low_band_only Lower band directly goes to output and other inputs are zeroes*/
+    int32_t mf_low_band_only;
+    /*!< mf_nr_bypass Input YUV goes directly to output after vertical delay*/
+    int32_t mf_nr_bypass;
+    /*!< mf_se_bypass Replace all SE outputs with se_bypass_val*/
+    int32_t mf_se_bypass;
+    /*!< mf_se_bypass_val SE bypass value*/
+    int32_t mf_se_bypass_val;
+    /*!< lf_frame_width XNR5 input frame width*/
+    int32_t lf_frame_width;
+    /*!< lf_frame_height XNR5 input frame height*/
+    int32_t lf_frame_height;
+    /*!< lf_low_band_disable Lower band is disabled and zero on inputs*/
+    int32_t lf_low_band_disable;
+    /*!< lf_low_band_only Lower band directly goes to output and other inputs are zeroes*/
+    int32_t lf_low_band_only;
+    /*!< lf_nr_bypass Input YUV goes directly to output after vertical delay*/
+    int32_t lf_nr_bypass;
+    /*!< lf_se_bypass Replace all SE outputs with se_bypass_val*/
+    int32_t lf_se_bypass;
+    /*!< lf_se_bypass_val SE bypass value*/
+    int32_t lf_se_bypass_val;
+    /*!< vlf_frame_width XNR5 input frame width*/
+    int32_t vlf_frame_width;
+    /*!< vlf_frame_height XNR5 input frame height*/
+    int32_t vlf_frame_height;
+    /*!< vlf_low_band_disable Lower band is disabled and zero on inputs*/
+    int32_t vlf_low_band_disable;
+    /*!< vlf_low_band_only Lower band directly goes to output and other inputs are zeroes*/
+    int32_t vlf_low_band_only;
+    /*!< vlf_nr_bypass Input YUV goes directly to output after vertical delay*/
+    int32_t vlf_nr_bypass;
+    /*!< vlf_se_bypass Replace all SE outputs with se_bypass_val*/
+    int32_t vlf_se_bypass;
+    /*!< vlf_se_bypass_val SE bypass value*/
+    int32_t vlf_se_bypass_val;
+    /*!< Bypass Deprecated bypass parameter - to be removed!*/
+    int32_t Bypass;
+    /*!< top_viir_coefs_b[3] Param_Top_VIIR_b*/
+    int32_t top_viir_coefs_b[3];
+    /*!< top_viir_coefs_a[2] Param_Top_VIIR_a*/
+    int32_t top_viir_coefs_a[2];
+    /*!< top_viir_offset Param_Top_VIIR_offset*/
+    int32_t top_viir_offset;
+    /*!< top_viir_alpha Param_Top_VIIR_alpha*/
+    int32_t top_viir_alpha;
+    /*!< top_hus_vlf_image_coefs[9] Param_Top_HUS_VLF_Image_func*/
+    int32_t top_hus_vlf_image_coefs[9];
+    /*!< top_hus_vlf_delta_coefs[9] Param_Top_HUS_VLF_Delta_func*/
+    int32_t top_hus_vlf_delta_coefs[9];
+    /*!< top_hus_lf_image_coefs[5] Param_Top_HUS_LF_Image_func*/
+    int32_t top_hus_lf_image_coefs[5];
+    /*!< top_hus_lf_delta_coefs[5] Param_Top_HUS_LF_Delta_func*/
+    int32_t top_hus_lf_delta_coefs[5];
+    /*!< top_hus_mf_image_coefs[5] Param_Top_HUS_MF_Image_func*/
+    int32_t top_hus_mf_image_coefs[5];
+    /*!< top_hus_mf_delta_coefs[5] Param_Top_HUS_MF_Delta_func*/
+    int32_t top_hus_mf_delta_coefs[5];
+    /*!< hf_blf_2dfir_filter_length Param_HFC_BLF_FIR_BfLen*/
+    int32_t hf_blf_2dfir_filter_length;
+    /*!< hf_blf_2dfir_dcdc_bypass_y Param_HFC_BLF_FIR_bypassDCDifferentialCompensationY*/
+    int32_t hf_blf_2dfir_dcdc_bypass_y;
+    /*!< hf_blf_2dfir_dcdc_thresh_y_y Param_HFC_BLF_FIR_DCDiffThYy*/
+    uint32_t hf_blf_2dfir_dcdc_thresh_y_y;
+    /*!< hf_blf_2dfir_dcdc_thresh_y_u Param_HFC_BLF_FIR_DCDiffThYu*/
+    uint32_t hf_blf_2dfir_dcdc_thresh_y_u;
+    /*!< hf_blf_2dfir_dcdc_thresh_y_v Param_HFC_BLF_FIR_DCDiffThYv*/
+    uint32_t hf_blf_2dfir_dcdc_thresh_y_v;
+    /*!< hf_blf_2dfir_dcdc_bypass_uv Param_HFC_BLF_FIR_bypassDCDifferentialCompensationUV*/
+    int32_t hf_blf_2dfir_dcdc_bypass_uv;
+    /*!< hf_blf_2dfir_dcdc_thresh_uv_y Param_HFC_BLF_FIR_DCDiffThUVy*/
+    uint32_t hf_blf_2dfir_dcdc_thresh_uv_y;
+    /*!< hf_blf_2dfir_dcdc_thresh_uv_u Param_HFC_BLF_FIR_DCDiffThUVu*/
+    uint32_t hf_blf_2dfir_dcdc_thresh_uv_u;
+    /*!< hf_blf_2dfir_dcdc_thresh_uv_v Param_HFC_BLF_FIR_DCDiffThUVv*/
+    uint32_t hf_blf_2dfir_dcdc_thresh_uv_v;
+    /*!< hf_blf_colorspace Param_HFC_BLF_colorspaceYRB*/
+    int32_t hf_blf_colorspace;
+    /*!< hf_blf_noisemodel_basefunc_y_a_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacY_A_X*/
+    int32_t hf_blf_noisemodel_basefunc_y_a_x[5];
+    /*!< hf_blf_noisemodel_basefunc_y_a_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_A_Y*/
+    int32_t hf_blf_noisemodel_basefunc_y_a_y[4];
+    /*!< hf_blf_noisemodel_basefunc_y_a_slope[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_A_Slope*/
+    int32_t hf_blf_noisemodel_basefunc_y_a_slope[4];
+    /*!< hf_blf_noisemodel_basefunc_y_b_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacY_B_X*/
+    int32_t hf_blf_noisemodel_basefunc_y_b_x[5];
+    /*!< hf_blf_noisemodel_basefunc_y_b_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/
+    int32_t hf_blf_noisemodel_basefunc_y_b_y[4];
+    /*!< hf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/
+    int32_t hf_blf_noisemodel_basefunc_y_b_slope[4];
+    /*!< hf_blf_noisemodel_basefunc_y_c_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacY_C_X*/
+    int32_t hf_blf_noisemodel_basefunc_y_c_x[5];
+    /*!< hf_blf_noisemodel_basefunc_y_c_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/
+    int32_t hf_blf_noisemodel_basefunc_y_c_y[4];
+    /*!< hf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/
+    int32_t hf_blf_noisemodel_basefunc_y_c_slope[4];
+    /*!< hf_blf_noisemodel_basefunc_y_wbg Param_HFC_BLF_NoiseModel_sigmaParafacY_DEF*/
+    int32_t hf_blf_noisemodel_basefunc_y_wbg;
+    /*!< hf_blf_noisemodel_basefunc_u_a_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacU_A_X*/
+    int32_t hf_blf_noisemodel_basefunc_u_a_x[5];
+    /*!< hf_blf_noisemodel_basefunc_u_a_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/
+    int32_t hf_blf_noisemodel_basefunc_u_a_y[4];
+    /*!< hf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/
+    int32_t hf_blf_noisemodel_basefunc_u_a_slope[4];
+    /*!< hf_blf_noisemodel_basefunc_u_b_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacU_B_X*/
+    int32_t hf_blf_noisemodel_basefunc_u_b_x[5];
+    /*!< hf_blf_noisemodel_basefunc_u_b_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/
+    int32_t hf_blf_noisemodel_basefunc_u_b_y[4];
+    /*!< hf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/
+    int32_t hf_blf_noisemodel_basefunc_u_b_slope[4];
+    /*!< hf_blf_noisemodel_basefunc_u_c_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacU_C_X*/
+    int32_t hf_blf_noisemodel_basefunc_u_c_x[5];
+    /*!< hf_blf_noisemodel_basefunc_u_c_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/
+    int32_t hf_blf_noisemodel_basefunc_u_c_y[4];
+    /*!< hf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/
+    int32_t hf_blf_noisemodel_basefunc_u_c_slope[4];
+    /*!< hf_blf_noisemodel_basefunc_u_wbg Param_HFC_BLF_NoiseModel_sigmaParafacU_DEF*/
+    int32_t hf_blf_noisemodel_basefunc_u_wbg;
+    /*!< hf_blf_noisemodel_basefunc_v_a_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacV_A_X*/
+    int32_t hf_blf_noisemodel_basefunc_v_a_x[5];
+    /*!< hf_blf_noisemodel_basefunc_v_a_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/
+    int32_t hf_blf_noisemodel_basefunc_v_a_y[4];
+    /*!< hf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/
+    int32_t hf_blf_noisemodel_basefunc_v_a_slope[4];
+    /*!< hf_blf_noisemodel_basefunc_v_b_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacV_B_X*/
+    int32_t hf_blf_noisemodel_basefunc_v_b_x[5];
+    /*!< hf_blf_noisemodel_basefunc_v_b_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/
+    int32_t hf_blf_noisemodel_basefunc_v_b_y[4];
+    /*!< hf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/
+    int32_t hf_blf_noisemodel_basefunc_v_b_slope[4];
+    /*!< hf_blf_noisemodel_basefunc_v_c_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacV_C_X*/
+    int32_t hf_blf_noisemodel_basefunc_v_c_x[5];
+    /*!< hf_blf_noisemodel_basefunc_v_c_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/
+    int32_t hf_blf_noisemodel_basefunc_v_c_y[4];
+    /*!< hf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/
+    int32_t hf_blf_noisemodel_basefunc_v_c_slope[4];
+    /*!< hf_blf_noisemodel_basefunc_v_wbg Param_HFC_BLF_NoiseModel_sigmaParafacV_DEF*/
+    int32_t hf_blf_noisemodel_basefunc_v_wbg;
+    /*!< hf_blf_noisemodel_weight_uv_y Param_HFC_BLF_NoiseModel_sigmaWgtUVy*/
+    int32_t hf_blf_noisemodel_weight_uv_y;
+    /*!< hf_blf_noisemodel_weight_uv_u Param_HFC_BLF_NoiseModel_sigmaWgtUVu*/
+    int32_t hf_blf_noisemodel_weight_uv_u;
+    /*!< hf_blf_noisemodel_weight_uv_v Param_HFC_BLF_NoiseModel_sigmaWgtUVv*/
+    int32_t hf_blf_noisemodel_weight_uv_v;
+    /*!< hf_blf_noisemodel_radialdependent_bypass Param_HFC_BLF_NoiseModel_bypassRadialCorrection*/
+    int32_t hf_blf_noisemodel_radialdependent_bypass;
+    /*!< hf_blf_noisemodel_colordependent_bypass Param_HFC_BLF_NoiseModel_bypassColorDependent*/
+    int32_t hf_blf_noisemodel_colordependent_bypass;
+    /*!< hf_blf_noisemodel_graydependent_bypass Param_HFC_BLF_NoiseModel_bypassGrayDependent*/
+    int32_t hf_blf_noisemodel_graydependent_bypass;
+    /*!< hf_blf_noisemodel_radialdependent_x0_square Param_HFC_BLF_NoiseModel_radialDependent_x0_square*/
+    int32_t hf_blf_noisemodel_radialdependent_x0_square;
+    /*!< hf_blf_noisemodel_radialdependent_x0 Param_HFC_BLF_NoiseModel_radialDependent_x0*/
+    int32_t hf_blf_noisemodel_radialdependent_x0;
+    /*!< hf_blf_noisemodel_radialdependent_y0_square Param_HFC_BLF_NoiseModel_radialDependent_y0_square*/
+    int32_t hf_blf_noisemodel_radialdependent_y0_square;
+    /*!< hf_blf_noisemodel_radialdependent_y0 Param_HFC_BLF_NoiseModel_radialDependent_y0*/
+    int32_t hf_blf_noisemodel_radialdependent_y0;
+    /*!< hf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_HFC_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/
+    int32_t hf_blf_noisemodel_radialdependent_rshift_norm_square_distance;
+    /*!< hf_blf_noisemodel_radialdependent_gain_x[4] Param_HFC_BLF_NoiseModel_radialDependent_radialLut_X*/
+    int32_t hf_blf_noisemodel_radialdependent_gain_x[4];
+    /*!< hf_blf_noisemodel_radialdependent_gain_y[3] Param_HFC_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/
+    int32_t hf_blf_noisemodel_radialdependent_gain_y[3];
+    /*!< hf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/
+    int32_t hf_blf_noisemodel_radialdependent_gain_slope[3];
+    /*!< hf_blf_noisemodel_colordependent_a[32] Param_HFC_BLF_NoiseModel_colorDependent_A*/
+    int32_t hf_blf_noisemodel_colordependent_a[32];
+    /*!< hf_blf_noisemodel_colordependent_b[32] Param_HFC_BLF_NoiseModel_colorDependent_B*/
+    int32_t hf_blf_noisemodel_colordependent_b[32];
+    /*!< hf_blf_noisemodel_colordependent_c[32] Param_HFC_BLF_NoiseModel_colorDependent_C*/
+    int32_t hf_blf_noisemodel_colordependent_c[32];
+    /*!< hf_blf_noisemodel_colordependent_norm_offset Param_HFC_BLF_NoiseModel_colorDependent_normalization_offset*/
+    int32_t hf_blf_noisemodel_colordependent_norm_offset;
+    /*!< hf_blf_noisemodel_colordependent_gain_x[6] Param_HFC_BLF_NoiseModel_colorDependent_Lut_X*/
+    int32_t hf_blf_noisemodel_colordependent_gain_x[6];
+    /*!< hf_blf_noisemodel_colordependent_gain_y[5] Param_HFC_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/
+    int32_t hf_blf_noisemodel_colordependent_gain_y[5];
+    /*!< hf_blf_noisemodel_colordependent_gain_slope[5] Slope*/
+    int32_t hf_blf_noisemodel_colordependent_gain_slope[5];
+    /*!< hf_blf_noisemodel_graydependent_graylevel_thresh Param_HFC_BLF_NoiseModel_grayDependent_grayThrsh*/
+    int32_t hf_blf_noisemodel_graydependent_graylevel_thresh;
+    /*!< hf_blf_noisemodel_graydependent_graylevel_slope Param_HFC_BLF_NoiseModel_grayDependent_graySlope*/
+    int32_t hf_blf_noisemodel_graydependent_graylevel_slope;
+    /*!< hf_blf_noisemodel_graydependent_gain_x[6] Param_HFC_BLF_NoiseModel_grayDependent_transLut_X*/
+    int32_t hf_blf_noisemodel_graydependent_gain_x[6];
+    /*!< hf_blf_noisemodel_graydependent_gain_y[5] Param_HFC_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/
+    int32_t hf_blf_noisemodel_graydependent_gain_y[5];
+    /*!< hf_blf_noisemodel_graydependent_gain_slope[5] Slope*/
+    int32_t hf_blf_noisemodel_graydependent_gain_slope[5];
+    /*!< hf_blf_noisemodel_normfactor_uv_y Param_HFC_BLF_NoiseModel_invSigmaUVy*/
+    int32_t hf_blf_noisemodel_normfactor_uv_y;
+    /*!< hf_blf_noisemodel_normfactor_uv_u Param_HFC_BLF_NoiseModel_invSigmaUVu*/
+    int32_t hf_blf_noisemodel_normfactor_uv_u;
+    /*!< hf_blf_noisemodel_normfactor_uv_v Param_HFC_BLF_NoiseModel_invSigmaUVv*/
+    int32_t hf_blf_noisemodel_normfactor_uv_v;
+    /*!< hf_blf_snrm_bypass Param_HFC_BLF_SNRM_bypassSNRManagement*/
+    int32_t hf_blf_snrm_bypass;
+    /*!< hf_blf_snrm_slope_uv Param_HFC_BLF_SNRM_slopeUV*/
+    int32_t hf_blf_snrm_slope_uv;
+    /*!< hf_blf_snrm_xoffset_uv Param_HFC_BLF_SNRM_xoffsetUV*/
+    int32_t hf_blf_snrm_xoffset_uv;
+    /*!< hf_blf_snrm_maxval_uv Param_HFC_BLF_SNRM_maxValUV*/
+    int32_t hf_blf_snrm_maxval_uv;
+    /*!< hf_blf_snrm_minval_uv Param_HFC_BLF_SNRM_minValUV*/
+    int32_t hf_blf_snrm_minval_uv;
+    /*!< hf_afc_bypass Param_HFC_AFC_bypassAntiFalseColor*/
+    int32_t hf_afc_bypass;
+    /*!< hf_afc_weight_snr Param_HFC_AFC_wgtSnr*/
+    int32_t hf_afc_weight_snr;
+    /*!< hf_afc_weight_chroma Param_HFC_AFC_wgtC*/
+    int32_t hf_afc_weight_chroma;
+    /*!< hf_min_distance_clamp Param_HFC_min_distance_clamp*/
+    int32_t hf_min_distance_clamp;
+    /*!< mf_blf_2dfir_filter_length Param_MF_BLF_FIR_BfLen*/
+    int32_t mf_blf_2dfir_filter_length;
+    /*!< mf_blf_2dfir_luma_coefs[10] Param_MF_BLF_FIR_Kn_coef*/
+    int32_t mf_blf_2dfir_luma_coefs[10];
+    /*!< mf_blf_2dfir_luma_denom_bits Param_MF_BLF_FIR_Kn_denom_bits*/
+    int32_t mf_blf_2dfir_luma_denom_bits;
+    /*!< mf_blf_2dfir_dcdc_bypass_y Param_MF_BLF_FIR_bypassDCDifferentialCompensationY*/
+    int32_t mf_blf_2dfir_dcdc_bypass_y;
+    /*!< mf_blf_2dfir_dcdc_thresh_y_y Param_MF_BLF_FIR_DCDiffThYy*/
+    uint32_t mf_blf_2dfir_dcdc_thresh_y_y;
+    /*!< mf_blf_2dfir_dcdc_thresh_y_u Param_MF_BLF_FIR_DCDiffThYu*/
+    uint32_t mf_blf_2dfir_dcdc_thresh_y_u;
+    /*!< mf_blf_2dfir_dcdc_thresh_y_v Param_MF_BLF_FIR_DCDiffThYv*/
+    uint32_t mf_blf_2dfir_dcdc_thresh_y_v;
+    /*!< mf_blf_2dfir_dcdc_bypass_uv Param_MF_BLF_FIR_bypassDCDifferentialCompensationUV*/
+    int32_t mf_blf_2dfir_dcdc_bypass_uv;
+    /*!< mf_blf_2dfir_dcdc_thresh_uv_y Param_MF_BLF_FIR_DCDiffThUVy*/
+    uint32_t mf_blf_2dfir_dcdc_thresh_uv_y;
+    /*!< mf_blf_2dfir_dcdc_thresh_uv_u Param_MF_BLF_FIR_DCDiffThUVu*/
+    uint32_t mf_blf_2dfir_dcdc_thresh_uv_u;
+    /*!< mf_blf_2dfir_dcdc_thresh_uv_v Param_MF_BLF_FIR_DCDiffThUVv*/
+    uint32_t mf_blf_2dfir_dcdc_thresh_uv_v;
+    /*!< mf_blf_2dfir_bypass_snr_y Param_MF_BLF_FIR_bypasssSnrY*/
+    int32_t mf_blf_2dfir_bypass_snr_y;
+    /*!< mf_blf_colorspace Param_MF_BLF_colorspaceYRB*/
+    int32_t mf_blf_colorspace;
+    /*!< mf_blf_noisemodel_basefunc_y_a_x[5] Param_MF_BLF_NoiseModel_sigmaParafacY_A_X*/
+    int32_t mf_blf_noisemodel_basefunc_y_a_x[5];
+    /*!< mf_blf_noisemodel_basefunc_y_a_y[4] Param_MF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/
+    int32_t mf_blf_noisemodel_basefunc_y_a_y[4];
+    /*!< mf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/
+    int32_t mf_blf_noisemodel_basefunc_y_a_slope[4];
+    /*!< mf_blf_noisemodel_basefunc_y_b_x[5] Param_MF_BLF_NoiseModel_sigmaParafacY_B_X*/
+    int32_t mf_blf_noisemodel_basefunc_y_b_x[5];
+    /*!< mf_blf_noisemodel_basefunc_y_b_y[4] Param_MF_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/
+    int32_t mf_blf_noisemodel_basefunc_y_b_y[4];
+    /*!< mf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/
+    int32_t mf_blf_noisemodel_basefunc_y_b_slope[4];
+    /*!< mf_blf_noisemodel_basefunc_y_c_x[5] Param_MF_BLF_NoiseModel_sigmaParafacY_C_X*/
+    int32_t mf_blf_noisemodel_basefunc_y_c_x[5];
+    /*!< mf_blf_noisemodel_basefunc_y_c_y[4] Param_MF_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/
+    int32_t mf_blf_noisemodel_basefunc_y_c_y[4];
+    /*!< mf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/
+    int32_t mf_blf_noisemodel_basefunc_y_c_slope[4];
+    /*!< mf_blf_noisemodel_basefunc_y_wbg Param_MF_BLF_NoiseModel_sigmaParafacY_DEF*/
+    int32_t mf_blf_noisemodel_basefunc_y_wbg;
+    /*!< mf_blf_noisemodel_basefunc_u_a_x[5] Param_MF_BLF_NoiseModel_sigmaParafacU_A_X*/
+    int32_t mf_blf_noisemodel_basefunc_u_a_x[5];
+    /*!< mf_blf_noisemodel_basefunc_u_a_y[4] Param_MF_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/
+    int32_t mf_blf_noisemodel_basefunc_u_a_y[4];
+    /*!< mf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/
+    int32_t mf_blf_noisemodel_basefunc_u_a_slope[4];
+    /*!< mf_blf_noisemodel_basefunc_u_b_x[5] Param_MF_BLF_NoiseModel_sigmaParafacU_B_X*/
+    int32_t mf_blf_noisemodel_basefunc_u_b_x[5];
+    /*!< mf_blf_noisemodel_basefunc_u_b_y[4] Param_MF_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/
+    int32_t mf_blf_noisemodel_basefunc_u_b_y[4];
+    /*!< mf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/
+    int32_t mf_blf_noisemodel_basefunc_u_b_slope[4];
+    /*!< mf_blf_noisemodel_basefunc_u_c_x[5] Param_MF_BLF_NoiseModel_sigmaParafacU_C_X*/
+    int32_t mf_blf_noisemodel_basefunc_u_c_x[5];
+    /*!< mf_blf_noisemodel_basefunc_u_c_y[4] Param_MF_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/
+    int32_t mf_blf_noisemodel_basefunc_u_c_y[4];
+    /*!< mf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/
+    int32_t mf_blf_noisemodel_basefunc_u_c_slope[4];
+    /*!< mf_blf_noisemodel_basefunc_u_wbg Param_MF_BLF_NoiseModel_sigmaParafacU_DEF*/
+    int32_t mf_blf_noisemodel_basefunc_u_wbg;
+    /*!< mf_blf_noisemodel_basefunc_v_a_x[5] Param_MF_BLF_NoiseModel_sigmaParafacV_A_X*/
+    int32_t mf_blf_noisemodel_basefunc_v_a_x[5];
+    /*!< mf_blf_noisemodel_basefunc_v_a_y[4] Param_MF_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/
+    int32_t mf_blf_noisemodel_basefunc_v_a_y[4];
+    /*!< mf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/
+    int32_t mf_blf_noisemodel_basefunc_v_a_slope[4];
+    /*!< mf_blf_noisemodel_basefunc_v_b_x[5] Param_MF_BLF_NoiseModel_sigmaParafacV_B_X*/
+    int32_t mf_blf_noisemodel_basefunc_v_b_x[5];
+    /*!< mf_blf_noisemodel_basefunc_v_b_y[4] Param_MF_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/
+    int32_t mf_blf_noisemodel_basefunc_v_b_y[4];
+    /*!< mf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/
+    int32_t mf_blf_noisemodel_basefunc_v_b_slope[4];
+    /*!< mf_blf_noisemodel_basefunc_v_c_x[5] Param_MF_BLF_NoiseModel_sigmaParafacV_C_X*/
+    int32_t mf_blf_noisemodel_basefunc_v_c_x[5];
+    /*!< mf_blf_noisemodel_basefunc_v_c_y[4] Param_MF_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/
+    int32_t mf_blf_noisemodel_basefunc_v_c_y[4];
+    /*!< mf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/
+    int32_t mf_blf_noisemodel_basefunc_v_c_slope[4];
+    /*!< mf_blf_noisemodel_basefunc_v_wbg Param_MF_BLF_NoiseModel_sigmaParafacV_DEF*/
+    int32_t mf_blf_noisemodel_basefunc_v_wbg;
+    /*!< mf_blf_noisemodel_weight_y_y Param_MF_BLF_NoiseModel_sigmaWgtYy*/
+    int32_t mf_blf_noisemodel_weight_y_y;
+    /*!< mf_blf_noisemodel_weight_y_u Param_MF_BLF_NoiseModel_sigmaWgtYu*/
+    int32_t mf_blf_noisemodel_weight_y_u;
+    /*!< mf_blf_noisemodel_weight_y_v Param_MF_BLF_NoiseModel_sigmaWgtYv*/
+    int32_t mf_blf_noisemodel_weight_y_v;
+    /*!< mf_blf_noisemodel_weight_uv_y Param_MF_BLF_NoiseModel_sigmaWgtUVy*/
+    int32_t mf_blf_noisemodel_weight_uv_y;
+    /*!< mf_blf_noisemodel_weight_uv_u Param_MF_BLF_NoiseModel_sigmaWgtUVu*/
+    int32_t mf_blf_noisemodel_weight_uv_u;
+    /*!< mf_blf_noisemodel_weight_uv_v Param_MF_BLF_NoiseModel_sigmaWgtUVv*/
+    int32_t mf_blf_noisemodel_weight_uv_v;
+    /*!< mf_blf_noisemodel_radialdependent_bypass Param_MF_BLF_NoiseModel_bypassRadialCorrection*/
+    int32_t mf_blf_noisemodel_radialdependent_bypass;
+    /*!< mf_blf_noisemodel_colordependent_bypass Param_MF_BLF_NoiseModel_bypassColorDependent*/
+    int32_t mf_blf_noisemodel_colordependent_bypass;
+    /*!< mf_blf_noisemodel_graydependent_bypass Param_MF_BLF_NoiseModel_bypassGrayDependent*/
+    int32_t mf_blf_noisemodel_graydependent_bypass;
+    /*!< mf_blf_noisemodel_radialdependent_x0_square Param_MF_BLF_NoiseModel_radialDependent_x0_square*/
+    int32_t mf_blf_noisemodel_radialdependent_x0_square;
+    /*!< mf_blf_noisemodel_radialdependent_x0 Param_MF_BLF_NoiseModel_radialDependent_x0*/
+    int32_t mf_blf_noisemodel_radialdependent_x0;
+    /*!< mf_blf_noisemodel_radialdependent_y0_square Param_MF_BLF_NoiseModel_radialDependent_y0_square*/
+    int32_t mf_blf_noisemodel_radialdependent_y0_square;
+    /*!< mf_blf_noisemodel_radialdependent_y0 Param_MF_BLF_NoiseModel_radialDependent_y0*/
+    int32_t mf_blf_noisemodel_radialdependent_y0;
+    /*!< mf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_MF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/
+    int32_t mf_blf_noisemodel_radialdependent_rshift_norm_square_distance;
+    /*!< mf_blf_noisemodel_radialdependent_gain_x[4] Param_MF_BLF_NoiseModel_radialDependent_radialLut_X*/
+    int32_t mf_blf_noisemodel_radialdependent_gain_x[4];
+    /*!< mf_blf_noisemodel_radialdependent_gain_y[3] Param_MF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/
+    int32_t mf_blf_noisemodel_radialdependent_gain_y[3];
+    /*!< mf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/
+    int32_t mf_blf_noisemodel_radialdependent_gain_slope[3];
+    /*!< mf_blf_noisemodel_colordependent_a[32] Param_MF_BLF_NoiseModel_colorDependent_A*/
+    int32_t mf_blf_noisemodel_colordependent_a[32];
+    /*!< mf_blf_noisemodel_colordependent_b[32] Param_MF_BLF_NoiseModel_colorDependent_B*/
+    int32_t mf_blf_noisemodel_colordependent_b[32];
+    /*!< mf_blf_noisemodel_colordependent_c[32] Param_MF_BLF_NoiseModel_colorDependent_C*/
+    int32_t mf_blf_noisemodel_colordependent_c[32];
+    /*!< mf_blf_noisemodel_colordependent_norm_offset Param_MF_BLF_NoiseModel_colorDependent_normalization_offset*/
+    int32_t mf_blf_noisemodel_colordependent_norm_offset;
+    /*!< mf_blf_noisemodel_colordependent_gain_x[6] Param_MF_BLF_NoiseModel_colorDependent_Lut_X*/
+    int32_t mf_blf_noisemodel_colordependent_gain_x[6];
+    /*!< mf_blf_noisemodel_colordependent_gain_y[5] Param_MF_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/
+    int32_t mf_blf_noisemodel_colordependent_gain_y[5];
+    /*!< mf_blf_noisemodel_colordependent_gain_slope[5] Slope*/
+    int32_t mf_blf_noisemodel_colordependent_gain_slope[5];
+    /*!< mf_blf_noisemodel_graydependent_graylevel_thresh Param_MF_BLF_NoiseModel_grayDependent_grayThrsh*/
+    int32_t mf_blf_noisemodel_graydependent_graylevel_thresh;
+    /*!< mf_blf_noisemodel_graydependent_graylevel_slope Param_MF_BLF_NoiseModel_grayDependent_graySlope*/
+    int32_t mf_blf_noisemodel_graydependent_graylevel_slope;
+    /*!< mf_blf_noisemodel_graydependent_gain_x[6] Param_MF_BLF_NoiseModel_grayDependent_transLut_X*/
+    int32_t mf_blf_noisemodel_graydependent_gain_x[6];
+    /*!< mf_blf_noisemodel_graydependent_gain_y[5] Param_MF_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/
+    int32_t mf_blf_noisemodel_graydependent_gain_y[5];
+    /*!< mf_blf_noisemodel_graydependent_gain_slope[5] Slope*/
+    int32_t mf_blf_noisemodel_graydependent_gain_slope[5];
+    /*!< mf_blf_noisemodel_normfactor_y_y Param_MF_BLF_NoiseModel_invSigmaYy*/
+    int32_t mf_blf_noisemodel_normfactor_y_y;
+    /*!< mf_blf_noisemodel_normfactor_y_u Param_MF_BLF_NoiseModel_invSigmaYu*/
+    int32_t mf_blf_noisemodel_normfactor_y_u;
+    /*!< mf_blf_noisemodel_normfactor_y_v Param_MF_BLF_NoiseModel_invSigmaYv*/
+    int32_t mf_blf_noisemodel_normfactor_y_v;
+    /*!< mf_blf_noisemodel_normfactor_uv_y Param_MF_BLF_NoiseModel_invSigmaUVy*/
+    int32_t mf_blf_noisemodel_normfactor_uv_y;
+    /*!< mf_blf_noisemodel_normfactor_uv_u Param_MF_BLF_NoiseModel_invSigmaUVu*/
+    int32_t mf_blf_noisemodel_normfactor_uv_u;
+    /*!< mf_blf_noisemodel_normfactor_uv_v Param_MF_BLF_NoiseModel_invSigmaUVv*/
+    int32_t mf_blf_noisemodel_normfactor_uv_v;
+    /*!< mf_blf_snrm_bypass Param_MF_BLF_SNRM_bypassSNRManagement*/
+    int32_t mf_blf_snrm_bypass;
+    /*!< mf_blf_snrm_bypass_y Param_MF_BLF_SNRM_bypassY*/
+    int32_t mf_blf_snrm_bypass_y;
+    /*!< mf_blf_snrm_slope_y Param_MF_BLF_SNRM_slopeY*/
+    int32_t mf_blf_snrm_slope_y;
+    /*!< mf_blf_snrm_xoffset_y Param_MF_BLF_SNRM_xoffsetY*/
+    int32_t mf_blf_snrm_xoffset_y;
+    /*!< mf_blf_snrm_maxval_y Param_MF_BLF_SNRM_maxValY*/
+    int32_t mf_blf_snrm_maxval_y;
+    /*!< mf_blf_snrm_minval_y Param_MF_BLF_SNRM_minValY*/
+    int32_t mf_blf_snrm_minval_y;
+    /*!< mf_blf_snrm_slope_uv Param_MF_BLF_SNRM_slopeUV*/
+    int32_t mf_blf_snrm_slope_uv;
+    /*!< mf_blf_snrm_xoffset_uv Param_MF_BLF_SNRM_xoffsetUV*/
+    int32_t mf_blf_snrm_xoffset_uv;
+    /*!< mf_blf_snrm_maxval_uv Param_MF_BLF_SNRM_maxValUV*/
+    int32_t mf_blf_snrm_maxval_uv;
+    /*!< mf_blf_snrm_minval_uv Param_MF_BLF_SNRM_minValUV*/
+    int32_t mf_blf_snrm_minval_uv;
+    /*!< mf_afc_bypass Param_MF_AFC_bypassAntiFalseColor*/
+    int32_t mf_afc_bypass;
+    /*!< mf_afc_weight_snr Param_MF_AFC_wgtSnr*/
+    int32_t mf_afc_weight_snr;
+    /*!< mf_afc_weight_chroma Param_MF_AFC_wgtC*/
+    int32_t mf_afc_weight_chroma;
+    /*!< mf_min_distance_clamp Param_MF_min_distance_clamp*/
+    int32_t mf_min_distance_clamp;
+    /*!< lf_blf_fir_filter_length Param_LF_BLF_FIR_BfLen*/
+    int32_t lf_blf_fir_filter_length;
+    /*!< lf_blf_fir_luma_coefs[6] Param_LF_BLF_FIR_Kn_coef*/
+    int32_t lf_blf_fir_luma_coefs[6];
+    /*!< lf_blf_fir_luma_denom_bits Param_LF_BLF_FIR_Kn_denom_bits*/
+    int32_t lf_blf_fir_luma_denom_bits;
+    /*!< lf_blf_fir_bypass_snr_y Param_LF_BLF_FIR_bypasssSnrY*/
+    int32_t lf_blf_fir_bypass_snr_y;
+    /*!< lf_blf_colorspace Param_LF_BLF_colorspaceYRB*/
+    int32_t lf_blf_colorspace;
+    /*!< lf_blf_noisemodel_basefunc_y_a_x[5] Param_LF_BLF_NoiseModel_sigmaParafacY_A_X*/
+    int32_t lf_blf_noisemodel_basefunc_y_a_x[5];
+    /*!< lf_blf_noisemodel_basefunc_y_a_y[4] Param_LF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/
+    int32_t lf_blf_noisemodel_basefunc_y_a_y[4];
+    /*!< lf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/
+    int32_t lf_blf_noisemodel_basefunc_y_a_slope[4];
+    /*!< lf_blf_noisemodel_basefunc_y_b_x[5] Param_LF_BLF_NoiseModel_sigmaParafacY_B_X*/
+    int32_t lf_blf_noisemodel_basefunc_y_b_x[5];
+    /*!< lf_blf_noisemodel_basefunc_y_b_y[4] Param_LF_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/
+    int32_t lf_blf_noisemodel_basefunc_y_b_y[4];
+    /*!< lf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/
+    int32_t lf_blf_noisemodel_basefunc_y_b_slope[4];
+    /*!< lf_blf_noisemodel_basefunc_y_c_x[5] Param_LF_BLF_NoiseModel_sigmaParafacY_C_X*/
+    int32_t lf_blf_noisemodel_basefunc_y_c_x[5];
+    /*!< lf_blf_noisemodel_basefunc_y_c_y[4] Param_LF_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/
+    int32_t lf_blf_noisemodel_basefunc_y_c_y[4];
+    /*!< lf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/
+    int32_t lf_blf_noisemodel_basefunc_y_c_slope[4];
+    /*!< lf_blf_noisemodel_basefunc_y_wbg Param_LF_BLF_NoiseModel_sigmaParafacY_DEF*/
+    int32_t lf_blf_noisemodel_basefunc_y_wbg;
+    /*!< lf_blf_noisemodel_basefunc_u_a_x[5] Param_LF_BLF_NoiseModel_sigmaParafacU_A_X*/
+    int32_t lf_blf_noisemodel_basefunc_u_a_x[5];
+    /*!< lf_blf_noisemodel_basefunc_u_a_y[4] Param_LF_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/
+    int32_t lf_blf_noisemodel_basefunc_u_a_y[4];
+    /*!< lf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/
+    int32_t lf_blf_noisemodel_basefunc_u_a_slope[4];
+    /*!< lf_blf_noisemodel_basefunc_u_b_x[5] Param_LF_BLF_NoiseModel_sigmaParafacU_B_X*/
+    int32_t lf_blf_noisemodel_basefunc_u_b_x[5];
+    /*!< lf_blf_noisemodel_basefunc_u_b_y[4] Param_LF_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/
+    int32_t lf_blf_noisemodel_basefunc_u_b_y[4];
+    /*!< lf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/
+    int32_t lf_blf_noisemodel_basefunc_u_b_slope[4];
+    /*!< lf_blf_noisemodel_basefunc_u_c_x[5] Param_LF_BLF_NoiseModel_sigmaParafacU_C_X*/
+    int32_t lf_blf_noisemodel_basefunc_u_c_x[5];
+    /*!< lf_blf_noisemodel_basefunc_u_c_y[4] Param_LF_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/
+    int32_t lf_blf_noisemodel_basefunc_u_c_y[4];
+    /*!< lf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/
+    int32_t lf_blf_noisemodel_basefunc_u_c_slope[4];
+    /*!< lf_blf_noisemodel_basefunc_u_wbg Param_LF_BLF_NoiseModel_sigmaParafacU_DEF*/
+    int32_t lf_blf_noisemodel_basefunc_u_wbg;
+    /*!< lf_blf_noisemodel_basefunc_v_a_x[5] Param_LF_BLF_NoiseModel_sigmaParafacV_A_X*/
+    int32_t lf_blf_noisemodel_basefunc_v_a_x[5];
+    /*!< lf_blf_noisemodel_basefunc_v_a_y[4] Param_LF_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/
+    int32_t lf_blf_noisemodel_basefunc_v_a_y[4];
+    /*!< lf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/
+    int32_t lf_blf_noisemodel_basefunc_v_a_slope[4];
+    /*!< lf_blf_noisemodel_basefunc_v_b_x[5] Param_LF_BLF_NoiseModel_sigmaParafacV_B_X*/
+    int32_t lf_blf_noisemodel_basefunc_v_b_x[5];
+    /*!< lf_blf_noisemodel_basefunc_v_b_y[4] Param_LF_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/
+    int32_t lf_blf_noisemodel_basefunc_v_b_y[4];
+    /*!< lf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/
+    int32_t lf_blf_noisemodel_basefunc_v_b_slope[4];
+    /*!< lf_blf_noisemodel_basefunc_v_c_x[5] Param_LF_BLF_NoiseModel_sigmaParafacV_C_X*/
+    int32_t lf_blf_noisemodel_basefunc_v_c_x[5];
+    /*!< lf_blf_noisemodel_basefunc_v_c_y[4] Param_LF_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/
+    int32_t lf_blf_noisemodel_basefunc_v_c_y[4];
+    /*!< lf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/
+    int32_t lf_blf_noisemodel_basefunc_v_c_slope[4];
+    /*!< lf_blf_noisemodel_basefunc_v_wbg Param_LF_BLF_NoiseModel_sigmaParafacV_DEF*/
+    int32_t lf_blf_noisemodel_basefunc_v_wbg;
+    /*!< lf_blf_noisemodel_weight_y_y Param_LF_BLF_NoiseModel_sigmaWgtYy*/
+    int32_t lf_blf_noisemodel_weight_y_y;
+    /*!< lf_blf_noisemodel_weight_y_u Param_LF_BLF_NoiseModel_sigmaWgtYu*/
+    int32_t lf_blf_noisemodel_weight_y_u;
+    /*!< lf_blf_noisemodel_weight_y_v Param_LF_BLF_NoiseModel_sigmaWgtYv*/
+    int32_t lf_blf_noisemodel_weight_y_v;
+    /*!< lf_blf_noisemodel_weight_uv_y Param_LF_BLF_NoiseModel_sigmaWgtUVy*/
+    int32_t lf_blf_noisemodel_weight_uv_y;
+    /*!< lf_blf_noisemodel_weight_uv_u Param_LF_BLF_NoiseModel_sigmaWgtUVu*/
+    int32_t lf_blf_noisemodel_weight_uv_u;
+    /*!< lf_blf_noisemodel_weight_uv_v Param_LF_BLF_NoiseModel_sigmaWgtUVv*/
+    int32_t lf_blf_noisemodel_weight_uv_v;
+    /*!< lf_blf_noisemodel_radialdependent_bypass Param_LF_BLF_NoiseModel_bypassRadialCorrection*/
+    int32_t lf_blf_noisemodel_radialdependent_bypass;
+    /*!< lf_blf_noisemodel_colordependent_bypass Param_LF_BLF_NoiseModel_bypassColorDependent*/
+    int32_t lf_blf_noisemodel_colordependent_bypass;
+    /*!< lf_blf_noisemodel_graydependent_bypass Param_LF_BLF_NoiseModel_bypassGrayDependent*/
+    int32_t lf_blf_noisemodel_graydependent_bypass;
+    /*!< lf_blf_noisemodel_radialdependent_x0_square Param_LF_BLF_NoiseModel_radialDependent_x0_square*/
+    int32_t lf_blf_noisemodel_radialdependent_x0_square;
+    /*!< lf_blf_noisemodel_radialdependent_x0 Param_LF_BLF_NoiseModel_radialDependent_x0*/
+    int32_t lf_blf_noisemodel_radialdependent_x0;
+    /*!< lf_blf_noisemodel_radialdependent_y0_square Param_LF_BLF_NoiseModel_radialDependent_y0_square*/
+    int32_t lf_blf_noisemodel_radialdependent_y0_square;
+    /*!< lf_blf_noisemodel_radialdependent_y0 Param_LF_BLF_NoiseModel_radialDependent_y0*/
+    int32_t lf_blf_noisemodel_radialdependent_y0;
+    /*!< lf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_LF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/
+    int32_t lf_blf_noisemodel_radialdependent_rshift_norm_square_distance;
+    /*!< lf_blf_noisemodel_radialdependent_gain_x[4] Param_LF_BLF_NoiseModel_radialDependent_radialLut_X*/
+    int32_t lf_blf_noisemodel_radialdependent_gain_x[4];
+    /*!< lf_blf_noisemodel_radialdependent_gain_y[3] Param_LF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/
+    int32_t lf_blf_noisemodel_radialdependent_gain_y[3];
+    /*!< lf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/
+    int32_t lf_blf_noisemodel_radialdependent_gain_slope[3];
+    /*!< lf_blf_noisemodel_colordependent_a[32] Param_LF_BLF_NoiseModel_colorDependent_A*/
+    int32_t lf_blf_noisemodel_colordependent_a[32];
+    /*!< lf_blf_noisemodel_colordependent_b[32] Param_LF_BLF_NoiseModel_colorDependent_B*/
+    int32_t lf_blf_noisemodel_colordependent_b[32];
+    /*!< lf_blf_noisemodel_colordependent_c[32] Param_LF_BLF_NoiseModel_colorDependent_C*/
+    int32_t lf_blf_noisemodel_colordependent_c[32];
+    /*!< lf_blf_noisemodel_colordependent_norm_offset Param_LF_BLF_NoiseModel_colorDependent_normalization_offset*/
+    int32_t lf_blf_noisemodel_colordependent_norm_offset;
+    /*!< lf_blf_noisemodel_colordependent_gain_x[6] Param_LF_BLF_NoiseModel_colorDependent_Lut_X*/
+    int32_t lf_blf_noisemodel_colordependent_gain_x[6];
+    /*!< lf_blf_noisemodel_colordependent_gain_y[5] Param_LF_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/
+    int32_t lf_blf_noisemodel_colordependent_gain_y[5];
+    /*!< lf_blf_noisemodel_colordependent_gain_slope[5] Slope*/
+    int32_t lf_blf_noisemodel_colordependent_gain_slope[5];
+    /*!< lf_blf_noisemodel_graydependent_graylevel_thresh Param_LF_BLF_NoiseModel_grayDependent_grayThrsh*/
+    int32_t lf_blf_noisemodel_graydependent_graylevel_thresh;
+    /*!< lf_blf_noisemodel_graydependent_graylevel_slope Param_LF_BLF_NoiseModel_grayDependent_graySlope*/
+    int32_t lf_blf_noisemodel_graydependent_graylevel_slope;
+    /*!< lf_blf_noisemodel_graydependent_gain_x[6] Param_LF_BLF_NoiseModel_grayDependent_transLut_X*/
+    int32_t lf_blf_noisemodel_graydependent_gain_x[6];
+    /*!< lf_blf_noisemodel_graydependent_gain_y[5] Param_LF_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/
+    int32_t lf_blf_noisemodel_graydependent_gain_y[5];
+    /*!< lf_blf_noisemodel_graydependent_gain_slope[5] Slope*/
+    int32_t lf_blf_noisemodel_graydependent_gain_slope[5];
+    /*!< lf_blf_noisemodel_normfactor_y_y Param_LF_BLF_NoiseModel_invSigmaYy*/
+    int32_t lf_blf_noisemodel_normfactor_y_y;
+    /*!< lf_blf_noisemodel_normfactor_y_u Param_LF_BLF_NoiseModel_invSigmaYu*/
+    int32_t lf_blf_noisemodel_normfactor_y_u;
+    /*!< lf_blf_noisemodel_normfactor_y_v Param_LF_BLF_NoiseModel_invSigmaYv*/
+    int32_t lf_blf_noisemodel_normfactor_y_v;
+    /*!< lf_blf_noisemodel_normfactor_uv_y Param_LF_BLF_NoiseModel_invSigmaUVy*/
+    int32_t lf_blf_noisemodel_normfactor_uv_y;
+    /*!< lf_blf_noisemodel_normfactor_uv_u Param_LF_BLF_NoiseModel_invSigmaUVu*/
+    int32_t lf_blf_noisemodel_normfactor_uv_u;
+    /*!< lf_blf_noisemodel_normfactor_uv_v Param_LF_BLF_NoiseModel_invSigmaUVv*/
+    int32_t lf_blf_noisemodel_normfactor_uv_v;
+    /*!< lf_blf_snrm_bypass Param_LF_BLF_SNRM_bypassSNRManagement*/
+    int32_t lf_blf_snrm_bypass;
+    /*!< lf_blf_snrm_bypass_y Param_LF_BLF_SNRM_bypassY*/
+    int32_t lf_blf_snrm_bypass_y;
+    /*!< lf_blf_snrm_slope_y Param_LF_BLF_SNRM_slopeY*/
+    int32_t lf_blf_snrm_slope_y;
+    /*!< lf_blf_snrm_xoffset_y Param_LF_BLF_SNRM_xoffsetY*/
+    int32_t lf_blf_snrm_xoffset_y;
+    /*!< lf_blf_snrm_maxval_y Param_LF_BLF_SNRM_maxValY*/
+    int32_t lf_blf_snrm_maxval_y;
+    /*!< lf_blf_snrm_minval_y Param_LF_BLF_SNRM_minValY*/
+    int32_t lf_blf_snrm_minval_y;
+    /*!< lf_blf_snrm_slope_uv Param_LF_BLF_SNRM_slopeUV*/
+    int32_t lf_blf_snrm_slope_uv;
+    /*!< lf_blf_snrm_xoffset_uv Param_LF_BLF_SNRM_xoffsetUV*/
+    int32_t lf_blf_snrm_xoffset_uv;
+    /*!< lf_blf_snrm_maxval_uv Param_LF_BLF_SNRM_maxValUV*/
+    int32_t lf_blf_snrm_maxval_uv;
+    /*!< lf_blf_snrm_minval_uv Param_LF_BLF_SNRM_minValUV*/
+    int32_t lf_blf_snrm_minval_uv;
+    /*!< lf_blf_iir_alpha_y Param_LF_BLF_IIR_alphaY*/
+    int32_t lf_blf_iir_alpha_y;
+    /*!< lf_blf_iir_alpha_uv Param_LF_BLF_IIR_alphaUV*/
+    int32_t lf_blf_iir_alpha_uv;
+    /*!< lf_cs_bypass Param_LF_CS_bypassChromaSuppression*/
+    int32_t lf_cs_bypass;
+    /*!< lf_cs_coef Param_LF_CS_coef*/
+    int32_t lf_cs_coef;
+    /*!< lf_min_distance_clamp Param_LF_min_distance_clamp*/
+    int32_t lf_min_distance_clamp;
+    /*!< vlf_blf_fir_filter_length Param_VLF_BLF_FIR_BfLen*/
+    int32_t vlf_blf_fir_filter_length;
+    /*!< vlf_blf_fir_luma_coefs[6] Param_VLF_BLF_FIR_Kn_coef*/
+    int32_t vlf_blf_fir_luma_coefs[6];
+    /*!< vlf_blf_fir_luma_denom_bits Param_VLF_BLF_FIR_Kn_denom_bits*/
+    int32_t vlf_blf_fir_luma_denom_bits;
+    /*!< vlf_blf_fir_bypass_snr_y Param_VLF_BLF_FIR_bypasssSnrY*/
+    int32_t vlf_blf_fir_bypass_snr_y;
+    /*!< vlf_blf_colorspace Param_VLF_BLF_colorspaceYRB*/
+    int32_t vlf_blf_colorspace;
+    /*!< vlf_blf_noisemodel_basefunc_y_a_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacY_A_X*/
+    int32_t vlf_blf_noisemodel_basefunc_y_a_x[5];
+    /*!< vlf_blf_noisemodel_basefunc_y_a_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/
+    int32_t vlf_blf_noisemodel_basefunc_y_a_y[4];
+    /*!< vlf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/
+    int32_t vlf_blf_noisemodel_basefunc_y_a_slope[4];
+    /*!< vlf_blf_noisemodel_basefunc_y_b_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacY_B_X*/
+    int32_t vlf_blf_noisemodel_basefunc_y_b_x[5];
+    /*!< vlf_blf_noisemodel_basefunc_y_b_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/
+    int32_t vlf_blf_noisemodel_basefunc_y_b_y[4];
+    /*!< vlf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/
+    int32_t vlf_blf_noisemodel_basefunc_y_b_slope[4];
+    /*!< vlf_blf_noisemodel_basefunc_y_c_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacY_C_X*/
+    int32_t vlf_blf_noisemodel_basefunc_y_c_x[5];
+    /*!< vlf_blf_noisemodel_basefunc_y_c_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/
+    int32_t vlf_blf_noisemodel_basefunc_y_c_y[4];
+    /*!< vlf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/
+    int32_t vlf_blf_noisemodel_basefunc_y_c_slope[4];
+    /*!< vlf_blf_noisemodel_basefunc_y_wbg Param_VLF_BLF_NoiseModel_sigmaParafacY_DEF*/
+    int32_t vlf_blf_noisemodel_basefunc_y_wbg;
+    /*!< vlf_blf_noisemodel_basefunc_u_a_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacU_A_X*/
+    int32_t vlf_blf_noisemodel_basefunc_u_a_x[5];
+    /*!< vlf_blf_noisemodel_basefunc_u_a_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/
+    int32_t vlf_blf_noisemodel_basefunc_u_a_y[4];
+    /*!< vlf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/
+    int32_t vlf_blf_noisemodel_basefunc_u_a_slope[4];
+    /*!< vlf_blf_noisemodel_basefunc_u_b_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacU_B_X*/
+    int32_t vlf_blf_noisemodel_basefunc_u_b_x[5];
+    /*!< vlf_blf_noisemodel_basefunc_u_b_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/
+    int32_t vlf_blf_noisemodel_basefunc_u_b_y[4];
+    /*!< vlf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/
+    int32_t vlf_blf_noisemodel_basefunc_u_b_slope[4];
+    /*!< vlf_blf_noisemodel_basefunc_u_c_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacU_C_X*/
+    int32_t vlf_blf_noisemodel_basefunc_u_c_x[5];
+    /*!< vlf_blf_noisemodel_basefunc_u_c_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/
+    int32_t vlf_blf_noisemodel_basefunc_u_c_y[4];
+    /*!< vlf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/
+    int32_t vlf_blf_noisemodel_basefunc_u_c_slope[4];
+    /*!< vlf_blf_noisemodel_basefunc_u_wbg Param_VLF_BLF_NoiseModel_sigmaParafacU_DEF*/
+    int32_t vlf_blf_noisemodel_basefunc_u_wbg;
+    /*!< vlf_blf_noisemodel_basefunc_v_a_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacV_A_X*/
+    int32_t vlf_blf_noisemodel_basefunc_v_a_x[5];
+    /*!< vlf_blf_noisemodel_basefunc_v_a_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/
+    int32_t vlf_blf_noisemodel_basefunc_v_a_y[4];
+    /*!< vlf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/
+    int32_t vlf_blf_noisemodel_basefunc_v_a_slope[4];
+    /*!< vlf_blf_noisemodel_basefunc_v_b_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacV_B_X*/
+    int32_t vlf_blf_noisemodel_basefunc_v_b_x[5];
+    /*!< vlf_blf_noisemodel_basefunc_v_b_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/
+    int32_t vlf_blf_noisemodel_basefunc_v_b_y[4];
+    /*!< vlf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/
+    int32_t vlf_blf_noisemodel_basefunc_v_b_slope[4];
+    /*!< vlf_blf_noisemodel_basefunc_v_c_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacV_C_X*/
+    int32_t vlf_blf_noisemodel_basefunc_v_c_x[5];
+    /*!< vlf_blf_noisemodel_basefunc_v_c_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/
+    int32_t vlf_blf_noisemodel_basefunc_v_c_y[4];
+    /*!< vlf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/
+    int32_t vlf_blf_noisemodel_basefunc_v_c_slope[4];
+    /*!< vlf_blf_noisemodel_basefunc_v_wbg Param_VLF_BLF_NoiseModel_sigmaParafacV_DEF*/
+    int32_t vlf_blf_noisemodel_basefunc_v_wbg;
+    /*!< vlf_blf_noisemodel_weight_y_y Param_VLF_BLF_NoiseModel_sigmaWgtYy*/
+    int32_t vlf_blf_noisemodel_weight_y_y;
+    /*!< vlf_blf_noisemodel_weight_y_u Param_VLF_BLF_NoiseModel_sigmaWgtYu*/
+    int32_t vlf_blf_noisemodel_weight_y_u;
+    /*!< vlf_blf_noisemodel_weight_y_v Param_VLF_BLF_NoiseModel_sigmaWgtYv*/
+    int32_t vlf_blf_noisemodel_weight_y_v;
+    /*!< vlf_blf_noisemodel_weight_uv_y Param_VLF_BLF_NoiseModel_sigmaWgtUVy*/
+    int32_t vlf_blf_noisemodel_weight_uv_y;
+    /*!< vlf_blf_noisemodel_weight_uv_u Param_VLF_BLF_NoiseModel_sigmaWgtUVu*/
+    int32_t vlf_blf_noisemodel_weight_uv_u;
+    /*!< vlf_blf_noisemodel_weight_uv_v Param_VLF_BLF_NoiseModel_sigmaWgtUVv*/
+    int32_t vlf_blf_noisemodel_weight_uv_v;
+    /*!< vlf_blf_noisemodel_radialdependent_bypass Param_VLF_BLF_NoiseModel_bypassRadialCorrection*/
+    int32_t vlf_blf_noisemodel_radialdependent_bypass;
+    /*!< vlf_blf_noisemodel_colordependent_bypass Param_VLF_BLF_NoiseModel_bypassColorDependent*/
+    int32_t vlf_blf_noisemodel_colordependent_bypass;
+    /*!< vlf_blf_noisemodel_radialdependent_x0_square Param_VLF_BLF_NoiseModel_radialDependent_x0_square*/
+    int32_t vlf_blf_noisemodel_radialdependent_x0_square;
+    /*!< vlf_blf_noisemodel_radialdependent_x0 Param_VLF_BLF_NoiseModel_radialDependent_x0*/
+    int32_t vlf_blf_noisemodel_radialdependent_x0;
+    /*!< vlf_blf_noisemodel_radialdependent_y0_square Param_VLF_BLF_NoiseModel_radialDependent_y0_square*/
+    int32_t vlf_blf_noisemodel_radialdependent_y0_square;
+    /*!< vlf_blf_noisemodel_radialdependent_y0 Param_VLF_BLF_NoiseModel_radialDependent_y0*/
+    int32_t vlf_blf_noisemodel_radialdependent_y0;
+    /*!< vlf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_VLF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/
+    int32_t vlf_blf_noisemodel_radialdependent_rshift_norm_square_distance;
+    /*!< vlf_blf_noisemodel_radialdependent_gain_x[4] Param_VLF_BLF_NoiseModel_radialDependent_radialLut_X*/
+    int32_t vlf_blf_noisemodel_radialdependent_gain_x[4];
+    /*!< vlf_blf_noisemodel_radialdependent_gain_y[3] Param_VLF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/
+    int32_t vlf_blf_noisemodel_radialdependent_gain_y[3];
+    /*!< vlf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/
+    int32_t vlf_blf_noisemodel_radialdependent_gain_slope[3];
+    /*!< vlf_blf_noisemodel_colordependent_a[32] Param_VLF_BLF_NoiseModel_colorDependent_A*/
+    int32_t vlf_blf_noisemodel_colordependent_a[32];
+    /*!< vlf_blf_noisemodel_colordependent_b[32] Param_VLF_BLF_NoiseModel_colorDependent_B*/
+    int32_t vlf_blf_noisemodel_colordependent_b[32];
+    /*!< vlf_blf_noisemodel_colordependent_c[32] Param_VLF_BLF_NoiseModel_colorDependent_C*/
+    int32_t vlf_blf_noisemodel_colordependent_c[32];
+    /*!< vlf_blf_noisemodel_colordependent_norm_offset Param_VLF_BLF_NoiseModel_colorDependent_normalization_offset*/
+    int32_t vlf_blf_noisemodel_colordependent_norm_offset;
+    /*!< vlf_blf_noisemodel_colordependent_gain_x[6] Param_VLF_BLF_NoiseModel_colorDependent_Lut_X*/
+    int32_t vlf_blf_noisemodel_colordependent_gain_x[6];
+    /*!< vlf_blf_noisemodel_colordependent_gain_y[5] Param_VLF_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/
+    int32_t vlf_blf_noisemodel_colordependent_gain_y[5];
+    /*!< vlf_blf_noisemodel_colordependent_gain_slope[5] Slope*/
+    int32_t vlf_blf_noisemodel_colordependent_gain_slope[5];
+    /*!< vlf_blf_noisemodel_graydependent_gain_x[6] Param_VLF_BLF_NoiseModel_grayDependent_transLut_X*/
+    int32_t vlf_blf_noisemodel_graydependent_gain_x[6];
+    /*!< vlf_blf_noisemodel_graydependent_gain_y[5] Param_VLF_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/
+    int32_t vlf_blf_noisemodel_graydependent_gain_y[5];
+    /*!< vlf_blf_noisemodel_graydependent_gain_slope[5] Slope*/
+    int32_t vlf_blf_noisemodel_graydependent_gain_slope[5];
+    /*!< vlf_blf_noisemodel_normfactor_y_y Param_VLF_BLF_NoiseModel_invSigmaYy*/
+    int32_t vlf_blf_noisemodel_normfactor_y_y;
+    /*!< vlf_blf_noisemodel_normfactor_y_u Param_VLF_BLF_NoiseModel_invSigmaYu*/
+    int32_t vlf_blf_noisemodel_normfactor_y_u;
+    /*!< vlf_blf_noisemodel_normfactor_y_v Param_VLF_BLF_NoiseModel_invSigmaYv*/
+    int32_t vlf_blf_noisemodel_normfactor_y_v;
+    /*!< vlf_blf_noisemodel_normfactor_uv_y Param_VLF_BLF_NoiseModel_invSigmaUVy*/
+    int32_t vlf_blf_noisemodel_normfactor_uv_y;
+    /*!< vlf_blf_noisemodel_normfactor_uv_u Param_VLF_BLF_NoiseModel_invSigmaUVu*/
+    int32_t vlf_blf_noisemodel_normfactor_uv_u;
+    /*!< vlf_blf_noisemodel_normfactor_uv_v Param_VLF_BLF_NoiseModel_invSigmaUVv*/
+    int32_t vlf_blf_noisemodel_normfactor_uv_v;
+    /*!< vlf_blf_iir_alpha_y Param_VLF_BLF_IIR_alphaY*/
+    int32_t vlf_blf_iir_alpha_y;
+    /*!< vlf_blf_iir_alpha_uv Param_VLF_BLF_IIR_alphaUV*/
+    int32_t vlf_blf_iir_alpha_uv;
+    /*!< vlf_cs_bypass Param_VLF_CS_bypassChromaSuppression*/
+    int32_t vlf_cs_bypass;
+    /*!< vlf_cs_coef Param_VLF_CS_coef*/
+    int32_t vlf_cs_coef;
+    /*!< vlf_min_distance_clamp Param_VLF_min_distance_clamp*/
+    int32_t vlf_min_distance_clamp;
+    /*!< vhf_blf_noisemodel_basefunc_y_a_x[5] Param_VHF_BLF_NoiseModel_sigmaParafacY_A_X*/
+    int32_t vhf_blf_noisemodel_basefunc_y_a_x[5];
+    /*!< vhf_blf_noisemodel_basefunc_y_a_y[4] Param_VHF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/
+    int32_t vhf_blf_noisemodel_basefunc_y_a_y[4];
+    /*!< vhf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/
+    int32_t vhf_blf_noisemodel_basefunc_y_a_slope[4];
+    /*!< vhf_blf_noisemodel_basefunc_y_wbg Param_VHF_BLF_NoiseModel_sigmaParafacY_DEF*/
+    int32_t vhf_blf_noisemodel_basefunc_y_wbg;
+    /*!< vhf_blf_noisemodel_weight_y_y Param_VHF_BLF_NoiseModel_sigmaWgtYy*/
+    int32_t vhf_blf_noisemodel_weight_y_y;
+    /*!< vhf_blf_noisemodel_radialdependent_bypass Param_VHF_BLF_NoiseModel_bypassRadialCorrection*/
+    int32_t vhf_blf_noisemodel_radialdependent_bypass;
+    /*!< vhf_blf_noisemodel_radialdependent_x0_square Param_VHF_BLF_NoiseModel_radialDependent_x0_square*/
+    int32_t vhf_blf_noisemodel_radialdependent_x0_square;
+    /*!< vhf_blf_noisemodel_radialdependent_x0 Param_VHF_BLF_NoiseModel_radialDependent_x0*/
+    int32_t vhf_blf_noisemodel_radialdependent_x0;
+    /*!< vhf_blf_noisemodel_radialdependent_y0_square Param_VHF_BLF_NoiseModel_radialDependent_y0_square*/
+    int32_t vhf_blf_noisemodel_radialdependent_y0_square;
+    /*!< vhf_blf_noisemodel_radialdependent_y0 Param_VHF_BLF_NoiseModel_radialDependent_y0*/
+    int32_t vhf_blf_noisemodel_radialdependent_y0;
+    /*!< vhf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_VHF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/
+    int32_t vhf_blf_noisemodel_radialdependent_rshift_norm_square_distance;
+    /*!< vhf_blf_noisemodel_radialdependent_gain_x[4] Param_VHF_BLF_NoiseModel_radialDependent_radialLut_X*/
+    int32_t vhf_blf_noisemodel_radialdependent_gain_x[4];
+    /*!< vhf_blf_noisemodel_radialdependent_gain_y[3] Param_VHF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/
+    int32_t vhf_blf_noisemodel_radialdependent_gain_y[3];
+    /*!< vhf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/
+    int32_t vhf_blf_noisemodel_radialdependent_gain_slope[3];
+    /*!< vhf_blf_noisemodel_normfactor_y_y Param_VHF_BLF_NoiseModel_invSigmaYy*/
+    int32_t vhf_blf_noisemodel_normfactor_y_y;
+    /*!< vhf_blf_bypass Param_VHF_BLF_bypass*/
+    int32_t vhf_blf_bypass;
+    /*!< vhf_min_distance_clamp Param_VHF_min_distance_clamp*/
+    int32_t vhf_min_distance_clamp;
+    /*!< hf_lcs_cu_slope[5] PARAM_HFC_LCS_CU_SLOPE*/
+    int32_t hf_lcs_cu_slope[5];
+    /*!< hf_lcs_cu_x[6] PARAM_HFC_LCS_CU_X*/
+    int32_t hf_lcs_cu_x[6];
+    /*!< hf_lcs_cu_y[5] PARAM_HFC_LCS_CU_Y*/
+    int32_t hf_lcs_cu_y[5];
+    /*!< hf_lcs_bypass Param_HFC_LCS_bypass*/
+    int32_t hf_lcs_bypass;
+    /*!< hf_lcs_thresh_high HFC_LCS_THRESHOLD_HIGH*/
+    uint32_t hf_lcs_thresh_high;
+    /*!< hf_lcs_thresh_low PARAM_HFC_LCS_THRESH_LOW*/
+    uint32_t hf_lcs_thresh_low;
+    /*!< hf_lcs_chm_gain PARAM_HFC_LCS_CHM_GAIN*/
+    uint32_t hf_lcs_chm_gain;
+    /*!< hf_lcs_ylocal_size ylocal filter size 0 - 5x5, 1 - 7x7*/
+    uint32_t hf_lcs_ylocal_size;
+    /*!< hf_lcs_chm_size chroma metric filter size 0 - 5x5, 1 - 7x7*/
+    uint32_t hf_lcs_chm_size;
+    /*!< vlf_power_uv VLF denoise power chroma*/
+    int32_t vlf_power_uv;
+    /*!< vlf_power_y VLF denoise power luma*/
+    int32_t vlf_power_y;
+    /*!< lf_power_uv LF denoise power chroma*/
+    int32_t lf_power_uv;
+    /*!< lf_power_y VLF denoise power luma*/
+    int32_t lf_power_y;
+    /*!< mf_power_uv MF denoise power chroma*/
+    int32_t mf_power_uv;
+    /*!< mf_power_y MF denoise power luma*/
+    int32_t mf_power_y;
+    /*!< hf_power_uv HF denoise power chroma*/
+    int32_t hf_power_uv;
+    /*!< vhf_power_y VHF denoise power luma*/
+    int32_t vhf_power_y;
+    /*!< top_ds_2x_coefs[5] 1:2 downscaling filter coefficients*/
+    int32_t top_ds_2x_coefs[5];
+    /*!< top_ds_4x_coefs[7] 1:4 downscaling filter coefficients*/
+    int32_t top_ds_4x_coefs[7];
+
+} ia_pal_isp_xnr_5_2_t;
+
+/*! \isp struct xnr_dss
+Scalable Chroma and Luma Denoise, Medium and High Frequency
+*/
+typedef struct
+{
+    /*!< jbl_mf_bypass_y Bypass JBL MF Luma*/
+    int32_t jbl_mf_bypass_y;
+    /*!< jbl_mf_bypass_c Bypass MF Chroma*/
+    int32_t jbl_mf_bypass_c;
+    /*!< noise_sigma_mf_y_y Noise Sigma MF Luma per Luma*/
+    int32_t noise_sigma_mf_y_y;
+    /*!< noise_sigma_mf_y_s Noise Sigma MF Luma per Satoration*/
+    int32_t noise_sigma_mf_y_s;
+    /*!< noise_sigma_mf_c_y Noise Sigma MF Chroma per Luma*/
+    int32_t noise_sigma_mf_c_y;
+    /*!< noise_sigma_mf_c_u Noise Sigma MF Chroma per U*/
+    int32_t noise_sigma_mf_c_u;
+    /*!< noise_sigma_mf_c_v Noise Sigma MF Chroma per V*/
+    int32_t noise_sigma_mf_c_v;
+    /*!< rad_noise_sigma_mf_y_y Noise Sigma MF Luma per Luma - radial*/
+    int32_t rad_noise_sigma_mf_y_y;
+    /*!< rad_noise_sigma_mf_y_s Noise Sigma MF Luma per Satoration - radial*/
+    int32_t rad_noise_sigma_mf_y_s;
+    /*!< rad_noise_sigma_mf_c_y Noise Sigma MF Chroma per Luma - radial*/
+    int32_t rad_noise_sigma_mf_c_y;
+    /*!< rad_noise_sigma_mf_c_u Noise Sigma MF Chroma per U - radial*/
+    int32_t rad_noise_sigma_mf_c_u;
+    /*!< rad_noise_sigma_mf_c_v Noise Sigma MF Chroma per V - radial*/
+    int32_t rad_noise_sigma_mf_c_v;
+    /*!< noise_epsilon_mf_y_y Luma min noise variance per Luma , Q12*/
+    int32_t noise_epsilon_mf_y_y;
+    /*!< noise_epsilon_mf_c_y Chroma min noise variance per Luma , Q12*/
+    int32_t noise_epsilon_mf_c_y;
+    /*!< noise_epsilon_mf_c_u Chroma min noise variance per U , Q12*/
+    int32_t noise_epsilon_mf_c_u;
+    /*!< noise_epsilon_mf_c_v Chroma min noise variance per V , Q12*/
+    int32_t noise_epsilon_mf_c_v;
+    /*!< rad_noise_epsilon_mf_y_y Luma min noise variance per Luma , Q12 - radial*/
+    int32_t rad_noise_epsilon_mf_y_y;
+    /*!< rad_noise_epsilon_mf_c_y Chroma min noise variance per Luma , Q12 - radial*/
+    int32_t rad_noise_epsilon_mf_c_y;
+    /*!< rad_noise_epsilon_mf_c_u Chroma min noise variance per U , Q12 - radial*/
+    int32_t rad_noise_epsilon_mf_c_u;
+    /*!< rad_noise_epsilon_mf_c_v Chroma min noise variance per V , Q12 - radial*/
+    int32_t rad_noise_epsilon_mf_c_v;
+    /*!< jbl_weight_th_mf_y Luma Weight threshold of MF JBL*/
+    int32_t jbl_weight_th_mf_y;
+    /*!< jbl_weight_th_mf_c Chroma Weight threshold of MF JBL*/
+    int32_t jbl_weight_th_mf_c;
+    /*!< lpf_mf_coef_y[49] MF JBL Spatial coefs for Luma*/
+    int32_t lpf_mf_coef_y[49];
+    /*!< lpf_mf_coef_c[49] MF JBL Spatial coefs for Chroma*/
+    int32_t lpf_mf_coef_c[49];
+    /*!< range_weight_lut[7] JBL range Weight LUT*/
+    int32_t range_weight_lut[7];
+    /*!< blend_mf_power_y MF denoise blending power y*/
+    int32_t blend_mf_power_y;
+    /*!< blend_mf_power_c MF denoise blending power chroma*/
+    int32_t blend_mf_power_c;
+    /*!< rad_blend_mf_power_y MF denoise blending power y - radial*/
+    int32_t rad_blend_mf_power_y;
+    /*!< rad_blend_mf_power_c MF denoise blending power chroma -radial*/
+    int32_t rad_blend_mf_power_c;
+    /*!< noise_beta_y_0 noise model for y - coef 0, Q12*/
+    int32_t noise_beta_y_0;
+    /*!< noise_beta_u_0 noise model for u - coef 0, Q12*/
+    int32_t noise_beta_u_0;
+    /*!< noise_beta_u_1 noise model for u - coef 1, Q12*/
+    int32_t noise_beta_u_1;
+    /*!< noise_beta_v_0 noise model for v - coef 0, Q12*/
+    int32_t noise_beta_v_0;
+    /*!< noise_beta_v_2 noise model for v - coef 2, Q12*/
+    int32_t noise_beta_v_2;
+    /*!< rad_center_x X location of the radial center location relative to the top left pixel*/
+    int32_t rad_center_x;
+    /*!< rad_center_y Y location of the radial center location relative to the top left pixel*/
+    int32_t rad_center_y;
+    /*!< rad_exp Radial scale bit into the Lut*/
+    int32_t rad_exp;
+    /*!< rad_lut[128] Radial LUT*/
+    int32_t rad_lut[128];
+    /*!< one_div_64_lut[64] 1/SQRT(x), first 64 values LUT*/
+    int32_t one_div_64_lut[64];
+    /*!< xcu_divsqrt_exp XCU divsqrt exponent*/
+    int32_t xcu_divsqrt_exp;
+    /*!< xcu_divsqrt_slp_a_res XCU divsqrt slope precision*/
+    int32_t xcu_divsqrt_slp_a_res;
+    /*!< xcu_divsqrt_offset[16] XCU divsqrt offset(y) vector*/
+    int32_t xcu_divsqrt_offset[16];
+    /*!< xcu_divsqrt_slope[16] XCU divsqrt slope vector*/
+    int32_t xcu_divsqrt_slope[16];
+    /*!< xcu_divsqrt_x[17] XCU divsqrt x points vector + maximal x value*/
+    int32_t xcu_divsqrt_x[17];
+    /*!< lcs_th_low Low Chroma Suppertion threshold for black level*/
+    int32_t lcs_th_low;
+    /*!< lcs_th_high_delta Low Chroma Suppertion threshold for white level (delta from black)*/
+    int32_t lcs_th_high_delta;
+    /*!< rad_lcs_th_low Low Chroma Suppertion threshold for black level - radial (delta from low)*/
+    int32_t rad_lcs_th_low;
+    /*!< rad_lcs_th_high_delta Low Chroma Suppertion threshold for white level -radial (delta form high delta)*/
+    int32_t rad_lcs_th_high_delta;
+    /*!< xcu_lcs_exp XCU ed exponent*/
+    int32_t xcu_lcs_exp;
+    /*!< xcu_lcs_slp_a_res XCU ed slope precision*/
+    int32_t xcu_lcs_slp_a_res;
+    /*!< xcu_lcs_offset[32] XCU ed offset(y) vector*/
+    int32_t xcu_lcs_offset[32];
+    /*!< xcu_lcs_slope[32] XCU ed slope vector*/
+    int32_t xcu_lcs_slope[32];
+    /*!< xcu_lcs_x[33] XCU ed x points vector + maximal x value*/
+    int32_t xcu_lcs_x[33];
+    /*!< hf_luma_power HF Luma denoise power, Q15*/
+    int32_t hf_luma_power;
+    /*!< blend_hf_power_y HF blending power luma*/
+    int32_t blend_hf_power_y;
+    /*!< blend_hf_power_c HF blending power chroma*/
+    int32_t blend_hf_power_c;
+
+} ia_pal_isp_xnr_dss_t;
+
+
+
+#pragma pack(push, 4)
+
+/*! \system api struct io_buffer
+
+*/
+typedef struct
+{
+    /*!< block_height buffer block height configuration in lines*/
+    uint16_t block_height;
+    /*!< block_width buffer block width configuration in pixels*/
+    uint16_t block_width;
+    /*!< buffer_1d_enable Valid only for 1 plane and 1 queue streams. 0-the buffer is described as 2D; 1-the buffer is described as 1D (continues from start to end w/o stride ignoring lines)*/
+    uint8_t buffer_1d_enable;
+    /*!< burst_align 0-each request should be aligned to burst size except first request in line (alignment done at first request since the burst size is power of 2),  1-each request should be at burst size except page boundry and EOL*/
+    uint8_t burst_align;
+    /*!< chroma_base_conversion chroma converted from zero-based to half-based or vice versa*/
+    uint8_t chroma_base_conversion;
+    /*!< chroma_duplication Valid when format 420 is configured to provide 422 (2P2Q with SIF count of 4 or 2). when reset - duplicate the chroma and provide the same value each two Y lines, when set - send the chroma components only with the even Y (at odd Y lines doesn’t send any chroma)*/
+    uint8_t chroma_duplication;
+    /*!< chroma_planes_order Chroma planes ordering: 0 - U before V; 1 - V before U (valid for half planer configuration)*/
+    uint8_t chroma_planes_order;
+    /*!< component_in_valid_pixel Provides amount of valid component per valid pixel*/
+    uint8_t component_in_valid_pixel;
+    /*!< component_precision Pixel element precision in bits: 0=>8b, 1=>10b, 2=>12b, 3=>16, 4=>32, 5=>2, 6=>4, 7..15=>reserved*/
+    uint8_t component_precision;
+    /*!< compression_mode Valid for streaming that are tiled: 1-the stream is written/fetched to/from DDR through compression engine; 0-not going through compression*/
+    uint8_t compression_mode;
+    /*!< dpa_bypass When set indicate the end of MIPI frame (used for MIPI CSI sub frames)*/
+    uint8_t dpa_bypass;
+    /*!< first_row_blocks_height buffer block height configuration in lines of all the blocks in the first row of blocks. If zero - use streaming_buffer_blocks_height*/
+    uint16_t first_row_blocks_height;
+    /*!< granularity_pointer_update Valid according the streaming mode: number of lines (LB)/lines of blocks (BB) to be written/release before sending a pointer update (reporting always done with producer view)*/
+    uint16_t granularity_pointer_update;
+    /*!< in_chroma_signed chroma in input is signed (1) or unsigned (0)*/
+    uint8_t in_chroma_signed;
+    /*!< in_luma_signed luma in input is signed (1) or unsigned (0)*/
+    uint8_t in_luma_signed;
+    /*!< last_row_blocks_height buffer block height configuration in lines of all the blocks in the last row of blocks. If zero - use streaming_buffer_blocks_height*/
+    uint16_t last_row_blocks_height;
+    /*!< local_link_id indicates the stream used at the current connectlon*/
+    uint8_t local_link_id;
+    /*!< luma_base_conversion luma converted from zero-based to half-based or vice versa*/
+    uint8_t luma_base_conversion;
+    /*!< max_credits provides the maximum amount of credits for eliminating the need to calculate it in HW according the next formula: (end_address-start_address)/Max_Stride*/
+    uint32_t max_credits;
+    /*!< max_stride provides the maximum stride value to be used at the connection*/
+    uint16_t max_stride;
+    /*!< middle_ack_enable If set, enable the mechansim to generate middle ack when consumed amount of configured lines*/
+    uint8_t middle_ack_enable;
+    /*!< middle_ack_line_number Valid if ack enable  If enabled, the device should generate middle ack when delivers the EOL of the configured line (global number) assuming the first line delievered at SOF is zero.  In case of multiple planes the counting is done using plane1 but only when all the planes are synced*/
+    uint16_t middle_ack_line_number;
+    /*!< middle_ack_mode_stall Valid only when ack_enable is set When set, the device should stall once sending the middle ack*/
+    uint8_t middle_ack_mode_stall;
+    /*!< mipi_csi_eof When set indicate the end of MIPI frame (used for MIPI CSI sub frames)*/
+    uint8_t mipi_csi_eof;
+    /*!< num_of_planes Amount of valid planes (supported 1, 2, 3, 4 - depends also on HW parameter of max planes and data type)*/
+    uint8_t num_of_planes;
+    /*!< num_of_queues Amount of total active queues (YUV FP - 4, YUV SP - 3 YUV SP Tile - 2. RGB - 1,1,1. Bayer -2). Must be up to amount of maximum queue supported. Can be changed per frame. At LBFF used dynamicly for PDAF*/
+    uint8_t num_of_queues;
+    /*!< onep_pixel_order Set the ordering of the first plane (lines-N, pixels-M) 4PPC: 0-(N, M), (N, M+1), (N+1, M), (N+1, M+1), horizontal raster; 1-(N, M), (N+1, M), (N, M+1), (N+1, M+1), vertical raster 2PPC: 0-first cyc: (N, M), (N+1, M), second cyc: (N, M+1), (N+1, M+1); 1-first cyc: (N, M), (N, M+1),*/
+    uint8_t onep_pixel_order;
+    /*!< out_chroma_signed chroma in output is signed (1) or unsigned (0)*/
+    uint8_t out_chroma_signed;
+    /*!< out_luma_signed luma in output is signed (1) or unsigned (0)*/
+    uint8_t out_luma_signed;
+    /*!< pace_message_pace_line Provides the line number indicating to stop measuring the activity and pace and sending pace meesage (at IFD - get the last data of the line, at ODR - getnon-buf ack on last data of the line)*/
+    uint16_t pace_message_pace_line;
+    /*!< pace_message_ref_line Provides the line number that when start indicating start measuring the pace and active  (ODR - send first WR of the line, IFD send first RD of line)*/
+    uint16_t pace_message_ref_line;
+    /*!< pixels_in_valid_cycle Provides amount of valid pixels per valid cycle*/
+    uint8_t pixels_in_valid_cycle;
+    /*!< plane_horiz_subsample_config[3] Plane Horiz subsample (width>>N).  Affect tile width and width resolution=>Bayer - 0, Y/UV at YUV SP - 0, Y at YUV FP -0, UV U/V at YUV FP-1)*/
+    uint8_t plane_horiz_subsample_config[3];
+    /*!< plane_max_burst_size[3] Plane maximum burst size: used to specify the transfer size in CL granularity (Max limited to 16, possible values - 1, 2, 4, 8, 16)*/
+    uint8_t plane_max_burst_size[3];
+    /*!< plane_offset_end_address[3] Per plane: End offset address of plane with regarding to the base_offset, in bytes, CL aligned, unsigned.*/
+    uint32_t plane_offset_end_address[3];
+    /*!< plane_offset_start_address[3] Per plane: Start offset address of plane with regarding to the base_offset, in bytes, CL aligned, unsigned.*/
+    uint32_t plane_offset_start_address[3];
+    /*!< plane_stride[3] Per plane: provides the difference between two horizontal pixels, in bytes, CL aligned, unsigned.  At tile mode - provide the difference between two lines of tiles in bytes*/
+    uint32_t plane_stride[3];
+    /*!< plane_tile_height[3] Per plane: buffer tile height configuration in lines*/
+    uint8_t plane_tile_height[3];
+    /*!< plane_tile_width[3] Per plane: buffer tile width configuration in bytes*/
+    uint8_t plane_tile_width[3];
+    /*!< plane_vert_subsample_config[3] Plane Vertical subsample (height>>N). Affect tile highet and highet resolution=>Bayer - 0, Y atYUV SP - 0, UV at YUV SP - 1, Y at YUV FP -0, U/V at YUV FP-1)*/
+    uint8_t plane_vert_subsample_config[3];
+    /*!< plane_zlr_granularity[3] Plane ZLR page granularity: if 0 - 4KB, if 1 - 2KB. Valid only if ZLR is enalbe*/
+    uint8_t plane_zlr_granularity[3];
+    /*!< ppc provides the amount of pixel per cycle*/
+    uint8_t ppc;
+    /*!< proc_ff_bypass when set indicates the FF in the pipe (FCVT & ESPA) need to be bypass*/
+    uint8_t proc_ff_bypass;
+    /*!< progress_message_line Provides the line number that when is done generate progress message (IFD - last byte of the line arrive, ODR - last byte of the line acked by nbuf)*/
+    uint16_t progress_message_line;
+    /*!< sif_user_info2 information to be given by FW and used in the pipeline (driven by IFD). Read bus width defined by HWP*/
+    uint32_t sif_user_info2;
+    /*!< stream_dt stream data type as need to be used by the MIPI*/
+    uint8_t stream_dt;
+    /*!< stream_vc stream virtual channel number as need to be used in MIPI*/
+    uint8_t stream_vc;
+    /*!< stream_wc stream word count as need to be used by the MIPI*/
+    uint16_t stream_wc;
+    /*!< streaming_mode The streaming unified buffer protocol:  0-static offline (producer/consumer write/read from DDR after kick);  1-dynamic offline (producer/consumer send wr/rd EOF/SOF, producer write after kick, consumer read after full frame at DDR);  2-buffer chasing large memory (producer/consumer send wr/rd EOF/SOF, producer send wr update, consumer read according to wr update);  3-buffer chasing on small memory (producer/consumer send wr/rd EOF/SOF, producer write released buffers and sends wr pointers, consumer read valid buffer and sends rd pointer);  4-S&R like 3 with option to change the link (supporting modes 2 and 3 with dynamic change) 5-buffer chasing small memory - fix starting point, single buffer 6-buffer chasing small memory - float starting point 7-buffer chasing small memory - fix starting point, double buffer*/
+    uint8_t streaming_mode;
+    /*!< streaming_sw_managed When set - the SW verify the shared buffer is fully consumed by  the producer and can be written immediately*/
+    uint8_t streaming_sw_managed;
+    /*!< stride_ratio provides the BCSM max_stride/stride ratio with possible values of 1-8, 16, 32, 64, 128*/
+    uint8_t stride_ratio;
+    /*!< subsample_YUV444_to_YUV422 Used by ODR to convert YUV444 to YUV422: 0-use amount of element as written at components_in_valid_cycle, 1-drop the chroma components any odd cycle*/
+    uint8_t subsample_YUV444_to_YUV422;
+    /*!< tile_mode Valid for IO that can provide tile format: 0-no tiling; 1-the IO should use tiling with the configured height, width, and tiling type (internal tiling or external Tile-4)*/
+    uint8_t tile_mode;
+    /*!< tiling_type Tiling Type: 0 - internal tiling; 1 - external tiling (Tile-4)*/
+    uint8_t tiling_type;
+    /*!< unpack_alignment Valid for unpacked vectors: 0-element located at LSB and MSB is zero; 1-element located at MSB and LSB is zero*/
+    uint8_t unpack_alignment;
+    /*!< vector_format Vector CL format: 0-unpacked using 2B container; 1-packed*/
+    uint8_t vector_format;
+    /*!< vertical_ordering_enable If set, the walking order should be vertical using the sub_line value to indicate how many CL generate vertical movement*/
+    uint8_t vertical_ordering_enable;
+    /*!< vertical_ordering_sub_line valid when vertical_ordering is set, indicates the size of the sub line to generate vertical step in CL granularity*/
+    uint8_t vertical_ordering_sub_line;
+    /*!< zlr_transaction_enable when set enable sending zlr request for prefetch address translation and compression status*/
+    uint8_t zlr_transaction_enable;
+
+} ia_pal_system_api_io_buffer_t;
+
+
+
+#pragma pack(pop)
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_statistics_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_statistics_types.h
new file mode 100644
index 000000000000..4e7dd56f846c
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_statistics_types.h
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_STATISTICS_TYPES_H_
+#define __IA_STATISTICS_TYPES_H_
+
+#include "ia_types.h"
+#include "ia_configuration.h"
+
+#define IA_RGBS_GRID_SIZE (IA_RGBS_GRID_WIDTH * IA_RGBS_GRID_HEIGHT)
+
+ /*!
+ * \brief Bayer color channels grouped into one structure.
+ */
+typedef struct
+{
+    unsigned char gr;
+    unsigned char r;
+    unsigned char b;
+    unsigned char gb;
+} ia_color_channels;
+
+/*!
+ * \brief Statistics grid with averaged RGBS color channels and saturation percentage.
+ * Total size of each color channel array is defined by width * height of the grid.
+ */
+typedef struct
+{
+    unsigned int grid_width;                        /*!< Mandatory. Width of RGBYS grids. */
+    unsigned int grid_height;                       /*!< Mandatory. Height of RGBYS grids. */
+    ia_color_channels avg[IA_RGBS_GRID_SIZE];       /*!< Mandatory. Averaged R, Gr, Gb and B channel data. */
+    unsigned char sat[IA_RGBS_GRID_SIZE];           /*!< Mandatory. Saturation percentage of pixels within collected data. [0, 255] = [0, 100]%. */
+} ia_rgbs_grid;
+
+#define IA_FILTER_RESPONSE_GRID_SIZE (IA_FILTER_RESPONSE_GRID_WIDTH * IA_FILTER_RESPONSE_GRID_HEIGHT)
+
+/*!
+ * \brief Filter responses interleaved.
+ */
+typedef struct
+{
+    int filter_1;    /*!< Filter response of filter 1 (e.g. low pass, used by auto focus). */
+    int filter_2;    /*!< Filter response of filter 2 (e.g. high pass, used by auto focus). */
+} ia_filter_response;
+
+/*!
+ * \brief Convolution filter respose statistics
+ * As defined in the AIQ statistics specification.
+ */
+typedef struct
+{
+    unsigned int grid_width;                                    /*!< Number of block elements horizontally in a grid. */
+    unsigned int grid_height;                                   /*!< Number of block elements vertically in a grid. */
+    ia_filter_response responses[IA_FILTER_RESPONSE_GRID_SIZE]; /*!< Interleaved filter responses. */
+} ia_filter_response_grid;
+
+typedef struct
+{
+    unsigned int element_count;                     /*!< Number of elements in the histogram. */
+    unsigned int bins[IA_HISTOGRAM_SIZE];           /*!< Histogram data. */
+} ia_histogram;
+
+typedef struct
+{
+    ia_rectangle   face_area;                 /*!< Bounding box of the face in the coordination system where (0,0) indicates left-top position. */
+    int32_t        tracking_id;               /*!< Tracking id of the face. */
+    int32_t        confidence;                /*!< Confidence in face detection result. */
+    ia_coordinate  mouth;                     /*!< Mid-point of the mouth. */
+    ia_coordinate  left_eye;                  /*!< Left eye */
+    ia_coordinate  right_eye;                 /*!< Right eye */
+    bool           eye_validity;              /*!< Indicates whether a face was processed to get eye positions */
+    float          skin_type_dark_likelihood; /*!< Likelihood of skin type being dark. Bright skin likelihood = 100 - dark_skin_type_likelihood */
+    bool           skin_type_validity;        /*!< Validity of the Skin Likelihood */
+} ia_face_roi;
+
+
+#define IA_DEPTH_GRID_SIZE (IA_DEPTH_GRID_WIDTH * IA_DEPTH_GRID_HEIGHT)
+
+typedef enum
+{
+    ia_depth_data_type_vcm,     /*!< VCM units */
+    ia_depth_data_type_mm,      /*!< Distance to the object in mm */
+} ia_depth_data_type;
+
+/*!
+ * Depth statistics grid.
+ */
+typedef struct
+{
+    unsigned int grid_width;                      /*!< Number of grid elements horizontally */
+    unsigned int grid_height;                     /*!< Number of grid elements vertically */
+    ia_depth_data_type type;                      /*!< Data type (VCM units/mm)*/
+    ia_rectangle grid_rect;                       /*!< ROI for the grid */
+    int depth_data[IA_DEPTH_GRID_SIZE];           /*!< Depth data (type of data is defined by ia_depth_data_type) */
+    unsigned char confidence[IA_DEPTH_GRID_SIZE]; /*!< Confidence level */
+} ia_depth_grid;
+
+#endif /* __IA_STATISTICS_TYPES_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_types.h
new file mode 100644
index 000000000000..33a8998baff5
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_types.h
@@ -0,0 +1,309 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _IA_TYPES_H_
+#define _IA_TYPES_H_
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdint.h>
+
+#if defined(_MSC_VER)
+    #if !defined(__BOOL_DEFINED)
+        #if _MSC_VER >= 1800 /* stdbool.h is available starting from VS2013. */
+            #include <stdbool.h>
+        #else /* Fallback for older VS versions. */
+            typedef unsigned char bool;
+            #define true 1
+            #define false 0
+        #endif
+    #endif
+#else
+    #include <stdbool.h>
+#endif
+
+#ifdef _WIN32
+    #ifndef BUILD_SHARED_LIBS
+        #define LIBEXPORT
+    #else
+        #ifdef BUILD_SHARED_LIBS
+            #define LIBEXPORT __declspec(dllexport)
+        #else
+            #define LIBEXPORT __declspec(dllimport)
+        #endif
+    #endif
+#else
+    #define LIBEXPORT
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ *  \brief Bundles binary data pointer with size.
+ */
+typedef struct
+{
+    void        *data;
+    unsigned int size;
+} ia_binary_data;
+
+/**
+ *  \brief Defines a common record header.
+ */
+typedef struct
+{
+    unsigned int uuid;
+    unsigned int size;
+} ia_record_header;
+
+typedef struct {
+    int major;
+    int minor;
+} ia_version;
+
+typedef enum {
+    CAPTURE_OUTPUT,
+    CAPTURE_VFPP,
+    PREVIEW_VFPP,
+    ACC_QOS
+} ia_acceleration_fw_dst;
+
+typedef struct {
+    void *isp;
+    void *(*open_firmware)     (const char *fw_path, unsigned *size);
+    int   (*load_firmware)     (void *isp, void *fw, unsigned size, unsigned *handle);
+    int   (*unload_firmware)   (void *isp, unsigned handle);
+    int   (*map_firmware_arg)  (void *isp, void *usr_ptr, size_t size, unsigned long *css_ptr);
+    int   (*unmap_firmware_arg)(void *isp, unsigned long css_ptr, size_t size);
+    int   (*set_firmware_arg)  (void *isp, unsigned handle, unsigned num, void *val, size_t size);
+    int   (*set_mapped_arg)    (void *isp, unsigned handle, unsigned mem, unsigned long css_ptr, size_t size);
+    int   (*start_firmware)    (void *isp, unsigned handle);
+    int   (*wait_for_firmware) (void *isp, unsigned handle);
+    int   (*abort_firmware)    (void *isp, unsigned handle, unsigned timeout);
+    ia_version version_isp;
+    ia_version version_css;
+    int   (*set_stage_state)   (void *isp, unsigned int handle, bool enable);
+    int   (*wait_stage_update) (void *isp, unsigned int handle);
+    int   (*load_firmware_ext) (void *isp, void *fw, unsigned size, unsigned *handle, int fw_dst);
+} ia_acceleration;
+
+typedef enum {
+    ia_frame_format_nv12,       /* 12 bit YUV 420, Y, UV plane */
+    ia_frame_format_yuv420,     /* 12 bit YUV 420, Y, U, V plane */
+    ia_frame_format_yuv444,     /* 24 bit YUV 444, Y, U, V plane */
+    ia_frame_format_raw,        /* RAW, 1 plane */
+    ia_frame_format_rgba32,     /* RGBA 8 bits per channel */
+    ia_frame_format_yuy2,       /* 16 bit YUV 422, YUYV plane */
+    ia_frame_format_raw16,      /* 16 bit RAW, 1 plane */
+    ia_frame_format_rgb16p,     /* 16 bits per channel, 3 planes */
+    ia_frame_format_yuv420sp16, /* 24 bit YUV 420, Y, UV plane */
+    ia_frame_format_yuv420p16,  /* 24 bit YUV 420, Y, U, V plane */
+    ia_frame_format_yuv444p16,  /* 48 bit YUV 444, Y, U, V plane */
+} ia_frame_format;
+
+typedef struct {
+    void           *data;     /**< Pointer to the image data */
+    int             size;     /**< Total number of bytes in data*/
+    int             width;    /**< Width of the frame in pixels */
+    int             height;   /**< Height of the frame in lines */
+    ia_frame_format format;   /**< Frame format */
+    int             stride;   /**< Stride, bytes per line*/
+    int             rotation; /**< degrees 0-360 */
+} ia_frame;
+
+/*!
+* \brief Raw image data format.
+*/
+typedef enum
+{
+    ia_image_data_format_rawplain16,             /*!< Data is 16 bits per pixel. */
+    ia_image_data_format_rawplain8,              /*!< Data is 8 bits per pixel. */
+    ia_image_data_format_rgb16,                  /*!< Data is in a buffer containing planes: R, G and B one after another. Data size is 16 bits per pixel. */
+    ia_image_data_format_smia10,                 /*!< SMIA 10 format groups 4 pixels: MSBs of four pixels in 4 bytes + LSBs of same 4 pixels in 1 byte. */
+    ia_image_data_format_nv12,                   /*!< Data is 12 bit YUV 420, Y, UV plane. */
+    ia_image_data_format_yuv420_planar,          /*!< Data is YUV 420 planar. */
+    ia_image_data_format_rawplain16_interleaved, /*!< Data is 16 bits per pixel interleaved so that all bayer quad pixels are one after another. Example: GRBGGRBG...*/
+    ia_image_data_format_rawplain32,             /*!< Data is 32 bits per pixel. */
+    ia_image_data_format_rgb32,                  /*!< Data is in a buffer containing planes: R, G and B one after another. Data size is 32 bits per pixel. */
+    ia_image_data_format_ov20bit                 /*!< Data is in as 2x10bit pixels [13 12 11 10 f e d c][x x x x x x b a] [9 8 7 6 5 4 3 2][x x x x x x 1 0]*/
+} ia_image_data_format;
+
+/*!
+* \brief Raw image essential information.
+* If raw image data doesn't contain any extra bytes/lines/columns, the image can be decoded with this info.
+* For all signed values in the structs below, negative value indicates N/A.
+*/
+typedef struct
+{
+    unsigned char data_format;   /*!< RawPlain16, RawPlain8 etc. as defined in the enum ia_image_data_format */
+    char bayer_order;            /*!< GRBG, RGGB, BGGR or GBRG as defined in the enum cmc_bayer_order. -1 if N/A */
+    char data_format_bpp;        /*!< Bits per pixel for a given data_format. eg. 16 for RawPlain16 etc. -1 if N/A*/
+    char data_bpp;               /*!< Bits per pixel used by the image data. -1 if N/A */
+    unsigned int width_cols;     /*!< Visible image width (640, 800, 1280, 1600, etc.) */
+    unsigned int height_lines;   /*!< Visible image height (480, 600, 960, 1200, etc.) */
+} ia_image_info;
+
+/*!
+* \brief Raw image info with additional details about extra bytes/lines/columns to skip when decoding the raw image.
+* This structure is stored inside header of Intel raw (IRAW) image as a makernote record. If a raw capture consists of multiple sub-images
+* (for example from multiple exposures or cameras), each sub-image needs to have own makernote record (with different name id).
+* image_start_offset defines start location of particular sub-image in the IRAW buffer/file.
+*/
+typedef struct
+{
+    ia_image_info raw_image;            /*!< Essential information needed to decode the image. */
+    unsigned int header_size_bytes;     /*!< Variable size header */
+    unsigned int footer_size_bytes;     /*!< Variable size footer */
+
+    unsigned short extra_bytes_left;    /*!< e.g. CCP sync codes */
+    unsigned short extra_bytes_right;   /*!< e.g. CCP sync codes */
+
+    unsigned short extra_lines_top;     /*!< Non-image data, e.g. embedded data lines */
+    unsigned short extra_cols_left;     /*!< Non-image data, extra columns at left */
+    unsigned short extra_cols_right;    /*!< Non-image data, extra columns at right */
+    unsigned short extra_lines_bottom;  /*!< Non-image data, e.g. embedded data lines */
+
+    char byte_order_xor;                /*!< 0, 1 or 3 (for the cases when byte order has been modified for whatever reason) */
+    char spatial_sampling;              /*!< 0 or 1 = Bayer or Co-sited */
+    unsigned short reserved;            /*!< Reserved to padding for 32 bit boundary. */
+    unsigned int image_start_offset;    /*!< Offset to beginning of image buffer. 0 if one image is present in the RAW image buffer. */
+} ia_image_full_info;
+
+/** Floating point range struct. */
+typedef struct {
+    float min;
+    float max;
+} ia_float_range;
+
+/*!
+ * Needs to be agreed with ia_imaging error codes.
+ * \brief Error codes.
+*/
+typedef enum {
+    ia_err_none     =  0,       /*!< No errors*/
+    ia_err_general  = (1 << 1), /*!< General error*/
+    ia_err_nomemory = (1 << 2), /*!< Out of memory*/
+    ia_err_data     = (1 << 3), /*!< Corrupted data*/
+    ia_err_internal = (1 << 4), /*!< Error in code*/
+    ia_err_argument = (1 << 5), /*!< Invalid argument for a function*/
+    ia_err_disabled = (1 << 6)  /*!< Functionality is disabled*/
+} ia_err;
+
+typedef struct {
+    int left;
+    int top;
+    int right;
+    int bottom;
+} ia_rectangle;
+
+/** Vector, used for image stabilization. */
+typedef struct {
+    int x;
+    int y;
+} ia_vector;
+
+/** Coordinate, used in red-eye correction. */
+typedef struct {
+    int x;
+    int y;
+} ia_coordinate;
+
+typedef struct {
+    void (*vdebug)(const char *fmt, va_list ap);
+    void (*verror)(const char *fmt, va_list ap);
+    void (*vinfo)(const char *fmt, va_list ap);
+} ia_env;
+
+typedef struct {
+    void *(*alloc) (void *isp, size_t size);
+    void  (*free)  (void *isp, void *usr_ptr, size_t size);
+} ia_mem_env;
+
+
+/*!
+* \brief Structure describes the media formats which AIC supports
+*/
+typedef enum
+{
+    media_format_legacy                = 0x00,    //ipu4 default
+    media_format_bt601_8b              = 0x20,    //bt601
+    media_format_bt601_8b_narrow       = 0x22,    //bt601
+    media_format_bt709_8b              = 0x30,    //bt709
+    media_format_bt709_8b_narrow       = 0x32,    //bt709
+    media_format_bt709_10b             = 0x40,    //bt709
+    media_format_bt709_10b_narrow      = 0x42,    //bt709
+    media_format_bt2020_10b            = 0x50,    //bt2020
+    media_format_bt2020_10b_narrow     = 0x52,    //bt2020
+    media_format_bt2020_12b            = 0x51,    //bt2020
+    media_format_bt2020_12b_narrow     = 0x53,    //bt2020
+    media_format_bt2100_10b            = 0x60,    //bt2100
+    media_format_bt2100_10b_narrow     = 0x62,    //bt2100
+    media_format_bt2100_12b            = 0x61,    //bt2100
+    media_format_bt2100_12b_narrow     = 0x63,    //bt2100
+    media_format_bt2100_10b_cl         = 0x64,    //bt2100
+    media_format_bt2100_10b_cl_narrow  = 0x66,    //bt2100
+    media_format_bt2100_12b_cl         = 0x65,    //bt2100
+    media_format_bt2100_12b_cl_narrow  = 0x67,    //bt2100
+    media_format_srgb_jpeg             = 0x80,    //srgb_jpeg
+    media_format_linear_mono           = 0xE0,    //linear gamma with "mono-srgb" space for e.g. IR mode.
+    media_format_custom                = 0xF0     //custom
+} ia_media_format;
+
+/** @brief Representing eyes.
+ * This structure represents the eye position and the blink state.
+ */
+typedef struct {
+    ia_coordinate position;                  /**< Position of the eye. */
+    int32_t       blink_confidence;          /**< Blink status in [0..100] range where 0 means wide open eye and 100 means fully closed eye.
+                                             negative integer means blink result is invalid (based on invalid ED position result) */
+} ia_atbx_eye;
+
+typedef struct {
+    ia_rectangle   face_area;                /**< Bounding box of the face in the coordination system where (0,0) indicates left-top position. */
+    int32_t        rip_angle;                /**< RIP (rotation in plane) angle in degrees. */
+    int32_t        rop_angle;                /**< ROP (rotation out of plane) angle in degrees. */
+    int32_t        tracking_id;              /**< Tracking id of the face. */
+    int32_t        confidence;               /**< Confidence in face detection result. */
+    int32_t        person_id;                /**< Person id (typically positive number) of the face. Filled after face recognition. -1 if not recognized. */
+    int32_t        similarity;               /**< Similarity value between this face and the face in the database which was recognized as the person. */
+    int32_t        best_ratio;               /**< Indicates the ratio between the most similar face and the 2nd similar face. */
+    int32_t        face_condition;           /**< Indicates the light condition of the face. Not used at this moment. */
+    int32_t        smile_state;              /**< Smile state of the face. -1 : invalid info (based on invalid ED position result)
+                                             0 : Non-smile, 1 : Smile, 2 : Start of the smile. Auxiliary variable for smile shutter. */
+    int32_t        smile_score;              /**< Smile score in the range of [0..100] where 0 is non-smile state and 100 is full smile state. */
+    ia_coordinate  mouth;                    /**< Mid-point of the mouth. */
+    ia_atbx_eye    left_eye;                 /**< Left eye */
+    ia_atbx_eye    right_eye;                /**< Right eye */
+    int32_t        eye_validity;             /**< Indicates whether a face was processed to get eye positions */
+    int32_t        skin_type_dark_likelihood;/**< Likelihood of skin type being dark. Bright skin likelihood = 100 - dark_skin_type_likelihood */
+    int32_t        skin_type_validity;       /**< Validity of the Skin Likelihood */
+} ia_atbx_face;
+
+/** @brief Face state data.
+ * This structure is used to hold inputs and outputs of functions and also works as a handle of the engine instance.
+ */
+typedef struct {
+    int32_t        num_faces;                /**< Number of faces in the recently processed input frame. */
+    ia_atbx_face  *faces;                    /**< Array of face information. */
+} ia_atbx_face_state;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA_TYPES_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_view.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_view.h
new file mode 100644
index 000000000000..b452ada462ad
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_view.h
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __IA_VIEW_H__
+#define __IA_VIEW_H__
+
+
+#include "ia_view_types.h"
+#include "ia_cmc_types.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*! \brief Initialize the view module.
+ *
+ * \param[out]  view_handle    handle maintaining the view instance
+ * \param[in]  cmc    The CMC parameters
+ * \return                        0 for no error, others for error.
+ *
+ * This function initializes the view module. This is expected to be called before any
+ * other ia_view* function.
+ */
+LIBEXPORT ia_err
+ia_view_init(ia_view_handle *view_handle, const ia_cmc_t *cmc);
+
+
+/*! \brief Deinitialize the view module.
+ *
+ * \param[in]  ia_view_handle    handle maintaining the view instance
+ *
+ * This function deinitilizes the view module and frees internal memory
+ */
+LIBEXPORT ia_err
+ia_view_deinit(ia_view_handle *view_handle);
+
+
+/*! \brief Set configuration parameters
+*
+* \param[in]  ia_view_handle   handle maintaining the view instance
+* \param[in]  config           Sets the basic configuration for the view
+*
+* This function sets the basic configurations parameters
+*/
+LIBEXPORT ia_err
+ia_view_set_configuration(ia_view_handle view_handle,
+    const ia_view_config_t *config);
+
+
+/*! \brief Get configuration parameters
+*
+* \param[in]  ia_view_handle   handle maintaining the view instance
+* \param[out] config           Sets the basic configuration for the view
+*
+* This function gets the basic configurations parameters
+*/
+LIBEXPORT ia_err
+ia_view_get_configuration(ia_view_handle view_handle,
+    ia_view_config_t *config);
+
+/*! \brief Run the view parameter calculation
+*
+* \param[in]  ia_view_handle   handle maintaining the view instance
+* \param[in]  camera_rotation  camera rotation matrix from DVS
+*
+* This function does the calculation of parameters
+*/
+LIBEXPORT ia_err
+ia_view_run(ia_view_handle view_handle,
+    const float camera_rotation[3][3]);
+
+/*! \brief Get the last calculated view parameters
+*
+* \param[in]  ia_view_handle   handle maintaining the view instance
+* \param[out] view_params      Get calculated view parameters
+*
+* This function returns the view parameters
+*/
+LIBEXPORT ia_err
+ia_view_get_view_parameters(ia_view_handle view_handle,
+    ia_view_params_t *view_params);
+
+
+/*! \brief Set view rotation
+*
+* \param[in]  ia_view_handle    handle maintaining the view instance
+* \param[in]  view_rotation     New rotation to apply
+*
+* This function sets the new view rotation
+*/
+LIBEXPORT ia_err
+ia_view_set_view_rotation(ia_view_handle view_handle,
+    const ia_view_rotation_t *view_rotation);
+
+/*! \brief Set camera rotation
+*
+* \param[in]  ia_view_handle    handle maintaining the view instance
+* \param[in]  view_rotation     New rotation to apply
+*
+* This function sets the new camera rotation
+*/
+LIBEXPORT ia_err
+ia_view_set_camera_rotation(ia_view_handle view_handle,
+    const ia_view_rotation_t *camera_rotation);
+
+/*! \brief Get view rotation
+*
+* \param[in]  ia_view_handle    handle maintaining the view instance
+* \param[out] view_rotation    The current rotation settings
+*
+* This function get the current view rotation
+*/
+LIBEXPORT ia_err
+ia_view_get_view_rotation(ia_view_handle view_handle,
+     ia_view_rotation_t *view_rotation);
+
+
+/*! \brief Set window adjustment parameters
+*
+* \param[in] ia_view_handle    handle maintaining the view instance
+* \param[in] fine_adjustments  Set the window adjustment parameters
+*
+* This function sets the window adjustment
+*/
+LIBEXPORT ia_err
+ia_view_set_fine_adjustments(ia_view_handle view_handle,
+    const ia_view_fine_adjustments_t *fine_adjustments);
+
+
+/*! \brief Get window adjustment parameters
+*
+* \param[in]  ia_view_handle   handle maintaining the view instance
+* \param[out] fine_adjustments Get the window adjustment parameters
+*
+* This function gets the current window adjustment
+*/
+LIBEXPORT ia_err
+ia_view_get_fine_adjustments(ia_view_handle view_handle,
+    ia_view_fine_adjustments_t *fine_adjustments);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __IA_VIEW_H__ */
+
+
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_view_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_view_types.h
new file mode 100644
index 000000000000..923e060f0967
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_view_types.h
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __IA_VIEW_TYPES_H_
+#define __IA_VIEW_TYPES_H_
+
+#include <stdint.h>
+#include "ia_types.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*!< ia_view_status_t: ia_view enable/disable and configure status */
+typedef enum {
+    ia_view_bypass=0,
+    ia_view_user_input_configured,
+    ia_view_resolution_configured,
+} ia_view_status_t;
+
+/*!< ia_view_proc_enabled_t: The processing blocks enabled in GDC. Used in PAL*/
+typedef enum {
+    ia_view_proc_enabled_none=0,
+    ia_view_proc_enabled_pre_affine=(1<<0),
+    ia_view_proc_enabled_rotation=(1<<1),
+    ia_view_proc_enabled_post_affine=(1<<2),
+} ia_view_proc_enabled_t;
+
+
+/*!< ia_view_resolution_params_t: The frame resolutions at various points in the pipe*/
+typedef enum {
+    ia_view_resolution_at_sensor_output=0, /*Resolution at sensor output */
+    ia_view_resolution_at_gdc_input,       /*Resolution at gdc input */
+    ia_view_resolution_at_gdc_output,      /*Resolution at gdc output */
+    ia_view_resolution_at_pipe_output,     /*Resolution at pipe output */
+    ia_view_resolution_max,
+} ia_view_resolution_params_t;
+
+
+/*!< Invalid coordinate size: Number of color channels possible to be specified.*/
+#define IA_VIEW_INVALID_COORD_SIZE      (4)
+
+/*!< ia_view_projection_type_t: User controllable projection type*/
+typedef enum {
+    ia_view_projection_rectilinear,
+    ia_view_projection_conical,
+    ia_view_projection_equirectangular,
+    ia_view_projection_2Dbowl,
+    ia_view_projection_cylindrical
+} ia_view_projection_type_t;
+
+/*!< ia_view_camera_mount_type_t: User controllable camera mount type*/
+typedef enum {
+    ia_view_wall_mounted,
+    ia_view_ceiling_mounted,
+} ia_view_camera_mount_type_t;
+
+/*!< ia_view_fine_adjustments_t: Control fine adjustments of the viewing window*/
+typedef struct
+{
+    float horizontal_shift;    /*!< Horizontal shift in pixels*/
+    float vertical_shift;      /*!< Vertical shift in pixels*/
+    float window_rotation;     /*!< Rotate the window, angle in degrees*/
+    float vertical_stretch;    /*!< Vertical stretch factor*/
+} ia_view_fine_adjustments_t;
+
+
+/*!< ia_view_rotation_t: Set view rotation in x, y, z axis*/
+typedef struct
+{
+    float pitch;   /*!< pitch angle in degrees: rotation along X axis*/
+    float yaw;     /*!< yaw angle in degrees: rotation along Y axis*/
+    float roll;    /*!< roll angle in degrees: rotation along Z axis*/
+} ia_view_rotation_t;
+
+
+/*!< ia_view_resolution_t: The resolution required for view*/
+typedef struct
+{
+    int width;      /*!< Resolution width */
+    int height;     /*!< Resolution height */
+    int horz_offset;    /*!< Horizontal offset */
+    int vert_offset;    /*!< Vertical offset */
+    float scale_factor; /*!< Scale factor */
+} ia_view_resolution_t;
+
+/*!< translation array size*/
+#define IA_VIEW_3D_TRANSLATION_SIZE (3)
+
+/*!< ia_view_config_t: Set view parameters*/
+typedef struct
+{
+    ia_view_projection_type_t type;   /*!< type: The projection type desired*/
+    float zoom;                       /*!< zoom: Zoom configuration*/
+    float cone_angle;                 /*!< cone_angle used only for ia_view_projection_conical*/
+    double bowl_radius_sqr;            /*!< bowl_radius_sqr used only for ia_view_projection_2Dbowl*/
+    double bowl_scale;                 /*!< bowl_scale used only for ia_view_projection_2Dbowl*/
+    ia_view_camera_mount_type_t camera_mount_type; /*! camera mount type: The mounting position of the camera: wall, ceiling*/
+    int32_t invalid_coordinate_mask[IA_VIEW_INVALID_COORD_SIZE]; /*!< Used to fill for each color channel when coordinates falls out of bounds */
+
+    ia_view_rotation_t          camera_rotation;     /*(< Camera rotation configuration */
+    ia_view_rotation_t          view_rotation;       /*!< View rotation configuration */
+    float translation[IA_VIEW_3D_TRANSLATION_SIZE];  /*!< Translation3D vector for Bowl projection*/
+    ia_view_fine_adjustments_t  fine_adjustments;    /*!< Fine adjustment configuration */
+} ia_view_config_t, *ia_isp_bxt_view_params_t;
+
+/*!< ia_view_mbr_limits_t: Set mbr limits for view parameters*/
+typedef struct
+{
+    /*!< Min Zooming on projection*/
+    float  zoom;
+    /*!< max pitch of view*/
+    float pitch;
+    /*!< max yaw of view*/
+    float yaw;
+    /*!< max roll view*/
+    float roll;
+    /*!<  max Window rotation*/
+    float winrotation;
+    /*!< max vertical scale*/
+    float vertical_stretch;
+    /*!< max horizontal shift*/
+    float horizontal_shift;
+    /*!< max vertical shift*/
+    float vertical_shift;
+} ia_view_limits_t;
+
+typedef struct
+{
+    ia_view_limits_t cylindrical;
+    ia_view_limits_t equirectangular;
+    ia_view_limits_t rectilinear;
+    ia_view_limits_t conical_m40;
+    ia_view_limits_t conical_m20;
+    ia_view_limits_t conical_p20;
+    ia_view_limits_t conical_p40;
+}ia_view_mbr_limits_t,ia_isp_bxt_gdc_limits;
+
+
+
+/*!< ia_view_projection_t: Calculated parameter used in PAL*/
+typedef struct
+{
+    ia_view_projection_type_t type; /*!< type: Projection type to be used*/
+    double scale_factor_1[2];   /*!< scale_factor_1: Internal scale factor calculated*/
+    double scale_factor_2[2];   /*!< scale_factor_2: Internal scale factor calculated*/
+    double inv_f_pi;            /*!< inv_f_pi is inverse focal lenght pi: Internal parameter*/
+    double bowl_radius_sqr;
+    double bowl_scale;
+} ia_view_projection_t;
+
+
+/*!< ia_view_params_t: Calculated parameter to be used in PAL*/
+typedef struct
+{
+    /*!< Mask indicating what parameters are enabled*/
+    int32_t enabled_mask;
+
+    /*!< Projections the view */
+    ia_view_projection_t projection;
+
+    /*!< Pre Affine Matrix: Window rotatoin and scale*/
+    float pre_affine_scale_matrix[2][2];
+
+    /*!< Pre Affine Matrix: Translation*/
+    double pre_affine_translation_matrix[2];
+
+    /*!< Rotation Matrix combines camera and view rotations */
+    float rotation_matrix[3][3];
+
+    /*!< Translation3D Matrix for Bowl Projection*/
+    float translation_matrix[IA_VIEW_3D_TRANSLATION_SIZE];
+
+    /*!< Post Affine Matrix */
+    float post_affine_scale_matrix[2][2];
+
+    /*!< Post Affine Matrix */
+    double post_affine_translation_matrix[2];
+
+    /*!< Invalid coordinate mask for each color channel */
+    int32_t invalid_coordinate_mask[IA_VIEW_INVALID_COORD_SIZE];
+
+} ia_view_params_t;
+
+typedef struct
+{
+    ia_view_status_t is_configured;
+    ia_view_config_t config;
+    ia_view_resolution_t resolution[ia_view_resolution_max]; /*!< View resolution at different stages in the pipe */
+    float cmc_affine_scale_matrix[2][2];
+    double cmc_affine_translation_matrix[2];
+    float cmc_focal_length;
+
+    ia_view_params_t isp_params;
+} ia_view_t;
+
+typedef ia_view_t* ia_view_handle;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __IA_VIEW_TYPES_H_ */
+
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_blink_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_blink_detection.h
new file mode 100644
index 000000000000..9371d41aa8d8
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_blink_detection.h
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __PVL_BLINK_DETECTION_H__
+#define __PVL_BLINK_DETECTION_H__
+
+/** @file    pvl_blink_detection.h
+ *  @brief   This file declares the structures and native APIs of blink detection component.
+ */
+
+#include "pvl_types.h"
+#include "pvl_config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/** @brief A structure to hold run-time configurable parameters for this component.
+ *
+ *  The variables in this structure will be retrieved and assigned, via pvl_blink_detection_get_parameters() and pvl_blink_detection_set_parameters() respectively.
+ */
+struct pvl_blink_detection_parameters
+{
+    int32_t threshold;                      /**< A threshold value which is the determinant of the blink. If the given blink score on the eye is
+                                                 greater than or equal to this value, the state of the eye will be estimated as 'closed'. */
+};
+typedef struct pvl_blink_detection_parameters pvl_blink_detection_parameters;
+
+
+/** @brief The enumerated values to represent the blink state of an eye.
+ */
+enum pvl_blink_detection_state
+{
+    pvl_blink_detection_state_open    = 0,   /**< The state representing the eye open. */
+    pvl_blink_detection_state_closed  = 1    /**< The state representing the eye closed. */
+};
+typedef enum pvl_blink_detection_state pvl_blink_detection_state;
+
+
+/** @brief A structure to hold the outcomes from this component.
+ */
+struct pvl_blink_detection_result
+{
+    int32_t left_score;                     /**< The blink score on the left eye in range between 0 and 100, where 0 means wide opened eye and 100 means fully closed eye. */
+    pvl_blink_detection_state left_state;   /**< The blink state on the left eye. */
+    int32_t right_score;                    /**< The blink score on the right eye in range between 0 and 100, where 0 means wide opened eye and 100 means fully closed eye. */
+    pvl_blink_detection_state right_state;  /**< The blink state on the right eye. */
+};
+typedef struct pvl_blink_detection_result pvl_blink_detection_result;
+
+
+/** @brief A structure to hold the run-time context of this component.
+ *
+ *  This structure represents the blink detection instance which is used as the handle over most of API.
+ *  It holds its own properties, constant parameters and internal context inside.
+ */
+struct pvl_blink_detection
+{
+    const pvl_version version;          /**< The version information. */
+
+    const int32_t default_threshold;    /**< The default threshold value recommended. */
+    const int32_t rop_tolerance;        /**< The maximum range of ROP (Rotation Out of Plane) tolerance of the face.
+                                             The accuracy may not be guaranteed if the ROP angle is out of range. */
+};
+typedef struct pvl_blink_detection pvl_blink_detection;
+
+
+/** @brief Get default configuration of this component.
+ *
+ *  This function returns default configuration of the blink detection component.
+ *  The returned configuration could be customized as per its usage.
+ *
+ *  @param[out] config  The structure to load default configuration.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ */
+PVLAPI pvl_err
+pvl_blink_detection_get_default_config(pvl_config *config);
+
+
+/** @brief Create an instance of the blink detection component.
+ *
+ *  This function initializes and returns an instance of this component.
+ *  Multiple instances are allowed to be created concurrently.
+ *
+ *  @param[in]  config  The configuration information of the component.
+ *  @param[out] bd      A pointer to indicate the handle newly created.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported configuration.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
+ */
+PVLAPI pvl_err
+pvl_blink_detection_create(const pvl_config *config, pvl_blink_detection **bd);
+
+
+/** @brief Destroy the instance of this component.
+ *
+ *  @param[in]  bd   The handle of this component to be destroyed.
+ */
+PVLAPI void
+pvl_blink_detection_destroy(pvl_blink_detection *bd);
+
+
+/** @brief Reset the instance of this component.
+ *
+ *  All the internal states and context will be reset except the run-time parameters set by user.
+ *
+ *  @param[in]  bd  The handle of this component.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ */
+PVLAPI pvl_err
+pvl_blink_detection_reset(pvl_blink_detection *bd);
+
+
+/** @brief Set run-time parameters of this component.
+ *
+ *  Set given parameters to the handle.
+ *  It is required to get proper parameters instance by pvl_blink_detection_get_parameters() before setting something.
+ *
+ *  @param[in]  bd      The handle of this component.
+ *  @param[in]  params  The parameters to be set.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ */
+PVLAPI pvl_err
+pvl_blink_detection_set_parameters(pvl_blink_detection *bd, const pvl_blink_detection_parameters *params);
+
+
+/** @brief Get current run-time parameters of this component.
+ *
+ *  Get the parameters from the handle.
+ *  This function should be called before calling pvl_blink_detection_set_parameters().
+ *
+ *  @param[in]  bd      The handle of this component.
+ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ */
+PVLAPI pvl_err
+pvl_blink_detection_get_parameters(pvl_blink_detection *bd, pvl_blink_detection_parameters *params);
+
+
+/** @brief Detect blink on the face in the input image.
+ *
+ *  This function runs blink detection on the face in the given image.
+ *  It runs on both eyes. It's not allowed to run with only one eye.
+ *  The caller is responsible for allocating the buffer for the result.
+ *
+ *  @param[in]  bd          The handle of the blink detection component.
+ *  @param[in]  image       The input image. All image formats are supported.
+ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
+ *  @param[in]  left_eye    The center point on the left eye of the face.
+ *  @param[in]  right_eye   The center point on the right eye of the face.
+ *  @param[out] result      The result of the component. It must be allocated with enough memory to hold the result.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
+ */
+PVLAPI pvl_err
+pvl_blink_detection_run(pvl_blink_detection *bd, const pvl_image *image, const pvl_point *left_eye, const pvl_point *right_eye,
+                        pvl_blink_detection_result *result);
+
+
+#ifdef __cplusplus
+}
+#endif // __cplusplus
+
+/** @example face_detection_sample.cpp
+ *  Sample of Face  Detection
+ */
+
+#endif /* __PVL_BLINK_DETECTION_H__ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_config.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_config.h
new file mode 100644
index 000000000000..06779366375c
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_config.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __PVL_CONFIG_H__
+#define __PVL_CONFIG_H__
+
+/** @file   pvl_config.h
+ *  @brief  This file defines common data structures for configuration of components.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "pvl_types.h"
+
+
+/** @brief A structure to hold HW acceleration contexts.
+ *  This structure is not actively used now and subjected to change for the future release.
+ */
+struct pvl_acceleration {
+    const pvl_bool is_supporting_gpu;   /**< The supportability of the GPU acceleration by the component. The value should be defined by each component. */
+    const pvl_bool is_supporting_ipu;   /**< The supportability of the IPU acceleration by the component. The value should be defined by each component. */
+
+    pvl_bool enable_gpu;                /**< GPU acceleration switch. Setting pvl_true enables the GPU acceleration mode of the component.
+                                             The default value is defined by each component, and the possible values are limited by 'is_supporting_gpu'. */
+    pvl_bool enable_ipu;                /**< IPU acceleration switch. Setting pvl_true enables the IPU acceleration mode of the component.
+                                             The default value is defined by each component, and the possible values are limited by 'is_supporting_ipu'. */
+
+    void *gpu_context;                  /**< The user-provided GPU acceleration context data. */
+    void *ipu_context;                  /**< The user-provided IPU acceleration context data. */
+};
+typedef struct pvl_acceleration pvl_acceleration;
+
+
+/** @brief A structure to hold default or user-provided log functions.
+ *  This structure is not actively used now and subject to change in future release.
+ */
+struct pvl_log_apis {
+    void (*debug)(const char *fmt, va_list ap);             /**< The logging function for debugging. */
+    void (*error)(const char *fmt, va_list ap);             /**< The logging function for error reporting. */
+    void (*warning)(const char *fmt, va_list ap);           /**< The logging function for warning message. */
+    void (*info)(const char *fmt, va_list ap);              /**< The logging function for information. */
+    void (*dump)(int32_t id, uint8_t *data, uint32_t size); /**< The logging function for dumping binary data. */
+};
+typedef struct pvl_log_apis pvl_log_apis;
+
+
+/**
+ * @brief A structure to hold the configuration of the component.
+ *
+ * This structure is used as a parameter for the initial configuration of the component.
+ *
+ * @code
+ * // Sample usage
+ * pvl_err pvl_xxx_get_default_config(pvl_config* config);
+ * pvl_err pvl_xxx_create(const pvl_config* config, pvl_xxx** component);
+ * @endcode
+ *
+ */
+struct pvl_config {
+    const pvl_version version;      /**< The version information of the component (non-modifiable). */
+    pvl_acceleration acceleration;  /**< The configuration of the HW acceleration. The user can enable or disable the HW acceleration via this structure */
+    pvl_log_apis log_apis;          /**< The logging functions. The users can dispatch logging messages via this structure. */
+};
+typedef struct pvl_config pvl_config;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif // __PVL_TYPES_H__
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_eye_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_eye_detection.h
new file mode 100644
index 000000000000..85da6b0fa814
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_eye_detection.h
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __PVL_EYE_DETECTION_H__
+#define __PVL_EYE_DETECTION_H__
+
+/** @file    pvl_eye_detection.h
+ *  @brief   This file declares the structures and native APIs of eye detection component.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "pvl_types.h"
+#include "pvl_config.h"
+
+
+/** @brief A structure to hold the outcomes from this component.
+ */
+struct pvl_eye_detection_result
+{
+    pvl_point left_eye;         /**< The center position on the left eye (in the view of the observer).
+                                     The origin (0,0) of the point is the upper-left corner of the input image. */
+    pvl_point right_eye;        /**< The center position on the right eye (in the view of the observer). */
+    int32_t confidence;         /**< The confidence value of the detected eyes. The value is negative if the eye detection failed. */
+};
+typedef struct pvl_eye_detection_result pvl_eye_detection_result;
+
+
+/** @brief A structure to hold the run-time context of this component.
+ *
+ *  This structure represents the eye detection instance which is used as the handle over most of API.
+ *  It holds its own properties, constant parameters and internal context inside.
+ */
+struct pvl_eye_detection
+{
+    const pvl_version version;              /**< The version information. */
+
+    const float max_face_width_ratio;       /**< The maximum supported ratio of the width of the face to the eye distance,
+                                                 s.t. max_face_with_ratio = (the width of the face)/(the distance between two eyes).
+                                                 The eye detection accuracy will be dropped if the estimated face region (as the parameter of pvl_eye_detection_run) is too large compared to the actual face size. */
+    const float max_rip_error_tolerance;    /**< The maximum supported value (in degree) of the difference between the actual RIP degree and the input RIP degree.
+                                                 The eye detection accuracy will be dropped if the actual RIP degree is greater than (input RIP angle)±(max_rip_error_tolerance). */
+};
+typedef struct pvl_eye_detection pvl_eye_detection;
+
+
+/** @brief Get default configuration of this component.
+ *
+ *  This function returns default configuration of the eye detection component.
+ *  The returned configuration could be customized as per its usage.
+ *
+ *  @param[out] config  The structure to load default configuration.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ */
+PVLAPI pvl_err
+pvl_eye_detection_get_default_config(pvl_config *config);
+
+
+/** @brief Create an instance of the eye detection component.
+ *
+ *  This function initializes and returns an instance of this component.
+ *  Multiple instances are allowed to be created concurrently.
+ *
+ *  @param[in]  config  The configuration information of the component.
+ *  @param[out] ed      A pointer to indicate the handle newly created.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported configuration.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
+ */
+PVLAPI pvl_err
+pvl_eye_detection_create(const pvl_config *config, pvl_eye_detection **ed);
+
+
+/** @brief Destroy the instance of this component.
+ *
+ *  @param[in]  ed   The handle of this component to be destroyed.
+ */
+PVLAPI void
+pvl_eye_detection_destroy(pvl_eye_detection *ed);
+
+
+/** @brief Reset the instance of this component.
+ *
+ *  All the internal states and context will be reset except the run-time parameters set by user.
+ *
+ *  @param[in]  ed  The handle of this component.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
+ */
+PVLAPI pvl_err
+pvl_eye_detection_reset(pvl_eye_detection *ed);
+
+
+/** @brief Detect left and right eye positions from a region of faces in the image.
+ *
+ *  This function will do the eye detection in the given a region of faces in the image.
+ *  The function caller is responsible for allocation of the buffer for result.
+ *
+ *  @param[in]  ed          The handle of the eye detection component.
+ *  @param[in]  image       The input image for detecting the positions of eyes. All image formats are supported.
+ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
+ *  @param[in]  face_region The struct of rectangular regions of faces.
+ *  @param[in]  rip_angle   The value of RIP (Rotation in Plane) of the faces in degree.
+ *  @param[out] result      The result buffer.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
+ */
+PVLAPI pvl_err
+pvl_eye_detection_run(pvl_eye_detection *ed, const pvl_image *image, const pvl_rect *face_region, int32_t rip_angle, pvl_eye_detection_result *result);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @example face_detection_sample.cpp
+ *  Sample of Eye Detection
+ */
+
+#endif // __PVL_EYE_DETECTION_H__
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_face_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_face_detection.h
new file mode 100644
index 000000000000..b0de801ee45a
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_face_detection.h
@@ -0,0 +1,270 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __FD_PVL_FACE_DETECTION_H__
+#define __FD_PVL_FACE_DETECTION_H__
+
+/** @file    pvl_face_detection.h
+ *  @brief   This file declares the structures and native APIs of face detection component.
+ */
+
+#include "pvl_config.h"
+#include "pvl_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @brief A enum to present usage modes.
+ *
+ * Will help to choose best parameters for needed work.
+ */
+enum pvl_mode {
+    normal,     /**< Most accurate face detection. */
+    low_power,  /**< Accuracy is sacrificed to get CPU load to minimun. */
+    high_accuracy = normal,
+};
+
+typedef pvl_mode pvl_accuracy; // for backwards compatibility
+
+/** @brief A structure to hold run-time configurable parameters for this component.
+ *
+ *  The variables in this structure will be retrieved and assigned, via pvl_face_detection_get_parameters() and pvl_face_detection_set_parameters() respectively,
+ */
+struct pvl_face_detection_parameters {
+    uint32_t max_num_faces;            /**< The maximum number of detectable faces in one frame.
+                                            max_supported_num_faces in pvl_face_detection structure represents the maximum allowable value, and minimum allowable value set to 1.
+                                            The default value is set to maximum when the component is created. */
+
+    float min_face_ratio;              /**< The ratio of minimum detectable face size to the shorter side of the input image.
+                                            The value has the range between 0.0 and 1.0.
+                                            The smallest detectable face size is calculated as min_face_ratio * min(image width, image height).
+                                            The faces smaller than the minimum size may not be detected. */
+
+    uint16_t rip_range;                /**< The degree of RIP (Rotation In-Plane) ranges, representing [-rip_range, +rip_range]. */
+
+    uint16_t rop_range;                /**< The degree of ROP (Rotation Out-of-Plane) ranges, representing [-rop_range, +rop_range]. */
+
+    uint32_t num_rollover_frames;      /**< The number of rollover frames indicating how many frames the entire scanning will be distributed.
+                                            The value works in the preview mode, only. */
+};
+typedef struct pvl_face_detection_parameters pvl_face_detection_parameters;
+
+
+/** @brief A structure to hold the outcomes from this component.
+ */
+struct pvl_face_detection_result {
+    pvl_rect rect;                     /**< The rectangular region of the detected face. */
+    int32_t confidence;                /**< The confidence value of the detected face [0, 100]. */
+    int32_t rip_angle;                 /**< The approximated value of RIP angle (in degree) of the detected face. */
+    int32_t rop_angle;                 /**< The approximated of ROP angle (in degree) of the detected face. */
+    int32_t tracking_id;               /**< The tracking id of the face. Only valid in preview mode.
+                                            The value will be unique throughout the component life cycle, unless pvl_face_detection_reset() is called. */
+};
+typedef struct pvl_face_detection_result pvl_face_detection_result;
+
+
+/** @brief A structure to hold the run-time context of this component.
+ *
+ *  This structure represents the face detection instance which is used as the handle over most of API.
+ *  It holds its own properties, constant parameters and internal context inside.
+ */
+struct pvl_face_detection {
+    const pvl_version version;                  /**< The version information. */
+
+    const uint32_t max_supported_num_faces;     /**< The maximum number of faces supported by this component. */
+    const uint32_t min_face_size;               /**< The minimum size in pixel of detectable faces of this component. */
+
+    const uint16_t rip_range_max;               /**< The maximum value of RIP range (in degree). */
+    const int16_t rip_range_resolution;         /**< The resolution of RIP range value. RIP range should be multiple of this value. */
+
+    const uint16_t rop_range_max;               /**< The maximum value of ROP range (in degree). */
+    const int16_t rop_range_resolution;         /**< The resolution of ROP range value. ROP range should be multiple of this value. */
+};
+typedef struct pvl_face_detection pvl_face_detection;
+
+
+/** @brief Get default configuration of this component.
+ *
+ *  This function returns default configuration of the face detection component.
+ *  The returned configuration could be customized as per its usage.
+ *
+ *  @param[out] config  The structure to load default configuration.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ */
+PVLAPI pvl_err
+pvl_face_detection_get_default_config(pvl_config *config);
+
+
+/** @brief Create an instance of the face detection component.
+ *
+ *  This function initializes and returns an instance of this component.
+ *  Multiple instances are allowed to be created concurrently.
+ *
+ *  @param[in]  config  The configuration information of the component.
+ *  @param[out] fd      A pointer to indicate the handle newly created.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported configuration.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
+ */
+PVLAPI pvl_err
+pvl_face_detection_create(const pvl_config *config, pvl_face_detection **fd);
+
+
+/** @brief Destroy the instance of this component.
+ *
+ *  @param[in]  fd   The handle of this component to be destroyed.
+ */
+PVLAPI void
+pvl_face_detection_destroy(pvl_face_detection *fd);
+
+
+/** @brief Reset the instance of this component.
+ *
+ *  All the internal states including face tracking information and context will be reset except the run-time parameters set by user.
+ *
+ *  @param[in]  fd  The handle of this component.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to re-allocate the memory.
+ */
+PVLAPI pvl_err
+pvl_face_detection_reset(pvl_face_detection *fd);
+
+
+/** @brief Set run-time parameters of this component.
+ *
+ *  Set given parameters to the handle.
+ *  It is required to get proper parameters instance by pvl_face_detection_get_parameters() before setting something.
+ *
+ *  @param[in]  fd      The handle of this component.
+ *  @param[in]  params  The parameters to be set.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to re-allocate the memory for parameter changes.
+ */
+PVLAPI pvl_err
+pvl_face_detection_set_parameters(pvl_face_detection *fd, const pvl_face_detection_parameters *params);
+
+
+/** @brief Get current run-time parameters of this component.
+ *
+ *  Get the parameters from the handle.
+ *  This function should be called before calling pvl_face_detection_set_parameters().
+ *
+ *  @param[in]  fd      The handle of this component.
+ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ */
+PVLAPI pvl_err
+pvl_face_detection_get_parameters(pvl_face_detection *fd, pvl_face_detection_parameters *params);
+
+
+/** @brief Get current run-time parameters of this component.
+*
+*  Get the predefined parameters.
+*  This function can be used to get good values for diffent needs.
+*
+*  @param[in]  mode     The requested usage mode.
+*  @param[out] params   The buffer which will hold parameters. Its allocation must be managed by the caller.
+*
+*  @return     On success, @ref pvl_success.
+*
+*  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+*/
+PVLAPI pvl_err
+pvl_face_detection_default_parameters(pvl_mode mode, pvl_face_detection_parameters *params);
+
+
+/** @brief Detect faces from the input image.
+ *
+ *  This function will run the face detection in the given image.
+ *  The caller is responsible for allocating the buffer for the result.
+ *
+ *  @param[in]  fd          The handle of the face detection component.
+ *  @param[in]  image       The input image. All image formats are supported.
+ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
+ *  @param[out] result      The result buffer.
+ *  @param[in]  max_result  The number of results that the buffers can hold.
+ *
+ *  @return     On success, the number of detected faces.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
+ *  @retval     pvl_err_invalid_argument    Passing null instance of fd or non-positive max_result.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
+ */
+PVLAPI int32_t
+pvl_face_detection_run_in_image(pvl_face_detection *fd, const pvl_image *image, pvl_face_detection_result *result, int32_t max_result);
+
+
+/** @brief Detect faces from the gray image, a part of the sequence of preview frame.
+ *
+ *  This function performs the face detection to the given image, assuming that the image is a part of the sequence of preview or video frames.
+ *  The function re-uses the result of the previous frames to detect faces faster, i.e. the result will be affected by previous calls of this function,
+ *  whereas each call of pvl_face_detection_run_in_image() works independently.
+ *  The caller is responsible for allocating the result buffer.
+ *
+ *  @param[in]  fd          The handle of the face detection component.
+ *  @param[in]  image       The input image. All image formats are supported.
+ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
+ *  @param[out] result      The result buffer.
+ *  @param[in]  max_result  The number of results that the buffer can hold.
+ *
+ *  @return     On success, the number of detected faces, which is non-negative value.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or non-positive max_result.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
+ */
+PVLAPI int32_t
+pvl_face_detection_run_in_preview(pvl_face_detection *fd, const pvl_image *image, pvl_face_detection_result *result, int32_t max_result);
+
+
+#ifdef __cplusplus
+}
+#endif   // __cplusplus
+
+/** @example face_detection_sample.cpp
+ *  Sample of Face Detection
+ */
+
+#endif   // __FD_PVL_FACE_DETECTION_H__
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_face_recognition.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_face_recognition.h
new file mode 100644
index 000000000000..d5d678a269e3
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_face_recognition.h
@@ -0,0 +1,473 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __PVL_FACE_RECOGNITION_H__
+#define __PVL_FACE_RECOGNITION_H__
+
+/** @file    pvl_face_recognition.h
+ *  @brief   This file declares the structures and native APIs of face recognition component.
+ */
+
+#include "pvl_types.h"
+#include "pvl_config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define FACE_RECOGNIZER_UNKNOWN_PERSON_ID   (-10000)   /**< The "unknown person", which will be assigned to person_id of the structure, 'pvl_face_recognition_facedata'. */
+
+
+/** @brief A structure to hold a set of data representing a face which is used in face recognition.
+ *
+ *  The user is recommended to use the struct returned from pvl_face_recognition_run_in_image() when registering the facedata
+ *  with assigning unique positive number to person_id field.
+ */
+struct pvl_face_recognition_facedata{
+    uint64_t face_id;       /**< The unique id of the face data. */
+    int32_t  person_id;     /**< The unique id of the person associated with the face data. The valid person will have positive person_id (i.e. person_id > 0). */
+    uint32_t time_stamp;    /**< The timestamp when the face data was generated. */
+    int32_t  condition;     /**< The environmental information of the face. Reserved for future use. */
+    int32_t  checksum;      /**< The checksum value of the face data. */
+    uint8_t  *data;         /**< The pointer to the actual face data. Face data is essentially a binary encoded representation of the face generated from the gray face image.
+                                 The size will be stored in facedata_size of the structure 'pvl_face_recognition'. */
+};
+typedef struct pvl_face_recognition_facedata pvl_face_recognition_facedata;
+
+
+/** @brief A structure to hold run-time configurable parameters for this component.
+ *
+ *  The variables in this structure will be retrieved and assigned, via pvl_face_recognition_get_parameters() and pvl_face_recognition_set_parameters() respectively.
+ */
+struct pvl_face_recognition_parameters{
+    uint32_t max_faces_in_preview;  /**< The maximum number of recognizable faces in one frame.
+                                         The maximum allowable value is 'max_supported_faces_in_preview' in the structure 'pvl_face_recognition',
+                                         and the minimum allowable value is 1. The default value is set to maximum while the component created.
+                                         (i.e. 1 <= max_faces_inpreview <= max_supported_faces_in_preview) */
+};
+typedef struct pvl_face_recognition_parameters pvl_face_recognition_parameters;
+
+
+/** @brief A structure to hold the outcomes from this component.
+ */
+struct pvl_face_recognition_result{
+    pvl_face_recognition_facedata facedata;     /**< The extracted face data from the face. If recognition succeeded, a valid person-id will be allocated in the field 'person_id'. */
+    int32_t similarity;                         /**< The estimated similarity between the input face and the faces in the database. The biggest value will be assigned. */
+};
+typedef struct pvl_face_recognition_result pvl_face_recognition_result;
+
+
+/** @brief A structure to hold the run-time context of this component.
+ *
+ *  This structure represents the blink detection instance which is used as the handle over most of API.
+ *  It holds its own properties, constant parameters and internal context inside.
+ */
+struct pvl_face_recognition{
+    const pvl_version version;                      /**< The version information. */
+
+    const uint32_t max_supported_faces_in_preview;  /**< The maximum number of faces supported by this component. */
+    const uint32_t max_faces_in_database;           /**< The maximum number of faces that the database can hold in the current version. */
+    const uint32_t max_persons_in_database;         /**< The maximum number of persons that the database can hold in the current version. */
+    const uint32_t max_faces_per_person;            /**< The maximum number of faces per person in the current version. */
+    const uint32_t facedata_size;                   /**< The fixed size of the face data (in bytes) for the current version. */
+};
+typedef struct pvl_face_recognition pvl_face_recognition;
+
+
+/** @brief Get default configuration of this component.
+ *
+ *  This function returns default configuration of the face recognition component.
+ *  The returned configuration could be customized as per its usage.
+ *
+ *  @param[out] config  The structure to load default configuration.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ */
+PVLAPI pvl_err
+pvl_face_recognition_get_default_config(pvl_config *config);
+
+
+/** @brief Create an instance of the face recognition component.
+ *
+ *  This function initializes and returns an instance of this component.
+ *  Multiple instances are allowed to be created concurrently.
+ *
+ *  @param[in]  config  The configuration information of the component.
+ *  @param[out] fr      A pointer to indicate the handle newly created.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported configuration.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_nomem               Failed in allocating the memory.
+ */
+PVLAPI pvl_err
+pvl_face_recognition_create(const pvl_config *config, pvl_face_recognition **fr);
+
+
+/** @brief Destroy the instance of this component.
+ *
+ *  @param[in]  fr   The handle of this component to be destroyed.
+ */
+PVLAPI void
+pvl_face_recognition_destroy(pvl_face_recognition *fr);
+
+
+/** @brief Reset the instance of this component.
+ *
+ *  All the internal states, the internal database and context will be reset except the run-time parameters set by user.
+ *
+ *  @param[in]  fr  The handle of this component.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle or database.
+ *  @retval     pvl_err_nomem               Failed in re-allocating the memory.
+ */
+PVLAPI pvl_err
+pvl_face_recognition_reset(pvl_face_recognition *fr);
+
+
+/** @brief Set run-time parameters of this component.
+ *
+ *  Set given parameters to the handle.
+ *  It is required to get proper parameters instance by pvl_face_recognition_get_parameters() before setting something.
+ *
+ *  @param[in]  fr      The handle of this component.
+ *  @param[in]  params  The parameters to be set.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed in re-allocating the memory for parameter changes.
+ */
+PVLAPI pvl_err
+pvl_face_recognition_set_parameters(pvl_face_recognition *fr, const pvl_face_recognition_parameters *params);
+
+
+/** @brief Get current run-time parameters of this component.
+ *
+ *  @param[in]  fr      The handle of this component.
+ *  @param[out] params  The buffer which will hold parameters. Memory needs to be managed by caller.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ */
+PVLAPI pvl_err
+pvl_face_recognition_get_parameters(pvl_face_recognition *fr, pvl_face_recognition_parameters *params);
+
+
+/** @brief The main function that run the face recognition for the faces in image.
+ *
+ *  This function conducts the face recognition by trying to match query faces (input faces) against the faces in the internal database.
+ *  The internal database should be populated in advance, via pvl_face_recognition_register_facedata().
+ *  If the recognition succeeded, person_id field at corresponding index of the result will be filled with valid (+) person_id.
+ *  Otherwise, person_id will be @ref FACE_RECOGNIZER_UNKNOWN_PERSON_ID.
+ *  Since the face recognition result could be the false-alarm (i.e. incorrect recognition.),
+ *  the positive person_id does not guarantee that the recognition result is correct.
+ *  @deprecated This function is deprecated, consider using pvl_face_recognition_run_in_image_with_rect instead.
+ *
+ *  @param[in]  fr          The handle of the face recognition component.
+ *  @param[in]  image       The input image that contains the query faces (input faces). All image formats are supported.
+ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
+ *  @param[in]  num_faces   The number of query faces (input faces) to recognize.
+ *  @param[in]  left_eyes   The array of the center points on the left eyes of faces to be recognized.
+ *  @param[in]  right_eyes  The array of the center points on the right eyes of faces to be recognized.
+ *  @param[out] results     The array of the result buffer.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or negative num_faces.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed in allocating the internal memory buffers.
+ */
+DEPRECATED_PVLAPI pvl_err
+pvl_face_recognition_run_in_image(pvl_face_recognition *fr, const pvl_image *image, int32_t num_faces,
+                                  const pvl_point *left_eyes, const pvl_point *right_eyes,
+                                  pvl_face_recognition_result *results);
+
+
+/** @brief Run the face recognition component for the faces in image assuming the image is a part of series of preview frames.
+ *
+ *  This function is basically the same as pvl_face_recognition_run_in_image(), but assuming that the input image is the part of the sequence of preview or video frames.
+ *  Utilizing results from previous frames, this function shows faster and more reliable recognition results.
+ *  @deprecated This function is deprecated, consider using pvl_face_recognition_run_in_preview_with_rect instead.
+ *
+ *  @param[in]  fr              The handle of the face recognition component.
+ *  @param[in]  image           The input image that contains the query faces (input faces). All image formats are supported.
+ *                              pvl_image_format_gray, pvl_image_format_nv12, pvl_iamge_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
+ *  @param[in]  num_faces       The number of query faces (input faces) to recognize.
+ *  @param[in]  left_eyes       The array of the center points on the left eyes of faces to be recognized.
+ *  @param[in]  right_eyes      The array of the center points on the right eyes of faces to be recognized.
+ *  @param[in]  tracking_ids    Tracking-ids returned from face detector. Using pvl_face_recognition_run_in_image() is recommended if tracking-id is not available.
+ *  @param[out] results         The array of the result buffer.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or negative num_faces.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed in allocating the internal memory buffers.
+ */
+DEPRECATED_PVLAPI pvl_err
+pvl_face_recognition_run_in_preview(pvl_face_recognition *fr, const pvl_image *image, int32_t num_faces,
+                                    const pvl_point *left_eyes, const pvl_point *right_eyes, const int32_t *tracking_ids,
+                                    pvl_face_recognition_result *results);
+
+/** @brief The main function that run the face recognition for the faces in image.
+ *
+ *  This function conducts the face recognition by trying to match query faces (input faces) against the faces in the internal database.
+ *  The internal database should be populated in advance, via pvl_face_recognition_register_facedata().
+ *  If the recognition succeeded, person_ids at corresponding index will be filled with valid (+) person_id.
+ *  Otherwise, person_id will be @ref FACE_RECOGNIZER_UNKNOWN_PERSON_ID.
+ *  Since the face recognition result could be the false-alarm (i.e. incorrect recognition.),
+ *  the positive person_id does not guarantee that the recognition result is correct.
+ *  This function need face rectangle and face angle instead of eye position.
+ *
+ *  @param[in]  fr          The handle of the face recognition component.
+ *  @param[in]  image       The input image that contains the query faces (input faces). All image formats are supported.
+ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
+ *  @param[in]  num_faces   The number of query faces (input faces) to recognize.
+ *  @param[in]  face_rect   The array of the rectangle of detected faces to be recognized.
+ *  @param[in]  face_angle  The array of RIP (Rotation in Plane) value of the faces in degree.
+ *  @param[out] results     The array of the result buffer.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or negative num_faces.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed in allocating the internal memory buffers.
+ */
+PVLAPI pvl_err
+pvl_face_recognition_run_in_image_with_rect(pvl_face_recognition *fr, const pvl_image *image, int32_t num_faces,
+                                            const pvl_rect* face_rect, const int32_t* face_angle, pvl_face_recognition_result *results);
+
+
+/** @brief Run the face recognition component for the faces in image assuming the image is a part of series of preview frames.
+ *
+ *  This function is basically the same as pvl_face_recognition_run_in_image_with_rect(), but assuming that the input image is the part of the sequence of preview or video frames.
+ *  Utilizing results from previous frames, this function shows faster and more reliable recognition results.
+ *  This function need face rectangle and face angle instead of eye position.
+ *
+ *  @param[in]  fr              The handle of the face recognition component.
+ *  @param[in]  image           The input image that contains the query faces (input faces). All image formats are supported.
+ *                              pvl_image_format_gray, pvl_image_format_nv12, pvl_iamge_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
+ *  @param[in]  num_faces       The number of query faces (input faces) to recognize.
+ *  @param[in]  face_rect       The array of the rectangle of detected faces to be recognized.
+ *  @param[in]  face_angle      The array of RIP (Rotation in Plane) value of the faces in degree.
+ *  @param[in]  tracking_ids    Tracking-ids returned from face detector. Using pvl_face_recognition_run_in_image() is recommended if tracking-id is not available.
+ *  @param[out] results         The array of the result buffer.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or negative num_faces.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed in allocating the internal memory buffers.
+ */
+PVLAPI pvl_err
+pvl_face_recognition_run_in_preview_with_rect(pvl_face_recognition *fr, const pvl_image *image, int32_t num_faces,
+                                              const pvl_rect* face_rect, const int32_t* face_angle, const int32_t *tracking_ids, pvl_face_recognition_result *results);
+
+
+/** @brief Register one face data to the internal database of the component.
+ *
+ *  This function registers the given face data into the internal database.
+ *  It is common practice for the user to read face data from the external database (e.g. SQLite, MySQL, file system, etc.) and register each face data to the internal database.
+ *  Before using pvl_face_recognition_run_in_image() or pvl_face_recognition_run_in_preview(),
+ *  the user should call this function to register faces to the database.
+ *
+ *  @param[in]  fr          The handle of the face recognition component.
+ *  @param[in]  facedata    A face data instance to be registered.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the fr parameter, or wrong facedata.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed in allocating the memory of the internal buffers or the database.
+ *  @retval     pvl_err_database_full       Not enough memory left to insert new data.
+ */
+PVLAPI pvl_err
+pvl_face_recognition_register_facedata(pvl_face_recognition *fr, const pvl_face_recognition_facedata *facedata);
+
+
+/** @brief Unregister the face from the internal database.
+ *
+ *  This function deletes the face data from internal database.
+ *
+ *  @param[in]  fr          The handle of the face recognition component.
+ *  @param[in]  face_id     Face id to be unregistered.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the fr parameter, or negative value to the face_id.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed in allocating the memory of the internal buffers or the database.
+ *  @retval     pvl_err_no_such_item        Face data not found from the database that matches the given face_id.
+ */
+PVLAPI pvl_err
+pvl_face_recognition_unregister_facedata(pvl_face_recognition *fr, uint64_t face_id);
+
+
+/** @brief Unregister all faces associated with the person_id.
+ *
+ *  This function is used to remove all registered faces of specified person.
+ *
+ *  @param[in]  fr          The handle of the face recognition component.
+ *  @param[in]  person_id   Person id to be unregistered.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_no_such_item        Face data not found from the database that matches the given person_id.
+ */
+PVLAPI pvl_err
+pvl_face_recognition_unregister_person(pvl_face_recognition *fr, int32_t person_id);
+
+
+/** @brief Update person_id of specified face data.
+ *
+ *  This function is used to modify person id of specific face data. Usually used to assign a person id to unknown face or incorrectly recognized face.
+ *
+ *  @param[in]  fr              The handle of the face recognition component.
+ *  @param[in]  face_id         Face id to modify.
+ *  @param[in]  new_person_id   Person id to update with.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the fr parameter, or negative value to the face_id/new_person_id.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_database_full       Not enough memory left to insert new data.
+ *  @retval     pvl_err_no_such_item        Face data not found from the database that matches the given face_id.
+ */
+PVLAPI pvl_err
+pvl_face_recognition_update_person(pvl_face_recognition *fr, uint64_t face_id, int32_t new_person_id);
+
+
+/** @brief Get number of faces in the internal database.
+ *
+ *  This function returns the number of faces registered in the internal database.
+ *
+ *  @param[in]  fr          The handle of the face recognition component.
+ *
+ *  @return     On success, returns number of faces (non-negative value.)
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ */
+PVLAPI int32_t
+pvl_face_recognition_get_num_faces_in_database(pvl_face_recognition *fr);
+
+
+/** @brief Get number of persons in the internal database.
+ *
+ *  This function returns the number of persons registered in the internal database.
+ *
+ *  @param[in]  fr          The handle of the face recognition component.
+ *
+ *  @return     On success, returns number of persons (non-negative value.)
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ */
+PVLAPI int32_t
+pvl_face_recognition_get_num_persons_in_database(pvl_face_recognition *fr);
+
+
+/** @brief Get number of faces of a specific person_id in the internal database.
+ *
+ *  This function returns the number of faces of a specific person_id registered in the internal database.
+ *
+ *  @param[in]  fr          The handle of the face recognition component.
+ *  @param[in]  person_id   Person id to retrieve number of faces.
+ *
+ *  @return     On success, returns number of faces (non-negative value.)
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ */
+PVLAPI int32_t
+pvl_face_recognition_get_num_faces_of_person_in_database(pvl_face_recognition *fr, int32_t person_id);
+
+
+/** @brief Allocate the memory of result buffers.
+ *
+ *  This function is used to allocate memory for the result buffers which contain the array of face feature data.
+ *  The memory for result buffers should be allocated in the form of the array of 'pvl_face_recognition_result' before
+ *   the functions which conduct face recognition are called.
+ *  This function conducts the memory allocation for the output buffers.
+ *
+ *  @param[in]  fr            The handle of the face recognition component.
+ *  @param[in]  max_faces     The maximum number of recognizable faces, which is used for allocating results buffer.
+ *  @param[out] fr_results    The initialized array of the result buffer.
+ *
+ *  @return     On success,   @ref pvl_success.
+ *  @return     On failure,   @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the fr or fr_results parameter, or negative value to the max_faces.
+ *  @retval     pvl_err_out_of_bound        Parameters or condition for the allocation is not acceptable.
+ *  @retval     pvl_err_nomem               Failed in allocating the memory of the internal buffers or the database.
+ */
+PVLAPI pvl_err
+pvl_face_recognition_create_result_buffer(pvl_face_recognition *fr, int max_faces, pvl_face_recognition_result **fr_results);
+
+
+/** @brief Destroy the memory buffer.
+ *
+ * This function releases internal allocated buffers and destroys the data.
+ *
+ *  @param[in]  fr_results   The handle of the result buffer to be destroyed.
+ *
+ */
+PVLAPI void
+pvl_face_recognition_destroy_result_buffer(pvl_face_recognition_result *fr_results);
+
+
+#ifdef __cplusplus
+}
+#endif // __cplusplus
+
+/** @example face_recognition_sample.cpp
+ *  Sample of Face Recognition
+ */
+
+#endif /* __PVL_FACE_RECOGNITION_H__ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_image_montage.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_image_montage.h
new file mode 100644
index 000000000000..115690861e14
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_image_montage.h
@@ -0,0 +1,229 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __PVL_IMAGE_MONTAGE_H__
+#define __PVL_IMAGE_MONTAGE_H__
+
+/** @file    pvl_image_montage.h
+ *  @brief   This file declares the structures and native APIs of image montage component.
+ */
+
+#include "pvl_types.h"
+#include "pvl_config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/** @brief A structure to hold run-time configurable parameters for this component.
+ *
+ *  The variables in this structure will be retrieved and assigned, via pvl_image_montage_get_parameters() and pvl_image_montage_set_parameters() respectively.
+ */
+struct pvl_image_montage_parameters
+{
+    int search_region_margin_percentage;    /**< The percentage of the region to be searched to the entire sub image (default: 20). */
+};
+typedef struct pvl_image_montage_parameters pvl_image_montage_parameters;
+
+
+/** @brief A structure to hold the run-time context of this component.
+ *
+ *  This structure represents the image montage instance which is used as the handle over most of API.
+ *  It holds its own properties, constant parameters and internal context inside.
+ */
+struct pvl_image_montage
+{
+    const pvl_version version;              /**< The version information. */
+
+    const int default_search_region_margin; /**< The default percentage of the region to be search to the entire sub image (recommended to use) */
+};
+typedef struct pvl_image_montage pvl_image_montage;
+
+
+/** @brief Get default configuration of this component.
+ *
+ *  This function returns default configuration of the image montage component.
+ *  The returned configuration could be customized as per its usage.
+ *
+ *  @param[out] config  The structure to load default configuration.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ */
+PVLAPI pvl_err
+pvl_image_montage_get_default_config(pvl_config *config);
+
+
+/** @brief Create an instance of the image montage component.
+ *
+ *  This function initializes and returns an instance of this component.
+ *  Multiple instances are allowed to be created concurrently.
+ *
+ *  @param[in]  config  The configuration information of the component.
+ *  @param[out] im      A pointer to indicate the handle newly created.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported configuration.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
+ */
+PVLAPI pvl_err
+pvl_image_montage_create(const pvl_config *config, pvl_image_montage **im);
+
+
+/** @brief Destroy the instance of this component.
+ *
+ *  @param[in]  im   The handle of this component to be destroyed.
+ */
+PVLAPI void
+pvl_image_montage_destroy(pvl_image_montage *im);
+
+
+/** @brief Reset the instance of this component.
+ *
+ *  All the internal states and context will be reset except the run-time parameters set by user.
+ *
+ *  @param[in]  im  The handle of this component.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to re-allocate the memory.
+ */
+PVLAPI pvl_err
+pvl_image_montage_reset(pvl_image_montage *im);
+
+
+/** @brief Set run-time parameters of this component.
+ *
+ *  Set given parameters to the handle.
+ *  It is required to get proper parameters instance by pvl_image_montage_get_parameters() before setting something.
+
+ *  @param[in]  im      The handle of this component.
+ *  @param[in]  params  The parameters to be set.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to re-allocate the memory for parameter changes.
+ */
+PVLAPI pvl_err
+pvl_image_montage_set_parameters(pvl_image_montage *im, const pvl_image_montage_parameters *params);
+
+
+/** @brief Get current run-time parameters of this component.
+ *
+ *  Get the parameters from the handle.
+ *  This function should be called before calling pvl_image_montage_set_parameters().
+ *
+ *  @param[in]  im      The handle of this component.
+ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ */
+PVLAPI pvl_err
+pvl_image_montage_get_parameters(pvl_image_montage *im, pvl_image_montage_parameters *params);
+
+
+/** @brief Set the main image.
+ *
+ *  This functions stores information about the main image.
+ *  The main image is labelled as the "background" of image montage.
+ *  Input image data and an array of the objects coordinates which have been stored into internal
+ *  memory by this function could be used when the function pvl_image_montage_run() runs.
+ *
+ *  @param[in]  im           The handle of the image montage component.
+ *  @param[in]  main_img     The main image. Currently, only pvl_image_format_rgba32 is supported.
+ *  @param[in]  objects      The coordinates of the objects.
+ *  @param[in]  num_objects  The number of objects.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null instance of im.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ */
+PVLAPI pvl_err
+pvl_image_montage_set_main_image(pvl_image_montage *im, const pvl_image *main_img, pvl_rect *objects, int num_objects);
+
+
+/** @brief Set the sub image where the object patches come from.
+ *
+ *  This functions stores information about the sub image.
+ *  The sub image contains the target objects which would be fetched in composing function.
+ *  Input image data and an array of the objects coordinates which have been stored by this
+ *  function could be used when the function pvl_image_montage_run() runs.
+ *
+ *  @param[in]  im           The handle of the image montage component.
+ *  @param[in]  sub_img      The sub image. Currently, only pvl_image_format_rgba32 is supported.
+ *  @param[in]  objects      The coordinates of the objects.
+ *  @param[in]  num_objects  The number of objects.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null instance of im.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ */
+PVLAPI pvl_err
+pvl_image_montage_set_sub_image(pvl_image_montage *im, const pvl_image *sub_img, pvl_rect *objects, int num_objects);
+
+
+/** @brief Compose the montage on the main image, cropping the patch from the sub image.
+ *
+ *  This function is to combine two images(main,sub), cropping an object image patch which is placed on the N-th coordinate
+ *  of object array in the sub image, overlaying the patch onto the N-th coordinate of objects array in the main image.
+ *
+ *  @param[in]  im           The handle of the image montage component.
+ *  @param[in]  idx_on_main  The index of the object on the main image.
+ *  @param[in]  idx_on_sub   The index of the object on the sub image.
+ *  @param[out] result       The composed image. Must allocate memory big enough as the main image size to data field of 'result' before this function is called.
+ *                           The image format should be same as the formats of main/sub images, which is currently pvl_image_format_rgba32 only.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null instance of im.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ */
+PVLAPI pvl_err
+pvl_image_montage_run(pvl_image_montage *im, int idx_on_main, int idx_on_sub, pvl_image *result);
+
+
+#ifdef __cplusplus
+}
+#endif // __cplusplus
+
+/** @example image_montage_sample.c
+ *  Sample of Image Montage
+ */
+
+#endif /* __PVL_IMAGE_MONTAGE_H__ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_landmark_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_landmark_detection.h
new file mode 100644
index 000000000000..dea500b6726a
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_landmark_detection.h
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __PVL_LANDMARK_DETECTION_H__
+#define __PVL_LANDMARK_DETECTION_H__
+
+/** @file    pvl_landmark_detection.h
+ *  @brief   This file declares the structures and native APIs of facial landmark detection component.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "pvl_types.h"
+#include "pvl_config.h"
+
+/** @brief The enumerated values to specify the facial landmark shape points.
+*/
+enum pvl_facial_landmark_shape_point_num {
+    pvl_facial_landmark_shape27 = 27,           /**< 27 point */
+    pvl_facial_landmark_shape50 = 50,           /**< 50 point */
+    pvl_facial_landmark_shape78 = 78,           /**< 78 point */
+};
+typedef enum pvl_facial_landmark_shape_point_num pvl_facial_landmark_shape_point_num;
+
+/** @brief A structure to hold the outcomes from this component.
+ */
+struct pvl_facial_landmark_detection_result
+{
+    float points[pvl_facial_landmark_shape78 * 2];
+};
+typedef struct pvl_facial_landmark_detection_result pvl_facial_landmark_detection_result;
+
+
+/** @brief A structure to hold the run-time context of this component.
+ *
+ *  This structure represents the facial landmark detection instance which is used as the handle over most of API.
+ *  It holds its own properties, constant parameters and internal context inside.
+ */
+struct pvl_facial_landmark_detection
+{
+    const pvl_version version;              /**< The version information. */
+    pvl_facial_landmark_shape_point_num shape_point_num;
+};
+typedef struct pvl_facial_landmark_detection pvl_facial_landmark_detection_context;
+
+
+/** @brief Get default configuration of this component.
+ *
+ *  This function returns default configuration of the facial landmark detection component.
+ *  The returned configuration could be customized as per its usage.
+ *
+ *  @param[out] config  The structure to load default configuration.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ */
+PVLAPI pvl_err
+pvl_facial_landmark_detection_get_default_config(pvl_config* config);
+
+
+/** @brief Create an instance of the facial landmark detection component.
+ *
+ *  This function initializes and returns an instance of this component.
+ *  Multiple instances are allowed to be created concurrently.
+ *
+ *  @param[in]  config  The configuration information of the component.
+ *  @param[out] ed      A pointer to indicate the handle newly created.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported configuration.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
+ */
+PVLAPI pvl_err
+pvl_facial_landmark_detection_create(const pvl_config* config, pvl_facial_landmark_detection_context** fld, const pvl_facial_landmark_shape_point_num point_num = pvl_facial_landmark_shape78);
+
+
+/** @brief Destroy the instance of this component.
+ *
+ *  @param[in]  ed   The handle of this component to be destroyed.
+ */
+PVLAPI void
+pvl_facial_landmark_detection_destroy(pvl_facial_landmark_detection_context* fld);
+
+/** @brief Detect facial landmark positions from one of face in the image.
+ *
+ *  This function will do the facial landmark detection in the given face in the image.
+ *  The function caller is responsible for allocation of the buffer for result.
+ *
+ *  @param[in]  fld             The handle of the facial landmark detection component.
+ *  @param[in]  image           The input image for detecting the positions of facial landmark detection. All image formats are supported.
+ *                              pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
+ *  @param[in]  face_regions    The struct of rectangular region of the face.
+ *  @param[in]  rip_angles      The value of RIP (Rotation in Plane) of the face in degree.
+ *  @param[out] result          The result buffer.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
+ */
+
+PVLAPI pvl_err pvl_facial_landmark_detection_run(pvl_facial_landmark_detection_context* fld,
+    const pvl_image* image, pvl_rect face_region, int32_t rip_angle,
+    pvl_facial_landmark_detection_result* result);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // __PVL_LANDMARK_DETECTION_H__
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_mouth_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_mouth_detection.h
new file mode 100644
index 000000000000..d07c5a28f480
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_mouth_detection.h
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __PVL_MOUTH_DETECTION_H__
+#define __PVL_MOUTH_DETECTION_H__
+
+/** @file    pvl_mouth_detection.h
+ *  @brief   This file declares the structures and native APIs of mouth detection component.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "pvl_types.h"
+#include "pvl_config.h"
+
+
+/** @brief A structure to hold the outcomes from this component.
+ */
+struct pvl_mouth_detection_result
+{
+    pvl_point mouth;
+    int32_t confidence;
+};
+typedef struct pvl_mouth_detection_result pvl_mouth_detection_result;
+
+
+/** @brief A structure to hold the run-time context of this component.
+ *
+ *  This structure represents the mouth detection instance which is used as the handle over most of API.
+ *  It holds its own properties, constant parameters and internal context inside.
+ */
+struct pvl_mouth_detection
+{
+    const pvl_version version;              /**< The version information. */
+
+    const float max_face_width_ratio;       /**< The maximum supported ratio of the width of the face to the mouth distance,
+                                                 s.t. max_face_with_ratio = (the width of the face)/(the distance between two mouths).
+                                                 The mouth detection accuracy will be dropped if the estimated face region (as the parameter of pvl_mouth_detection_run) is too large compared to the actual face size. */
+    const float max_rip_error_tolerance;    /**< The maximum supported value (in degree) of the difference between the actual RIP degree and the input RIP degree.
+                                                 The mouth detection accuracy will be dropped if the actual RIP degree is greater than (input RIP angle)±(max_rip_error_tolerance). */
+};
+typedef struct pvl_mouth_detection pvl_mouth_detection;
+
+
+/** @brief Get default configuration of this component.
+ *
+ *  This function returns default configuration of the mouth detection component.
+ *  The returned configuration could be customized as per its usage.
+ *
+ *  @param[out] config  The structure to load default configuration.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ */
+PVLAPI pvl_err
+pvl_mouth_detection_get_default_config(pvl_config *config);
+
+
+/** @brief Create an instance of the mouth detection component.
+ *
+ *  This function initializes and returns an instance of this component.
+ *  Multiple instances are allowed to be created concurrently.
+ *
+ *  @param[in]  config  The configuration information of the component.
+ *  @param[out] md      A pointer to indicate the handle newly created.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported configuration.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
+ */
+PVLAPI pvl_err
+pvl_mouth_detection_create(const pvl_config *config, pvl_mouth_detection **md);
+
+
+/** @brief Destroy the instance of this component.
+ *
+ *  @param[in]  md   The handle of this component to be destroyed.
+ */
+PVLAPI void
+pvl_mouth_detection_destroy(pvl_mouth_detection *md);
+
+
+/** @brief Reset the instance of this component.
+ *
+ *  All the internal states and context will be reset except the run-time parameters set by user.
+ *
+ *  @param[in]  md  The handle of this component.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
+ */
+PVLAPI pvl_err
+pvl_mouth_detection_reset(pvl_mouth_detection *md);
+
+
+/** @brief Detect left and right mouth positions from a region of faces in the image.
+ *
+ *  This function will do the mouth detection in the given a region of faces in the image.
+ *  The function caller is responsible for allocation of the buffer for result.
+ *
+ *  @param[in]  md          The handle of the mouth detection component.
+ *  @param[in]  image       The input image for detecting the positions of mouths. All image formats are supported.
+ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
+ *  @param[in]  face_region The struct of rectangular regions of faces.
+ *  @param[in]  rip_angle   The value of RIP (Rotation in Plane) of the faces in degree.
+ *  @param[out] result      The result buffer.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
+ */
+PVLAPI pvl_err
+pvl_mouth_detection_run(pvl_mouth_detection *md, const pvl_image *image, const pvl_rect *face_region, int32_t rip_angle, pvl_mouth_detection_result *result);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @example face_detection_sample.cpp
+ *  Sample of Mouth Detection
+ */
+
+#endif // __PVL_MOUTH_DETECTION_H__
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_object_tracking.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_object_tracking.h
new file mode 100644
index 000000000000..4de86bddaaf0
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_object_tracking.h
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __PVL_OBJECT_TRACKING_H__
+#define __PVL_OBJECT_TRACKING_H__
+
+/** @file    pvl_object_tracking.h
+ *  @brief   This file declares the structure and native APIs of object tracking component.
+ */
+
+#include "pvl_types.h"
+#include "pvl_config.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @brief A structure to hold run-time configurable parameters for this component.
+ *  The variables in this structure will be retrieved and asigned, via pvl_object_tracking_get_parameters() and pvl_object_tracking_set_parameters() respectively,
+ */
+struct pvl_object_tracking_parameters
+{
+    int32_t num_concurrent_tracking;                      /**< the number of maximum tracking context inside the handle */
+    int32_t tracking_type;                                /**< the options about how the tracking started. Reserved for future usage. */
+};
+
+typedef struct pvl_object_tracking_parameters pvl_object_tracking_parameters;
+
+/** @brief A structure to hold the outcomes from this component.
+ */
+struct pvl_object_tracking_result
+{
+    pvl_bool is_tracking_succeed;        /**< The tracking state of the object. */
+    int32_t tracking_id;                 /**< The ID for a certain object starting at 1. This is unique among the sessions until the handle is destroyed. */
+    int32_t score;                       /**< The tracking score of the object in the range of 0 to 100, where 0 means it doesn't like the object at all, and 100 means quite sure of that object. */
+    pvl_rect tracked_region;             /**< The tracking area */
+};
+
+typedef struct pvl_object_tracking_result pvl_object_tracking_result;
+
+/** @brief A structure to hold the run-time context of this component.
+ *
+ *  This structure represents the object tracking instance which is used as the handle over most of API.
+ *  It holds its own properties, constant parameters and internal context inside.
+ */
+struct pvl_object_tracking
+{
+    const pvl_version version;                /**< The version information. */
+
+    const int32_t max_supported_num_object;   /**< The maximum number of objects supported by this component. */
+};
+
+typedef struct pvl_object_tracking pvl_object_tracking;
+
+
+/** @brief Get default configuration of this component.
+ *
+ *  This function returns default configuration of the face detection component.
+ *  The returned configuration could be customized as per its usage.
+ *
+ *  @param[out] config  The structure to load default configuration.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ */
+PVLAPI pvl_err
+pvl_object_tracking_get_default_config(pvl_config* config);
+
+
+/** @brief Create an instance of the object tracking component.
+ *
+ *  This function initializes and returns an instance of this component.
+ *  Multiple instances are allowed to be created concurrently.
+ *
+ *  @param[in]  config      The configuration information of the component.
+ *  @param[out] ot          A pointer to indicate the handle newly created.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported configuration.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
+ */
+PVLAPI pvl_err
+pvl_object_tracking_create(const pvl_config* config, pvl_object_tracking **ot);
+
+
+/** @brief Destroy the instance of this component.
+ *
+ *  @param[in]  ot  The handle of this component to be destroyed.
+ */
+PVLAPI void
+pvl_object_tracking_destroy(pvl_object_tracking *ot);
+
+
+/** @brief Reset the instance of this component.
+ *
+ *  All the internal states including object tracking information and context will be reset except the run-time parameters set by user.
+ *
+ *  @param[in]  ot  The handle of this component.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ */
+PVLAPI pvl_err
+pvl_object_tracking_reset(pvl_object_tracking *ot);
+
+
+/** @brief Set run-time parameters of this component.
+ *
+ *  Set given parameters to the handle.
+ *  It is required to get proper parameters instance by pvl_face_detection_get_parameters() before setting something.
+ *
+ *  @param[in]  ot      The handle of this component.
+ *  @param[in]  params  The parameters to be set.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
+ */
+PVLAPI pvl_err
+pvl_object_tracking_set_parameters(pvl_object_tracking *ot, const pvl_object_tracking_parameters *params);
+
+
+/** @brief Get current run-time parameters of this component.
+ *
+ *  Get the parameters from the handle.
+ *  This function should be called before calling pvl_face_detection_set_parameters().
+ *
+ *  @param[in]  ot      The handle of this component.
+ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ */
+PVLAPI pvl_err
+pvl_object_tracking_get_parameters(pvl_object_tracking *ot, pvl_object_tracking_parameters *params);
+
+
+/** @brief Specify the start ROI for a new tracking session.
+ *
+ *  This function will initialize the object tracking in the input image.
+ *  The tracking context will be created and kept in the handle, which is supposed to be used at next OT processing.
+ *
+ *  Caller is responsible for allocating the the buffer for the result.
+ *
+ *  @param[in]  ot          The handle of this component.
+ *  @param[in]  image       The input image. Currently, only pvl_image_format_nv12 is supported.
+ *  @param[in]  the_object  The ROI of the object to track.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null instance of ot or image or the object.
+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
+ *  @retval     pvl_err_out_of_bound        Current number of tracking object is already full.
+ */
+PVLAPI pvl_err
+pvl_object_tracking_add_object(pvl_object_tracking *ot, const pvl_image *image, const pvl_rect *the_object);
+
+
+/** @brief Remove specified object from object tracking.
+ *
+ *  This function will stop tracking the object which have same tracking id with the input parameter.
+ *  The tracking context will be removed in the handle.
+ *
+ *  Caller is responsible for allocating the pvl_rect.
+ *
+ *  @param[in]  ot          The handle of this component.
+ *  @param[in]  tracking_id Tracking id of the object which will be removed.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null instance of ot or non-positive tracking_id.
+ *  @retval     pvl_err_no_such_item        Failed to find tracking object having tracking_id.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ */
+PVLAPI pvl_err
+pvl_object_tracking_remove_object(pvl_object_tracking *ot, const int32_t tracking_id);
+
+
+/** @brief Main function to run object tracking on all of the object in the input image as a part of preview or video frames.
+ *
+ *  This function will run object tracking on the input image with the tracking context held inside the OT handle.
+ *  As this is a tracking component, there's an assumption this frame has temporal correlation with previous and next input images.
+ *  The tracking result will be stored up to max_result, no matter how many contexts are inside handle.
+ *
+ *  Caller is responsible for allocating the buffer for result.
+ *
+ *  @param[in]  ot             The handle of this component.
+ *  @param[in]  image          The input image. Currently, only pvl_image_format_n12 is supported.
+ *  @param[out] result         Buffer to write the result back. Must have enough memory to hold the result.
+ *  @param[in]  max_result     The number of results that the buffers can hold.
+ *
+ *  @return     On success, the number of current tracking objects.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null instance of ot or result, or non-positive max_result.
+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ */
+PVLAPI int32_t
+pvl_object_tracking_run(pvl_object_tracking *ot, const pvl_image *image, pvl_object_tracking_result *result, int32_t max_result);
+
+#ifdef __cplusplus
+}
+#endif // __cplusplus
+
+/** @example object_tracking_sample.cpp
+*  Sample of Object Tracking
+*/
+
+#endif /* __PVL_OBJECT_TRACKING_H__ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_panorama.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_panorama.h
new file mode 100644
index 000000000000..9cf7d703da13
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_panorama.h
@@ -0,0 +1,262 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __PVL_PANORAMA_H__
+#define __PVL_PANORAMA_H__
+
+/** @file    pvl_panorama.h
+ *  @brief   This file declares the structures and native APIs of panorama component.
+ */
+
+#include "pvl_types.h"
+#include "pvl_config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/** @brief The enumerated values to specify the 1D panning direction of panoramic stitch.
+ */
+enum pvl_panorama_direction {
+    pvl_panorama_direction_still,           /**< No direction - still */
+    pvl_panorama_direction_right,           /**< Left to right panning */
+    pvl_panorama_direction_left,            /**< Right to left panning */
+    pvl_panorama_direction_down,            /**< Downward panning */
+    pvl_panorama_direction_up,              /**< Upward panning */
+    pvl_panorama_direction_preview_auto     /**< The direction of panning is automatically detected in preview mode. */
+};
+typedef enum pvl_panorama_direction pvl_panorama_direction;
+
+
+/** @brief A structure to hold run-time configurable parameters for this component.
+ *
+ *  The variables in this structure will be retrieved and assigned, via pvl_panorama_get_parameters() and pvl_panorama_set_parameters() respectively.
+ */
+struct pvl_panorama_parameters {
+    uint32_t overlapping_ratio;         /**< The expected overlapping ratio between adjacent input images (in percent).
+                                             Smaller value results in larger FoV and also larger output image and vice versa.
+                                             In addition, however, larger value tends to result in more accurate alignments.
+                                             The min/max and default values are defined in pvl_panorama structure in runtime. */
+
+    pvl_panorama_direction direction;   /**< The assumed panning direction of input images. If pvl_panorama_direction_preview_auto is set
+                                             the direction would be automatically estimated while processing preview.(See pvl_parnorama_detect_frame_to_stitch()
+                                             Otherwise, the direction is assumed to be explicitly specified. */
+};
+typedef struct pvl_panorama_parameters pvl_panorama_parameters;
+
+
+/** @brief A structure to hold the run-time context of this component.
+ *
+ *  This structure represents the panorama instance which is used as the handle over most of API.
+ *  It holds its own properties, constant parameters and internal context inside.
+ */
+struct pvl_panorama {
+    const pvl_version version;                  /**< The version information. */
+
+    const uint32_t max_supported_num_images;    /**< The maximum number of input images supported by this component. */
+
+    const uint32_t min_overlapping_ratio;       /**< The minimum configurable value of overlapping ratio (in percent) */
+    const uint32_t max_overlapping_ratio;       /**< The maximum configurable value of overlapping ratio. (in percent) */
+    const uint32_t default_overlapping_ratio;   /**< The default value of overlapping ratio. (in percent) */
+};
+typedef struct pvl_panorama pvl_panorama;
+
+
+/** @brief Get default configuration of this component.
+ *
+ *  This function returns default configuration of the panorama component.
+ *  The returned configuration could be customized as per its usage.
+ *
+ *  @param[out] config  The structure to load default configuration.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ */
+PVLAPI pvl_err
+pvl_panorama_get_default_config(pvl_config *config);
+
+
+/** @brief Create an instance of the panorama component.
+ *
+ *  This function initializes and returns an instance of this component.
+ *  Multiple instances are allowed to be created concurrently.
+ *
+ *  @param[in]  config  The configuration information of the component.
+ *  @param[out] pano    A pointer to indicate the handle newly created.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported configuration or fail to load MDF program.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
+ */
+PVLAPI pvl_err
+pvl_panorama_create(const pvl_config *config, pvl_panorama **pano);
+
+
+/** @brief Destroy the instance of this component.
+ *
+ *  @param[in]  pano The handle of this component to be destroyed.
+ */
+PVLAPI void
+pvl_panorama_destroy(pvl_panorama *pano);
+
+
+/** @brief Reset the instance of this component.
+ *
+ *  All the internal states, the stitched images, the composed output image and context will be reset except the run-time parameters set by user.
+ *  If there are any ongoing processes(maybe on another thread) it cancels them or waits until done.
+ *
+ *  @param[in]  pano    The handle of this component.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to re-allocate the memory.
+ */
+PVLAPI pvl_err
+pvl_panorama_reset(pvl_panorama *pano);
+
+
+/** @brief Set run-time parameters of this component.
+ *
+ *  Set given parameters to the handle.
+ *  It is required to get proper parameters instance by pvl_panorama_get_parameters() before setting something.
+ *
+ *  @param[in]  pano    The handle of this component.
+ *  @param[in]  params  The parameters to be set.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to re-allocate the memory for parameter changes.
+ */
+PVLAPI pvl_err
+pvl_panorama_set_parameters(pvl_panorama *pano, const pvl_panorama_parameters *params);
+
+
+/** @brief Get current run-time parameters of this component.
+ *
+ *  Get the parameters from the handle.
+ *  This function should be called before calling pvl_panorama_set_parameters().
+ *
+ *  @param[in]  pano    The handle of this component.
+ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ */
+PVLAPI pvl_err
+pvl_panorama_get_parameters(const pvl_panorama *pano, pvl_panorama_parameters *params);
+
+
+/** @brief Detect preview frames to capture.
+ *
+ *  This function will detect preview frames that matches well with the imaginary frame the component is expecting.
+ *  The overlapping_ratio parameter affects the offset of expecting scene projected from the last stitched image.
+ *  This function should be called after the first image is stitched.
+ *
+ *  In normal scenario this function returns...
+ *  @verbatim
+    0 0 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 4 ...
+              |                 |           |                     |
+              2nd image         3rd image   4th image             5th image ... @endverbatim
+ *
+ *  @param[in]  pano            The handle of the panorama component.
+ *  @param[in]  preview_frame   The input preview frame. Currently, only pvl_image_format_nv12 and pvl_image_format_nv21 are supported.
+ *  @param[out] offset          The 2D offset of input frame from the last stitched image.
+ *  @param[out] direction       The direction(left/right/up/down) to which input image is moving.
+ *
+ *  @return     On success, the stitch order, or equivalently the stitch index(>0) where the image to be captured stitched at.
+ *                  0(= pvl_success) means that 'successful but not detected yet'.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
+ *  @retval     pvl_err_invalid_argument    Passing null instance of pano, preview_frame or offset.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
+ */
+PVLAPI int32_t
+pvl_panorama_detect_frame_to_stitch(pvl_panorama *pano, const pvl_image *preview_frame, pvl_point *offset, pvl_panorama_direction *direction);
+
+
+/** @brief Stitch a input image at the tail of stitched images so far
+ *
+ *  This function will stitch a input image with the last stitched image using given offset as an initial guess.
+ *  The series of input images are assumed to be given in the right order in terms of the panning direction.
+ *  If it's the first image this function just register it and return.
+ *  The maximum number of registerable images is bounded by 'max_supported_num_images' attribute of pvl_panorama structure.
+ *
+ *  @param[in]  pano            The handle of the panorama component.
+ *  @param[in]  input_image     The input image to be stitched. Currently, only pvl_image_format_nv12 and pvl_image_format_nv21 are supported.
+ *  @param[in]  offset          (Optional) The 2D offset of input image from the previous image. If NULL is given the offset values will be estimated.
+ *                                         If it's the first image the offset parameter will be ignored.
+ *
+ *  @return     On success, @ref pvl_success
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
+ *  @retval     pvl_err_invalid_argument    Passing null instance of pvl_pano or input_image.
+ *  @retval     pvl_err_out_of_bound        stitch_index < 0 or stitch_index >= max_supported_num_image
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
+ */
+PVLAPI pvl_err
+pvl_panorama_stitch_one_image(pvl_panorama *pano, pvl_image *input_image, const pvl_point *offset);
+
+
+/** @brief Compose all the stitched image so far into the final output image.
+ *
+ *  This function will compose all the stitched images and allocate internal image buffer to save the final output image.
+ *
+ *  @param[in]  pano            The handle of the panorama component.
+ *  @param[out] output_image    The final output image. The component manages the memory. Do not free the internal data buffer.
+ *                              After resetting or destroying the component handle this data would be not reachable.
+ *                              If panorama direction are up or down, rotation value of output image has 90 degree. otherwise, it has 0 degree.
+ *
+ *  @return     On success, @ref pvl_success
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null instance of pvl_pano or output_image.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle or no stitched images.
+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
+ */
+PVLAPI pvl_err
+pvl_panorama_run(pvl_panorama *pano, pvl_image *output_image);
+
+
+#ifdef __cplusplus
+}
+#endif // __cplusplus
+
+/** @example panorama_sample.c
+ *  Sample of Panorama
+ */
+
+#endif /* __PVL_PANORAMA_H__ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_pedestrian_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_pedestrian_detection.h
new file mode 100644
index 000000000000..4e8647c831fc
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_pedestrian_detection.h
@@ -0,0 +1,222 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __PD_PVL_PEDESTRIAN_DETECTION_H__
+#define __PD_PVL_PEDESTRIAN_DETECTION_H__
+
+/** @file    pvl_pedestrian_detection.h
+ *  @brief   This file declares the structure and native APIs of pedestrian detection component.
+ */
+
+#include "pvl_types.h"
+#include "pvl_config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/** @brief A structure to hold run-time configurable parameters for this component.
+ *
+ *  The variables in this structure will be retrieved and assigned via pvl_pedestrian_detection_get_parameters() and pvl_pedestrian_detection_set_parameters() respectively.
+ */
+struct pvl_pedestrian_detection_parameters
+{
+    int32_t max_num_pedestrians;                /* The maximum number of detectable pedestrian in one frame.
+                                                max_supported_pedestrians in pvl_pedestrian_detection structure represents the maximum allowable value, and minimum allowable value set to 1.
+                                                The default value is set to maximum when the component is created. */
+
+    int32_t min_pedestrian_height;              /* The minimum height(pixel)size of detectable pedestrian on preview mode.
+                                                It should be bigger than 'default_pedestrian_height'.
+                                                It should be smaller than 'default_pedestrian_height'*2. */
+};
+typedef struct pvl_pedestrian_detection_parameters pvl_pedestrian_detection_parameters;
+
+
+/** @brief A structure to hold the run-time context of this component.
+ *
+ *  This structure represents the pedestrian_detection instance which is used as the handle over most of API.
+ *  It holds its own properties, constant parameters and internal context inside.
+ */
+struct pvl_pedestrian_detection_context
+{
+    const pvl_version version;                      /**< The version information. */
+
+    const int32_t max_supported_num_pedestrians;    /**< The maximum number of pedestrians supported by this component. */
+    const int32_t default_pedestrian_height;        /**< The default value of minimum detectable height(pixel) size.
+                                                    Current version: 128 */
+};
+typedef struct pvl_pedestrian_detection_context pvl_pedestrian_detection_context;
+
+/** @brief A structure to hold the outcomes from the Pedestrian Detection component.
+*/
+struct pvl_pedestrian_detection_result {
+    pvl_rect rect;                  /**< The rectangular region of the detected pedestrian. */
+
+    int32_t  confidence;            /**< The confidence value of the detected pedestrian. (0~100) */
+
+    int32_t  tracking_id;           /**< The tracking id of the pedestrian. Only valid in the outcomes of pvl_pedestrian_detection_process_frame().
+                                    The value will be unique throughout the component life cycle, unless pvl_pedestrian_detection_reset() is called. */
+};
+typedef struct pvl_pedestrian_detection_result pvl_pedestrian_detection_result;
+
+/** @brief Get default configuration of this component.
+ *
+ *  This function returns default configuration of the pedestrina detection component.
+ *  The returned configuration could be customized as per its usage.
+ *
+ *  @param[out] config  The structure to load default configuration.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ */
+PVLAPI pvl_err
+pvl_pedestrian_detection_get_default_config(pvl_config *config);
+
+
+/** @brief Create an instance of the pedestrina detection component.
+ *
+ *  This function initializes and returns an instance of this component.
+ *  Multiple instances are allowed to be created concurrently.
+ *
+ *  @param[in]  config  The configuration information of the component.
+ *  @param[out] pd      A pointer to indicate the handle newly created.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported configuration.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
+ */
+PVLAPI pvl_err
+pvl_pedestrian_detection_create(const pvl_config *config, pvl_pedestrian_detection_context **pd);
+
+
+/** @brief Destroy the instance of this component.
+ *
+ *  @param[in]  pd   The handle of this component to be destroyed.
+ */
+PVLAPI void
+pvl_pedestrian_detection_destroy(pvl_pedestrian_detection_context *pd);
+
+
+/** @brief Reset the instance of this component.
+ *
+ *  All the internal states and context will be reset except the run-time parameters set by user.
+ *
+ *  @param[in]  pd  The handle of this component.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ */
+PVLAPI pvl_err
+pvl_pedestrian_detection_reset(pvl_pedestrian_detection_context *pd);
+
+
+/** @brief Set run-time parameters of this component.
+ *
+ *  Set given parameters to the handle.
+ *  It is required to get proper parameters instance by pvl_pedestrian_detection_get_parameters() before setting something.
+ *
+ *  @param[in]  pd      The handle of this component.
+ *  @param[in]  params  The parameters to be set.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ */
+PVLAPI pvl_err
+pvl_pedestrian_detection_set_parameters(pvl_pedestrian_detection_context *pd, const pvl_pedestrian_detection_parameters *params);
+
+
+/** @brief Get current run-time parameters of this component.
+ *
+ *  Get the parameters from the handle.
+ *  This function should be called before calling pvl_pedestrian_detection_set_parameters().
+ *
+ *  @param[in]  pd      The handle of this component.
+ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ */
+PVLAPI pvl_err
+pvl_pedestrian_detection_get_parameters(pvl_pedestrian_detection_context *pd, pvl_pedestrian_detection_parameters *params);
+
+
+/** @brief Detect pedestrian from an input image.
+*
+*  This function will conduct pedestrian detection.
+*
+*  @param[in]  pd          The handle of the pedestrian detection component.
+*  @param[in]  image       The input image. Currently, pvl_image_format_rgba32 and pvl_image_format_nv12 are supported.
+*  @param[out] result      The result buffer.
+*  @param[in]  max_result  The number of 'result' that the buffers can hold.
+*
+*  @return     On success, @ref integer    Number of the detected pedestrians from the input image(positive integer).
+*  @return     On failure, @ref pvl_err    Error code(negative integer), which will be the one of the following return value(s).
+*
+*  @retval     pvl_err_not_supported       Unsupported image format specified.
+*  @retval     pvl_err_invalid_argument    Passing null pointer/negative value to the params or non-matching values in num_rois and rois.
+*  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+*  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
+*/
+PVLAPI int32_t
+pvl_pedestrian_detection_process_image(pvl_pedestrian_detection_context *pd, const pvl_image* image, pvl_pedestrian_detection_result* result, int max_result);
+
+
+/** @brief process continuous frames for conducting pedestrian detection.
+*
+*  This function will conduct pedestrian detection.
+*
+*  @param[in]  pd           The handle of the pedestrian detection component.
+*  @param[in]  image       The input image. Currently, pvl_image_format_rgba32 and pvl_image_format_nv12 are supported.
+*  @param[out] result      The result buffer.
+*  @param[in]  max_result  The number of 'result' that the buffer can hold.
+*
+*  @return     On success, @ref integer.   The number of the detected pedestrians at the current input frame(positive integer).
+*  @return     On failure, @ref pvl_err    Error code, which will be the one of the following return value(s).
+*
+*  @retval     pvl_err_not_supported       Unsupported image format specified.
+*  @retval     pvl_err_invalid_argument    Passing null pointer/negative value to the params or non-matching values in num_rois and rois.
+*  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+*  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
+*/
+PVLAPI int32_t
+pvl_pedestrian_detection_process_frame(pvl_pedestrian_detection_context *pd, const pvl_image *image, pvl_pedestrian_detection_result* result, int max_result);
+
+#ifdef __cplusplus
+}
+#endif  // __cplusplus
+
+/** @example pedestrian_detection_sample.cpp
+ *  Sample of Pedestrian Detection
+ */
+
+#endif  // __PD_PVL_PEDESTRIAN_DETECTION_H__
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_perspective_control.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_perspective_control.h
new file mode 100644
index 000000000000..b76c06eeb91f
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_perspective_control.h
@@ -0,0 +1,408 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __PVL_PERSPECTIVE_CONTROL_H__
+#define __PVL_PERSPECTIVE_CONTROL_H__
+
+/** @file    pvl_perspective_control.h
+ *  @brief   This file declares the structures and native APIs of perspective control component.
+ */
+
+#include "pvl_types.h"
+#include "pvl_config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MAX_VANISHING_POINT 3
+#define MAX_VERTEX_POINT 4
+
+/** @brief The enumerated values to specify correcting mode
+ *
+ *  This enumeration indicates setting of how the perspective_control engine conducts image warping.
+ */
+typedef enum {
+    PC_SCAN_MODE = 0,   /**< Suitable for using indoor scenes */
+    PC_BUILDING_MODE,   /**< Suitable for using outdoor scenes */
+    NUM_PC_MODES
+} pvl_perspective_control_mode;
+
+typedef enum
+{
+    PC_ORI_VERTICAL = 0,    /**< The orientation for the vertical direction */
+    PC_ORI_HORIZONTAL,      /**< The orientation for the horizontal direction */
+    NUM_ORI
+} pvl_pc_orientation;
+
+struct pvl_pc_correction_range
+{
+    float min_vertical;     /**< The minimum value of available correction range in vertical orientation */
+    float max_vertical;     /**< The maximum value of available correction range in vertical orientation */
+    float min_horizontal;   /**< The minimum value of available correction range in horizontal orientation */
+    float max_horizontal;   /**< The maximum value of available correction range in horizontal orientation */
+};
+typedef struct pvl_pc_correction_range pvl_pc_correction_range;
+
+/** @Deprecated
+ * @brief A structure to hold run-time configurable parameters for this component.
+ *
+ *  The variables in this structure will be retrieved and assigned, via pvl_perspective_control_get_parameters() and pvl_perspective_control_set_parameters() respectively.
+ */
+struct pvl_perspective_control_parameters {
+
+    pvl_perspective_control_mode  control_mode;
+                                      /* To choose mode of perspective control(the PC engine recommends direction and intensity)
+                                         If a user wants to use this engine for indoor usage, then set this parameter PC_SCAN_MODE.
+                                         If a user wants to change the intensity or to choose a certain direction(a certain direction among vanishig points), then set this paramter PC_MANUAL_OUTDOOR_MODE.
+                                         [Default : PC_AUTO_OUTDOOR_MODE]
+                                      */
+    // Intensity and orientation of perspective correction ('correction_range' parameters will be applied only if 'control_mode' is PC_MANUAL_OUTPUT_MODE)
+    float vertical_correction_range;         /* For vertical direction
+                                              [Valid Range: -1.0 ~ 1.0] [Default: 0]
+                                              -1 means full perspective control for the case that the vanishing point is located down direction.
+                                               0 means no perspective control to maintain input image.
+                                               1 means full perspective control for the case that the vanishing point is located up direction.
+                                              */
+    float horizontal_correction_range;       /* For horizontal direction
+                                               [Valid Range: -1.0 ~ 1.0] [Default: 0]
+                                              -1 means full perspective control for the case that the vanishing point is located left direction.
+                                               0 means no perspective control to maintain input image.
+                                               1 means full perspective control for the case that the vanishing point is located right direction.
+                                              */
+};
+typedef struct pvl_perspective_control_parameters pvl_perspective_control_parameters;
+
+/** @brief A structure to supply the public information of this component.
+ *
+ *  This structure represents the perspective_control instance which is used as the handle over most of API.
+ *  It holds its own properties, constant context information.
+ */
+struct pvl_perspective_control {
+    const pvl_version                  version;                   /**< The version information. */
+    const int                          max_vanishing_point;       /**< The maximum configurable value of the number of vanishing point from input image.
+                                                                          Refers to MAX_VANISHING_POINT. (This value is not modifiable in any purpose) */
+    const pvl_perspective_control_mode  default_control_mode;      /**< Default value of the 'PC_AUTO_OUTDOOR_MODE' */
+    const int                          default_limit_angle;       /**< Default value of limited angle: 20 degree */
+};
+typedef struct pvl_perspective_control pvl_perspective_control;
+
+
+/** @ Deprecated
+ * @brief A structure to hold the analysis data of vanishing points from input image.
+ */
+struct pvl_vanishing_orientation {
+    int       angle;                                /**< (To divide an input image into 4 quadrants and locate the origin on the centre point of the image.)
+                                                       The value is degree of each vanishing point in a counter-clockwise rotation from X axis.*/
+    pvl_bool  is_outside;                           /**< This value is related to how far each vanishing point is from the centre point.
+                                                         'pvl_true' means this vanishing point is located outside of an image.
+                                                         'pvl_true' means this vanishing point is located inside of an image.
+                                                         if this value is false, then the image warping based on this target VaP can cause too severe image warping*/
+};
+typedef struct pvl_vanishing_orientation pvl_vanishing_orientation;
+
+struct pvl_perspective_data {
+    int                       num_vanishing_points;                        /**< The number of vanishing point of the input image */
+    pvl_vanishing_orientation vanishing_point[MAX_VANISHING_POINT];        /**< Information of each vanishing point.
+                                                                            Users can choose the vanishing point based on angle. */
+};
+typedef struct pvl_perspective_data pvl_perspective_data;
+
+/** @brief A structure to hold the outcomes from this component.
+ */
+struct pvl_perspective_control_result{
+    pvl_image         output_image;        /**< The final output image. The component manages the memory. Do not free the internal data buffer of this structure.
+                                                 After resetting or destroying the 'perspective_control' component handle, this data would not be reachable. */
+    pvl_rect crop_hint;
+    float v_correction_value;
+    float h_correction_value;
+};
+typedef struct pvl_perspective_control_result pvl_perspective_control_result;
+
+
+
+/** @brief Get default configuration of this component.
+ *
+ *  This function returns default configuration of the perspective_control component.
+ *  The returned configuration could be customized as per its usage.
+ *
+ *  @param[out] config  The structure to load default configuration.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ */
+PVLAPI pvl_err
+pvl_perspective_control_get_default_config(pvl_config *config);
+
+
+/** @brief Create an instance of the perspective_control component.
+ *
+ *  This function initializes and returns an instance of this component.
+ *  Multiple instances are allowed to be created concurrently.
+ *
+ *  @param[in]  config  The configuration information of the component.
+ *  @param[out] pc      A pointer to indicate the handle newly created.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported configuration.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle. Failure in loading run-time library related to GPU or IPU acceleration.
+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
+ */
+PVLAPI pvl_err
+pvl_perspective_control_create(const pvl_config *config, pvl_perspective_control **pc);
+
+
+/** @brief Destroy the instance of this component.
+ *
+ *  @param[in]  pc   The handle of this component to be destroyed.
+ */
+PVLAPI void
+pvl_perspective_control_destroy(pvl_perspective_control *pc);
+
+
+/** @brief Reset the instance of this component.
+ *
+ *  All the internal states, the analysis information, the composed output image and context will be reset except the run-time parameters set by user.
+ *  If there are any ongoing processes(maybe on another thread) it cancels them or waits until done.
+ *
+ *  @param[in]  pc      The handle of this component.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ */
+PVLAPI pvl_err
+pvl_perspective_control_reset(pvl_perspective_control *pc);
+
+/** @brief Set the perspective control mode for the given instance.
+ *
+ *  Current control mode of given instance will be changed to the designated control mode.
+ *  If the input mode is same with the previous mode, it will return pvl_success without changing the internal status of current instance.
+ *  but if it's changed, it will reset all internal states. so user should perform the process_image() or process_frame() with new input image.
+ *
+ *  @param[in]  pc      The handle of perspective control instance.
+ *  @parma[in]  mode    The new perspective mode want to set.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
+ *  @retval     pvl_err_not_supported       Passing not supported perspective control mode.
+ */
+PVLAPI pvl_err pvl_perspective_control_set_control_mode(pvl_perspective_control* pc, pvl_perspective_control_mode mode);
+
+/** @brief Set and analyze input image for the perspective control.
+ *
+ *  Given image will be set as source image and perform analysis to detect characteristics depending on the current control mode.
+ *  If the current control mode is PC_SCAN_MODE, it will try to find quadrangle points from the input image.
+ *  And if the control mode is PC_BUILDING_MODE, it will try to find primary lines in both vertical and horizontal orientations.
+ *  By calling this, user can get corresponding characteristics such as quadrangle points and primary lines using other APIs.
+ *
+ *  @param[in]  pc          The handle of perspective control instance.
+ *  @parma[in]  input_image The image that want to be used as source image to the perspective control.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
+ *  @retval     pvl_err_not_supported       When the image format of input_image is not supported format.
+ *                                          Supported image formats are @refs pvl_image_format_nv12 and @refs pvl_image_format_rgba32
+ */
+PVLAPI pvl_err pvl_perspective_control_process_image(pvl_perspective_control* pc, pvl_image* input_image);
+
+/** @brief Set and analyze input image for the perspective control.
+ *
+ *  The most of funtionality is same with process_image(). but it is designed to use for the preview processing.
+ *  In the input image analysis phase, it will try to detect characteristics using the sequance of input frames.
+ *  It means that the input image analysis will be performed partially. so the corresponding characteristics could not be retrived
+ *  after calling this API.
+ *
+ *  @param[in]  pc          The handle of perspective control instance.
+ *  @param[in]  input_frame The image that want to be used as source image to analyze characteristics for the perspective control.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
+ *  @retval     pvl_err_not_supported       When the image format of input_image is not supported format.
+ *                                          Supported image formats are @refs pvl_image_format_nv12 and @refs pvl_image_format_rgba32
+ */
+PVLAPI pvl_err pvl_perspective_control_process_frame(pvl_perspective_control* pc, pvl_image* input_frame);
+
+/** @brief Get perspective corrected image with selected 'control_mode'.
+ *
+ *  This API will produce perspective-corrected output image using the configured parameters.
+ *  In PC_SCAN_MODE, detected quadrangle points or configured one by user will be used for the image warping.
+ *  And horizontal/vertical correction values and primary lines will be used for the correction of PC_BUILDING_MODE.
+ *  This API should be called after calling process_image() or process_frame().
+ *  The output image could have blank area since source image will be warped in vertical and/or horizontal direction.
+ *  so, the crop_hint in the result structure could be used to get the soild image from the output image by cutting out the blank area.
+ *
+ *  @param[in]  pc      The handle of perspective control instance.
+ *  @param[out]  result  The final output contains an output image. The component manages the memory. Do not allocate or free the internal 'data' buffer in 'output_image'.
+ *                      After resetting or destroying the component handle this data would be not reachable.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
+ *  @retval     pvl_err_invalid_status      If it called before calling process_image() or process_frame().
+ *  @retval     pvl_err_not_supported       When the image format of input_image is not supported format.
+ *                                          Supported image format is only @refs pvl_image_format_rgba32
+ */
+PVLAPI pvl_err pvl_perspective_control_get_warped_image(pvl_perspective_control* pc, pvl_perspective_control_result* result);
+
+/** @brief Get the detected quadrangle points.
+ *
+ *  As a result of the process_image() or process_frame under the PC_SCAN_MODE, this API will return the detected quadrangle points.
+ *  This API should be called after calling process_image() or process_frame().
+ *  And available only for the PC_SCAN_MODE.
+ *
+ *  @param[in]  pc      The handle of perspective control instance.
+ *  @parma[out] points  The array of pvl_point struct to be filled with detected quadrangle's points.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
+ *  @retval     pvl_err_not_supported       Called in the PC_BUILDING_MODE
+ *  @retval     pvl_err_invalid_status      If it called before calling process_image() or process_frame().
+ *  @retval     pvl_err_no_such_item        There is no detcted quadrangle from the latest result of process_image() or process_frame().
+ */
+PVLAPI pvl_err pvl_perspective_control_get_quadrangle(pvl_perspective_control* pc, pvl_point points[4]);
+
+/** @brief Set the user customized quadrangle points.
+ *
+ *  If the output coodinates of get_quadrangle() API are not correct, user can adjust them using this API.
+ *  Once quadrangle points were configured by this API, those coodinates will be used for the final processing of the perspective contorl
+ *  This API should be called after calling process_image() or process_frame().
+ *  And available only for the PC_SCAN_MODE.
+ *
+ *  @param[in]  pc      The handle of perspective control instance.
+ *  @param[in]  points  The array of pvl_point struct which contains user-customized quadrangle points.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
+ *  @retval     pvl_err_not_supported       Called in the PC_BUILDING_MODE
+ *  @retval     pvl_err_invalid_status      If it called before calling process_image() or process_frame().
+ */
+PVLAPI pvl_err pvl_perspective_control_set_quadrangle(pvl_perspective_control* pc, pvl_point points[4]);
+
+/** @brief Get the available orientation of the input image.
+ *
+ *  As a result of process_image() or process_frame() in the PC_BUILDING_MODE, perspective control engine will detect available
+ *  orientation of perspective correction. it will be represented to the available correction range and filled to the correction_range structure.
+ *  This API should be called after calling process_image() or process_frame().
+ *  And available only for the PC_BUILDING_MODE.
+ *
+ *  @param[in]  pc              The handle of perspective control instance.
+ *  @param[out] available_range The correction range structure which will be filled with available correction range values.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
+ *  @retval     pvl_err_not_supported       Called in the PC_SCAN_MODE
+ *  @retval     pvl_err_invalid_status      If it called before calling process_image() or process_frame().
+ */
+PVLAPI pvl_err pvl_perspective_control_get_available_correction_range(pvl_perspective_control* pc, pvl_pc_correction_range* available_range);
+
+/** @brief Set the correction value for the given orientation.
+ *
+ *  To set the valid correction value, user should refer the result of get_available_correction_range() API.
+ *  Valid range of 'value' is [pvl_pc_correction_range::min_vertical, pvl_pc_correction_range::max_vertical] where 'ori' is PC_ORI_VERTICAL,
+ *  and [pvl_pc_correction_range::min_horizontal, pvl_pc_correction_range::min_horizontal] where 'ori' is PC_ORI_HORIZONTAL.
+ *  Note taht tha zero value means no correction and 1.0 or -1.0 means the maximum correction.
+ *  This API should be called after calling process_image() or process_frame().
+ *  And available only for the PC_BUILDING_MODE.
+ *
+ *  @param[in]  pc      The handle of perspective control instance.
+ *  @parma[in]  ori     The orientation for the correction value.
+ *  @param[in]  value   The correction value to the given orientation.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
+ *  @retval     pvl_err_not_supported       Called in the PC_SCAN_MODE or 'value' is out of avaliable range.
+ */
+PVLAPI pvl_err pvl_perspective_control_set_correction_value(pvl_perspective_control* pc, pvl_pc_orientation ori, float value);
+
+/** @brief Get the information of primary lines.
+ *
+ *  If the available range have non-zero value for the vertical/horizontal orientation, user can get the primary lines for that orientation
+ *  to provide guide-line to the user using this API.
+ *  This API should be called after calling process_image() or process_frame().
+ *  And available only for the PC_BUILDING_MODE.
+ *
+ *  @param[in]  pc      The handle of the perspective_control component.
+ *  @param[in]  ori     The orientation for the primary lines.
+ *  @param[out] line1   The array of pvl_point to be represented a line with two points.
+ *  @param[out] line2   The array of pvl_point to be represented a line with two points.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null instance of pc.
+ *  @retval     pvl_err_invalid_status      If it called before calling process_image() or process_frame().
+ *  @retval     pvl_err_not_supported       Called in the PC_SCAN_MODE.
+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
+ *  @retval     pvl_err_no_such_item        There is no detected primary line from the source image.
+ *                                          The source image may not have any vanishing point at the given orientation.
+ */
+PVLAPI pvl_err pvl_perspective_control_get_primary_lines(pvl_perspective_control* pc, pvl_pc_orientation ori, pvl_point line1[2], pvl_point line2[2]);
+
+/** @brief Set the customized primary lines for the given orientation.
+ *
+ *  User can mannually customize primary lines for the perspective correction using this API.
+ *  This API should be called after calling process_image() or process_frame().
+ *  And available only for the PC_BUILDING_MODE.
+ *
+ *  @param[in]  pc      The handle of the perspective_control component.
+ *  @param[in]  ori     The orientation for the primary lines.
+ *  @param[in]  line1   The array of pvl_point to be represented a line with two points.
+ *  @param[in]  line2   The array of pvl_point to be represented a line with two points.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null instance of pc.
+ *  @retval     pvl_err_not_supported       Called in the PC_SCAN_MODE.
+ *  @retval     pvl_err_invalid_status      If it called before calling process_image() or process_frame().
+ */
+PVLAPI pvl_err pvl_perspective_control_set_primary_lines(pvl_perspective_control* pc, pvl_pc_orientation ori, pvl_point line1[2], pvl_point line2[2]);
+
+PVLAPI pvl_err
+pvl_perspective_control_enhance_contrast(pvl_perspective_control *pc, pvl_image *image);
+
+#ifdef __cplusplus
+}
+#endif // __cplusplus
+
+/** @example perspective_control_sample.c
+ *  Sample of Perspective_control
+ */
+
+#endif /* __PVL_PERSPECTIVE_CONTROL_H__ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_smile_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_smile_detection.h
new file mode 100644
index 000000000000..fe4cbd8421ce
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_smile_detection.h
@@ -0,0 +1,242 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __PVL_SMILE_DETECTION_H__
+#define __PVL_SMILE_DETECTION_H__
+
+/** @file    pvl_smile_detection.h
+ *  @brief   This file declares the structure and native APIs of smile detection component.
+ */
+
+#include "pvl_types.h"
+#include "pvl_config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/** @brief A structure to hold run-time configurable parameters for this component.
+ *
+ *  The variables in this structure will be retrieved and assigned, via pvl_smile_detection_get_parameters() and pvl_smile_detection_set_parameters() respectively.
+ */
+struct pvl_smile_detection_parameters
+{
+    int32_t threshold;                  /**< The threshold value that evaluates the status smile or not if the score greater than or equal to this threshold.
+                                             The range of the value may be in [0..100], though, recommended to use the default value set in the structure pvl_smile_detection. */
+};
+typedef struct pvl_smile_detection_parameters pvl_smile_detection_parameters;
+
+
+/** @brief The enumerated values to represent smile state of each face.
+ */
+enum pvl_smile_detection_state
+{
+    pvl_smile_detection_state_not_smiling   = 0,    /**< The state representing the face is 'NOT smiling'. */
+    pvl_smile_detection_state_smiling       = 1,    /**< The state representing the face is 'smiling'. */
+};
+typedef enum pvl_smile_detection_state pvl_smile_detection_state;
+
+
+/** @brief A structure to hold the outcomes from this component.
+ */
+struct pvl_smile_detection_result
+{
+    int32_t score;                      /**< The smile score of the face in the range of 0 to 100, where 0 means non-smile and 100 means full smile. */
+    pvl_smile_detection_state state;    /**< The state of the smile of the face. */
+};
+typedef struct pvl_smile_detection_result pvl_smile_detection_result;
+
+
+/** @brief A structure to hold the run-time context of this component.
+ *
+ *  This structure represents the smile detection instance which is used as the handle over most of API.
+ *  It holds its own properties, constant parameters and internal context inside.
+ */
+struct pvl_smile_detection
+{
+    const pvl_version version;          /**< The version information. */
+
+    const int32_t default_threshold;    /**< The default threshold value recommended. */
+    const int32_t rop_tolerance;        /**< The maximum range of ROP (Rotation Out of Plane) tolerance of the face.
+                                             The accuracy may not be guaranteed if the ROP angle is out of range. */
+};
+typedef struct pvl_smile_detection pvl_smile_detection;
+
+
+/** @brief Get default configuration of this component.
+ *
+ *  This function returns default configuration of the smile detection component.
+ *  The returned configuration could be customized as per its usage.
+ *
+ *  @param[out] config  The structure to load default configuration.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ */
+PVLAPI pvl_err
+pvl_smile_detection_get_default_config(pvl_config *config);
+
+
+/** @brief Create an instance of the smile detection component.
+ *
+ *  This function initializes and returns an instance of this component.
+ *  Multiple instances are allowed to be created concurrently.
+ *
+ *  @param[in]  config  The configuration information of the component.
+ *  @param[out] sd      A pointer to indicate the handle newly created.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported configuration.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
+ */
+PVLAPI pvl_err
+pvl_smile_detection_create(const pvl_config *config, pvl_smile_detection **sd);
+
+
+/** @brief Destroy the instance of this component.
+ *
+ *  @param[in]  sd   The handle of this component to be destroyed.
+ */
+PVLAPI void
+pvl_smile_detection_destroy(pvl_smile_detection *sd);
+
+
+/** @brief Reset the instance of this component.
+ *
+ *  All the internal states and context will be reset except the run-time parameters set by user.
+ *
+ *  @param[in]  sd  The handle of this component.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
+ */
+PVLAPI pvl_err
+pvl_smile_detection_reset(pvl_smile_detection *sd);
+
+
+/** @brief Set run-time parameters of this component.
+ *
+ *  Set given parameters to the handle.
+ *  It is required to get proper parameters instance by pvl_smile_detection_get_parameters() before setting something.
+ *
+ *  @param[in]  sd      The handle of this component.
+ *  @param[in]  params  The parameters to be set.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to re-allocate the memory.
+ */
+PVLAPI pvl_err
+pvl_smile_detection_set_parameters(pvl_smile_detection *sd, const pvl_smile_detection_parameters *params);
+
+
+/** @brief Get current run-time parameters of this component.
+ *
+ *  Get the parameters from the handle.
+ *  This function should be called before calling pvl_smile_detection_set_parameters().
+ *
+ *  @param[in]  sd      The handle of this component.
+ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ */
+PVLAPI pvl_err
+pvl_smile_detection_get_parameters(pvl_smile_detection *sd, pvl_smile_detection_parameters *params);
+
+
+/** @brief Detect smile on the face in the input image.
+ *
+ *  This function runs smile detection on the face in the given image.
+ *  In contrast with pvl_smile_detection_run_in_preview(), temporal correlation with previous input images will not be considered.
+ *  The caller is responsible for allocating the buffer for the result.
+ *
+ *  @param[in]  sd          The handle of the smile detection component.
+ *  @param[in]  image       The input image. All image formats are supported.
+ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
+ *  @param[in]  left_eye    The center point of the left eye of the face.
+ *  @param[in]  right_eye   The center point of the right eye of the face.
+ *  @param[out] result      The result of the component. It must be allocated with enough memory to hold the result.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
+ */
+PVLAPI pvl_err
+pvl_smile_detection_run_in_image(pvl_smile_detection *sd, const pvl_image *image, const pvl_point *left_eye, const pvl_point *right_eye,
+                                 pvl_smile_detection_result *result);
+
+
+/** @brief Detect smile on the faces in the input image which is the part of the preview or the video frames.
+ *
+ *  This function will run smile detection on the faces in the input image assuming that the input image is the part of preview or video frames,
+ *  meaning this frame has temporal correlation with previous and next input frames.
+ *  Using the information from the previous frame may show better result in terms of the jitter or the noise.
+ *
+ *  The caller is responsible for allocating the buffer for result.
+ *
+ *  @param[in]  sd              The handle of the smile detection component.
+ *  @param[in]  image           The input image. All image formats are supported.
+ *                              pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
+ *  @param[in]  left_eye        The center point of the left eye of the face.
+ *  @param[in]  right_eye       The center point of the right eye of the face.
+ *  @param[in]  tracking_id     The tracking-id returned from face detection component. Use pvl_smile_detection_run_in_image() if tracking-id is not available.
+ *  @param[out] result          The result of the component. Must have enough memory to hold the result.
+ *
+ *  @return     On success, @ref pvl_success.
+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
+ *
+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
+ */
+PVLAPI pvl_err
+pvl_smile_detection_run_in_preview(pvl_smile_detection *sd, const pvl_image *image, const pvl_point *left_eye, const pvl_point *right_eye,
+                                   int32_t tracking_id, pvl_smile_detection_result *result);
+
+
+#ifdef __cplusplus
+}
+#endif // __cplusplus
+
+/** @example face_detection_sample.cpp
+ *  Sample of Smile Detection
+ */
+
+#endif /* __PVL_SMILE_DETECTION_H__ */
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_types.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_types.h
new file mode 100644
index 000000000000..e94636536b96
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_types.h
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __PVL_TYPES_H__
+#define __PVL_TYPES_H__
+
+/**
+ * @file    pvl_types.h
+ * @brief   This file declares common structures for PVL.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <stdarg.h>
+
+#if (defined (_WIN32) || defined (WIN32)) && !defined (DISABLE_PVLAPI)
+    #if defined (PVL_EXPORT)
+        #define DEPRECATED_PVLAPI __declspec(dllexport, deprecated)
+        #define DEPRECATED __declspec(deprecated)
+        #define PVLAPI __declspec(dllexport)
+    #else
+        #define DEPRECATED_PVLAPI __declspec(dllimport, deprecated)
+        #define DEPRECATED __declspec(deprecated)
+        #define PVLAPI __declspec(dllimport)
+    #endif
+#elif defined (__linux__) || defined (__linux) || defined (linux)
+    #define DEPRECATED_PVLAPI __attribute__((visibility("default"), deprecated))
+    #define DEPRECATED __attribute__((deprecated))
+    #define PVLAPI __attribute__((visibility("default")))
+#else
+    #define DEPRECATED_PVLAPI
+    #define DEPRECATED
+    #define PVLAPI
+#endif
+
+
+/**
+ * @brief A structure to represent a rectangle.
+ */
+struct pvl_rect {
+    int32_t left;
+    int32_t top;
+    int32_t right;
+    int32_t bottom;
+};
+typedef struct pvl_rect pvl_rect;
+
+
+/**
+ * @brief A structure to represent a 2D point.
+ */
+struct pvl_point {
+    int32_t x;
+    int32_t y;
+};
+typedef struct pvl_point pvl_point;
+
+
+/**
+ * @brief A structure to represent a size.
+ */
+struct pvl_size {
+    int32_t width;
+    int32_t height;
+};
+typedef struct pvl_size pvl_size;
+
+
+/**
+ * @brief A structure to represent 2D vector type composed with single precision floating types.
+ */
+struct pvl_vector2d {
+    float x;
+    float y;
+};
+typedef struct pvl_vector2d pvl_vector2d;
+
+
+/**
+ * @brief The enumerated values of the definitions of the error codes.
+ */
+enum pvl_err {
+    pvl_success                 =  0,   /**< Successfully completed. */
+    pvl_err_general             = -1,   /**< Function returned with unspecified error which does not fit to any other error codes. */
+    pvl_err_not_supported       = -2,   /**< Specified parameter is not supported by the library. */
+    pvl_err_invalid_argument    = -3,   /**< At least one function parameter is not valid. */
+    pvl_err_out_of_bound        = -4,   /**< Specified parameter exceeds limit of allowed value. */
+    pvl_err_interrupted         = -5,   /**< Function was interrupted due to change in internal state (usually caused by another thread.) */
+    pvl_err_invalid_status      = -6,   /**< Operation cannot be completed because precondition is not met or information is insufficient. */
+    pvl_err_nomem               = -7,   /**< Memory allocation has failed. */
+    pvl_err_database_full       = -8,   /**< Internal database is full. */
+    pvl_err_no_such_item        = -9,   /**< Requested item to look up was not found in the internal database. */
+};
+typedef enum pvl_err pvl_err;
+
+
+/**
+ * @brief The enumerated values of the definition of the boolean type.
+ */
+enum pvl_bool {
+    pvl_false   = 0,
+    pvl_true    = 1
+};
+typedef enum pvl_bool pvl_bool;
+
+
+/**
+ * @brief A structure to represent a version information.
+ */
+struct pvl_version {
+    const uint16_t major;
+    const uint16_t minor;
+    const uint16_t patch;
+    const char *description;
+};
+typedef struct pvl_version pvl_version;
+
+
+/**
+ * @brief The enumerated values of the definitions of possible image types.
+ */
+enum pvl_image_format {
+    pvl_image_format_nv12,     /**< 12 bit YUV 420, Y plane first followed by UV-interleaved plane. e.g. YYYYYYYY UVUV */
+    pvl_image_format_yv12,     /**< 12 bit YUV 420, Y plane first, U plane and then V plane. e.g. YYYYYYYY UU VV */
+    pvl_image_format_gray,     /**< 8 bit, Y plane only. */
+    pvl_image_format_rgba32,   /**< 32 bit RGBA, 8 bits per channel. e.g. RGBA RGBA RGBA  */
+    pvl_image_format_yuy2,     /**< 16 bit YUV 422, YUYV interleaved. e.g. YUYV YUYV YUYV */
+    pvl_image_format_nv21,     /**< 12 bit YUV 420, Y plane first followed by VU-interleaved plane. e.g. YYYYYYYY VUVU */
+    pvl_image_format_bgr,
+    pvl_image_format_rgb,
+};
+typedef enum pvl_image_format pvl_image_format;
+
+
+/**
+ * @brief A structure to represent the image for PVL engines.
+ */
+struct pvl_image {
+    uint8_t *data;             /**< The pointer to the image data */
+    uint32_t size;             /**< The total number of bytes of the data */
+    int32_t width;             /**< The width of the image in pixels */
+    int32_t height;            /**< The height of the image in lines */
+    pvl_image_format format;   /**< The format of the image */
+    int32_t stride;            /**< The stride that represents the number of bytes per row. */
+    int32_t rotation;          /**< The rotation of the image. (in degree, [0..360])
+                                     It rotates in a clockwise direction. */
+};
+typedef struct pvl_image pvl_image;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // #ifndef __PVL_TYPES_H__
diff --git a/camera/hal/intel/ipu6/include/ia_tools/css_types.h b/camera/hal/intel/ipu6/include/ia_tools/css_types.h
new file mode 100644
index 000000000000..4150dbf7e628
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_tools/css_types.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CSS_TYPES_H__
+#define __CSS_TYPES_H__
+
+#include <stdint.h>
+#include <stdbool.h>
+
+/*!
+ * \brief Error codes.
+ * \ingroup ia_tools
+*/
+typedef int32_t css_err_t;
+#define css_err_none     0         /*!< No errors*/
+#define css_err_general  (-(1 << 1))  /*!< General error*/
+#define css_err_nomemory (-(1 << 2))  /*!< Out of memory*/
+#define css_err_data     (-(1 << 3))  /*!< Corrupted data*/
+#define css_err_internal (-(1 << 4))  /*!< Error in code*/
+#define css_err_argument (-(1 << 5))  /*!< Invalid argument for a function*/
+#define css_err_noentry  (-(1 << 6))  /*!< No such entry/entity/file */
+#define css_err_timeout  (-(1 << 7))  /*!< Time out*/
+#define css_err_end      (-(1 << 8))  /*!< End of values*/
+#define css_err_full     (-(1 << 9))  /*!< Exchange full */
+#define css_err_again    (-(1 << 10)) /*!< Operation requires additional call */
+#define css_err_nimpl    (-(1 << 11)) /*!< Not implemented */
+
+#ifndef __cplusplus
+
+/* Define bool type as int for strict C89 */
+#ifndef __bool_true_false_are_defined
+#define bool int
+#define false 0
+#define true 1
+#endif
+
+/* inline keyword compliance for ansi */
+#if (__STDC_VERSION__ < 199901L)
+#define inline
+#endif
+
+#endif /* __cplusplus */
+
+#endif /* _CSS_TYPES_H_ */
diff --git a/camera/hal/intel/ipu6/include/ia_tools/ia_list.h b/camera/hal/intel/ipu6/include/ia_tools/ia_list.h
new file mode 100644
index 000000000000..a9a258ea4b80
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_tools/ia_list.h
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _IA_LIST_H_
+#define _IA_LIST_H_
+
+#include <stdbool.h>
+#include <ia_tools/css_types.h>
+
+/**
+ * \ingroup ia_tools
+ */
+typedef struct ia_list {
+    void *data;
+    struct ia_list *next;
+} ia_list_t;
+
+/**
+ * Create a ia_list
+ * \ingroup ia_tools
+ * \return pointer to the list. NULL if failed.
+ */
+ia_list_t *
+ia_list_create(void);
+
+/**
+ * Destroy a ia_list
+ * \ingroup ia_tools
+ * \param *list the list
+ */
+void
+ia_list_destroy(ia_list_t *list);
+
+/**
+ * Add a new element to a list head. If *list is NULL, a new ia_list element is
+ * allocated and inserted to *list.
+ * \ingroup ia_tools
+ * \param **list a pointer to the list pointer
+ * \param *data the data for the list element
+ * \return css_err_none on success
+ * Add data to a ia_list
+ */
+css_err_t
+ia_list_prepend(ia_list_t **list, void *data);
+
+/**
+ * Add a new element to a list tail. If *list is NULL, a new ia_list element is
+ * allocated and inserted to *list.
+ * \ingroup ia_tools
+ * \param **list a pointer to the list pointer
+ * \param *data the data for the list element
+ * \return css_err_none on success
+ * Add data to a ia_list
+ */
+css_err_t
+ia_list_append(ia_list_t **list, void *data);
+
+/**
+ * Tell whether data is in the list
+ * \ingroup ia_tools
+ * \param *list handle to the list object
+ * \param *data the data pointer
+ * \return true if data is in the list, false otherwise
+ */
+bool
+ia_list_contains(const ia_list_t *list, void *data);
+
+/**
+ * Remove data if it exists in the list.
+ * \ingroup ia_tools
+ * \param **list a pointer to the list pointer.
+ * \param *data the data to remove from list.
+ * \return true if data was removed. False otherwise.
+ */
+bool
+ia_list_remove(ia_list_t **list, void *data);
+
+/**
+ * Tell the length of the list.
+ * \ingroup ia_tools
+ * \param *list a pointer to the list.
+ * \return length of the list.
+ */
+uint32_t
+ia_list_length(const ia_list_t *list);
+
+/**
+ * Return data at an index of the list.
+ * \ingroup ia_tools
+ * \param *list a pointer to the list.
+ * \param index element index
+ * \return pointer to the data at the element at the distance "index" from the
+ * given list element
+ */
+void*
+ia_list_data_at(const ia_list_t *list, uint32_t index);
+
+#endif /* _IA_LIST_H_ */
diff --git a/camera/hal/intel/ipu6/include/linux/ipu-isys.h b/camera/hal/intel/ipu6/include/linux/ipu-isys.h
new file mode 100644
index 000000000000..7ecf35c49040
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/linux/ipu-isys.h
@@ -0,0 +1,51 @@
+/****************************************************************************
+ * Copyright (C) 2019 Intel Corporation.
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef UAPI_LINUX_IPU_ISYS_H
+#define UAPI_LINUX_IPU_ISYS_H
+#define V4L2_CID_IPU_BASE (V4L2_CID_USER_BASE + 0x1080)
+#define V4L2_CID_IPU_ISA_EN (V4L2_CID_IPU_BASE + 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_CID_IPU_STORE_CSI2_HEADER (V4L2_CID_IPU_BASE + 2)
+#define V4L2_CID_IPU_ISYS_COMPRESSION  (V4L2_CID_IPU_BASE + 3)
+#define V4L2_IPU_ISA_EN_BLC (1 << 0)
+#define V4L2_IPU_ISA_EN_LSC (1 << 1)
+#define V4L2_IPU_ISA_EN_DPC (1 << 2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_IPU_ISA_EN_SCALER (1 << 3)
+#define V4L2_IPU_ISA_EN_AWB (1 << 4)
+#define V4L2_IPU_ISA_EN_AF (1 << 5)
+#define V4L2_IPU_ISA_EN_AE (1 << 6)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NR_OF_IPU_ISA_CFG 7
+#define V4L2_FMT_IPU_ISA_CFG v4l2_fourcc('i', 'p', '4', 'c')
+#define V4L2_FMT_IPU_ISYS_META v4l2_fourcc('i', 'p', '4', 'm')
+#ifdef IPU_OTF_SUPPORT
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ipu_frame_counter {
+  uint32_t frame_counter;
+  uint32_t index;
+} __attribute__((packed));
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIDIOC_IPU_SET_LINK_ID _IOWR('v', BASE_VIDIOC_PRIVATE + 1, uint8_t)
+#define VIDIOC_IPU_SET_FRAME_COUNTER _IOWR('v', BASE_VIDIOC_PRIVATE + 2, struct ipu_frame_counter)
+#endif
+#define VIDIOC_IPU_GET_DRIVER_VERSION _IOWR('v', BASE_VIDIOC_PRIVATE + 3, uint32_t)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/camera/hal/intel/ipu6/include/utils/ScopedAtrace.h b/camera/hal/intel/ipu6/include/utils/ScopedAtrace.h
new file mode 100644
index 000000000000..043f60f0743e
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/utils/ScopedAtrace.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2015-2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <unistd.h>
+
+namespace icamera {
+
+/**
+ * Following macros PERF_CAMERA_ATRACE_XXX() can be called in the function
+ * we are scoping. Environment variable "camPerf" is need to be set as "16"
+ * or "128", to enalbe atrace profiling:
+ * 1. When "16" is set, ATRACE with level of CAMERA_DEBUG_LOG_ATRACE_OS is
+ * enalbed.
+ * 2. When "128" is set, ATRACE with level of CAMERA_DEBUG_LOG_ATRACE_IMAGING
+ * is enabled.
+ */
+class ScopedAtrace {
+      public:
+          ScopedAtrace(const int level, const char* func, const char* tag,
+                       const char* note = NULL, long value = -1,
+                       const char* note2 = NULL, int value2 = -1,
+                       const char* note3 = NULL, int value3 = -1);
+          ~ScopedAtrace();
+          static void setTraceLevel(int);
+      private:
+          bool mEnableAtraceEnd;
+};
+
+#define CAMERA_DEBUG_LOG_ATRACE_OS (1<<4)
+#define CAMERA_DEBUG_LOG_ATRACE_IMAGING (1<<7)
+
+#define PERF_CAMERA_ATRACE() ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_OS, \
+                                                 __func__, LOG_TAG);
+#define PERF_CAMERA_ATRACE_PARAM1(note, value) \
+            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_OS, __func__, \
+                                LOG_TAG, note, value);
+#define PERF_CAMERA_ATRACE_PARAM2(note, value, note2, value2) \
+            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_OS, __func__, LOG_TAG, \
+                                note, value, note2, value2);
+#define PERF_CAMERA_ATRACE_PARAM3(note, value, note2, value2, note3, value3) \
+            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_OS, __func__, LOG_TAG, \
+                                note, value, note2, value2, note3, value3);
+
+#define PERF_CAMERA_ATRACE_IMAGING() \
+            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_IMAGING, __func__, \
+                                LOG_TAG);
+#define PERF_CAMERA_ATRACE_PARAM1_IMAGING(note, value) \
+            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_IMAGING, __func__, \
+                                LOG_TAG, note, value);
+#define PERF_CAMERA_ATRACE_PARAM2_IMAGING(note, value, note2, value2) \
+            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_IMAGING, __func__, \
+                                LOG_TAG, note, value, note2, value2);
+#define PERF_CAMERA_ATRACE_PARAM3_IMAGING(note, value, note2, value2, note3, \
+                                          value3) \
+            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_IMAGING, __func__, \
+                                LOG_TAG, note, value, note2, value2, note3, \
+                                value3);
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.cpp
new file mode 100644
index 000000000000..c3227edb14c3
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.cpp
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelAiq"
+
+#include "modules/algowrapper/IntelAiq.h"
+
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+IntelAiq::IntelAiq() :
+    mAiq(nullptr) {
+    LOG2("@%s", __func__);
+}
+
+IntelAiq::~IntelAiq() {
+    LOG2("@%s", __func__);
+}
+
+ia_aiq* IntelAiq::init(const ia_binary_data* aiqbData,
+                       const ia_binary_data* nvmData,
+                       const ia_binary_data* aiqdData,
+                       unsigned int statsMaxWidth,
+                       unsigned int statsMaxHeight,
+                       unsigned int maxNumStatsIn,
+                       ia_cmc_t* cmc,
+                       ia_mkn* mkn) {
+    LOG2("@%s, aiqbData:%p, nvmData:%p, aiqdData:%p", __func__, aiqbData, nvmData, aiqdData);
+
+    mAiq = ia_aiq_init(aiqbData, nvmData, aiqdData,
+                       statsMaxWidth, statsMaxHeight, maxNumStatsIn, cmc, mkn);
+
+    return mAiq;
+}
+
+ia_err IntelAiq::aeRun(const ia_aiq_ae_input_params* inputParams, ia_aiq_ae_results** results) {
+    LOG2("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
+    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
+
+    return ia_aiq_ae_run(mAiq, inputParams, results);
+}
+
+ia_err IntelAiq::afRun(const ia_aiq_af_input_params* inputParams, ia_aiq_af_results** results) {
+    LOG2("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
+    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
+
+    return ia_aiq_af_run(mAiq, inputParams, results);
+}
+
+ia_err IntelAiq::awbRun(const ia_aiq_awb_input_params* inputParams, ia_aiq_awb_results** results) {
+    LOG2("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
+    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
+
+    return ia_aiq_awb_run(mAiq, inputParams, results);
+}
+
+ia_err IntelAiq::gbceRun(const ia_aiq_gbce_input_params* inputParams,
+                         ia_aiq_gbce_results** results) {
+    LOG2("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
+    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
+
+    return ia_aiq_gbce_run(mAiq, inputParams, results);
+}
+
+ia_err IntelAiq::paRunV1(const ia_aiq_pa_input_params* inputParams,
+                         ia_aiq_pa_results_v1** results) {
+    LOG2("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
+    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
+
+    return ia_aiq_pa_run_v1(mAiq, inputParams, results);
+}
+
+ia_err IntelAiq::saRunV2(const ia_aiq_sa_input_params_v1* inputParams,
+                         ia_aiq_sa_results_v1** results) {
+    LOG2("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
+    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
+
+    return ia_aiq_sa_run_v2(mAiq, inputParams, results);
+}
+
+ia_err IntelAiq::statisticsSetV4(const ia_aiq_statistics_input_params_v4* inputParams) {
+    LOG2("@%s, inputParams:%p", __func__, inputParams);
+    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
+
+    return ia_aiq_statistics_set_v4(mAiq, inputParams);
+}
+
+ia_err IntelAiq::getAiqdData(ia_binary_data* outData) {
+    LOG2("@%s, outData:%p", __func__, outData);
+    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
+    CheckError(!outData, ia_err_argument, "@%s, outData is nullptr", __func__);
+
+    return ia_aiq_get_aiqd_data(mAiq, outData);
+}
+
+void IntelAiq::deinit() {
+    LOG2("@%s", __func__);
+    CheckError(!mAiq, VOID_VALUE, "@%s, mAiq is nullptr", __func__);
+
+    ia_aiq_deinit(mAiq);
+}
+
+void IntelAiq::getVersion(std::string* version) {
+    LOG2("@%s", __func__);
+
+    *version = std::string(ia_aiq_get_version());
+}
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.h
new file mode 100644
index 000000000000..4ff9deffa6eb
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_aiq.h>
+#include <ia_types.h>
+
+#include <string>
+
+namespace icamera {
+class IntelAiq {
+ public:
+    IntelAiq();
+    virtual ~IntelAiq();
+
+    // the return pointer (ia_aiq*) is just valid in the sandboxing process.
+    ia_aiq* init(const ia_binary_data* aiqbData,
+                 const ia_binary_data* nvmData,
+                 const ia_binary_data* aiqdData,
+                 unsigned int statsMaxWidth,
+                 unsigned int statsMaxHeight,
+                 unsigned int maxNumStatsIn,
+                 ia_cmc_t* cmc,
+                 ia_mkn* mkn);
+    ia_err aeRun(const ia_aiq_ae_input_params* inputParams, ia_aiq_ae_results** results);
+    ia_err afRun(const ia_aiq_af_input_params* inputParams, ia_aiq_af_results** results);
+    ia_err awbRun(const ia_aiq_awb_input_params* inputParams, ia_aiq_awb_results** results);
+    ia_err gbceRun(const ia_aiq_gbce_input_params* inputParams, ia_aiq_gbce_results** results);
+    ia_err paRunV1(const ia_aiq_pa_input_params* inputParams, ia_aiq_pa_results_v1** results);
+    ia_err saRunV2(const ia_aiq_sa_input_params_v1* inputParams, ia_aiq_sa_results_v1** results);
+    ia_err statisticsSetV4(const ia_aiq_statistics_input_params_v4* inputParams);
+    ia_err getAiqdData(ia_binary_data* outData);
+    void deinit();
+    void getVersion(std::string* version);
+
+ private:
+    ia_aiq* mAiq;
+};
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.cpp
new file mode 100644
index 000000000000..949e5e306df4
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelCmc"
+
+#include "modules/algowrapper/IntelCmc.h"
+
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+IntelCmc::IntelCmc() :
+    mHandle(nullptr) {
+    LOG1("@%s", __func__);
+}
+
+IntelCmc::~IntelCmc() {
+    LOG1("@%s", __func__);
+}
+
+bool IntelCmc::init(const ia_binary_data* aiqbData, const ia_binary_data* nvmData) {
+    LOG1("@%s, aiqbData:%p, nvmData:%p", __func__, aiqbData, nvmData);
+    CheckError(!aiqbData, false, "aiqbData is nullptr");
+    CheckError(nvmData, false, "nvmData is not nullptr");  // it doesn't support nvmData currently.
+
+    mHandle = ia_cmc_parser_init_v1(aiqbData, nvmData);
+    LOG1("@%s, mHandle:%p", __func__, mHandle);
+
+    return true;
+}
+
+ia_cmc_t* IntelCmc::getCmc() const {
+    LOG1("@%s, mHandle:%p", __func__, mHandle);
+
+    return mHandle;
+}
+
+uintptr_t IntelCmc::getCmcHandle() const {
+    LOG1("@%s", __func__);
+
+    return reinterpret_cast<uintptr_t>(mHandle);
+}
+
+void IntelCmc::deinit() {
+    LOG1("@%s", __func__);
+    CheckError(!mHandle, VOID_VALUE, "mHandle is nullptr");
+
+    ia_cmc_parser_deinit(mHandle);
+}
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.h
new file mode 100644
index 000000000000..0e7391bca181
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_cmc_parser.h>
+#include <ia_cmc_types.h>
+
+namespace icamera {
+class IntelCmc {
+ public:
+    IntelCmc();
+    ~IntelCmc();
+
+    bool init(const ia_binary_data* aiqbData, const ia_binary_data* nvmData);
+
+    ia_cmc_t* getCmc() const;
+    uintptr_t getCmcHandle() const;
+
+    void deinit();
+ private:
+    ia_cmc_t* mHandle;
+};
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.cpp
new file mode 100644
index 000000000000..2bb061f84411
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.cpp
@@ -0,0 +1,190 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelDvs"
+
+#include "modules/algowrapper/IntelDvs.h"
+
+#include "AiqUtils.h"
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+IntelDvs::IntelDvs() {
+    LOG1("@%s", __func__);
+}
+
+IntelDvs::~IntelDvs() {
+    LOG1("@%s", __func__);
+}
+
+ia_err IntelDvs::init(const ia_binary_data &aiqTuningBinary,
+                      const ia_cmc_t *cmc, ia_dvs_state **dvsHandle) {
+    LOG1("@%s", __func__);
+    CheckError(!dvsHandle, ia_err_none, "@%s, dvsHandle is nullptr", __func__);
+
+    ia_err err = ia_dvs_init(dvsHandle, &aiqTuningBinary, cmc);
+    CheckError(err != ia_err_none, ia_err_general, "@%s, Failed to init dvs lib", __func__);
+    return err;
+}
+
+void IntelDvs::deinit(ia_dvs_state *dvsHandle) {
+    LOG1("@%s", __func__);
+    CheckError(!dvsHandle, VOID_VALUE, "@%s, dvsHandle is nullptr", __func__);
+
+    ia_dvs_deinit(dvsHandle);
+}
+
+ia_err IntelDvs::config(ia_dvs_state *dvsHandle, ia_dvs_configuration *config, float zoomRatio) {
+    LOG1("@%s", __func__);
+    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
+    CheckError(!config, ia_err_general, "@%s, config is nullptr", __func__);
+
+    ia_err err = ia_dvs_config(dvsHandle, config, zoomRatio);
+    CheckError(err != ia_err_none, err, "@%s, ia_dvs_config fails", __func__);
+    return err;
+}
+
+ia_err IntelDvs::setNonBlankRatio(ia_dvs_state *dvsHandle, float nonBlankingRatio) {
+    LOG1("@%s", __func__);
+    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
+
+    ia_err err = ia_dvs_set_non_blank_ratio(dvsHandle, nonBlankingRatio);
+    CheckError(err != ia_err_none, err, "@%s, ia_dvs_set_non_blank_ratio fails", __func__);
+    return err;
+}
+
+ia_err IntelDvs::setDigitalZoomMode(ia_dvs_state *dvsHandle, ia_dvs_zoom_mode zoomMode) {
+    LOG1("@%s", __func__);
+    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
+
+    ia_err err = ia_dvs_set_digital_zoom_mode(dvsHandle, zoomMode);
+    CheckError(err != ia_err_none, err, "@%s, ia_dvs_set_digital_zoom_mode fails", __func__);
+    return err;
+}
+
+ia_err IntelDvs::setDigitalZoomRegion(ia_dvs_state *dvsHandle, ia_rectangle *zoomRegion) {
+    LOG1("@%s", __func__);
+    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
+    CheckError(!zoomRegion, ia_err_general, "@%s, zoomRegion is nullptr", __func__);
+
+    ia_err err = ia_dvs_set_digital_zoom_region(dvsHandle, zoomRegion);
+    CheckError(err != ia_err_none, err, "@%s, ia_dvs_set_digital_zoom_region fails", __func__);
+    return err;
+}
+
+ia_err IntelDvs::setDigitalZoomCoordinate(ia_dvs_state *dvsHandle,
+                                          ia_coordinate *zoomCoordinate) {
+    LOG1("@%s", __func__);
+    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
+    CheckError(!zoomCoordinate, ia_err_general, "@%s, zoomCoordinate is nullptr", __func__);
+
+    ia_err err = ia_dvs_set_digital_zoom_coordinate(dvsHandle, zoomCoordinate);
+    CheckError(err != ia_err_none, err, "@%s, ia_dvs_set_digital_zoom_coordinate fails", __func__);
+    return err;
+}
+
+ia_err IntelDvs::setDigitalZoomMagnitude(ia_dvs_state *dvsHandle, float zoomRatio) {
+    LOG1("@%s", __func__);
+    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
+
+    ia_err err = ia_dvs_set_digital_zoom_magnitude(dvsHandle, zoomRatio);
+    CheckError(err != ia_err_none, err, "@%s, ia_dvs_set_digital_zoom_magnitude fails", __func__);
+    return err;
+}
+
+void IntelDvs::freeMorphTable(ia_dvs_state *dvsHandle, ia_dvs_morph_table *morphTable) {
+    LOG1("@%s, dvsHandle:%p, morphTable:%p", __func__, dvsHandle, morphTable);
+    CheckError(!morphTable, VOID_VALUE, "@%s, morphTable is nullptr", __func__);
+
+    ia_dvs_free_morph_table(morphTable);
+}
+
+ia_dvs_morph_table *IntelDvs::allocateMorphTalbe(ia_dvs_state *dvsHandle) {
+    LOG1("@%s", __func__);
+    CheckError(!dvsHandle, nullptr, "@%s, dvsHandle is nullptr", __func__);
+
+    ia_dvs_morph_table *morphTable = nullptr;
+    ia_err err = ia_dvs_allocate_morph_table(dvsHandle, &morphTable);
+    CheckError((!morphTable || err != ia_err_none), nullptr,
+               "@%s, ia_dvs_allocate_morph_table fails", __func__);
+    return morphTable;
+}
+
+int IntelDvs::getMorphTable(ia_dvs_state *dvsHandle, ia_dvs_morph_table *morphTable) {
+    LOG2("@%s", __func__);
+    CheckError(!dvsHandle, UNKNOWN_ERROR,  "@%s, dvsHandle is nullptr", __func__);
+    CheckError(!morphTable, UNKNOWN_ERROR,  "@%s, morphTable is nullptr", __func__);
+
+    ia_err err = ia_dvs_get_morph_table(dvsHandle, morphTable);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR,
+               "@%s, ia_dvs_get_morph_table fails, err:%d",  __func__, err);
+
+    return OK;
+}
+
+int IntelDvs::getMorphTable(ia_dvs_state *dvsHandle,
+                            ia_dvs_morph_table *morphTable, DvsResult *result) {
+    LOG2("@%s", __func__);
+
+    int ret = getMorphTable(dvsHandle, morphTable);
+    CheckError(ret != OK, UNKNOWN_ERROR, "@%s, getMorphTable fails",  __func__);
+
+    ret = DvsResult::deepCopyDvsResults(*morphTable, &result->mMorphTable);
+    CheckError(ret != OK, UNKNOWN_ERROR, "@%s, deepCopyDvsResults fails",  __func__);
+
+    return OK;
+}
+
+ia_err IntelDvs::setStatistics(ia_dvs_state *dvsHandle,
+                               const ia_dvs_statistics *statistics,
+                               const ia_aiq_ae_results *aeResults,
+                               const ia_aiq_af_results *afResults,
+                               const ia_aiq_sensor_events *sensorEvents,
+                               uint64_t frameReadoutStart,
+                               uint64_t frameReadoutEnd) {
+    LOG1("@%s", __func__);
+    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
+
+    ia_err err = ia_dvs_set_statistics(dvsHandle, statistics, aeResults,
+                                       afResults, sensorEvents,
+                                       frameReadoutStart, frameReadoutEnd);
+    CheckError(err != ia_err_none, ia_err_general, "@%s, ia_dvs_set_statistics fails", __func__);
+    return err;
+}
+
+ia_err IntelDvs::execute(ia_dvs_state *dvsHandle, uint16_t focusPosition) {
+    LOG1("@%s", __func__);
+    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
+
+    ia_err err = ia_dvs_execute(dvsHandle, focusPosition);
+    CheckError(err != ia_err_none, ia_err_general, "@%s, ia_dvs_execute fails", __func__);
+    return err;
+}
+
+ia_err IntelDvs::getImageTransformation(ia_dvs_state *dvsHandle,
+                                        ia_dvs_image_transformation *imageTransformation) {
+    LOG1("@%s", __func__);
+    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
+    CheckError(!imageTransformation, ia_err_general,
+               "@%s, imageTransformation is nullptr", __func__);
+
+    ia_err err = ia_dvs_get_image_transformation(dvsHandle, imageTransformation);
+    CheckError(err != ia_err_none, ia_err_general,
+               "@%s, ia_dvs_get_image_transformation fails", __func__);
+    return err;
+}
+}  /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.h
new file mode 100644
index 000000000000..27f35f7d195c
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_dvs.h>
+#include <ia_dvs_types.h>
+#include <ia_isp_bxt.h>
+
+#include "iutils/Thread.h"
+#include "iutils/Errors.h"
+
+#include "CameraEvent.h"
+#include "DvsResult.h"
+
+namespace icamera {
+class IntelDvs {
+ public:
+    IntelDvs();
+    ~IntelDvs();
+
+    ia_err init(const ia_binary_data &aiqTuningBinary,
+                const ia_cmc_t *cmc, ia_dvs_state **dvsHandle);
+    void deinit(ia_dvs_state *dvsHandle);
+    ia_err config(ia_dvs_state *dvsHandle, ia_dvs_configuration *config, float zoomRatio);
+    ia_err setNonBlankRatio(ia_dvs_state *dvsHandle, float nonBlankingRatio);
+    ia_err setDigitalZoomMode(ia_dvs_state *dvsHandle, ia_dvs_zoom_mode zoomMode);
+    ia_err setDigitalZoomRegion(ia_dvs_state *dvsHandle, ia_rectangle *zoomRegion);
+    ia_err setDigitalZoomCoordinate(ia_dvs_state *dvsHandle, ia_coordinate *zoomCoordinate);
+    ia_err setDigitalZoomMagnitude(ia_dvs_state *dvsHandle, float zoomRatio);
+    void freeMorphTable(ia_dvs_state *dvsHandle, ia_dvs_morph_table *morphTable);
+    ia_dvs_morph_table *allocateMorphTalbe(ia_dvs_state *dvsHandle);
+    int getMorphTable(ia_dvs_state *dvsHandle, ia_dvs_morph_table *morphTable);
+    int getMorphTable(ia_dvs_state *dvsHandle,
+                      ia_dvs_morph_table *morphTable, DvsResult *result);
+    ia_err setStatistics(ia_dvs_state *dvsHandle, const ia_dvs_statistics *statistics,
+                         const ia_aiq_ae_results *aeResults, const ia_aiq_af_results *afResults,
+                         const ia_aiq_sensor_events *sensorEvents, uint64_t frameReadoutStart,
+                         uint64_t frameReadoutEnd);
+    ia_err execute(ia_dvs_state *dvsHandle, uint16_t focusPosition);
+    ia_err getImageTransformation(ia_dvs_state *dvsHandle,
+                                  ia_dvs_image_transformation *imageTransformation);
+};
+}  /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.cpp
new file mode 100644
index 000000000000..dd31a6983acd
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.cpp
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelFaceDetection"
+#include "modules/algowrapper/IntelFaceDetection.h"
+
+#include <string.h>
+#include <algorithm>
+
+#include "AiqUtils.h"
+#include "iutils/CameraLog.h"
+#include "PlatformData.h"
+
+namespace icamera {
+IntelFaceDetection::IntelFaceDetection() :
+    mFDHandle(nullptr),
+    mMaxFacesNum(0) {
+    LOG1("@%s", __func__);
+}
+
+IntelFaceDetection::~IntelFaceDetection() {
+    LOG1("@%s", __func__);
+}
+
+status_t IntelFaceDetection::init(FaceDetectionInitParams *pData,
+                                  int dataSize) {
+    LOG1("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(!pData, UNKNOWN_ERROR, "pData is nullptr");
+    CheckError(dataSize < static_cast<int>(sizeof(FaceDetectionInitParams)),
+               UNKNOWN_ERROR, "buffer is small");
+
+    mMaxFacesNum = std::min(pData->max_face_num,
+                            static_cast<unsigned int>(MAX_FACES_DETECTABLE));
+    LOG2("@%s, mMaxFacesNum:%d", __func__, mMaxFacesNum);
+
+    pvl_err faceRet = pvl_face_detection_create(nullptr, &mFDHandle);
+    if (faceRet == pvl_success) {
+        return OK;
+    }
+
+    LOGE("@%s, faceRet:%d", __func__, faceRet);
+    return UNKNOWN_ERROR;
+}
+
+status_t IntelFaceDetection::deinit() {
+    LOG1("@%s", __func__);
+
+    if (mFDHandle) {
+        pvl_face_detection_destroy(mFDHandle);
+        mFDHandle = nullptr;
+    }
+    return OK;
+}
+
+void IntelFaceDetection::convertCoordinate(int faceId, int width,
+                                           int height, const pvl_rect &src,
+                                           pvl_rect *dst) {
+    CheckError(!dst, VOID_VALUE, "dst is nullptr");
+
+    const camera_coordinate_system_t iaCoordinate = {IA_COORDINATE_LEFT, IA_COORDINATE_TOP,
+                                                     IA_COORDINATE_RIGHT, IA_COORDINATE_BOTTOM};
+    const camera_coordinate_system_t faceCoordinate = {0, 0, width, height};
+
+    camera_coordinate_t topLeft =
+        AiqUtils::convertCoordinateSystem(faceCoordinate, iaCoordinate, {src.left, src.top});
+    camera_coordinate_t bottomRight =
+        AiqUtils::convertCoordinateSystem(faceCoordinate, iaCoordinate, {src.right, src.bottom});
+
+    *dst = {topLeft.x, topLeft.y, bottomRight.x, bottomRight.y};
+    LOG2("@%s, face:%d, dst left:%d, top:%d, right:%d, bottom:%d", __func__,
+         faceId, dst->left, dst->top, dst->right, dst->bottom);
+}
+
+FaceDetectionRunParams *IntelFaceDetection::prepareRunBuffer(unsigned int index) {
+    LOG1("@%s", __func__);
+    CheckError(index >= MAX_STORE_FACE_DATA_BUF_NUM, nullptr,
+               "@%s, index is error %d", __func__, index);
+    CheckError(!mFDHandle, nullptr, "mFDHandle is nullptr");
+
+    return &mMemRunBufs[index];
+}
+
+status_t IntelFaceDetection::run(pvl_image *pImage, FaceDetectionResult *fdResults) {
+    LOG1("@%s, pImage:%p", __func__, pImage);
+    CheckError(!pImage, UNKNOWN_ERROR, "pData is nullptr");
+    CheckError(!mFDHandle, UNKNOWN_ERROR, "mFDHandle is nullptr");
+
+    int32_t fdRet = pvl_face_detection_run_in_preview(mFDHandle, pImage,
+                                                      fdResults->faceResults, mMaxFacesNum);
+    fdResults->faceNum = (fdRet > 0) ? fdRet : 0;
+    LOG1("@%s, fdRet:%d, detected face number:%d, w:%d, h:%d",
+         __func__, fdRet, fdResults->faceNum, pImage->width, pImage->height);
+    for (int i = 0; i < fdResults->faceNum; i++) {
+        LOG2("@%s, face:%d rect, left:%d, top:%d, right:%d, bottom:%d", __func__, i,
+             fdResults->faceResults[i].rect.left,
+             fdResults->faceResults[i].rect.top,
+             fdResults->faceResults[i].rect.right,
+             fdResults->faceResults[i].rect.bottom);
+        LOG2("@%s, confidence:%d, rip_angle:%d, rop_angle:%d, tracking_id:%d", __func__,
+             fdResults->faceResults[i].confidence,
+             fdResults->faceResults[i].rip_angle,
+             fdResults->faceResults[i].rop_angle,
+             fdResults->faceResults[i].tracking_id);
+    }
+
+    for (int i = 0; i < fdResults->faceNum; i++) {
+        convertCoordinate(i, pImage->width, pImage->height, fdResults->faceResults[i].rect,
+                          &fdResults->faceResults[i].rect);
+    }
+
+    return OK;
+}
+
+status_t IntelFaceDetection::run(FaceDetectionRunParams *fdRunParams, int dataSize, void *addr) {
+    LOG1("@%s, fdRunParams:%p, dataSize:%d, addr:%p", __func__, fdRunParams, dataSize, addr);
+    CheckError(!fdRunParams, UNKNOWN_ERROR, "pData is nullptr");
+    CheckError(dataSize < static_cast<int>(sizeof(FaceDetectionRunParams)),
+               UNKNOWN_ERROR, "buffer is small");
+    CheckError(!mFDHandle, UNKNOWN_ERROR, "mFDHandle is nullptr");
+
+    pvl_image image;
+    image.size = fdRunParams->size;
+    image.width = fdRunParams->width;
+    image.height = fdRunParams->height;
+    image.format = fdRunParams->format;
+    image.stride = fdRunParams->stride;
+    image.rotation = fdRunParams->rotation;
+    if (addr) {
+        image.data = const_cast<uint8_t*>(static_cast<uint8_t*>(addr));
+    } else {
+        image.data = const_cast<uint8_t*>(fdRunParams->data);
+    }
+
+    return run(&image, &fdRunParams->results);
+}
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.h
new file mode 100644
index 000000000000..b990dd684504
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+#include <memory>
+
+#include "FaceBase.h"
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+class IntelFaceDetection {
+ public:
+    IntelFaceDetection();
+    ~IntelFaceDetection();
+
+    status_t init(FaceDetectionInitParams *initData, int dataSize);
+    status_t deinit();
+    status_t run(pvl_image *pImage, FaceDetectionResult *fdResults);
+    status_t run(FaceDetectionRunParams *fdRunParams, int dataSize, void *addr = nullptr);
+    FaceDetectionRunParams *prepareRunBuffer(unsigned int index);
+
+ private:
+    pvl_face_detection *mFDHandle;
+    unsigned int mMaxFacesNum;
+    FaceDetectionRunParams mMemRunBufs[MAX_STORE_FACE_DATA_BUF_NUM];
+    void convertCoordinate(int faceId, int width, int height, const pvl_rect &src, pvl_rect *dst);
+
+    DISALLOW_COPY_AND_ASSIGN(IntelFaceDetection);
+};
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.cpp
new file mode 100644
index 000000000000..827af3cf8a2a
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.cpp
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelIspParamAdaptor"
+
+#include "modules/algowrapper/IntelIspParamAdaptor.h"
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+
+IntelIspParamAdaptor::IntelIspParamAdaptor() {
+    LOG2("@%s", __func__);
+}
+
+IntelIspParamAdaptor::~IntelIspParamAdaptor() {
+    LOG2("@%s", __func__);
+}
+
+ia_isp_bxt *IntelIspParamAdaptor::init(const ia_binary_data *ispData, const ia_cmc_t *iaCmc,
+                                       unsigned int maxStatsWidth, unsigned int maxStatsHeight,
+                                       unsigned int maxNumStatsIn, ia_mkn *iaMkn) {
+    LOG2("@%s", __func__);
+    CheckError(!ispData || !iaCmc, nullptr, "%s, No CPF or CMC data", __func__);
+    LOG1("%s, ispData size: %d, pointer: %p, max width: %u, max height: %u",
+         __func__, ispData->size, ispData->data, maxStatsWidth, maxStatsHeight);
+
+    return ia_isp_bxt_init(ispData, iaCmc, maxStatsWidth, maxStatsHeight, maxNumStatsIn, iaMkn);
+}
+
+void IntelIspParamAdaptor::deInit(ia_isp_bxt *ispBxtHandle) {
+    LOG2("@%s", __func__);
+    CheckError(!ispBxtHandle, VOID_VALUE, "%s, ispBxtHandle is nullptr", __func__);
+
+    ia_isp_bxt_deinit(ispBxtHandle);
+}
+
+int IntelIspParamAdaptor::getPalDataSize(ia_isp_bxt_program_group *programGroup) {
+    LOG2("@%s", __func__);
+    CheckError(!programGroup, -1, "%s programGroup is nullptr", __func__);
+
+    return ia_isp_bxt_get_output_size(programGroup);
+}
+
+void IntelIspParamAdaptor::freePalBuffer(void *addr) {
+    LOG2("@%s addr: %p", __func__, addr);
+    free(addr);
+}
+
+void *IntelIspParamAdaptor::allocatePalBuffer(int streamId, int index, int palDataSize) {
+    LOG2("@%s index: %d, streamId: %d, size: %d", __func__, index, streamId, palDataSize);
+
+    return calloc(1, palDataSize);
+}
+
+status_t IntelIspParamAdaptor::runPal(ia_isp_bxt *ispBxtHandle,
+                                      const ia_isp_bxt_input_params_v2 *inputParams,
+                                      ia_binary_data *outputData) {
+    LOG2("@%s", __func__);
+    CheckError((!ispBxtHandle || !inputParams), UNKNOWN_ERROR,
+               "%s, ispBxtHandle or inputParams is nullptr", __func__);
+    CheckError((!outputData || !outputData->data || outputData->size <= 0),
+               UNKNOWN_ERROR, "%s, Wrong pal data buffer", __func__);
+
+    ia_err ret = ia_isp_bxt_run_v2(ispBxtHandle, inputParams, outputData);
+    CheckError(ret != ia_err_none, UNKNOWN_ERROR,
+               "%s, isp parameters adaptor run failed %d", __func__, ret);
+    LOG1("%s, The pal result size: %d", __func__, outputData->size);
+
+    return OK;
+}
+
+status_t IntelIspParamAdaptor::queryAndConvertStats(
+        ia_isp_bxt *ispBxtHandle,
+        ConvertInputParam *inputParams, ConvertResult *result) {
+    LOG2("@%s", __func__);
+    CheckError(!ispBxtHandle, UNKNOWN_ERROR, "%s, ispBxtHandle is nullptr", __func__);
+    CheckError(!inputParams || !result,
+               UNKNOWN_ERROR, "%s, inputParams or result nullptr", __func__);
+    CheckError(!inputParams->dvsReso || !inputParams->aeResults,
+               UNKNOWN_ERROR, "%s, inputParams or result nullptr", __func__);
+    CheckError((!inputParams->statsBuffer ||
+               !inputParams->statsBuffer->data || inputParams->statsBuffer->size <= 0),
+               UNKNOWN_ERROR, "%s, Wrong statistics buffer", __func__);
+    CheckError(!result->queryResults, UNKNOWN_ERROR, "%s, queryResults is nullptr", __func__);
+
+    ia_err ret = ia_isp_bxt_statistics_query(ispBxtHandle,
+                                             inputParams->statsBuffer, result->queryResults);
+    CheckError(ret != ia_err_none, UNKNOWN_ERROR, "%s, Query statistice failed %d", __func__, ret);
+
+    // Decode DVS statistics
+    if (result->queryResults->dvs_stats) {
+        if (inputParams->dvsReso->width == 0 || inputParams->dvsReso->height == 0) {
+            LOGW("%s, The gdc resolution for DVS isn't correct", __func__);
+        } else {
+            ret = ia_isp_bxt_statistics_convert_dvs_from_binary(
+                    ispBxtHandle, inputParams->statsBuffer, inputParams->dvsReso->width,
+                    inputParams->dvsReso->height, &(result->dvsStats));
+            CheckWarning((ret != ia_err_none || !result->dvsStats), UNKNOWN_ERROR,
+                         "%s, Failed to convert DVS statistics %d", __func__, ret);
+            LOG3A("%s, DVS stat vector_count: %u", __func__, result->dvsStats->vector_count);
+        }
+    }
+
+    // Decode psa rgbs and af statistics
+    if (result->queryResults->rgbs_grid &&
+        result->queryResults->af_grid && !inputParams->multiExpo) {
+        ret = ia_isp_bxt_statistics_convert_awb_from_binary_v3(
+                  ispBxtHandle, inputParams->statsBuffer, nullptr,
+                  inputParams->aeResults, inputParams->bcompResult, result->rgbsGrid, nullptr);
+
+        ia_aiq_rgbs_grid *rgbs = *(result->rgbsGrid);
+        CheckWarning((ret != ia_err_none || !rgbs), UNKNOWN_ERROR,
+                      "%s, Failed to convert psa RGBS statistics %d", __func__, ret);
+        LOG3A("%s, RGBS stat grid %dx%d", __func__, rgbs->grid_width, rgbs->grid_height);
+
+        ret = ia_isp_bxt_statistics_convert_af_from_binary(
+                  ispBxtHandle, inputParams->statsBuffer, &(result->afGrid));
+        CheckWarning((ret != ia_err_none || !result->afGrid), UNKNOWN_ERROR,
+                     "%s, Failed to convert psa AF statistics %d", __func__, ret);
+        LOG3A("%s, AF stat grid %dx%d", __func__,
+              result->afGrid->grid_width, result->afGrid->grid_height);
+    }
+
+    return OK;
+}
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.h
new file mode 100644
index 000000000000..56af85d76800
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "modules/algowrapper/StatsTypes.h"
+
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+
+namespace icamera {
+
+class IntelIspParamAdaptor {
+ public:
+    IntelIspParamAdaptor();
+    virtual ~IntelIspParamAdaptor();
+
+    ia_isp_bxt *init(const ia_binary_data *ispData, const ia_cmc_t *iaCmc,
+                     unsigned int maxStatsWidth, unsigned int maxStatsHeight,
+                     unsigned int maxNumStatsIn, ia_mkn *iaMkn);
+    void deInit(ia_isp_bxt *ispBxtHandle);
+    int getPalDataSize(ia_isp_bxt_program_group *programGroup);
+
+    void *allocatePalBuffer(int streamId, int index, int palDataSize);
+    void freePalBuffer(void *addr);
+    status_t runPal(ia_isp_bxt *ispBxtHandle,
+                    const ia_isp_bxt_input_params_v2 *inputParams, ia_binary_data *outputData);
+    status_t queryAndConvertStats(ia_isp_bxt *ispBxtHandle,
+                                  ConvertInputParam *inputParams, ConvertResult *result);
+};
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelLard.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelLard.cpp
new file mode 100644
index 000000000000..d1bf016f103f
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelLard.cpp
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelLard"
+
+#include "modules/algowrapper/IntelLard.h"
+
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+IntelLard::IntelLard() {
+    LOG1("@%s", __func__);
+}
+
+IntelLard::~IntelLard() {
+    LOG1("@%s", __func__);
+}
+
+ia_lard* IntelLard::init(const ia_binary_data *lard_data_ptr) {
+    LOG1("@%s", __func__);
+    CheckError(!lard_data_ptr, nullptr, "lard_data_ptr is nullptr");
+    LOG1("@%s, lard_data_ptr, data:%p, size:%d",
+         __func__, lard_data_ptr->data, lard_data_ptr->size);
+
+    ia_lard* lard = ia_lard_init(lard_data_ptr);
+    LOG1("@%s, lard:%p", __func__, lard);
+
+    return lard;
+}
+
+ia_err IntelLard::getTagList(ia_lard* ia_lard_ptr, unsigned int mode_tag,
+                             unsigned int* num_tags, const unsigned int** tags) {
+    LOG1("@%s", __func__);
+    CheckError(!ia_lard_ptr, ia_err_general, "ia_lard_ptr is nullptr");
+    CheckError(!num_tags, ia_err_general, "num_tags is nullptr");
+    CheckError(!tags, ia_err_general, "tags is nullptr");
+
+    return ia_lard_get_tag_list(ia_lard_ptr, mode_tag, num_tags, tags);
+}
+
+ia_err IntelLard::run(ia_lard* ia_lard_ptr, ia_lard_input_params* lard_input_params_ptr,
+                      ia_lard_results** lard_results_ptr) {
+    LOG1("@%s", __func__);
+    CheckError(!ia_lard_ptr, ia_err_general, "ia_lard_ptr is nullptr");
+    CheckError(!lard_input_params_ptr, ia_err_general, "lard_input_params_ptr is nullptr");
+    CheckError(!lard_results_ptr, ia_err_general, "lard_results_ptr is nullptr");
+
+    return ia_lard_run(ia_lard_ptr, lard_input_params_ptr, lard_results_ptr);
+}
+
+void IntelLard::deinit(ia_lard* ia_lard_ptr) {
+    LOG1("@%s", __func__);
+    CheckError(!ia_lard_ptr, VOID_VALUE, "ia_lard_ptr is nullptr");
+
+    ia_lard_deinit(ia_lard_ptr);
+}
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelLard.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelLard.h
new file mode 100644
index 000000000000..f9a15f22a1a9
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelLard.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_lard.h>
+
+namespace icamera {
+class IntelLard {
+ public:
+  IntelLard();
+  ~IntelLard();
+
+  ia_lard* init(const ia_binary_data* lard_data_ptr);
+  ia_err getTagList(ia_lard* ia_lard_ptr, unsigned int mode_tag,
+                    unsigned int* num_tags, const unsigned int** tags);
+  ia_err run(ia_lard* ia_lard_ptr, ia_lard_input_params* lard_input_params_ptr,
+             ia_lard_results** lard_results_ptr);
+  void deinit(ia_lard* ia_lard_ptr);
+};
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.cpp
new file mode 100644
index 000000000000..7859c4d6db36
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.cpp
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelLtm"
+
+#include "modules/algowrapper/IntelLtm.h"
+
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+IntelLtm::IntelLtm() {
+    LOG1("@%s", __func__);
+}
+
+IntelLtm::~IntelLtm() {
+    LOG1("@%s", __func__);
+}
+
+ia_ltm *IntelLtm::init(const ia_binary_data *lard_data_ptr, ia_mkn *mkn) {
+    LOG1("%s", __func__);
+    CheckError(!lard_data_ptr, nullptr, "@%s, lard_data_ptr is null", __func__);
+
+    ia_ltm *ltm = ia_ltm_init(lard_data_ptr, mkn);
+    CheckError(!ltm , nullptr, "@%s, ia_ltm_init fails", __func__);
+
+    return ltm;
+}
+
+void IntelLtm::deinit(ia_ltm *ltm) {
+    LOG1("%s", __func__);
+    CheckError(!ltm, VOID_VALUE, "@%s, ltm is null", __func__);
+
+    ia_ltm_deinit(ltm);
+}
+
+ia_err IntelLtm::run(ia_ltm *ltm, const ia_ltm_input_params *inputParams,
+                     ia_ltm_results **ltmResults,
+                     ia_ltm_drc_params **drcResults) {
+    LOG1("%s", __func__);
+    CheckError(!ltm, ia_err_general, "@%s, ltm is null", __func__);
+    CheckError(!inputParams, ia_err_general, "@%s, inputParams is null", __func__);
+    CheckError(!ltmResults, ia_err_general, "@%s, ltmResults is null", __func__);
+    CheckError(!drcResults, ia_err_general, "@%s, drcResults is null", __func__);
+
+    ia_err ret = ia_ltm_run(ltm, inputParams, ltmResults, drcResults);
+
+    return ret;
+}
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.h
new file mode 100644
index 000000000000..9199b869e57f
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_ltm.h>
+
+namespace icamera {
+class IntelLtm {
+ public:
+    IntelLtm();
+    virtual ~IntelLtm();
+
+    ia_ltm *init(const ia_binary_data *lard_data_ptr, ia_mkn *mkn);
+    ia_err run(ia_ltm *ltm, const ia_ltm_input_params *inputParams,
+               ia_ltm_results **ltmResults,
+               ia_ltm_drc_params **drcResults);
+    void deinit(ia_ltm *ltm);
+};
+}  /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.cpp
new file mode 100644
index 000000000000..e3c99cf9d058
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.cpp
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelMkn"
+
+#include "modules/algowrapper/IntelMkn.h"
+
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+IntelMkn::IntelMkn() {
+    LOG1("%s", __func__);
+}
+
+IntelMkn::~IntelMkn() {
+    LOG1("%s", __func__);
+}
+
+ia_mkn *IntelMkn::init(ia_mkn_config_bits mkn_config_bits,
+                       size_t mkn_section_1_size,
+                       size_t mkn_section_2_size) {
+    LOG1("%s", __func__);
+
+    return ia_mkn_init(mkn_config_bits, mkn_section_1_size, mkn_section_2_size);
+}
+
+int IntelMkn::enable(ia_mkn *pMkn, bool enable_data_collection) {
+    LOG1("%s", __func__);
+    CheckError(!pMkn, BAD_VALUE, "@%s, pMkn is null", __func__);
+
+    ia_err err = ia_mkn_enable(pMkn, enable_data_collection);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, call ia_mkn_enable() fails", __func__);
+
+    return OK;
+}
+
+void IntelMkn::deinit(ia_mkn *pMkn) {
+    LOG1("%s", __func__);
+    CheckError(!pMkn, VOID_VALUE, "@%s, pMkn is null", __func__);
+
+    ia_mkn_uninit(pMkn);
+}
+
+int IntelMkn::prepare(ia_mkn *pMkn, ia_mkn_trg data_target, ia_binary_data *binaryData) {
+    LOG1("%s", __func__);
+    CheckError(!pMkn, BAD_VALUE, "@%s, pMkn is null", __func__);
+
+    *binaryData = ia_mkn_prepare(pMkn, data_target);
+    CheckError(binaryData->size == 0 || binaryData->data == nullptr, NO_MEMORY,
+               "@%s, binaryData->size:%d, binaryData->data:%p, error!", __func__,
+               binaryData->size, binaryData->data);
+
+    return OK;
+}
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.h
new file mode 100644
index 000000000000..62a556b2085e
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_mkn_types.h>
+#include <ia_mkn_encoder.h>
+
+namespace icamera {
+class IntelMkn {
+ public:
+    IntelMkn();
+    ~IntelMkn();
+
+    ia_mkn *init(ia_mkn_config_bits mkn_config_bits,
+                 size_t mkn_section_1_size,
+                 size_t mkn_section_2_size);
+    void deinit(ia_mkn *pMkn);
+    int prepare(ia_mkn *pMkn, ia_mkn_trg data_target, ia_binary_data *binaryData);
+    int enable(ia_mkn *pMkn, bool enable_data_collection);
+};
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.cpp
new file mode 100644
index 000000000000..3595573e1e88
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.cpp
@@ -0,0 +1,1266 @@
+/*
+ * Copyright (C) 2018-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelPGParam"
+
+#include "modules/algowrapper/IntelPGParam.h"
+
+#include <algorithm>
+
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+
+IntelPGParam::IntelPGParam(int pgId) :
+        mPgId(pgId),
+        mTerminalCount(0),
+        mFragmentCount(0),
+        mFragmentDesc(nullptr),
+        mFragmentConfig(nullptr),
+        mP2pHandle(nullptr),
+        mPgManifest(nullptr),
+        mProcessGroup(nullptr),
+        mProgramControlInitTerminalIndex(-1),
+        mProcessGroupMemory(nullptr) {
+    CLEAR(mP2pCacheBuffer);
+    CLEAR(mPgReqs);
+    CLEAR(mParamPayloads);
+}
+
+IntelPGParam::~IntelPGParam() {
+    if (mFragmentDesc) {
+        delete []mFragmentDesc;
+    }
+    if (mFragmentConfig) {
+        delete mFragmentConfig;
+    }
+
+    for (int i = 0; i < mTerminalCount; i++) {
+        if (mPgReqs.terminals[i].kernelOrder) {
+            delete[] mPgReqs.terminals[i].kernelOrder;
+        }
+    }
+
+    destroyPayloads();
+    destroyPGBuffer();
+}
+
+int IntelPGParam::init(ia_p2p_platform_t platform, const PgConfiguration& pgConfig) {
+    mP2pHandle = ia_p2p_init(platform);
+    CheckError(!mP2pHandle, UNKNOWN_ERROR, "ia_p2p_init has failed");
+
+    mP2pCacheBuffer.size = ia_p2p_get_cache_buffer_size(mP2pHandle);
+    mP2pCacheBuffer.data = IA_CIPR_CALLOC(1, mP2pCacheBuffer.size);
+    LOG1("%s: mP2pCacheBuffer.size=%d", __func__, mP2pCacheBuffer.size);
+    CheckError(!mP2pCacheBuffer.data, UNKNOWN_ERROR, "Failed to allocate P2P cache buffer.");
+
+    mPgManifest = pgConfig.pgManifest;
+    mDisableDataTermials = pgConfig.disableDataTermials;
+    mTerminalCount = ia_css_program_group_manifest_get_terminal_count(mPgManifest);
+
+    mFragmentCount = pgConfig.fragmentCount;
+    mInputMainFrame = pgConfig.inputMainFrame;
+    mOutputMainFrame = pgConfig.outputMainFrame;
+
+    return OK;
+}
+
+int IntelPGParam::calcFragmentDescriptors(int fragmentCount,
+                                          const PgFrameDesc& inputMainFrame,
+                                          const PgFrameDesc& outputMainFrame,
+                                          const ia_css_rbm_t* rbm) {
+    if (mFragmentDesc) {
+        delete []mFragmentDesc;
+        mFragmentDesc = nullptr;
+    }
+
+    delete mFragmentConfig;
+    mFragmentConfig = nullptr;
+
+    mFragmentDesc = new ia_p2p_fragment_desc[FRAG_TERM_TYPE_COUNT * fragmentCount];
+    memset(mFragmentDesc, 0x0, sizeof(ia_p2p_fragment_desc) * FRAG_TERM_TYPE_COUNT * fragmentCount);
+    if (fragmentCount <= 1) {
+        ia_p2p_fragment_desc desc;
+        desc.fragment_width = inputMainFrame.width;
+        desc.fragment_height = inputMainFrame.height;
+        desc.fragment_start_x = 0;
+        desc.fragment_start_y = 0;
+        for (int i = 0; i < FRAG_TERM_TYPE_COUNT; i++) {
+            mFragmentDesc[i] = desc;
+        }
+    }
+
+    mFragmentConfig = new ia_p2p_fragment_configuration_t;
+    CLEAR(*mFragmentConfig);
+    int ret = ia_p2p_calculate_fragments_rbm(mP2pHandle,
+                                             mPgId,
+                                             (unsigned int)fragmentCount,
+                                             rbm,
+                                             nullptr,  // only for IA_P2P_PLATFORM_IPU6 now
+                                             mFragmentConfig);
+
+    dumpFragmentDesc(fragmentCount);
+    return ret;
+}
+
+static int kernel_id_ffs(ia_css_kernel_bitmap_t bitmap) {
+    int n = 0;
+    if (ia_css_is_kernel_bitmap_empty(bitmap))
+        return -1;
+    while (!ia_css_is_kernel_bitmap_set(bitmap, (unsigned int)n))
+        n++;
+    return n;
+}
+
+int IntelPGParam::getFragmentDescriptors(int descCount, ia_p2p_fragment_desc* descs) {
+    CheckError(descCount < mTerminalCount * mFragmentCount, BAD_VALUE,
+               "descCount is small", descCount);
+
+    int descLen = sizeof(ia_p2p_fragment_desc) * mFragmentCount;
+    int terminalCount = ia_css_process_group_get_terminal_count(mProcessGroup);
+    for (int i = 0; i < terminalCount; i++) {
+        ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, i);
+        int termIdx = terminal->tm_index;
+        if ((mPgReqs.terminals[termIdx].type != IA_CSS_TERMINAL_TYPE_DATA_OUT) &&
+            (mPgReqs.terminals[termIdx].type != IA_CSS_TERMINAL_TYPE_DATA_IN)) {
+            continue;
+        }
+
+        if (mFragmentConfig) {
+            int kernelId = kernel_id_ffs(mPgReqs.terminals[termIdx].kernelBitmap);
+            CheckError((kernelId < 0 || kernelId >= IA_CSS_KERNEL_BITMAP_BITS), -1,
+                       "error terminal %d", termIdx);
+            MEMCPY_S(&descs[termIdx * mFragmentCount], descLen,
+                     mFragmentConfig->pixel_fragment_descs[kernelId], descLen);
+            LOG2("PG %d: Terminal %d: selected fragment desc (<%d,%d> %dx%d) with kernel id %d",
+                 mPgId,
+                 termIdx,
+                 descs[termIdx].fragment_start_x,
+                 descs[termIdx].fragment_start_y,
+                 descs[termIdx].fragment_width,
+                 descs[termIdx].fragment_height,
+                 kernelId);
+        } else {
+            /* PG uses legacy fragment calculation logic */
+            MEMCPY_S(&descs[termIdx * mFragmentCount], descLen,
+                     mPgReqs.terminals[termIdx].fragment_descs, descLen);
+            LOG2("PG %d: Terminal %d: selected legacy fragment descriptor (<%d,%d> %dx%d)",
+                 mPgId,
+                 termIdx,
+                 descs[termIdx].fragment_start_x,
+                 descs[termIdx].fragment_start_y,
+                 descs[termIdx].fragment_width,
+                 descs[termIdx].fragment_height);
+        }
+    }
+    return mFragmentCount;
+}
+
+int IntelPGParam::prepare(const ia_binary_data* ipuParameters, const ia_css_rbm_t* rbm,
+                          ia_css_kernel_bitmap_t* bitmap) {
+    CheckError(ipuParameters == nullptr || bitmap == nullptr, BAD_VALUE,
+               "The input paramter is nullptr.");
+
+    ia_css_terminal_type_t terminalType;
+    int8_t termIndex;
+    int kernelId = 0;
+
+    ia_err err = ia_p2p_parse(mP2pHandle, ipuParameters, mP2pCacheBuffer.data);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "Failed to parse PAL data.");
+
+    int ret = calcFragmentDescriptors(mFragmentCount, mInputMainFrame, mOutputMainFrame, rbm);
+    CheckError(ret != OK, ret, "Failed to calc fragment desc.");
+
+    int outputDataTerminalCount = FRAG_TERM_TYPE_OUTPUT_START;
+    for (termIndex = 0; termIndex < mTerminalCount; termIndex++) {
+        ia_css_terminal_manifest_t* terminalManifest =
+            ia_css_program_group_manifest_get_term_mnfst(mPgManifest, (unsigned int)termIndex);
+        CheckError(!terminalManifest, css_err_internal,
+                   "No terminal manifest for terminal %d", termIndex);
+
+        terminalType = ia_css_terminal_manifest_get_type(terminalManifest);
+        mPgReqs.terminals[termIndex].type = terminalType;
+        mPgReqs.terminals[termIndex].kernelOrder = nullptr;
+        size_t kernelInfoSize = PSYS_MAX_KERNELS_PER_PG * sizeof(IpuPgTerminalKernelInfo);
+
+        switch (terminalType) {
+            case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
+            case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT: {
+                ia_css_param_terminal_manifest_t* paramMani =
+                    reinterpret_cast<ia_css_param_terminal_manifest_t*>(terminalManifest);
+                mPgReqs.terminals[termIndex].kernelOrder =
+                    new IpuPgTerminalKernelInfo[PSYS_MAX_KERNELS_PER_PG];
+                memset(mPgReqs.terminals[termIndex].kernelOrder, UINT8_MAX, kernelInfoSize);
+                ret = getKernelOrderForParamCachedInTerm(paramMani,
+                                                    mPgReqs.terminals[termIndex].kernelOrder);
+                CheckError(ret != css_err_none, ret,
+                           "getKernelOrderForParamCachedInTerm failed");
+                 break;
+            }
+            case IA_CSS_TERMINAL_TYPE_PROGRAM: {
+                ia_css_program_terminal_manifest_t* proMani =
+                    reinterpret_cast<ia_css_program_terminal_manifest_t*>(terminalManifest);
+                mPgReqs.terminals[termIndex].kernelOrder =
+                    new IpuPgTerminalKernelInfo[PSYS_MAX_KERNELS_PER_PG];
+                memset(mPgReqs.terminals[termIndex].kernelOrder, UINT8_MAX, kernelInfoSize);
+                ret = getKernelOrderForProgramTerm(proMani,
+                                                   mPgReqs.terminals[termIndex].kernelOrder);
+                CheckError(ret != css_err_none, ret, "getKernelOrderForProgramTerm failed");
+                break;
+            }
+            case IA_CSS_TERMINAL_TYPE_DATA_IN: {
+                ia_css_data_terminal_manifest_t* dataMani =
+                    reinterpret_cast<ia_css_data_terminal_manifest_t*>(terminalManifest);
+                /**
+                 *Save the kernel bitmaps so that it can later be determined
+                 * whether the terminals are disabled or not.
+                 */
+                mPgReqs.terminals[termIndex].kernelBitmap =
+                    ia_css_data_terminal_manifest_get_kernel_bitmap(dataMani);
+                if (!mFragmentConfig) {
+                    mPgReqs.terminals[termIndex].fragment_descs =
+                        &mFragmentDesc[FRAG_TERM_TYPE_INPUT * mFragmentCount];
+                }
+                break;
+            }
+            case IA_CSS_TERMINAL_TYPE_DATA_OUT: {
+                ia_css_data_terminal_manifest_t* dataMani =
+                    reinterpret_cast<ia_css_data_terminal_manifest_t*>(terminalManifest);
+                /**
+                 * Save the kernel bitmaps so that it can later be determined
+                 * whether the terminals are disabled or not.
+                 */
+                mPgReqs.terminals[termIndex].kernelBitmap =
+                    ia_css_data_terminal_manifest_get_kernel_bitmap(dataMani);
+                if (!mFragmentConfig) {
+                    mPgReqs.terminals[termIndex].fragment_descs =
+                        &mFragmentDesc[outputDataTerminalCount * mFragmentCount];
+                    outputDataTerminalCount++;
+                }
+                break;
+            }
+            case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
+            case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT: {
+                ia_css_spatial_param_terminal_manifest_t* paramMani =
+                    reinterpret_cast<ia_css_spatial_param_terminal_manifest_t*>
+                    (terminalManifest);
+                kernelId = (int32_t)(paramMani->kernel_id);
+                mPgReqs.terminals[termIndex].kernelBitmap =
+                    ia_css_kernel_bit_mask((uint32_t)kernelId);
+                break;
+            }
+            case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
+                /* Calculate the payload later when the final bitmask is known,
+                 * in imaging_pipe_ctrl_identify_property, where it is actually
+                 * needed. Just save here the index to the terminal. */
+                mProgramControlInitTerminalIndex = termIndex;
+                break;
+            default:
+                break;
+        }
+    }
+
+    mPgReqs.terminalCount = mTerminalCount;
+
+    ia_css_kernel_bitmap_t kernelBitmap = ia_p2p_get_kernel_bitmap(mP2pHandle, mPgId);
+    kernelBitmap = ia_css_kernel_bitmap_intersection(kernelBitmap,
+        ia_css_program_group_manifest_get_kernel_bitmap(mPgManifest));
+
+    while (!ia_css_is_kernel_bitmap_empty(kernelBitmap)) {
+        kernelId = getKernelIdByBitmap(kernelBitmap);
+        CheckError((kernelId < 0 || kernelId >= PSYS_MAX_KERNELS_PER_PG), ia_err_internal,
+                   "kernelId is out of range! %d", kernelId);
+
+        /* Get terminal requirements */
+        ret = ia_p2p_get_kernel_terminal_requirements(mP2pHandle, mPgId,
+                                               (uint32_t) kernelId, &mKernel.mSections[kernelId]);
+        CheckError(ret != ia_err_none, ret, "%s: failed to get requirements for pg %d kernel %d",
+            __func__, mPgId, kernelId);
+
+        /* Get payload descriptor */
+        ret = ia_p2p_get_kernel_payload_desc(mP2pHandle, mPgId, (uint32_t) kernelId,
+#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
+                          1,
+#else
+                          mFragmentCount,
+#endif
+                          (mFragmentConfig ? mFragmentConfig->pixel_fragment_descs[kernelId]
+                                           : &mFragmentDesc[FRAG_TERM_TYPE_INPUT * mFragmentCount]),
+                          &mKernel.mPayloads[kernelId]);
+        CheckError(ret != ia_err_none, ret, "%s: failed to get payload for pg %d kernel %d, ret %d",
+            __func__, mPgId, kernelId, ret);
+
+        uint8_t kernelOrder = 0;
+        termIndex = -1;
+        if (mKernel.mSections[kernelId].param_in_section_count) {
+            terminalType = IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN;
+
+            /* P2P assumes single CACHED IN, cumulate to first */
+            termIndex = terminalEnumerateByType(&mPgReqs, terminalType, 0);
+            CheckError(termIndex < 0, ia_err_internal, "No PARAM_CACHED_IN according to manifest!");
+            if (isKernelIdInKernelOrder(&mPgReqs, termIndex, kernelId, &kernelOrder)) {
+                if (mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].sections
+                    != mKernel.mSections[kernelId].param_in_section_count) {
+                    LOGW("%s: p2p cached in section count differs (kernel_id:%i p2p:%d vs pg:%d)",
+                         __func__, kernelId,
+                         mKernel.mSections[kernelId].param_in_section_count,
+                         mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].sections);
+                    /* Overwrite P2P requirements with manifest */
+                    mKernel.mSections[kernelId].param_in_section_count =
+                        mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].sections;
+                    mKernel.mPayloads[kernelId].param_in_payload_size =
+                        std::max(mKernel.mPayloads[kernelId].param_in_payload_size,
+                            mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].size);
+                    mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].initialize = true;
+                }
+                processTerminalKernelRequirements(&mPgReqs, termIndex, terminalType, kernelId);
+            }
+        }
+
+        if (mKernel.mSections[kernelId].param_out_section_count_per_fragment) {
+            terminalType = IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT;
+            for (termIndex = 0; termIndex < mTerminalCount; termIndex++) {
+                if (mPgReqs.terminals[termIndex].type != terminalType) {
+                    continue;
+                }
+
+                if (isKernelIdInKernelOrder(&mPgReqs, termIndex, kernelId, nullptr)) {
+                    processTerminalKernelRequirements(&mPgReqs, termIndex, terminalType, kernelId);
+                }
+            }
+        }
+
+        if (mKernel.mSections[kernelId].program_section_count_per_fragment) {
+            terminalType = IA_CSS_TERMINAL_TYPE_PROGRAM;
+            for (termIndex = 0; termIndex < mTerminalCount; termIndex++) {
+                if (mPgReqs.terminals[termIndex].type != terminalType) {
+                    continue;
+                }
+                if (isKernelIdInKernelOrder(&mPgReqs, termIndex, kernelId, &kernelOrder)) {
+                    if (mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].sections !=
+                        mKernel.mSections[kernelId].program_section_count_per_fragment) {
+                        LOGW("%s: p2p program section count differs (kernel_id:%i p2p:%d vs pg:%d)",
+                             __func__, kernelId,
+                             mKernel.mSections[kernelId].program_section_count_per_fragment,
+                             mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].sections);
+                        /* Overwrite P2P requirements with manifest */
+                        mKernel.mSections[kernelId].program_section_count_per_fragment =
+                            mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].sections;
+                        mKernel.mPayloads[kernelId].program_payload_size =
+                            std::max(mKernel.mPayloads[kernelId].program_payload_size,
+                                mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].size);
+                        mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].initialize = true;
+                    }
+                    processTerminalKernelRequirements(&mPgReqs, termIndex, terminalType, kernelId);
+                }
+            }
+        }
+
+        /* P2P assumes each spatial kernel parameter has its own terminal */
+        if (mKernel.mSections[kernelId].spatial_param_in_section_count) {
+            terminalType = IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN;
+            termIndex = terminalEnumerateByBitmap(&mPgReqs, terminalType,
+                                                  ia_css_kernel_bit_mask((uint32_t)kernelId));
+            if (termIndex < 0) {
+                LOG1("%s: No PARAM_SPATIAL_IN for kernel id %d according to manifest!",
+                     __func__, kernelId);
+            } else if (isKernelIdInKernelOrder(&mPgReqs, termIndex, kernelId, nullptr)) {
+                 mPgReqs.terminals[termIndex].sectionCount +=
+                     mKernel.mSections[kernelId].spatial_param_in_section_count;
+                 mPgReqs.terminals[termIndex].payloadSize +=
+                     mKernel.mPayloads[kernelId].spatial_param_in_payload_size;
+                mPgReqs.terminals[termIndex].kernelBitmap =
+                     ia_css_kernel_bit_mask((uint32_t)kernelId);
+             }
+        }
+
+        if (mKernel.mSections[kernelId].spatial_param_out_section_count) {
+            terminalType = IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT;
+            termIndex = terminalEnumerateByBitmap(&mPgReqs, terminalType,
+                                                  ia_css_kernel_bit_mask((uint32_t)kernelId));
+            if (termIndex < 0) {
+                LOG1("%s: No PARAM_SPATIAL_OUT for kernel id %d according to manifest!",
+                     __func__, kernelId);
+            } else if (isKernelIdInKernelOrder(&mPgReqs, termIndex, kernelId, nullptr)) {
+                 mPgReqs.terminals[termIndex].sectionCount +=
+                     mKernel.mSections[kernelId].spatial_param_out_section_count;
+                 mPgReqs.terminals[termIndex].payloadSize +=
+                     mKernel.mPayloads[kernelId].spatial_param_out_payload_size;
+                mPgReqs.terminals[termIndex].kernelBitmap =
+                     ia_css_kernel_bit_mask((uint32_t)kernelId);
+             }
+        }
+
+        kernelBitmap = ia_css_kernel_bitmap_unset(kernelBitmap, (uint32_t)kernelId);
+    }
+
+    /* get all kernel bits back */
+    kernelBitmap = ia_css_program_group_manifest_get_kernel_bitmap(mPgManifest);
+
+    /* get disabled kernels from p2p and remove them */
+    kernelBitmap = ia_css_kernel_bitmap_intersection(kernelBitmap,
+            ia_css_kernel_bitmap_complement(ia_p2p_get_kernel_disable_bitmap(mP2pHandle, mPgId)));
+
+    /* get disabled data terminal kernels and remove them */
+    for (auto& item : mDisableDataTermials) {
+        ia_css_terminal_manifest_t *terminalManifest =
+            ia_css_program_group_manifest_get_term_mnfst(mPgManifest, (unsigned int)item);
+        ia_css_kernel_bitmap_t dataTerminalKernelBitmap =
+            ia_css_data_terminal_manifest_get_kernel_bitmap(
+            reinterpret_cast<ia_css_data_terminal_manifest_t*>(terminalManifest));
+        kernelBitmap = ia_css_kernel_bitmap_intersection(kernelBitmap,
+            ia_css_kernel_bitmap_complement(dataTerminalKernelBitmap));
+    }
+
+    /* disable params terminals which payload size are zero */
+    ret = disableZeroSizedTerminals(&kernelBitmap);
+    CheckError(ret != OK, ret, "%s: failed to disable zero size terminals", __func__);
+
+    *bitmap = kernelBitmap;
+    return ret;
+}
+
+void* IntelPGParam::allocatePGBuffer(int pgSize) {
+    destroyPGBuffer();
+    void* memory = IA_CIPR_ALLOC_ALIGNED(PAGE_ALIGN(pgSize), IA_CIPR_PAGESIZE());
+    mProcessGroupMemory = reinterpret_cast<ia_css_process_group_t*>(memory);
+    return mProcessGroupMemory;
+}
+
+void IntelPGParam::destroyPGBuffer() {
+    if (mProcessGroupMemory) {
+        IA_CIPR_FREE(mProcessGroupMemory);
+        mProcessGroupMemory = nullptr;
+    }
+}
+
+int IntelPGParam::setPGAndPrepareProgram(ia_css_process_group_t* pg) {
+    CheckError(!pg, UNKNOWN_ERROR, "input pg nullptr!");
+    mProcessGroup = pg;
+
+    int ret = OK;
+    int terminalCount = ia_css_process_group_get_terminal_count(mProcessGroup);
+    for (int i = 0; i < terminalCount; i++) {
+        ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, i);
+        CheckError(!terminal, UNKNOWN_ERROR, "failed to get terminal");
+        int termIdx = terminal->tm_index;
+
+        if (mPgReqs.terminals[termIdx].type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) {
+            unsigned int payloadSize = 0;
+            ret = pg_control_init_get_payload_size(pg, &payloadSize);
+            CheckError(ret != OK, UNKNOWN_ERROR, "call pg_control_init_get_payload_size fail");
+            mPgReqs.terminals[termIdx].payloadSize = payloadSize;
+
+            ret = pg_control_init_terminal_init(mProcessGroup,
+                             reinterpret_cast<ia_css_program_control_init_terminal_t*>(terminal));
+            CheckError(ret != ia_err_none, ret, "Failed to call pg_control_init_terminal_init.");
+        }
+
+        if (mPgReqs.terminals[termIdx].type == IA_CSS_TERMINAL_TYPE_PROGRAM) {
+            if (mFragmentConfig) {
+                ret = ia_p2p_program_terminal_init_v2(
+                        mP2pHandle,
+                        mPgId,
+                        mFragmentConfig,
+                        reinterpret_cast<ia_css_program_terminal_t*>(terminal));
+            } else {
+                ret = ia_p2p_program_terminal_init(
+                        mP2pHandle,
+                        mPgId,
+                        mFragmentCount,
+                        mFragmentDesc,
+                        reinterpret_cast<ia_css_program_terminal_t*>(terminal));
+            }
+            CheckError(ret != ia_err_none, ret, "Failed to init program terminal.");
+        }
+    }
+    return OK;
+}
+
+int IntelPGParam::getPayloadSizes(int payloadCount, ia_binary_data* payloads) {
+    CheckError(payloadCount < mTerminalCount || !payloads, BAD_VALUE, "Can't get payload sizes!");
+    for (int termIdx = 0; termIdx < mTerminalCount; termIdx++) {
+        payloads[termIdx].size = mPgReqs.terminals[termIdx].payloadSize;
+    }
+    return mTerminalCount;
+}
+
+int IntelPGParam::allocatePayloads(int payloadCount, ia_binary_data* payloads) {
+    destroyPayloads();
+    int count = getPayloadSizes(mTerminalCount, mParamPayloads);
+    CheckError(payloadCount < count || !payloads, 0, "payloads error");
+
+    for (int idx = 0; idx < count; idx++) {
+        if (mParamPayloads[idx].size == 0) {
+            continue;
+        }
+        mParamPayloads[idx].data = IA_CIPR_ALLOC_ALIGNED(PAGE_ALIGN(mParamPayloads[idx].size),
+                                                         IA_CIPR_PAGESIZE());
+    }
+    MEMCPY_S(payloads, count * sizeof(ia_binary_data),
+             mParamPayloads, count * sizeof(ia_binary_data));
+
+    return count;
+}
+
+void IntelPGParam::destroyPayloads() {
+    for (int termIdx = 0; termIdx < mTerminalCount; termIdx++) {
+        if (mParamPayloads[termIdx].data) {
+            IA_CIPR_FREE(mParamPayloads[termIdx].data);
+            mParamPayloads[termIdx].data = nullptr;
+        }
+    }
+    CLEAR(mParamPayloads);
+}
+
+int IntelPGParam::updatePALAndEncode(const ia_binary_data* ipuParams,
+                                     int payloadCount, ia_binary_data* payloads) {
+    ia_err err = ia_p2p_parse(mP2pHandle, ipuParams, mP2pCacheBuffer.data);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "Failed to parse PAL data.");
+
+    CheckError(!payloads, UNKNOWN_ERROR, "no payloads for encode.");
+    CheckError(payloadCount < mTerminalCount, UNKNOWN_ERROR,
+               "small payload count %d, should be %d", payloadCount, mTerminalCount);
+    CheckError(!mProcessGroup, INVALID_OPERATION, "Can't encode due to null pg.");
+
+    int ret = OK;
+    int terminalCount = ia_css_process_group_get_terminal_count(mProcessGroup);
+    ia_css_terminal_t* programControlInitTerminal = nullptr;
+    for (int i = 0; i < terminalCount; i++) {
+        ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, i);
+        CheckError(!terminal, UNKNOWN_ERROR, "failed to get terminal");
+        if (!payloads[terminal->tm_index].data) {
+            continue;
+        }
+
+        // Encode that terminal at last
+        if (terminal->tm_index == mProgramControlInitTerminalIndex) {
+            programControlInitTerminal = terminal;
+            continue;
+        }
+
+        ret = encodeTerminal(terminal, payloads[terminal->tm_index]);
+        CheckError(ret != OK, ret, "Failed to encode for terminal %d.", terminal->tm_index);
+    }
+    if (programControlInitTerminal) {
+        ret = encodeTerminal(programControlInitTerminal,
+                             payloads[programControlInitTerminal->tm_index]);
+        CheckError(ret != OK, ret, "Failed to encode for program control init terminal %d.",
+                   programControlInitTerminal->tm_index);
+    }
+
+    return ret;
+}
+
+int IntelPGParam::encodeTerminal(ia_css_terminal_t* terminal, ia_binary_data payload) {
+    int ret = OK;
+
+    int terminalIndex = terminal->tm_index;
+    if (mPgReqs.terminals[terminalIndex].type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) {
+        unsigned int kupSize = 0;
+        ret = ia_p2p_get_kernel_user_parameter_size(mP2pHandle, mPgId, mFragmentCount, &kupSize);
+        CheckError(ret != ia_err_none, ret,
+                   "Failed to call ia_p2p_get_kernel_user_parameter_size.");
+        if (kupSize != mPgReqs.terminals[terminalIndex].userParamSize) {
+            mPgReqs.terminals[terminalIndex].userParamSize = kupSize;
+            mPgReqs.terminals[terminalIndex].userParamAddress = \
+                                               std::unique_ptr<uint8_t[]>(new uint8_t[kupSize]);
+        }
+
+        if (mFragmentConfig) {
+            ret = ia_p2p_get_kernel_user_parameters_v2(mP2pHandle,
+                                          mPgId,
+                                          mFragmentCount,
+                                          mFragmentConfig,
+                                          mPgReqs.terminals[terminalIndex].userParamAddress.get());
+            CheckError(ret != ia_err_none, ret,
+                       "Failed to call ia_p2p_get_kernel_user_parameters_v2.");
+        } else {
+            ret = ia_p2p_get_kernel_user_parameters(mP2pHandle,
+                                          mPgId,
+                                          mFragmentCount,
+                                          mFragmentDesc,
+                                          mPgReqs.terminals[terminalIndex].userParamAddress.get());
+            CheckError(ret != ia_err_none, ret,
+                       "Failed to call ia_p2p_get_kernel_user_parameters.");
+        }
+
+        ia_css_kernel_user_param_t* userParam = \
+                       reinterpret_cast<ia_css_kernel_user_param_t*> \
+                       (mPgReqs.terminals[terminalIndex].userParamAddress.get());
+        ret = pg_control_init_fill_payload(mProcessGroup, userParam, payload.data);
+        CheckError(ret != ia_err_none, ret, "Failed to call pg_control_init_fill_payload.");
+        return ret;
+    }
+
+    ia_css_kernel_bitmap_t kernelBitmap = mPgReqs.terminals[terminalIndex].kernelBitmap;
+    uint16_t kernelId = 0;
+    uint8_t kernelIndex = 0;
+    unsigned int curSection = 0;
+    unsigned int curOffset = 0;
+    ia_p2p_payload_desc tmpPayloadDesc;
+    while (!ia_css_is_kernel_bitmap_empty(kernelBitmap)) {
+        /* Use specific ordering of kernels when available */
+        if (mPgReqs.terminals[terminalIndex].kernelOrder) {
+            kernelId = mPgReqs.terminals[terminalIndex].kernelOrder[kernelIndex++].id;
+            if (kernelId >= PSYS_MAX_KERNELS_PER_PG) {
+                /* All the kernels have now been encoded. */
+                break;
+            }
+            /* Initialize parameter payload for current kernel with zeros in
+             * case P2P has reported less sections for the kernel */
+            if (mPgReqs.terminals[terminalIndex].kernelOrder[kernelIndex - 1].initialize) {
+                LOG2("%s: initializing kernel %d payload in terminal %d (offset:%d, size:%d)",
+                          __func__, kernelId, terminalIndex, curOffset,
+                          mPgReqs.terminals[terminalIndex].kernelOrder[kernelIndex-1].size);
+                unsigned char* start = reinterpret_cast<unsigned char*>(payload.data);
+                memset(start + curOffset, 0,
+                    mPgReqs.terminals[terminalIndex].kernelOrder[kernelIndex-1].size);
+            }
+        } else {
+            kernelId = getKernelIdByBitmap(kernelBitmap);
+        }
+
+        /* Sanity check sections sizes and return the size to be used */
+        css_err_t result = payloadSectionSizeSanityTest(&tmpPayloadDesc,
+                                  kernelId,
+                                  terminalIndex,
+                                  curOffset,
+                                  payload.size);
+        CheckError((result != css_err_none), UNKNOWN_ERROR,
+                   "Failed sanity check of terminal payload sizes");
+
+        switch (mPgReqs.terminals[terminalIndex].type) {
+            case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
+                ret = ia_p2p_param_in_terminal_encode(mP2pHandle,
+                                  mPgId,
+                                  kernelId,
+                                  reinterpret_cast<ia_css_param_terminal_t*>(terminal),
+                                  curSection,
+                                  reinterpret_cast<uint8_t*>(payload.data),
+                                  payload.size,
+                                  curOffset);
+                CheckError(ret != ia_err_none, ret, "Failed to encode param in terminal.");
+
+                curSection += mKernel.mSections[kernelId].param_in_section_count;
+                curOffset += tmpPayloadDesc.param_in_payload_size;
+                break;
+
+            case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
+                ret = ia_p2p_param_out_terminal_prepare(mP2pHandle,
+                                  mPgId,
+                                  kernelId,
+                                  mFragmentCount,
+                                  reinterpret_cast<ia_css_param_terminal_t*>(terminal),
+                                  curSection,
+                                  mPgReqs.terminals[terminalIndex].sectionCount,
+                                  payload.size,
+                                  curOffset);
+                CheckError(ret != ia_err_none, ret, "Failed to prepare param out terminal.");
+
+                curSection += mKernel.mSections[kernelId].param_out_section_count_per_fragment;
+                curOffset += tmpPayloadDesc.param_out_payload_size;
+                break;
+
+            case IA_CSS_TERMINAL_TYPE_PROGRAM:
+#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
+                reinterpret_cast<ia_css_program_terminal_t*>(terminal)->payload_fragment_stride =
+                    mPgReqs.terminals[terminalIndex].payloadSize / mFragmentCount;
+#endif
+                ret = ia_p2p_program_terminal_encode(mP2pHandle,
+                                  mPgId,
+                                  kernelId,
+                                  mFragmentCount,
+                                  (mFragmentConfig ? mFragmentConfig->pixel_fragment_descs[kernelId]
+                                                   : mFragmentDesc),
+                                  reinterpret_cast<ia_css_program_terminal_t*>(terminal),
+                                  curSection,
+                                  mPgReqs.terminals[terminalIndex].sectionCount,
+                                  reinterpret_cast<uint8_t*>(payload.data),
+                                  payload.size,
+                                  curOffset);
+                CheckError(ret != ia_err_none, ret, "Failed to encode program terminal.");
+
+                curSection += mKernel.mSections[kernelId].program_section_count_per_fragment;
+                curOffset += tmpPayloadDesc.program_payload_size;
+                break;
+
+           case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
+                 /* TODO: ensure program terminal gets encoded first */
+                 ret = ia_p2p_spatial_param_in_terminal_encode(mP2pHandle,
+                                  mPgId,
+                                  kernelId,
+                                  mFragmentCount,
+                                  (mFragmentConfig ? mFragmentConfig->pixel_fragment_descs[kernelId]
+                                                   : mFragmentDesc),
+                                  reinterpret_cast<ia_css_spatial_param_terminal_t*>(terminal),
+                                  curSection,
+                                  reinterpret_cast<uint8_t*>(payload.data),
+                                  payload.size,
+                                  curOffset);
+                 CheckError(ret != ia_err_none, ret, "Failed to encode spatial in terminal.");
+
+                 curOffset += tmpPayloadDesc.spatial_param_in_payload_size;
+                 curSection += mKernel.mSections[kernelId].spatial_param_in_section_count;
+                 break;
+
+            case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
+                 ret = ia_p2p_spatial_param_out_terminal_prepare(mP2pHandle,
+                                  mPgId,
+                                  kernelId,
+                                  mFragmentCount,
+                                  (mFragmentConfig ? mFragmentConfig->pixel_fragment_descs[kernelId]
+                                                   : mFragmentDesc),
+                                  reinterpret_cast<ia_css_spatial_param_terminal_t*>(terminal),
+                                  curSection,
+                                  payload.size,
+                                  curOffset);
+                 CheckError(ret != ia_err_none, ret, "Failed to prepare spatial out terminal.");
+
+                 curOffset += tmpPayloadDesc.spatial_param_out_payload_size;
+                 curSection += mKernel.mSections[kernelId].spatial_param_out_section_count;
+                 break;
+
+            case IA_CSS_TERMINAL_TYPE_DATA_IN:
+            case IA_CSS_TERMINAL_TYPE_DATA_OUT:
+                 /* No encode done for frame terminals */
+                 break;
+
+            default:
+                LOGE("%s: terminal type %d encode not implemented", __func__,
+                     mPgReqs.terminals[terminalIndex].type);
+                return UNKNOWN_ERROR;
+        }
+
+        if (!mPgReqs.terminals[terminalIndex].kernelOrder) {
+            kernelBitmap = ia_css_kernel_bitmap_unset(kernelBitmap, kernelId);
+        }
+    }
+
+    return ret;
+}
+
+int IntelPGParam::decode(int payloadCount, ia_binary_data* payload, ia_binary_data* statistics) {
+    CheckError(!mProcessGroup, INVALID_OPERATION, "Can't decode due to null pg.");
+    CheckError(!payload, INVALID_OPERATION, "nullptr payload.");
+
+    int ret = OK;
+    int terminalCount = ia_css_process_group_get_terminal_count(mProcessGroup);
+    for (int i = 0; i < terminalCount; i++) {
+        ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, i);
+        CheckError(!terminal, UNKNOWN_ERROR, "failed to get terminal");
+        if ((terminal->terminal_type != IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) &&
+            (terminal->terminal_type != IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT)) {
+            continue;
+        }
+        CheckError(terminal->tm_index >= payloadCount, UNKNOWN_ERROR,
+                   "no payload for term %d decoding", terminal->tm_index);
+        ret = decodeTerminal(terminal, payload[terminal->tm_index]);
+        CheckError(ret != OK, ret, "%s, call p2p decode fail", __func__);
+    }
+
+    return serializeDecodeCache(statistics);
+}
+
+int IntelPGParam::decodeTerminal(ia_css_terminal_t* terminal, ia_binary_data payload) {
+    int ret = OK;
+    int terminalIndex = terminal->tm_index;
+    unsigned int currentSection = 0;
+    int kernelIndex = 0;
+    uint16_t kernelId;
+    ia_css_kernel_bitmap_t kernelBitmap = mPgReqs.terminals[terminal->tm_index].kernelBitmap;
+    while (!ia_css_is_kernel_bitmap_empty(kernelBitmap)) {
+        /* Use specific ordering of kernels when available */
+        if (mPgReqs.terminals[terminalIndex].kernelOrder) {
+            kernelId = mPgReqs.terminals[terminalIndex].kernelOrder[kernelIndex++].id;
+            CheckError(kernelId >= PSYS_MAX_KERNELS_PER_PG, css_err_internal,
+                "%s: Kernel bitmap for terminal %d covers more kernels than in manifest",
+                __func__, terminalIndex);
+        } else {
+            kernelId = getKernelIdByBitmap(kernelBitmap);
+        }
+
+        switch (mPgReqs.terminals[terminalIndex].type) {
+            case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
+                ret = ia_p2p_param_out_terminal_decode(
+                        mP2pHandle,
+                        mPgId,
+                        kernelId,
+                        mFragmentCount,
+                        reinterpret_cast<ia_css_param_terminal_t*>(terminal),
+                        currentSection,
+                        mPgReqs.terminals[terminalIndex].sectionCount,
+                        reinterpret_cast<unsigned char*>(payload.data),
+                        payload.size);
+                currentSection += mKernel.mSections[kernelId].param_out_section_count_per_fragment;
+                break;
+            case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
+                ret = ia_p2p_spatial_param_out_terminal_decode_v2(
+                        mP2pHandle,
+                        mPgId,
+                        kernelId,
+                        mFragmentCount,
+                        (mFragmentConfig ? mFragmentConfig->pixel_fragment_descs[kernelId]
+                                         : mFragmentDesc),
+                        reinterpret_cast<ia_css_spatial_param_terminal_t*>(terminal),
+                        currentSection,
+                        (unsigned char*)payload.data,
+                        payload.size,
+                        mP2pCacheBuffer.data);
+                currentSection += mKernel.mSections[kernelId].spatial_param_out_section_count;
+                break;
+            default:
+                LOGE("%s: terminal type %d decode not implemented",
+                    __func__, mPgReqs.terminals[terminalIndex].type);
+                return UNKNOWN_ERROR;
+        }
+
+        CheckError(ret != ia_err_none, ret, "%s: failed to decode terminal %d",
+                   __func__, terminalIndex);
+        kernelBitmap = ia_css_kernel_bitmap_unset(kernelBitmap, kernelId);
+    }
+
+    return ret;
+}
+
+int IntelPGParam::serializeDecodeCache(ia_binary_data* result) {
+    CheckError(!result, UNKNOWN_ERROR, "The statistics buffer is nullptr");
+
+    ia_err ia_ret = ia_p2p_serialize_statistics(mP2pHandle, result, nullptr);
+    CheckError(ia_ret != ia_err_none, UNKNOWN_ERROR, "Serializ statistics fail");
+
+    return OK;
+}
+
+void IntelPGParam::deinit() {
+    ia_p2p_deinit(mP2pHandle);
+    if (mP2pCacheBuffer.data) {
+        IA_CIPR_FREE(mP2pCacheBuffer.data);
+    }
+}
+
+int IntelPGParam::getKernelIdByBitmap(ia_css_kernel_bitmap_t bitmap) {
+    int kernelId = 0;
+    CheckError(ia_css_is_kernel_bitmap_empty(bitmap), BAD_VALUE, "The bitmap is empty");
+    while (!ia_css_is_kernel_bitmap_set(bitmap, (unsigned int)kernelId)) {
+        kernelId++;
+    }
+
+    return kernelId;
+}
+
+ia_css_kernel_bitmap_t
+IntelPGParam::getCachedTerminalKernelBitmap(ia_css_param_terminal_manifest_t* manifest) {
+    ia_css_kernel_bitmap_t kernelBitmap = ia_css_kernel_bitmap_clear();
+    unsigned int section, sectionCount;
+
+    /* Loop through all the sections in manifest and put the kernel ids into the kernel bitmap. */
+    sectionCount = manifest->param_manifest_section_desc_count;
+    for (section = 0; section < sectionCount; section++) {
+        ia_css_param_manifest_section_desc_t* desc =
+                               ia_css_param_terminal_manifest_get_prm_sct_desc(manifest, section);
+        CheckError(!desc, kernelBitmap, "failed to get desc");
+        int index = ia_css_param_manifest_section_desc_get_kernel_id(desc);
+        kernelBitmap = ia_css_kernel_bitmap_set(kernelBitmap, index);
+    }
+
+    return kernelBitmap;
+}
+
+ia_css_kernel_bitmap_t IntelPGParam::getProgramTerminalKernelBitmap(
+                                                  ia_css_program_terminal_manifest_t* manifest) {
+    ia_css_kernel_bitmap_t kernelBitmap = ia_css_kernel_bitmap_clear();
+    unsigned int section, sectionCount;
+
+    /* Loop through all the sections in manifest and put the kernel ids into the kernel bitmap. */
+    sectionCount = manifest->fragment_param_manifest_section_desc_count;
+    for (section = 0; section < sectionCount; section++) {
+        ia_css_fragment_param_manifest_section_desc_t *desc =
+            ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(manifest, section);
+        CheckError(!desc, kernelBitmap, "failed to get desc");
+        int index = ia_css_fragment_param_manifest_section_desc_get_kernel_id(desc);
+        kernelBitmap = ia_css_kernel_bitmap_set(kernelBitmap, index);
+    }
+
+    return kernelBitmap;
+}
+
+int IntelPGParam::disableZeroSizedTerminals(ia_css_kernel_bitmap_t* kernelBitmap) {
+    int ret = OK;
+    ia_css_terminal_type_t terminalType;
+    ia_css_kernel_bitmap_t terminalKernelsBitmap = ia_css_kernel_bitmap_clear();
+    ia_css_kernel_bitmap_t disabledTerminalKernelsBitmap = ia_css_kernel_bitmap_clear();
+    for (int i = 0; i < mTerminalCount; i++) {
+        terminalKernelsBitmap = ia_css_kernel_bitmap_clear();
+        unsigned int payloadSize = mPgReqs.terminals[i].payloadSize;
+        ia_css_terminal_manifest_t *manifest =
+                                   ia_css_program_group_manifest_get_term_mnfst(mPgManifest, i);
+        terminalType = ia_css_terminal_manifest_get_type(manifest);
+
+        if (payloadSize == 0) {
+            switch (terminalType) {
+                case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
+                case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT: {
+                    /* Spatial terminals are only associated to a single kernel. */
+                    ia_css_spatial_param_terminal_manifest_t* paramMani =
+                        reinterpret_cast<ia_css_spatial_param_terminal_manifest_t*>(manifest);
+                    terminalKernelsBitmap = ia_css_kernel_bitmap_set(
+                            terminalKernelsBitmap, paramMani->kernel_id);
+                    break;
+                }
+                case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
+                case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT: {
+                    ia_css_param_terminal_manifest_t* paramMani =
+                        reinterpret_cast<ia_css_param_terminal_manifest_t*>(manifest);
+                    terminalKernelsBitmap = getCachedTerminalKernelBitmap(paramMani);
+                    break;
+                }
+                case IA_CSS_TERMINAL_TYPE_PROGRAM: {
+                    ia_css_program_terminal_manifest_t* proMani =
+                        reinterpret_cast<ia_css_program_terminal_manifest_t*>(manifest);
+                        terminalKernelsBitmap = getProgramTerminalKernelBitmap(proMani);
+                    break;
+                }
+                case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
+                    LOG1("%s: program control init terminal is always enabled.", __func__);
+                    break;
+                default:
+                    break;
+            }
+            disabledTerminalKernelsBitmap =
+                ia_css_kernel_bitmap_union(disabledTerminalKernelsBitmap, terminalKernelsBitmap);
+        }
+    }
+
+    *kernelBitmap = ia_css_kernel_bitmap_intersection(*kernelBitmap,
+                                   ia_css_kernel_bitmap_complement(disabledTerminalKernelsBitmap));
+    return ret;
+}
+
+css_err_t IntelPGParam::getKernelOrderForParamCachedInTerm(
+                                              ia_css_param_terminal_manifest_t* terminalManifest,
+                                              IpuPgTerminalKernelInfo* kernelOrder) {
+    CheckError((!terminalManifest || !kernelOrder), ia_err_argument, "No manifest or order info");
+
+    uint16_t sectionCount = terminalManifest->param_manifest_section_desc_count;
+    CheckError(sectionCount == 0, css_err_argument, "No static sections in manifest");
+    uint8_t kernelCount = 0;
+
+    for (uint16_t section = 0; section < sectionCount; section++) {
+        ia_css_param_manifest_section_desc_t* param =
+            ia_css_param_terminal_manifest_get_prm_sct_desc(terminalManifest, section);
+        CheckError(!param, css_err_internal, "Failed to get param from terminal manifest!");
+
+        /* there is agreement that sections of the same kernel are
+         * encoded in a row. Here, skipping sections of the same kernel
+         * based on this assumption.
+         */
+        /* info: Indication of the kernel this parameter belongs to,
+         * may stand for mem_type, region and kernel_id for ipu6
+         */
+        int index = ia_css_param_manifest_section_desc_get_kernel_id(param);
+        if (kernelCount > 0 && kernelOrder[kernelCount - 1].id == index) {
+            ++kernelOrder[kernelCount - 1].sections;
+            kernelOrder[kernelCount - 1].size += param->max_mem_size;
+            continue;
+        }
+        kernelOrder[kernelCount].id = (uint8_t) index;
+        kernelOrder[kernelCount].sections = 1;
+        kernelOrder[kernelCount].size = param->max_mem_size;
+        kernelOrder[kernelCount].initialize = false;
+        kernelCount++;
+    }
+
+    return css_err_none;
+}
+
+css_err_t IntelPGParam::getKernelOrderForProgramTerm(
+                                              ia_css_program_terminal_manifest_t* terminalManifest,
+                                              IpuPgTerminalKernelInfo* kernelOrder) {
+    CheckError((!terminalManifest || !kernelOrder), css_err_argument, "No manifest or order info");
+    uint16_t sectionCount = terminalManifest->fragment_param_manifest_section_desc_count;
+    CheckError(sectionCount == 0, ia_err_internal, "No static sections in manifest");
+    uint8_t kernelCount = 0;
+
+    for (uint16_t section = 0; section < sectionCount; section++) {
+        ia_css_fragment_param_manifest_section_desc_t* param =
+            ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(terminalManifest, section);
+        CheckError(!param, css_err_internal, "Failed to get param from terminal manifest!");
+
+        /* there is agreement that sections of the same kernel are
+         * encoded in a row. Here, skipping sections of the same kernel
+         * based on this assumption.
+         */
+        /* info: Indication of the kernel this parameter belongs to,
+         * may stand for mem_type, region and kernel_id for ipu6
+         */
+        int index = ia_css_fragment_param_manifest_section_desc_get_kernel_id(param);
+        if (kernelCount > 0 && kernelOrder[kernelCount - 1].id == index) {
+            ++kernelOrder[kernelCount - 1].sections;
+            kernelOrder[kernelCount - 1].size += param->max_mem_size;
+            continue;
+        }
+        kernelOrder[kernelCount].id = (uint8_t) index;
+        kernelOrder[kernelCount].sections = 1;
+        kernelOrder[kernelCount].size = param->max_mem_size;
+        kernelOrder[kernelCount].initialize = false;
+        kernelCount++;
+    }
+
+    return css_err_none;
+}
+
+int8_t IntelPGParam::terminalEnumerateByType(IpuPgRequirements* reqs,
+                                             ia_css_terminal_type_t terminalType, uint8_t num) {
+    CheckError(reqs->terminalCount == 0, -1, "%s: no terminals!", __func__);
+
+    for (uint8_t terminal = 0; terminal < reqs->terminalCount; terminal++) {
+        if (reqs->terminals[terminal].type == terminalType) {
+            if (num)
+                num--;
+            else
+                return (int8_t)terminal;
+        }
+    }
+
+    return -1;
+}
+
+int8_t IntelPGParam::terminalEnumerateByBitmap(IpuPgRequirements* reqs,
+                                               ia_css_terminal_type_t terminal_type,
+                                               ia_css_kernel_bitmap_t bitmap) {
+    CheckError(reqs->terminalCount == 0, -1, "%s: no terminals!", __func__);
+
+    for (uint8_t terminal = 0; terminal < reqs->terminalCount; terminal++) {
+        if (reqs->terminals[terminal].type == terminal_type &&
+            ia_css_is_kernel_bitmap_equal(reqs->terminals[terminal].kernelBitmap, bitmap)) {
+            return (int8_t)terminal;
+        }
+    }
+
+    return -1;
+}
+
+bool IntelPGParam::isKernelIdInKernelOrder(IpuPgRequirements* reqs,
+                                           int8_t termIndex, int kernelId, uint8_t* orderedIndex) {
+    /* No kernel order, return true always */
+    if (!reqs->terminals[termIndex].kernelOrder)
+        return true;
+
+    /* Check if the kernel_id can be found from the kernelOrder */
+    for (uint8_t i = 0; i < PSYS_MAX_KERNELS_PER_PG; i++) {
+        if (reqs->terminals[termIndex].kernelOrder[i].id == kernelId) {
+            if (orderedIndex)
+                *orderedIndex = i;
+            return true;
+        }
+    }
+
+    return false;
+}
+
+uint32_t IntelPGParam::getKernelCountFromKernelOrder(IpuPgRequirements* reqs,
+                                                     int8_t termIndex, int kernelId) {
+    if (!reqs->terminals[termIndex].kernelOrder) {
+        /* If no kernel order is present, assuming kernel appears once. */
+        return 1;
+    }
+
+    uint32_t count = 0;
+    for (int i = 0; i < PSYS_MAX_KERNELS_PER_PG; i++) {
+        if (reqs->terminals[termIndex].kernelOrder[i].id == kernelId) {
+            ++count;
+        }
+    }
+
+    return count;
+}
+
+void IntelPGParam::processTerminalKernelRequirements(IpuPgRequirements* reqs, int8_t termIndex,
+                                                     ia_css_terminal_type_t terminalType,
+                                                     int kernelId) {
+    uint32_t kernelCount = getKernelCountFromKernelOrder(reqs, termIndex, kernelId);
+    uint32_t sectionCount = 0, payloadSize = 0;
+#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
+    uint32_t multiplier = 1;
+#endif
+    for (unsigned int i = 0; i < kernelCount; ++i) {
+        switch (terminalType) {
+        case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
+            sectionCount = mKernel.mSections[kernelId].param_in_section_count;
+            payloadSize = mKernel.mPayloads[kernelId].param_in_payload_size;
+            break;
+        case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
+            sectionCount = mKernel.mSections[kernelId].param_out_section_count_per_fragment;
+#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
+            payloadSize = mKernel.mPayloads[kernelId].param_out_payload_size * mFragmentCount;
+#else
+            payloadSize = mKernel.mPayloads[kernelId].param_out_payload_size;
+#endif
+            break;
+        case IA_CSS_TERMINAL_TYPE_PROGRAM:
+            sectionCount = mKernel.mSections[kernelId].program_section_count_per_fragment;
+            payloadSize = mKernel.mPayloads[kernelId].program_payload_size;
+#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
+            multiplier = mFragmentCount;
+#endif
+            break;
+        default:
+            LOG1("%s: terminal type %d encode not implemented", __func__, terminalType);
+            break;
+        }
+        reqs->terminals[termIndex].sectionCount += sectionCount;
+
+#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
+        reqs->terminals[termIndex].payloadSize += multiplier * payloadSize;
+#else
+        reqs->terminals[termIndex].payloadSize += payloadSize;
+#endif
+
+        mKernel.mPayloadSize = reqs->terminals[termIndex].payloadSize;
+    }
+
+    reqs->terminals[termIndex].kernelBitmap =
+        ia_css_kernel_bitmap_set(reqs->terminals[termIndex].kernelBitmap, (unsigned int)kernelId);
+}
+
+css_err_t IntelPGParam::payloadSectionSizeSanityTest(ia_p2p_payload_desc* current,
+                                                     uint16_t kernelId, uint8_t terminalIndex,
+                                                     uint32_t currentOffset, size_t payloadSize) {
+    size_t nextPayloadSize = 0;
+    ia_p2p_payload_desc init = mKernel.mPayloads[kernelId];
+    /* calculate again the memory requirements for each kernel
+     * and compare it with what we stored at init time. */
+    ia_err ia_ret = ia_p2p_get_kernel_payload_desc(
+            mP2pHandle,
+            mPgId,
+            kernelId,
+#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
+            1,
+#else
+            mFragmentCount,
+#endif
+            (mFragmentConfig ? mFragmentConfig->pixel_fragment_descs[kernelId]
+                             : mFragmentDesc),
+            current);
+    CheckError(ia_ret != ia_err_none, css_err_internal,
+        "Failed to get payload description during sanity check (kernel %d)", kernelId);
+
+    switch (mPgReqs.terminals[terminalIndex].type) {
+    case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
+        if (current->param_in_payload_size > init.param_in_payload_size) {
+            LOGW("%s: param-in section size mismatch in pg[%d] kernel[%d]"
+                               " p2p size %d pg_die size %d",
+                               __func__,
+                               mPgId,
+                               kernelId,
+                               current->param_in_payload_size,
+                               init.param_in_payload_size);
+        } else {
+            current->param_in_payload_size = init.param_in_payload_size;
+        }
+        nextPayloadSize = current->param_in_payload_size;
+        break;
+    case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
+        if (current->param_out_payload_size > init.param_out_payload_size) {
+            LOGW("%s: param-out section size mismatch in pg[%d] kernel[%d]"
+                               " p2p size %d pg_die size %d",
+                               __func__,
+                               mPgId,
+                               kernelId,
+                               current->param_out_payload_size,
+                               init.param_out_payload_size);
+        } else {
+            current->param_out_payload_size = init.param_out_payload_size;
+        }
+        nextPayloadSize = current->param_out_payload_size;
+        break;
+    case IA_CSS_TERMINAL_TYPE_PROGRAM:
+        if (current->program_payload_size > init.program_payload_size) {
+            LOG1("%s: program section size mismatch in pg[%d] kernel[%d]"
+                               " p2p size %d pg_die size %d",
+                               __func__,
+                               mPgId,
+                               kernelId,
+                               current->program_payload_size,
+                               init.program_payload_size);
+        } else {
+            current->program_payload_size = init.program_payload_size;
+        }
+        nextPayloadSize = current->program_payload_size;
+        break;
+    case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
+        if (current->spatial_param_in_payload_size > init.spatial_param_in_payload_size) {
+            LOGW("%s: spatial-in section size mismatch in pg[%d] kernel[%d]"
+                           " p2p size %d pg_die size %d",
+                           __func__,
+                           mPgId,
+                           kernelId,
+                           current->spatial_param_in_payload_size,
+                           init.spatial_param_in_payload_size);
+        } else {
+            current->spatial_param_in_payload_size = init.spatial_param_in_payload_size;
+        }
+        nextPayloadSize = current->spatial_param_in_payload_size;
+        break;
+    case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
+        if (current->spatial_param_out_payload_size > init.spatial_param_out_payload_size) {
+            LOGW("%s: spatial-out section size mismatch in pg[%d] kernel[%d]"
+                           " p2p size %d pg_die size %d",
+                           __func__,
+                           mPgId,
+                           kernelId,
+                           current->spatial_param_out_payload_size,
+                           init.spatial_param_out_payload_size);
+        } else {
+            current->spatial_param_out_payload_size = init.spatial_param_out_payload_size;
+        }
+        nextPayloadSize = current->spatial_param_out_payload_size;
+        break;
+    case IA_CSS_TERMINAL_TYPE_DATA_IN:
+    case IA_CSS_TERMINAL_TYPE_DATA_OUT:
+    case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
+        /* No check done for frame terminals */
+        break;
+    default:
+        LOGE("%s: terminal type %d payload check not implemented",
+            __func__, mPgReqs.terminals[terminalIndex].type);
+        return css_err_argument;
+    }
+
+    CheckError((currentOffset + nextPayloadSize > payloadSize), css_err_nomemory,
+        "pg %d terminal %d payload size small, encoding for kernel %d will exceed size by %u bytes",
+        mPgId, terminalIndex, kernelId, currentOffset + nextPayloadSize - payloadSize);
+    return css_err_none;
+}
+
+void IntelPGParam::dumpFragmentDesc(int fragmentCount) {
+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_LEVEL2)) return;
+
+    LOG2("%s: pg %d get frag count %d (new api)", __func__, mPgId, fragmentCount);
+    for (int kernel = 0; kernel < IA_P2P_MAX_KERNELS_PER_PG; kernel++) {
+        for (int frag = 0; frag < fragmentCount; frag++) {
+            LOG2("   kernel %d, frag %d: [%d %d %d %d]", kernel, frag,
+                 mFragmentConfig->pixel_fragment_descs[kernel][frag].fragment_width,
+                 mFragmentConfig->pixel_fragment_descs[kernel][frag].fragment_height,
+                 mFragmentConfig->pixel_fragment_descs[kernel][frag].fragment_start_x,
+                 mFragmentConfig->pixel_fragment_descs[kernel][frag].fragment_start_y);
+        }
+    }
+}
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.h
new file mode 100644
index 000000000000..0a29400b9807
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.h
@@ -0,0 +1,247 @@
+/*
+ * Copyright (C) 2018-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+extern "C" {
+#include <ia_isp_types.h>
+#include <ia_isp_bxt.h>
+
+#include <ia_pal_types_isp_ids_autogen.h>
+
+#include <ia_p2p_types.h>
+#include <ia_p2p.h>
+
+#include <ia_css_psys_program_group_manifest.h>
+#include <ia_css_psys_terminal_manifest.h>
+#include <ia_css_program_group_data.h>
+#include <ia_css_program_group_param.h>
+#include <ia_css_psys_process_group.h>
+#include <ia_css_psys_terminal.h>
+#include <ia_css_terminal_types.h>
+#include <ia_css_terminal_manifest_types.h>
+
+#include <pg_control_init_framework.h>
+}
+
+#include <map>
+#include <memory>
+#include <vector>
+
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+#include "modules/ia_cipr/include/ia_cipr_psys.h"
+#include "modules/ia_cipr/include/ia_cipr_alloc.h"
+#include "modules/ia_cipr/include/ia_cipr_memory.h"
+#include "modules/ia_cipr/include/css_types.h"
+#include "src/core/psysprocessor/PGUtils.h"
+
+namespace icamera {
+
+#define PSYS_MAX_KERNELS_PER_PG IA_CSS_KERNEL_BITMAP_BITS
+
+/**
+ * \class IntelPGParam
+ *
+ * \brief This is a version P2P implementation which is used to encode parameter terminal
+ *        and decode statistic terminal for PSYS pipeline.
+ *
+ * The call sequence as follows:
+ * 1. init();
+ * 2. prepare();
+ * 3. allocatePGBuffer() (optional);
+ * 4. setPGAndPrepareProgram();
+ * 5. allocatePayloads();
+ * 6. getFragmentDescriptors();
+ * 7. loop frame {
+ *      updatePALAndEncode();
+ *      decode();
+ *    }
+ * 8. deinit();
+ */
+class IntelPGParam {
+ public:
+    explicit IntelPGParam(int pgId);
+    ~IntelPGParam();
+
+    /**
+     * Use to init and config P2P handle.
+     */
+    int init(ia_p2p_platform_t platform, const PgConfiguration& Pgconfiguration);
+
+    /**
+     * Query and save the requirement for each terminal, calculate the final kernel bitmap.
+     */
+    int prepare(const ia_binary_data* ipuParameters, const ia_css_rbm_t* rbm,
+                ia_css_kernel_bitmap_t* bitmap);
+
+    /**
+     * Allocate PG buffer for caller
+     */
+    void* allocatePGBuffer(int pgSize);
+
+    /**
+     * Accept pg outside and init program_control_init terminal.
+     */
+    int setPGAndPrepareProgram(ia_css_process_group_t* pg);
+
+    /**
+     * Allocate payload memory for terminals, and return valid terminals count.
+     */
+    int allocatePayloads(int payloadCount, ia_binary_data* payloads);
+
+    /**
+     * Update PAL and encode payload data for all terminals. Will skip inactive terminals.
+     */
+    int updatePALAndEncode(const ia_binary_data* ipuParams,
+                           int payloadCount, ia_binary_data* payloads);
+
+    /**
+     * Decode payload data for all related terminals.
+     */
+    int decode(int payloadCount, ia_binary_data* payload, ia_binary_data* statistics);
+
+    /**
+     * Use to deinit P2P handle.
+     */
+    void deinit();
+
+    /**
+     * Get fragment descriptors calculated according to PAL data
+     * Called after prepare().
+     */
+    int getFragmentDescriptors(int descCount, ia_p2p_fragment_desc* descs);
+
+    /**
+     * Get payload size for all terminals, and return valid payloads number.
+     */
+    int getPayloadSizes(int payloadCount, ia_binary_data* payloads);
+
+ private:
+    enum FragmentDataTerminalType {
+        FRAG_TERM_TYPE_INPUT = 0,
+        FRAG_TERM_TYPE_OUTPUT_START,  // Mapping to data out terminal in order for all postgdc pgs.
+        FRAG_TERM_TYPE_DISPALY_OUTPUT = FRAG_TERM_TYPE_OUTPUT_START,
+        FRAG_TERM_TYPE_MAIN_OUTPUT,
+        FRAG_TERM_TYPE_PP_OUTPUT,
+        FRAG_TERM_TYPE_COUNT,
+    };
+
+    int mPgId;
+    int mTerminalCount;
+    PgFrameDesc mInputMainFrame;
+    PgFrameDesc mOutputMainFrame;
+
+    uint8_t mFragmentCount;
+    ia_p2p_fragment_desc* mFragmentDesc;
+    ia_p2p_fragment_configuration_t* mFragmentConfig;
+                             // for pg fragment with new api:
+                             // ia_p2p_calculate_fragments_rbm
+                             // Instead of mFragmentDesc
+    ia_p2p_handle mP2pHandle;
+    ia_binary_data mP2pCacheBuffer;
+
+    ia_css_program_group_manifest_t* mPgManifest;
+    std::vector<int> mDisableDataTermials;
+    ia_css_process_group_t* mProcessGroup;
+    int mProgramControlInitTerminalIndex;
+
+    struct IpuPgTerminalKernelInfo {
+        IpuPgTerminalKernelInfo() {}
+        uint8_t  id = 0;
+        uint8_t  sections = 0;
+        uint32_t size = 0;
+        bool     initialize = false;
+    };
+
+    struct IpuPgTerminaRequirements {
+        IpuPgTerminaRequirements() { kernelBitmap = ia_css_kernel_bitmap_clear(); }
+        ia_css_terminal_type_t type = IA_CSS_N_TERMINAL_TYPES;
+        uint32_t payloadSize = 0;
+        ia_css_kernel_bitmap_t kernelBitmap;
+        uint32_t sectionCount = 0;
+        IpuPgTerminalKernelInfo* kernelOrder = nullptr;
+        ia_p2p_fragment_desc* fragment_descs = nullptr;
+
+        // Use for program_control_init
+        uint32_t userParamSize;
+        std::unique_ptr<uint8_t[]> userParamAddress;
+    };
+
+    struct IpuPgRequirements {
+        IpuPgRequirements() {}
+        uint32_t terminalCount = 0;
+        IpuPgTerminaRequirements terminals[IPU_MAX_TERMINAL_COUNT];
+    };
+
+    struct KernelRequirement {
+        KernelRequirement() { mKernelBitmap = ia_css_kernel_bitmap_clear(); }
+        ia_p2p_terminal_requirements_t mSections[PSYS_MAX_KERNELS_PER_PG];
+        ia_p2p_payload_desc mPayloads[PSYS_MAX_KERNELS_PER_PG];
+        int mPayloadSize = 0;
+        ia_css_kernel_bitmap_t mKernelBitmap;
+    };
+
+    KernelRequirement mKernel;
+    IpuPgRequirements mPgReqs;
+
+    // Allocate them here, for sandboxing case (shared memory)
+    ia_binary_data __attribute__((aligned(PG_PAGE_SIZE)))mParamPayloads[IPU_MAX_TERMINAL_COUNT];
+    void* mProcessGroupMemory;
+
+ private:
+    int getKernelIdByBitmap(ia_css_kernel_bitmap_t bitmap);
+    ia_css_kernel_bitmap_t getCachedTerminalKernelBitmap(
+                                                      ia_css_param_terminal_manifest_t* manifest);
+    ia_css_kernel_bitmap_t getProgramTerminalKernelBitmap(
+                                                      ia_css_program_terminal_manifest_t* manifest);
+    int disableZeroSizedTerminals(ia_css_kernel_bitmap_t* kernelBitmap);
+    css_err_t getKernelOrderForProgramTerm(ia_css_program_terminal_manifest_t* terminalManifest,
+                                           IpuPgTerminalKernelInfo* kernelOrder);
+    css_err_t getKernelOrderForParamCachedInTerm(ia_css_param_terminal_manifest_t* terminalManifest,
+                                                 IpuPgTerminalKernelInfo* kernelOrder);
+    int8_t terminalEnumerateByType(IpuPgRequirements* reqs,
+                                   ia_css_terminal_type_t terminalType,
+                                   uint8_t num);
+    int8_t terminalEnumerateByBitmap(IpuPgRequirements* reqs,
+                                     ia_css_terminal_type_t terminal_type,
+                                     ia_css_kernel_bitmap_t bitmap);
+    bool isKernelIdInKernelOrder(IpuPgRequirements* reqs, int8_t termIndex,
+                                 int kernelId, uint8_t* orderedIndex);
+    uint32_t getKernelCountFromKernelOrder(IpuPgRequirements* reqs, int8_t termIndex, int kernelId);
+    void processTerminalKernelRequirements(IpuPgRequirements* reqs, int8_t termIndex,
+                                           ia_css_terminal_type_t terminalType, int kernelId);
+    css_err_t payloadSectionSizeSanityTest(ia_p2p_payload_desc* current,
+                                           uint16_t kernelId, uint8_t terminalIndex,
+                                           uint32_t currentOffset, size_t payloadSize);
+
+    int calcFragmentDescriptors(int fragmentCount,
+                                const PgFrameDesc& inputMainFrame,
+                                const PgFrameDesc& outputMainFrame,
+                                const ia_css_rbm_t* rbm);
+
+    void dumpFragmentDesc(int fragmentCount);
+    int encodeTerminal(ia_css_terminal_t* terminal, ia_binary_data payload);
+    int decodeTerminal(ia_css_terminal_t* terminal, ia_binary_data payload);
+    int serializeDecodeCache(ia_binary_data* result);
+
+    void destroyPayloads();
+    void destroyPGBuffer();
+
+    DISALLOW_COPY_AND_ASSIGN(IntelPGParam);
+};
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/StatsTypes.h b/camera/hal/intel/ipu6/modules/algowrapper/StatsTypes.h
new file mode 100644
index 000000000000..9645c0f298e7
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/StatsTypes.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_aiq_types.h>
+#include <ia_isp_bxt.h>
+#include <ia_isp_bxt_types.h>
+#include <ia_dvs_types.h>
+#include <ia_bcomp_types.h>
+#include <ia_isp_bxt_statistics_types.h>
+
+#include "Parameters.h"
+
+namespace icamera {
+
+#define MAX_EXPOSURES_COUNT 3
+
+struct ConvertInputParam {
+    bool multiExpo;
+    ia_binary_data *statsBuffer;
+    camera_resolution_t *dvsReso;
+    const ia_aiq_ae_results *aeResults;
+    ia_bcomp_results *bcompResult;
+};
+
+struct ConvertResult {
+    ia_isp_bxt_statistics_query_results_t *queryResults;
+    ia_aiq_rgbs_grid *rgbsGrid[MAX_EXPOSURES_COUNT];
+    ia_aiq_af_grid *afGrid;
+    ia_dvs_statistics *dvsStats;
+};
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.cpp b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.cpp
new file mode 100644
index 000000000000..a484f42738a7
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.cpp
@@ -0,0 +1,876 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "GraphConfigImpl"
+
+#include "modules/algowrapper/graph/GraphConfigImpl.h"
+
+#include <graph_query_manager.h>
+#include <algorithm>
+#include <unordered_map>
+#include <GCSSParser.h>
+
+#include "FormatUtils.h"
+#include "GraphUtils.h"
+#include "iutils/CameraLog.h"
+
+using GCSS::GraphQueryManager;
+using GCSS::ItemUID;
+using GCSS::GCSSParser;
+using GCSS::GraphConfigNode;
+using std::vector;
+using std::map;
+using std::string;
+using std::shared_ptr;
+
+namespace icamera {
+
+#define DISPERSED_MAX_OUTPUTS 2
+
+Mutex GraphConfigImpl::sLock;
+std::unordered_map<int32_t, GraphConfigNodes*> GraphConfigImpl::mGraphNode;
+
+GraphConfigNodes::GraphConfigNodes() :
+        mDesc(nullptr),
+        mSettings(nullptr) {
+}
+
+GraphConfigNodes::~GraphConfigNodes() {
+    delete mDesc;
+    delete mSettings;
+}
+
+GraphConfigImpl::GraphConfigImpl() :
+    mCameraId(-1),
+    mGraphQueryManager(nullptr),
+    mConfigMode(CAMERA_STREAM_CONFIGURATION_MODE_NORMAL),
+    mType(COUPLED),
+    mMcId(-1) {
+}
+
+GraphConfigImpl::GraphConfigImpl(int32_t camId, ConfigMode mode, GraphSettingType type) :
+    mCameraId(camId),
+    mGraphQueryManager(new GraphQueryManager()),
+    mConfigMode(mode),
+    mType(type),
+    mMcId(-1) {
+    AutoMutex lock(sLock);
+
+    GraphConfigNodes *nodes = nullptr;
+    if (mGraphNode.find(camId) != mGraphNode.end()) {
+        nodes = mGraphNode[camId];
+    }
+    CheckError(!nodes, VOID_VALUE, "Failed to allocate Graph Query Manager");
+    mGraphQueryManager->setGraphDescriptor(nodes->mDesc);
+    mGraphQueryManager->setGraphSettings(nodes->mSettings);
+}
+
+GraphConfigImpl::~GraphConfigImpl() {
+}
+
+/**
+ * Add predefined keys to the map used by the graph config parser.
+ *
+ * This method should only be called once.
+ *
+ * We do this so that the keys we will use in the queries are already defined
+ * and we can create the query objects in a more compact way, by using the
+ * ItemUID initializers.
+ */
+void GraphConfigImpl::addCustomKeyMap() {
+    /**
+     * Initialize the map with custom specific tags found in the
+     * Graph Config XML's
+     */
+#define GCSS_KEY(key, str) std::make_pair(#str, GCSS_KEY_##key),
+    map<string, ia_uid> CUSTOM_GRAPH_KEYS = {
+        #include "custom_gcss_keys.h"
+    };
+#undef GCSS_KEY
+
+    LOG1("Adding %zu custom specific keys to graph config parser", CUSTOM_GRAPH_KEYS.size());
+
+    /*
+     * add custom specific tags so parser can use them
+     */
+    ItemUID::addCustomKeyMap(CUSTOM_GRAPH_KEYS);
+}
+
+/**
+ * Method to parse the XML graph configurations and settings
+ *
+ * Provide the file name with absolute path to this method, and
+ * save the GraphConfigNodes pointer to static area.
+ * This method is currently called once per camera
+ *
+ * \param[in] graphDescFile: name of the graph descriptor file
+ * \param[in] settingsFile: name of the graph settings file
+ */
+status_t GraphConfigImpl::parse(int cameraId,
+                                const char *graphDescFile, const char *settingsFile) {
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
+
+    GCSSParser parser;
+    GraphConfigNodes *nodes = new GraphConfigNodes;
+
+    parser.parseGCSSXmlFile(graphDescFile, &nodes->mDesc);
+    if (!nodes->mDesc) {
+        LOGE("Failed to parse graph descriptor from %s", graphDescFile);
+        delete nodes;
+        return UNKNOWN_ERROR;
+    }
+
+    parser.parseGCSSXmlFile(settingsFile, &nodes->mSettings);
+    if (!nodes->mSettings) {
+        LOGE("Failed to parse graph settings from %s", settingsFile);
+        delete nodes;
+        return UNKNOWN_ERROR;
+    }
+
+    AutoMutex lock(sLock);
+    // Destory the old item
+    auto it = mGraphNode.find(cameraId);
+    if (it != mGraphNode.end()) {
+        delete it->second;
+        mGraphNode.erase(it);
+    }
+    mGraphNode[cameraId] = nodes;
+
+    return OK;
+}
+
+/**
+ * Method to parse the XML graph configurations and settings
+ *
+ * Provide the memory address and size of files to this method,
+ * and save the GraphConfigNodes pointer to static area.
+ * This method is currently called once per camera
+ *
+ * \param[in] graphDescData: the memory address for graph descriptor
+ * \param[in] descDataSize: the memory size for graph descriptor
+ * \param[in] settingsData: the memory address for graph settings
+ * \param[in] settingsDataSize: the memory size for graph settings
+ */
+status_t GraphConfigImpl::parse(int cameraId, char *graphDescData, size_t descDataSize,
+                                char *settingsData, size_t settingsDataSize) {
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
+
+    GCSSParser parser;
+    GraphConfigNodes *nodes = new GraphConfigNodes;
+
+    parser.parseGCSSXmlData(graphDescData, descDataSize, &nodes->mDesc);
+    if (!nodes->mDesc) {
+        LOGE("Failed to parse graph descriptor addr: %p, size: %zu", graphDescData, descDataSize);
+        delete nodes;
+        return UNKNOWN_ERROR;
+    }
+
+    parser.parseGCSSXmlData(settingsData, settingsDataSize, &nodes->mSettings);
+    if (!nodes->mSettings) {
+        LOGE("Failed to parse graph settings addr: %p, size: %zu", settingsData, settingsDataSize);
+        delete nodes;
+        return UNKNOWN_ERROR;
+    }
+
+    AutoMutex lock(sLock);
+    // Destory the old item
+    auto it = mGraphNode.find(cameraId);
+    if (it != mGraphNode.end()) {
+        delete it->second;
+        mGraphNode.erase(it);
+    }
+    mGraphNode[cameraId] = nodes;
+
+    return OK;
+}
+
+/*
+ * Release the graph config nodes of all cameras
+ */
+void GraphConfigImpl::releaseGraphNodes() {
+    AutoMutex lock(sLock);
+
+    for (auto &nodes : mGraphNode) {
+        delete nodes.second;
+    }
+    mGraphNode.clear();
+}
+
+/**
+ * Create the query rule for current stream configuration based
+ * on stream list and graph setting type.
+ */
+status_t GraphConfigImpl::createQueryRule(const vector<HalStream*> &activeStreams) {
+    mQuery.clear();
+    mStreamToSinkIdMap.clear();
+
+    int videoIndex = 0, stillIndex = 0;
+    map<GCSS::ItemUID, std::string> videoQuery;
+    map<GCSS::ItemUID, std::string> stillQuery;
+    map<HalStream*, uid_t> videoStreamToSinkIdMap;
+    map<HalStream*, uid_t> stillStreamToSinkIdMap;
+    vector<AndroidGraphConfigKey> videoStreamKeys =
+        {GCSS_KEY_VIDEO0, GCSS_KEY_VIDEO1, GCSS_KEY_VIDEO2};
+    vector<AndroidGraphConfigKey> stillStreamKeys =
+        {GCSS_KEY_STILL0, GCSS_KEY_STILL1, GCSS_KEY_STILL2};
+
+    // Depends on outputs numbers in GC settings
+    int vOutputNum = (mType == DISPERSED) ? DISPERSED_MAX_OUTPUTS : videoStreamKeys.size();
+    int sOutputNum = (mType == DISPERSED) ? DISPERSED_MAX_OUTPUTS : stillStreamKeys.size();
+    for (auto &stream : activeStreams) {
+        CheckError(stream->useCase() == USE_CASE_INPUT, UNKNOWN_ERROR,
+                   "Error: Re-processing not supported with graph config yet.");
+        /*
+         * According to the usage to create the query item
+         */
+        CheckError(videoIndex >= vOutputNum && stillIndex >= sOutputNum, UNKNOWN_ERROR,
+                   "%s: no output for new stream! video %d, still %d",
+                   __func__, videoIndex, stillIndex);
+        bool isVideo = isVideoStream(stream) ? true : false;
+        if (videoIndex < vOutputNum) {
+            isVideo = (isVideo || stillIndex >= sOutputNum);
+        } else {
+            isVideo = false;
+        }
+        AndroidGraphConfigKey key = (isVideo) ? videoStreamKeys[videoIndex++]
+                                              : stillStreamKeys[stillIndex++];
+        map<HalStream*, uid_t> &streamToSinkId =
+            isVideo ? videoStreamToSinkIdMap : stillStreamToSinkIdMap;
+        map<GCSS::ItemUID, std::string> &query = isVideo ? videoQuery : stillQuery;
+        ItemUID w = {key, GCSS_KEY_WIDTH};
+        ItemUID h = {key, GCSS_KEY_HEIGHT};
+
+        query[w] = std::to_string(stream->width());
+        query[h] = std::to_string(stream->height());
+        streamToSinkId[stream] = key;
+        LOG1("Adding stream %p to map %s", stream, ItemUID::key2str(key));
+    }
+
+    if (mType == COUPLED) {
+        LOG2("Merge the query rule if graph settings type is COUPLED");
+        /*
+         * In this case(graph settings type is COUPLED), we need to merge still and
+         * video together, so there is only one item in mQuery and mStreamToSinkIdMap
+         * and it is used for both still and video pipe
+         */
+
+        // Merge the query rule
+        for (auto &still : stillQuery) {
+            videoQuery.insert(still);
+        }
+
+        // Merge the stream to sink key map
+        for (auto &stillKey : stillStreamToSinkIdMap) {
+            videoStreamToSinkIdMap.insert(stillKey);
+        }
+
+        /*
+         * Add to the query the number of active outputs
+         * The number of active outputs is video + still
+         */
+        ItemUID streamCount = {GCSS_KEY_ACTIVE_OUTPUTS};
+        videoQuery[streamCount] = std::to_string(videoStreamToSinkIdMap.size());
+
+        int useCase = videoQuery.empty() ? 0 : USE_CASE_VIDEO;
+        useCase |= stillQuery.empty() ? 0 : USE_CASE_STILL_CAPTURE;
+        mQuery[useCase] = videoQuery;
+        dumpQuery(useCase, mQuery[useCase]);
+        mStreamToSinkIdMap[useCase] = videoStreamToSinkIdMap;
+    } else {
+        LOG2("Fill each query rule if graph settings type is DISPERSED");
+        /*
+         * In this case(graph settings type is DISPERSED), the query item for still
+         * and video is dispersed, so there are two items in mQuery and mStreamToSinkIdMap
+         * one is for still pipe and the other is for video pipe
+         */
+        ItemUID streamCount = {GCSS_KEY_ACTIVE_OUTPUTS};
+
+        // Add active outputs for video
+        if (!videoStreamToSinkIdMap.empty()) {
+            LOG2("The video output number: %zu", videoStreamToSinkIdMap.size());
+            videoQuery[streamCount] = std::to_string(videoStreamToSinkIdMap.size());
+            mQuery[USE_CASE_VIDEO] = videoQuery;
+            dumpQuery(USE_CASE_VIDEO, mQuery[USE_CASE_VIDEO]);
+            mStreamToSinkIdMap[USE_CASE_VIDEO] = videoStreamToSinkIdMap;
+        }
+
+        // Add active outputs for still
+        if (!stillStreamToSinkIdMap.empty()) {
+            LOG2("The still output number: %zu", stillStreamToSinkIdMap.size());
+            stillQuery[streamCount] = std::to_string(stillStreamToSinkIdMap.size());
+            mQuery[USE_CASE_STILL_CAPTURE] = stillQuery;
+            dumpQuery(USE_CASE_STILL_CAPTURE, mQuery[USE_CASE_STILL_CAPTURE]);
+            mStreamToSinkIdMap[USE_CASE_STILL_CAPTURE] = stillStreamToSinkIdMap;
+        }
+    }
+
+    return OK;
+}
+
+status_t GraphConfigImpl::getRawInputSize(GCSS::IGraphConfig *query, camera_resolution_t *reso) {
+    CheckError(!reso, UNKNOWN_ERROR, "%s, The reso is nullptr", __func__);
+    GCSS::IGraphConfig *result = nullptr;
+    css_err_t ret = mGraphQueryManager->createGraph(query, &result);
+    if (ret != css_err_none) {
+        delete result;
+        return UNKNOWN_ERROR;
+    }
+    CheckError(!result, UNKNOWN_ERROR, "%s, Failed to create the graph", __func__);
+
+    vector<string> isysOutput = {
+        "csi_be:output",
+        "csi_be_soc:output"
+    };
+    for (auto &item : isysOutput) {
+        GCSS::IGraphConfig *isysNode = result->getDescendantByString(item.c_str());
+        if (isysNode != nullptr) {
+            GCSS::GraphCameraUtil::getDimensions(isysNode, &(reso->width), &(reso->height));
+            return OK;
+        }
+    }
+
+    LOGE("Error: Couldn't get the resolution in isys output");
+    return UNKNOWN_ERROR;
+}
+
+/*
+ * According to the stream list to query graph setting and create GraphConfigPipe
+ */
+status_t GraphConfigImpl::configStreams(const vector<HalStream*> &activeStreams) {
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
+
+    status_t ret = createQueryRule(activeStreams);
+    CheckError(ret != OK, ret, "Failed to create the query rule");
+
+    mQueryResult.clear();
+    map<int, vector<GCSS::IGraphConfig*> > useCaseToQueryResults;
+
+    LOG2("The mQuery size: %zu", mQuery.size());
+    for (auto &query : mQuery) {
+        mFirstQueryResults.clear();
+        dumpQuery(query.first, query.second);
+        mGraphQueryManager->queryGraphs(query.second, mFirstQueryResults);
+        CheckError(mFirstQueryResults.empty(), BAD_VALUE,
+                   "Failed to query the result, please check the settings xml");
+
+        // select setting from multiple results
+        ret = selectSetting(query.first, &useCaseToQueryResults);
+        CheckError(ret != OK, BAD_VALUE,
+                   "Failed to select the settings for ConfigMode (0x%x)in results", mConfigMode);
+    }
+
+    CheckError(useCaseToQueryResults.empty(), UNKNOWN_ERROR,
+               "%s, There isn't matched result after filtering with first query rule", __func__);
+    // Filter the results with same isys output if there are
+    // multiple items in useCaseToQueryResults map
+    if (useCaseToQueryResults.size() > 1) {
+        ret = OK;
+        bool matchFound = false;
+
+        vector<GCSS::IGraphConfig*> &videoQueryResults =
+            useCaseToQueryResults.at(USE_CASE_VIDEO);
+        vector<GCSS::IGraphConfig*> &stillQueryResults =
+            useCaseToQueryResults.at(USE_CASE_STILL_CAPTURE);
+        CheckError(videoQueryResults.empty() || stillQueryResults.empty(),
+                   UNKNOWN_ERROR, "%s, the still or video query results is empty", __func__);
+
+        // Filter the video and still query results with same isys ouput resolution.
+        for (auto &video : videoQueryResults) {
+            camera_resolution_t videoReso;
+            ret = getRawInputSize(video, &videoReso);
+            CheckError(ret != OK, UNKNOWN_ERROR,
+                       "%s, Failed to get csi ouput resolution for video pipe", __func__);
+            LOG2("Isys output resolution of video pipe: %dx%d", videoReso.width, videoReso.height);
+
+            for (auto &still : stillQueryResults) {
+                camera_resolution_t stillReso;
+                ret = getRawInputSize(still, &stillReso);
+                CheckError(ret != OK, UNKNOWN_ERROR,
+                           "%s, Failed to get csi ouput resolution for still pipe", __func__);
+                LOG2("Isys output resolution for still pipe: %dx%d",
+                     stillReso.width, stillReso.height);
+
+                if (videoReso.width == stillReso.width && videoReso.height == stillReso.height) {
+                    matchFound = true;
+                    mQueryResult[USE_CASE_VIDEO] = video;
+                    mQueryResult[USE_CASE_STILL_CAPTURE] = still;
+                    break;
+                }
+            }
+            if (matchFound)
+                break;
+        }
+
+        CheckError(!matchFound, UNKNOWN_ERROR,
+                   "%s, Failed to find the isys ouput for video and still pipe", __func__);
+    } else {
+        // Use the query result with smallest isys output if there is only video pipe
+        int resultIdx = 0;
+        if (useCaseToQueryResults.begin()->first == USE_CASE_VIDEO) {
+            camera_resolution_t resultReso;
+            getRawInputSize((useCaseToQueryResults.begin()->second)[0], &resultReso);
+            for (size_t idx = 0; idx < (useCaseToQueryResults.begin()->second).size(); idx++) {
+                camera_resolution_t reso;
+                getRawInputSize((useCaseToQueryResults.begin()->second)[idx], &reso);
+                if (resultReso.width > reso.width && resultReso.height > reso.height) {
+                    resultIdx = idx;
+                    resultReso = reso;
+                }
+            }
+        }
+        mQueryResult[useCaseToQueryResults.begin()->first] =
+            useCaseToQueryResults.begin()->second[resultIdx];
+    }
+    CheckError(mQueryResult.empty(), UNKNOWN_ERROR,
+               "%s, Failed to fill the map into mQueryResult", __func__);
+
+    int key = -1;
+    string mcId, opMode;
+    mQueryResult.begin()->second->getValue(GCSS_KEY_KEY, key);
+    mQueryResult.begin()->second->getValue(GCSS_KEY_MC_ID, mcId);
+    mQueryResult.begin()->second->getValue(GCSS_KEY_OP_MODE, opMode);
+    LOG1("CAM[%d]Graph config for pipe: %d SUCCESS, settings id %d, operation mode: %s",
+         mCameraId, mQueryResult.begin()->first, key, opMode.c_str());
+
+    if (mQueryResult.size() > 1) {
+        mQueryResult.rbegin()->second->getValue(GCSS_KEY_KEY, key);
+        mQueryResult.rbegin()->second->getValue(GCSS_KEY_MC_ID, mcId);
+        mQueryResult.rbegin()->second->getValue(GCSS_KEY_OP_MODE, opMode);
+        LOG1("CAM[%d]Graph config for pipe: %d SUCCESS, settings id %d, operation mode: %s",
+             mCameraId, mQueryResult.rbegin()->first, key, opMode.c_str());
+    }
+    mMcId = mcId.empty() ? -1 : stoi(mcId);
+    ret = prepareGraphConfig();
+    CheckError(ret != OK, ret,
+               "%s, Failed to prepare graph config: real ConfigMode: %x", __func__, mConfigMode);
+
+    return OK;
+}
+
+/**
+ * Prepare graph config object
+ *
+ * Use graph query results as a parameter to getGraph. The result will be given
+ * to graph config object.
+ */
+status_t GraphConfigImpl::prepareGraphConfig() {
+    status_t status = OK;
+    mGraphConfigPipe.clear();
+
+    for (auto &query : mQueryResult) {
+        shared_ptr<GraphConfigPipe> graphConfigPipe =
+                    std::make_shared<GraphConfigPipe>(query.first);
+        GCSS::IGraphConfig *result = nullptr;
+        css_err_t ret = mGraphQueryManager->createGraph(query.second, &result);
+        if (ret != css_err_none) {
+            delete result;
+            return UNKNOWN_ERROR;
+        }
+        status = graphConfigPipe->prepare(static_cast<GraphConfigNode*>(result),
+                                          mStreamToSinkIdMap[query.first]);
+        if (status != OK) {
+            delete result;
+            LOGE("Failed to prepare the GraphConfigPipe for pipe: %d", query.first);
+            return UNKNOWN_ERROR;
+        }
+        mGraphConfigPipe[query.first] = graphConfigPipe;
+        LOG1("Graph config object prepared");
+    }
+
+    return OK;
+}
+
+/*
+ * Do the secondary filter: configMode and stream format.
+ */
+status_t GraphConfigImpl::selectSetting(
+             int useCase,
+             std::map<int, std::vector<GCSS::IGraphConfig*> > *queryResults) {
+    CheckError(!queryResults, UNKNOWN_ERROR, "%s, The queryResults is nullptr", __func__);
+    string opMode;
+    vector<GCSS::IGraphConfig*> internalQueryResults;
+
+    // Firstly, filter the config mode
+    for (auto &result : mFirstQueryResults) {
+        vector<ConfigMode> cfgModes;
+        result->getValue(GCSS_KEY_OP_MODE, opMode);
+        LOG1("The operation mode str in xml: %s", opMode.c_str());
+
+        CameraUtils::getConfigModeFromString(opMode, cfgModes);
+        LOG1("The query results supports configModes size: %zu", cfgModes.size());
+
+        for (const auto mode : cfgModes) {
+            if (mConfigMode == mode) {
+                internalQueryResults.push_back(result);
+                break;
+            }
+        }
+    }
+    CheckError(internalQueryResults.size() == 0,
+               UNKNOWN_ERROR, "Failed to query the results for configMode: %d", mConfigMode);
+
+    /*
+     * May still have multiple graphs after config mode parsing
+     * Those graphs have same resolution/configMode, but different output formats
+     * Do second graph query with format/bpp as query condition
+     */
+    map<HalStream*, uid_t> &streamToSinkIdMap = mStreamToSinkIdMap[useCase];
+    vector<GCSS::IGraphConfig*> secondQueryResults;
+    if (internalQueryResults.size() > 1) {
+        map<GCSS::ItemUID, std::string> queryItem;
+        for (auto const& item : streamToSinkIdMap) {
+            HalStream *s = item.first;
+            ItemUID formatKey = {(ia_uid)item.second, GCSS_KEY_FORMAT};
+            string fmt = graphconfig::utils::format2string(s->format());
+            queryItem[formatKey] = fmt;
+        }
+
+        LOG1("dumpQuery with format condition");
+        dumpQuery(useCase, queryItem);
+
+        /*
+         * Note: In some projects, there isn't format item in graph setting,
+         * So the result of this query may be empty, and ignore it.
+         */
+        mGraphQueryManager->queryGraphs(queryItem, internalQueryResults, secondQueryResults);
+        LOG2("The query results size: %zu after filtering format", secondQueryResults.size());
+    }
+
+    // Firstly, select the results with fully filtering
+    if (secondQueryResults.size() > 0) {
+        (*queryResults)[useCase] = secondQueryResults;
+    } else {
+       (*queryResults)[useCase] = internalQueryResults;
+    }
+
+    return OK;
+}
+
+status_t GraphConfigImpl::getGraphConfigData(IGraphType::GraphConfigData *data) {
+    // The graph id, csi output and sensor mode must be same if there are two graph config pipes
+    data->graphId = mGraphConfigPipe.begin()->second->getGraphId();
+    mGraphConfigPipe.begin()->second->getCSIOutputResolution(&(data->csiReso));
+
+    data->mcId = mMcId;
+    getGdcKernelSetting(&(data->gdcKernelId), &(data->gdcReso));
+
+    int ret = getPgNames(&(data->pgNames));
+    CheckError(ret != OK, UNKNOWN_ERROR, "%s, Failed to get pg names", __func__);
+    for (auto &pgName : data->pgNames) {
+        IGraphType::PgInfo info;
+        info.pgName = pgName;
+        info.streamId = getStreamIdByPgName(pgName);
+        info.pgId = getPgIdByPgName(pgName);
+        getPgRbmValue(pgName, &info.rbmValue);
+        data->pgInfo.push_back(info);
+    }
+
+    ret = graphGetStreamIds(&(data->streamIds));
+    CheckError(ret != OK, UNKNOWN_ERROR, "%s, Failed to get streamIds", __func__);
+    for (auto &streamId : data->streamIds) {
+        IGraphType::MbrInfo mBr;
+        mBr.streamId = streamId;
+        getMBRData(streamId, &mBr.data);
+        data->mbrInfo.push_back(mBr);
+
+        IGraphType::ProgramGroupInfo info;
+        info.streamId = streamId;
+        info.pgPtr = getProgramGroup(streamId);
+        data->programGroup.push_back(info);
+    }
+
+    return OK;
+}
+
+status_t GraphConfigImpl::getGdcKernelSetting(uint32_t *kernelId,
+                                              camera_resolution_t *resolution) {
+    CheckError(mGraphConfigPipe.empty(), UNKNOWN_ERROR,
+               "%s, the mGraphConfigPipe is empty", __func__);
+    CheckError(!kernelId || !resolution, UNKNOWN_ERROR,
+               "%s, the kernelId or resolution is nullptr", __func__);
+
+    int ret = OK;
+    if (mGraphConfigPipe.size() == 1) {
+        ret = mGraphConfigPipe.begin()->second->getGdcKernelSetting(kernelId, resolution);
+    } else {
+        // Get the information from video pipe firstly
+        shared_ptr<GraphConfigPipe> &videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
+        ret = videoGraphPipe->getGdcKernelSetting(kernelId, resolution);
+        if (ret != OK) {
+            shared_ptr<GraphConfigPipe> &stillGraphPipe =
+                mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
+            ret = stillGraphPipe->getGdcKernelSetting(kernelId, resolution);
+        }
+    }
+    CheckError(ret != OK, UNKNOWN_ERROR, "%s, NO GDC resolution found in all pipes", __func__);
+
+    return OK;
+}
+
+status_t GraphConfigImpl::graphGetStreamIds(std::vector<int32_t> *streamIds) {
+    CheckError(mGraphConfigPipe.empty(),
+               UNKNOWN_ERROR, "%s, the mGraphConfigPipe is empty", __func__);
+    CheckError(!streamIds, UNKNOWN_ERROR, "%s, The streamIds is nullptr", __func__);
+
+    if (mGraphConfigPipe.size() == 1) {
+        mGraphConfigPipe.begin()->second->graphGetStreamIds(streamIds);
+    } else {
+        vector<int32_t> stillStreamIds;
+        shared_ptr<GraphConfigPipe> &videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
+        shared_ptr<GraphConfigPipe> &stillGraphPipe = mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
+
+        videoGraphPipe->graphGetStreamIds(streamIds);
+        stillGraphPipe->graphGetStreamIds(&stillStreamIds);
+
+        for (auto &id : stillStreamIds) {
+            if (std::find(streamIds->begin(), streamIds->end(), id) == streamIds->end())
+                streamIds->push_back(id);
+        }
+    }
+
+    CheckError(streamIds->empty(), UNKNOWN_ERROR,
+               "%s, Failed to find any streamIds for all pipes", __func__);
+
+    return OK;
+}
+
+int GraphConfigImpl::getStreamIdByPgName(std::string pgName) {
+    CheckError(mGraphConfigPipe.empty(), -1, "%s, the mGraphConfigPipe is empty", __func__);
+
+    int streamId = -1;
+    for (auto &pipe : mGraphConfigPipe) {
+        streamId = pipe.second->getStreamIdByPgName(pgName);
+        if (streamId != -1)
+            break;
+    }
+    return streamId;
+}
+
+int GraphConfigImpl::getPgIdByPgName(std::string pgName) {
+    CheckError(mGraphConfigPipe.empty(), -1, "%s, the mGraphConfigPipe is empty", __func__);
+
+    int pgId = -1;
+    for (auto &pipe : mGraphConfigPipe) {
+        pgId = pipe.second->getPgIdByPgName(pgName);
+        if (pgId != -1)
+            break;
+    }
+    return pgId;
+}
+
+ia_isp_bxt_program_group* GraphConfigImpl::getProgramGroup(int32_t streamId) {
+    CheckError(mGraphConfigPipe.empty(), nullptr, "%s, the mGraphConfigPipe is empty", __func__);
+
+    if (mGraphConfigPipe.size() == 1) {
+        return mGraphConfigPipe.begin()->second->getProgramGroup(streamId);
+    }
+
+    // Find the streamd id from video graph pipe firstly
+    vector<int32_t> streamIds;
+    shared_ptr<GraphConfigPipe> &videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
+    videoGraphPipe->graphGetStreamIds(&streamIds);
+    if (std::find(streamIds.begin(), streamIds.end(), streamId) != streamIds.end()) {
+        return videoGraphPipe->getProgramGroup(streamId);
+    }
+
+    shared_ptr<GraphConfigPipe> &stillGraphPipe = mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
+    return stillGraphPipe->getProgramGroup(streamId);
+}
+
+int GraphConfigImpl::getProgramGroup(std::string pgName,
+                                     ia_isp_bxt_program_group* programGroupForPG) {
+    for (auto &graph : mGraphConfigPipe) {
+        vector<string> pgNames;
+        graph.second->getPgNames(&pgNames);
+        if (std::find(pgNames.begin(), pgNames.end(), pgName) != pgNames.end()) {
+            return graph.second->getProgramGroup(pgName, programGroupForPG);
+        }
+    }
+
+    LOGE("There isn't this pg: %s in all graph config pipes", pgName.c_str());
+    return UNKNOWN_ERROR;
+}
+
+status_t GraphConfigImpl::getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits *data) {
+    CheckError(mGraphConfigPipe.empty(),
+               UNKNOWN_ERROR, "%s, the mGraphConfigPipe is empty", __func__);
+
+    if (mGraphConfigPipe.size() == 1) {
+        return mGraphConfigPipe.begin()->second->getMBRData(streamId, data);
+    }
+
+    // Find the streamd id from video graph pipe firstly
+    vector<int32_t> streamIds;
+    shared_ptr<GraphConfigPipe> &videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
+    videoGraphPipe->graphGetStreamIds(&streamIds);
+    if (std::find(streamIds.begin(), streamIds.end(), streamId) != streamIds.end()) {
+        return videoGraphPipe->getMBRData(streamId, data);
+    }
+
+    shared_ptr<GraphConfigPipe> &stillGraphPipe = mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
+    return stillGraphPipe->getMBRData(streamId, data);
+}
+
+status_t GraphConfigImpl::getPgNames(std::vector<std::string>* pgNames) {
+    CheckError(mGraphConfigPipe.empty(),
+               UNKNOWN_ERROR, "%s, the mGraphConfigPipe is empty", __func__);
+
+    if (mGraphConfigPipe.size() == 1) {
+        mGraphConfigPipe.begin()->second->getPgNames(pgNames);
+    } else {
+        vector<string> stillPgNames;
+        shared_ptr<GraphConfigPipe> &videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
+        shared_ptr<GraphConfigPipe> &stillGraphPipe = mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
+
+        videoGraphPipe->getPgNames(pgNames);
+        stillGraphPipe->getPgNames(&stillPgNames);
+
+        for (auto &pg : stillPgNames) {
+            if (std::find(pgNames->begin(), pgNames->end(), pg.c_str()) == pgNames->end())
+                pgNames->push_back(pg);
+        }
+    }
+
+    CheckError(pgNames->empty(), UNKNOWN_ERROR,
+               "%s, Failed to get the PG's name for all pipes", __func__);
+
+    return OK;
+}
+
+status_t GraphConfigImpl::pipelineGetConnections(
+                              const std::vector<std::string> &pgList,
+                              std::vector<IGraphType::ScalerInfo> *scalerInfo,
+                              std::vector<IGraphType::PipelineConnection> *confVector) {
+    CheckError(!confVector, UNKNOWN_ERROR, "%s, the confVector is nullptr", __func__);
+    CheckError(mGraphConfigPipe.empty(),
+               UNKNOWN_ERROR, "%s, the mGraphConfigPipe is empty", __func__);
+
+    if (mGraphConfigPipe.size() == 1) {
+        return mGraphConfigPipe.begin()->second->pipelineGetConnections(pgList,
+                                                                        scalerInfo, confVector);
+    }
+
+    vector<IGraphType::PipelineConnection> stillConnVector, videoConnVector;
+    shared_ptr<GraphConfigPipe> &videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
+    shared_ptr<GraphConfigPipe> &stillGraphPipe = mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
+
+    std::vector<IGraphType::ScalerInfo> stillScalerInfo, videoScalerInfo;
+    int ret = videoGraphPipe->pipelineGetConnections(pgList, &videoScalerInfo, &videoConnVector);
+    CheckError(ret != OK, UNKNOWN_ERROR, "Failed to get the connetction from video pipe");
+    ret = stillGraphPipe->pipelineGetConnections(pgList, &stillScalerInfo, &stillConnVector);
+    CheckError(ret != OK, UNKNOWN_ERROR, "Failed to get the connetction from still pipe");
+
+    LOG2("The connetction in video: %zu, in still: %zu; the scalera in video: %zu, in still: %uz",
+         videoConnVector.size(), stillConnVector.size(),
+         videoScalerInfo.size(), stillScalerInfo.size());
+
+    if (!stillScalerInfo.empty()) {
+        for (auto &stillScaler : stillScalerInfo) {
+            videoScalerInfo.push_back(stillScaler);
+        }
+    }
+    *scalerInfo = videoScalerInfo;
+
+    if (videoConnVector.empty()) {
+        videoConnVector = stillConnVector;
+    } else {
+        if (stillConnVector.size() > 0) {
+            LOG1("Need to merge the two connetction vector: %zu", stillConnVector.size());
+        }
+        for (auto &stillConn : stillConnVector) {
+            bool sameTerminalId = false;
+            for (auto &conn : videoConnVector) {
+                if (conn.portFormatSettings.terminalId ==
+                    stillConn.portFormatSettings.terminalId) {
+                    sameTerminalId = true;
+                    if (conn.portFormatSettings.enabled == 0 &&
+                        stillConn.portFormatSettings.enabled == 1)
+                        conn = stillConn;
+                    break;
+                }
+            }
+            if (!sameTerminalId)
+                videoConnVector.push_back(stillConn);
+        }
+    }
+    CheckError(videoConnVector.empty(), UNKNOWN_ERROR,
+               "%s, Failed to get connetctions from graph config pipe", __func__);
+
+    LOG2("dump the final connetction");
+    GraphUtils::dumpConnections(videoConnVector);
+    *confVector = videoConnVector;
+
+    return OK;
+}
+
+status_t GraphConfigImpl::getPgIdForKernel(const uint32_t streamId,
+                                           const int32_t kernelId, int32_t *pgId) {
+    CheckError(!pgId, UNKNOWN_ERROR, "%s, the pgId is nullptr", __func__);
+    CheckError(mGraphConfigPipe.empty(),
+               UNKNOWN_ERROR, "%s, the mGraphConfigPipe is empty", __func__);
+
+    if (mGraphConfigPipe.size() == 1) {
+        return mGraphConfigPipe.begin()->second->getPgIdForKernel(streamId, kernelId, pgId);
+    }
+
+    vector<int32_t> streamIds;
+    shared_ptr<GraphConfigPipe> &videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
+    videoGraphPipe->graphGetStreamIds(&streamIds);
+    if (std::find(streamIds.begin(), streamIds.end(), streamId) != streamIds.end())
+        return videoGraphPipe->getPgIdForKernel(streamId, kernelId, pgId);
+
+    shared_ptr<GraphConfigPipe> &stillGraphPipe = mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
+    return stillGraphPipe->getPgIdForKernel(streamId, kernelId, pgId);
+}
+
+status_t GraphConfigImpl::getPgRbmValue(string pgName, IGraphType::StageAttr *stageAttr) {
+    for (auto &graph : mGraphConfigPipe) {
+        vector<string> pgNames;
+        graph.second->getPgNames(&pgNames);
+        if (std::find(pgNames.begin(), pgNames.end(), pgName) != pgNames.end()) {
+            return graph.second->getPgRbmValue(pgName, stageAttr);
+        }
+    }
+
+    LOGE("There isn't this pg: %s in all graph config pipes", pgName.c_str());
+    return UNKNOWN_ERROR;
+}
+
+/******************************************************************************
+ *  HELPER METHODS
+ ******************************************************************************/
+/**
+ * Check the gralloc hint flags and decide whether this stream should be served
+ * by Video Pipe or Still Pipe
+ */
+bool GraphConfigImpl::isVideoStream(HalStream *stream) {
+    if (stream->useCase() == USE_CASE_PREVIEW || stream->useCase() == USE_CASE_VIDEO)
+        return true;
+
+    return false;
+}
+
+void GraphConfigImpl::dumpQuery(int useCase, const map<GCSS::ItemUID, std::string> &query) {
+    map<GCSS::ItemUID, std::string>::const_iterator it;
+    it = query.begin();
+    LOG1("Query Dump --- %d --- Start", useCase);
+    for ( ; it != query.end(); ++it) {
+        LOG1("item: %s value %s", it->first.toString().c_str(),
+                                  it->second.c_str());
+    }
+    LOG1("Query Dump --- %d --- End", useCase);
+}
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.h b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.h
new file mode 100644
index 000000000000..bcd878b25830
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.h
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2015-2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <gcss.h>
+
+#include <map>
+#include <string>
+#include <memory>
+#include <utility>
+#include <vector>
+#include <unordered_map>
+
+#include "HalStream.h"
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+#include "iutils/Thread.h"
+#include "modules/algowrapper/graph/GraphConfigPipe.h"
+
+namespace icamera {
+
+/**
+ * \enum AndroidGraphConfigKey
+ * List of keys that are Android Specific used in queries of settings by
+ * the GraphConfigImpl.
+ *
+ * The enum should not overlap with the enum of tags already predefined by the
+ * parser, hence the initial offset.
+ */
+#define GCSS_KEY(key, str) GCSS_KEY_##key,
+enum AndroidGraphConfigKey {
+    GCSS_ANDROID_KEY_START = GCSS_KEY_START_CUSTOM_KEYS,
+    #include "custom_gcss_keys.h"
+};
+#undef GCSS_KEY
+
+/**
+ * Static data for graph settings for given sensor. Used to initialize GraphConfigImpl.
+ */
+class GraphConfigNodes {
+ public:
+    GraphConfigNodes();
+    ~GraphConfigNodes();
+
+ public:
+    GCSS::IGraphConfig *mDesc;
+    GCSS::IGraphConfig *mSettings;
+
+ private:
+    // Disable copy constructor and assignment operator
+    DISALLOW_COPY_AND_ASSIGN(GraphConfigNodes);
+};
+
+/**
+ * \class GraphConfigImpl
+ *
+ * Class to wrap over parsing and executing queries on graph settings.
+ * It creates the query rule based on graph settings type and stream list
+ * from user. And filter the final result for current stream config.
+ * It supports COUPLED and DISPERSED
+ *
+ * GraphConfigImpl maintains a GraphConfigPipe map table, each item for one
+ * pipe. And it provides the public APIs to get the useful information which
+ * builds PSYS pipe.
+ *
+ * At camera open, GraphConfigImpl object is created.
+ * In stream config period, GraphConfigImpl creates the GraphConfigPipe map which is
+ * current stream configuration. And HAL can get all the necessary information to
+ * create PSYS pipe.
+ */
+class GraphConfigImpl {
+ public:
+    GraphConfigImpl();
+    GraphConfigImpl(int32_t camId, ConfigMode mode, GraphSettingType type);
+    virtual ~GraphConfigImpl();
+
+    /*
+     * Methods for XML parsing for XML parsing
+     */
+    void addCustomKeyMap();
+    status_t parse(int cameraId, const char *graphDescFile, const char *settingsFile);
+    status_t parse(int cameraId, char *graphDescData, size_t descDataSize,
+                   char *settingsData, size_t settingsDataSize);
+    void releaseGraphNodes();
+
+    // These public methods called by GraphConfig
+    status_t configStreams(const std::vector<HalStream*> &activeStreams);
+    status_t getGraphConfigData(IGraphType::GraphConfigData *data);
+
+    int getProgramGroup(std::string pgName,
+                        ia_isp_bxt_program_group* programGroupForPG);
+    status_t getPgIdForKernel(const uint32_t streamId,
+                              const int32_t kernelId, int32_t *pgId);
+
+    status_t pipelineGetConnections(const std::vector<std::string> &pgList,
+                                    std::vector<IGraphType::ScalerInfo> *scalerInfo,
+                                    std::vector<IGraphType::PipelineConnection> *confVector);
+
+ private:
+    status_t prepareGraphConfig();
+    bool isVideoStream(HalStream *stream);
+    status_t selectSetting(int useCase,
+                           std::map<int, std::vector<GCSS::IGraphConfig*> > *queryResults);
+    status_t createQueryRule(const std::vector<HalStream*> &activeStreams);
+    status_t getRawInputSize(GCSS::IGraphConfig *query, camera_resolution_t *reso);
+
+    status_t getGdcKernelSetting(uint32_t *kernelId, camera_resolution_t *resolution);
+    status_t graphGetStreamIds(std::vector<int32_t> *streamIds);
+    int getStreamIdByPgName(std::string pgName);
+    int getPgIdByPgName(std::string pgName);
+    ia_isp_bxt_program_group *getProgramGroup(int32_t streamId);
+    status_t getPgRbmValue(std::string pgName, IGraphType::StageAttr *stageAttr);
+    status_t getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits *data);
+    status_t getPgNames(std::vector<std::string>* pgNames);
+
+    // Debug helper
+    void dumpQuery(int useCase, const std::map<GCSS::ItemUID, std::string> &query);
+
+ private:
+    static Mutex sLock;
+    static std::unordered_map<int32_t, GraphConfigNodes*> mGraphNode;
+    /**
+     * Pair of ItemUIDs to store the width and height of a stream
+     * first item is for width, second for height
+     */
+    typedef std::pair<GCSS::ItemUID, GCSS::ItemUID> ResolutionItem;
+
+    int32_t mCameraId;
+    std::unique_ptr<GCSS::GraphQueryManager> mGraphQueryManager;
+    /*
+     * The query interface uses types that are actually STL maps and vectors
+     * to avoid the creation/deletion on the stack for every call we
+     * have them as member variables.
+     * - The first item of mQuery is stream useCase(VIDEO or STILL),
+     * - and the second is an query rule map(GCSS_KEY_, VALUE).
+     */
+    std::map<int, std::map<GCSS::ItemUID, std::string> >mQuery;
+
+    /**
+     * Map to get the virtual sink id from a client stream pointer.
+     * The uid is one of the GCSS keys defined for the virtual sinks, like
+     * GCSS_KEY_VIDEO0 or GCSS_KEY_STILL1
+     * From that we can derive the name using the id to string methods from
+     * ItemUID class
+     *  - The first item is streams useCase(VIDEO or STILL)
+     *  - and the second is the stream to virtual sink map
+     */
+    std::map<int, std::map<HalStream*, uid_t> > mStreamToSinkIdMap;
+
+    /*
+     * This vector is used to store the first query result.
+     * After that we also need to filter the results with configMode,
+     * stream format, and matched isys output resolution.
+     */
+    std::vector<GCSS::IGraphConfig*> mFirstQueryResults;
+
+    // The stream useCase to result map
+    std::map<int, GCSS::IGraphConfig*> mQueryResult;
+
+    // The stream useCase to GraphConfigPipe map
+    std::map<int, std::shared_ptr<GraphConfigPipe> > mGraphConfigPipe;
+
+    ConfigMode mConfigMode;
+    GraphSettingType mType;
+    int mMcId;
+
+    // Disable copy constructor and assignment operator
+    DISALLOW_COPY_AND_ASSIGN(GraphConfigImpl);
+};
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.cpp b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.cpp
new file mode 100644
index 000000000000..81496b34b855
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.cpp
@@ -0,0 +1,2035 @@
+/*
+ * Copyright (C) 2018-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "GraphConfigPipe"
+
+#include <v4l2_device.h>
+
+#include <gcss.h>
+#include <gcss_utils.h>
+#include <ia_pal_types_isp_ids_autogen.h>
+#include <GCSSParser.h>
+
+#include <algorithm>
+
+#include "modules/algowrapper/graph/GraphConfigPipe.h"
+#include "linux/media-bus-format.h"
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+#include "iutils/Errors.h"
+#include "GraphUtils.h"
+#include "FormatUtils.h"
+
+using std::vector;
+using std::string;
+using GCSS::GraphConfigNode;
+namespace gcu = graphconfig::utils;
+
+namespace icamera {
+#define STRINGIFY1(x) #x
+#define STRINGIFY(x) STRINGIFY1(x)
+
+// TODO: Change the format attribute natively as integer attribute
+#ifndef VIDEO_RECORDING_FORMAT
+#define VIDEO_RECORDING_FORMAT TILE
+#endif
+
+const char *SENSOR_PORT_NAME = "sensor:port_0";
+const char *TPG_PORT_NAME = "tpg:port_0";
+
+#define DB_KERNEL_SIZE 2
+#define PPP_KERNEL_SIZE 2
+#define DS_KERNEL_SIZE 2
+uint32_t dpKernel[DB_KERNEL_SIZE] = {ia_pal_uuid_isp_sc_outputscaler_dp,
+                                     ia_pal_uuid_isp_sc_outputscaler_dp_1_1};
+uint32_t pppKernel[PPP_KERNEL_SIZE] = {ia_pal_uuid_isp_sc_outputscaler_ppp,
+                                       ia_pal_uuid_isp_sc_outputscaler_ppp_1_1};
+uint32_t dsKernel[DS_KERNEL_SIZE] = {ia_pal_uuid_isp_b2i_ds_1_0_0,
+                                     ia_pal_uuid_isp_b2i_ds_1_0_1};
+
+GraphConfigPipe::GraphConfigPipe(int pipeUseCase) :
+        mSettings(nullptr),
+        mReqId(0),
+        mMetaEnabled(false),
+        mSourceType(SRC_NONE),
+        mPipeUseCase(pipeUseCase) {
+    mCsiOutput = {0, 0};
+}
+
+GraphConfigPipe::~GraphConfigPipe() {
+    fullReset();
+}
+/*
+ * Full reset
+ * This is called whenever we want to reset the whole object. Currently that
+ * is only, when GraphConfigPipe object is destroyed.
+ */
+void GraphConfigPipe::fullReset() {
+    mSourcePortName.clear();
+    mSinkPeerPort.clear();
+    mStreamToSinkIdMap.clear();
+    delete mSettings;
+    mSettings = nullptr;
+    mReqId = 0;
+    mStream2TuningMap.clear();
+    mProgramGroup.clear();
+}
+/*
+ * Reset
+ * This is called per frame
+ */
+void GraphConfigPipe::reset(GraphConfigPipe *me) {
+    if (me != nullptr) {
+        me->mReqId = 0;
+    } else {
+        LOGE("Trying to reset a null GraphConfigPipe - BUG!");
+    }
+}
+
+const GCSS::IGraphConfig* GraphConfigPipe::getInterface(Node *node) const {
+    if (!node)
+        return nullptr;
+
+    return node;
+}
+
+const GCSS::IGraphConfig* GraphConfigPipe::getInterface() const {
+    return mSettings;
+}
+
+int GraphConfigPipe::getGraphId(void) {
+    int graphId = -1;
+    int ret = mSettings->getValue(GCSS_KEY_ID, graphId);
+    if (ret != css_err_none) {
+        LOGE("Failed to get graphId");
+        return BAD_VALUE;
+    }
+
+    LOGG("%s: graphId %d", __func__, graphId);
+    return graphId;
+}
+
+/**
+ * Per frame initialization of graph config.
+ * Updates request id
+ * \param[in] reqId
+ */
+void GraphConfigPipe::init(int32_t reqId) {
+    mReqId = reqId;
+}
+
+/**
+ * Prepare graph config once per stream config.
+ * \param[in] manager
+ * \param[in] settings
+ * \param[in] streamToSinkIdMap
+ * \param[in] active
+ */
+status_t GraphConfigPipe::prepare(Node *settings, const StreamToSinkMap &streamToSinkIdMap) {
+    mSettings = settings;
+    status_t ret = OK;
+
+    if (settings == nullptr) {
+        LOGW("Settings is NULL!! - BUG?");
+        return UNKNOWN_ERROR;
+    }
+
+    ret = analyzeSourceType();
+    if (ret != OK) {
+        LOGE("Failed to analyze source type");
+        return ret;
+    }
+
+    ret = getActiveOutputPorts(streamToSinkIdMap);
+    if (ret != OK) {
+        LOGE("Failed to get output ports");
+        return ret;
+    }
+    // Options should be updated before kernel list generation
+    ret = handleDynamicOptions();
+    if (ret != OK) {
+        LOGE("Failed to update options");
+        return ret;
+    }
+
+    const GCSS::IGraphConfig *gcHandle = getInterface(mSettings);
+    css_err_t status = mGCSSAicUtil.initAicUtils(gcHandle);
+    if (status != css_err_none) {
+        LOGE("Failed to generate kernel list");
+        return UNKNOWN_ERROR;
+    }
+
+    calculateSinkDependencies();
+    storeTuningModes();
+    analyzeCSIOutput();
+
+    return ret;
+}
+
+/**
+ * Store the tuning modes for each stream id into a map that can be used on a
+ * per frame basis.
+ * This method is executed once per stream configuration.
+ * The tuning mode is used by AIC to find the correct tuning tables in CPF.
+ *
+ */
+void GraphConfigPipe::storeTuningModes() {
+    GraphConfigNode::const_iterator it = mSettings->begin();
+    css_err_t ret = css_err_none;
+    GraphConfigNode *result = nullptr;
+    int32_t tuningMode = 0;
+    int32_t streamId = 0;
+    mStream2TuningMap.clear();
+
+    while (it != mSettings->end()) {
+        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group", it, &result);
+        if (ret == css_err_none) {
+            ret = result->getValue(GCSS_KEY_STREAM_ID, streamId);
+            if (ret != css_err_none) {
+                string pgName;
+                // This should  not fail
+                ret = result->getValue(GCSS_KEY_NAME, pgName);
+                LOGW("Failed to find stream id for PG %s", pgName.c_str());
+                continue;
+            }
+            tuningMode = 0;  // default value in case it is not found
+            ret = result->getValue(GCSS_KEY_TUNING_MODE, tuningMode);
+            if (ret != css_err_none) {
+                string pgName;
+                // This should  not fail
+                ret = result->getValue(GCSS_KEY_NAME, pgName);
+                LOG2("There isn't tuning mode for PG %s, defaulting to %d",
+                      pgName.c_str(), tuningMode);
+            }
+            mStream2TuningMap[streamId] =  tuningMode;
+        }
+    }
+}
+/**
+ * Retrieve the tuning mode associated with a given stream id.
+ *
+ * The tuning mode is defined by IQ-studio and represent and index to different
+ * set of tuning parameters in the AIQB (a.k.a CPF)
+ *
+ * The tuning mode is an input parameter for AIC.
+ * \param [in] streamId Identifier for the branch (video/still/isa)
+ * \return tuning mode, if stream id is not found defaults to 0
+ */
+int32_t GraphConfigPipe::getTuningMode(int32_t streamId) {
+    auto item = mStream2TuningMap.find(streamId);
+    if (item != mStream2TuningMap.end()) {
+        return item->second;
+    }
+    LOGW("Could not find tuning mode for requested stream id %d", streamId);
+    return 0;
+}
+
+/*
+ * According to the node, analyze the source type:
+ * TPG or sensor
+ */
+status_t GraphConfigPipe::analyzeSourceType() {
+    bool hasSensor = false, hasTPG = false;
+    Node *inputDevNode = nullptr;
+    css_err_t ret = mSettings->getDescendant(GCSS_KEY_SENSOR, &inputDevNode);
+    if (ret == css_err_none) {
+        mSourceType = SRC_SENSOR;
+        mSourcePortName = SENSOR_PORT_NAME;
+        hasSensor = true;
+    } else {
+        LOG1("No sensor node from the graph");
+    }
+
+    ret = mSettings->getDescendant(GCSS_KEY_TPG, &inputDevNode);
+    if (ret == css_err_none) {
+        mSourceType = SRC_TPG;
+        mSourcePortName = TPG_PORT_NAME;
+        hasTPG = true;
+    } else {
+        LOG1("No TPG node from the graph");
+    }
+
+    if (hasTPG == hasSensor) {
+        // failed to analyze source type, reset them
+        mSourceType = SRC_NONE;
+        mSourcePortName.clear();
+        LOGE("Error: Both TPG/Sensor exist or none of TPG/Sensor");
+        return UNKNOWN_ERROR;
+    }
+
+    return OK;
+}
+
+status_t GraphConfigPipe::analyzeCSIOutput() {
+    vector<string> csiBeOutput = {
+        "csi_be:output",
+        "csi_be_soc:output"
+    };
+    for (auto &item : csiBeOutput) {
+        GCSS::IGraphConfig *csiBeNode =
+            static_cast<GCSS::IGraphConfig*>(mSettings)->getDescendantByString(item.c_str());
+        if (csiBeNode != nullptr) {
+            GCSS::GraphCameraUtil::getDimensions(csiBeNode, &mCsiOutput.width, &mCsiOutput.height);
+            return OK;
+        }
+    }
+
+    LOGE("Error: Couldn't get CSI-BE node");
+    return UNKNOWN_ERROR;
+}
+
+status_t GraphConfigPipe::getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits *data) {
+     css_err_t ret = mGCSSAicUtil.getMbrData(streamId, data);
+     if (ret == css_err_none) {
+         return OK;
+     } else {
+         LOG2("fail to getMBRData for stream id:%d", streamId);
+         return UNKNOWN_ERROR;
+     }
+}
+/**
+ * Finds the sink nodes and the output port peer. Use streamToSinkIdMap
+ * since we are intrested only in sinks that serve a stream. Takes an
+ * internal copy of streamToSinkIdMap to be used later.
+ *
+ * \param[in] streamToSinkIdMap to get the virtual sink id from a client stream pointer
+ * \return OK in case of success.
+ * \return UNKNOWN_ERROR or BAD_VALUE in case of fail.
+ */
+status_t GraphConfigPipe::getActiveOutputPorts(const StreamToSinkMap &streamToSinkIdMap) {
+    status_t status = OK;
+    css_err_t ret = css_err_none;
+    std::vector<GCSS::IGraphConfig*> sinks;
+
+    mStreamToSinkIdMap.clear();
+    mStreamToSinkIdMap = streamToSinkIdMap;
+    mSinkPeerPort.clear();
+
+    StreamToSinkMap::const_iterator it;
+    it = streamToSinkIdMap.begin();
+
+    for (; it != streamToSinkIdMap.end(); ++it) {
+        sinks.clear();
+        status = GCSS::GraphCameraUtil::graphGetSinksByName(GCSS::ItemUID::key2str(it->second),
+                                                            mSettings, sinks);
+        if (status != OK || sinks.empty()) {
+            string sinkName = GCSS::ItemUID::key2str(it->second);
+            LOGE("Found %zu sinks, expecting 1 for sink %s", sinks.size(),
+                 sinkName.c_str());
+            return BAD_VALUE;
+        }
+
+        Node *sink = static_cast<GraphConfigNode*>(sinks[0]);
+        Node *outputPort = nullptr;
+
+        // Get the sinkname for getting the output port
+        string sinkName;
+        ret =  sink->getValue(GCSS_KEY_NAME, sinkName);
+        if (ret != css_err_none) {
+            LOGE("Failed to get sink name");
+            return BAD_VALUE;
+        }
+        LOG2("sink name %s", sinkName.c_str());
+
+        int32_t streamId = -1;
+        ret = sink->getValue(GCSS_KEY_STREAM_ID, streamId);
+        if (ret != css_err_none) {
+            LOGE("Failed to get stream id");
+            return BAD_VALUE;
+        }
+        LOG2("stream id %d", streamId);
+
+        outputPort = getOutputPortForSink(sinkName);
+        if (outputPort == nullptr) {
+            LOGE("No output port found for sink");
+            return UNKNOWN_ERROR;
+        }
+
+        LOG2("output port name %s", NODE_NAME(outputPort));
+        mSinkPeerPort[sink] = outputPort;
+    }
+
+    return OK;
+}
+
+string GraphConfigPipe::getNodeName(Node * node) {
+    string nodeName("");
+    if (node == nullptr) {
+        LOGE("Node is NULL");
+        return nodeName;
+    }
+
+    node->getValue(GCSS_KEY_NAME, nodeName);
+    return nodeName;
+}
+
+/**
+ * Finds the output port which is the peer to the sink node.
+ *
+ * Gets root node, and finds the sink with the given name. Use portGetPeer()
+ * to find the output port.
+ * \return GraphConfigNode in case of success.
+ * \return nullptr in case of fail.
+ */
+Node *GraphConfigPipe::getOutputPortForSink(const string &sinkName) {
+    css_err_t ret = css_err_none;
+    status_t retErr = OK;
+    Node *rootNode = nullptr;
+    Node *portNode = nullptr;
+    Node *peerNode = nullptr;
+
+    rootNode = mSettings->getRootNode();
+    if (rootNode == nullptr) {
+        LOGE("Couldn't get root node, BUG!");
+        return nullptr;
+    }
+    ret = rootNode->getDescendantByString(sinkName, &portNode);
+    if (ret != css_err_none) {
+        LOGE("Error getting sink");
+        return nullptr;
+    }
+    retErr = portGetPeer(portNode, &peerNode);
+    if (retErr != OK) {
+        LOGE("Error getting peer");
+        return nullptr;
+    }
+    return peerNode;
+}
+
+/**
+ * Update the option-list to the graph tree.
+ * TODO: Add more options.
+ * \return OK in case of success
+ * \return UNKNOWN_ERROR if graph update failed.
+ */
+status_t GraphConfigPipe::handleDynamicOptions() {
+    status_t status = setPortFormats();
+    if (status != OK) {
+        LOGE("Failed to update metadata");
+        return UNKNOWN_ERROR;
+    }
+
+    // TODO add other options
+    return status;
+}
+
+/**
+ * Returns true if the given node is used to output a video record
+ * stream. The sink name is found and used to find client stream from the
+ * mStreamToSinkIdMap.
+ * Then the video encoder gralloc flag is checked from the stream flags of the
+ * client stream.
+ * \param[in] peer output port to find the sink node of.
+ * \return true if sink port serves a video record stream.
+ * \return false if sink port does not serve a video record stream.
+ */
+bool GraphConfigPipe::isVideoRecordPort(Node *sink) {
+    css_err_t ret = css_err_none;
+    string sinkName;
+    HalStream* clientStream = nullptr;
+
+    if (sink == nullptr) {
+        LOGE("No sink node provided");
+        return false;
+    }
+
+    ret = sink->getValue(GCSS_KEY_NAME, sinkName);
+    if (ret != css_err_none) {
+        LOGE("Failed to get sink name");
+        return false;
+    }
+
+    // Find the client stream for the sink port
+    StreamToSinkMap::iterator it1;
+    it1 = mStreamToSinkIdMap.begin();
+
+    for (; it1 != mStreamToSinkIdMap.end(); ++it1) {
+        if (GCSS::ItemUID::key2str(it1->second) == sinkName) {
+            clientStream = it1->first;
+            break;
+        }
+    }
+
+    if (clientStream == nullptr) {
+        LOGE("Failed to find client stream");
+        return false;
+    }
+
+    if (clientStream->useCase() == USE_CASE_VIDEO) {
+        LOG2("%s is video record port", NODE_NAME(sink));
+        return true;
+    }
+
+    return false;
+}
+
+/**
+ * Takes a stream id, and checks if it exists in the graph.
+ *
+ * \param[in] streamId
+ * \return true if found, false otherwise
+ */
+bool GraphConfigPipe::hasStreamInGraph(int streamId) {
+    status_t status;
+    StreamsVector streamsFound;
+
+    status = graphGetStreamIds(&streamsFound);
+    if (status != OK)
+        return false;
+
+    for (auto id : streamsFound) {
+        if (id == streamId)
+            return true;
+    }
+    return false;
+}
+
+/**
+ * Apply the video recording format for the video record stream handling
+ * output port.
+ * \return OK in case of success
+ * \return UNKNOWN_ERROR if option list apply failed.
+ */
+status_t GraphConfigPipe::setPortFormats() {
+    css_err_t ret = css_err_none;
+    std::map<Node*, Node*>::iterator it;
+    it = mSinkPeerPort.begin();
+
+    for (; it != mSinkPeerPort.end(); ++it) {
+        Node *sink = it->first;
+        Node *peer = it->second;
+        if (!isVideoRecordPort(sink))
+            continue;
+
+        ret = peer->setValue(GCSS_KEY_FORMAT, STRINGIFY(VIDEO_RECORDING_FORMAT));
+        if (ret != css_err_none) {
+            // If format attribute does not exist, create it.
+            ret = peer->addValue(GCSS_KEY_FORMAT, STRINGIFY(VIDEO_RECORDING_FORMAT));
+            if (ret != css_err_none) {
+                LOGE("Failed to update options for video record port");
+                return UNKNOWN_ERROR;
+            }
+        }
+    }
+
+    return OK;
+}
+
+/**
+ * Returns pointer to kernel list based on given stream id
+ * \param[in] streamId Return kernel list for this stream id
+ * \return ia_isp_bxt_program_group
+ */
+ia_isp_bxt_program_group *GraphConfigPipe::getProgramGroup(int32_t streamId) {
+    if (mProgramGroup.find(streamId) == mProgramGroup.end()) {
+        ia_isp_bxt_program_group programGroup;
+        CLEAR(programGroup);
+        mGCSSAicUtil.getProgramGroup(streamId, programGroup);
+        mProgramGroup[streamId] = programGroup;
+    }
+    LOGG("Dump kernel info for stream %d", streamId);
+    GraphUtils::dumpKernelInfo(mProgramGroup[streamId]);
+
+    return &(mProgramGroup[streamId]);
+}
+
+int GraphConfigPipe::getProgramGroup(string pgName,
+                                     ia_isp_bxt_program_group * programGroupForPG) {
+    GCSS::NodeIterator iter(mSettings);
+    GCSS::IGraphConfig *pg = iter.iterateByType(GCSS_KEY_PROGRAM_GROUP);
+    std::string name;
+    for ( ; pg != nullptr; pg = iter.iterateByType(GCSS_KEY_PROGRAM_GROUP)) {
+        css_err_t ret = pg->getValue(GCSS_KEY_NAME, name);
+        CheckError(ret != css_err_none, BAD_VALUE,
+                   "Failed to get the name of an existing PG node, BUG");
+        if (name == pgName) {
+            break;
+        }
+    }
+    CheckError(pg == nullptr, UNKNOWN_ERROR, "Failed to get program groups, BUG");
+
+    mGCSSAicUtil.getProgramGroup(pg, *programGroupForPG);
+
+    LOGG("Dump kernel info for %s", pgName.c_str());
+    GraphUtils::dumpKernelInfo(*programGroupForPG);
+
+    return OK;
+}
+
+status_t GraphConfigPipe::getPgRbmValue(string pgName, IGraphType::StageAttr *stageAttr) {
+    std::string name;
+    GCSS::NodeIterator iter(mSettings);
+    GCSS::IGraphConfig *pg = iter.iterateByType(GCSS_KEY_PROGRAM_GROUP);
+
+    for (; pg != nullptr; pg = iter.iterateByType(GCSS_KEY_PROGRAM_GROUP)) {
+        css_err_t ret = pg->getValue(GCSS_KEY_NAME, name);
+        CheckError(ret != css_err_none, BAD_VALUE, "Failed to get the name of PG node");
+        if (name == pgName) {
+            break;
+        }
+    }
+    CheckError(pg == nullptr, UNKNOWN_ERROR,
+               "Failed to get program groups for PG: %s", pgName.c_str());
+
+    pg = pg->getDescendant(GCSS_KEY_CIPF);
+    if (pg == nullptr) return NAME_NOT_FOUND;
+
+    string rbmString;
+    css_err_t ret = pg->getValue(GCSS_KEY_RBM, rbmString);
+    if (ret != css_err_none) return NAME_NOT_FOUND;
+
+    GCSS::GraphCameraUtil mGCSSCameraUtil;
+    stageAttr->rbm = mGCSSCameraUtil.numString2binary(rbmString, &stageAttr->rbm_bytes);
+    CheckError(!stageAttr->rbm, NO_MEMORY, "%s get rbm value: %s", __func__, rbmString.c_str());
+
+    return OK;
+}
+
+status_t GraphConfigPipe::getScalerKernelResolutionRatio(uint32_t *kenerArray,
+                                                         uint32_t sizeArray,
+                                                         float *widthRatio, float *heightRatio) {
+    CheckError(sizeArray > 0, UNKNOWN_ERROR, "%s the array is null", __func__);
+    CheckError(!widthRatio ||!heightRatio , UNKNOWN_ERROR,
+               "%s widthRatio or heightRatio is null", __func__);
+
+    const ia_isp_bxt_resolution_info_t *resolutionInfo;
+    resolutionInfo = getScalerKernelResolutionInfo(kenerArray, sizeArray);
+    CheckError(!resolutionInfo, UNKNOWN_ERROR, "%s getScalerKernelResolutionInfo fails", __func__);
+
+    *widthRatio = 1.0;
+    *heightRatio = 1.0;
+    if ((resolutionInfo) && ((resolutionInfo->input_width != resolutionInfo->output_width) ||
+        (resolutionInfo->input_height != resolutionInfo->output_height))) {
+        *widthRatio = static_cast<float>(resolutionInfo->input_width) /
+                      static_cast<float>(resolutionInfo->output_width);
+        *heightRatio = static_cast<float>(resolutionInfo->input_height) /
+                       static_cast<float>(resolutionInfo->output_height);
+    }
+    return OK;
+}
+
+const ia_isp_bxt_resolution_info_t *GraphConfigPipe::getScalerKernelResolutionInfo(
+                                                                        uint32_t *kenerArray,
+                                                                        uint32_t sizeArray) {
+    CheckError(sizeArray > 0, nullptr, "%s the array is null", __func__);
+
+    std::vector<int32_t> streamIds;
+    // Get all stream IDs
+    status_t ret = graphGetStreamIds(&streamIds);
+    CheckWarning((ret != OK || streamIds.empty()), nullptr, "Failed to get the PG streamIds");
+
+    uint32_t kernelId = kenerArray[0];
+    int32_t streamIdTmp = VIDEO_STREAM_ID;
+
+    bool hasVideo = false;
+    for (auto streamId : streamIds) {
+        for (uint32_t i = 0; i < sizeArray; i++) {
+            if (isKernelInStream(streamId, kenerArray[i])) {
+                LOG2("%s, found outputscaler %u from stream %d", __func__, kenerArray[i], streamId);
+                streamIdTmp = streamId;
+                kernelId = kenerArray[i];
+                if (streamId == VIDEO_STREAM_ID) hasVideo = true;
+
+                break;
+            }
+        }
+        if (hasVideo) break;
+    }
+
+    // Get resolution as per above kernel and stream
+    return getKernelResolutionInfo(streamIdTmp, kernelId);
+}
+
+const ia_isp_bxt_resolution_info_t *GraphConfigPipe::getGdcKernelResolutionInfo(
+                                                                           uint32_t *kernelId) {
+    CheckError(!kernelId , nullptr, "%s the kernelId is nullptr", __func__);
+
+    std::vector<int32_t> streamIds;
+    // Get all stream IDs
+    status_t ret = graphGetStreamIds(&streamIds);
+    CheckWarning((ret != OK || streamIds.empty()), nullptr, "Failed to get the PG streamIds");
+
+    *kernelId = ia_pal_uuid_isp_gdc3;
+    LOG1("%s, initalize gdc version 3 as default", __func__);
+    int32_t gdcStreamId = VIDEO_STREAM_ID;
+    LOG1("%s, initalize gdc video stream as default", __func__);
+
+    // Check video stream for gdc version firstly,
+    // in case more than one stream contain gdc kernel.
+    bool hasVideoGdc = false;
+    for (auto streamId : streamIds) {
+        if (isKernelInStream(streamId, ia_pal_uuid_isp_gdc3_1)) {
+            LOG1("%s, found gdc3_1 from stream %d", __func__, streamId);
+            gdcStreamId = streamId;
+            *kernelId = ia_pal_uuid_isp_gdc3_1;
+            if (streamId == VIDEO_STREAM_ID) hasVideoGdc = true;
+        } else if (isKernelInStream(streamId, ia_pal_uuid_isp_gdc3)) {
+            LOG1("%s, found gdc3 from stream %d", __func__, streamId);
+            gdcStreamId = streamId;
+            *kernelId = ia_pal_uuid_isp_gdc3;
+            if (streamId == VIDEO_STREAM_ID) hasVideoGdc = true;
+        } else if (isKernelInStream(streamId, ia_pal_uuid_isp_gdc3_1_1)) {
+            LOG1("%s, found gdc3_1_1 from stream %d", __func__, streamId);
+            gdcStreamId = streamId;
+            *kernelId = ia_pal_uuid_isp_gdc3_1_1;
+            if (streamId == VIDEO_STREAM_ID) hasVideoGdc = true;
+        } else if (isKernelInStream(streamId, ia_pal_uuid_isp_gdc5)) {
+            LOG1("%s, found gdc5 from stream %d", __func__, streamId);
+            gdcStreamId = streamId;
+            *kernelId = ia_pal_uuid_isp_gdc5;
+            if (streamId == VIDEO_STREAM_ID) hasVideoGdc = true;
+        }
+        if (hasVideoGdc) break;
+    }
+
+    // Get resolution as per above kernel and stream
+    return getKernelResolutionInfo(gdcStreamId, *kernelId);
+}
+
+status_t GraphConfigPipe::getGdcKernelSetting(uint32_t *kernelId,
+                                              camera_resolution_t *resolution) {
+    CheckError(!kernelId || !resolution, UNKNOWN_ERROR,
+               "%s the kernelId or resolution is nullptr", __func__);
+
+    // Get resolution as per above kernel and stream
+    const ia_isp_bxt_resolution_info_t *gdcResolution = getGdcKernelResolutionInfo(kernelId);
+    CheckWarning(!gdcResolution, NO_ENTRY,
+                 "Couldn't get the GDC resolution in current pipe: %d", mPipeUseCase);
+
+    resolution->width = gdcResolution->input_width;
+    resolution->height = gdcResolution->input_height;
+    LOGG("%s: kernel %d, res %dx%d", __func__, kernelId, resolution->width, resolution->height);
+
+    return OK;
+}
+
+const ia_isp_bxt_resolution_info_t *GraphConfigPipe::getKernelResolutionInfo(
+        uint32_t streamId,
+        uint32_t kernelId) {
+    ia_isp_bxt_program_group *programGroup = getProgramGroup(streamId);
+    if (programGroup == nullptr) {
+        return nullptr;
+    }
+
+    for (unsigned int i = 0; i < programGroup->kernel_count; i++) {
+        if (programGroup->run_kernels[i].stream_id == streamId &&
+            programGroup->run_kernels[i].kernel_uuid == kernelId) {
+            return programGroup->run_kernels[i].resolution_info;
+        }
+    }
+
+    return nullptr;
+}
+
+/**
+ * check whether the kernel is in this stream
+ *
+ * \param[in] streamId stream id.
+ * \param[in] kernelId kernel id.
+ * \param[out] whether the kernel in this stream
+ * \return true the kernel is in this stream
+ * \return false the kernel isn't in this stream.
+ *
+ */
+bool GraphConfigPipe::isKernelInStream(uint32_t streamId, uint32_t kernelId) {
+    ia_isp_bxt_program_group *programGroup = getProgramGroup(streamId);
+    if (programGroup == nullptr) {
+        return false;
+    }
+    for (unsigned int i = 0; i < programGroup->kernel_count; i++) {
+        if (programGroup->run_kernels[i].kernel_uuid == kernelId) {
+            return true;
+        }
+    }
+
+    return false;
+}
+
+/**
+ * get program group id for some kernel
+ *
+ * \param[in] streamId stream id.
+ * \param[in] kernelId kernel pal uuid.
+ * \param[out] program group id that contain this kernel with the same stream id
+ * \return error if can't find the kernel id in any ot the PGs in this stream
+ */
+status_t GraphConfigPipe::getPgIdForKernel(const uint32_t streamId,
+                                           const int32_t kernelId, int32_t *pgId) {
+    CheckError(!pgId, UNKNOWN_ERROR, "%s, the pgId is nullptr", __func__);
+    css_err_t ret = css_err_none;
+    status_t retErr;
+    NodesPtrVector programGroups;
+
+    // Get all program groups with the stream id
+    retErr = streamGetProgramGroups(streamId, &programGroups);
+    if (retErr != OK) {
+        LOGE("ERROR: couldn't get program groups");
+        return retErr;
+    }
+
+    // Go through all the program groups with the selected streamID
+    for (auto & ndVec : programGroups) {
+        /* Iterate through program group nodes, find kernel and get the PG id */
+        GCSS::GraphConfigItem::const_iterator it = ndVec->begin();
+        while (it != ndVec->end()) {
+            Node *kernelNode = nullptr;
+            // Look for kernel with the requested uuid
+            ret = ndVec->getDescendant(GCSS_KEY_PAL_UUID,
+                                       kernelId,
+                                       it,
+                                       &kernelNode);
+            if (ret != css_err_none)
+                continue;
+
+            ret = ndVec->getValue(GCSS_KEY_PG_ID, *pgId);
+            if (ret == css_err_none) {
+                LOG2("got the pgid:%d for kernel id:%d in stream:%d", *pgId, kernelId, streamId);
+                return OK;
+            }
+            LOGE("ERROR: Couldn't get pg id for kernel %d", kernelId);
+            return BAD_VALUE;
+        }
+    }
+    LOG2("%s: kernel id %d is not found in stream %d", __func__, kernelId, streamId);
+    return BAD_VALUE;
+}
+
+/**
+ * This method creates SinkDependency structure for every active sink found in
+ * the graph. These structs allow quick access to information that is required
+ * by other methods.
+ * Active sinks are the ones that have a connection to an active port.
+ * This list of active sinks(mSinkPeerPort) has to be filled before this method
+ * is executed.
+ * For every virtual sink we store the name (as a key) and the terminal id of
+ * the input port of the stream associated with that stream. This input port
+ * will be the destination of the buffers from the capture unit.
+ *
+ * This method is used during init()
+ * If we would have different settings per frame then this would be enough
+ * to detect the active ISA nodes, but we are not there yet. we are still using
+ * the base graph settings every frame.
+ */
+void GraphConfigPipe::calculateSinkDependencies() {
+    status_t status = OK;
+    GCSS::IGraphConfig *streamInputPort = nullptr;
+    std::string sinkName;
+    SinkDependency aSinkDependency;
+    ia_uid stageId;  // not needed
+    mSinkDependencies.clear();
+    mIsaOutputPort2StreamId.clear();
+    std::map<Node*, Node*>::iterator sinkIter = mSinkPeerPort.begin();
+
+    for (; sinkIter != mSinkPeerPort.end(); ++sinkIter) {
+        sinkIter->first->getValue(GCSS_KEY_NAME, sinkName);
+        aSinkDependency.sinkGCKey = GCSS::ItemUID::str2key(sinkName);
+        sinkIter->first->getValue(GCSS_KEY_STREAM_ID, aSinkDependency.streamId);
+        status = GCSS::GraphCameraUtil::getInputPort(GCSS_KEY_STREAM_ID, aSinkDependency.streamId,
+            mSettings, &streamInputPort);
+        if (status != OK) {
+            LOGE("Failed to get input port for stream %d associated to sink %s",
+                aSinkDependency.streamId, sinkName.c_str());
+            continue;
+        }
+        status = GCSS::GraphCameraUtil::portGetFourCCInfo(streamInputPort,
+            stageId,
+            aSinkDependency.streamInputPortId);
+        if (status != OK) {
+            LOGE("Failed to get stream %d input port 4CC code",
+                aSinkDependency.streamId);
+            continue;
+        }
+        GCSS::IGraphConfig *temp = nullptr;
+        status = GCSS::GraphCameraUtil::portGetPeer(streamInputPort, &temp);
+        if (status != OK) {
+            LOGE("fail to get peer for the port(%s)",
+                 GCSS::GraphCameraUtil::print(streamInputPort).c_str());
+            continue;
+        }
+        aSinkDependency.peer = static_cast<Node*>(temp);
+        LOG2("Adding dependency %s stream id %d", sinkName.c_str(), aSinkDependency.streamId);
+        mSinkDependencies.push_back(aSinkDependency);
+
+        // get the output port of capture unit
+        status = GCSS::GraphCameraUtil::portGetPeer(streamInputPort, &temp);
+        if (status != OK) {
+            LOGE("Fail to get isa output port for sink %s", sinkName.c_str());
+            continue;
+        }
+        Node *isaOutPutPort = static_cast<Node*>(temp);
+        std::string fullName;
+        status = portGetFullName(isaOutPutPort, &fullName);
+        if (status != OK) {
+            LOGE("Fail to get isa output port name");
+            continue;
+        }
+        int32_t streamId = portGetStreamId(isaOutPutPort);
+        if (streamId != -1 &&
+            mIsaOutputPort2StreamId.find(fullName) == mIsaOutputPort2StreamId.end())
+            mIsaOutputPort2StreamId[fullName] = streamId;
+    }
+}
+
+/**
+ * This method is used by the GC Manager that has access to the request
+ * to inform us of what are the active sinks.
+ * Using the sink dependency information we can then know which ISA ports
+ * are active for this GC.
+ *
+ * Once we have different settings per request then we can incorporate this
+ * method into calculateSinkDependencies.
+ *
+ * \param[in] activeSinks Vector with GCSS_KEY's of the active sinks in a
+ *                        request
+ */
+void GraphConfigPipe::setActiveSinks(const std::vector<uid_t> &activeSinks) {
+    mIsaActiveDestinations.clear();
+    uid_t activeDest = 0;
+
+    for (auto sink : activeSinks) {
+        for (auto& dependency : mSinkDependencies) {
+            if (dependency.sinkGCKey == sink) {
+                activeDest = dependency.streamInputPortId;
+                mIsaActiveDestinations[activeDest] = activeDest;
+            }
+        }
+    }
+}
+
+/**
+ * This method is used by the GC Manager that has access to the request
+ * to inform us of what will the stream id be used.
+ * Using the sink dependency information we can then know which stream ids
+ * are active for this GC.
+ *
+ * Once we have different settings per request then we can incorporate this
+ * method into calculateSinkDependencies.
+ *
+ * \param[in] activeSinks Vector with GCSS_KEY's of the active sinks in a
+ *                        request
+ */
+void GraphConfigPipe::setActiveStreamId(const std::vector<uid_t> &activeSinks) {
+    mActiveStreamId.clear();
+    int32_t activeStreamId = 0;
+
+    for (auto sink : activeSinks) {
+        for (auto& dependency : mSinkDependencies) {
+            if (dependency.sinkGCKey == sink) {
+                activeStreamId = dependency.streamId;
+                mActiveStreamId.insert(activeStreamId);
+
+                // get peer's stream Id
+                activeStreamId = portGetStreamId(dependency.peer);
+                if (activeStreamId == -1) {
+                    LOGE("fail to get the stream id for peer port");
+                    continue;
+                }
+                if (mActiveStreamId.find(activeStreamId) == mActiveStreamId.end())
+                    mActiveStreamId.insert(activeStreamId);
+            }
+        }
+    }
+}
+
+int GraphConfigPipe::getStreamIdByPgName(string pgName) {
+    css_err_t ret = ia_err_none;
+    string foundPgName = "invalid";
+    GraphConfigNode* programGroup = nullptr;
+    GraphConfigNode::const_iterator it = mSettings->begin();
+
+    while (it != mSettings->end()) {
+        programGroup = nullptr;
+        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group", it, &programGroup);
+        if (ret != ia_err_none || programGroup == nullptr) {
+            continue;
+        }
+
+        ret = programGroup->getValue(GCSS_KEY_NAME, foundPgName);
+        if (ret != ia_err_none) {
+            LOGW("%s, failed to get pg name in program group", __func__);
+            continue;
+        }
+
+        if (foundPgName == pgName)
+            break;
+    }
+
+    if (foundPgName != pgName || !programGroup) {
+        LOG2("No matched PG found in pipeUseCase: %d", mPipeUseCase);
+        return -1;
+    }
+
+    int streamId = -1;
+    ret = programGroup->getValue(GCSS_KEY_STREAM_ID, streamId);
+    CheckError(ret != ia_err_none, -1,
+               "Get streamId failed by name:%s, pipeUseCase: %d", pgName.c_str(), mPipeUseCase);
+
+    LOGG("%s: streamId %d", __func__, streamId);
+    return streamId;
+}
+
+status_t GraphConfigPipe::getPgNames(std::vector<string>* pgNames) {
+    css_err_t ret = css_err_none;
+    GraphConfigNode::const_iterator it = mSettings->begin();
+    GraphConfigNode* programGroup = nullptr;
+
+    while (it != mSettings->end()) {
+        programGroup = nullptr;
+        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group", it, &programGroup);
+        if (ret != css_err_none || programGroup == nullptr) {
+            continue;
+        }
+
+        string foundPgName;
+        ret = programGroup->getValue(GCSS_KEY_NAME, foundPgName);
+        if (ret != css_err_none) {
+            LOGW("%s, failed to get pg name in program group", __func__);
+            continue;
+        }
+
+        pgNames->push_back(foundPgName);
+    }
+
+    return OK;
+}
+
+bool GraphConfigPipe::containPgs(std::vector<string> pgNames) {
+    std::vector<string> allPgNames;
+    getPgNames(&allPgNames);
+
+    for (auto &name : pgNames) {
+        if (std::find(allPgNames.begin(), allPgNames.end(), name.c_str()) == allPgNames.end())
+            return false;
+    }
+    return true;
+}
+
+int GraphConfigPipe::getPgIdByPgName(string pgName) {
+    css_err_t ret = css_err_none;
+    GraphConfigNode::const_iterator it = mSettings->begin();
+    GraphConfigNode* programGroup = nullptr;
+    bool foundMatchedPg = false;
+
+    while (it != mSettings->end()) {
+        programGroup = nullptr;
+        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group", it, &programGroup);
+        if (ret != css_err_none || programGroup == nullptr) {
+            continue;
+        }
+
+        string foundPgName;
+        ret = programGroup->getValue(GCSS_KEY_NAME, foundPgName);
+        if (ret != css_err_none) {
+            LOGW("%s, failed to get pg name in program group", __func__);
+            continue;
+        }
+
+        if (foundPgName == pgName) {
+            foundMatchedPg = true;
+            break;
+        }
+    }
+
+    if (!foundMatchedPg) {
+        LOG2("No matched PG found, pgName: %s, pipeUseCase: %d", pgName.c_str(), mPipeUseCase);
+        return -1;
+    }
+
+    const GCSS::IGraphConfig* gc = getInterface(programGroup);
+    CheckError(gc == nullptr, -1, "%s, Failed to get graph config interface", __func__);
+
+    int pgId = -1;
+    ret = gc->getValue(GCSS_KEY_PG_ID, pgId);
+    CheckError(ret != css_err_none, -1, "Get PG ID failed with:%d", ret);
+
+    LOGG("%s: pgName %s, pgId %d", __func__, pgName.c_str(), pgId);
+    return pgId;
+}
+
+status_t GraphConfigPipe::getProgramGroupsByName(const std::vector<std::string> &pgNames,
+                                                 NodesPtrVector *programGroups) {
+    CheckError(!programGroups, UNKNOWN_ERROR, "%s, The programGroups is nullptr", __func__);
+    css_err_t ret = css_err_none;
+    GraphConfigNode *result;
+    NodesPtrVector allProgramGroups;
+    string foundPgName;
+
+    GraphConfigNode::const_iterator it = mSettings->begin();
+
+    while (it != mSettings->end()) {
+        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group",
+                it, &result);
+        if (ret == css_err_none)
+            allProgramGroups.push_back(result);
+    }
+
+    CheckError(allProgramGroups.empty(), UNKNOWN_ERROR,
+               "%s, doesn't find any PG in current pipe: %d", __func__, mPipeUseCase);
+    for (auto &ndVec : allProgramGroups) {
+        ret = ndVec->getValue(GCSS_KEY_NAME, foundPgName);
+        if (ret != css_err_none) {
+            LOGE("%s, failed to get pg name in program group", __func__);
+            continue;
+        }
+
+        for (auto &name : pgNames) {
+            if (foundPgName.find(name) != string::npos) {
+                programGroups->push_back(ndVec);
+            }
+        }
+    }
+    if (programGroups->empty()) {
+        LOG2("%s, doesn't find the matched pg in current pipe: %d", __func__, mPipeUseCase);
+    }
+
+    return OK;
+}
+
+status_t GraphConfigPipe::pipelineGetConnections(
+        const std::vector<std::string> &pgList,
+        std::vector<IGraphType::ScalerInfo> *scalerInfo,
+        std::vector<IGraphType::PipelineConnection> *confVector) {
+    CheckError(!confVector, UNKNOWN_ERROR, "%s, the confVector is nullptr", __func__);
+
+    NodesPtrVector programGroups;
+    NodesPtrVector alreadyConnectedPorts;
+    Node *peerPort = nullptr;
+    Node *port = nullptr;
+    IGraphType::PipelineConnection aConnection;
+    std::map<Node*, IGraphType::PipelineConnection> edgePort2Connection;
+
+    status_t status = getProgramGroupsByName(pgList, &programGroups);
+    CheckError(status != OK, status, "%s, failed to get program groups, BUG", __func__);
+
+    for (size_t i = 0; i < programGroups.size(); i++) {
+        Node::const_iterator it = programGroups[i]->begin();
+
+        while (it != programGroups[i]->end()) {
+            css_err_t ret = programGroups[i]->getDescendant(GCSS_KEY_TYPE, "port",
+                    it, &port);
+            if (ret != css_err_none)
+                continue;
+
+            // port for private terminal, no need to connect
+            int priv = 0;
+            ret = port->getValue(GCSS_KEY_PRIVATE, priv);
+            if (ret == css_err_none && priv)
+                continue;
+
+            /*
+             * Since we are iterating through the ports
+             * check if this port is already connected to avoid setting
+             * the connection twice
+             */
+            if (std::find(alreadyConnectedPorts.begin(),
+                        alreadyConnectedPorts.end(),
+                        port) != alreadyConnectedPorts.end()) {
+                continue;
+            }
+            LOG1("Configuring Port from PG[%zu] in line:%d", i, __LINE__);
+
+            string contentType;
+            ret = port->getValue(GCSS_KEY_CONTENT_TYPE, contentType);
+            if (ret == css_err_none && contentType != "pixel_data") {
+                LOG2("%s skipped content type %s", NODE_NAME(port), contentType.c_str());
+                continue;
+            }
+
+            status = portGetFormat(port, &(aConnection.portFormatSettings));
+            if (status != OK) {
+                LOGE("Failed to get port format info in port from PG[%zu]", i);
+                return BAD_VALUE;
+            }
+            if (aConnection.portFormatSettings.enabled == 0) {
+                LOG1("Port from PG[%zu] disabled", i);
+                status = portGetOwner(port, &(aConnection.connectionConfig));
+                CheckError((status != OK), BAD_VALUE,
+                           "Failed to get ownerfor port from PG[%zu]", i);
+                confVector->push_back(aConnection);
+                continue;
+            } else {
+                LOG1("Port: 0x%x format(%dx%d)fourcc: %s bpl: %d bpp: %d",
+                        aConnection.portFormatSettings.terminalId,
+                        aConnection.portFormatSettings.width,
+                        aConnection.portFormatSettings.height,
+                        CameraUtils::fourcc2String(aConnection.portFormatSettings.fourcc).c_str(),
+                        aConnection.portFormatSettings.bpl,
+                        aConnection.portFormatSettings.bpp);
+            }
+
+            /*
+             * for each port get the connection info and pass it
+             * to the pipeline object
+             */
+            status = portGetConnection(port, &(aConnection.connectionConfig), &peerPort);
+            if (status != OK) {
+                LOGE("Failed to create connection info in port from PG[%zu]", i);
+                return BAD_VALUE;
+            }
+
+            aConnection.hasEdgePort = false;
+            if (isPipeEdgePort(port)) {
+                int32_t direction = portGetDirection(port);
+                if (direction == GraphConfigPipe::PORT_DIRECTION_INPUT) {
+                    aConnection.connectionConfig.mConnectionType =
+                        IGraphType::connection_type_push;
+                } else {
+                    HalStream *clientStream = nullptr;
+                    status = portGetClientStream(peerPort, &clientStream);
+                    CheckError(status != OK, UNKNOWN_ERROR,
+                               "Failed to find client stream for v-sink");
+                    aConnection.stream = clientStream;
+                    if (clientStream != nullptr) {
+                        edgePort2Connection[port] = aConnection;
+                    }
+                }
+                aConnection.hasEdgePort = true;
+            }
+            confVector->push_back(aConnection);
+            alreadyConnectedPorts.push_back(port);
+            alreadyConnectedPorts.push_back(peerPort);
+        }
+    }
+
+    getScalerByStreamId(edgePort2Connection, scalerInfo);
+    GraphUtils::dumpConnections(*confVector);
+
+    return status;
+}
+
+status_t GraphConfigPipe::getScalerByStreamId(std::map<Node*,
+                                              IGraphType::PipelineConnection> edgePort2Connection,
+                                              std::vector<IGraphType::ScalerInfo> *scalerInfo) {
+    if (edgePort2Connection.empty()) {
+        return OK;
+    }
+    CheckError(!scalerInfo, UNKNOWN_ERROR, "%s, scalerInfo is nullptr", __func__);
+
+    for (auto it = edgePort2Connection.begin(); it != edgePort2Connection.end(); ++it) {
+        const char *portName;
+        bool mpFLag = false;
+        bool dpFlag = false;
+        bool pppFlag = false;
+        float scalerW = 1;
+        float scalerH = 1;
+
+        IGraphType::PipelineConnection connection = it->second;
+        portName = NODE_NAME(it->first);
+        int32_t streamId = connection.stream->streamId();
+        LOG2("%s, streamId:%d, portName:%s", __func__, streamId, portName);
+
+        if (!strcmp("main", portName)) {
+            mpFLag = true;
+        } else if (!strcmp("display", portName)) {
+            dpFlag = true;
+        } else if (!strcmp("postproc", portName)) {
+            pppFlag = true;
+        }
+        if (!mpFLag && !dpFlag && !pppFlag)
+            continue;
+
+        if (mpFLag) {
+            scalerInfo->push_back({streamId, 1.0, 1.0});
+            continue;
+        }
+
+        float osW = 1;
+        float osH = 1;
+        if (dpFlag) {
+            (void)getScalerKernelResolutionRatio(dpKernel, DB_KERNEL_SIZE, &osW, &osH);
+        } else if (pppFlag) {
+            (void)getScalerKernelResolutionRatio(pppKernel, PPP_KERNEL_SIZE, &osW, &osH);
+        }
+
+        uint32_t kernelId;
+        float gdcScalerW = 1;
+        float gdcScalerH = 1;
+        const ia_isp_bxt_resolution_info_t *gdcResolution = getGdcKernelResolutionInfo(&kernelId);
+        if ((gdcResolution) && ((gdcResolution->input_width != gdcResolution->output_width) ||
+            (gdcResolution->input_height != gdcResolution->output_height))) {
+            gdcScalerW = static_cast<float>(gdcResolution->input_width) /
+                         static_cast<float>(gdcResolution->output_width);
+            gdcScalerH = static_cast<float>(gdcResolution->input_height) /
+                         static_cast<float>(gdcResolution->output_height);
+        }
+
+        float b2iDsW = 1;
+        float b2iDsH = 1;
+        (void)getScalerKernelResolutionRatio(dsKernel, DS_KERNEL_SIZE, &b2iDsW, &b2iDsH);
+
+        scalerW = osW * gdcScalerW * b2iDsW;
+        scalerH = osH * gdcScalerH * b2iDsH;
+        scalerInfo->push_back({streamId, scalerW, scalerH});
+        LOG2("%s, scalerW:%f, scalerH:%f", __func__, scalerW, scalerH);
+    }
+
+    return OK;
+}
+
+status_t GraphConfigPipe::portGetOwner(Node *port,
+                                       IGraphType::ConnectionConfig *connectionInfo) {
+    int32_t direction = PORT_DIRECTION_INPUT;
+    css_err_t ret = port->getValue(GCSS_KEY_DIRECTION, direction);
+    CheckError((ret != css_err_none), BAD_VALUE, "Failed to get port direction");
+
+    /*
+     * Default to pull, it will be amended later,
+     * Iterations are not used
+     */
+    connectionInfo->mConnectionType = IGraphType::connection_type_pull;
+    connectionInfo->mSinkIteration = 0;
+    connectionInfo->mSourceIteration = 0;
+
+    status_t status = OK;
+    if (direction == PORT_DIRECTION_INPUT) {
+        // input port is the sink in a connection
+        status = GCSS::GraphCameraUtil::portGetFourCCInfo(*port,
+                                    connectionInfo->mSinkStage,
+                                    connectionInfo->mSinkTerminal);
+        CheckError((status != OK), BAD_VALUE, "Failed to create fourcc info for sink port");
+    } else {
+        // output port is the source in a connection
+        status = GCSS::GraphCameraUtil::portGetFourCCInfo(*port,
+                                    connectionInfo->mSourceStage,
+                                    connectionInfo->mSourceTerminal);
+        CheckError((status != OK), BAD_VALUE, "Failed to create fourcc info for source port");
+    }
+    return status;
+}
+
+/**
+ * Query the connection info structs for a given pipeline defined by
+ * stream id.
+ *
+ * \param[in] sinkName to be used as key to get pipeline connections
+ * \param[out] stream id connect with sink
+ * \param[out] connections for pipeline configuation
+ * \return OK in case of success.
+ * \return UNKNOWN_ERROR or BAD_VALUE in case of fail.
+ * \if sinkName is not supported, NAME_NOT_FOUND is returned.
+ * \sink name support list as below defined in graph_descriptor.xml
+ * \<sink name="video0"/>
+ * \<sink name="video1"/>
+ * \<sink name="video2"/>
+ * \<sink name="still0"/>
+ * \<sink name="still1"/>
+ * \<sink name="still2"/>
+ * \<sink name="raw"/>
+ */
+status_t GraphConfigPipe::pipelineGetConnections(
+                              const std::string &sinkName,
+                              int *streamId,
+                              std::vector<IGraphType::PipelineConnection> *confVector) {
+    CheckError(!streamId, UNKNOWN_ERROR, "the streamId is nullptr");
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
+
+    std::vector<GCSS::IGraphConfig*> sinks;
+    NodesPtrVector programGroups;
+    NodesPtrVector alreadyConnectedPorts;
+    Node *peerPort = nullptr;
+    Node *port = nullptr;
+    IGraphType::PipelineConnection aConnection;
+
+    alreadyConnectedPorts.clear();
+    status_t status = GCSS::GraphCameraUtil::graphGetSinksByName(sinkName, mSettings, sinks);
+    if (status != OK || sinks.empty()) {
+        LOGD("No %s sinks in graph", sinkName.c_str());
+        return NAME_NOT_FOUND;
+    }
+
+    status = sinks[0]->getValue(GCSS_KEY_STREAM_ID, *streamId);
+    if (status != css_err_none) {
+        LOGE("Sink node lacks stream id attribute - fix your config");
+        return BAD_VALUE;
+    }
+
+    status = streamGetProgramGroups(*streamId, &programGroups);
+    if (status != OK || programGroups.empty()) {
+        LOGE("No Program groups associated with stream id %d", *streamId);
+        return BAD_VALUE;
+    }
+
+    for (size_t i = 0; i < programGroups.size(); i++) {
+        Node::const_iterator it = programGroups[i]->begin();
+
+        while (it != programGroups[i]->end()) {
+            css_err_t ret = programGroups[i]->getDescendant(GCSS_KEY_TYPE, "port", it, &port);
+            if (ret != css_err_none)
+                continue;
+
+            // port for private terminal, no need to connect
+            int priv = 0;
+            ret = port->getValue(GCSS_KEY_PRIVATE, priv);
+            if (ret == css_err_none && priv)
+                continue;
+
+            /*
+             * Since we are iterating through the ports
+             * check if this port is already connected to avoid setting
+             * the connection twice
+             */
+            if (std::find(alreadyConnectedPorts.begin(),
+                          alreadyConnectedPorts.end(),
+                          port) != alreadyConnectedPorts.end()) {
+                continue;
+            }
+            LOG1("Configuring Port from PG[%zu] in line:%d", i, __LINE__);
+
+            string contentType;
+            ret = port->getValue(GCSS_KEY_CONTENT_TYPE, contentType);
+            if (ret == css_err_none && contentType != "pixel_data") {
+                LOG2("%s skipped content type %s", NODE_NAME(port), contentType.c_str());
+                continue;
+            }
+
+            status = portGetFormat(port, &(aConnection.portFormatSettings));
+            if (status != OK) {
+                LOGE("Failed to get port format info in port from PG[%zu] "
+                     "from stream id %d", i, *streamId);
+                return BAD_VALUE;
+            }
+            if (aConnection.portFormatSettings.enabled == 0) {
+                LOG1("Port from PG[%zu] from stream id %d disabled",
+                        i, *streamId);
+                confVector->push_back(aConnection);
+                continue;
+            } else {
+                LOG1("Port: 0x%x format(%dx%d)fourcc: %s bpl: %d bpp: %d",
+                        aConnection.portFormatSettings.terminalId,
+                        aConnection.portFormatSettings.width,
+                        aConnection.portFormatSettings.height,
+                        CameraUtils::fourcc2String(aConnection.portFormatSettings.fourcc).c_str(),
+                        aConnection.portFormatSettings.bpl,
+                        aConnection.portFormatSettings.bpp);
+            }
+
+            /*
+             * for each port get the connection info and pass it
+             * to the pipeline object
+             */
+            status = portGetConnection(port, &(aConnection.connectionConfig), &peerPort);
+            if (status != OK) {
+                LOGE("Failed to create connection info in port from PG[%zu]"
+                     "from stream id %d", i, *streamId);
+                return BAD_VALUE;
+            }
+
+            aConnection.hasEdgePort = false;
+            if (isPipeEdgePort(port)) {
+                int32_t direction = portGetDirection(port);
+                if (direction == GraphConfigPipe::PORT_DIRECTION_INPUT) {
+                    aConnection.connectionConfig.mConnectionType =
+                                                      IGraphType::connection_type_push;
+                } else {
+                    HalStream *clientStream = nullptr;
+                    status = portGetClientStream(peerPort, &clientStream);
+                    if (status != OK) {
+                        LOGE("Failed to find client stream for v-sink");
+                        return UNKNOWN_ERROR;
+                    }
+                    aConnection.stream = clientStream;
+                }
+                aConnection.hasEdgePort = true;
+            }
+            confVector->push_back(aConnection);
+            alreadyConnectedPorts.push_back(port);
+            alreadyConnectedPorts.push_back(peerPort);
+        }
+    }
+
+    return OK;
+}
+
+/**
+ * Find distinct stream ids from the graph and return them in a vector.
+ * \param streamIds Vector to be populated with stream ids.
+ */
+status_t GraphConfigPipe::graphGetStreamIds(StreamsVector *streamIds) {
+    CheckError(!streamIds, UNKNOWN_ERROR, "%s, The streamIds is nullptr", __func__);
+    GraphConfigNode *result;
+    int32_t streamId = -1;
+    css_err_t ret;
+
+    GraphConfigNode::const_iterator it = mSettings->begin();
+    while (it != mSettings->end()) {
+        bool found = false;
+        // Find all program groups
+        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group",
+                                       it, &result);
+        if (ret != css_err_none)
+            continue;
+
+        ret = result->getValue(GCSS_KEY_STREAM_ID, streamId);
+        if (ret != css_err_none)
+            continue;
+
+        // If stream id is not yet in vector, add it
+        StreamsVector::iterator ite = streamIds->begin();
+        for ( ; ite != streamIds->end(); ++ite) {
+            if (streamId == *ite) {
+                found = true;
+                break;
+            }
+        }
+        if (found)
+            continue;
+
+        streamIds->push_back(streamId);
+    }
+
+    LOGG("%s: stream IDs size %d", __func__, streamIds->size());
+    return OK;
+}
+
+int32_t GraphConfigPipe::portGetStreamId(Node *port) {
+    css_err_t ret = css_err_none;
+    Node *ancestor = nullptr;
+    int32_t streamId = -1;
+
+    if (port == nullptr) {
+        LOGE("Invalid Node, cannot get the port stream id");
+        return -1;
+    }
+    ret = port->getAncestor(&ancestor);
+    if (ret != css_err_none) {
+        LOGE("Failed to get port's ancestor");
+        return -1;
+    }
+
+    ret = ancestor->getValue(GCSS_KEY_STREAM_ID, streamId);
+    if (ret != css_err_none) {
+        LOGE("Failed to get stream ID");
+        return -1;
+    }
+    return streamId;
+}
+
+/**
+ * Retrieve a list of program groups that belong to a  given stream id.
+ * Iterates through the graph configuration storing the program groups
+ * that match this stream id into the provided vector.
+ *
+ * \param[in] streamId Id of the stream to match.
+ * \param[out] programGroups Vector with the nodes that match the criteria.
+ */
+status_t GraphConfigPipe::streamGetProgramGroups(int32_t streamId,
+                                                 NodesPtrVector *programGroups) {
+    CheckError(!programGroups, UNKNOWN_ERROR, "%s, The programGroups is nullptr", __func__);
+    css_err_t ret = css_err_none;
+    GraphConfigNode *result;
+    NodesPtrVector allProgramGroups;
+    int32_t streamIdFound = -1;
+
+    GraphConfigNode::const_iterator it = mSettings->begin();
+
+    while (it != mSettings->end()) {
+        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group",
+                                       it, &result);
+        if (ret == css_err_none)
+            allProgramGroups.push_back(result);
+    }
+
+    if (allProgramGroups.empty()) {
+        LOGE("Failed to find any PG's for stream id %d"
+             " BUG(check graph config file)", streamId);
+        return UNKNOWN_ERROR;
+    }
+
+    for (auto& pg : allProgramGroups) {
+        ret = pg->getValue(GCSS_KEY_STREAM_ID, streamIdFound);
+        if ((ret == css_err_none) && (streamIdFound == streamId)) {
+            programGroups->push_back(pg);
+        }
+    }
+
+    return OK;
+}
+
+/**
+ * Retrieve the graph config node of the port that is connected to a given port.
+ *
+ * \param[in] port Node with the info of the port that we want to find its peer.
+ * \param[out] peer Pointer to a node where the peer node reference will be
+ *                  stored
+ * \return OK
+ * \return INVALID_OPERATION if the port is disabled.
+ * \return BAD_VALUE if any of the graph settings is incorrect.
+ * \return NO_ENTRY if including "private" attribute which is used for private
+ *         terminal.
+ */
+status_t GraphConfigPipe::portGetPeer(Node *port, Node **peer) {
+    css_err_t ret = css_err_none;
+    int32_t enabled = 1, priv = 0;
+    string peerName;
+
+    if (port == nullptr || peer == nullptr) {
+       LOGE("Invalid Node, cannot get the peer port");
+       return BAD_VALUE;
+    }
+    ret = port->getValue(GCSS_KEY_ENABLED, enabled);
+    if (ret == css_err_none && !enabled) {
+        LOG1("This port is disabled, keep on getting the connection");
+        return INVALID_OPERATION;
+    }
+
+    // port for private terminal, no connection needed
+    ret = port->getValue(GCSS_KEY_PRIVATE, priv);
+    if (ret == css_err_none && priv) {
+        LOG2("NO_ENTRY due to key PRIVATE:%d", priv);
+        return NO_ENTRY;
+    }
+
+    ret = port->getValue(GCSS_KEY_PEER, peerName);
+    if (ret != css_err_none) {
+        LOGE("Error getting peer attribute");
+        return BAD_VALUE;
+    }
+    ret = mSettings->getDescendantByString(peerName, peer);
+    if (ret != css_err_none) {
+        LOGE("Failed to find peer by name %s", peerName.c_str());
+        return BAD_VALUE;
+    }
+    return OK;
+}
+
+/**
+ * Generate the connection configuration information for a given port.
+ *
+ * This connection configuration  information is required by CIPF to build
+ * the pipeline
+ *
+ * \param[in] port Pointer to the port node
+ * \param[out] connectionInfo point to the connection info object
+ * \param[out] peerPort Reference to the peer port
+ * \return OK in case of success
+ * \return BAD_VALUE in case of error while retrieving the information.
+ * \return INVALID_OPERATION in case of the port being disabled.
+ */
+status_t GraphConfigPipe::portGetConnection(Node *port,
+                                            IGraphType::ConnectionConfig *connectionInfo,
+                                            Node **peerPort) {
+    int32_t direction = PORT_DIRECTION_INPUT;
+
+    status_t status = portGetPeer(port, peerPort);
+    if (status == NO_ENTRY) {
+        LOG2("port for private terminal, no peer");
+        *peerPort = nullptr;
+    } else if (status != OK) {
+        if (status == INVALID_OPERATION) {
+            LOGE("Port %s disabled, cannot get the connection",
+                    getNodeName(port).c_str());
+        } else {
+            LOGE("Failed to get the peer port for port %s", getNodeName(port).c_str());
+        }
+        return status;
+    }
+
+    css_err_t ret = port->getValue(GCSS_KEY_DIRECTION, direction);
+    if (ret != css_err_none) {
+       LOGE("Failed to get port direction");
+       return BAD_VALUE;
+    }
+
+    /*
+     * Default to pull, it will be amended later,
+     * Iterations are not used
+     */
+    connectionInfo->mConnectionType = IGraphType::connection_type_pull;
+    connectionInfo->mSinkIteration = 0;
+    connectionInfo->mSourceIteration = 0;
+
+    if (direction == PORT_DIRECTION_INPUT) {
+        // input port is the sink in a connection
+        status = GCSS::GraphCameraUtil::portGetFourCCInfo(port,
+                                    connectionInfo->mSinkStage,
+                                    connectionInfo->mSinkTerminal);
+        if (status != OK) {
+            LOGE("Failed to create fourcc info for sink port");
+            return BAD_VALUE;
+        }
+        if (*peerPort != nullptr && !portIsVirtual(*peerPort)) {
+            status = GCSS::GraphCameraUtil::portGetFourCCInfo(*peerPort,
+                                       connectionInfo->mSourceStage,
+                                       connectionInfo->mSourceTerminal);
+            if (status != OK) {
+                LOGE("Failed to create fourcc info for source port");
+                return BAD_VALUE;
+            }
+        } else {
+            connectionInfo->mSourceStage = 0;
+            connectionInfo->mSourceTerminal = 0;
+        }
+    } else {
+        // output port is the source in a connection
+        status = GCSS::GraphCameraUtil::portGetFourCCInfo(port,
+                                    connectionInfo->mSourceStage,
+                                    connectionInfo->mSourceTerminal);
+        if (status != OK) {
+            LOGE("Failed to create fourcc info for source port");
+            return BAD_VALUE;
+        }
+
+        if (*peerPort != nullptr && !portIsVirtual(*peerPort)) {
+            status = GCSS::GraphCameraUtil::portGetFourCCInfo(*peerPort,
+                                    connectionInfo->mSinkStage,
+                                    connectionInfo->mSinkTerminal);
+            if (status != OK) {
+                LOGE("Failed to create fourcc info for sink port");
+                return BAD_VALUE;
+            }
+        /**
+         * Because all the connections are used for frame flow , so
+         * create one implicit rule which sets the mSinkTerminal as
+         * same as mSourceTerminal to handle the parameter or
+         * hanging port. And then exclude this connection when binding
+         * the port of executor.
+         */
+        } else if (*peerPort != nullptr && portIsVirtual(*peerPort)
+                   && getNodeName(*peerPort).find(getNodeName(port)) != string::npos) {
+            LOG2("%s, found one hanging port: %s, peer port: %s",
+                 __func__, getNodeName(port).c_str(), getNodeName(*peerPort).c_str());
+            connectionInfo->mSinkStage = 0;
+            connectionInfo->mSinkTerminal = connectionInfo->mSourceTerminal;
+        } else {
+            connectionInfo->mSinkStage = 0;
+            connectionInfo->mSinkTerminal = 0;
+        }
+    }
+
+    return status;
+}
+
+/**
+ * Retrieve the format information of a port
+ * if the port doesn't have any format set, it gets the format from the peer
+ * port (i.e. the port connected to this one)
+ *
+ * \param[in] port Port to query the format.
+ * \param[out] format Format settings for this port.
+ */
+status_t GraphConfigPipe::portGetFormat(Node *port,
+                                        IGraphType::PortFormatSettings *format) {
+    GraphConfigNode *peerNode = nullptr;  // The peer port node
+    GraphConfigNode *tmpNode = port;  // The port node node we are interrogating
+    css_err_t ret = css_err_none;
+    ia_uid stageId;  // ignored
+
+    if (port == nullptr) {
+        LOGE("Invalid parameter, could not get port format");
+        return BAD_VALUE;
+    }
+
+    ret = port->getValue(GCSS_KEY_ENABLED, format->enabled);
+    if (ret != css_err_none) {
+        // if not present by default is enabled
+        format->enabled = 1;
+    }
+
+    status_t status = GCSS::GraphCameraUtil::portGetFourCCInfo(tmpNode, stageId,
+                                                               format->terminalId);
+    if (status != OK) {
+        LOGE("Could not get port uid");
+        return INVALID_OPERATION;
+    }
+
+    // if disabled there is no need to query the format
+    if (format->enabled == 0) {
+        return OK;
+    }
+
+    format->width = 0;
+    format->height = 0;
+
+    ret = port->getValue(GCSS_KEY_WIDTH, format->width);
+    if (ret != css_err_none) {
+        /*
+         * It could be the port configuration is not in settings, that is normal
+         * it means that we need to ask the format from the peer.
+         */
+        status = portGetPeer(port, &peerNode);
+        if (status != OK) {
+            LOGE("Could not find peer port - Fix your graph");
+            return BAD_VALUE;
+        }
+
+        tmpNode = peerNode;
+
+        ret = tmpNode->getValue(GCSS_KEY_WIDTH, format->width);
+        if (ret != css_err_none) {
+            LOGE("Could not find port format info: width (from peer)");
+            return BAD_VALUE;
+        }
+    }
+
+    ret = tmpNode->getValue(GCSS_KEY_HEIGHT, format->height);
+    if (ret != css_err_none) {
+        LOGE("Could not find port format info: height");
+        return BAD_VALUE;
+    }
+
+    string fourccFormat;
+    ret = tmpNode->getValue(GCSS_KEY_FORMAT, fourccFormat);
+    if (ret != css_err_none) {
+        LOGE("Could not find port format info: fourcc");
+        return BAD_VALUE;
+    }
+
+    const char *pFormat = fourccFormat.c_str();
+    format->fourcc = CameraUtils::string2IaFourccCode(pFormat);
+    format->bpl = gcu::getBpl(format->fourcc, format->width);
+    LOG2("bpl set to %d for %s", format->bpl, fourccFormat.c_str());
+
+    // if settings are specifying bpl, owerwrite the calculated one
+    int bplFromSettings = 0;
+    ret = tmpNode->getValue(GCSS_KEY_BYTES_PER_LINE, bplFromSettings);
+    if (ret == css_err_none) {
+        LOG2("Overwriting bpl(%d) from settings %d", format->bpl, bplFromSettings);
+        format->bpl = bplFromSettings;
+    }
+
+    format->bpp = gcu::getBppFromCommon(format->fourcc);
+
+    return OK;
+}
+
+/**
+ * Return the port direction
+ *
+ * \param[in] port Reference to port Graph node
+ * \return 0 if it is an input port
+ * \return 1 if it is an output port
+ */
+int32_t GraphConfigPipe::portGetDirection(Node *port) {
+    int32_t direction = 0;
+    css_err_t ret = port->getValue(GCSS_KEY_DIRECTION, direction);
+    if (ret != css_err_none) {
+        LOGE("Failed to retrieve port direction, default to input");
+    }
+
+    return direction;
+}
+
+/**
+ * Return the port full name
+ * The port full name is made out from:
+ * - the name program group it belongs to
+ * - the name of the port
+ * separated by ":"
+ *
+ * \param[in] port Reference to port Graph node
+ * \param[out] fullName reference to a string to store the full name
+ *
+ * \return OK if everything went fine.
+ * \return BAD_VALUE if any of the graph queries failed.
+ */
+status_t GraphConfigPipe::portGetFullName(Node *port, string *fullName) {
+    CheckError(!fullName, UNKNOWN_ERROR, "%s, the fullName is nullptr", __func__);
+    string portName, ancestorName;
+    Node *ancestor;
+    css_err_t ret = css_err_none;
+
+    if (port == nullptr) {
+        LOGE("Invalid parameter, could not get port full name");
+        return BAD_VALUE;
+    }
+
+    ret = port->getAncestor(&ancestor);
+    if (ret != css_err_none) {
+        LOGE("Failed to retrieve port ancestor");
+        return BAD_VALUE;
+    }
+    ret = ancestor->getValue(GCSS_KEY_NAME, ancestorName);
+    if (ret != css_err_none) {
+        LOGE("Failed to get ancestor name for port");
+        port->dumpNodeTree(port, 1);
+        return BAD_VALUE;
+    }
+
+    ret = port->getValue(GCSS_KEY_NAME, portName);
+    if (ret != css_err_none) {
+        LOGE("Failed to retrieve port name");
+        return BAD_VALUE;
+    }
+
+    *fullName = ancestorName + ":" + portName;
+    return OK;
+}
+
+/**
+ * Perform a reverse lookup on the map that associates client streams to
+ * virtual sinks.
+ *
+ * This method is used during pipeline configuration to find a stream associated
+ * with the id (GCSS key) of the virtual sink
+ *
+ * \param[in] vPortId GCSS key representing one of the virtual sinks in the
+ *                    graph, like GCSS_KEY_VIDEO1
+ * \return nullptr if not found
+ * \return pointer to the client stream associated with that virtual sink.
+ */
+HalStream* GraphConfigPipe::getHalStreamByVirtualId(uid_t vPortId) {
+    for (auto &it : mStreamToSinkIdMap) {
+        if (it.second == vPortId) {
+            return it.first;
+        }
+    }
+
+    return nullptr;
+}
+
+/**
+ * Return true if the port is a virtual port, this is the end point
+ * of the graph.
+ * Virtual ports are the nodes of type sink.
+ *
+ * \param[in] port Reference to port Graph node
+ * \return true if it is a virtual port
+ * \return false if it is not a virtual port
+ */
+bool GraphConfigPipe::portIsVirtual(Node *port) {
+    string type;
+    css_err_t ret = port->getValue(GCSS_KEY_TYPE, type);
+    if (ret != css_err_none) {
+        LOGE("Failed to retrieve port type, default to input");
+    }
+
+    return (type == string("sink"));
+}
+
+/**
+ * retrieve the pointer to the client stream associated with a virtual sink
+ *
+ * I.e. access the mapping done at stream config time between the pointers
+ * to camera3_stream_t and the names video0, video1, still0 etc...
+ *
+ * \param[in] port Node to the virtual sink (with name videoX or stillX etc..)
+ * \param[out] stream Pointer to the client stream associated with that virtual
+ *                    sink.
+ * \return OK
+ * \return BAD_VALUE in case of invalid parameters (null pointers)
+ * \return INVALID_OPERATION in case the Node is not a virtual sink.
+ */
+status_t GraphConfigPipe::portGetClientStream(Node *port, HalStream **stream) {
+    if (!port || !stream) {
+        LOGE("Could not get client stream - bad parameters");
+        return BAD_VALUE;
+    }
+
+    if (!portIsVirtual(port)) {
+        LOGE("Trying to find the client stream from a non virtual port");
+        return INVALID_OPERATION;
+    }
+
+    string portName;
+    css_err_t ret = port->getValue(GCSS_KEY_NAME, portName);
+    if (ret != css_err_none) {
+        LOGE("Failed to get name for port");
+        port->dumpNodeTree(port, 1);
+        return BAD_VALUE;
+    }
+
+    uid_t vPortId = GCSS::ItemUID::str2key(portName);
+    *stream = getHalStreamByVirtualId(vPortId);
+
+    return OK;
+}
+
+/**
+ * A port is at the edge of the video stream (pipeline) if its peer's stream id is 0 or -1,
+ * or if its peer is a virtual sink.
+ *
+ * Here we check for both conditions and return true if this port is at either
+ * edge of a pipeline
+ */
+bool GraphConfigPipe::isPipeEdgePort(Node *port) {
+    CheckError(!port, false, "%s, the port is nullptr", __func__);
+    Node *peer = nullptr;
+    Node *peerAncestor = nullptr;
+    int32_t streamId = -1;
+    int32_t peerStreamId = -1;
+    string peerType;
+
+    int32_t portDirection = portGetDirection(port);
+
+    status_t status = portGetPeer(port, &peer);
+    if (status == INVALID_OPERATION) {
+        LOG1("port is disabled, so it is an edge port");
+        return true;
+    }
+    if (status != OK) {
+        LOGE("Failed to create fourcc info for source port");
+        return false;
+    }
+
+    streamId = portGetStreamId(port);
+    if (streamId < 0)
+        return false;
+    /*
+     * get the stream id of the peer port
+     * we also check the ancestor for that. If the peer is a virtual sink then
+     * it does not have ancestor.
+     */
+    if (!portIsVirtual(peer)) {
+        css_err_t ret = peer->getAncestor(&peerAncestor);
+        if (ret != css_err_none) {
+            LOGE("Failed to get peer's ancestor");
+            return false;
+        }
+        ret = peerAncestor->getValue(GCSS_KEY_STREAM_ID, peerStreamId);
+        if (ret != css_err_none) {
+            LOGE("Failed to get stream ID of peer PG");
+            return false;
+        }
+        /*
+         * Retrieve the type of node the peer ancestor is. It could be is not a
+         * program group node but a sink or hw block
+         */
+        peerAncestor->getValue(GCSS_KEY_TYPE, peerType);
+    }
+
+    LOG1("%s port direction: %d, port stream id:%d, peer stream id:%d",
+          __func__, portDirection, streamId, peerStreamId);
+
+    bool isEdge = false;
+    if (portDirection == GraphConfigPipe::PORT_DIRECTION_INPUT) {
+        /*
+         *  input port,
+         *  if the peer is a source or hw block then it is on the edge,
+         *  or its stream id is 0 or -1.
+         */
+         isEdge = (peerType == string("hw") || peerStreamId == 0 || peerStreamId == -1);
+    } else {
+        /*
+         *  output port,
+         *  if the peer is a virtual port, or its stream id is 0 or -1,
+         *  then it is on the edge,
+         */
+         isEdge = (portIsVirtual(peer) || peerStreamId == 0 || peerStreamId == -1);
+    }
+
+    return isEdge;
+}
+
+void GraphConfigPipe::dumpSettings() {
+    mSettings->dumpNodeTree(mSettings, 2);
+}
+
+GraphConfigPipe::Rectangle::Rectangle(): w(0), h(0), t(0), l(0) {}
+GraphConfigPipe::SubdevPad::SubdevPad(): Rectangle(), mbusFormat(0) {}
+GraphConfigPipe::SourceNodeInfo::SourceNodeInfo() : metadataEnabled(false),
+                                                    interlaced(0) {}
+}  // namespace icamera
+
diff --git a/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.h b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.h
new file mode 100644
index 000000000000..b791ccac2670
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.h
@@ -0,0 +1,326 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <gcss.h>
+#include <ia_aiq.h>
+#include <ia_isp_bxt_types.h>
+#include <gcss_aic_utils.h>
+
+#include <string>
+#include <memory>
+#include <vector>
+#include <map>
+#include <set>
+
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+#include "src/platformdata/gc/IGraphConfig.h"
+
+#define NODE_NAME(x) (getNodeName(x).c_str())
+
+namespace icamera {
+
+/**
+ * Stream id associated with the ISA PG that runs on Psys.
+ */
+static const int32_t PSYS_ISA_STREAM_ID = 60002;
+
+/**
+ * \class SinkDependency
+ *
+ * This class is a container for sink dependency information for each virtual sink.
+ * This information is useful to determine the connections that preceded the
+ * virtual sink.
+ * We do not go all the way up to the sensor (we could), we just store the
+ * terminal id of the input port of the pipeline that serves a particular sink
+ * (i.e. the input port of the video pipe or still pipe)
+ */
+class SinkDependency {
+ public:
+    SinkDependency(): sinkGCKey(0),
+                      streamId(-1),
+                      streamInputPortId(0),
+                      peer(nullptr) {}
+
+    uid_t sinkGCKey;    /**< GCSS_KEY that represents a sink, like GCSS_KEY_VIDEO1 */
+    int32_t streamId;   /**< (a.k.a pipeline id) linked to this sink (ex 60000) */
+    uid_t streamInputPortId;     /**< 4CC code of that terminal */
+    GCSS::GraphConfigNode *peer; /**< pointer to peer of this sink */
+};
+/**
+ * \class GraphConfigPipe
+ *
+ * Reference and accessor to pipe configuration for specific request.
+ *
+ * In general case, at sream-config time there are multiple possible graphs.
+ * Per each request there is additional intent that can narrow down the
+ * possibilities to single graph settings: the GraphConfigPipe object.
+ *
+ * This class is instantiated by \class GraphConfigManager for each request,
+ * and passed around HAL (control unit, capture unit, processing unit) via
+ * shared pointers. The objects are read-only and owned by GCM.
+ */
+class GraphConfigPipe {
+ public:
+    typedef std::vector<int32_t> StreamsVector;
+    typedef std::map<int32_t, int32_t> StreamsMap;
+    typedef std::map<HalStream*, uid_t> StreamToSinkMap;
+    static const int32_t PORT_DIRECTION_INPUT = 0;
+    static const int32_t PORT_DIRECTION_OUTPUT = 1;
+
+ public:
+    explicit GraphConfigPipe(int pipeUseCase);
+    ~GraphConfigPipe();
+
+    void init(int32_t reqId);
+    int getGraphId(void);
+    void setActiveSinks(const std::vector<uid_t> &activeSinks);
+    void setActiveStreamId(const std::vector<uid_t> &activeSinks);
+    /*
+     * Convert Node to GraphConfig interface
+     */
+    const GCSS::IGraphConfig* getInterface(Node *node) const;
+    const GCSS::IGraphConfig* getInterface() const;
+    ia_isp_bxt_program_group *getProgramGroup(int32_t streamId);
+    int getProgramGroup(std::string pgName, ia_isp_bxt_program_group * programGroupForPG);
+    status_t getGdcKernelSetting(uint32_t *kernelId, camera_resolution_t *resolution);
+    const ia_isp_bxt_resolution_info_t *getKernelResolutionInfo(
+                                                uint32_t streamId,
+                                                uint32_t kernelId);
+    bool hasStreamInGraph(int streamId);
+    bool isKernelInStream(uint32_t streamId, uint32_t kernelId);
+    status_t getPgIdForKernel(const uint32_t streamId, const int32_t kernelId,
+                              int32_t *pgId);
+    int32_t getTuningMode(int32_t streamId);
+    status_t getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits *data);
+    status_t prepare(Node *settings, const StreamToSinkMap &streamToSinkIdMap);
+    bool containPgs(std::vector<std::string> pgNames);
+
+   /*
+    * Find distinct stream ids from the graph
+    */
+    status_t graphGetStreamIds(std::vector<int32_t> *streamIds);
+    /*
+     * Sink Interrogation methods
+     */
+    int32_t portGetStreamId(Node *port);
+    /*
+     * Stream Interrogation methods
+     */
+    status_t streamGetProgramGroups(int32_t streamId,
+                                    NodesPtrVector *programGroups);
+    /*
+     * Port Interrogation methods
+     */
+    status_t portGetFullName(Node *port, std::string *fullName);
+    status_t portGetPeer(Node *port, Node **peer);
+    status_t portGetFormat(Node *port, IGraphType::PortFormatSettings *format);
+    status_t portGetConnection(Node *port,
+                               IGraphType::ConnectionConfig *connectionInfo,
+                               Node **peerPort);
+    status_t portGetClientStream(Node *port, HalStream **stream);
+    int32_t portGetDirection(Node *port);
+    bool portIsVirtual(Node *port);
+    bool isPipeEdgePort(Node *port);  // TODO: should be renamed as portIsEdgePort
+
+    bool getSensorEmbeddedMetadataEnabled() const { return mMetaEnabled; }
+    /*
+     * Pipeline connection support
+     */
+    status_t pipelineGetConnections(
+                        const std::string &sinkName,
+                        int *streamId,
+                        std::vector<IGraphType::PipelineConnection> *confVector);
+    status_t portGetOwner(Node *port, IGraphType::ConnectionConfig *connectionInfo);
+    status_t pipelineGetConnections(const std::vector<std::string> &pgList,
+                                    std::vector<IGraphType::ScalerInfo> *scalerInfo,
+                                    std::vector<IGraphType::PipelineConnection> *confVector);
+
+    status_t getPgNames(std::vector<std::string>* pgNames);
+    status_t getPgRbmValue(std::string pgName, IGraphType::StageAttr *stageAttr);
+
+    /**
+     * Get PG id by given PG name.
+     * -1 will be returned if cannot find the valid PG id.
+     */
+    int getPgIdByPgName(std::string pgName);
+
+    /**
+     * Get PG streamId by given PG name.
+     * -1 will be returned if cannot find the valid PG id.
+     */
+    int getStreamIdByPgName(std::string pgName);
+    /*
+     * re-cycler static method
+     */
+    static void reset(GraphConfigPipe *me);
+    void fullReset();
+    /*
+     * Debugging support
+     */
+    void dumpSettings();
+    void dumpKernels(int32_t streamId);
+    std::string getNodeName(Node *node);
+    void getCSIOutputResolution(camera_resolution_t *reso) { *reso = mCsiOutput; }
+
+ private:
+    struct ResolutionMemPool {
+        std::vector<ia_isp_bxt_resolution_info_t *> resHistorys;
+        std::vector<ia_isp_bxt_resolution_info_t *> resInfos;
+    };
+    /* Helper structures to access Sensor Node information easily */
+    class Rectangle {
+     public:
+        Rectangle();
+        int32_t w;  /*<! width */
+        int32_t h;  /*<! height */
+        int32_t t;  /*<! top */
+        int32_t l;  /*<! left */
+    };
+    class SubdevPad: public Rectangle {
+     public:
+        SubdevPad();
+        int32_t mbusFormat;
+    };
+    struct BinFactor {
+        int32_t h;
+        int32_t v;
+    };
+    struct ScaleFactor {
+        int32_t num;
+        int32_t denom;
+    };
+    union RcFactor {  // Resolution Changing factor
+        BinFactor bin;
+        ScaleFactor scale;
+    };
+    struct SubdevInfo {
+        std::string name;
+        SubdevPad in;
+        SubdevPad out;
+        RcFactor factor;
+        SubdevInfo() {
+            CLEAR(factor);
+        }
+    };
+    class SourceNodeInfo {
+     public:
+        SourceNodeInfo();
+        std::string name;
+        std::string i2cAddress;
+        std::string modeId;
+        bool metadataEnabled;
+        std::string csiPort;
+        std::string nativeBayer;
+        SubdevInfo tpg;
+        SubdevInfo pa;
+        SubdevInfo binner;
+        SubdevInfo scaler;
+        SubdevPad output;
+        int32_t interlaced;
+        std::string verticalFlip;
+        std::string horizontalFlip;
+        std::string link_freq;
+    };
+    status_t analyzeSourceType();
+    status_t analyzeCSIOutput();
+    void calculateSinkDependencies();
+    void storeTuningModes();
+    HalStream* getHalStreamByVirtualId(uid_t vPortId);
+
+    // Format options methods
+    status_t getActiveOutputPorts(
+            const StreamToSinkMap &streamToSinkIdMap);
+    Node *getOutputPortForSink(const std::string &sinkName);
+    status_t getSinkFormatOptions();
+    status_t handleDynamicOptions();
+    status_t setPortFormats();
+    bool isVideoRecordPort(Node *sink);
+    status_t getProgramGroupsByName(const std::vector<std::string> &pgNames,
+                                    NodesPtrVector *programGroups);
+    const ia_isp_bxt_resolution_info_t *getGdcKernelResolutionInfo(uint32_t *kernelId);
+    const ia_isp_bxt_resolution_info_t *getScalerKernelResolutionInfo(uint32_t *kenerArray,
+                                                                      uint32_t sizeArray);
+    status_t getScalerKernelResolutionRatio(uint32_t *kenerArray,
+                                            uint32_t sizeArray,
+                                            float *widthRatio, float *heightRatio);
+    status_t getScalerByStreamId(std::map<Node*,
+                                 IGraphType::PipelineConnection> edgePort2Connection,
+                                 std::vector<IGraphType::ScalerInfo> *scalerInfo);
+
+ private:
+    GCSS::GraphConfigNode *mSettings;
+    int32_t mReqId;
+    std::map<int32_t, ia_isp_bxt_program_group> mProgramGroup;
+    GCSS::BxtAicUtils mGCSSAicUtil;
+
+    bool mMetaEnabled;  // indicates if the specific sensor provides sensor
+                        // embedded metadata
+    enum SourceType {
+        SRC_NONE = 0,
+        SRC_SENSOR,
+        SRC_TPG,
+    };
+    SourceType mSourceType;
+    camera_resolution_t mCsiOutput;
+    std::string mSourcePortName;  // Sensor or TPG port name
+
+    /**
+     * pre-computed state done *per request*.
+     * This map holds the terminal id's of the ISA's peer ports (this is
+     * the terminal id's of the input port of the video or still pipe)
+     * that are required to fulfill a request.
+     * Ideally this gets initialized during init() call.
+     * But for now the GcManager will set it via a private method.
+     * we use a map so that we can handle the case when a request has 2 buffers
+     * that are generated from the same pipe.
+     */
+    std::map<uid_t, uid_t> mIsaActiveDestinations;
+    std::set<int32_t> mActiveStreamId;
+    /**
+     * vector holding one structure per virtual sink that stores the stream id
+     * (pipeline id) associated with it and the terminal id of the input port
+     * of that stream.
+     * This vector is updated once per stream config.
+     */
+    std::vector<SinkDependency> mSinkDependencies;
+    /**
+     * vector holding the peers to the sink nodes. Map contains pairs of
+     * {sink, peer}.
+     * This map is filled at stream config time.
+     */
+    std::map<Node*, Node*> mSinkPeerPort;
+    /**
+     *copy of the map provided from GraphConfigManager to be used internally.
+     */
+    StreamToSinkMap mStreamToSinkIdMap;
+    std::map<std::string, int32_t> mIsaOutputPort2StreamId;
+    /**
+     * Map of tuning modes per stream id
+     * Key: stream id
+     * Value: tuning mode
+     */
+    std::map<int32_t, int32_t> mStream2TuningMap;
+    int mPipeUseCase;
+
+    // Disable copy constructor and assignment operator
+    DISALLOW_COPY_AND_ASSIGN(GraphConfigPipe);
+};
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/css_types.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/css_types.h
new file mode 100644
index 000000000000..cb1459fc2fb8
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/css_types.h
@@ -0,0 +1,61 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright (c) 2013-2017 Intel Corporation. All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel's prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ */
+
+#ifndef __CSS_TYPES_H__
+#define __CSS_TYPES_H__
+
+#include <stdint.h>
+#include <stdbool.h>
+
+/*!
+ * \brief Error codes.
+ * \ingroup ia_tools
+*/
+typedef int32_t css_err_t;
+#define css_err_none     0         /*!< No errors*/
+#define css_err_general  (-(1 << 1))  /*!< General error*/
+#define css_err_nomemory (-(1 << 2))  /*!< Out of memory*/
+#define css_err_data     (-(1 << 3))  /*!< Corrupted data*/
+#define css_err_internal (-(1 << 4))  /*!< Error in code*/
+#define css_err_argument (-(1 << 5))  /*!< Invalid argument for a function*/
+#define css_err_noentry  (-(1 << 6))  /*!< No such entry/entity/file */
+#define css_err_timeout  (-(1 << 7))  /*!< Time out*/
+#define css_err_end      (-(1 << 8))  /*!< End of values*/
+#define css_err_full     (-(1 << 9))  /*!< Exchange full */
+#define css_err_again    (-(1 << 10)) /*!< Operation requires additional call */
+#define css_err_nimpl    (-(1 << 11)) /*!< Not implemented */
+
+#ifndef __cplusplus
+
+/* Define bool type as int for strict C89 */
+#ifndef __bool_true_false_are_defined
+#define bool int
+#define false 0
+#define true 1
+#endif
+
+/* inline keyword compliance for ansi */
+#if (__STDC_VERSION__ < 199901L)
+#define inline
+#endif
+
+#endif  /* __cplusplus */
+#endif  /* _CSS_TYPES_H_ */
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr.h
new file mode 100644
index 000000000000..9ae7f7e28de5
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr.h
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _IA_CIPR_H_
+#define _IA_CIPR_H_
+
+/**
+ * TODO: split & get rid of ia_tools
+ */
+#include "modules/ia_cipr/include/css_types.h"
+
+/** \file ia_cipr.h
+ *
+ * \ingroup ia_cipr
+ *
+ * Common API for Camera Imaging Platform Runtime features
+ *
+ * Includes qyery functions with semantics derived from OpenCL Platform Layer.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef uint8_t ia_cipr_platform_id_t;
+typedef uint8_t ia_cipr_device_id_t;
+typedef uint8_t ia_cipr_device_type_t;
+
+typedef enum {
+    cipr_platform_info_key_na
+} ia_cipr_platform_info_key_t;
+
+typedef enum {
+    cipr_device_info_key_na
+} ia_cipr_device_info_key_t;
+
+typedef struct _cipr_context* ia_cipr_context_t;
+
+/**
+ * Create and initialize CIPR context
+ *
+ * \ingroup ia_cipr
+ *
+ * \return cipr context struct
+ */
+ia_cipr_context_t ia_cipr_create(void);
+
+/**
+ * Destroy and deinitialize CIPR context
+ *
+ * \ingroup ia_cipr
+ *
+ * \param[in] cipr context struct
+ */
+void ia_cipr_destroy(ia_cipr_context_t ctx);
+
+/**
+ * Qyery available platform IDs
+ *
+ * \ingroup ia_cipr
+ *
+ * \param[in]   num_entries   number of platform id elements that can be stored
+ *                            in \p platforms.
+ * \param[out]  platforms     returns a list of platform IDs available.
+ * \param[out]  num_platforms returns the number of IDs stored in \p
+ *                            platforms.
+ */
+css_err_t ia_cipr_get_platform_ids(uint32_t num_entries,
+                                  ia_cipr_platform_id_t *platforms,
+                                  uint32_t *num_platforms);
+
+/**
+ * Query platform info
+ *
+ * \ingroup ia_cipr
+ *
+ * \param[in]   platform      platform ID to query
+ * \param[in]   key           key for information to query
+ * \param[in]   value_size    storage size in bytes for \p value
+ * \param[out]  value         pointer where to store the info
+ * \param[out]  ret_value_size returns size in bytes written to \p value
+ */
+css_err_t ia_cipr_get_platform_info(ia_cipr_platform_id_t platform,
+                                   ia_cipr_platform_info_key_t key,
+                                   uint32_t value_size,
+                                   void *value,
+                                   uint32_t *ret_value_size);
+
+/**
+ * Qyery available device IDs from platform
+ *
+ * \ingroup ia_cipr
+ *
+ * \param[in]   platform      platform ID to query
+ * \param[in]   device_type   bitfield for device types to query
+ * \param[in]   num_entries   number of platform id elements that can be stored
+ *                            in \p platforms.
+ * \param[out]  devices       a list of device IDs available in platform
+ * \param[out]  num_devices   returns the number of IDs stored in \p
+ *                            platforms.
+ */
+css_err_t ia_cipr_get_device_ids(ia_cipr_platform_id_t platform,
+                                ia_cipr_device_type_t device_type,
+                                uint32_t num_entries,
+                                ia_cipr_device_id_t *devices,
+                                uint32_t *num_devices);
+
+/**
+ * Query device info
+ *
+ * \ingroup ia_cipr
+ *
+ * \param[in]   device        device ID to query
+ * \param[in]   key           key for information to query
+ * \param[in]   value_size    storage size in bytes for \p value
+ * \param[out]  value         pointer where to store the info
+ * \param[out]  ret_value_size returns size in bytes written to \p value
+ */
+css_err_t ia_cipr_get_device_info(ia_cipr_device_id_t device,
+                                 ia_cipr_device_info_key_t key,
+                                 uint32_t value_size,
+                                 void *value,
+                                 uint32_t *ret_value_size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _IA_CIPR_H_ */
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_alloc.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_alloc.h
new file mode 100644
index 000000000000..535a83de8bc1
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_alloc.h
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef IA_CIPR_ALLOC_H_
+#define IA_CIPR_ALLOC_H_
+
+#include <stdlib.h>
+
+/** \file ia_cipr_alloc.h
+ *
+ * \brief posix compatible host memory allocation API
+ */
+
+#ifdef RNDBUILD
+#define IACIPR_FUNC __func__
+#define IACIPR_FILE __FILE__
+#define IACIPR_LINE __LINE__
+#else
+#define IACIPR_FUNC ""
+#define IACIPR_FILE ""
+#define IACIPR_LINE 0
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \ingroup ia_cipr_memory
+ * wrapper-macro for getting page size.
+ *
+ * Note: This is only code style addition to be used with
+ * _ALLOC_ALIGNED-macro:
+ * * IA_CIPR_ALLOC_ALIGNED(size, IA_CIPR_PAGESIZE())
+ */
+#define IA_CIPR_PAGESIZE() \
+    ia_cipr_pagesize()
+
+/**
+ * \ingroup ia_cipr_memory
+ * malloc wrapper-macro. Logs the caller among other things.
+ */
+#define IA_CIPR_MALLOC(size) \
+    ia_cipr_malloc(size, IACIPR_FUNC, IACIPR_FILE, IACIPR_LINE)
+
+/**
+ * \ingroup ia_cipr_memory
+ * calloc wrapper-macro. Logs the caller among other things.
+ */
+#define IA_CIPR_CALLOC(nmemb, size) \
+    ia_cipr_calloc(nmemb, size, IACIPR_FUNC, IACIPR_FILE, IACIPR_LINE)
+
+/**
+ * \ingroup ia_cipr_memory
+ * alloc_aligned wrapper-macro. Logs the caller among other things.
+ */
+#define IA_CIPR_ALLOC_ALIGNED(size, alignment) \
+    ia_cipr_alloc_aligned(size, alignment, IACIPR_FUNC, IACIPR_FILE, IACIPR_LINE)
+
+/**
+ * \ingroup ia_cipr_memory
+ * free wrapper-macro. Logs the caller among other things.
+ */
+#define IA_CIPR_FREE(ptr) \
+    ia_cipr_free(ptr, IACIPR_FUNC)
+
+/**
+ * \ingroup ia_cipr_memory
+ * memcpy wrapper-macro.
+ */
+#define IA_CIPR_MEMCOPY(dest, dest_size, src, n) \
+    ia_cipr_memcopy(dest, dest_size, src, n)
+
+/**
+ * \ingroup ia_cipr_memory
+ */
+size_t ia_cipr_pagesize(void);
+
+/**
+ * \param size as in malloc
+ * \param logmsg entered by macro IA_CIPR_MALLOC. The caller function.
+ * \ingroup ia_cipr_memory
+ */
+void* ia_cipr_malloc(size_t size,
+                     const char *logmsg,
+                     const char *file_name,
+                     int line);
+
+/**
+ * \param nmemb as in calloc
+ * \param size as in calloc
+ * \param logmsg entered by macro IA_CIPR_CALLOC. The caller function.
+ * \ingroup ia_cipr_memory
+ */
+void* ia_cipr_calloc(size_t nmemb,
+                     size_t size,
+                     const char *logmsg,
+                     const char *file_name,
+                     int line);
+
+/** Allocate aligned memory (as defined in posix_memalign())
+ *
+ * Returns pointer to free()'able memory or zero.
+ *
+ * \param size as in malloc
+ * \param alignment as in posix_memalign
+ * \param logmsg entered by macro IA_CIPR_CALLOC. The caller function.
+ * \ingroup ia_cipr_memory
+ */
+void* ia_cipr_alloc_aligned(size_t size,
+                            size_t alignment,
+                            const char *logmsg,
+                            const char *file_name,
+                            int line);
+
+/**
+ * \param *ptr as in free
+ * \param logmsg entered by macro IA_CIPR_FREE. The caller function.
+ * \ingroup ia_cipr_memory
+ */
+void ia_cipr_free(void *ptr, const char *logmsg);
+
+/**
+ * \param dest as in memcpy
+ * \param dest_size as in memcpy_s, max number of bytes to modify in destination
+ * \param src as in memcpy
+ * \param n as in memcpy
+ * \ingroup ia_cipr_memory
+ */
+void ia_cipr_memcopy(void *dest,
+                     size_t dest_size,
+                     const void *src,
+                     size_t n);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* IA_CIPR_ALLOC_H_ */
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_memory.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_memory.h
new file mode 100644
index 000000000000..fbb8455647e9
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_memory.h
@@ -0,0 +1,210 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _IA_CIPR_MEMORY_H_
+#define _IA_CIPR_MEMORY_H_
+
+/** \file ia_cipr_memory.h
+ *
+ * Tentative CIPR Memory Header
+ *
+ * \defgroup ia_cipr_memory Memory
+ * \ingroup ia_cipr
+ *
+ * \brief CIPR Memory module defines an abstract buffer object
+ * ia_cipr_buffer_t that stores data in contiguos memory region. A memory API
+ * is defined to allow platform implementations to either implicitly or
+ * explicitly define when the memory being allocated resides in one of the
+ * supported devices address space of CIPR and when memory is represented with
+ * implementation defined shared memory handle.
+ *
+ * Migrating ia_cipr_buffer_t from device to another shall be supported by
+ * device interfaces in CIPR. While performing migration, the device agent is
+ * allowed to alter the information associated with the buffer object.
+ *
+ * First device receiving newly created ia_cipr_buffer_t object is responsible
+ * of carrying out the allocation for host pointer when requested with
+ * IA_CIPR_DEVICE_MEMORY_ALLOCATE_CPU_PTR flag.
+ *
+ * Buffer object also supports user provided and pre-allocated memory. With
+ * ia_cipr_buffer_create-function, user can provide ia_cipr_memory_t
+ * descriptor with either host pointer or implementation defined handle.
+ * Typically, implementation defined handle means OS specific shared memory
+ * that device agents may choose to support.
+ *
+ * Buffer object that is flagged _HW_ONLY is considered "virtual" and does
+ * not have accessible memory for host.
+ *
+ * Mapping operations are implicitly handled by device agents performing
+ * operations on data. Device agents are also responsible of data integrity
+ * and are allowed to provide different barriers depending on supported
+ * granularity.
+ */
+
+/**
+ * Give indirect dependency for ia_cipr_memory user to our pure posix
+ * compatible host memory allocation API.
+ */
+#include "modules/ia_cipr/include/ia_cipr.h"
+#include "modules/ia_cipr/include/ia_cipr_alloc.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Opaque ia_cipr_buffer_t-object
+ *
+ * \ingroup ia_cipr
+ */
+typedef struct _cipr_buffer ia_cipr_buffer_t;
+
+/**
+ * Memory bitfield definitions to specify type, allocation and usage
+ */
+typedef uint32_t ia_cipr_memory_flags_t;
+#define IA_CIPR_MEMORY_CPU_PTR              (uint32_t)(1 << 0)
+#define IA_CIPR_MEMORY_HANDLE               (uint32_t)(1 << 1)
+#define IA_CIPR_MEMORY_ALLOCATE_CPU_PTR     (uint32_t)(1 << 2)
+#define IA_CIPR_MEMORY_COPY_FROM_USER       (uint32_t)(1 << 3)
+#define IA_CIPR_MEMORY_HW_ONLY              (uint32_t)(1 << 4)
+#define IA_CIPR_MEMORY_READ_ONLY            (uint32_t)(1 << 5)
+#define IA_CIPR_MEMORY_WRITE_ONLY           (uint32_t)(1 << 6)
+#define IA_CIPR_MEMORY_UNCACHED             (uint32_t)(1 << 7)
+#define IA_CIPR_MEMORY_ALLOC_UNINITIALIZED  (uint32_t)(1 << 8)
+#define IA_CIPR_MEMORY_SECURED              (uint32_t)(1 << 9)
+#define IA_CIPR_MEMORY_CPU_ONLY             (uint32_t)(1 << 10)
+#define IA_CIPR_MEMORY_FLUSH_CPU_CACHE      (uint32_t)(1 << 11)
+
+/**
+ * Memory bitfield definitions for memory state
+ */
+#define IA_CIPR_MEMORY_ALLOCATED            (uint32_t)(1 << 13)
+#define IA_CIPR_MEMORY_FROM_USER            (uint32_t)(1 << 14)
+#define IA_CIPR_MEMORY_MIGRATED             (uint32_t)(1 << 15)
+
+/**
+ * Device specific implementations in CIPR are allowed to extend memory
+ * bitfields within their own headers respectively.
+ *
+ * All CIPR device specific implementations in a single platform are together
+ * responsible of integrity.
+ */
+#define IA_CIPR_MEMORY_DEVICE_MASK       (uint32_t)0xFFFF0000
+#define IA_CIPR_MEMORY_DEVICE_FLAG(x)    (uint32_t)(x << 16)
+
+/**
+ * Datatype to represent cipr memory to host.
+ */
+typedef struct {
+        uint32_t size;              /**< size in bytes */
+        void    *cpu_ptr;           /**< host pointer to allocated data */
+        uint64_t handle;  /**< implementation defined handle to allocated data */
+        /**< bitfield specifying allocation and usage information */
+        ia_cipr_memory_flags_t flags;
+        ia_cipr_buffer_t *anchor;    /**< anchor to origin buffer object */
+} ia_cipr_memory_t;
+
+/**
+ * Create specified CIPR buffer object
+ *
+ * \ingroup ia_cipr_memory
+ *
+ * \param[in]   size    amount of memory in bytes
+ * \param[in]   flags   memory flags for new object
+ * \param[in]   user_memory  optional user memory to create the buffer from
+ */
+ia_cipr_buffer_t*
+ia_cipr_buffer_create(uint32_t size,
+                      ia_cipr_memory_flags_t flags,
+                      ia_cipr_memory_t *user_memory);
+
+/**
+ * Create CIPR sub-buffer object
+ *
+ * \ingroup ia_cipr_memory
+ *
+ * \param[in]   parent buffer object owning the store for the region
+ * \param[in]   offset offset to start of the region in parent buffer store
+ * \param[in]   size size of the region
+ */
+ia_cipr_buffer_t*
+ia_cipr_buffer_create_region(ia_cipr_buffer_t *parent,
+                             uint32_t offset,
+                             uint32_t size);
+
+/**
+ * Identify if CIPR buffer is of region type
+ *
+ * \ingroup ia_cipr_memory
+ *
+ * \param[in]   parent buffer object
+ */
+bool ia_cipr_buffer_is_region(ia_cipr_buffer_t *buffer);
+
+/**
+ * Get CIPR region buffer parent object
+ *
+ * \ingroup ia_cipr_memory
+ *
+ * \param[in]   buffer region buffer object
+ */
+ia_cipr_buffer_t* ia_cipr_buffer_get_parent(ia_cipr_buffer_t *buffer);
+
+/**
+ * Allocate memory described by buffer object
+ *
+ * \ingroup ia_cipr_memory
+ *
+ * \param[in]   buffer  buffer object
+ */
+css_err_t
+ia_cipr_buffer_allocate(ia_cipr_buffer_t *buffer);
+
+/**
+ * Get memory accessor and flags of buffer object
+ *
+ * \ingroup ia_cipr_memory
+ *
+ * \param[in]   buffer  buffer object
+ * \param[out]  memory  host memory access information
+ */
+css_err_t
+ia_cipr_buffer_get_memory(ia_cipr_buffer_t *buffer,
+                          ia_cipr_memory_t *memory);
+
+/**
+ * Get memory device identifier
+ *
+ * \ingroup ia_cipr_memory
+ *
+ * \param[in]   buffer  buffer object
+ */
+ia_cipr_device_id_t
+ia_cipr_buffer_get_device_id(ia_cipr_buffer_t *buffer);
+
+/**
+ * Destroy buffer object
+ *
+ * \ingroup ia_cipr_memory
+ */
+void ia_cipr_buffer_destroy(ia_cipr_buffer_t *buf);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _IA_CIPR_MEMORY_H_ */
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_memory_device.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_memory_device.h
new file mode 100644
index 000000000000..91e78fee574d
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_memory_device.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _IA_CIPR_MEMORY_DEVICE_H_
+#define _IA_CIPR_MEMORY_DEVICE_H_
+
+#include "modules/ia_cipr/include/ia_cipr_memory.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \file ia_cipr_memory_device.h
+ *
+ * \brief Tentative definition for memory device interface abstraction
+ *
+ * \defgroup ia_cipr_memory_device Memory Device
+ * \ingroup ia_cipr_memory
+ */
+typedef struct _cipr_memory_device_ops  ia_cipr_memory_device_t;
+
+/**
+ * Migrate buffer object with specific memory device
+ *
+ * This function lets user to associate in which device address space the
+ * memory of buffer resides. Actual memory operations done depend on
+ * allocation and usage information given to \p buffer.
+ *
+ * \ingroup ia_cipr_memory_device
+ *
+ * \param[in]   memory_device   interface handle of specific memory device
+ * \param[in]   buffer          buffer object to associate
+ */
+css_err_t
+ia_cipr_memory_device_migrate_buffer(ia_cipr_memory_device_t *memory_device,
+                                     ia_cipr_buffer_t *buffer);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _IA_CIPR_MEMORY_DEVICE_H_ */
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_psys.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_psys.h
new file mode 100644
index 000000000000..083a37488586
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_psys.h
@@ -0,0 +1,495 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/** \file ia_cipr_psys.h
+ *
+ * CIPR PSYS Command Queue device header
+ *
+ * \defgroup ia_cipr_command_queue_device Command Queue Device
+ * \ingroup ia_cipr
+ * \brief Command Queue Device abstraction module exists only in documentation
+ * since there is only PSYS command queue device supported in CIPR.
+ * \see ia_cipr_psys.
+ *
+ * \defgroup ia_cipr_psys Processing System (PSYS)
+ * \ingroup ia_cipr_command_queue_device
+ * \brief CIPR PSYS implements command queue interface on top of IPU
+ * processing system hardware. Interface calls are used to manage compute
+ * on IPU in atomic units of execution. Each command includes memory objects
+ * dealt opaquely as indexed array of ia_cipr_buffer_t's.
+ *
+ * CIPR PSYS command queue lies on top of low level scheduler that manages
+ * work from multiple queues of concurrent CIPR clients. Semantics of the
+ * array and data transmission between compute kernels and CIPR clients is
+ * further specified by IPU firmware architecture.
+ *
+ * \note Current datatypes for the command specification are tentative and
+ *       expose naming conventions derived from firmware architecture, namely
+ *       program group manifest and parameters. These are specific to
+ *       existing IPU4 implementation and subject to change. Conceptually
+ *       CIPR command is a bundle of buffers that may consist of both memory
+ *       and program objects.
+ */
+
+#ifndef _IA_CIPR_PSYS_H_
+#define _IA_CIPR_PSYS_H_
+
+#include "modules/ia_cipr/include/css_types.h"
+#include "modules/ia_cipr/include/ia_cipr_memory_device.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * CIPR Device ID definition for PSYS device
+ */
+#define CIPR_DEVICE_PSYS    (ia_cipr_device_id_t)0xFE
+
+/**
+ * CIPR PSYS initialization flags
+ * CIPR_PSYS_INIT_FLAG_NONE: normal situation, empty flag
+ * CIPR_PSYS_INIT_FLAG_DEBUG: initialize cipr in debug
+ * mode. All cipr frame buffers can get a cpu_ptr in
+ * debug mode even for HW_ONLY flag buffer
+ */
+#define CIPR_PSYS_INIT_FLAG_NONE  (0 << 0)
+#define CIPR_PSYS_INIT_FLAG_DEBUG (1 << 0)
+
+/**
+ * CIPR Memory device flags
+ */
+#ifndef IA_CIPR_MEMORY_NO_FLUSH
+#define IA_CIPR_MEMORY_NO_FLUSH IA_CIPR_MEMORY_DEVICE_FLAG(1)
+#endif
+/** Memory device flag to indicate that buffer uses versioned API datatype
+ * defined in this header.
+ * \todo this is used for backward compliance and can be removed once legacy
+ *       support is dropped.
+ */
+#define IA_CIPR_MEMORY_PSYS_API IA_CIPR_MEMORY_DEVICE_FLAG(1<<15)
+
+typedef uint32_t ia_cipr_psys_init_flags_t;
+
+/**
+ * \ingroup ia_cipr_psys
+ */
+typedef struct _psys_context* ia_cipr_psys_context_t;
+
+/**
+ * \ingroup ia_cipr_psys
+ */
+typedef struct _psys_command* ia_cipr_psys_command_t;
+
+/**
+ * \ingroup ia_cipr_psys
+ */
+typedef struct _psys_event* ia_cipr_psys_event_t;
+
+/**
+ * Configuration of event object
+ *
+ * !DEPRECATION WARNING!
+ *
+ * This API has been ambiguous and has caused technical debt. Only user
+ * configuration of event object is the timeout-field. The rest are fields
+ * set by the CIPR implementation in ia_cipr_psys_wait_for_event() as
+ * operation consuming an event from events queue.
+ *
+ * Original documentation allows user to specify issue_id to associate a
+ * blocking call for a specific command issued. This feature was never
+ * utilized in client code, but has been misunderstood in CIPR implementation
+ * for Windows - which expects CIPR client to relay association between
+ * command and event object.
+ *
+ * \ingroup ia_cipr_psys
+ */
+typedef struct ia_cipr_psys_event_config {
+    uint32_t type;      /* TODO create enums for this?*/
+    uint64_t id; /*!< DEPRECATED */
+    uint64_t command_token; /*!< Token of command the event is associated with */
+    uint64_t command_issue_id; /*!< Issue id of command the event is associated with */
+    /* !< Bitmap of buffer indexes in associated command of which ownership
+      is passed back to user with this event */
+    uint64_t buffer_handover_bitmap;
+    uint32_t error; /*!< Error code in case error occured with associated command */
+    int32_t timeout; /*!< How long to wait for event before timing out */
+} ia_cipr_psys_event_config_t;
+
+/**
+ * Command instructions extension buffer
+ *
+ * With IPU5 process group has evolved from atomic execution unit into a
+ * persistent stream processor. It is no longer covering all information needed
+ * as per command transaction unit from host to embedded processor(s). This
+ * information needed with persistent process group is also not considered
+ * final.
+ *
+ * Command instructions extension is tentative way to support implementation
+ * defined versions of per command transaction unit used. Extension
+ * datatypes defined accordingly must use IA_CIPR_MEMORY_PSYS_API flag to
+ * indicate that data starts with header defined below. Legacy extension buffer
+ * is of datatype ia_css_program_group_param_t and must NOT use the flag.
+ *
+ * Ideally command types, programs and payload buffers should be enough to
+ * specify all transactions and operations between CIPR client and embedded
+ * processors as well as memory primitives, special instructions to control
+ * low-level scheduler or other attributes of IPU device driver. This approach
+ * would mimic OpenCL more closely. However, process group and payload buffers
+ * have special purpose specified in IPU firmware architecture. CIPR avoids
+ * to overspecify and instead reflects the programmability that exists as
+ * direct as possible reflected with the key design princible to keep IPU as
+ * general-purpose command based device.
+ *
+ * \todo device attributes query may be used to determine whether extension
+ *       datatype buffer should be migrated to device (mapped to kernel/ipu
+ *       address space).
+ *
+ * \ingroup ia_cipr_psys
+ */
+typedef enum _cmd_ext {
+    psys_command_ext_na,
+    psys_command_ext_ppg_0,
+    psys_command_ext_ppg_1
+} ia_cipr_psys_cmd_ext_version_t;
+
+typedef struct _cmd_ext_header_s {
+    uint32_t offset; /*!< sizeof(ia_cipr_psys_cmd_ext_header_t) */
+    uint64_t size; /*!< sizeof buffer carrying the header */
+    /* !< one of the valid versions from ia_cipr_psys_cmd_ext_version_t */
+    ia_cipr_psys_cmd_ext_version_t version;
+} ia_cipr_psys_cmd_ext_header_t;
+
+/**
+ * Persistent process group command extension
+ *
+ * Complies with _cmd_ext_header_s::version == psys_command_ext_ppg_0
+ *
+ * \ingroup ia_cipr_psys
+ */
+typedef struct ia_cipr_process_group_command_s {
+    ia_cipr_psys_cmd_ext_header_t header;
+    uint8_t frame_counter; /*!< Frame synchronization index */
+    uint8_t queue_id;      /*!< Queue index to use as offset from base in process group */
+    uint16_t fragment_state; /*!< Fragment of process group to process with command */
+    /*!< Partial completion events enable bits per terminal. Non-zero for plain command
+       completion, when partial events not supported */
+    uint64_t event_req_bitmap;
+    uint64_t irq_req_bitmap; /*!< Request interrupt on events enabled by event request bitmap */
+    uint32_t dynamic_kernel_bitmap[4]; /*!< pass dynamic keb to cipr */
+} ia_cipr_process_group_command_t;
+
+/**
+*  PPG command type
+*
+*  Enumeration to specify the different persistent program group commands.
+*  Used in the ID field of the command config.
+*/
+typedef enum _ppg_cmd_type {
+    ppg_cmd_start,
+    ppg_cmd_enqueue,
+    ppg_cmd_stop,
+    ppg_cmd_stop_eos
+} ia_cipr_ppg_cmd_type_t;
+
+/**
+ * User configuration of command object
+ *
+ * \ingroup ia_cipr_psys
+ */
+typedef struct ia_cipr_psys_command_config {
+    uint64_t id; /*!< PPG command type */
+    uint64_t token; /*!< User token (responce events associated) */
+    uint64_t issue_id; /*!< Issued command identifier(responce events associated) */
+    uint32_t priority; /*!< Queue priority to use when at head */
+    uint32_t psys_frequency; /*!< Frequency to apply when interpret */
+    uint32_t bufcount; /*!< Number of buffers with command */
+    ia_cipr_buffer_t **buffers; /*!< Buffers array */
+    ia_cipr_buffer_t *ext_buf; /*!< Command extension buffer */
+    ia_cipr_buffer_t *pg_params_buf; /*!< DEPRECATED */
+    /*!< Copy of program group manifest of which the process group in command is assembled */
+    ia_cipr_buffer_t *pg_manifest_buf;
+    /*!< Process group to execute with command. Note: With persistent protocol,
+      after successful start command, this reflects a read only trasaction unit
+      associated with started process group */
+    ia_cipr_buffer_t *pg;
+} ia_cipr_psys_command_config_t;
+
+#define CIPR_PSYS_CAP_DRIVER_FIELD_LENGTH        20
+#define CIPR_PSYS_CAP_DEVMODEL_FIELD_LENGTH      32
+
+/**
+ * \ingroup ia_cipr_psys
+ */
+typedef struct ia_cipr_psys_capability_s {
+    uint32_t version;
+    uint8_t driver[CIPR_PSYS_CAP_DRIVER_FIELD_LENGTH];
+    uint8_t dev_model[CIPR_PSYS_CAP_DEVMODEL_FIELD_LENGTH];
+    uint32_t program_group_count;
+} ia_cipr_psys_capability_t;
+
+/**
+ * Create PSYS context
+ *
+ * Returns handle to PSYS context that can be used to access
+ * ia_cipr_psys interface. Single command queue gets created
+ * per each create and following functions are bound to this
+ * queue:
+ *
+ * ia_cipr_psys_queue_command()
+ *
+ * ia_cipr_psys_wait_for_event()
+ *
+ * The rest of interface operations are independent from the
+ * queue and for example the buffer objects are interchangeable
+ * between the contexts of the same process. For memory sharing
+ * between processes, per process ia_cipr_buffer_t object needs
+ * to be used in combination with shared memory handle.
+ *
+ * \see ia_cipr_memory
+ *
+ * \ingroup ia_cipr_psys
+ */
+ia_cipr_psys_context_t ia_cipr_psys_create_context(ia_cipr_context_t cipr_ctx);
+
+/**
+ * Destroy PSYS context
+ *
+ * \ingroup ia_cipr_psys
+ *
+ * \param ctx ia_cipr_psys_context_t handle
+ */
+
+void ia_cipr_psys_destroy_context(ia_cipr_psys_context_t ctx);
+
+/**
+ * Get CIPR Memory device handle
+ *
+ * Returns ia_cipr_memory_device_t handle that can be used
+ * with CIPR Memory interface for memory primitives offered
+ * by the device.
+ *
+ * \ingroup ia_cipr_psys
+ *
+ * \param ctx ia_cipr_psys_context_t handle
+ */
+ia_cipr_memory_device_t*
+ia_cipr_psys_get_memory_device(ia_cipr_psys_context_t ctx);
+
+/**
+ * Get CIPR device capabilities
+ *
+ * Fills ia_cipr_psys_capability_t with information supported by the
+ * device.
+ *
+ * \todo make this direct query of capability info data, having separate
+ *       _config_t does not make sense.
+ *
+ * \ingroup ia_cipr_psys
+ *
+ * \param ctx ia_cipr_psys_context_t handle
+ * \param[out] capability pointer to ia_cipr_psys_capability_t
+ */
+css_err_t ia_cipr_psys_get_capabilities(ia_cipr_psys_context_t ctx,
+                                       ia_cipr_psys_capability_t *capability);
+
+/**
+ * Get Program Group manifest
+ *
+ * Fills ia_css_program_group_manifest_t for given index.
+ * Needs to be used to query size of the manifest first using NULL as manifest
+ *
+ * \ingroup ia_cipr_psys
+ *
+ * \param ctx ia_cipr_psys_context_t handle
+ * \param[in] index index of the manifest in platform
+ * \param[in,out] size_of_manifest pointer to the size of manifest
+ *                                 gets filled with correct size in case
+ *                                 \manifest is NULL.
+ * \param[in,out] manifest pointer to memory to hold the manifest
+ */
+css_err_t ia_cipr_psys_get_manifest(ia_cipr_psys_context_t ctx,
+                                   uint32_t index,
+                                   uint32_t *manifest_size,
+                                   void *manifest);
+
+/**
+ * Queue compute command for PSYS execution
+ *
+ * Places the command object in queue to be scheduled and executed
+ * asynchronously in the PSYS device. Completion of each command issued
+ * can be tracked with ia_cipr_psys_wait_for_event() using issue-id's.
+ *
+ * \todo introduce bitflags to control wakeup events.
+ *       wakeup control flag can be used also for bundling commands for
+ *       the l-scheduler.
+ *
+ * \ingroup ia_cipr_psys
+ *
+ * \param ctx ia_cipr_psys_context_t handle
+ * \param[in] cmd ia_cipr_psys_command_t object
+ */
+css_err_t ia_cipr_psys_queue_command(ia_cipr_psys_context_t ctx,
+                                    ia_cipr_psys_command_t cmd);
+/**
+ * Cancel compute command
+ *
+ * Cancels the compute command or removes the corresponding command
+ * from command queue in case the command didn't reach execution.
+ *
+ * \note Canceling command that has reached execution introduces
+ *       device dependent latencies. Currently not supported.
+ *
+ * \ingroup ia_cipr_psys
+ *
+ * \param ctx ia_cipr_psys_context_t handle
+ * \param[in] cmd ia_cipr_psys_command_t object
+ */
+css_err_t ia_cipr_psys_cancel_command(ia_cipr_psys_context_t ctx,
+                                     ia_cipr_psys_command_t cmd);
+/**
+ * Wait for specific command completion
+ *
+ * Returns after the command specified by ia_cipr_psys_event_t
+ * completes or there was an error in execution.
+ *
+ * \ingroup ia_cipr_psys
+ *
+ * \param ctx ia_cipr_psys_context_t handle
+ * \param[in,out] event ia_cipr_psys_event_t object
+ */
+css_err_t ia_cipr_psys_wait_for_event(ia_cipr_psys_context_t ctx,
+                                     ia_cipr_psys_event_t event);
+
+/**
+ * Create PSYS event object
+ *
+ * Returns ia_cipr_psys_event_t object handle. Object is created based on
+ * ia_cipr_psys_event_config_t specification and can be further used with
+ * ia_cipr_psys_wait_for_event()
+ *
+ * \ingroup ia_cipr_psys
+ *
+ * \param[in] cfg ia_cipr_psys_event_config_t event config specification
+ */
+ia_cipr_psys_event_t
+ia_cipr_psys_create_event(ia_cipr_psys_event_config_t *cfg);
+
+/**
+ * Destroy PSYS event object
+ *
+ * \ingroup ia_cipr_psys
+ * \param[in] event event object handle
+ */
+void ia_cipr_psys_destroy_event(ia_cipr_psys_event_t event);
+
+/**
+ * Read event config specification from event object
+ *
+ * \ingroup ia_cipr_psys
+ * \param[in] event event object handle
+ * \param[in] cfg ia_cipr_psys_event_config_t
+ */
+css_err_t
+ia_cipr_psys_get_event_config(ia_cipr_psys_event_t event,
+                              ia_cipr_psys_event_config_t *cfg);
+
+/**
+ * Update event config specification of event object
+ *
+ * \ingroup ia_cipr_psys
+ * \param[in] event event object handle
+ * \param[in] cfg ia_cipr_psys_event_config_t
+ */
+css_err_t
+ia_cipr_psys_set_event_config(ia_cipr_psys_event_t event,
+                              const ia_cipr_psys_event_config_t *cfg);
+
+/**
+ * Create PSYS command object
+ *
+ * Returns ia_cipr_psys_command_t object handle. Object is created based on
+ * ia_cipr_psys_command_config_t specification and can be further used with
+ * ia_cipr_psys_queue_command()
+ *
+ * A command object created with non-zero buffer count can be re-used to queue
+ * commands with any number of buffers not exceeding the count used at
+ * creation phase.
+ *
+ * A command object created with zero buffer count can be only used as command
+ * without buffers. Such command object can contain process group or other
+ * fixed fields to transmit info with the platform.
+ *
+ * IPU5/6 Persistent PG semantics include explicit start and stop commands.
+ * A command with empty array of buffers with count according to terminal count
+ * of process group is interpreted as start. A command with buffer count zero
+ * is interpreted as stop.
+ *
+ * \ingroup ia_cipr_psys
+ *
+ * \param[in] cfg ia_cipr_psys_command_config_t command config specification
+ */
+ia_cipr_psys_command_t
+ia_cipr_psys_create_command(ia_cipr_psys_command_config_t *cfg);
+
+/**
+ * Destroy PSYS command object
+ *
+ * \ingroup ia_cipr_psys
+ * \param[in] cmd command object handle
+ */
+void ia_cipr_psys_destroy_command(ia_cipr_psys_command_t cmd);
+
+/**
+ * Read command config specification from command object
+ *
+ * \ingroup ia_cipr_psys
+ *
+ * \param[in] cmd command object handle
+ * \param[out] cfg ia_cipr_psys_command_config_t
+ */
+css_err_t
+ia_cipr_psys_get_command_config(ia_cipr_psys_command_t cmd,
+                                ia_cipr_psys_command_config_t *cfg);
+/**
+ * Update command config specification of command object
+ *
+ * \ingroup ia_cipr_psys
+ *
+ * \param[in] cmd command object handle
+ * \param[in] cfg ia_cipr_psys_command_config_t
+ */
+css_err_t
+ia_cipr_psys_set_command_config(ia_cipr_psys_command_t cmd,
+                                const ia_cipr_psys_command_config_t *cfg);
+
+/* obsolete
+ * \todo replace by memory_device ops
+ */
+css_err_t ia_cipr_psys_register_buffer(ia_cipr_psys_context_t ctx,
+                                      ia_cipr_buffer_t *buffer);
+
+/* obsolete
+ * \todo replace by memory_device ops
+ */
+css_err_t ia_cipr_psys_unregister_buffer(ia_cipr_psys_context_t ctx,
+                                        ia_cipr_buffer_t *buffers);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _IA_CIPR_PSYS_H_ */
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/ipu-psys.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/ipu-psys.h
new file mode 100644
index 000000000000..657027a5a3ec
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/ipu-psys.h
@@ -0,0 +1,112 @@
+/****************************************************************************
+ * Copyright (C) 2019 Intel Corporation.
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_IPU_PSYS_H
+#define _UAPI_IPU_PSYS_H
+#include <linux/types.h>
+struct ipu_psys_capability {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+  uint32_t version;
+  uint8_t driver[20];
+  uint32_t pg_count;
+  uint8_t dev_model[32];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+  uint32_t reserved[17];
+} __attribute__((packed));
+struct ipu_psys_event {
+  uint32_t type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+  uint64_t user_token;
+  uint64_t issue_id;
+  uint32_t buffer_idx;
+  uint32_t error;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+  int32_t reserved[2];
+} __attribute__((packed));
+#define IPU_PSYS_EVENT_TYPE_CMD_COMPLETE 1
+#define IPU_PSYS_EVENT_TYPE_BUFFER_COMPLETE 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ipu_psys_buffer {
+  uint64_t len;
+  union {
+    int fd;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+    void* userptr;
+    uint64_t reserved;
+  } base;
+  uint32_t data_offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+  uint32_t bytes_used;
+  uint32_t flags;
+  uint32_t reserved[2];
+} __attribute__((packed));
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IPU_BUFFER_FLAG_INPUT (1 << 0)
+#define IPU_BUFFER_FLAG_OUTPUT (1 << 1)
+#define IPU_BUFFER_FLAG_MAPPED (1 << 2)
+#define IPU_BUFFER_FLAG_NO_FLUSH (1 << 3)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IPU_BUFFER_FLAG_DMA_HANDLE (1 << 4)
+#define IPU_BUFFER_FLAG_USERPTR (1 << 5)
+#define IPU_PSYS_CMD_PRIORITY_HIGH 0
+#define IPU_PSYS_CMD_PRIORITY_MED 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IPU_PSYS_CMD_PRIORITY_LOW 2
+#define IPU_PSYS_CMD_PRIORITY_NUM 3
+struct ipu_psys_command {
+  uint64_t issue_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+  uint64_t user_token;
+  uint32_t priority;
+  void* pg_manifest;
+  struct ipu_psys_buffer* buffers;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+  int pg;
+  uint32_t pg_manifest_size;
+  uint32_t bufcount;
+  uint32_t min_psys_freq;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+  uint32_t frame_counter;
+  uint32_t kernel_enable_bitmap[4];
+  uint32_t terminal_enable_bitmap[4];
+  uint32_t routing_enable_bitmap[4];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+  uint32_t rbm[5];
+  uint32_t reserved[2];
+} __attribute__((packed));
+struct ipu_psys_manifest {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+  uint32_t index;
+  uint32_t size;
+  void* manifest;
+  uint32_t reserved[5];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((packed));
+#define IPU_IOC_QUERYCAP _IOR('A', 1, struct ipu_psys_capability)
+#define IPU_IOC_MAPBUF _IOWR('A', 2, int)
+#define IPU_IOC_UNMAPBUF _IOWR('A', 3, int)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IPU_IOC_GETBUF _IOWR('A', 4, struct ipu_psys_buffer)
+#define IPU_IOC_PUTBUF _IOWR('A', 5, struct ipu_psys_buffer)
+#define IPU_IOC_QCMD _IOWR('A', 6, struct ipu_psys_command)
+#define IPU_IOC_DQEVENT _IOWR('A', 7, struct ipu_psys_event)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IPU_IOC_CMD_CANCEL _IOWR('A', 8, struct ipu_psys_command)
+#define IPU_IOC_GET_MANIFEST _IOWR('A', 9, struct ipu_psys_manifest)
+#endif
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_common.cpp b/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_common.cpp
new file mode 100644
index 000000000000..9e40c90854a2
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_common.cpp
@@ -0,0 +1,511 @@
+/*
+ * Copyright (C) 2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "MEMORY_COMMON"
+
+#include <string.h>
+
+#include "modules/ia_cipr/src/common/ia_cipr_memory_common.h"
+#include "modules/ia_cipr/include/ia_cipr.h"
+#include "modules/ia_cipr/include/ia_cipr_alloc.h"
+#include "modules/ia_cipr/include/ia_cipr_memory.h"
+#include "modules/ia_cipr/src/common/ia_cipr_memory_device_ops.h"
+#include "CameraLog.h"
+
+using icamera::CAMERA_DEBUG_LOG_ERR;
+using icamera::CAMERA_DEBUG_LOG_WARNING;
+
+void _cipr_memory_common_destroy(ia_cipr_buffer_t *buffer) {
+    if (buffer
+        && (buffer->mem.flags & IA_CIPR_MEMORY_ALLOCATED)
+        && (buffer->mem.flags & IA_CIPR_MEMORY_CPU_PTR)
+        && buffer->mem.cpu_ptr) {
+        IA_CIPR_FREE(buffer->mem.cpu_ptr);
+    }
+}
+
+css_err_t _cipr_memory_common_allocate(ia_cipr_buffer_t *buffer) {
+    void *cpu_ptr = NULL;
+
+    /* In case buffer is explicitly set with device specific flags,
+     * migration needs to be done before allocation and explicit
+     * allocate call should not end up here */
+    if ((buffer->mem.flags & IA_CIPR_MEMORY_DEVICE_MASK)
+        && buffer->dev_id == 0) {
+        icamera::LOGE("%s: device memory flags specified, migrate first!", __func__);
+        return css_err_argument;
+    }
+
+    if (buffer->mem.cpu_ptr
+        && !(buffer->mem.flags & IA_CIPR_MEMORY_COPY_FROM_USER)) {
+        icamera::LOGE("%s: already allocated", __func__);
+        return css_err_argument;
+    }
+
+    cpu_ptr = IA_CIPR_MALLOC(buffer->mem.size);
+    if (!cpu_ptr)
+        return css_err_nomemory;
+
+    if (buffer->mem.flags & IA_CIPR_MEMORY_COPY_FROM_USER) {
+        if (buffer->mem.cpu_ptr) {
+            IA_CIPR_MEMCOPY(cpu_ptr,
+                            buffer->mem.size,
+                            buffer->mem.cpu_ptr,
+                            buffer->mem.size);
+        } else if (buffer->mem.flags & IA_CIPR_MEMORY_HANDLE) {
+            icamera::LOGE("%s: copy from handle to host only memory not implemented", __func__);
+            goto bail;
+        }
+        buffer->mem.flags &= ~IA_CIPR_MEMORY_COPY_FROM_USER;
+    }
+
+    buffer->mem.cpu_ptr = cpu_ptr;
+    buffer->mem.flags &= ~IA_CIPR_MEMORY_ALLOCATE_CPU_PTR;
+    buffer->mem.flags |= IA_CIPR_MEMORY_CPU_PTR | IA_CIPR_MEMORY_ALLOCATED;
+    buffer->dev_mem.destroy = _cipr_memory_common_destroy;
+
+    return css_err_none;
+bail:
+    if (cpu_ptr)
+        IA_CIPR_FREE(cpu_ptr);
+    return css_err_general;
+}
+
+css_err_t _cipr_memory_common_get_memory(ia_cipr_buffer_t *buffer,
+                                        ia_cipr_memory_t *memory) {
+    css_err_t ret;
+
+    if (buffer->mem.flags & IA_CIPR_MEMORY_ALLOCATE_CPU_PTR) {
+        if (buffer->mem.cpu_ptr) {
+            icamera::LOGE("%s: ALLOCATE_CPU_PTR not handled but pointer exists!", __func__);
+            return css_err_internal;
+        }
+        ret = ia_cipr_buffer_allocate(buffer);
+        if (ret != css_err_none)
+            return ret;
+    }
+
+    *memory = buffer->mem;
+    return css_err_none;
+}
+
+css_err_t _validate_buffer_bitfield(ia_cipr_buffer_t *buffer,
+                                   ia_cipr_memory_t *memory) {
+    bool valid = true;
+    bool have_memory = false;
+    ia_cipr_memory_t *mem;
+
+    if (!buffer)
+        return css_err_argument;
+
+    mem = (memory) ? memory : &buffer->mem;
+
+    have_memory = mem->flags & IA_CIPR_MEMORY_ALLOCATED ||
+                  mem->flags & IA_CIPR_MEMORY_FROM_USER;
+
+    if (!(mem->flags & IA_CIPR_MEMORY_CPU_PTR) ^ (mem->cpu_ptr == NULL)) {
+        icamera::LOGE("%s: IA_CIPR_MEMORY_CPU_PTR (%s) ptr = %p",
+                      __func__,
+                      (mem->flags & IA_CIPR_MEMORY_CPU_PTR) ? "set" : "not set",
+                      mem->cpu_ptr);
+        valid &= false;
+    }
+
+    if (!(mem->flags & IA_CIPR_MEMORY_HANDLE) ^ (mem->handle == 0)) {
+        icamera::LOGE("%s: IA_CIPR_MEMORY_HANDLE (%s) handle = %llu",
+                      __func__,
+                      (mem->flags & IA_CIPR_MEMORY_HANDLE) ? "set" : "not set",
+                      (uint64_t)mem->handle);
+        valid &= false;
+    }
+
+    if ((mem->flags & IA_CIPR_MEMORY_CPU_ONLY) && (mem->flags & IA_CIPR_MEMORY_HW_ONLY)) {
+        icamera::LOGE("%s: Both IA_CIPR_MEMORY_CPU_ONLY and IA_CIPR_MEMORY_HW_ONLY "
+                      "are set at same time, which is the invalid case.",
+                      __func__);
+        valid &= false;
+    }
+
+    /* check that bitflags are set atomically with allocation */
+    if (!have_memory
+        && ((mem->flags & IA_CIPR_MEMORY_HANDLE)
+        || (mem->flags & IA_CIPR_MEMORY_CPU_PTR))) {
+        icamera::LOGE("%s: memory accessor set before allocation",
+                      __func__);
+        valid &= false;
+    }
+
+    if (have_memory
+        && (mem->flags & IA_CIPR_MEMORY_ALLOCATE_CPU_PTR)) {
+        icamera::LOGE("%s: IA_CIPR_MEMORY_ALLOCATE_CPU_PTR needs to be unset "
+                      "to acknowledge allocation done!",
+                      __func__);
+        valid &= false;
+    }
+
+    if (have_memory
+        && (mem->flags & IA_CIPR_MEMORY_COPY_FROM_USER)) {
+        icamera::LOGE("%s: IA_CIPR_MEMORY_COPY_FROM_USER needs to be unset "
+                      "to acknowledge copy done!",
+                      __func__);
+        valid &= false;
+    }
+
+    if (have_memory
+        && !((mem->flags & IA_CIPR_MEMORY_HANDLE)
+        || (mem->flags & IA_CIPR_MEMORY_CPU_PTR)
+        || (mem->flags & IA_CIPR_MEMORY_HW_ONLY))) {
+        icamera::LOGE("%s: missing memory accessor or HW_ONLY flag for"
+                      " allocated memory",
+                      __func__);
+        valid &= false;
+    }
+
+    return (valid) ? css_err_none : css_err_general;
+}
+
+/**
+ * Construct CIPR BUFFER OBJECT
+ */
+ia_cipr_buffer_t*
+ia_cipr_buffer_create(uint32_t size,
+                      ia_cipr_memory_flags_t flags,
+                      ia_cipr_memory_t *user_memory) {
+    ia_cipr_buffer_t *buf;
+    css_err_t    ret;
+
+    if (size == 0)
+        return NULL;
+
+    /* create the object */
+    buf = reinterpret_cast<ia_cipr_buffer_t *>(IA_CIPR_CALLOC(1, sizeof(*buf)));
+    if (!buf) {
+        icamera::LOGE("could not allocate buf");
+        return NULL;
+    }
+    buf->mem.anchor = buf;
+
+    /* store size request */
+    buf->mem.size = size;
+
+    /* handle user specified memory
+     *
+     * Note: user field in struct _cipr_buffer does not reflect user_memory
+     *       received here directly. It reflects the state of buffer accessible
+     *       to user via ia_cipr_buffer_get_memory().
+     */
+    if (user_memory) {
+        if (size < user_memory->size) {
+            icamera::LOGW("%s: requested bytes to allocate less than "
+                           "provided user memory in argument, "
+                           "truncating", __func__);
+        } else if (user_memory->size < size) {
+            icamera::LOGE("%s: requested bytes to allocate more than "
+                           "provided user memory in argument",
+                           __func__);
+            goto bail;
+        }
+
+        /* IA_CIPR_MEMORY_CPU_PTR */
+        if (user_memory->flags & IA_CIPR_MEMORY_CPU_PTR) {
+            if (!user_memory->cpu_ptr) {
+                icamera::LOGE("%s: user did not provide pointer with "
+                              "IA_CIPR_MEMORY_CPU_PTR", __func__);
+                goto bail;
+            }
+            if (user_memory->flags & IA_CIPR_MEMORY_HANDLE) {
+                icamera::LOGE("%s: IA_CIPR_MEMORY_CPU_PTR conflict with "
+                              "IA_CIPR_MEMORY_HANDLE", __func__);
+                goto bail;
+            }
+            if (flags & IA_CIPR_MEMORY_ALLOCATE_CPU_PTR
+                && !(flags & IA_CIPR_MEMORY_COPY_FROM_USER)) {
+                /* Allocate request makes no sense with user memory unless
+                 * copy-from user pointer is set. */
+                icamera::LOGE("%s: IA_CIPR_MEMORY_CPU_PTR conflict with "
+                              "IA_CIPR_MEMORY_ALLOCATE_CPU_PTR", __func__);
+                goto bail;
+            }
+            buf->mem.cpu_ptr = user_memory->cpu_ptr;
+            buf->mem.flags |= IA_CIPR_MEMORY_CPU_PTR | IA_CIPR_MEMORY_FROM_USER;
+        /* IA_CIPR_MEMORY_HANDLE */
+        } else if (user_memory->flags & IA_CIPR_MEMORY_HANDLE) {
+            if (!user_memory->handle) {
+                icamera::LOGE("%s: user did not provide handle with "
+                              "IA_CIPR_MEMORY_HANDLE", __func__);
+                goto bail;
+            }
+            if (user_memory->flags & IA_CIPR_MEMORY_CPU_PTR) {
+                icamera::LOGE("%s: IA_CIPR_MEMORY_HANDLE conflict with "
+                              "IA_CIPR_MEMORY_CPU_PTR", __func__);
+                goto bail;
+            }
+            if (flags & IA_CIPR_MEMORY_COPY_FROM_USER) {
+                icamera::LOGE("%s: IA_CIPR_MEMORY_COPY_FROM_USER conflict! "
+                              " Copy from user handle not implemented.",
+                              __func__);
+                goto bail;
+            }
+            if (flags & IA_CIPR_MEMORY_ALLOCATE_CPU_PTR
+                && !(flags & IA_CIPR_MEMORY_COPY_FROM_USER)) {
+                /* Allocate request makes no sense with user memory unless
+                 * copy-from user pointer is set. */
+                icamera::LOGE("%s: IA_CIPR_MEMORY_HANDLE conflict with "
+                              "IA_CIPR_MEMORY_ALLOCATE_CPU_PTR", __func__);
+                goto bail;
+            }
+            buf->mem.handle = user_memory->handle;
+            buf->mem.flags |= IA_CIPR_MEMORY_HANDLE | IA_CIPR_MEMORY_FROM_USER;
+        }
+
+        /* TODO: support inheriting object from another */
+        if (user_memory->anchor) {
+            icamera::LOGE("%s: inheriting object from another not supported!",
+                          __func__);
+            goto bail;
+        }
+
+        if (buf->mem.cpu_ptr == NULL && buf->mem.handle == 0) {
+            icamera::LOGE("%s: Invalid user memory given as argument!",
+                          __func__);
+            goto bail;
+        }
+    }
+
+    /* merge requested flags */
+    buf->mem.flags |= flags;
+
+    /* assign pure host operations for allocate and get_memory, this is to
+     * cover pure host memory buffers. Migration with device is expected to
+     * overwrite the ops */
+    buf->dev_mem.allocate = _cipr_memory_common_allocate;
+    buf->dev_mem.get_memory = _cipr_memory_common_get_memory;
+
+    ret = _validate_buffer_bitfield(buf, NULL);
+    if (ret != css_err_none)
+        goto bail;
+
+    return buf;
+bail:
+    IA_CIPR_FREE(buf);
+    return NULL;
+}
+
+ia_cipr_buffer_t*
+ia_cipr_buffer_create_region(ia_cipr_buffer_t *parent,
+                             uint32_t offset,
+                             uint32_t size) {
+    ia_cipr_buffer_t *buf;
+    css_err_t ret;
+
+    if (!parent || size == 0)
+        return NULL;
+
+    if (parent->mem.size < offset + size) {
+        icamera::LOGE("%s: parent buffer size %d not enough "
+                      "for region requested (offset %d, size %d)",
+                      __func__,
+                      parent->mem.size,
+                      offset,
+                      size);
+        return NULL;
+    }
+
+    if (ia_cipr_buffer_is_region(parent)) {
+        icamera::LOGE("%s: nested regions are illecal", __func__);
+        return NULL;
+    }
+
+    /* create the object */
+    buf = reinterpret_cast<ia_cipr_buffer_t *>(IA_CIPR_CALLOC(1, sizeof(*buf)));
+    if (!buf) {
+        icamera::LOGE("%s: failed to allocate buffer", __func__);
+        return NULL;
+    }
+
+    buf->mem.size = size;
+    buf->offset = offset;
+    buf->mem.anchor = parent;
+    buf->mem.flags = parent->mem.flags;
+
+    ret = ia_list_append(&parent->regions, buf);
+    if (ret != css_err_none) {
+        icamera::LOGE("%s: failed to append to parent buffer regions",
+                      __func__);
+        IA_CIPR_FREE(buf);
+        return NULL;
+    }
+
+    return buf;
+}
+
+void ia_cipr_buffer_destroy(ia_cipr_buffer_t *buf) {
+    ia_list_t *current;
+
+    if (!buf) {
+        icamera::LOGW("%s: NULL pointer given!", __func__);
+        return;
+    }
+
+    if (ia_cipr_buffer_is_region(buf)) {
+        if (!buf->mem.anchor) {
+            icamera::LOGW("%s: parent already released", __func__);
+        } else if (!ia_list_remove(&buf->mem.anchor->regions, buf)) {
+            icamera::LOGE("%s: region parent reference missing", __func__);
+        }
+    }
+
+    if (buf->regions) {
+        icamera::LOGW("%s: parent buffer destroy leaves stale regions",
+                       __func__);
+        current = buf->regions;
+        while (current) {
+            ia_cipr_buffer_t *region = reinterpret_cast<ia_cipr_buffer_t *>(current->data);
+            region->mem.anchor = NULL;
+            ia_list_t *prev = current;
+            current = current->next;
+            ia_list_destroy(prev);
+        }
+    }
+
+    if (buf->dev_mem.destroy)
+        buf->dev_mem.destroy(buf);
+
+    IA_CIPR_FREE(buf);
+}
+
+bool ia_cipr_buffer_is_region(ia_cipr_buffer_t *buffer) {
+    return (buffer->mem.anchor != buffer);
+}
+
+ia_cipr_buffer_t* ia_cipr_buffer_get_parent(ia_cipr_buffer_t *buffer) {
+    if (!ia_cipr_buffer_is_region(buffer)) {
+        icamera::LOGE("%s: not a child object", __func__);
+        return NULL;
+    }
+
+    if (!buffer->mem.anchor)
+        return NULL;
+    return buffer->mem.anchor;
+}
+
+css_err_t
+ia_cipr_buffer_allocate(ia_cipr_buffer_t *buffer) {
+    css_err_t ret;
+
+    if (!buffer)
+        return css_err_argument;
+
+    if (!buffer->dev_mem.allocate)
+        return css_err_internal;
+
+    ret = buffer->dev_mem.allocate(buffer);
+    if (ret != css_err_none) {
+        icamera::LOGE("%s: allocation failed", __func__);
+        return ret;
+    }
+
+    ret = _validate_buffer_bitfield(buffer, NULL);
+    if (ret != css_err_none) {
+        icamera::LOGE("%s: bitfield validation after allocate failed",
+                      __func__);
+        return ret;
+    }
+
+    return css_err_none;
+}
+
+uint8_t
+ia_cipr_buffer_get_device_id(ia_cipr_buffer_t *buffer) {
+    if (!buffer)
+        return 0;
+
+    return buffer->dev_id;
+}
+
+css_err_t
+ia_cipr_buffer_get_memory(ia_cipr_buffer_t *buffer, ia_cipr_memory_t *memory) {
+    ia_cipr_buffer_t *region = NULL;
+    css_err_t ret;
+
+    if (!buffer || !memory)
+        return css_err_argument;
+
+    if (ia_cipr_buffer_is_region(buffer)) {
+        /* switch to parent for get memory */
+        region = buffer;
+        buffer = buffer->mem.anchor;
+    }
+
+    if (!buffer->dev_mem.get_memory)
+        return css_err_internal;
+
+    ret = buffer->dev_mem.get_memory(buffer, memory);
+    if (ret != css_err_none) {
+        icamera::LOGE("%s: operation failed", __func__);
+        return ret;
+    }
+
+    ret = _validate_buffer_bitfield(buffer, memory);
+    if (ret != css_err_none) {
+        icamera::LOGE("%s: bitfield validation failed for memory returned",
+                      __func__);
+        return ret;
+    }
+
+    if (region) {
+        /* Calculate virtual address based on offset region */
+        if (region->offset + region->mem.size > memory->size) {
+            icamera::LOGE("%s: memory region doesn't fit in parent store!",
+                          __func__);
+            return css_err_internal;
+        }
+        if (memory->cpu_ptr)
+            memory->cpu_ptr = reinterpret_cast<uint8_t*>(memory->cpu_ptr) + region->offset;
+        memory->size = region->mem.size;
+        /* Don't expose that region objects have the parent as stored anchor */
+        memory->anchor = region;
+    }
+
+    return css_err_none;
+}
+
+css_err_t
+ia_cipr_memory_device_migrate_buffer(ia_cipr_memory_device_t *md,
+                                     ia_cipr_buffer_t *buffer) {
+    if (!buffer || !md)
+        return css_err_argument;
+
+    if (buffer->mem.anchor != buffer) {
+        icamera::LOGE("%s: buffer regions cannot be independently migrated",
+                      __func__);
+        return css_err_argument;
+    }
+
+    buffer->dev_mem.allocate =
+        (md->allocate) ? md->allocate : buffer->dev_mem.allocate;
+    buffer->dev_mem.migrate =
+        (md->migrate) ? md->migrate : buffer->dev_mem.migrate;
+    buffer->dev_mem.get_memory =
+        (md->get_memory) ? md->get_memory : buffer->dev_mem.get_memory;
+    buffer->dev_mem.destroy =
+        (md->destroy) ? md->destroy : buffer->dev_mem.destroy;
+    buffer->dev_mem.dev_priv = md->dev_priv;
+
+    if (!buffer->dev_mem.migrate)
+        return css_err_argument;
+    return buffer->dev_mem.migrate(buffer);
+}
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_common.h b/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_common.h
new file mode 100644
index 000000000000..27d88280ac5e
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_common.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _IA_CIPR_MEMORY_COMMON_H_
+#define _IA_CIPR_MEMORY_COMMON_H_
+
+#include "modules/ia_cipr/src/common/ia_list.h"
+#include "modules/ia_cipr/src/common/ia_cipr_memory_device_ops.h"
+#include "modules/ia_cipr/include/ia_cipr_memory_device.h"
+
+/** Datatype for Common CIPR Buffer object */
+struct _cipr_buffer {
+    ia_cipr_memory_t        mem;
+    uint8_t                 dev_id;
+    uint64_t                dev_priv;
+    ia_cipr_memory_device_t dev_mem;
+    uint32_t                offset;
+    ia_list_t              *regions;
+};
+
+#endif
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_device_ops.h b/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_device_ops.h
new file mode 100644
index 000000000000..440b921a094f
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_device_ops.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _IA_CIPR_MEMORY_DEVICE_OPS_H_
+#define _IA_CIPR_MEMORY_DEVICE_OPS_H_
+
+#include "modules/ia_cipr/include/ia_cipr_memory_device.h"
+
+typedef css_err_t    (*_cipr_device_buffer_op)(ia_cipr_buffer_t *);
+typedef css_err_t    (*_cipr_device_get_memory_op)(ia_cipr_buffer_t *,
+                                                  ia_cipr_memory_t *);
+typedef void        (*_cipr_device_destroy_buffer_op)(ia_cipr_buffer_t *);
+
+/**
+ * Memory device interface
+ */
+struct _cipr_memory_device_ops {
+    _cipr_device_buffer_op          allocate;
+    _cipr_device_buffer_op          migrate;
+    _cipr_device_get_memory_op      get_memory;
+    _cipr_device_destroy_buffer_op  destroy;
+    void*                           dev_priv;
+};
+
+#endif /* _IA_CIPR_MEMORY_DEVICE_OPS_H_ */
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_list.cpp b/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_list.cpp
new file mode 100644
index 000000000000..096e84c9f2ee
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_list.cpp
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IA_LIST"
+
+#include "modules/ia_cipr/src/common/ia_list.h"
+
+#include "modules/ia_cipr/include/ia_cipr_alloc.h"
+
+ia_list_t *ia_list_create(void) {
+    return reinterpret_cast<ia_list_t *>(IA_CIPR_CALLOC(1, sizeof(ia_list_t)));
+}
+
+void ia_list_destroy(ia_list_t *list) {
+    if (list)
+        IA_CIPR_FREE(list);
+}
+
+css_err_t ia_list_prepend(ia_list_t **list, void *data) {
+    ia_list_t *new_list = ia_list_create();
+    if (!new_list) {
+        return css_err_nomemory;
+    }
+    new_list->data = data;
+    new_list->next = *list;
+    *list = new_list;
+
+    return css_err_none;
+}
+
+css_err_t ia_list_append(ia_list_t **list, void *data) {
+    ia_list_t *new_list = ia_list_create();
+    if (!new_list) {
+        return css_err_nomemory;
+    }
+    new_list->data = data;
+    new_list->next = NULL;
+
+    if (!*list) {
+        *list = new_list;
+    } else {
+      ia_list_t *last = *list;
+      while (last && last->next)
+          last = last->next;
+      if (last) {
+          last->next = new_list;
+      } else {
+        return css_err_nomemory;
+      }
+    }
+
+    return css_err_none;
+}
+
+bool ia_list_contains(const ia_list_t *list, void *data) {
+    const ia_list_t *l;
+
+    for (l = list; l; l = l->next) {
+        if (l->data == data)
+            break;
+    }
+    return l != NULL;
+}
+
+void *ia_list_data_at(const ia_list_t *list, uint32_t index) {
+    const ia_list_t *l;
+    for (l = list; l; l = l->next) {
+        if (index == 0)
+            return l->data;
+        index--;
+    }
+
+    return NULL;
+}
+
+bool ia_list_remove(ia_list_t **list, void *data) {
+    ia_list_t *prev = NULL,
+            *l = NULL;
+
+    if (list)
+        l = *list;
+
+    for (; l; l = l->next) {
+        if (l->data == data) {
+            if (prev)
+                prev->next = l->next;
+            else
+                *list = l->next;
+            ia_list_destroy(l);
+            break;
+        }
+        prev = l;
+    }
+    return l != NULL;
+}
+
+uint32_t ia_list_length(const ia_list_t *list) {
+    uint32_t length = 0;
+    const ia_list_t *l;
+
+    for (l = list; l; l = l->next)
+        length++;
+
+    return length;
+}
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_list.h b/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_list.h
new file mode 100644
index 000000000000..5ba389587cce
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_list.h
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _IA_LIST_H_
+#define _IA_LIST_H_
+
+#include <stdbool.h>
+#include "modules/ia_cipr/include/css_types.h"
+
+/**
+ * \ingroup ia_tools
+ */
+typedef struct ia_list {
+    void *data;
+    struct ia_list *next;
+} ia_list_t;
+
+/**
+ * Create a ia_list
+ * \ingroup ia_tools
+ * \return pointer to the list. NULL if failed.
+ */
+extern ia_list_t *
+ia_list_create(void);
+
+/**
+ * Destroy a ia_list
+ * \ingroup ia_tools
+ * \param *list the list
+ */
+extern void
+ia_list_destroy(ia_list_t *list);
+
+/**
+ * Add a new element to a list head. If *list is NULL, a new ia_list element is
+ * allocated and inserted to *list.
+ * \ingroup ia_tools
+ * \param **list a pointer to the list pointer
+ * \param *data the data for the list element
+ * \return css_err_none on success
+ * Add data to a ia_list
+ */
+extern css_err_t
+ia_list_prepend(ia_list_t **list, void *data);
+
+/**
+ * Add a new element to a list tail. If *list is NULL, a new ia_list element is
+ * allocated and inserted to *list.
+ * \ingroup ia_tools
+ * \param **list a pointer to the list pointer
+ * \param *data the data for the list element
+ * \return css_err_none on success
+ * Add data to a ia_list
+ */
+extern css_err_t
+ia_list_append(ia_list_t **list, void *data);
+
+/**
+ * Tell whether data is in the list
+ * \ingroup ia_tools
+ * \param *list handle to the list object
+ * \param *data the data pointer
+ * \return true if data is in the list, false otherwise
+ */
+extern bool
+ia_list_contains(const ia_list_t *list, void *data);
+
+/**
+ * Remove data if it exists in the list.
+ * \ingroup ia_tools
+ * \param **list a pointer to the list pointer.
+ * \param *data the data to remove from list.
+ * \return true if data was removed. False otherwise.
+ */
+extern bool
+ia_list_remove(ia_list_t **list, void *data);
+
+/**
+ * Tell the length of the list.
+ * \ingroup ia_tools
+ * \param *list a pointer to the list.
+ * \return length of the list.
+ */
+extern uint32_t
+ia_list_length(const ia_list_t *list);
+
+/**
+ * Return data at an index of the list.
+ * \ingroup ia_tools
+ * \param *list a pointer to the list.
+ * \param index element index
+ * \return pointer to the data at the element at the distance "index" from the
+ * given list element
+ */
+extern void*
+ia_list_data_at(const ia_list_t *list, uint32_t index);
+
+#endif /* _IA_LIST_H_ */
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/linux/ia_cipr_alloc.cpp b/camera/hal/intel/ipu6/modules/ia_cipr/src/linux/ia_cipr_alloc.cpp
new file mode 100644
index 000000000000..42d59d54b45e
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/linux/ia_cipr_alloc.cpp
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * ia_cipr_alloc.c
+ */
+#define LOG_TAG "IA_CIPR_ALLOC"
+
+#include <unistd.h>
+
+#include "modules/ia_cipr/include/ia_cipr_alloc.h"
+#include "CameraLog.h"
+#include "Utils.h"
+
+using icamera::CAMERA_DEBUG_LOG_INFO;
+using icamera::CAMERA_DEBUG_LOG_WARNING;
+using icamera::CAMERA_DEBUG_LOG_LEVEL1;
+using icamera::gLogLevel;
+
+size_t ia_cipr_pagesize() {
+    return (size_t) sysconf(_SC_PAGESIZE);
+}
+
+void* ia_cipr_malloc(size_t size,
+                     const char *logmsg,
+                     const char *file_name,
+                     int line) {
+    void *resptr = malloc(size);
+    (void)file_name;
+    (void)line;
+    (void)logmsg; /* silence warning if logging is not enabled */
+    icamera::LOG1("@%s size %lu from %s res ptr: %p", __func__, size, logmsg, resptr);
+
+    return resptr;
+}
+
+void* ia_cipr_calloc(size_t nmemb,
+                     size_t size,
+                     const char *logmsg,
+                     const char *file_name,
+                     int line) {
+    void *resptr = calloc(nmemb, size);
+    (void)file_name;
+    (void)line;
+    (void)logmsg; /* silence warning if logging is not enabled */
+
+    icamera::LOG1("@%s nmemb %lu size %lu from %s res ptr: %p",
+                  __func__, nmemb, size, logmsg, resptr);
+
+    return resptr;
+}
+
+void* ia_cipr_alloc_aligned(size_t size,
+                            size_t alignment,
+                            const char *logmsg,
+                            const char *file_name,
+                            int line) {
+    void *resptr = NULL;
+    int ret = posix_memalign(&resptr, alignment, size);
+    if (ret)
+        return NULL;
+    (void)file_name;
+    (void)line;
+    (void)logmsg; /* silence warning if logging is not enabled */
+    icamera::LOG1("@%s size %ld with alignment %lu from %s res ptr: %p",
+                  __func__, size, alignment, logmsg, resptr);
+
+    return resptr;
+}
+
+void ia_cipr_free(void *ptr, const char *logmsg) {
+    icamera::LOG1("@%s ptr %p from %s", __func__, ptr, logmsg);
+    (void)logmsg; /* silence warning if logging is not enabled */
+
+    free(ptr);
+}
+
+void ia_cipr_memcopy(void *dest, size_t dest_size, const void *src, size_t n) {
+    /* perform some basic sanity checks */
+
+    if (dest_size < n)
+        icamera::LOGW("%s: destination size is smaller than source size, potential coding error",
+                       __func__);
+
+    MEMCPY_S(dest, dest_size, src, n);
+}
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/linux/ia_cipr_psys.cpp b/camera/hal/intel/ipu6/modules/ia_cipr/src/linux/ia_cipr_psys.cpp
new file mode 100644
index 000000000000..d88328575719
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/linux/ia_cipr_psys.cpp
@@ -0,0 +1,778 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "CIPR_PSYS"
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <poll.h>
+#include <errno.h>
+#include <string.h>
+
+#include "modules/ia_cipr/include/ia_cipr_alloc.h"
+#include "modules/ia_cipr/src/common/ia_cipr_memory_common.h"
+#include "modules/ia_cipr/include/ia_cipr_memory_device.h"
+#include "modules/ia_cipr/include/ia_cipr_memory.h"
+#include "modules/ia_cipr/include/ia_cipr_psys.h"
+#include "modules/ia_cipr/include/ipu-psys.h"
+
+#include "CameraLog.h"
+#include "iutils/Utils.h"
+
+#define DRIVER_NAME "/dev/ipu-psys0"
+
+using icamera::CAMERA_DEBUG_LOG_VERBOSE;
+using icamera::CAMERA_DEBUG_LOG_ERR;
+using icamera::CAMERA_DEBUG_LOG_DBG;
+using icamera::CAMERA_DEBUG_LOG_WARNING;
+using icamera::CAMERA_DEBUG_LOG_LEVEL2;
+using icamera::gLogLevel;
+
+extern void _cipr_memory_common_destroy(ia_cipr_buffer_t *buffer);
+
+/*
+ * Definitions of opaque types
+ */
+struct _psys_context {
+    int fd;
+    uint32_t init_flags;
+    struct _cipr_memory_device_ops mem_ops;
+};
+
+struct _psys_event {
+    struct ipu_psys_event event;
+    int32_t timeout;
+};
+
+struct _psys_command {
+    struct ipu_psys_command ioc_cmd;
+    uint32_t         allocated_buffers;
+    ia_cipr_buffer_t **user_buffers;
+    ia_cipr_buffer_t *pg;
+    /* for backward compatibility */
+    void *pg_params;
+    uint32_t pg_params_size;
+    ia_cipr_buffer_t *ext_buf;
+    ia_cipr_buffer_t *pg_manifest_buf;
+};
+
+css_err_t _psys_ioctl(int fd, int request, void *ptr) {
+    int res, errno_copy;
+
+#ifdef ANDROID
+    res = ioctl(fd, request, ptr);
+#else
+    res = ioctl(fd, (unsigned int)request, ptr);
+#endif
+    errno_copy = errno;
+
+    /* Check ioctl return value for errors */
+    if (res < 0) {
+        icamera::LOGV("ioctl returned error: %s", strerror(errno_copy));
+        switch (errno_copy) {
+        case ENOMEM:
+            return css_err_nomemory;
+        case EINVAL:
+            return css_err_argument;
+        case EFAULT:
+            return css_err_argument;
+        case ENOENT:
+            return css_err_noentry;
+        default:
+            return css_err_general;
+        }
+    }
+
+    return css_err_none;
+}
+
+css_err_t _psys_close(int fd) {
+    int res, error;
+
+    res = close(fd);
+    error = errno;
+
+    /* Check close return value for errors */
+    if (res < 0) {
+        icamera::LOGE("close returned error: %s", strerror(error));
+
+        switch (error) {
+        case EBADF:
+            return css_err_argument;
+        case EIO:
+        case EINTR:
+        default:
+            return css_err_general;
+        }
+    }
+
+    return css_err_none;
+}
+
+/*
+ * PSYS Memory Device Ops
+ */
+css_err_t _psys_allocate_buffer(ia_cipr_buffer_t *buffer) {
+    if (!buffer)
+        return css_err_argument;
+
+    if (buffer->mem.cpu_ptr) {
+        icamera::LOGE("%s: already has an address!", __func__);
+        return css_err_argument;
+    }
+
+    buffer->mem.cpu_ptr = IA_CIPR_ALLOC_ALIGNED(buffer->mem.size,
+                                                IA_CIPR_PAGESIZE());
+    if (!buffer->mem.cpu_ptr)
+        return css_err_nomemory;
+
+    if (!(buffer->mem.flags & IA_CIPR_MEMORY_ALLOC_UNINITIALIZED))
+        memset(buffer->mem.cpu_ptr, 0, buffer->mem.size);
+
+    buffer->mem.flags &= ~IA_CIPR_MEMORY_ALLOCATE_CPU_PTR;
+    buffer->mem.flags |= IA_CIPR_MEMORY_CPU_PTR | IA_CIPR_MEMORY_ALLOCATED;
+    return css_err_none;
+}
+
+css_err_t _psys_migrate_buffer(ia_cipr_buffer_t *buffer) {
+    css_err_t ret;
+
+    if (!buffer || !buffer->dev_mem.dev_priv)
+        return css_err_argument;
+
+    /* handle allocate request implicitly */
+    if (buffer->mem.flags & IA_CIPR_MEMORY_ALLOCATE_CPU_PTR) {
+        ret = _psys_allocate_buffer(buffer);
+        if (ret != css_err_none)
+            return ret;
+    }
+
+    /* skip memory mapping of API buffer */
+    if (buffer->mem.flags & IA_CIPR_MEMORY_PSYS_API)
+        return css_err_none;
+
+    return ia_cipr_psys_register_buffer((ia_cipr_psys_context_t)buffer->dev_mem.dev_priv,
+                                        buffer);
+}
+
+css_err_t _psys_get_memory(ia_cipr_buffer_t *buffer, ia_cipr_memory_t *memory) {
+    ia_cipr_psys_context_t ctx = NULL;
+
+    if (!buffer || !memory)
+        return css_err_argument;
+
+    ctx = (ia_cipr_psys_context_t)buffer->dev_mem.dev_priv;
+    if (!ctx) {
+        icamera::LOGE("NULL context!", __func__);
+        return css_err_general;
+    }
+
+    if (!(ctx->init_flags & CIPR_PSYS_INIT_FLAG_DEBUG) &&
+            (buffer->mem.flags & IA_CIPR_MEMORY_HW_ONLY)) {
+        icamera::LOGE("%s: host cannot access HW only memory!", __func__);
+        return css_err_general;
+    }
+
+    if (buffer->mem.flags & IA_CIPR_MEMORY_HANDLE
+        && !(buffer->mem.flags & IA_CIPR_MEMORY_CPU_PTR)) {
+        /* TODO: fallback host access with mmap to buffer that currently has
+         *       only the dma handle */
+        icamera::LOGE("%s: fallback host address mapping not implemented!",
+                      __func__);
+        return css_err_general;
+    }
+
+    *memory = buffer->mem;
+
+    return css_err_none;
+}
+
+void _psys_destroy_buffer(ia_cipr_buffer_t *buffer) {
+    if (!buffer)
+        return;
+
+    if (buffer->dev_id)
+        ia_cipr_psys_unregister_buffer((ia_cipr_psys_context_t)buffer->dev_mem.dev_priv,
+                                       buffer);
+    _cipr_memory_common_destroy(buffer);
+}
+
+ia_cipr_psys_context_t ia_cipr_psys_create_context(ia_cipr_context_t cipr_ctx) {
+    struct _psys_context *ctx;
+    int errno_copy;
+    (void)cipr_ctx;
+    (void)errno_copy;  // not used in release builds, but ok
+
+    ctx = reinterpret_cast<_psys_context*>(IA_CIPR_MALLOC(sizeof(struct _psys_context)));
+    if (!ctx)
+        return NULL;
+
+    ctx->fd = open(DRIVER_NAME, 0, O_RDWR | O_NONBLOCK);
+    errno_copy = errno;
+
+    if (ctx->fd < 0) {
+        icamera::LOGE("%s: Failed to open PSYS device! open returned error: %s",
+                __func__,
+                strerror(errno_copy));
+        IA_CIPR_FREE(ctx);
+        return NULL;
+    }
+
+    ctx->mem_ops.allocate = _psys_allocate_buffer;
+    ctx->mem_ops.migrate = _psys_migrate_buffer;
+    ctx->mem_ops.get_memory = _psys_get_memory;
+    ctx->mem_ops.destroy = _psys_destroy_buffer;
+    ctx->mem_ops.dev_priv = ctx;
+    ctx->init_flags = CIPR_PSYS_INIT_FLAG_NONE;
+
+    icamera::LOG2("%s: init_flags:%x", __func__, ctx->init_flags);
+
+    return ctx;
+}
+
+void ia_cipr_psys_destroy_context(ia_cipr_psys_context_t ctx) {
+    int res, errno_copy;
+    (void)errno_copy;  // not used in release builds, but ok
+
+    if (!ctx)
+        return;
+
+    res = close(ctx->fd);
+    errno_copy = errno;
+    if (res < 0) {
+        icamera::LOGE("close returned error: %s", strerror(errno_copy));
+    }
+
+    IA_CIPR_FREE(ctx);
+}
+
+css_err_t
+ia_cipr_psys_get_capabilities(ia_cipr_psys_context_t ctx,
+                              ia_cipr_psys_capability_t *capability) {
+    struct ipu_psys_capability psys_capability;
+    css_err_t ret;
+
+    if (!ctx || !capability)
+        return css_err_argument;
+    CLEAR(psys_capability);
+
+    ret = _psys_ioctl(ctx->fd, static_cast<int>(IPU_IOC_QUERYCAP), &psys_capability);
+    if (ret != css_err_none) {
+        icamera::LOGV("%s: failed to retrieve capabilities", __func__);
+        return ret;
+    }
+
+    capability->version = psys_capability.version;
+    IA_CIPR_MEMCOPY(capability->driver,
+                    sizeof(capability->driver),
+                    psys_capability.driver,
+                    sizeof(psys_capability.driver));
+    IA_CIPR_MEMCOPY(capability->dev_model,
+                    sizeof(capability->dev_model),
+                    psys_capability.dev_model,
+                    sizeof(psys_capability.dev_model));
+    capability->program_group_count = psys_capability.pg_count;
+    return css_err_none;
+}
+
+css_err_t ia_cipr_psys_get_manifest(ia_cipr_psys_context_t ctx,
+                                   uint32_t index,
+                                   uint32_t *manifest_size,
+                                   void *manifest) {
+    struct ipu_psys_manifest pg_manifest;
+    css_err_t ret;
+
+    if (!ctx || !manifest_size)
+        return css_err_argument;
+
+    CLEAR(pg_manifest);
+    pg_manifest.index = index;
+    pg_manifest.size = 0;
+    pg_manifest.manifest = manifest;
+
+    ret = _psys_ioctl(ctx->fd, static_cast<int>(IPU_IOC_GET_MANIFEST), &pg_manifest);
+    if (ret != css_err_none) {
+        icamera::LOGV("%s: failed to retrieve manifest with index %d",
+                    __func__,
+                    index);
+        return ret;
+    }
+
+    *manifest_size = pg_manifest.size;
+    return css_err_none;
+}
+
+ia_cipr_memory_device_t*
+ia_cipr_psys_get_memory_device(ia_cipr_psys_context_t ctx) {
+    if (!ctx)
+        return NULL;
+
+    return &ctx->mem_ops;
+}
+
+css_err_t
+ia_cipr_psys_register_buffer(ia_cipr_psys_context_t ctx,
+                             ia_cipr_buffer_t *buffer) {
+    struct ipu_psys_buffer *ioc_buffer;
+    css_err_t res;
+
+    if (!ctx || !buffer)
+        return css_err_argument;
+
+    if (buffer->mem.flags & IA_CIPR_MEMORY_MIGRATED) {
+        icamera::LOGE("Buffer already migrated with device (%d)",
+                      buffer->dev_id);
+        return css_err_argument;
+    }
+
+    ioc_buffer = reinterpret_cast<ipu_psys_buffer*>(IA_CIPR_CALLOC(1, sizeof(*ioc_buffer)));
+    if (!ioc_buffer) {
+        icamera::LOGE("could not create psys buffer");
+        return css_err_nomemory;
+    }
+    /* TODO: - handle late allocation of CPU_PTR when requested
+     *       - handle copy from user
+     *       - validation
+     */
+    ioc_buffer->len = buffer->mem.size;
+    if (!(ctx->init_flags & CIPR_PSYS_INIT_FLAG_DEBUG) &&
+         (buffer->mem.flags & IA_CIPR_MEMORY_NO_FLUSH ||
+           (buffer->mem.flags & IA_CIPR_MEMORY_CPU_PTR &&
+            buffer->mem.flags & IA_CIPR_MEMORY_HW_ONLY))) {
+        ioc_buffer->flags |= IPU_BUFFER_FLAG_NO_FLUSH;
+    }
+    if (buffer->mem.flags & IA_CIPR_MEMORY_CPU_PTR) {
+        /* Create dma-buffer for host pointer */
+        ioc_buffer->base.userptr = buffer->mem.cpu_ptr;
+        ioc_buffer->flags |= IPU_BUFFER_FLAG_USERPTR;
+        res = _psys_ioctl(ctx->fd,
+                          static_cast<int>(IPU_IOC_GETBUF),
+                          ioc_buffer);
+        if (res != css_err_none) {
+            IA_CIPR_FREE(ioc_buffer);
+            return res;
+        }
+
+        /* Sanity checks for specified IOC GETBUF behaviour
+         * Note: Failure includes potential dma_buf leak, check omitted
+         */
+        if (!(ioc_buffer->flags & IPU_BUFFER_FLAG_DMA_HANDLE)) {
+            icamera::LOGE("CIPR: IOC_GETBUF succeed but did not return dma handle");
+            IA_CIPR_FREE(ioc_buffer);
+            return css_err_internal;
+        } else if (ioc_buffer->flags & IPU_BUFFER_FLAG_USERPTR) {
+            icamera::LOGE("CIPR: IOC_GETBUF succeed but did not consume the userptr flag");
+            IA_CIPR_FREE(ioc_buffer);
+            return css_err_internal;
+        }
+    } else if (buffer->mem.flags & IA_CIPR_MEMORY_HANDLE) {
+        /* Implementation defined as dma-buffer fd */
+        ioc_buffer->base.fd = static_cast<int>(buffer->mem.handle);
+        ioc_buffer->flags |= IPU_BUFFER_FLAG_DMA_HANDLE;
+    }
+
+    /* map pages with ISP IOMMU using dma-buffer handle */
+    res = _psys_ioctl(ctx->fd,
+                      static_cast<int>(IPU_IOC_MAPBUF),
+                      reinterpret_cast<void*>((intptr_t)ioc_buffer->base.fd));
+    if (res != css_err_none) {
+        IA_CIPR_FREE(ioc_buffer);
+        return res;
+    }
+
+    buffer->dev_id = CIPR_DEVICE_PSYS;
+    buffer->dev_priv = (uintptr_t)ioc_buffer;
+    buffer->mem.flags |= IA_CIPR_MEMORY_MIGRATED;
+
+    icamera::LOG2("%s: registered %p -> fd %d size:%u offset:%u bytes_used:%u",
+                  __func__, buffer->mem.cpu_ptr, ioc_buffer->base.fd,
+                  ioc_buffer->len, ioc_buffer->data_offset, ioc_buffer->bytes_used);
+
+    return res;
+}
+
+css_err_t
+ia_cipr_psys_unregister_buffer(ia_cipr_psys_context_t ctx,
+                               ia_cipr_buffer_t *buffer) {
+    struct ipu_psys_buffer *ioc_buffer;
+    css_err_t res;
+
+    if (!ctx || !buffer)
+        return css_err_argument;
+
+    if (buffer->dev_priv == 0) {
+        icamera::LOGE("%s: buffer already unregistered!", __func__);
+        return css_err_general;
+    }
+
+    ioc_buffer = (struct ipu_psys_buffer *)(uintptr_t)buffer->dev_priv;
+    if (!(ioc_buffer->flags & IPU_BUFFER_FLAG_DMA_HANDLE)) {
+        icamera::LOGE("Wrong flag!", __func__);
+        return css_err_general;
+    }
+
+    /* Unmap buffer */
+    res = _psys_ioctl(ctx->fd,
+                        static_cast<int>(IPU_IOC_UNMAPBUF),
+                        reinterpret_cast<void*>((intptr_t)ioc_buffer->base.fd));
+    if (res != css_err_none) {
+        icamera::LOGD("%s: cannot unmap buffer fd %d, possibly already unmapped",
+                  __func__, ioc_buffer->base.fd);
+        // keep going.
+    }
+
+    /* close buffer fd */
+    if (buffer->mem.flags & IA_CIPR_MEMORY_CPU_PTR) {
+        res = _psys_close(ioc_buffer->base.fd);
+        if (res != css_err_none)
+            return res;
+    }
+
+    IA_CIPR_FREE(ioc_buffer);
+
+    buffer->dev_id = 0;
+    buffer->dev_priv = 0;
+
+    return res;
+}
+
+css_err_t ia_cipr_psys_queue_command(ia_cipr_psys_context_t ctx,
+                                    ia_cipr_psys_command_t cmd) {
+    if (!ctx || !cmd)
+        return css_err_argument;
+
+    return _psys_ioctl(ctx->fd, static_cast<int>(IPU_IOC_QCMD), cmd);
+}
+
+css_err_t ia_cipr_psys_cancel_command(ia_cipr_psys_context_t ctx,
+                                     ia_cipr_psys_command_t cmd) {
+    if (!ctx || !cmd)
+        return css_err_argument;
+
+    return _psys_ioctl(ctx->fd, static_cast<int>(IPU_IOC_CMD_CANCEL), cmd);
+}
+
+css_err_t ia_cipr_psys_wait_for_event(ia_cipr_psys_context_t ctx,
+                                     ia_cipr_psys_event_t event) {
+    int res, errno_copy;
+    struct pollfd fds;
+    (void)errno_copy;  // not used in release builds, but ok
+
+    if (!ctx || !event)
+        return css_err_argument;
+
+    fds.fd = ctx->fd;
+    fds.events = POLLIN | POLLHUP | POLLERR;
+    /* Wait for events */
+    res = poll(&fds, 1, event->timeout);
+    errno_copy = errno;
+    /* Poll return value 1 is success */
+    if (res == 1) {
+        return _psys_ioctl(ctx->fd, static_cast<int>(IPU_IOC_DQEVENT), event);
+    } else if (res == 0) {
+        return css_err_timeout;
+    } else {
+        icamera::LOGE("poll returned error: %s", strerror(errno_copy));
+        return css_err_general;
+    }
+}
+
+ia_cipr_psys_event_t
+ia_cipr_psys_create_event(ia_cipr_psys_event_config_t *cfg) {
+    /* Create psys event object with given cfg */
+    struct _psys_event *event;
+
+    if (!cfg)
+        return NULL;
+
+    event = reinterpret_cast<_psys_event*>(IA_CIPR_CALLOC(1, sizeof(*event)));
+    if (!event) {
+        icamera::LOGE("could not allocate event");
+        return NULL;
+    }
+    if (cfg->id != 0) {
+        icamera::LOG2("ID-field of CIPR event deprecated!");
+    }
+    event->event.type = cfg->type;
+    event->event.user_token = cfg->command_token;
+    event->event.issue_id = cfg->command_issue_id;
+    event->event.buffer_idx = 0;
+    event->event.error = cfg->error;
+    event->timeout = cfg->timeout;
+    /* Return handle for the object */
+    return event;
+}
+
+void ia_cipr_psys_destroy_event(ia_cipr_psys_event_t event) {
+    /* Destroy event object */
+    IA_CIPR_FREE(event);
+}
+
+css_err_t
+ia_cipr_psys_get_event_config(ia_cipr_psys_event_t event,
+                              ia_cipr_psys_event_config_t *cfg) {
+    if (!event || !cfg)
+        return css_err_argument;
+
+    /* Write configs from event object to given cfg */
+    cfg->type = event->event.type;
+    cfg->command_token = event->event.user_token;
+    cfg->command_issue_id = event->event.issue_id;
+    cfg->buffer_handover_bitmap = UINT64_MAX; /* Not used */
+    cfg->error = event->event.error;
+    cfg->timeout = event->timeout;
+    cfg->id = 0;
+
+    return css_err_none;
+}
+
+css_err_t
+ia_cipr_psys_set_event_config(ia_cipr_psys_event_t event,
+                              const ia_cipr_psys_event_config_t *cfg) {
+    if (!event || !cfg)
+        return css_err_argument;
+
+    /* Update configuration from cfg to event object */
+
+    /* Note: Linux PSYS Driver DQEVENT IOCTL does not use any of the fields as
+     *       input */
+    event->event.type = cfg->type;
+    event->event.user_token = cfg->command_token;
+    event->event.issue_id = cfg->command_issue_id;
+    event->event.buffer_idx = 0;
+    event->event.error = cfg->error;
+
+    /* Used as user configurable device poll timeout */
+    event->timeout = cfg->timeout;
+
+    return css_err_none;
+}
+
+ia_cipr_psys_command_t
+ia_cipr_psys_create_command(ia_cipr_psys_command_config_t *cfg) {
+    /* Create psys command object with given cfg */
+    struct _psys_command *cmd;
+
+    if (!cfg)
+        return NULL;
+
+    cmd = reinterpret_cast<_psys_command*>(IA_CIPR_CALLOC(1, sizeof(*cmd)));
+    if (!cmd) {
+        icamera::LOGE("could not allocate cmd");
+        return NULL;
+    }
+
+    if (cfg->bufcount > 0) {
+        cmd->ioc_cmd.bufcount = cfg->bufcount;
+        /* Allocate memory for an array of DMA-BUF handles */
+        cmd->ioc_cmd.buffers = (struct ipu_psys_buffer *)IA_CIPR_CALLOC(
+                                cfg->bufcount,
+                                sizeof(struct ipu_psys_buffer));
+        if (!cmd->ioc_cmd.buffers) {
+            icamera::LOGE("Could not allocate DMA-BUF handle array");
+            IA_CIPR_FREE(cmd);
+            return NULL;
+        }
+
+        /* Allocate memory for cipr buffers that user is expected to provide */
+        cmd->user_buffers =
+            reinterpret_cast<ia_cipr_buffer_t **>(IA_CIPR_CALLOC(cfg->bufcount,
+                                                                 sizeof(ia_cipr_buffer_t*)));
+        if (!cmd->user_buffers) {
+            icamera::LOGE("Could not allocate DMA-BUF handle array");
+            IA_CIPR_FREE(cmd->ioc_cmd.buffers);
+            IA_CIPR_FREE(cmd);
+            return NULL;
+        }
+
+        cmd->allocated_buffers = cfg->bufcount;
+    }
+
+    /* Return handle for the object */
+    return (struct _psys_command*)(cmd);
+}
+
+void ia_cipr_psys_destroy_command(ia_cipr_psys_command_t cmd) {
+    /* Destroy psys command object */
+
+    if (!cmd)
+        return;
+
+    IA_CIPR_FREE(cmd->ioc_cmd.buffers);
+    IA_CIPR_FREE(cmd->user_buffers);
+    IA_CIPR_FREE(cmd);
+}
+
+css_err_t
+ia_cipr_psys_get_command_config(ia_cipr_psys_command_t cmd,
+                                ia_cipr_psys_command_config_t *cfg) {
+    if (!cmd || !cfg)
+        return css_err_argument;
+
+    /* Update configs and buffer array for user from command object */
+    cfg->token = cmd->ioc_cmd.user_token;
+    cfg->issue_id = cmd->ioc_cmd.issue_id;
+    cfg->priority = cmd->ioc_cmd.priority;
+    cfg->psys_frequency = cmd->ioc_cmd.min_psys_freq;
+    cfg->pg = cmd->pg;
+    cfg->ext_buf = cmd->ext_buf;
+    cfg->pg_manifest_buf = cmd->pg_manifest_buf;
+    cfg->id = 0;
+
+    /* fields validated at set command */
+    cfg->bufcount = cmd->allocated_buffers;
+    cfg->buffers = cmd->user_buffers;
+
+    return css_err_none;
+}
+
+css_err_t
+ia_cipr_psys_set_command_config(ia_cipr_psys_command_t cmd,
+                                const ia_cipr_psys_command_config_t *cfg) {
+    ia_cipr_buffer_t *current;
+    ia_cipr_memory_t memory;
+    unsigned int i;
+    css_err_t ret;
+
+    if (!cmd || !cfg) {
+        icamera::LOGE("Invalid argument!");
+        return css_err_argument;
+    }
+
+    if (cmd->allocated_buffers < cfg->bufcount) {
+        icamera::LOGE("Config bufcount cannot be higher than in the command!");
+        return css_err_argument;
+    }
+
+    if (cfg->buffers && cmd->user_buffers != cfg->buffers) {
+        icamera::LOGE("Buffer array in command config cannot be altered!");
+        return css_err_argument;
+    }
+
+    if (!cfg->buffers && cmd->ioc_cmd.buffers) {
+        icamera::LOGE("To nullify buffers, create command with bufcount 0");
+        return css_err_argument;
+    }
+
+    /* update command configuration into IOC datatype */
+    /** \todo set_command_config should not use get_memory() primitive, but
+     *        just reuse the pre-mapped handle.
+     *  \todo validate that buffers belong to PSYS device (valid dev_priv)
+     */
+    ret = ia_cipr_buffer_get_memory(cfg->pg_manifest_buf, &memory);
+    if (ret != css_err_none)
+        return ret;
+    cmd->ioc_cmd.pg_manifest = memory.cpu_ptr;
+    cmd->ioc_cmd.pg_manifest_size = memory.size;
+    cmd->pg_manifest_buf = cfg->pg_manifest_buf;
+
+    ret = ia_cipr_buffer_get_memory(cfg->ext_buf, &memory);
+    if (ret != css_err_none) {
+        if (cfg->pg_params_buf != NULL) {
+            icamera::LOGW("pg_params_buf-field of CIPR command deprecated!");
+            ret = ia_cipr_buffer_get_memory(cfg->pg_params_buf, &memory);
+            if (ret != css_err_none) {
+                return ret;
+            }
+        }
+    }
+
+    if (memory.flags & IA_CIPR_MEMORY_PSYS_API) {
+        ia_cipr_process_group_command_t * ppg_command_ext =
+                            reinterpret_cast<ia_cipr_process_group_command_t*>(memory.cpu_ptr);
+        if (ppg_command_ext->header.size != memory.size
+            || ppg_command_ext->header.offset
+               != sizeof(ia_cipr_psys_cmd_ext_header_t)
+            || (ppg_command_ext->header.version != psys_command_ext_ppg_0
+               && ppg_command_ext->header.version != psys_command_ext_ppg_1)) {
+            icamera::LOGE("Invalid command extension buffer received! (%p)",
+                          cfg->ext_buf);
+            return css_err_argument;
+        }
+
+        if (ppg_command_ext->header.version == psys_command_ext_ppg_1) {
+            IA_CIPR_MEMCOPY(&(cmd->ioc_cmd.kernel_enable_bitmap),
+                            sizeof(cmd->ioc_cmd.kernel_enable_bitmap),
+                            ppg_command_ext->dynamic_kernel_bitmap,
+                            sizeof(ppg_command_ext->dynamic_kernel_bitmap));
+        }
+
+        /** \todo FW defined frame_counter is uint8_t */
+        cmd->ioc_cmd.frame_counter = (uint32_t) ppg_command_ext->frame_counter;
+        /** \todo queueing to late-binding queue requires UAPI change for
+         *        queue-id
+         *  \todo control of events and interrupts requires UAPI changes
+         */
+    } else {
+        cmd->pg_params = memory.cpu_ptr;
+        cmd->pg_params_size = memory.size;
+    }
+    cmd->ext_buf = cfg->ext_buf;
+    if (cfg->id != 0) {
+        icamera::LOG2("ID-field of CIPR command deprecated!");
+    }
+    cmd->ioc_cmd.user_token = cfg->token;
+    cmd->ioc_cmd.issue_id = cfg->issue_id;
+    cmd->ioc_cmd.priority = cfg->priority;
+    cmd->ioc_cmd.min_psys_freq = cfg->psys_frequency;
+    cmd->ioc_cmd.bufcount = cfg->bufcount;
+    cmd->pg = cfg->pg;
+    if (cfg->pg && cfg->pg->dev_priv) {
+        /** \todo the fd should be in memory.handle */
+        if (!(((struct ipu_psys_buffer *)(uintptr_t)cfg->pg->dev_priv)->flags &
+                        IPU_BUFFER_FLAG_DMA_HANDLE)) {
+            icamera::LOGE("Wrong flag!", __func__);
+            return css_err_general;
+        }
+        cmd->ioc_cmd.pg = ((struct ipu_psys_buffer *)
+                           (uintptr_t)cfg->pg->dev_priv)->base.fd;
+    }
+
+    if (!cmd->ioc_cmd.buffers)
+        return css_err_none;
+
+    for (i = 0; i < cfg->bufcount; i++) {
+        current = cfg->buffers[i];
+        if (!current) {
+            memset(&cmd->ioc_cmd.buffers[i], 0,
+                   sizeof(cmd->ioc_cmd.buffers[i]));
+            continue;
+        } else if (!current->dev_priv && ia_cipr_buffer_is_region(current)) {
+            current = ia_cipr_buffer_get_parent(current);
+            if (!current) {
+                icamera::LOGE("Cannot find the parent of buffer:%p", cfg->buffers[i]);
+                return css_err_argument;
+            }
+        }
+        if (!current->dev_priv || !(current->mem.flags & IA_CIPR_MEMORY_MIGRATED)) {
+            icamera::LOGE("Cannot queue buffer object %p that is not migrated with the device!",
+                  current);
+            return css_err_argument;
+        }
+        /* dma-buf handle from buffer object */
+        cmd->ioc_cmd.buffers[i] = *(struct ipu_psys_buffer *)
+                                   (uintptr_t)current->dev_priv;
+        /* offset and size from region object */
+        cmd->ioc_cmd.buffers[i].data_offset = current->offset;
+        cmd->ioc_cmd.buffers[i].bytes_used = current->mem.size;
+    }
+
+    return css_err_none;
+}
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/assert_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/assert_support.h
new file mode 100644
index 000000000000..aa1724c75c1e
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/assert_support.h
@@ -0,0 +1,210 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ASSERT_SUPPORT_H
+#define __ASSERT_SUPPORT_H
+
+/* This file provides support for run-time assertions
+ * and compile-time assertions.
+ *
+ * Run-time asstions are provided via the following syntax:
+ *     assert(condition)
+ * Run-time assertions are disabled using the NDEBUG flag.
+ *
+ * Compile time assertions are provided via the following syntax:
+ *     COMPILATION_ERROR_IF(condition);
+ * A compile-time assertion will fail to compile if the condition is false.
+ * The condition must be constant, such that it can be evaluated
+ * at compile time.
+ *
+ * OP___assert is deprecated.
+ */
+
+#define IA_CSS_ASSERT(expr) assert(expr)
+
+#ifdef __KLOCWORK__
+/* Klocwork does not see that assert will lead to abortion
+ * as there is no good way to tell this to KW and the code
+ * should not depend on assert to function (actually the assert
+ * could be disabled in a release build) it was decided to
+ * disable the assert for KW scans (by defining NDEBUG)
+ * see also:
+ * http://www.klocwork.com/products/documentation/current/
+ * Tuning_C/C%2B%2B_analysis#Assertions
+ */
+#define NDEBUG
+#endif /* __KLOCWORK__ */
+
+/**
+ * The following macro can help to test the size of a struct at compile
+ * time rather than at run-time. It does not work for all compilers; see
+ * below.
+ *
+ * Depending on the value of 'condition', the following macro is expanded to:
+ * - condition==true:
+ *     an expression containing an array declaration with negative size,
+ *     usually resulting in a compilation error
+ * - condition==false:
+ *     (void) 1; // C statement with no effect
+ *
+ * example:
+ *  COMPILATION_ERROR_IF( sizeof(struct host_sp_queues) !=
+ *            SIZE_OF_HOST_SP_QUEUES_STRUCT);
+ *
+ * verify that the macro indeed triggers a compilation error with your compiler:
+ *  COMPILATION_ERROR_IF( sizeof(struct host_sp_queues) !=
+ *            (sizeof(struct host_sp_queues)+1) );
+ *
+ * Not all compilers will trigger an error with this macro;
+ * use a search engine to search for BUILD_BUG_ON to find other methods.
+ */
+#ifdef __XTENSA_FW__
+
+#include "assert_support_xtensa.h"
+
+#else
+
+#define COMPILATION_ERROR_IF(condition) \
+((void)sizeof(char[1 - 2*!!(condition)]))
+
+#endif
+/* Compile time assertion */
+#ifndef CT_ASSERT
+#define CT_ASSERT(cnd) ((void)sizeof(char[(cnd)?1 :  -1]))
+#endif /* CT_ASSERT */
+
+#ifdef NDEBUG
+
+#define assert(cnd) ((void)0)
+
+#else
+
+#include "storage_class.h"
+
+#if defined(_MSC_VER)
+#ifdef _KERNEL_MODE
+/* Windows kernel mode compilation */
+#include <ntddk.h>
+#define assert(cnd) ASSERT(cnd)
+#else
+/* Windows usermode compilation */
+#include <assert.h>
+#endif
+
+#elif defined(__XTENSA_FW__)
+/* assert added in assert_support_xtensa*/
+#elif defined(__HIVECC)
+
+/*
+ * target: assert disabled
+ * sched: assert enabled only when SCHED_DEBUG is defined
+ * unsched: assert enabled
+ */
+#if defined(HRT_HW)
+#define assert(cnd) ((void)0)
+#elif defined(HRT_SCHED) && !defined(DEBUG_SCHED)
+#define assert(cnd) ((void)0)
+#elif defined(PIPE_GENERATION)
+#define assert(cnd) ((void)0)
+#else
+#include <hive/support.h>
+#define assert(cnd) OP___csim_assert(cnd)
+#endif
+
+#elif defined(__KERNEL__)
+#include <linux/bug.h>
+
+#ifndef KERNEL_ASSERT_TO_BUG
+#ifndef KERNEL_ASSERT_TO_BUG_ON
+#ifndef KERNEL_ASSERT_TO_WARN_ON
+#ifndef KERNEL_ASSERT_TO_WARN_ON_INF_LOOP
+#ifndef KERNEL_ASSERT_UNDEFINED
+/* Default */
+#define KERNEL_ASSERT_TO_BUG
+#endif /*KERNEL_ASSERT_UNDEFINED*/
+#endif /*KERNEL_ASSERT_TO_WARN_ON_INF_LOOP*/
+#endif /*KERNEL_ASSERT_TO_WARN_ON*/
+#endif /*KERNEL_ASSERT_TO_BUG_ON*/
+#endif /*KERNEL_ASSERT_TO_BUG*/
+
+#ifdef KERNEL_ASSERT_TO_BUG
+/* TODO: it would be cleaner to use this:
+ * #define assert(cnd) BUG_ON(cnd)
+ * but that causes many compiler warnings (==errors) under Android
+ * because it seems that the BUG_ON() macro is not seen as a check by
+ * gcc like the BUG() macro is. */
+#define assert(cnd)                            \
+    do {                                \
+        if (!(cnd)) {                        \
+            BUG();                        \
+        }                            \
+    } while (0)
+#endif /*KERNEL_ASSERT_TO_BUG*/
+
+#ifdef KERNEL_ASSERT_TO_BUG_ON
+#define assert(cnd) BUG_ON(!(cnd))
+#endif /*KERNEL_ASSERT_TO_BUG_ON*/
+
+#ifdef KERNEL_ASSERT_TO_WARN_ON
+#define assert(cnd) WARN_ON(!(cnd))
+#endif /*KERNEL_ASSERT_TO_WARN_ON*/
+
+#ifdef KERNEL_ASSERT_TO_WARN_ON_INF_LOOP
+#define assert(cnd)                            \
+    do {                                \
+        int not_cnd = !(cnd);                    \
+        WARN_ON(not_cnd);                    \
+        if (not_cnd) {                        \
+            for (;;) {                    \
+            }                        \
+        }                            \
+    } while (0)
+#endif /*KERNEL_ASSERT_TO_WARN_ON_INF_LOOP*/
+
+#ifdef KERNEL_ASSERT_UNDEFINED
+#include KERNEL_ASSERT_DEFINITION_FILESTRING
+#endif /*KERNEL_ASSERT_UNDEFINED*/
+
+#elif defined(__FIST__) || defined(__GNUC__)
+
+#include "assert.h"
+
+#else /* default is for unknown environments */
+#define assert(cnd) ((void)0)
+#endif
+
+#endif /* NDEBUG */
+#ifndef PIPE_GENERATION
+/* Deprecated OP___assert, this is still used in ~1000 places
+ * in the code. This will be removed over time.
+ * The implementation for the pipe generation tool is in see support.isp.h */
+#define OP___assert(cnd) assert(cnd)
+
+#ifdef C_RUN
+#define compile_time_assert(cond) OP___assert(cond)
+#else
+#include "storage_class.h"
+extern void _compile_time_assert(void);
+STORAGE_CLASS_INLINE void compile_time_assert(unsigned cond)
+{
+    /* Call undefined function if cond is false */
+    if (!cond)
+        _compile_time_assert();
+}
+#endif
+#endif /* PIPE_GENERATION */
+
+#endif /* __ASSERT_SUPPORT_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/cpu_mem_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/cpu_mem_support.h
new file mode 100644
index 000000000000..98fd104f05a8
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/cpu_mem_support.h
@@ -0,0 +1,239 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CPU_MEM_SUPPORT_H
+#define __CPU_MEM_SUPPORT_H
+
+#include "storage_class.h"
+#include "assert_support.h"
+#include "type_support.h"
+
+STORAGE_CLASS_INLINE void*
+ia_css_cpu_mem_copy(void *dst, const void *src, unsigned int size)
+{
+    /* memcpy cannot be used in in Windows (function is not allowed),
+     * and the safer function memcpy_s is not available on other platforms.
+     * Because usage of ia_css_cpu_mem_copy is minimal, we implement it here in an easy,
+     * but sub-optimal way.
+     */
+    unsigned int i;
+
+    assert(dst != NULL && src != NULL);
+
+    if (!(dst != NULL && src != NULL)) {
+        return NULL;
+    }
+    for (i = 0; i < size; i++) {
+        ((char *)dst)[i] = ((char *)src)[i];
+    }
+    return dst;
+}
+
+#if defined(__KERNEL__)
+
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#include <asm/cacheflush.h>
+
+/* TODO: remove, workaround for issue in hrt file ibuf_ctrl_2600_config.c
+ * error checking code added to SDK that uses calls to exit function
+ */
+#define exit(a) return
+
+STORAGE_CLASS_INLINE void*
+ia_css_cpu_mem_alloc(unsigned int size)
+{
+    return kmalloc(size, GFP_KERNEL);
+}
+
+STORAGE_CLASS_INLINE void*
+ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
+{
+    return ia_css_cpu_mem_alloc(size); /* todo: align to page size */
+}
+
+STORAGE_CLASS_INLINE void
+ia_css_cpu_mem_protect(void *ptr, unsigned int size, int prot)
+{
+    /* nothing here yet */
+}
+
+STORAGE_CLASS_INLINE void*
+ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
+{
+    return memset(dst, 0, size); /* available in kernel in linux/string.h */
+}
+
+STORAGE_CLASS_INLINE void
+ia_css_cpu_mem_free(void *ptr)
+{
+    kfree(ptr);
+}
+
+STORAGE_CLASS_INLINE void
+ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
+{
+    /* parameter check here */
+    if (ptr == NULL)
+        return;
+
+    clflush_cache_range(ptr, size);
+}
+
+STORAGE_CLASS_INLINE void
+ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
+{
+    /* for now same as flush */
+    ia_css_cpu_mem_cache_flush(ptr, size);
+}
+
+#elif defined(_MSC_VER)
+
+#include <stdlib.h>
+#include <string.h>
+#include <stddef.h>
+
+extern void *hrt_malloc(size_t bytes, int zero_mem);
+extern void *hrt_free(void *ptr);
+extern void hrt_mem_cache_flush(void *ptr, unsigned int size);
+extern void hrt_mem_cache_invalidate(void *ptr, unsigned int size);
+
+#define malloc(a)    hrt_malloc(a, 1)
+#define free(a)        hrt_free(a)
+
+#define CSS_PAGE_SIZE    (1<<12)
+
+STORAGE_CLASS_INLINE void*
+ia_css_cpu_mem_alloc(unsigned int size)
+{
+    return malloc(size);
+}
+
+STORAGE_CLASS_INLINE void*
+ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
+{
+    unsigned int buffer_size = size;
+
+    /* Currently hrt_malloc calls Windows ExAllocatePoolWithTag() routine
+     * to request system memory. If the number of bytes is equal or bigger
+     * than the page size, then the returned address is page aligned,
+     * but if it's smaller it's not necessarily page-aligned We agreed
+     * with Windows team that we allocate a full page
+     * if it's less than page size
+    */
+    if (buffer_size < CSS_PAGE_SIZE)
+        buffer_size = CSS_PAGE_SIZE;
+
+    return ia_css_cpu_mem_alloc(buffer_size);
+}
+
+STORAGE_CLASS_INLINE void*
+ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
+{
+    return memset(dst, 0, size);
+}
+
+STORAGE_CLASS_INLINE void
+ia_css_cpu_mem_free(void *ptr)
+{
+    free(ptr);
+}
+
+STORAGE_CLASS_INLINE void
+ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
+{
+#ifdef _KERNEL_MODE
+    hrt_mem_cache_flush(ptr, size);
+#else
+    (void)ptr;
+    (void)size;
+#endif
+}
+
+STORAGE_CLASS_INLINE void
+ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
+{
+#ifdef _KERNEL_MODE
+    hrt_mem_cache_invalidate(ptr, size);
+#else
+    (void)ptr;
+    (void)size;
+#endif
+}
+
+#else
+
+#include <stdlib.h>
+#include <string.h>
+#include <stddef.h>
+/* Needed for the MPROTECT */
+#include <unistd.h>
+#include <sys/types.h>
+
+/* For host only, not fw */
+#ifndef __XTENSA_FW__
+#include <sys/mman.h>
+#include <malloc.h>
+#endif
+
+STORAGE_CLASS_INLINE void*
+ia_css_cpu_mem_alloc(unsigned int size)
+{
+    return malloc(size);
+}
+
+#ifdef _SC_PAGE_SIZE
+STORAGE_CLASS_INLINE void*
+ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
+{
+    int pagesize;
+
+    pagesize = sysconf(_SC_PAGE_SIZE);
+    return memalign(pagesize, size);
+}
+#endif /*_SC_PAGE_SIZE*/
+
+STORAGE_CLASS_INLINE void*
+ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
+{
+    return memset(dst, 0, size);
+}
+
+STORAGE_CLASS_INLINE void
+ia_css_cpu_mem_free(void *ptr)
+{
+    free(ptr);
+}
+
+STORAGE_CLASS_INLINE void
+ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
+{
+    /* not needed in simulation */
+    (void)ptr;
+    (void)size;
+}
+
+STORAGE_CLASS_INLINE void
+ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
+{
+    /* not needed in simulation */
+    (void)ptr;
+    (void)size;
+}
+
+#endif
+#endif /* __CPU_MEM_SUPPORT_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/error_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/error_support.h
new file mode 100644
index 000000000000..54d3496d6635
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/error_support.h
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ERROR_SUPPORT_H
+#define __ERROR_SUPPORT_H
+
+#if defined(__KERNEL__)
+#include <linux/errno.h>
+#else
+#include <errno.h>
+#endif
+#include <assert_support.h>
+
+/* OS-independent definition of IA_CSS errno values */
+/* #define IA_CSS_EINVAL 1 */
+/* #define IA_CSS_EFAULT 2 */
+
+#ifdef __HIVECC
+#define ERR_EMBEDDED 1
+#else
+#define ERR_EMBEDDED 0
+#endif
+
+#if ERR_EMBEDDED
+#define DECLARE_ERRVAL
+#else
+#define DECLARE_ERRVAL \
+    int _errval = 0;
+#endif
+
+/* Use "owl" in while to prevent compiler warnings in Windows */
+#define ALWAYS_FALSE ((void)0, 0)
+
+#define verifret(cond, error_type) \
+do {                               \
+    if (!(cond)) {             \
+        return error_type; \
+    }                          \
+} while (ALWAYS_FALSE)
+
+#define verifjmp(cond, error_tag)    \
+do {                                \
+    if (!(cond)) {                   \
+        goto error_tag;             \
+    }                               \
+} while (ALWAYS_FALSE)
+
+#define verifexit(cond)  \
+do {                               \
+    if (!(cond)) {              \
+        goto EXIT;         \
+    }                          \
+} while (ALWAYS_FALSE)
+
+#if ERR_EMBEDDED
+#define verifexitval(cond, error_tag) \
+do {                               \
+    assert(cond);           \
+} while (ALWAYS_FALSE)
+#else
+#define verifexitval(cond, error_tag) \
+do {                               \
+    if (!(cond)) {              \
+        _errval = (error_tag); \
+        goto EXIT;         \
+    }                          \
+} while (ALWAYS_FALSE)
+#endif
+
+#if ERR_EMBEDDED
+#define haserror(error_tag) (0)
+#else
+#define haserror(error_tag) \
+    (_errval == (error_tag))
+#endif
+
+#if ERR_EMBEDDED
+#define noerror() (1)
+#else
+#define noerror() \
+    (_errval == 0)
+#endif
+
+#define verifjmpexit(cond)         \
+do {                               \
+    if (!(cond)) {             \
+        goto EXIT;         \
+    }                          \
+} while (ALWAYS_FALSE)
+
+#define verifjmpexitsetretval(cond, retval)         \
+do {                               \
+    if (!(cond)) {              \
+        retval = -1;       \
+        goto EXIT;         \
+    }                          \
+} while (ALWAYS_FALSE)
+
+#endif /* __ERROR_SUPPORT_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/frame_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/frame_support.h
new file mode 100644
index 000000000000..b5120abe45fb
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/frame_support.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __FRAME_SUPPORT_H
+#define __FRAME_SUPPORT_H
+
+#define INTERLEAVED_FRAME_TYPE_NUM_PLANES    1
+#define YUV_SEMI_PLANAR_FRAME_TYPE_NUM_PLANES    2
+#define YUV_PLANAR_FRAME_TYPE_NUM_PLANES    3
+#define BAYER_PLANAR_FRAME_TYPE_NUM_PLANES    4
+
+/* genpipe doesn't support B = A in enum definition */
+#ifndef PIPE_GENERATION
+
+enum image_iterator_planes {
+    IMG_ITER_PLANE_0 = 0,
+    IMG_ITER_PLANE_1,
+    IMG_ITER_PLANE_2,
+    IMG_ITER_PLANE_3,
+    IMG_ITER_MAX_NUM_PLANES
+};
+
+enum interleaved_frames_types_planes {
+    INTERLEAVED_FRAME_MAIN_PLANE = 0,
+    INTERLEAVED_FRAME_NUM_PLANES
+};
+
+enum yuv_semi_planar_frame_types_planes {
+    YUV_SEMI_PLANAR_FRAME_Y_PLANE = 0,
+    YUV_SEMI_PLANAR_FRAME_UV_PLANE,
+    YUV_SEMI_PLANAR_FRAME_NUM_PLANES
+};
+
+enum yuv_planar_frame_types_planes {
+    YUV_PLANAR_FRAME_Y_PLANE = 0,
+    YUV_PLANAR_FRAME_U_PLANE,
+    YUV_PLANAR_FRAME_V_PLANE,
+    YUV_PLANAR_FRAME_NUM_PLANES
+};
+
+enum bayer_planar_frame_types_planes {
+    BAYER_PLANAR_FRAME_GR_PLANE = 0,
+    BAYER_PLANAR_FRAME_R_PLANE,
+    BAYER_PLANAR_FRAME_B_PLANE,
+    BAYER_PLANAR_FRAME_GB_PLANE,
+    BAYER_PLANAR_FRAME_NUM_PLANES
+};
+
+#endif /* PIPE_GENERATION */
+#endif    /* __FRAME_SUPPORT_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_base_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_base_types.h
new file mode 100644
index 000000000000..8a8af09ea279
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_base_types.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_BASE_TYPES_H
+#define __IA_CSS_BASE_TYPES_H
+
+#include "type_support.h"
+
+#define VIED_VADDRESS_BITS                32
+
+#define DEVICE_DESCRIPTOR_ID_BITS            32
+
+#define SIZE_OF_TERMINAL_LOAD_TRANSFER_STRUCT_BITS \
+    (2 * IA_CSS_UINT32_T_BITS + \
+    VIED_VADDRESS_BITS + \
+    2 * IA_CSS_UINT16_T_BITS)
+
+#define SIZE_OF_TERMINAL_STORE_TRANSFER_STRUCT_BITS \
+    (2 * IA_CSS_UINT32_T_BITS + \
+    VIED_VADDRESS_BITS + \
+    2 * IA_CSS_UINT16_T_BITS)
+
+#define SIZE_OF_TERMINAL_LOAD_TRANSFER_STRUCT (SIZE_OF_TERMINAL_LOAD_TRANSFER_STRUCT_BITS / CHAR_BIT)
+#define SIZE_OF_TERMINAL_STORE_TRANSFER_STRUCT (SIZE_OF_TERMINAL_STORE_TRANSFER_STRUCT_BITS / CHAR_BIT)
+
+typedef uint32_t vied_vaddress_t;
+
+typedef struct {
+    uint8_t device_id;
+    uint8_t instance_id;
+    uint8_t channel_id;
+    uint8_t section_id;
+} device_descriptor_fields_t;
+
+typedef union {
+    device_descriptor_fields_t fields;
+    uint32_t data;
+} device_descriptor_id_t;
+
+typedef uint16_t ia_css_process_id_t;
+
+#endif /* __IA_CSS_BASE_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs.h
new file mode 100644
index 000000000000..683c2f5d23e1
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs.h
@@ -0,0 +1,789 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_ISA_PARAMETER_DEFS_H
+#define __IA_CSS_ISA_PARAMETER_DEFS_H
+
+#include "ia_css_isa_parameter_defs_dep.h"
+
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_INL            (0)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_GLOBAL        (0)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_0        (1)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_1        (1)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_2        (1)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PCLN            (0)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_0        (1)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_1        (1)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_2        (1)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC            (1)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_IDS            (0)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AWB        (1)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AF        (1)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE_CCM        (0)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE        (1)
+
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_INL            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_GLOBAL            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_0        (1)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_1        (1)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_2        (1)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PCLN            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_0        (1)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_1        (1)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_2        (1)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_IDS            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AWB        (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AF            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE_CCM        (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE            (0)
+
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_INL            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_GLOBAL        (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_0        (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_1        (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_2        (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PCLN            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_0        (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_1        (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_2        (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_IDS            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AWB        (1)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AF        (1)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE_CCM        (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE        (0)
+
+#define IA_CSS_ISA_NEEDS_SLICED_IN_INL                (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_GLOBAL            (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_0        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_1        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_2        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_PCLN            (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_0        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_1        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_2        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_DPC                (1)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_IDS                (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AWB            (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AF            (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE_CCM        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE            (0)
+
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_INL            (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_GLOBAL            (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_0        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_1        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_2        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PCLN            (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_0        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_1        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_2        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_DPC            (1)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_IDS            (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AWB        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AF            (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE_CCM        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE            (0)
+
+/* ==================== INL specs - START ==================== */
+/* in addition to register bank, it has a 0x200 memory bank to store LUT, found in reg_descr.hsd */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_SECTION_COUNT                        (2)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_0                        (0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_0                    (0x204)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_1                        (0x204)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_1                    (0x0)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_INL_SECTION_COUNT                        (0)
+
+/* Spatial Parameter Terminal In does not exist for INL */
+
+/* Spatial Parameter Terminal Out does not exist for INL */
+
+/* Sliced Parameter Terminal In does not exist for INL */
+
+/* Sliced Parameter Terminal Out does not exist for INL */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_INL_SECTION_COUNT                            (0)
+/* ==================== INL specs - END ==================== */
+
+/* ==================== BLC_GLOBAL specs - START ==================== */
+/* in addition to register bank, it has a 0xC00 memory bank to store LUT, found in reg_descr.hsd */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_SECTION_COUNT                        (2)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_0                    (0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_0                    (0xC08)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_1                    (0x20)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_1                    (0xC0C)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_GLOBAL_SECTION_COUNT                    (0)
+
+/* Spatial Parameter Terminal In does not exist for BLC_GLOBAL */
+
+/* Spatial Parameter Terminal Out does not exist for BLC_GLOBAL */
+
+/* Sliced Parameter Terminal In does not exist for BLC_GLOBAL */
+
+/* Sliced Parameter Terminal Out does not exist for BLC_GLOBAL */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_GLOBAL_SECTION_COUNT                        (0)
+/* ==================== BLC_GLOBAL specs - END ==================== */
+
+/* ==================== BLC_SENSOR_TYPE_0 specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT                    (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0                (0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0                (0xC08)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_0_SECTION_COUNT                (0)
+
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SECTION_COUNT            (4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM        (8)
+
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE        (128)    /* HW limit for slice height calculation */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH    (8)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH    (64)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT    (8)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT    (64)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0            (0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0    (0x0)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_1        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_1            (0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_1    (0x300)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_1        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_2        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_2            (0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_2    (0x600)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_2        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_3        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_3            (0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_3    (0x900)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_3        (0x100)
+
+/* Spatial Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_0 */
+
+/* Sliced Parameter Terminal In does not exist for BLC_SENSOR_TYPE_0 */
+
+/* Sliced Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_0 */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT                    (1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0                (0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0                (0xC00)
+/* ==================== BLC_SENSOR_TYPE_0 specs - END ==================== */
+
+/* ==================== BLC_SENSOR_TYPE_1 specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT                    (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0                (0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0                (0xC08)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_1_SECTION_COUNT                (0)
+
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SECTION_COUNT            (4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM        (2)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE        (128)    /* HW limit for slice height calculation */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH    (8)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH    (64)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT    (8)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT    (64)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0            (0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0    (0x0)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_1        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_1            (0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_1    (0x300)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_1        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_2        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_2            (0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_2    (0x600)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_2        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_3        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_3            (0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_3    (0x900)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_3        (0x100)
+
+/* Spatial Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_1 */
+
+/* Sliced Parameter Terminal In does not exist for BLC_SENSOR_TYPE_1 */
+
+/* Sliced Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_1 */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT                    (1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0                (0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0                (0xC00)
+/* ==================== BLC_SENSOR_TYPE_1 specs - END ==================== */
+
+/* ==================== BLC_SENSOR_TYPE_2 specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT                    (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0                (0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0                (0xC08)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_2_SECTION_COUNT                (0)
+
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SECTION_COUNT            (8)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM        (1)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE        (32)    /* HW limit for slice height calculation */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH    (8)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH    (32)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT    (8)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT    (32)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0        (0x80)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0            (0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0    (0x0)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_1        (0x80)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_1            (0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_1    (0x300)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_1        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_2        (0x80)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_2            (0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_2    (0x600)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_2        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_3        (0x80)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_3            (0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_3    (0x900)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_3        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_4        (0x80)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_4            (0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_4    (0x80)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_4        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_5        (0x80)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_5            (0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_5    (0x380)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_5        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_6        (0x80)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_6            (0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_6    (0x680)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_6        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_7        (0x80)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_7            (0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_7    (0x980)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_7        (0x100)
+
+/* Spatial Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_2 */
+
+/* Sliced Parameter Terminal In does not exist for BLC_SENSOR_TYPE_2 */
+
+/* Sliced Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_2 */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT                    (1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0                (0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0                (0xC00)
+/* ==================== BLC_SENSOR_TYPE_2 specs - END ==================== */
+
+/* ==================== PCLN specs - START ==================== */
+/* in addition to register bank, it has a 0x800 memory bank to store LUT, found in reg_descr.hsd */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_SECTION_COUNT                        (2)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_0                        (0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_0                    (0x820)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_1                        (0x820)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_1                    (0x0)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PCLN_SECTION_COUNT                        (0)
+
+/* Spatial Parameter Terminal In does not exist for PCLN */
+
+/* Spatial Parameter Terminal Out does not exist for PCLN */
+
+/* Sliced Parameter Terminal In does not exist for PCLN */
+
+/* Sliced Parameter Terminal Out does not exist for PCLN */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_PCLN_SECTION_COUNT                            (0)
+/* ==================== PCLN specs - END ==================== */
+
+/* ==================== LSC_SENSOR_TYPE_0 specs - START ==================== */
+/* in addition to register bank, it has a 0xC00 memory bank to store LUT, found in reg_descr.hsd */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT                    (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0                (0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0                (0xC08)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT                (0)
+
+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
+
+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_0 */
+
+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT                    (1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0                (0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0                (0xC00)
+/* ==================== LSC_SENSOR_TYPE_0 specs - END ==================== */
+
+/* ==================== LSC_SENSOR_TYPE_1 specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT                    (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0                (0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0                (0xC08)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT                (0)
+
+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
+
+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_1 */
+
+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT                    (1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0                (0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0                (0xC00)
+/* ==================== LSC_SENSOR_TYPE_1 specs - END ==================== */
+
+/* ==================== LSC_SENSOR_TYPE_2 specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT                    (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0                (0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0                (0xC08)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT                (0)
+
+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
+
+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_2 */
+
+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT                    (1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0                (0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0                (0xC00)
+/* ==================== LSC_SENSOR_TYPE_2 specs - END ==================== */
+
+/* ==================== BNR specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_SECTION_COUNT            (2)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_0    (0x2C)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_0    (0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_1    (0xA4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_1    (0x34)
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_SECTION_COUNT            (1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_MAX_SIZE_SECTION_0        (0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_DEST_OFFSET_SECTION_0    (0x2C)
+/* ==================== BNR specs - END ==================== */
+
+/* ==================== ISA_DM specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_SECTION_COUNT            (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_MAX_SIZE_SECTION_0        (0x2C)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_DEST_OFFSET_SECTION_0    (0x0)
+
+/* ==================== ISA_DM specs - END ==================== */
+
+/* ==================== IDS specs - START ==================== */
+/* IDS is HW revision dependent */
+/* ==================== IDS specs - END ==================== */
+
+/* ==================== 3A_STAT_AWB specs - START ==================== */
+/* AWB parameter properties are in the platform specific ia_css_parameter_defs_dep.h file */
+/* ==================== 3A_STAT_AWB specs - END ==================== */
+
+/* ==================== 3A_STAT_AF specs - START ==================== */
+/* in addition to register bank, it has a 0x400 memory bank to store output, found in reg_descr.hsd */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_SECTION_COUNT                        (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0                    (0x88)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0                    (0x40C)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT                    (0)
+
+/* Spatial Parameter Terminal In does not exist for 3A_STAT_AF */
+
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT                (2)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_COMPUTE_UNITS_PER_ELEM            (1)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_PER_SLICE        (32)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH        (16)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH        (32)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT        (16)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT        (32)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_0            (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_0            (0x8)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_0        (0x0)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_0        (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_1            (0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_1            (0x8)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_1        (0x200)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_1        (0x100)
+
+/* Sliced Parameter Terminal In does not exist for 3A_STAT_AF */
+
+/* Sliced Parameter Terminal Out does not exist for 3A_STAT_AF */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_SECTION_COUNT                        (1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0                    (0xC)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0                    (0x400)
+/* ==================== 3A_STAT_AF specs - END ==================== */
+
+/* ==================== 3A_STAT_AE_CCM specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT                    (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_MAX_SIZE_SECTION_0                (0x7C)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_DEST_OFFSET_SECTION_0                (0x0)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_CCM_SECTION_COUNT                    (0)
+
+/* Spatial Parameter Terminal In does not exist for 3A_STAT_AE_CCM */
+
+/* Spatial Parameter Terminal Out does not exist for 3A_STAT_AE_CCM */
+
+/* Sliced Parameter Terminal In does not exist for 3A_STAT_AE_CCM */
+
+/* Sliced Parameter Terminal Out does not exist for 3A_STAT_AE_CCM */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT                    (0)
+/* ==================== 3A_STAT_AE_CCM specs - END ==================== */
+
+/* ==================== 3A_STAT_AE specs - START ==================== */
+/* in addition to register bank, it has a 0x180 memory bank to store LUT and a 0x2000 memory bank to store output,
+   found in reg_descr.hsd */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_SECTION_COUNT                        (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0                    (0xC)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0                    (0x18C)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_SECTION_COUNT                    (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_MAX_SIZE_SECTION_0                (0x2000)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_DEST_OFFSET_SECTION_0                (0x200)
+
+/* Spatial Parameter Terminal In does not exist for 3A_STAT_AE */
+
+/* Spatial Parameter Terminal Out does not exist for 3A_STAT_AE */
+
+/* Sliced Parameter Terminal In does not exist for 3A_STAT_AE */
+
+/* Sliced Parameter Terminal Out does not exist for 3A_STAT_AE */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_SECTION_COUNT                        (2)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0                    (0xC)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0                    (0x180)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_1                    (0x180)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_1                    (0x0)
+/* ==================== 3A_STAT_AE specs - END ==================== */
+
+/* TODO: REMOVE BACKWARD COMPATIBILITY */
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_INL_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_1
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_INL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_INL_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_INL_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_INL_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_1
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_GLOBAL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_GLOBAL_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_GLOBAL_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_GLOBAL_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_0_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_3
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_3
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_3
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_3
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_1_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_3
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_3
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_3
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_3
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_2_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_3
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_3
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_3
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_3
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_4
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_4
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_4
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_4
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_5
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_5
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_5
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_5
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_6
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_6
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_6
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_6
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_7
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_7
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_7
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_7
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_1
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_PCLN_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PCLN_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_PCLN_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_PCLN_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_COMPUTE_UNITS_PER_ELEM
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_PER_SLICE
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_1
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_COMPUTE_UNITS_PER_ELEM
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_PER_SLICE
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_1
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_CCM_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_CCM_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_CCM_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_CCM_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_1
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_1
+
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_INL IA_CSS_ISA_KERNEL_IS_PRIMARY_INL
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_GLOBAL IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_GLOBAL
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_0 IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_0
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_1 IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_1
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_2 IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_2
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_PCLN IA_CSS_ISA_KERNEL_IS_PRIMARY_PCLN
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_0 IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_0
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_1 IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_1
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_2 IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_2
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_DPC IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_IDS IA_CSS_ISA_KERNEL_IS_PRIMARY_IDS
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AWB IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AWB
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AF IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AF
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AE_CCM IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE_CCM
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AE IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_INL IA_CSS_ISA_NEEDS_SPATIAL_IN_INL
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_GLOBAL IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_GLOBAL
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_0
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_1
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_2
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_PCLN IA_CSS_ISA_NEEDS_SPATIAL_IN_PCLN
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_0
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_1
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_2
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_DPC IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_IDS IA_CSS_ISA_NEEDS_SPATIAL_IN_IDS
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AWB IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AWB
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AF IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AF
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE_CCM
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AE IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_INL IA_CSS_ISA_NEEDS_SPATIAL_OUT_INL
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_GLOBAL IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_GLOBAL
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_0
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_1
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_2
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_PCLN IA_CSS_ISA_NEEDS_SPATIAL_OUT_PCLN
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_0
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_1
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_2
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_DPC IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_IDS IA_CSS_ISA_NEEDS_SPATIAL_OUT_IDS
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AWB IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AWB
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AF IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AF
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE_CCM
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AE IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_INL IA_CSS_ISA_NEEDS_SLICED_IN_INL
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_GLOBAL IA_CSS_ISA_NEEDS_SLICED_IN_BLC_GLOBAL
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_0
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_1
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_2
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_PCLN IA_CSS_ISA_NEEDS_SLICED_IN_PCLN
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_0
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_1
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_2
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_DPC IA_CSS_ISA_NEEDS_SLICED_IN_DPC
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_IDS IA_CSS_ISA_NEEDS_SLICED_IN_IDS
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AWB IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AWB
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AF IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AF
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE_CCM
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AE IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_INL IA_CSS_ISA_NEEDS_SLICED_OUT_INL
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_GLOBAL IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_GLOBAL
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_0
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_1
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_2
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_PCLN IA_CSS_ISA_NEEDS_SLICED_OUT_PCLN
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_0
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_1
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_2
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_DPC IA_CSS_ISA_NEEDS_SLICED_OUT_DPC
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_IDS IA_CSS_ISA_NEEDS_SLICED_OUT_IDS
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AWB IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AWB
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AF IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AF
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE_CCM
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AE IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE
+/* END OF TODO */
+
+#endif /* __IA_CSS_ISA_PARAMETER_DEFS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs_dep.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs_dep.h
new file mode 100644
index 000000000000..3de76b774bba
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs_dep.h
@@ -0,0 +1,580 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_ISA_PARAMETER_DEFS_DEP_H
+#define __IA_CSS_ISA_PARAMETER_DEFS_DEP_H
+
+#include "ia_css_ff_awb_statistics_param_defs.h"
+
+/*
+ * TODO: Adapt this file for IPU6!
+ */
+
+/* ==================== DPC_V2 specific properties ==================== */
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC_V2            (1)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC_V2            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC_V2            (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_DPC_V2            (1)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_DPC_V2            (1)
+
+/* ==================== PDAF specific properties ==================== */
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PAF            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PAF                (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PAF            (1)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_PAF                (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PAF                (0)
+
+/* ==================== DPC_PEXT specific properties ==================== */
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC_PEXT            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC_PEXT            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC_PEXT            (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_DPC_PEXT            (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_DPC_PEXT            (0)
+
+/* ==================== SIS specific properties ==================== */
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_SIS_WB_SIS            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_SIS_WB_SIS            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_SIS_WB_SIS            (0)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_SIS_SIS            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_SIS_SIS            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_SIS_SIS            (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_SIS_WB_SIS            (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_SIS_SIS            (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_SIS_WB_SIS            (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_SIS_SIS            (0)
+
+/* ==================== STREAM_CROP specific properties ==================== */
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_STREAM_CROP        (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_STREAM_CROP            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_STREAM_CROP        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_STREAM_CROP            (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_STREAM_CROP            (0)
+
+/* ========== PIFCONV_A_INPUT specific properties ================= */
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_A_INPUT        (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_A_INPUT        (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_A_INPUT        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_A_INPUT        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_A_INPUT        (0)
+
+/* ========== PIFCONV_B_INPUT specific properties ================= */
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_B_INPUT        (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_B_INPUT        (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_B_INPUT        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_B_INPUT        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_B_INPUT        (0)
+
+/* ========== PIFCONV_OUTPUT_NONSCALED specific properties ================= */
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_OUTPUT_NONSCALED        (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_OUTPUT_NONSCALED        (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_OUTPUT_NONSCALED        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_OUTPUT_NONSCALED        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_OUTPUT_NONSCALED        (0)
+
+/* ========== PIFCONV_OUTPUT_SCALED specific properties ================= */
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_OUTPUT_SCALED        (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_OUTPUT_SCALED        (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_OUTPUT_SCALED        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_OUTPUT_SCALED        (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_OUTPUT_SCALED        (0)
+
+/* ========== PIFCONV_OUTPUT_SIS specific properties ================= */
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_OUTPUT_SIS            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_OUTPUT_SIS            (0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_OUTPUT_SIS            (0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_OUTPUT_SIS            (0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_OUTPUT_SIS            (0)
+
+/* ==================== IDS specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_SECTION_COUNT                        (5)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0                    (0x0C)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0                    (0x00)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_1                    (0x10)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_1                    (0x14)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_2                    (0x18)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_2                    (0x50)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_3                    (0x20C)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_3                    (0x68)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_4                    (0x24)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_4                    (0x274)
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_SECTION_COUNT                        (1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0                        (0x08)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0                    (0x0C)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_V3_1_SECTION_COUNT                    (0)
+
+/* Spatial Parameter Terminal In does not exist for IDS */
+
+/* Spatial Parameter Terminal Out does not exist for IDS */
+
+/* Sliced Parameter Terminal In does not exist for IDS */
+
+/* Sliced Parameter Terminal Out does not exist for IDS */
+
+/* ==================== IDS specs - END ==================== */
+
+/* ==================== DPC specs used in PSYS - START ==================== */
+/* in addition to register bank, it has a 0x3000 memory bank to store LUT, found in reg_descr.hsd */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_SECTION_COUNT                        (5)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_0                    (0x4)        /* GDC Control */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_0                    (0x3378)    /* GDC/DPC Control */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_1                    (0x1C0)        /* CfgTable */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_1                    (0x3000)    /* CfgTable */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_2                    (0x40)        /* HDR factors */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_2                    (0x3488)    /* HDR factors */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_3                    (0x4)        /* AF Grid Enable */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_3                    (0x34C8)    /* AF Grid Enable */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_4                    (0x8)        /* AF Statistics pixels */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_4                    (0x34D4)    /* AF Statistics pixels */
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_SECTION_COUNT                        (4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_0                    (0x4)        /* GDC Control */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_0                    (0x3378)    /* GDC/DPC Control */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_1                    (0x1C0)        /* CfgTable */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_1                    (0x3000)    /* CfgTable */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_2                    (0x40)        /* HDR factors */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_2                    (0x3488)    /* HDR factors */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_3                    (0x4)        /* AF Grid Enable */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_3                    (0x34C8)    /* AF Grid Enable */
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT                    (0)
+
+/* Spatial Parameter Terminal In does not exist for DPC */
+
+/* Spatial Parameter Terminal Out does not exist for DPC */
+
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SECTION_COUNT                    (2)
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_0            (0x4)        /* DPC static LUT limit */
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0            (0x3380)    /* DPC static LUT limit */
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0            (0x4)        /* DPC static LUT limit */
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_1            (0x1000)    /* DPC static LUT */
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1            (0x0)        /* DPC static LUT */
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1            (0x1000)    /* DPC static LUT */
+
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT                    (2)
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_0            (0x4)        /* AF LUT limit */
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0            (0x34CC)    /* AF LUT limit */
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0            (0x4)        /* AF LUT limit */
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_1            (0x800)        /* AF Pixels metadata */
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1            (0x2000)    /* AF Pixels metadata */
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1            (0x800)        /* AF Pixels metadata */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_SECTION_COUNT                        (3)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_0                        (0x4)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_0                    (0x337C) /* DPC Control */
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_1                        (0x1B8)        /* CfgUnitMapping */
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_1                    (0x31C0)    /* CfgUnitMapping */
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_2                        (0x100)        /* AF pixels grid cfg */
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_2                    (0x3388)    /* AF pixels grid cfg */
+
+/* ==================== DPC specs - END ==================== */
+
+/* ==================== DPC_PEXT specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_SECTION_COUNT                        (2)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_MAX_SIZE_SECTION_0                    (0x8)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_DEST_OFFSET_SECTION_0                    (0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_MAX_SIZE_SECTION_1                    (0x8)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_DEST_OFFSET_SECTION_1                    (0xC)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_PEXT_SECTION_COUNT                    (0)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_PEXT_SECTION_COUNT                        (0)
+/* ==================== DPC_PEXT specs - END ==================== */
+
+/* TODO check ae values */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_COMPUTE_UNITS_PER_ELEM (1)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH (16)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT (80)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_ELEM_SIZE_SECTION_0 (0)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH (16)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT (80)
+
+/* todo check gddpc_pext values when enabling this terminal */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_COMPUTE_UNITS_PER_ELEM (8)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH (8)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT (8)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_ELEM_SIZE_SECTION_0 (0)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH (64)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT (64)
+
+/* ==================== PAF specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_SECTION_COUNT                            (2)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_MAX_SIZE_SECTION_0                        (0x18)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_DEST_OFFSET_SECTION_0                        (0x0)
+
+/* This is an PAF ACB configuration an not really the configuration on PAF FF. Hence giving - offsets*/
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_MAX_SIZE_SECTION_1                        (0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_DEST_OFFSET_SECTION_1                        (-0xB0)
+
+#define    IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PAF_SECTION_COUNT                        (0)
+/* Number of PAF blocks = 12*16 PAF blocks
+ * Max number of phase steps in each block: 11 steps (0-10)
+ *     for step 10, only the LSB values are valid and MSB 2bytes are reserved
+ *     Hence for each block height, we will have to read in 12 steps
+ * Size of each phase value =  2 bytes
+ * Total size required for PAF output = 2bytes * 12*16 blocks *12 steps
+ * */
+
+/* Spatial Parameter Terminal In does not exist for PAF*/
+
+/* Spatial Parameter Terminal Out for PAF*/
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_SECTION_COUNT                    (1)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_COMPUTE_UNITS_PER_ELEM                (1)    /**/
+
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_MAX_SLICE_SIZE_SECTION_0                (0x1200) /*12*16 #PAF blocks# * 2bytes*12 #Phase output size per block#*/
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_ELEM_SIZE_SECTION_0                (0x18)    /*Size of each phase output in a grid*/
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_SLICE_0_DEST_OFFSET_SECTION_0            (0x200)    /*FF register offset from kernel base*/
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_NEXT_SLICE_OFFSET_SECTION_0            (0x180)    /*Determines the next FF location*/
+
+/* Sliced Parameter Terminal In does not exist for PAF*/
+
+/* Sliced Parameter Terminal Out does not exist for PAF*/
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_PAF_SECTION_COUNT                            (0)
+/* ==================== PAF specs - END ==================== */
+
+/* ==================== LSC_SENSOR_TYPE_0 specs - START ==================== */
+/* in addition to register bank, it has a 0xC00 memory bank to store LUT, found in reg_descr.hsd */
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT                (0)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SECTION_COUNT            (1)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM        (2)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE        (128)    /* HW limit for slice height calculation */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH    (8)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH    (64)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT    (8)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT    (64)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0        (0x400)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0            (0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0    (0x0)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0        (0x400)
+
+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
+
+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_0 */
+
+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
+/* ==================== LSC_SENSOR_TYPE_0 specs - END ==================== */
+
+/* ==================== LSC_SENSOR_TYPE_1 specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT                (0)
+
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SECTION_COUNT            (1)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM        (1)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE        (128)    /* HW limit for slice height calculation */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH    (8)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH    (64)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT    (8)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT    (64)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0        (0x400)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0            (0x8)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0    (0x0)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0        (0x400)
+
+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
+
+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_1 */
+
+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
+/* ==================== LSC_SENSOR_TYPE_1 specs - END ==================== */
+
+/* ==================== LSC_SENSOR_TYPE_2 specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT                (0)
+
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SECTION_COUNT            (1)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM        (1)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE        (32)    /* HW limit for slice height calculation */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH    (8)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH    (32)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT    (8)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT    (32)    /* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0        (0x400)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0            (0x20)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0    (0x0)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0        (0x400)
+
+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
+
+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_2 */
+
+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
+
+/* ==================== LSC_SENSOR_TYPE_2 specs - END ==================== */
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_SECTION_COUNT                IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_SECTION_COUNT
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_0            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_0            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_1            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_1
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_1            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_2            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_2
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_2            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_2
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_3            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_3
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_3            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_3
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_4            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_4
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_4            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_4
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_SECTION_COUNT            IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_V3_1_SECTION_COUNT
+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_SECTION_COUNT                IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_SECTION_COUNT
+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_MAX_SIZE_SECTION_0            IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0
+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_DEST_OFFSET_SECTION_0            IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_SECTION_COUNT                    IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_SECTION_COUNT
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_0                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_0
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_0                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_1                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_1
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_1                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_2                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_2
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_2                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_2
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_3                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_3
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_3                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_3
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_4                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_4
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_4                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_4
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT                IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SECTION_COUNT            IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SECTION_COUNT
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_0        IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_0    IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_0        IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_1        IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_1
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_1    IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_1        IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT            IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_0        IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_0    IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_0    IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_1        IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_1
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_1    IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_1    IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_SECTION_COUNT                    IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_SECTION_COUNT
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_0                IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_0
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_0                IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_1                IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_1
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_1                IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_2                IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_2
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_2                IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_2
+
+/* ==================== LCA specs -- START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_SECTION_COUNT            (6)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_0    (0xc) /* 0x0 to 0xb */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_0    (0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_1    (0xcc) /* 0x10 to 0xdb */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_1    (0x10)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_2    (0x510) /* 0x100 to 0x60f */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_2    (0x100)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_3    (0x510) /* 0x6c0 to 0xbcf */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_3    (0x6c0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_4    (0x510) /* 0xc80 to 0x118f */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_4    (0xc80)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_5    (0x510) /* 0x1240 to 0x174f */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_5    (0x1240)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LCA_SECTION_COUNT        (0)
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LCA_SECTION_COUNT            (1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LCA_MAX_SIZE_SECTION_0        (4) /* 0x1800 to 0x1803*/
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LCA_DEST_OFFSET_SECTION_0    (0x1800)
+/* ==================== LCA specs -- END ==================== */
+
+/* ==================== WBA_WBA specs - START ==================== */
+#define IA_CSS_PSA_PARAMETER_TERMINAL_B2B_WBA_SECTION_COUNT               (1)
+#define IA_CSS_PSA_PARAMETER_TERMINAL_B2B_WBA_MAX_SIZE_SECTION_0          (0x20)
+#define IA_CSS_PSA_PARAMETER_TERMINAL_B2B_WBA_DEST_OFFSET_SECTION_0       (0x0)
+/* ==================== WBA_WBA specs - END ==================== */
+
+/* leave those for now to pass isys compilation */
+/* ==================== SIS_WB_SIS specs - START ==================== */
+/* This device is similar to the WBA device in the PSA (with respect to registermap) */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_SECTION_COUNT            (2)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_MAX_SIZE_SECTION_0       (0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_DEST_OFFSET_SECTION_0    (0x1C)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_MAX_SIZE_SECTION_1       (0x1C)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_DEST_OFFSET_SECTION_1    (0x0)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_SIS_WB_SIS_SECTION_COUNT        (0)
+
+/* Spatial Parameter Terminal In does not exist for SIS_WB_SIS */
+
+/* Spatial Parameter Terminal Out does not exist for SIS_WB_SIS */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_SIS_WB_SIS_SECTION_COUNT              (0)
+/* ==================== SIS_WB_SIS specs - END ==================== */
+
+/* ==================== SIS_SIS specs - START ==================== */
+/* TODO: The SIS device does not yet expose the functionality for cropping */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_SIS_SECTION_COUNT               (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_SIS_MAX_SIZE_SECTION_0          (0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_SIS_DEST_OFFSET_SECTION_0       (0x0)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_SIS_SIS_SECTION_COUNT           (0)
+
+/* Spatial Parameter Terminal In does not exist for SIS_SIS */
+
+/* Spatial Parameter Terminal Out does not exist for SIS_SIS */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_SIS_SIS_SECTION_COUNT                 (0)
+/* ==================== SIS_SIS specs - END ==================== */
+
+/* ==================== STREAM_CROP specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_STREAM_CROP_SECTION_COUNT        (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_STREAM_CROP_MAX_SIZE_SECTION_0    (0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_STREAM_CROP_DEST_OFFSET_SECTION_0    (0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_STREAM_CROP_SECTION_COUNT    (0)
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_STREAM_CROP_SECTION_COUNT        (1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_STREAM_CROP_MAX_SIZE_SECTION_0    (0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_STREAM_CROP_DEST_OFFSET_SECTION_0    (0x4)
+/* ==================== STREAM_CROP specs - END ==================== */
+
+/* ==================== BNR specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_SECTION_COUNT            (2)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_0    (0x2C)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_0    (0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_1    (0xA4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_1    (0x34)
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_SECTION_COUNT            (1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_MAX_SIZE_SECTION_0        (0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_DEST_OFFSET_SECTION_0    (0x2C)
+/* ==================== BNR specs - END ==================== */
+
+/* ==================== ISA_DM specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_SECTION_COUNT            (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_MAX_SIZE_SECTION_0        (0x2C)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_DEST_OFFSET_SECTION_0    (0x0)
+
+/* ==================== ISA_DM specs - END ==================== */
+
+/* ====================  specs PIFCONV_SIS_A- START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_A_SECTION_COUNT            (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_A_MAX_SIZE_SECTION_0        (0xc)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_A_DEST_OFFSET_SECTION_0        (0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SIS_A_SECTION_COUNT        (0)
+/* ====================  specs PIFCONV_SIS_A- END ==================== */
+
+/* ====================  specs PIFCONV_SIS_B- START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_B_SECTION_COUNT            (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_B_MAX_SIZE_SECTION_0        (0x12)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_B_DEST_OFFSET_SECTION_0        (0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SIS_B_SECTION_COUNT        (0)
+/* ====================  specs PIFCONV_SIS_B- END ==================== */
+
+/* ====================  specs PIFCONV_ISA_ORIG- START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_ORIG_SECTION_COUNT            (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_ORIG_MAX_SIZE_SECTION_0        (0xc)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_ORIG_DEST_OFFSET_SECTION_0        (0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_ISA_ORIG_SECTION_COUNT        (0)
+/* ====================  specs PIFCONV_ISA_ORIG- END ==================== */
+
+/* ====================  specs PIFCONV_ISA_SCALED_A- START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_A_SECTION_COUNT            (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_A_MAX_SIZE_SECTION_0        (0xc)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_A_DEST_OFFSET_SECTION_0        (0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SCALED_A_SECTION_COUNT        (0)
+/* ====================  specs PIFCONV_ISA_SCALED_A- END ==================== */
+
+/* ====================  specs PIFCONV_ISA_SCALED_B- START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_B_SECTION_COUNT            (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_B_MAX_SIZE_SECTION_0        (0xc)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_B_DEST_OFFSET_SECTION_0        (0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SCALED_B_SECTION_COUNT        (0)
+/* ====================  specs PIFCONV_ISA_SCALED_B- END ==================== */
+
+/* ====================  specs PIFCONV_ISA_FULL- START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_FULL_SECTION_COUNT            (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_FULL_MAX_SIZE_SECTION_0        (0xc)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_FULL_DEST_OFFSET_SECTION_0        (0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_ISA_FULL_SECTION_COUNT        (0)
+/* ====================  specs -PIFCONV_ISA_FULL_OUT END ==================== */
+
+/* ====================  specs PIFCONV_ISA_IR_DEPTH - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_SECTION_COUNT            (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_MAX_SIZE_SECTION_0        (0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_DEST_OFFSET_SECTION_0        (0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_SECTION_COUNT        (0)
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_SECTION_COUNT            (2)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_MAX_SIZE_SECTION_0        (0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_DEST_OFFSET_SECTION_0        (0x4)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_MAX_SIZE_SECTION_1        (0x4)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_DEST_OFFSET_SECTION_1        (0x0) /* 0 because this register is in GPreg, NOT in Pifconv device. */
+/* ====================  specs PIFCONV_ISA_IR_DEPTH - END ==================== */
+
+/* ==================== PIXEL FORMATTER specs - START ==================== */
+/* The base address of the Pixel Formatter device is 0x271000 */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIXEL_FORMATTER_SECTION_COUNT        (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIXEL_FORMATTER_MAX_SIZE_SECTION_0    (0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIXEL_FORMATTER_DEST_OFFSET_SECTION_0    (0x0) /* Base address of the Config register in the Pixel Formatter device: Taken from MAS */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIXEL_FORMATTER_SECTION_COUNT        (0x0)
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIXEL_FORMATTER_SECTION_COUNT        (1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIXEL_FORMATTER_MAX_SIZE_SECTION_0        (0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIXEL_FORMATTER_DEST_OFFSET_SECTION_0    (0x20) /* Base address of Start register in the Pixel Formatter device: Taken from MAS
+                                            and base address of size register in the Pixel Formatter device is 0x24. */
+
+/* TODO: REMOVE BACKWARD COMPATIBILITY */
+/* NOT USED defs - needed for legacy*/
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_SECTION_COUNT                    IA_P2P_PARAM_IN_TERMINAL_FF_AWB_STATISTICS_SECTION_COUNT
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0            IA_P2P_PARAM_IN_TERMINAL_FF_AWB_STATISTICS_SECTION_0_SIZE
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0            IA_P2P_PARAM_IN_TERMINAL_FF_AWB_STATISTICS_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT                IA_P2P_PROGRAM_TERMINAL_FF_AWB_STATISTICS_SECTION_COUNT
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0                IA_P2P_PROGRAM_TERMINAL_FF_AWB_STATISTICS_SECTION_0_SIZE
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_SECTION_COUNT                    IA_P2P_PROGRAM_TERMINAL_FF_AWB_STATISTICS_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_IDS_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_1
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_2
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_2
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_3
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_3
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_4 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_4
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_4 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_4
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_IDS_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_IDS_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_IDS_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_IDS_MAX_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_IDS_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_IDS_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_IDS_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_DPC_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_1
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_2
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_2
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_3
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_3
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_SECTION_COUNT IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SECTION_COUNT
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_1
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_1
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_1
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_DPC_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_1
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_1
+/* END OF TODO */
+
+#endif /* __IA_CSS_ISA_PARAMETER_DEFS_DEP_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap.h
new file mode 100644
index 000000000000..508ca278ba65
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap.h
@@ -0,0 +1,262 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_KERNEL_BITMAP_H
+#define __IA_CSS_KERNEL_BITMAP_H
+
+/*! \file */
+
+/** @file ia_css_kernel_bitmap.h
+ *
+ * The types and operations to make logic decisions given kernel bitmaps
+ * "ia_css_kernel_bitmap_t" can be larger than native types
+ */
+
+#include <type_support.h>
+#include "vied_nci_psys_resource_model.h"
+#include "ia_css_kernel_bitmap_storage_class.h"
+
+/**
+ * @addtogroup group_psysapi
+ * @{
+ */
+
+#define IA_CSS_KERNEL_BITMAP_ELEM_TYPE uint32_t
+#define IA_CSS_KERNEL_BITMAP_ELEM_BITS \
+    (sizeof(IA_CSS_KERNEL_BITMAP_ELEM_TYPE)*8)
+#define IA_CSS_KERNEL_BITMAP_NOF_ELEMS \
+    ((IA_CSS_KERNEL_BITMAP_BITS) / (IA_CSS_KERNEL_BITMAP_ELEM_BITS))
+
+/** An element is a 32 bit unsigned integer. 64 bit integers might cause
+ * problems in the compiler.
+ */
+typedef struct {
+    IA_CSS_KERNEL_BITMAP_ELEM_TYPE data[IA_CSS_KERNEL_BITMAP_NOF_ELEMS];
+} ia_css_kernel_bitmap_elems_t;
+
+/** Users should make no assumption about the actual type of
+ * ia_css_kernel_bitmap_t.
+ * Users should use IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS in
+ * case they erroneously assume that this type is uint64_t and they
+ * cannot change their implementation.
+ */
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+typedef ia_css_kernel_bitmap_elems_t ia_css_kernel_bitmap_t;
+#else
+typedef uint64_t ia_css_kernel_bitmap_t;
+#if IA_CSS_KERNEL_BITMAP_BITS > 64
+#error IA_CSS_KERNEL_BITMAP_BITS > 64 not supported \
+    with IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+#endif
+#endif
+
+/*! Print the bits of a kernel bitmap
+
+ @return < 0 on error
+ */
+extern int ia_css_kernel_bitmap_print(
+    const ia_css_kernel_bitmap_t    bitmap,
+    void                *fid);
+
+/*! Create an empty kernel bitmap
+
+ @return bitmap = 0
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_clear(void);
+
+/*! Creates the complement of a kernel bitmap
+ * @param    [in] bitmap kernel bitmap
+ * @return ~bitmap
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_complement(
+    const ia_css_kernel_bitmap_t bitmap);
+
+/*! Create the union of two kernel bitmaps
+
+ @param    [in] bitmap0                    kernel bitmap 0
+ @param    [in] bitmap1                    kernel bitmap 1
+
+ @return bitmap0 | bitmap1
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_union(
+    const ia_css_kernel_bitmap_t            bitmap0,
+    const ia_css_kernel_bitmap_t            bitmap1);
+
+/*! Create the intersection of two kernel bitmaps
+
+ @param    [in] bitmap0                    kernel bitmap 0
+ @param    [in] bitmap1                    kernel bitmap 1
+
+ @return bitmap0 & bitmap1
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_intersection(
+    const ia_css_kernel_bitmap_t            bitmap0,
+    const ia_css_kernel_bitmap_t            bitmap1);
+
+/*! Check if the kernel bitmaps is empty
+
+ @param    [in] bitmap                    kernel bitmap
+
+ @return bitmap == 0
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+bool ia_css_is_kernel_bitmap_empty(
+    const ia_css_kernel_bitmap_t            bitmap);
+
+/*! Check if the intersection of two kernel bitmaps is empty
+
+ @param    [in] bitmap0                    kernel bitmap 0
+ @param    [in] bitmap1                    kernel bitmap 1
+
+ @return (bitmap0 & bitmap1) == 0
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+bool ia_css_is_kernel_bitmap_intersection_empty(
+    const ia_css_kernel_bitmap_t            bitmap0,
+    const ia_css_kernel_bitmap_t            bitmap1);
+
+/*! Check if the second kernel bitmap is a subset of the first (or equal)
+
+ @param    [in] bitmap0                    kernel bitmap 0
+ @param    [in] bitmap1                    kernel bitmap 1
+
+ Note: An empty set is always a subset, this function
+ returns true if bitmap 1 is empty
+
+ @return (bitmap0 & bitmap1) == bitmap1
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+bool ia_css_is_kernel_bitmap_subset(
+    const ia_css_kernel_bitmap_t            bitmap0,
+    const ia_css_kernel_bitmap_t            bitmap1);
+
+/*! Check if the kernel bitmaps are equal
+
+ @param    [in] bitmap0                    kernel bitmap 0
+ @param    [in] bitmap1                    kernel bitmap 1
+
+ @return bitmap0 == bitmap1
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+bool ia_css_is_kernel_bitmap_equal(
+    const ia_css_kernel_bitmap_t            bitmap0,
+    const ia_css_kernel_bitmap_t            bitmap1);
+
+/*! Right shift kernel bitmap
+
+ @param    [in] bitmap                    kernel bitmap 0
+
+ @return bitmap >> 1
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_shift(
+    const ia_css_kernel_bitmap_t            bitmap);
+
+/*! Check if the kernel bitmaps contains only a single element
+
+ @param    [in] bitmap                    kernel bitmap
+
+ @return weight(bitmap) == 1
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+bool ia_css_is_kernel_bitmap_onehot(
+    const ia_css_kernel_bitmap_t            bitmap);
+
+/*! Checks whether a specific kernel bit is set
+ * @return bitmap[index] == 1
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+int ia_css_is_kernel_bitmap_set(
+    const ia_css_kernel_bitmap_t    bitmap,
+    const unsigned int        index);
+
+/*! Create the union of a kernel bitmap with a onehot bitmap
+ * with a bit set at index
+
+ @return bitmap[index] |= 1
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set(
+    const ia_css_kernel_bitmap_t            bitmap,
+    const unsigned int                        index);
+
+/*! Set elem_index-th 32-bit element of the bitmap
+ * to elem_value
+
+ @return updated bitmap
+ */
+extern ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_element_from_uint32(
+    ia_css_kernel_bitmap_t            bitmap,
+    const unsigned int            elem_index,
+    const uint32_t                elem_value);
+
+/*! Creates kernel bitmap using a uint64 value.
+ * @return bitmap with the same bits set as in value (provided that width of bitmap is sufficient).
+ */
+extern ia_css_kernel_bitmap_t ia_css_kernel_bitmap_create_from_uint64(
+    const uint64_t    value);
+
+/*! Converts an ia_css_kernel_bitmap_t type to uint64_t. Note that if
+ *  ia_css_kernel_bitmap_t contains more then 64 bits, only the lowest 64 bits
+ *  are returned.
+ *  @return uint64_t representation of value
+*/
+extern uint64_t ia_css_kernel_bitmap_to_uint64(
+    const ia_css_kernel_bitmap_t value);
+
+/*! Creates a kernel bitmap with the bit at index 'index' removed.
+ * @return ~(1 << index) & bitmap
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_unset(
+    const ia_css_kernel_bitmap_t    bitmap,
+    const unsigned int        index);
+
+/*! Set a previously clear field of a kernel bitmap at index
+
+ @return if bitmap[index] == 0, bitmap[index] -> 1, else 0
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_unique(
+    const ia_css_kernel_bitmap_t            bitmap,
+    const unsigned int                        index);
+
+/*! Create a onehot kernel bitmap with a bit set at index
+
+ @return bitmap[index] = 1
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_kernel_bit_mask(
+    const unsigned int                        index);
+
+/*! Create a random bitmap
+
+ @return bitmap[index] = 1
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_kernel_ran_bitmap(void);
+
+/*! @} */
+
+#ifdef __IA_CSS_KERNEL_BITMAP_INLINE__
+#include "ia_css_kernel_bitmap_impl.h"
+#endif /* __IA_CSS_KERNEL_BITMAP_INLINE__ */
+
+#endif /* __IA_CSS_KERNEL_BITMAP_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_impl.h
new file mode 100644
index 000000000000..45dbcda2da4d
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_impl.h
@@ -0,0 +1,340 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_KERNEL_BITMAP_IMPL_IMPL_H
+#define __IA_CSS_KERNEL_BITMAP_IMPL_IMPL_H
+
+#include <ia_css_kernel_bitmap.h>
+#include <type_support.h>
+#include <misc_support.h>
+#include <assert_support.h>
+#include "math_support.h"
+#include "ia_css_psys_kernel_trace.h"
+#include "ia_css_kernel_bitmap_storage_class.h"
+
+STORAGE_CLASS_INLINE
+int ia_css_kernel_bitmap_compute_weight(
+    const ia_css_kernel_bitmap_t            bitmap)
+{
+    ia_css_kernel_bitmap_t    loc_bitmap;
+    int    weight = 0;
+    int    i;
+
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+               "ia_css_kernel_bitmap_compute_weight(): enter:\n");
+
+    loc_bitmap = bitmap;
+
+    /* In fact; do not need the iterator "i" */
+    for (i = 0; (i < IA_CSS_KERNEL_BITMAP_BITS) &&
+            !ia_css_is_kernel_bitmap_empty(loc_bitmap); i++) {
+        weight += ia_css_is_kernel_bitmap_set(loc_bitmap, 0);
+        loc_bitmap = ia_css_kernel_bitmap_shift(loc_bitmap);
+    }
+
+    return weight;
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+bool ia_css_is_kernel_bitmap_intersection_empty(
+    const ia_css_kernel_bitmap_t            bitmap0,
+    const ia_css_kernel_bitmap_t            bitmap1)
+{
+    ia_css_kernel_bitmap_t intersection;
+
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+        "ia_css_is_kernel_bitmap_intersection_empty(): enter:\n");
+
+    intersection = ia_css_kernel_bitmap_intersection(bitmap0, bitmap1);
+    return ia_css_is_kernel_bitmap_empty(intersection);
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+bool ia_css_is_kernel_bitmap_empty(
+    const ia_css_kernel_bitmap_t            bitmap)
+{
+    unsigned int i;
+    bool is_empty = true;
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+               "ia_css_is_kernel_bitmap_empty(): enter:\n");
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+    for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
+        is_empty &= bitmap.data[i] == 0;
+    }
+#else
+    NOT_USED(i);
+    is_empty = (bitmap == 0);
+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
+    return is_empty;
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+bool ia_css_is_kernel_bitmap_equal(
+    const ia_css_kernel_bitmap_t            bitmap0,
+    const ia_css_kernel_bitmap_t            bitmap1)
+{
+    unsigned int i;
+    bool is_equal = true;
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+               "ia_css_is_kernel_bitmap_equal(): enter:\n");
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+    for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
+        is_equal = is_equal && (bitmap0.data[i] == bitmap1.data[i]);
+    }
+#else
+    NOT_USED(i);
+    is_equal = (bitmap0 == bitmap1);
+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
+    return is_equal;
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+bool ia_css_is_kernel_bitmap_onehot(
+    const ia_css_kernel_bitmap_t            bitmap)
+{
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+               "ia_css_is_kernel_bitmap_onehot(): enter:\n");
+    return ia_css_kernel_bitmap_compute_weight(bitmap) == 1;
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+bool ia_css_is_kernel_bitmap_subset(
+    const ia_css_kernel_bitmap_t            bitmap0,
+    const ia_css_kernel_bitmap_t            bitmap1)
+{
+    ia_css_kernel_bitmap_t intersection;
+
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+               "ia_css_is_kernel_bitmap_subset(): enter:\n");
+
+    intersection = ia_css_kernel_bitmap_intersection(bitmap0, bitmap1);
+    return ia_css_is_kernel_bitmap_equal(intersection, bitmap1);
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_clear(void)
+{
+    unsigned int i;
+    ia_css_kernel_bitmap_t bitmap = {{0} };
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+               "ia_css_kernel_bitmap_clear(): enter:\n");
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+    for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
+        bitmap.data[i] = 0;
+    }
+#else
+    NOT_USED(i);
+    bitmap = 0;
+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
+    return bitmap;
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_complement(
+    const ia_css_kernel_bitmap_t bitmap)
+{
+    unsigned int i;
+    ia_css_kernel_bitmap_t result = {{0} };
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+        "ia_css_kernel_bitmap_complement(): enter:\n");
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+    for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
+        result.data[i] = ~bitmap.data[i];
+    }
+#else
+    NOT_USED(i);
+    result = ~bitmap;
+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
+    return result;
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_union(
+    const ia_css_kernel_bitmap_t            bitmap0,
+    const ia_css_kernel_bitmap_t            bitmap1)
+{
+    unsigned int i;
+    ia_css_kernel_bitmap_t result = {{0} };
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+               "ia_css_kernel_bitmap_union(): enter:\n");
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+    for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
+        result.data[i] = (bitmap0.data[i] | bitmap1.data[i]);
+    }
+#else
+    NOT_USED(i);
+    result = (bitmap0 | bitmap1);
+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
+    return result;
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_intersection(
+    const ia_css_kernel_bitmap_t            bitmap0,
+    const ia_css_kernel_bitmap_t            bitmap1)
+{
+    unsigned int i;
+    ia_css_kernel_bitmap_t result = {{0} };
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+               "ia_css_kernel_bitmap_intersection(): enter:\n");
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+    for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
+        result.data[i] = (bitmap0.data[i] & bitmap1.data[i]);
+    }
+#else
+    NOT_USED(i);
+    result = (bitmap0 & bitmap1);
+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
+    return result;
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set(
+    const ia_css_kernel_bitmap_t            bitmap,
+    const unsigned int                        index)
+{
+    ia_css_kernel_bitmap_t    bit_mask;
+
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+        "ia_css_kernel_bitmap_set(): enter:\n");
+
+    bit_mask = ia_css_kernel_bit_mask(index);
+    return ia_css_kernel_bitmap_union(bitmap, bit_mask);
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_unset(
+    const ia_css_kernel_bitmap_t    bitmap,
+    const unsigned int        index)
+{
+    ia_css_kernel_bitmap_t result;
+
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+        "ia_css_kernel_bitmap_unset(): enter:\n");
+
+    result = ia_css_kernel_bit_mask(index);
+    result = ia_css_kernel_bitmap_complement(result);
+    return ia_css_kernel_bitmap_intersection(bitmap, result);
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_unique(
+    const ia_css_kernel_bitmap_t            bitmap,
+    const unsigned int                        index)
+{
+    ia_css_kernel_bitmap_t    ret;
+    ia_css_kernel_bitmap_t    bit_mask;
+
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+               "ia_css_kernel_bitmap_set_unique(): enter:\n");
+
+    ret = ia_css_kernel_bitmap_clear();
+    bit_mask = ia_css_kernel_bit_mask(index);
+
+    if (ia_css_is_kernel_bitmap_intersection_empty(bitmap, bit_mask)
+            && !ia_css_is_kernel_bitmap_empty(bit_mask)) {
+        ret = ia_css_kernel_bitmap_union(bitmap, bit_mask);
+    }
+    return ret;
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_kernel_bit_mask(
+    const unsigned int                        index)
+{
+    unsigned int elem_index;
+    unsigned int elem_bit_index;
+    ia_css_kernel_bitmap_t bit_mask = ia_css_kernel_bitmap_clear();
+
+    /* Assert disabled for staging, because some PGs do not satisfy this condition */
+    /* assert(index < IA_CSS_KERNEL_BITMAP_BITS); */
+
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+        "ia_css_kernel_bit_mask(): enter:\n");
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+    if (index < IA_CSS_KERNEL_BITMAP_BITS) {
+        elem_index     = index / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
+        elem_bit_index = index % IA_CSS_KERNEL_BITMAP_ELEM_BITS;
+        assert(elem_index < IA_CSS_KERNEL_BITMAP_NOF_ELEMS);
+
+        bit_mask.data[elem_index] = 1 << elem_bit_index;
+    }
+#else
+    NOT_USED(elem_index);
+    NOT_USED(elem_bit_index);
+    if (index < IA_CSS_KERNEL_BITMAP_BITS) {
+        bit_mask = (ia_css_kernel_bitmap_t)1 << index;
+    }
+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
+    return bit_mask;
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+int ia_css_is_kernel_bitmap_set(
+    const ia_css_kernel_bitmap_t    bitmap,
+    const unsigned int                index)
+{
+    unsigned int elem_index;
+    unsigned int elem_bit_index;
+
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+               "ia_css_is_kernel_bitmap_set(): enter:\n");
+
+    assert(index < IA_CSS_KERNEL_BITMAP_BITS);
+
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+    elem_index     = index / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
+    elem_bit_index = index % IA_CSS_KERNEL_BITMAP_ELEM_BITS;
+    assert(elem_index < IA_CSS_KERNEL_BITMAP_NOF_ELEMS);
+    return (((bitmap.data[elem_index] >> elem_bit_index) & 0x1) == 1);
+#else
+    NOT_USED(elem_index);
+    NOT_USED(elem_bit_index);
+    return (((bitmap >> index) & 0x1) == 1);
+#endif /* IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS */
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_shift(
+    const ia_css_kernel_bitmap_t            bitmap)
+{
+    int i;
+    unsigned int lsb_current_elem = 0;
+    unsigned int lsb_previous_elem = 0;
+    ia_css_kernel_bitmap_t loc_bitmap;
+
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+               "ia_css_kernel_bitmap_shift(): enter:\n");
+
+    loc_bitmap = bitmap;
+
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+    for (i = IA_CSS_KERNEL_BITMAP_NOF_ELEMS - 1; i >= 0; i--) {
+        lsb_current_elem = bitmap.data[i] & 0x01;
+        loc_bitmap.data[i] >>= 1;
+        loc_bitmap.data[i] |= (lsb_previous_elem << (IA_CSS_KERNEL_BITMAP_ELEM_BITS - 1));
+        lsb_previous_elem = lsb_current_elem;
+    }
+#else
+    NOT_USED(i);
+    NOT_USED(lsb_current_elem);
+    NOT_USED(lsb_previous_elem);
+    loc_bitmap >>= 1;
+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
+    return loc_bitmap;
+}
+
+#endif /* __IA_CSS_KERNEL_BITMAP_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_storage_class.h
new file mode 100644
index 000000000000..8b7cd391bd1b
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_storage_class.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+#define __IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+
+#include "storage_class.h"
+
+#ifndef __IA_CSS_KERNEL_BITMAP_INLINE__
+#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
+#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+#else
+#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H STORAGE_CLASS_INLINE
+#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C STORAGE_CLASS_INLINE
+#endif
+
+#endif /* __IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_user_param_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_user_param_types.h
new file mode 100644
index 000000000000..bf02f187c1b4
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_user_param_types.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_KERNEL_USER_PARAM_TYPES_H
+#define __IA_CSS_KERNEL_USER_PARAM_TYPES_H
+
+#include "type_support.h"
+
+#define KERNEL_USER_PARAM_S_PADDING 4
+
+#define SIZE_OF_KERNEL_USER_PARAM_S ( \
+	  (1 * IA_CSS_UINT64_T_BITS) \
+	+ (1 * IA_CSS_UINT32_T_BITS) \
+	+ (4 * IA_CSS_UINT16_T_BITS) \
+	+ (KERNEL_USER_PARAM_S_PADDING * IA_CSS_UINT8_T_BITS))
+
+/** \brief A kernel user parameter object.
+ * Always use ia_css_kernel_user_param_get_descriptor_size or
+ * ia_css_kernel_user_param_get_descriptor_size_using_kernel_info to get the
+ * appropriate size for the kernel user parameter object.
+ *
+ * Use an init function like ia_css_kernel_user_param_init to initialize
+ * the kernel user parameter object.
+ *
+ * Never instantiate this struct in a different way.
+ */
+typedef struct ia_css_kernel_user_param_s {
+	/* Parameter buffer handle attached to the terminal */
+	union {
+		void *p;
+		uint64_t not_used;  /* ensures same struct layout on 64 and 32 bit compilations */
+	} payload_buffer;
+	/* Buffer size */
+	uint32_t payload_buffer_size;
+	/* Points to the variable array of ia_css_kernel_user_param_desc_s */
+	uint16_t kernel_desc_offset;
+	/* Number of kernels in program group */
+	uint16_t kernel_count;
+	/* Number of fragments in frame */
+	uint16_t fragment_count;
+	/* Fragment stride in bytes */
+	uint16_t fragment_stride;
+	/* padding */
+	uint8_t padding[KERNEL_USER_PARAM_S_PADDING];
+} ia_css_kernel_user_param_t;
+
+typedef struct ia_css_kernel_user_param_kernel_desc_s {
+	/* kernel identifier */
+	uint32_t kernel_id;
+	/* Points to the variable array of ia_css_kernel_user_param_cfg_desc_t */
+	uint16_t cfg_desc_offset;
+	/* Number of configurations for this kernel */
+	uint16_t cfg_desc_count;
+} ia_css_kernel_user_param_kernel_desc_t;
+
+typedef struct ia_css_kernel_user_param_cfg_desc_s {
+	/* Offset of the parameter allocation in memory */
+	uint32_t mem_offset;
+	/* Memory allocation size needs of this parameter */
+	uint32_t mem_size;
+} ia_css_kernel_user_param_cfg_desc_t;
+
+/*!
+ * Construction information to construct a kernel user param object.
+ * This type is only used for ia_css_kernel_user_param_init and
+ * ia_css_kernel_user_param_get_descriptor_size_using_kernel_info.
+ */
+typedef struct ia_css_kernel_user_param_kernel_info_s {
+	uint32_t kernel_id;
+	uint16_t section_count;
+	uint32_t *section_sizes; /**< Array of size section_count. Each element
+		encode the size in bytes or a kernel config (section). */
+} ia_css_kernel_user_param_kernel_info_t;
+
+#endif /* __IA_CSS_KERNEL_USER_PARAM_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_param_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_param_storage_class.h
new file mode 100644
index 000000000000..6716c1ec30f2
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_param_storage_class.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PARAM_STORAGE_CLASS_H
+#define __IA_CSS_PARAM_STORAGE_CLASS_H
+
+#include "storage_class.h"
+
+#ifndef __INLINE_PARAMETERS__
+#define IA_CSS_PARAMETERS_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
+#define IA_CSS_PARAMETERS_STORAGE_CLASS_C
+#else
+#define IA_CSS_PARAMETERS_STORAGE_CLASS_H STORAGE_CLASS_INLINE
+#define IA_CSS_PARAMETERS_STORAGE_CLASS_C STORAGE_CLASS_INLINE
+#endif
+
+#endif /* __IA_CSS_PARAM_STORAGE_CLASS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data.h
new file mode 100644
index 000000000000..fc1cd1ce94e0
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data.h
@@ -0,0 +1,449 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PROGRAM_GROUP_DATA_H
+#define __IA_CSS_PROGRAM_GROUP_DATA_H
+
+#include "ia_css_psys_data_storage_class.h"
+
+/*! \file */
+
+/** @file ia_css_program_group_data.h
+ *
+ * Define the data objects that are passed to the process groups
+ * i.e. frames and matrices with their sub-structures
+ *
+ * The data objects are separate from the process group terminal,
+ * although they are stored by value rather than by reference and
+ * make the process group terminal dependendent on its definition
+ *
+ * This frame definition overloads the current CSS frame definition
+ * they are the same object, just a slightly different implementation
+ */
+
+#include <vied_nci_psys_system_global.h>    /* vied_vaddress_t */
+
+#include <type_support.h>
+#include "ia_css_program_group_data_defs.h"    /* ia_css_frame_format_type */
+
+#include "ia_css_terminal_defs.h"
+
+/**
+ * Frame buffer state used for sequencing
+ * (see FAS 5.5.3)
+ *
+ * The buffer can be in DDR or a handle to a stream
+ */
+typedef enum ia_css_buffer_state {
+    IA_CSS_BUFFER_NULL = 0,
+    IA_CSS_BUFFER_UNDEFINED,
+    IA_CSS_BUFFER_EMPTY,
+    IA_CSS_BUFFER_NONEMPTY,
+    IA_CSS_BUFFER_FULL,
+    IA_CSS_N_BUFFER_STATES
+} ia_css_buffer_state_t;
+
+#define IA_CSS_BUFFER_STATE_IN_BITS    32
+
+/**
+ * Pointer state used to signal MMU invalidation
+ */
+typedef enum ia_css_pointer_state {
+    IA_CSS_POINTER_INVALID = 0,
+    IA_CSS_POINTER_VALID,
+    IA_CSS_N_POINTER_STATES
+} ia_css_pointer_state_t;
+
+#define IA_CSS_POINTER_STATE_IN_BITS    32
+
+/**
+ * Access direction needed to select the access port
+ *
+ * @note No known use of any literal in this
+ * enumeration.
+ */
+typedef enum ia_css_access_type {
+    IA_CSS_ACCESS_LOCKED = 0,
+    IA_CSS_ACCESS_READ,
+    IA_CSS_ACCESS_WRITE,
+    IA_CSS_ACCESS_MODIFY,
+    IA_CSS_N_ACCESS_TYPES
+} ia_css_access_type_t;
+
+#define IA_CSS_ACCESS_TYPE_IN_BITS    32
+
+/**
+ * Access attribute needed to select the access port
+ *    - public : snooped
+ *    - private: non-snooped
+ * Naming is a bit awkward, lack of inspiration
+ *
+ * @note No known use of any literal in this
+ * enumeration.
+ */
+typedef enum ia_css_access_scope {
+    IA_CSS_ACCESS_PRIVATE = 0,
+    IA_CSS_ACCESS_PUBLIC,
+    IA_CSS_N_ACCESS_SCOPES
+} ia_css_access_scopes_t;
+
+#define IA_CSS_ACCESS_SCOPES_IN_BITS    32
+
+#define IA_CSS_N_FRAME_PLANES            6
+
+#define IA_CSS_FRAME_FORMAT_BITMAP_BITS    64
+
+typedef uint64_t ia_css_frame_format_bitmap_t;
+
+typedef struct ia_css_param_frame_descriptor_s ia_css_param_frame_descriptor_t;
+typedef struct ia_css_param_frame_s        ia_css_param_frame_t;
+
+typedef struct ia_css_frame_descriptor_s    ia_css_frame_descriptor_t;
+typedef struct ia_css_frame_s                ia_css_frame_t;
+typedef struct ia_css_fragment_descriptor_s    ia_css_fragment_descriptor_t;
+
+typedef struct ia_css_stream_s            ia_css_stream_t;
+
+#define    N_UINT64_IN_STREAM_STRUCT            1
+
+#define    IA_CSS_STREAM_STRUCT_BITS \
+    (N_UINT64_IN_STREAM_STRUCT * 64)
+
+struct ia_css_stream_s {
+    uint64_t dummy;
+};
+
+struct ia_css_param_frame_descriptor_s {
+    uint16_t    size;        /**< Size of the descriptor */
+    uint32_t    buffer_count;    /**< Number of parameter buffers */
+};
+
+struct ia_css_param_frame_s {
+    /** Base virtual addresses to parameters in subsystem virtual
+     * memory space
+     */
+    vied_vaddress_t *data;
+};
+
+#define IA_CSS_N_CMPR_OFFSET_PLANES  IA_CSS_N_FRAME_PLANES
+
+#define N_UINT32_IN_FRAME_DESC_STRUCT \
+    (1 + IA_CSS_N_FRAME_PLANES + IA_CSS_N_CMPR_OFFSET_PLANES + (IA_CSS_N_DATA_DIMENSION - 1))
+#define N_UINT16_IN_FRAME_DESC_STRUCT (1 + IA_CSS_N_DATA_DIMENSION)
+#define N_UINT8_IN_FRAME_DESC_STRUCT 4
+#define N_PADDING_UINT8_IN_FRAME_DESC_STRUCT 2
+
+#define    IA_CSS_FRAME_DESCRIPTOR_STRUCT_BITS \
+    (IA_CSS_FRAME_FORMAT_TYPE_BITS \
+    + (N_UINT32_IN_FRAME_DESC_STRUCT * 32) \
+    + (N_UINT16_IN_FRAME_DESC_STRUCT * 16) \
+    + (N_UINT8_IN_FRAME_DESC_STRUCT * 8) \
+    + (N_PADDING_UINT8_IN_FRAME_DESC_STRUCT * 8))
+
+/**
+ * Structure defining the frame (size and access) properties for
+ * inbuild types only.
+ *
+ * The inbuild types like FourCC, MIPI and CSS private types are supported
+ * by FW all other types are custom types which interpretation must be encoded
+ * on the buffer itself or known by the source and sink
+ */
+struct ia_css_frame_descriptor_s {
+    /** Indicates if this is a generic type or inbuild with
+      * variable size descriptor.
+      */
+    ia_css_frame_format_type_t frame_format_type;
+    /** Number of data planes (pointers) */
+    uint32_t plane_count;
+    /** Plane offsets accounting for fragments */
+    uint32_t plane_offsets[IA_CSS_N_FRAME_PLANES];
+    /** Physical size aspects */
+    uint32_t stride[IA_CSS_N_DATA_DIMENSION - 1];
+    /** Tile status buffer offsets for DEC400 compression */
+    uint32_t ts_offsets[IA_CSS_N_FRAME_PLANES];
+    /** Logical dimensions */
+    uint16_t dimension[IA_CSS_N_DATA_DIMENSION];
+    /** Size of this descriptor */
+    uint16_t size;
+    /** Bits per pixel (meaningful bits, AKA precision) */
+    uint8_t bpp;
+    /** Bits per element (bits required for storage of the pixel in memory) */
+    uint8_t bpe;
+    /** 1 if terminal uses compressed datatype, 0 otherwise */
+    uint8_t is_compressed;
+    /** 1 if pixel data is signed, 0 otherwise */
+    uint8_t is_signed;
+    /** Padding for 64bit alignment */
+    uint8_t padding[N_PADDING_UINT8_IN_FRAME_DESC_STRUCT];
+};
+
+#define    N_UINT32_IN_FRAME_STRUCT        2
+#define    N_PADDING_UINT8_IN_FRAME_STRUCT    4
+
+#define    IA_CSS_FRAME_STRUCT_BITS \
+    (IA_CSS_BUFFER_STATE_IN_BITS \
+    + IA_CSS_ACCESS_TYPE_IN_BITS \
+    + IA_CSS_POINTER_STATE_IN_BITS \
+    + IA_CSS_ACCESS_SCOPES_IN_BITS \
+    + VIED_VADDRESS_BITS \
+    + (N_UINT32_IN_FRAME_STRUCT * 32) \
+    + (N_PADDING_UINT8_IN_FRAME_STRUCT * 8))
+
+/**
+ * Main frame structure holding the main store and auxilary access properties
+ * the "pointer_state" and "access_scope" should be encoded on the
+ * "vied_vaddress_t" type
+ *
+ * @note A number of fields in this structure are either no longer
+ * used, or their use is trivialized, in the current code base.  This is
+ * due to the Persistent Program Group (PPG) concept which separated the
+ * attatchment of frame buffers into a separate structure, the buffer set.
+ * @par Set all unused fields to zero, unless otherwise noted.
+ * @see ia_css_buffer_set_s
+ */
+struct ia_css_frame_s {
+    /** State of the frame for purpose of sequencing.
+     *
+     *  @note This field is apparently a leftover from the pre-PPG
+     *  type of program group and no longer has any real use.
+     *  For PPG's, set to IA_CSS_BUFFER_FULL for input frames and
+     *  IA_CSS_BUFFER_EMPTY for output frames */
+    ia_css_buffer_state_t buffer_state;
+    /** Access direction, may change when buffer state changes.
+     *
+     *  @note Cannot find any use of this. */
+    ia_css_access_type_t access_type;
+    /** State of the pointer for purpose of embedded MMU coherency
+     * @note No known non-trivial use of the field.
+     */
+    ia_css_pointer_state_t pointer_state;
+    /** Access to the pointer for purpose of host cache coherency
+    *  @note Cannot find any use of this. */
+    ia_css_access_scopes_t access_scope;
+    /** Base virtual address to data in IPU subsystem virtual memory space.
+     *  @note No longer used for PPG's */
+    vied_vaddress_t data;
+    /** Index into the array of buffer addresses within the buffer set structure
+     *  which is sent separately. The value at that location replaces the
+     *  "data" field in this structure.  */
+    uint32_t data_index;
+    /** Total buffer allocation size in bytes */
+    uint32_t data_bytes;
+    /** Padding for 64bit alignment */
+    uint8_t padding[N_PADDING_UINT8_IN_FRAME_STRUCT];
+};
+
+#define    N_UINT16_IN_FRAGMENT_DESC_STRUCT    (3 * IA_CSS_N_DATA_DIMENSION)
+#define    N_PADDING_UINT8_IN_FRAGMENT_DESC_STRUCT 4
+
+#define    IA_CSS_FRAGMENT_DESCRIPTOR_STRUCT_BITS \
+    ((N_UINT16_IN_FRAME_DESC_STRUCT * 16) \
+    + (N_PADDING_UINT8_IN_FRAGMENT_DESC_STRUCT * 8))
+
+/**
+ * Structure defining the fragment (size and access) properties.
+ *
+ * All cropping and padding effects are described by the difference between
+ * the frame size and its location and the fragment size(s) and location(s)
+ */
+struct ia_css_fragment_descriptor_s {
+    /** Logical dimensions of the fragment */
+    uint16_t dimension[IA_CSS_N_DATA_DIMENSION];
+    /** Logical location of the fragment in the frame */
+    uint16_t index[IA_CSS_N_DATA_DIMENSION];
+    /** Fractional start (phase) of the fragment in the access unit */
+    uint16_t offset[IA_CSS_N_DATA_DIMENSION];
+    /** Padding for 64bit alignment */
+    uint8_t padding[N_PADDING_UINT8_IN_FRAGMENT_DESC_STRUCT];
+};
+
+/*! Print the frame object to file/stream
+
+ @param    frame[in]            frame object
+ @param    fid[out]            file/stream handle
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+int ia_css_frame_print(
+    const ia_css_frame_t *frame, void *fid);
+
+/*! Get the data buffer handle from the frame object
+
+@param    frame[in]            frame object
+
+@return buffer pointer, VIED_NULL on error
+*/
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+const vied_vaddress_t *ia_css_frame_get_buffer_host_virtual_address(
+    const ia_css_frame_t *frame);
+
+/*! Get the data buffer handle from the frame object
+
+ @param    frame[in]            frame object
+
+ @return buffer pointer, VIED_NULL on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+vied_vaddress_t ia_css_frame_get_buffer(const ia_css_frame_t *frame);
+
+/*! Set the data buffer handle on the frame object
+
+ @param    frame[in]            frame object
+ @param    buffer[in]            buffer pointer
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+int ia_css_frame_set_buffer(
+    ia_css_frame_t *frame, vied_vaddress_t buffer);
+
+/*! Get the data buffer index in the frame object
+
+ @param    frame[in]            frame object
+
+ @return data buffer index on success, -1 on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+int ia_css_frame_get_data_index(
+    const ia_css_frame_t *frame);
+
+/*! Set the data buffer index in the frame object
+
+ @param    frame[in]            frame object
+ @param    data_index[in]            data buffer index
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+int ia_css_frame_set_data_index(
+    ia_css_frame_t *frame,
+    unsigned int data_index);
+
+/*! Set the data buffer size on the frame object
+
+ @param    frame[in]            frame object
+ @param    size[in]            number of data bytes
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+int ia_css_frame_set_data_bytes(
+    ia_css_frame_t *frame, unsigned size);
+
+/*! Get the data buffer state from the frame object
+
+ @param    frame[in]            frame object
+
+ @return buffer state, limit value on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+ia_css_buffer_state_t ia_css_frame_get_buffer_state(
+    const ia_css_frame_t *frame);
+
+/*! Set the data buffer state of the frame object
+
+ @param    frame[in]            frame object
+ @param    buffer_state[in]        buffer state
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+int ia_css_frame_set_buffer_state(ia_css_frame_t *frame,
+    const ia_css_buffer_state_t buffer_state);
+
+/*! Get the data pointer state from the frame object
+
+ @param    frame[in]            frame object
+
+ @return pointer state, limit value on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+ia_css_pointer_state_t ia_css_frame_get_pointer_state(
+    const ia_css_frame_t *frame);
+
+/*! Set the data pointer state of the frame object
+
+ @param    frame[in]            frame object
+ @param    pointer_state[in]        pointer state
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+int ia_css_frame_set_pointer_state(ia_css_frame_t *frame,
+    const ia_css_pointer_state_t pointer_state);
+
+/*! Print the frame descriptor object to file/stream
+
+ @param    frame_descriptor[in]    frame descriptor object
+ @param    fid[out]        file/stream handle
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+int ia_css_frame_descriptor_print(
+    const ia_css_frame_descriptor_t *frame_descriptor, void *fid);
+
+/*! Print the fragment descriptor object to file/stream
+
+ @param    fragment_descriptor[in]    fragment descriptor object
+ @param    fid[out]        file/stream handle
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+int ia_css_fragment_descriptor_print(
+    const ia_css_fragment_descriptor_t *fragment_descriptor, void *fid);
+
+/*! Compute the bitmap for the frame format type
+
+ @param    frame_format_type[in]    frame format type
+
+ @return 0 on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+ia_css_frame_format_bitmap_t ia_css_frame_format_bit_mask(
+    const ia_css_frame_format_type_t frame_format_type);
+
+/*! clear frame format bitmap
+
+ @return cleared bitmap
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+ia_css_frame_format_bitmap_t ia_css_frame_format_bitmap_clear(void);
+
+/*! Compute the size of storage required for the data descriptor object
+ * on a terminal
+ *@param       plane_count[in]    The number of data planes in the buffer
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+size_t ia_css_sizeof_frame_descriptor(
+        const uint8_t plane_count);
+/*! Compute the size of storage required for the kernel parameter descriptor
+ * object on a terminal
+
+ @param    section_count[in]    The number of parameter sections in the buffer
+
+ @return 0 on error
+ */
+extern size_t ia_css_sizeof_kernel_param_descriptor(
+    const uint16_t section_count);
+
+#ifdef __IA_CSS_PSYS_DATA_INLINE__
+#include "ia_css_program_group_data_impl.h"
+#endif /* __IA_CSS_PSYS_DATA_INLINE__ */
+
+#endif /* __IA_CSS_PROGRAM_GROUP_DATA_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_defs.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_defs.h
new file mode 100644
index 000000000000..9d1ddac9d25c
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_defs.h
@@ -0,0 +1,244 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PROGRAM_GROUP_DATA_DEFS_H
+#define __IA_CSS_PROGRAM_GROUP_DATA_DEFS_H
+
+#include "frame_support.h"
+
+/**
+ * Pre-defined frame format
+ *
+ * Those formats have inbuild support of traffic
+ * and access functions
+ *
+ * Note that the formats are for terminals, so there
+ * is no distinction between input and output formats
+ *    - Custom formats with ot without descriptor
+ *    - 4CC formats such as YUV variants
+ *    - MIPI (line) formats as produced by CSI receivers
+ *    - MIPI (sensor) formats such as Bayer or RGBC
+ *    - CSS internal formats (private types)
+ *  - CSS parameters (type 1 - 6)
+ */
+#define IA_CSS_FRAME_FORMAT_TYPE_BITS 32
+typedef enum ia_css_frame_format_type {
+    IA_CSS_DATA_CUSTOM_NO_DESCRIPTOR = 0,
+    IA_CSS_DATA_CUSTOM,
+
+    /** 12 bit YUV 411, Y, UV 2-plane  (8 bit per element) */
+    IA_CSS_DATA_FORMAT_NV11,
+    /** bpp bit YUV 420, Y, U, V 3-plane (bpp/1.5 bpe) */
+    IA_CSS_DATA_FORMAT_YUV420,
+    /** 12 bit YUV 420, Y, V, U 3-plane (8 bit per element) */
+    IA_CSS_DATA_FORMAT_YV12,
+    /** 12 bit YUV 420, Y, UV 2-plane (8 bit per element) */
+    IA_CSS_DATA_FORMAT_NV12,
+    /** 16 bit YUV 420, Y, UV 2-plane (8 bit per element) */
+    IA_CSS_DATA_FORMAT_NV12_16,
+    /** 12 bit YUV 420, Intel proprietary tiled format, TileY */
+    IA_CSS_DATA_FORMAT_NV12_TILEY,
+    /** 12 bit YUV 420, Y, VU 2-plane  (8 bit per element) */
+    IA_CSS_DATA_FORMAT_NV21,
+    /** bpp bit YUV 422, Y, U, V 3-plane (bpp/2 bpe) */
+    IA_CSS_DATA_FORMAT_YUV422,
+    /** 16 bit YUV 422, Y, V, U 3-plane  (8 bit per element) */
+    IA_CSS_DATA_FORMAT_YV16,
+    /** 16 bit YUV 422, Y, UV 2-plane  (8 bit per element) */
+    IA_CSS_DATA_FORMAT_NV16,
+    /** 16 bit YUV 422, Y, VU 2-plane  (8 bit per element) */
+    IA_CSS_DATA_FORMAT_NV61,
+    /** 16 bit YUV 422, UYVY 1-plane interleaved  (8 bit per element) */
+    IA_CSS_DATA_FORMAT_UYVY,
+    /** 16 bit YUV 422, YUYV 1-plane interleaved  (8 bit per element) */
+    IA_CSS_DATA_FORMAT_YUYV,
+    /** bpp bit YUV 444, Y, U, V 3-plane (bpp/3 bpe) */
+    IA_CSS_DATA_FORMAT_YUV444,
+    /** 8 bit monochrome plane */
+    IA_CSS_DATA_FORMAT_Y800,
+
+    /** 5-6-5 bit packed (1-plane) RGB (16bpp, ~5 bpe) */
+    IA_CSS_DATA_FORMAT_RGB565,
+    /** 24 bit RGB, 3 planes  (8 bit per element) */
+    IA_CSS_DATA_FORMAT_RGB888,
+    /** 32 bit RGB-Alpha, 1 plane  (8 bit per element) */
+    IA_CSS_DATA_FORMAT_RGBA888,
+
+    /** bpp bit raw, [[Gr, R];[B, Gb]] 1-plane (bpp == bpe) */
+    IA_CSS_DATA_FORMAT_BAYER_GRBG,
+    /** bpp bit raw, [[R, Gr];[Gb, B]] 1-plane (bpp == bpe) */
+    IA_CSS_DATA_FORMAT_BAYER_RGGB,
+    /** bpp bit raw, [[B, Gb];[Gr, R]] 1-plane (bpp == bpe) */
+    IA_CSS_DATA_FORMAT_BAYER_BGGR,
+    /** bpp bit raw, [[Gb, B];[R, Gr]] 1-plane (bpp == bpe) */
+    IA_CSS_DATA_FORMAT_BAYER_GBRG,
+
+    /** bpp bit (NV12) YUV 420, Y, UV 2-plane derived 3-line,
+     * 2-Y, 1-UV (bpp/1.5 bpe): M420 format
+     */
+    IA_CSS_DATA_FORMAT_YUV420_LINE,
+    /** Deprecated RAW, 1 plane */
+    IA_CSS_DATA_FORMAT_RAW,
+    /** Deprecated RAW, 1 plane, packed */
+    IA_CSS_DATA_FORMAT_RAW_PACKED,
+    /** Internal, for advanced ISP */
+    IA_CSS_DATA_FORMAT_QPLANE6,
+    /** 1D byte stream, used for jpeg 1-plane */
+    IA_CSS_DATA_FORMAT_BINARY_8,
+    /** Deprecated MIPI frame, 1D byte stream 1 plane */
+    IA_CSS_DATA_FORMAT_MIPI,
+    /** 12 bit [[YY];[UYVY]] 1-plane interleaved 2-line
+     * (8 bit per element)
+     */
+    IA_CSS_DATA_FORMAT_MIPI_YUV420_8,
+    /** 15 bit [[YY];[UYVY]] 1-plane interleaved 2-line
+     * (10 bit per element)
+     */
+    IA_CSS_DATA_FORMAT_MIPI_YUV420_10,
+    /** 12 bit [[UY];[VY]] 1-plane interleaved 2-line (8 bit per element) */
+    IA_CSS_DATA_FORMAT_MIPI_LEGACY_YUV420_8,
+
+    /** Type 1-5 parameter, not fragmentable */
+    IA_CSS_DATA_GENERIC_PARAMETER,
+    /** Video stabilisation Type 6 parameter, fragmentable */
+    IA_CSS_DATA_DVS_PARAMETER,
+    /** Video stabilisation Type 6 parameter, coordinates */
+    IA_CSS_DATA_DVS_COORDINATES,
+    /** Dead Pixel correction Type 6 parameter, fragmentable */
+    IA_CSS_DATA_DPC_PARAMETER,
+    /** Lens Shading Correction Type 6 parameter, fragmentable */
+    IA_CSS_DATA_LSC_PARAMETER,
+    /** 3A statistics output HI. */
+    IA_CSS_DATA_S3A_STATISTICS_HI,
+    /** 3A statistics output LO. */
+    IA_CSS_DATA_S3A_STATISTICS_LO,
+    /** histogram output */
+    IA_CSS_DATA_S3A_HISTOGRAM,
+    /** GammaStar grid */
+    IA_CSS_DATA_GAMMASTAR_GRID,
+
+    /** Gr R B Gb Gr R B Gb  in PIXELS  (also called isys interleaved) */
+    IA_CSS_DATA_FORMAT_BAYER_LINE_INTERLEAVED,
+    /** Gr R B Gb Gr R B Gb  in VECTORS (VCC IMAGE, ISP NWAY depentdent) */
+    IA_CSS_DATA_FORMAT_BAYER_VECTORIZED,
+    /** Gr R B Gb 4-planes */
+    IA_CSS_DATA_FORMAT_BAYER_PLANAR,
+    /** Gr R Gr R ... | B Gb B Gb ..  in VECTORS (ISP NWAY depentdent) */
+    IA_CSS_DATA_FORMAT_BAYER_GRBG_VECTORIZED,
+
+    /** 16 bit YUV 420, Y even plane, Y uneven plane,
+     * UV plane vector interleaved
+     */
+    IA_CSS_DATA_FORMAT_YUV420_VECTORIZED,
+    /** 16 bit YUV 420, YYUVYY vector interleaved */
+    IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED,
+
+    /** 12 bit YUV 420, Intel proprietary tiled format, TileYf */
+    IA_CSS_DATA_FORMAT_NV12_TILEYF,
+
+    /** Y samples appear first in the memory. All Y samples are array of WORDs;
+    * even number of lines ;
+    * Surface stride can be larger than the width of Y plane.
+    * This array is followed immediately by chroma array.
+    * Chroma array is an array of WORDs, with interleaved U/V samples.
+    * If the interleaved U/V plane is addresses as an * array of DWORDs,
+    * the least significant word contains U sample. The stride of the
+    * interleaved U/V plane is equal to Y plane. 10 bit data.
+    */
+    IA_CSS_DATA_FORMAT_P010,
+
+    /** MSB aligned version of P010*/
+    IA_CSS_DATA_FORMAT_P010_MSB,
+
+    /** P016/P012 Y samples appear first in the memory.
+    * All Y samples are array of WORDs;
+    * even number of lines ;
+    * Surface stride can be larger than the width of Y plane.
+    * This array is followed immediately by chroma array.
+    * Chroma array is an array of WORDs, with interleaved U/V samples.
+    * If the interleaved U/V plane is addresses as an * array of DWORDs,
+    * the least significant word contains U sample. The stride of the
+    * interleaved U/V plane is equal to Y plane. 12 bit data.
+    */
+    IA_CSS_DATA_FORMAT_P016,
+
+    /** MSB aligned version of P016*/
+    IA_CSS_DATA_FORMAT_P016_MSB,
+
+    /** TILEY representation of P010 LSB-aligned format */
+    IA_CSS_DATA_FORMAT_P010_TILEY,
+
+    /** TILEY representation of P010 MSB-aligned format */
+    IA_CSS_DATA_FORMAT_P010_MSB_TILEY,
+
+    /** TILEY representation of P016 LSB-aligned format */
+    IA_CSS_DATA_FORMAT_P016_TILEY,
+
+    /** TILEY representation of P016 MSB-aligned format*/
+    IA_CSS_DATA_FORMAT_P016_MSB_TILEY,
+
+    /** TILEYf representation of P010*/
+    IA_CSS_DATA_FORMAT_P010_TILEYF,
+
+    /** TILEYf representation of P010 MSB aligned*/
+    IA_CSS_DATA_FORMAT_P010_MSB_TILEYF,
+
+    /** TILEYf representation of P016*/
+    IA_CSS_DATA_FORMAT_P016_TILEYF,
+
+    /** TILEYf representation of P016 MSB aligned*/
+    IA_CSS_DATA_FORMAT_P016_MSB_TILEYF,
+
+    /** consists of L and R PDAF pixel line pairs.
+     * If line n is L pixel line, n+1 will be R pixel line.
+     * Depending on mode - First line can be L or R pixel line and
+     * the line pair sequence can also alternate. 1-plane (bpp == bpe)
+     */
+    IA_CSS_DATA_FORMAT_PAF_NON_INTERLEAVED,
+
+    /** consists of L and R PDAF pixel pairs.
+         * Depending on mode - Pixel pairs can be LRLR.., RLRL.. and
+         * alternating between the above two as well. 1-plane (bpp == bpe) */
+    IA_CSS_DATA_FORMAT_PAF_INTERLEAVED,
+
+    /** bpp bit raw, INFRA-RED (IR) 1-plane (bpp == bpe) */
+    IA_CSS_DATA_FORMAT_IR,
+
+    /** MSB aligned version of P012*/
+    IA_CSS_DATA_FORMAT_P012_MSB,
+
+    /* Each tile is stored in consecutive addresses in DDR.
+     * The scanning walking order within a tile is raster order
+     * (line-by-line).
+     */
+    /* NV12 is a semi-planar (two planes) format: A plane of 8 bit Y samples
+     * followed by an interleaved 8 bit U/V
+     * samples plane.
+     */
+    IA_CSS_DATA_FORMAT_NV12_TILE,
+    /*P010 is similar to NV12, but with 10 bit values,
+     * each stored in a 16b container (msb aligned, 6 lsb are zero).
+     */
+    IA_CSS_DATA_FORMAT_P010_TILE,
+    /* P012 is similar to P010, but with 12 bit values,
+     * each stored in a 16b containers (msb aligned, 4 lsb are zero).
+     */
+    IA_CSS_DATA_FORMAT_P012_TILE,
+
+    IA_CSS_N_FRAME_FORMAT_TYPES
+} ia_css_frame_format_type_t;
+
+#endif /* __IA_CSS_PROGRAM_GROUP_DATA_DEFS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_impl.h
new file mode 100644
index 000000000000..5f1a2856ead4
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_impl.h
@@ -0,0 +1,461 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PROGRAM_GROUP_DATA_IMPL_H
+#define __IA_CSS_PROGRAM_GROUP_DATA_IMPL_H
+
+#include "ia_css_program_group_data.h"
+#include "ia_css_psys_data_trace.h"
+#include <error_support.h>    /* for verifexit */
+#include <assert_support.h>    /* for COMPILATION_ERROR_IF */
+#include <misc_support.h>    /* for NOT_USED */
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+int ia_css_frame_print(
+    const ia_css_frame_t *frame, void *fid)
+{
+    int retval = -1;
+
+    NOT_USED(fid);
+
+    IA_CSS_TRACE_0(PSYSAPI_DATA, INFO, "ia_css_frame_print(): enter:\n");
+
+    verifexit(frame != NULL);
+
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+        "\tbuffer = %d\n", ia_css_frame_get_buffer(frame));
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+        "\tbuffer_state = %d\n", ia_css_frame_get_buffer_state(frame));
+    /* IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\tbuffer_state = %s\n",
+     * ia_css_buffer_state_string(ia_css_frame_get_buffer_state(frame)));
+     */
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+           "\tpointer_state = %d\n", ia_css_frame_get_pointer_state(frame));
+    /* IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\tpointer_state = %s\n",
+     * ia_css_pointer_state_string(ia_css_frame_get_pointer_state(frame)));
+     */
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+        "\tdata_bytes = %d\n", frame->data_bytes);
+
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
+            "ia_css_frame_print failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+const vied_vaddress_t *ia_css_frame_get_buffer_host_virtual_address(
+    const ia_css_frame_t *frame) {
+
+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+        "ia_css_frame_get_buffer_host_virtual_address(): enter:\n");
+
+    verifexit(frame != NULL);
+    return &(frame->data);
+
+EXIT:
+    if (NULL == frame) {
+        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
+            "ia_css_frame_get_buffer_host_virtual_address invalid argument\n");
+    }
+    return NULL;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+vied_vaddress_t    ia_css_frame_get_buffer(
+    const ia_css_frame_t *frame)
+{
+    vied_vaddress_t    buffer = VIED_NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+        "ia_css_frame_get_buffer(): enter:\n");
+
+    verifexit(frame != NULL);
+    buffer = frame->data;
+
+EXIT:
+    if (NULL == frame) {
+        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
+               "ia_css_frame_get_buffer invalid argument\n");
+    }
+    return buffer;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+int ia_css_frame_set_buffer(
+    ia_css_frame_t *frame,
+    vied_vaddress_t buffer)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+        "ia_css_frame_set_buffer(): enter:\n");
+
+    verifexit(frame != NULL);
+    frame->data = buffer;
+
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
+            "ia_css_frame_set_buffer failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+int ia_css_frame_get_data_index(
+    const ia_css_frame_t *frame)
+{
+    int data_index = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+        "ia_css_frame_get_data_index(): enter:\n");
+
+    verifexit(frame != NULL);
+
+    data_index = frame->data_index;
+
+EXIT:
+    if (NULL == frame) {
+        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
+               "ia_css_frame_get_data_index invalid argument\n");
+    }
+    return data_index;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+int ia_css_frame_set_data_index(
+    ia_css_frame_t *frame,
+    unsigned int data_index)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+        "ia_css_frame_set_data_index(): enter:\n");
+
+    verifexit(frame != NULL);
+
+    frame->data_index = data_index;
+
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
+            "ia_css_frame_set_data_index failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+int ia_css_frame_set_data_bytes(
+    ia_css_frame_t *frame,
+    unsigned int size)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+        "ia_css_frame_set_data_bytes(): enter:\n");
+
+    verifexit(frame != NULL);
+    frame->data_bytes = size;
+
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
+            "ia_css_frame_set_data_bytes failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+ia_css_buffer_state_t ia_css_frame_get_buffer_state(
+    const ia_css_frame_t *frame)
+{
+    ia_css_buffer_state_t buffer_state = IA_CSS_N_BUFFER_STATES;
+
+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+        "ia_css_frame_get_buffer_state(): enter:\n");
+
+    verifexit(frame != NULL);
+    buffer_state = frame->buffer_state;
+
+EXIT:
+    if (NULL == frame) {
+        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
+            "ia_css_frame_get_buffer_state invalid argument\n");
+    }
+    return buffer_state;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+int ia_css_frame_set_buffer_state(
+    ia_css_frame_t *frame,
+    const ia_css_buffer_state_t buffer_state)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+        "ia_css_frame_set_buffer_state(): enter:\n");
+
+    verifexit(frame != NULL);
+    frame->buffer_state = buffer_state;
+
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
+            "ia_css_frame_set_buffer_state failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+ia_css_pointer_state_t ia_css_frame_get_pointer_state(
+    const ia_css_frame_t *frame)
+{
+    ia_css_pointer_state_t pointer_state = IA_CSS_N_POINTER_STATES;
+
+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+        "ia_css_frame_get_pointer_state(): enter:\n");
+
+    verifexit(frame != NULL);
+    pointer_state = frame->pointer_state;
+
+EXIT:
+    if (NULL == frame) {
+        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
+            "ia_css_frame_get_pointer_state invalid argument\n");
+    }
+    return pointer_state;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+int ia_css_frame_set_pointer_state(
+    ia_css_frame_t *frame,
+    const ia_css_pointer_state_t pointer_state)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+        "ia_css_frame_set_pointer_state(): enter:\n");
+
+    verifexit(frame != NULL);
+    frame->pointer_state = pointer_state;
+
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
+            "ia_css_frame_set_pointer_state failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+int ia_css_frame_descriptor_print(
+    const ia_css_frame_descriptor_t *frame_descriptor,
+    void *fid)
+{
+    int retval = -1;
+    int i;
+    uint8_t frame_plane_count;
+
+    NOT_USED(fid);
+
+    IA_CSS_TRACE_0(PSYSAPI_DATA, INFO,
+        "ia_css_frame_descriptor_print(): enter:\n");
+
+    COMPILATION_ERROR_IF(IA_CSS_N_DATA_DIMENSION <= 0);
+
+    verifexit(frame_descriptor != NULL);
+
+    IA_CSS_TRACE_0(PSYSAPI_DATA, INFO,
+        "ia_css_frame_descriptor_print(): enter:\n");
+
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+        "\tframe_format_type = %d\n",
+        frame_descriptor->frame_format_type);
+    /* IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\tframe_format_type = %s\n",
+     * ia_css_frame_format_string(frame_descriptor->frame_format_type));
+     */
+
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+        "\tbpp = %d\n", frame_descriptor->bpp);
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+        "\tbpe = %d\n", frame_descriptor->bpe);
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+        "\tis_compressed = %d\n", frame_descriptor->is_compressed);
+
+    frame_plane_count = IA_CSS_N_FRAME_PLANES;
+    /* frame_plane_count =
+     * ia_css_frame_plane_count(frame_descriptor->frame_format_type);
+     */
+
+    verifexit(frame_plane_count > 0);
+
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+        "\tplane_offsets[%d]: [\n", frame_plane_count);
+    for (i = 0; i < (int)frame_plane_count - 1; i++) {
+        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+            "\t%4d,\n", frame_descriptor->plane_offsets[i]);
+    }
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+        "\t%4d ]\n", frame_descriptor->plane_offsets[i]);
+
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+        "\tts_offsets[%d]: [\n", frame_plane_count);
+    for (i = 0; i < (int)frame_plane_count - 1; i++) {
+        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+            "\t%4d,\n", frame_descriptor->ts_offsets[i]);
+    }
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+        "\t%4d ]\n", frame_descriptor->ts_offsets[i]);
+
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+        "\tdimension[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
+    for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
+        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+            "\t%4d,\n", frame_descriptor->dimension[i]);
+    }
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+        "\t%4d }\n", frame_descriptor->dimension[i]);
+
+    COMPILATION_ERROR_IF(0 > (IA_CSS_N_DATA_DIMENSION - 2));
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+        "\tstride[%d] = {\n", IA_CSS_N_DATA_DIMENSION - 1);
+    for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 2; i++) {
+        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+            "\t%4d,\n", frame_descriptor->stride[i]);
+    }
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+        "\t%4d }\n", frame_descriptor->stride[i]);
+
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
+            "ia_css_frame_descriptor_print failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+int ia_css_fragment_descriptor_print(
+    const ia_css_fragment_descriptor_t *fragment_descriptor,
+    void *fid)
+{
+    int retval = -1;
+    int i;
+
+    NOT_USED(fid);
+
+    IA_CSS_TRACE_0(PSYSAPI_DATA, INFO,
+        "ia_css_fragment_descriptor_print(): enter:\n");
+
+    verifexit(fragment_descriptor != NULL);
+
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+        "dimension[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
+    for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
+        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+            "\t%4d,\n", fragment_descriptor->dimension[i]);
+    }
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+        "\t%4d }\n", fragment_descriptor->dimension[i]);
+
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+        "index[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
+    for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
+        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+            "\t%4d,\n", fragment_descriptor->index[i]);
+    }
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+        "\t%4d }\n", fragment_descriptor->index[i]);
+
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+        "offset[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
+    for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
+        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+            "\t%4d,\n", fragment_descriptor->offset[i]);
+    }
+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\t%4d }\n",
+        fragment_descriptor->offset[i]);
+
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
+              "ia_css_fragment_descriptor_print failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+ia_css_frame_format_bitmap_t ia_css_frame_format_bit_mask(
+    const ia_css_frame_format_type_t frame_format_type)
+{
+    ia_css_frame_format_bitmap_t bit_mask = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+        "ia_css_frame_format_bit_mask(): enter:\n");
+
+    if (frame_format_type < IA_CSS_N_FRAME_FORMAT_TYPES) {
+        bit_mask = (ia_css_frame_format_bitmap_t)1 << frame_format_type;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
+            "ia_css_frame_format_bit_mask invalid argument\n");
+    }
+
+    return bit_mask;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+ia_css_frame_format_bitmap_t ia_css_frame_format_bitmap_clear(void)
+{
+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+               "ia_css_frame_format_bitmap_clear(): enter:\n");
+
+    return 0;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+size_t ia_css_sizeof_frame_descriptor(
+        const uint8_t plane_count)
+{
+    size_t size = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+               "ia_css_sizeof_frame_descriptor(): enter:\n");
+
+    verifexit(plane_count > 0);
+    size += sizeof(ia_css_frame_descriptor_t);
+    size += plane_count * sizeof(uint32_t);
+
+EXIT:
+    if (0 == plane_count) {
+        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
+            "ia_css_sizeof_frame_descriptor invalid argument\n");
+    }
+    return size;
+}
+
+#endif /* __IA_CSS_PROGRAM_GROUP_DATA_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.h
new file mode 100644
index 000000000000..a8a155223430
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.h
@@ -0,0 +1,295 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_H
+#define __IA_CSS_PROGRAM_GROUP_PARAM_H
+
+/*! \file */
+
+/** @file ia_css_program_group_param.h
+ *
+ * Define the methods on the program group parameter object that are not part
+ * of a single interface
+ */
+#include <ia_css_program_group_param_types.h>
+
+#include <ia_css_program_group_param.sim.h>
+
+#include <ia_css_kernel_bitmap.h>    /* ia_css_kernel_bitmap_t */
+
+#include <type_support.h>
+
+/*! Get the stored size of the program group parameter object
+
+ @param    param[in]            program group parameter object
+
+ @return size, 0 on error
+ */
+extern size_t ia_css_program_group_param_get_size(
+    const ia_css_program_group_param_t        *param);
+
+/*! initialize program_group_param
+
+ @param    blob[in]    program group parameter object
+ @param    program_count[in]        number of  terminals.
+ @param    terminal_count[in]        number of  terminals.
+ @param    fragment_count[in]        number of  terminals.
+
+ @return 0 if success, else failure.
+ */
+extern int ia_css_program_group_param_init(
+    ia_css_program_group_param_t *blob,
+    const uint8_t    program_count,
+    const uint8_t    terminal_count,
+    const uint16_t    fragment_count,
+    const enum ia_css_frame_format_type *frame_format_types);
+/*! Get the program parameter object from a program group parameter object
+
+ @param    program_group_param[in]        program group parameter object
+ @param    i[in]                program parameter index
+
+ @return program parameter pointer, NULL on error
+ */
+extern ia_css_program_param_t *ia_css_program_group_param_get_program_param(
+    const ia_css_program_group_param_t *param,
+    const int i);
+
+/*! Get the terminal parameter object from a program group parameter object
+
+ @param    program_group_param[in]        program group parameter object
+ @param    i[in]                terminal parameter index
+
+ @return terminal parameter pointer, NULL on error
+ */
+extern ia_css_terminal_param_t *ia_css_program_group_param_get_terminal_param(
+    const ia_css_program_group_param_t *param,
+    const int i);
+
+/*! Get the fragment count from a program group parameter object
+
+ @param    program_group_param[in]        program group parameter object
+
+ @return fragment count, 0 on error
+ */
+extern uint16_t ia_css_program_group_param_get_fragment_count(
+    const ia_css_program_group_param_t        *param);
+
+/*! Get the program count from a program group parameter object
+
+ @param    program_group_param[in]        program group parameter object
+
+ @return program count, 0 on error
+ */
+extern uint8_t ia_css_program_group_param_get_program_count(
+    const ia_css_program_group_param_t        *param);
+
+/*! Get the terminal count from a program group parameter object
+
+ @param    program_group_param[in]        program group parameter object
+
+ @return terminal count, 0 on error
+ */
+extern uint8_t ia_css_program_group_param_get_terminal_count(
+    const ia_css_program_group_param_t        *param);
+
+/*! Set the protocol version in a program group parameter object
+
+ @param    program_group_param[in]        program group parameter object
+ @param    protocol_version[in]        protocol version
+
+ @return nonzero on error
+*/
+extern int
+ia_css_program_group_param_set_protocol_version(
+    ia_css_program_group_param_t *param,
+    uint8_t protocol_version);
+
+/*! Get the protocol version from a program group parameter object
+
+ @param    program_group_param[in]        program group parameter object
+
+ @return protocol version
+*/
+extern uint8_t
+ia_css_program_group_param_get_protocol_version(
+    const ia_css_program_group_param_t *param);
+
+/*! Set the kernel enable bitmap from a program group parameter object
+
+ @param    param[in]            program group parameter object
+ @param    bitmap[in]            kernel enable bitmap
+
+ @return non-zero on error
+ */
+extern int ia_css_program_group_param_set_kernel_enable_bitmap(
+    ia_css_program_group_param_t    *param,
+    const ia_css_kernel_bitmap_t    bitmap);
+
+/*! Get the kernel enable bitmap from a program group parameter object
+
+ @param    program_group_param[in]        program group parameter object
+
+ @return kernel enable bitmap, 0 on error
+*/
+extern ia_css_kernel_bitmap_t
+ia_css_program_group_param_get_kernel_enable_bitmap(
+    const ia_css_program_group_param_t *param);
+
+/*! Get the stored size of the program parameter object
+
+ @param    param[in]            program parameter object
+
+ @return size, 0 on error
+ */
+extern size_t ia_css_program_param_get_size(
+    const ia_css_program_param_t            *param);
+
+/*! Set the kernel enable bitmap from a program parameter object, DEPRECATED
+
+ @param    program_param[in]        program parameter object
+ @param    bitmap[in]            kernel enable bitmap
+
+ @return non-zero on error
+ */
+extern int ia_css_program_param_set_kernel_enable_bitmap(
+    ia_css_program_param_t    *program_param,
+    const ia_css_kernel_bitmap_t    bitmap);
+
+/*! Get the kernel enable bitmap from a program parameter object
+
+ @param    program_param[in]        program parameter object DEPRECATED
+
+ Note: This function returns in fact the kernel enable of the program group
+      parameters
+
+ @return kernel enable bitmap, 0 on error
+ */
+extern ia_css_kernel_bitmap_t ia_css_program_param_get_kernel_enable_bitmap(
+    const ia_css_program_param_t            *param);
+
+/*! Get the stored size of the terminal parameter object
+
+ @param    param[in]            terminal parameter object
+
+ @return size, 0 on error
+ */
+extern size_t ia_css_terminal_param_get_size(
+    const ia_css_terminal_param_t            *param);
+
+/*! Get the kernel enable bitmap from a terminal parameter object
+
+ @param    terminal_param[in]        terminal parameter object
+
+ Note: This function returns in fact the kernel enable of the program group
+       parameters
+
+ @return kernel enable bitmap, 0 on error
+ */
+extern ia_css_kernel_bitmap_t ia_css_terminal_param_get_kernel_enable_bitmap(
+    const ia_css_terminal_param_t            *param);
+
+/*! Get the parent object for this terminal param.
+
+ @param    terminal_param[in]        terminal parameter object
+
+ @return parent program group param object
+ */
+extern ia_css_program_group_param_t *ia_css_terminal_param_get_parent(
+    const ia_css_terminal_param_t            *param);
+
+/*! Get the data format type associated with the terminal.
+
+ @param    terminal_param[in]        terminal parameter object
+
+ @return data format type (ia_css_data_format_type_t)
+ */
+extern ia_css_frame_format_type_t ia_css_terminal_param_get_frame_format_type(
+    const ia_css_terminal_param_t    *terminal_param);
+
+/*! Set the data format type associated with the terminal.
+
+ @param    terminal_param[in]        terminal parameter object
+ @param data_format_type[in]        data format type
+
+ @return non-zero on error.
+ */
+extern int ia_css_terminal_param_set_frame_format_type(
+    ia_css_terminal_param_t    *terminal_param,
+    const ia_css_frame_format_type_t data_format_type);
+
+/*! Get bits per pixel on the frame associated with the terminal.
+
+ @param    terminal_param[in]        terminal parameter object
+
+ @return bits per pixel
+ */
+extern uint8_t ia_css_terminal_param_get_bpp(
+    const ia_css_terminal_param_t    *terminal_param);
+
+/*! Set bits per pixel on the frame associated with the terminal.
+
+ @param    terminal_param[in]        terminal parameter object
+ @param bpp[in]                bits per pixel
+
+ @return non-zero on error.
+ */
+extern int ia_css_terminal_param_set_bpp(
+    ia_css_terminal_param_t    *terminal_param,
+    const uint8_t bpp);
+
+/*! Get dimensions on the frame associated with the terminal.
+
+ @param    terminal_param[in]        terminal parameter object
+ @param    dimensions[out]            dimension array
+
+ @return non-zero on error.
+ */
+extern int ia_css_terminal_param_get_dimensions(
+    const ia_css_terminal_param_t    *terminal_param,
+    uint16_t dimensions[IA_CSS_N_DATA_DIMENSION]);
+
+/*! Set dimensions on the frame associated with the terminal.
+
+ @param    terminal_param[in]        terminal parameter object
+ @param    dimensions[in]            dimension array
+
+ @return non-zero on error.
+ */
+extern int ia_css_terminal_param_set_dimensions(
+    ia_css_terminal_param_t    *terminal_param,
+    const uint16_t dimensions[IA_CSS_N_DATA_DIMENSION]);
+
+/*! Get stride on the frame associated with the terminal.
+
+ @param    terminal_param[in]        terminal parameter object
+
+ @return stride of the frame to be attached.
+ */
+extern uint32_t ia_css_terminal_param_get_stride(
+    const ia_css_terminal_param_t    *terminal_param);
+
+/*! Set stride on the frame associated with the terminal.
+
+ @param    terminal_param[in]        terminal parameter object
+ @param    stride[in]                stride
+
+ @return non-zero on error.
+ */
+extern int ia_css_terminal_param_set_stride(
+    ia_css_terminal_param_t    *terminal_param,
+    const uint32_t stride);
+
+#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.sim.h
new file mode 100644
index 000000000000..820ac6109b81
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.sim.h
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_SIM_H
+#define __IA_CSS_PROGRAM_GROUP_PARAM_SIM_H
+
+/*! \file */
+
+/** @file ia_css_program_group_param.sim.h
+ *
+ * Define the methods on the program group parameter object: Simulation only
+ */
+#include <ia_css_program_group_param_types.h>
+
+#include <ia_css_psys_manifest_types.h>
+
+#include <type_support.h>
+
+/* Simulation */
+
+/*! Create a program group parameter object from specification
+
+ @param    specification[in]        specification (index)
+ @param    manifest[in]            program group manifest
+
+ @return NULL on error
+ */
+extern ia_css_program_group_param_t *ia_css_program_group_param_create(
+    const unsigned int            specification,
+    const ia_css_program_group_manifest_t    *manifest);
+
+/*! Destroy the program group parameter object
+
+ @param    program_group_param[in]        program group parameter object
+
+ @return NULL
+ */
+extern ia_css_program_group_param_t *ia_css_program_group_param_destroy(
+    ia_css_program_group_param_t            *param);
+
+/*! Compute the size of storage required for allocating
+ * the program group parameter object
+
+ @param    program_count[in]    Number of programs in the process group
+ @param    terminal_count[in]    Number of terminals on the process group
+ @param    fragment_count[in]    Number of fragments on the terminals of
+                the process group
+
+ @return 0 on error
+ */
+size_t ia_css_sizeof_program_group_param(
+    const uint8_t    program_count,
+    const uint8_t    terminal_count,
+    const uint16_t    fragment_count);
+
+/*! Allocate (the store of) a program group parameter object
+
+ @param    program_count[in]    Number of programs in the process group
+ @param    terminal_count[in]    Number of terminals on the process group
+ @param    fragment_count[in]    Number of fragments on the terminals of
+                the process group
+
+ @return program group parameter pointer, NULL on error
+ */
+extern ia_css_program_group_param_t *ia_css_program_group_param_alloc(
+    const uint8_t    program_count,
+    const uint8_t    terminal_count,
+    const uint16_t    fragment_count);
+
+/*! Free (the store of) a program group parameter object
+
+ @param    program_group_param[in]        program group parameter object
+
+ @return NULL
+ */
+extern ia_css_program_group_param_t *ia_css_program_group_param_free(
+    ia_css_program_group_param_t            *param);
+
+/*! Print the program group parameter object to file/stream
+
+ @param    param[in]    program group parameter object
+ @param    fid[out]    file/stream handle
+
+ @return < 0 on error
+ */
+extern int ia_css_program_group_param_print(
+    const ia_css_program_group_param_t    *param,
+    void                    *fid);
+
+/*! Allocate (the store of) a program parameter object
+
+ @return program parameter pointer, NULL on error
+ */
+extern ia_css_program_param_t *ia_css_program_param_alloc(void);
+
+/*! Free (the store of) a program parameter object
+
+ @param    param[in]    program parameter object
+
+ @return NULL
+ */
+extern ia_css_program_param_t *ia_css_program_param_free(
+    ia_css_program_param_t                    *param);
+
+/*! Print the program parameter object to file/stream
+
+ @param    param[in]                    program parameter object
+ @param    fid[out]                    file/stream handle
+
+ @return < 0 on error
+ */
+extern int ia_css_program_param_print(
+    const ia_css_program_param_t    *param,
+    void                *fid);
+
+/*! Allocate (the store of) a terminal parameter object
+
+ @return terminal parameter pointer, NULL on error
+ */
+extern ia_css_terminal_param_t *ia_css_terminal_param_alloc(void);
+
+/*! Free (the store of) a terminal parameter object
+
+ @param    param[in]    terminal parameter object
+
+ @return NULL
+ */
+extern ia_css_terminal_param_t *ia_css_terminal_param_free(
+    ia_css_terminal_param_t                    *param);
+
+/*! Print the terminal parameter object to file/stream
+
+ @param    param[in]    terminal parameter object
+ @param    fid[out]    file/stream handle
+
+ @return < 0 on error
+ */
+extern int ia_css_terminal_param_print(
+    const ia_css_terminal_param_t    *param,
+    void                *fid);
+
+#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_SIM_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_private.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_private.h
new file mode 100644
index 000000000000..b03f27c97f3d
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_private.h
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_PRIVATE_H
+#define __IA_CSS_PROGRAM_GROUP_PARAM_PRIVATE_H
+
+#include <ia_css_program_group_param.h>
+#include <ia_css_psys_manifest_types.h>
+#include <ia_css_psys_program_group_manifest.h>
+#include <ia_css_psys_terminal_manifest.h>
+#include <ia_css_kernel_bitmap.h>
+#include <ia_css_program_group_data.h>
+#include <type_support.h>
+
+#define N_PADDING_UINT8_IN_PROGRAM_GROUP_PARAM_STRUCT 7
+#define SIZE_OF_PROGRAM_GROUP_PARAM_STRUCT_IN_BITS \
+    (IA_CSS_KERNEL_BITMAP_BITS \
+    + (3 * IA_CSS_UINT32_T_BITS) \
+    + IA_CSS_UINT16_T_BITS \
+    + (3 * IA_CSS_UINT8_T_BITS) \
+    + (N_PADDING_UINT8_IN_PROGRAM_GROUP_PARAM_STRUCT * IA_CSS_UINT8_T_BITS))
+
+/* tentative; co-design with ISP algorithm */
+struct ia_css_program_group_param_s {
+    /** The enable bits for each individual kernel */
+    ia_css_kernel_bitmap_t kernel_enable_bitmap;
+    /** Size of this structure */
+    uint32_t size;
+    /** Offset of program parameters array from the base of this structure.  See ia_css_program_param_s */
+    uint32_t program_param_offset;
+    /** Offset of terminal parameters array from the base of this structure.  See ia_css_terminal_param_s */
+    uint32_t terminal_param_offset;
+    /** Number of (explicit) fragments to use in a frame */
+    uint16_t fragment_count;
+    /** Number of active programs */
+    uint8_t program_count;
+    /** Number of active terminals */
+    uint8_t terminal_count;
+    /** Program group protocol version */
+    uint8_t protocol_version;
+    uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_GROUP_PARAM_STRUCT];
+};
+
+#define SIZE_OF_PROGRAM_PARAM_STRUCT_IN_BITS \
+    (IA_CSS_KERNEL_BITMAP_BITS \
+    + IA_CSS_UINT32_T_BITS \
+    + IA_CSS_INT32_T_BITS)
+
+/* private */
+struct ia_css_program_param_s {
+    /** Bitmap of kernel encapsulated by this program.  If all of these kernels are
+     *  disabled, the program will be disabled too. */
+    ia_css_kernel_bitmap_t kernel_enable_bitmap;
+    /** Size of this structure */
+    uint32_t size;
+    /** Offset to add to reach parent. This is negative value.*/
+    int32_t parent_offset;
+};
+
+#define SIZE_OF_TERMINAL_PARAM_STRUCT_IN_BITS \
+    (IA_CSS_UINT32_T_BITS \
+    + IA_CSS_FRAME_FORMAT_TYPE_BITS \
+    + IA_CSS_INT32_T_BITS \
+    + (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION) \
+    + (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION) \
+    + (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION) \
+    + IA_CSS_INT32_T_BITS \
+    + IA_CSS_UINT16_T_BITS \
+    + IA_CSS_UINT8_T_BITS \
+    + (IA_CSS_UINT8_T_BITS * 1))
+
+#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_PRIVATE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_types.h
new file mode 100644
index 000000000000..816882cb466f
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_types.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_TYPES_H
+#define __IA_CSS_PROGRAM_GROUP_PARAM_TYPES_H
+
+/*! \file */
+
+/** @file ia_css_program_group_param_types.h
+ *
+ * Define the parameter objects that are necessary to create the process
+ * groups i.e. enable parameters and parameters to set-up frame descriptors
+ */
+
+#include <ia_css_program_group_data.h>
+#include <ia_css_kernel_bitmap.h>    /* ia_css_kernel_bitmap_t */
+#include <ia_css_terminal_defs.h>
+
+#include <type_support.h>
+/*! make this public so that driver can populate,
+ * size, bpp, dimensions for all terminals.
+ *
+ * Currently one API is provided to get frame_format_type.
+ *
+ * frame_format_type is set during ia_css_terminal_param_init().
+ * Value for that is const and binary specific.
+ */
+struct ia_css_terminal_param_s {
+    uint32_t size;    /**< Size of this structure */
+    /** Indicates if this is a generic type or inbuild
+     * with variable size descriptor
+     */
+    ia_css_frame_format_type_t frame_format_type;
+    /** offset to add to reach parent. This is negative value.*/
+    int32_t parent_offset;
+    uint16_t dimensions[IA_CSS_N_DATA_DIMENSION];/**< Logical dimensions */
+    /** Mapping to the index field of the terminal descriptor */
+    uint16_t index[IA_CSS_N_DATA_DIMENSION];
+    /** Logical fragment dimension,
+     * TODO: fragment dimensions can be different per fragment
+     */
+    uint16_t fragment_dimensions[IA_CSS_N_DATA_DIMENSION];
+    uint32_t stride;/**< Stride (buffer width) of a frame in bytes */
+    uint16_t offset;/**< Offset in bytes to first fragment */
+    uint8_t bpp;    /**< Bits per pixel.  The number of bits with significant data. */
+    uint8_t bpe;    /**< Bits per element  The number of bits required to store the pixel.  Must be >= bpp. */
+};
+
+typedef struct ia_css_program_group_param_s    ia_css_program_group_param_t;
+typedef struct ia_css_program_param_s        ia_css_program_param_t;
+typedef struct ia_css_terminal_param_s        ia_css_terminal_param_t;
+
+#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_buffer_set.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_buffer_set.h
new file mode 100644
index 000000000000..8e5816c6fd7f
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_buffer_set.h
@@ -0,0 +1,290 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_BUFFER_SET_H
+#define __IA_CSS_PSYS_BUFFER_SET_H
+
+#include "ia_css_base_types.h"
+#include "ia_css_psys_dynamic_storage_class.h"
+#include "ia_css_psys_process_types.h"
+#include "ia_css_terminal_types.h"
+#include "ia_css_kernel_bitmap.h"
+#include "ia_css_rbm.h"
+
+#define N_UINT64_IN_BUFFER_SET_STRUCT        1
+#define N_UINT16_IN_BUFFER_SET_STRUCT        1
+#define N_UINT8_IN_BUFFER_SET_STRUCT        1
+#define N_PADDING_UINT8_IN_BUFFER_SET_STRUCT    1
+#define SIZE_OF_BUFFER_SET \
+    (N_UINT64_IN_BUFFER_SET_STRUCT * IA_CSS_UINT64_T_BITS \
+    + IA_CSS_KERNEL_BITMAP_BITS \
+    + IA_CSS_KERNEL_BITMAP_BITS \
+    + IA_CSS_KERNEL_BITMAP_BITS \
+    + IA_CSS_RBM_BITS \
+    + VIED_VADDRESS_BITS \
+    + VIED_VADDRESS_BITS \
+    + N_UINT16_IN_BUFFER_SET_STRUCT * IA_CSS_UINT16_T_BITS \
+    + N_UINT8_IN_BUFFER_SET_STRUCT * IA_CSS_UINT8_T_BITS \
+    + N_PADDING_UINT8_IN_BUFFER_SET_STRUCT * IA_CSS_UINT8_T_BITS)
+
+typedef struct ia_css_buffer_set_s ia_css_buffer_set_t;
+
+struct ia_css_buffer_set_s {
+    /** Token for user context reference */
+    uint64_t token;
+    /** Enable bits for each individual kernel
+     * For integration, all 0's should be treated as uninitialized and
+     * assume all processes are enabled */
+    ia_css_kernel_bitmap_t kernel_enable_bitmap;
+    /** Enable bits for each individual terminals per call */
+    ia_css_kernel_bitmap_t terminal_enable_bitmap;
+    /** Enable bits for each individual routing per call */
+    ia_css_kernel_bitmap_t routing_enable_bitmap;
+    /** Enable bits for routing per call */
+    ia_css_rbm_t rbm;
+    /** IPU virtual address of this buffer set */
+    vied_vaddress_t ipu_virtual_address;
+    /** IPU virtual address of the process group corresponding to this buffer set */
+    vied_vaddress_t process_group_handle;
+    /** Number of terminal buffer addresses in this structure */
+    uint16_t terminal_count;
+    /** Frame id to associate with this buffer set */
+    uint8_t frame_counter;
+    /** Padding for 64bit alignment */
+    uint8_t padding[N_PADDING_UINT8_IN_BUFFER_SET_STRUCT];
+};
+
+#define N_PADDING_UINT8_IN_DYNAMIC_TERMINAL_DESCRIPTOR_STRUCT    3
+#define SIZE_OF_DYNAMIC_TERMINAL_DESCRIPTOR \
+    VIED_VADDRESS_BITS \
+    + ( 1 * IA_CSS_UINT8_T_BITS) \
+    + ( N_PADDING_UINT8_IN_DYNAMIC_TERMINAL_DESCRIPTOR_STRUCT * IA_CSS_UINT8_T_BITS)
+
+typedef struct ia_css_dynamic_terminal_descriptor_s ia_css_dynamic_terminal_descriptor_t;
+struct ia_css_dynamic_terminal_descriptor_s {
+    /** Terminal buffer virtual address */
+    vied_vaddress_t virtual_buffer_address;
+    /** Per-frame compression control, boolean semantics */
+    uint8_t enable_compression;
+    /** Padding for 64bit alignment */
+    uint8_t padding[N_PADDING_UINT8_IN_DYNAMIC_TERMINAL_DESCRIPTOR_STRUCT];
+};
+
+/*! Construct a buffer set object at specified location
+
+ @param    buffer_set_mem[in]    memory location to create buffer set object
+ @param    process_group[in]    process group corresponding to this buffer set
+ @param    frame_counter[in]    frame number for this buffer set object
+
+ @return pointer to buffer set object on success, NULL on error
+ */
+ia_css_buffer_set_t *ia_css_buffer_set_create(
+    void *buffer_set_mem,
+    const ia_css_process_group_t *process_group,
+    const unsigned int frame_counter);
+
+/*! Compute size (in bytes) required for full buffer set object
+
+ @param    process_group[in]    process group corresponding to this buffer set
+
+ @return size in bytes of buffer set object on success, 0 on error
+ */
+size_t ia_css_sizeof_buffer_set(
+    const ia_css_process_group_t *process_group);
+
+/*! Set a buffer address in a buffer set object
+
+ @param    buffer_set[in]        buffer set object to set buffer in
+ @param    terminal_index[in]    terminal index to use as a reference between
+                buffer and terminal
+ @param    buffer[in]        buffer address to store
+
+ @return 0 on success, -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_buffer_set_set_buffer(
+    ia_css_buffer_set_t *buffer_set,
+    const unsigned int terminal_index,
+    const vied_vaddress_t buffer);
+
+/*! Get virtual buffer address from a buffer set object and terminal object by
+   resolving the index used
+
+ @param    buffer_set[in]        buffer set object to get buffer from
+ @param    terminal[in]        terminal object to get buffer of
+
+ @return virtual buffer address on success, VIED_NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_vaddress_t ia_css_buffer_set_get_buffer(
+    const ia_css_buffer_set_t *buffer_set,
+    const ia_css_terminal_t *terminal);
+
+/*! Set ipu virtual address of a buffer set object within the buffer set object
+
+ @param    buffer_set[in]        buffer set object to set ipu address in
+ @param    ipu_vaddress[in]    ipu virtual address of the buffer set object
+
+ @return 0 on success, -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_buffer_set_set_ipu_address(
+    ia_css_buffer_set_t *buffer_set,
+    const vied_vaddress_t ipu_vaddress);
+
+/*! Get ipu virtual address from a buffer set object
+
+ @param    buffer_set[in]        buffer set object to get ipu address from
+
+ @return virtual buffer set address on success, VIED_NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_vaddress_t ia_css_buffer_set_get_ipu_address(
+    const ia_css_buffer_set_t *buffer_set);
+
+/*! Set kernel enable bitmap of a buffer set object within the buffer set object
+
+ @param    buffer_set[in]            buffer set object to set kernel enable bitmap in
+ @param    kernel_enable_bitmap[in]    kernel enable bitmap of the buffer set object
+
+ @return 0 on success, -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_buffer_set_set_kernel_enable_bitmap(
+    ia_css_buffer_set_t *buffer_set,
+    const ia_css_kernel_bitmap_t kernel_enable_bitmap);
+
+/*! Get kernel enable bitmap from a buffer set object
+
+ @param    buffer_set[in]        buffer set object to get kernel enable bitmap from
+
+ @return buffer set kernel enable bitmap on success, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_buffer_set_get_kernel_enable_bitmap(
+    const ia_css_buffer_set_t *buffer_set);
+
+/*! Set terminal enable bitmap of a buffer set object within the buffer set object
+
+ @param    buffer_set[in]            buffer set object to set kernel enable bitmap in
+ @param    kernel_enable_bitmap[in]    kernel enable bitmap of the buffer set object
+
+ @return 0 on success, -1 on error
+
+ @todo New for POC
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_buffer_set_set_terminal_enable_bitmap(
+    ia_css_buffer_set_t *buffer_set,
+    const ia_css_kernel_bitmap_t terminal_enable_bitmap);
+
+/*! Get terminal enable bitmap from a buffer set object
+
+ @param    buffer_set[in]        buffer set object to get kernel enable bitmap from
+
+ @return buffer set terminal enable bitmap on success, 0 on error
+
+ @todo New for POC
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_buffer_set_get_terminal_enable_bitmap(
+    const ia_css_buffer_set_t *buffer_set);
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_buffer_set_set_routing_enable_bitmap(
+    ia_css_buffer_set_t *buffer_set,
+    const ia_css_kernel_bitmap_t terminal_enable_bitmap);
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_buffer_set_get_routing_enable_bitmap(
+    const ia_css_buffer_set_t *buffer_set);
+
+/*! Set Routing BitMap of a buffer set object within the buffer set object
+
+ @param    buffer_set[in]            buffer set object to set kernel enable bitmap in
+ @param    kernel_enable_bitmap[in]    kernel enable bitmap of the buffer set object
+
+ @return 0 on success, -1 on error
+
+ @todo New for POC
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_buffer_set_set_rbm(
+    ia_css_buffer_set_t *buffer_set,
+    const ia_css_rbm_t rbm);
+
+/*! Get Routing BitMap from a buffer set object
+
+ @param    buffer_set[in]        buffer set object to get kernel enable bitmap from
+
+ @return buffer set terminal enable bitmap on success, 0 on error
+
+ @todo New for POC
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_rbm_t ia_css_buffer_set_get_rbm(
+    const ia_css_buffer_set_t *buffer_set);
+
+/*! Set process group handle in a buffer set object
+
+ @param    buffer_set[in]            buffer set object to set handle in
+ @param    process_group_handle[in]    process group handle of the buffer set
+                    object
+
+ @return 0 on success, -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_buffer_set_set_process_group_handle(
+    ia_css_buffer_set_t *buffer_set,
+    const vied_vaddress_t process_group_handle);
+
+/*! Get process group handle from a buffer set object
+
+ @param    buffer_set[in]        buffer set object to get handle from
+
+ @return virtual process group address on success, VIED_NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_vaddress_t ia_css_buffer_set_get_process_group_handle(
+    const ia_css_buffer_set_t *buffer_set);
+
+/*! Set token of a buffer set object within the buffer set object
+
+ @param    buffer_set[in]        buffer set object to set ipu address in
+ @param    token[in]        token of the buffer set object
+
+ @return 0 on success, -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_buffer_set_set_token(
+    ia_css_buffer_set_t *buffer_set,
+    const uint64_t token);
+
+/*! Get token from a buffer set object
+
+ @param    buffer_set[in]        buffer set object to get token from
+
+ @return token on success, NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint64_t ia_css_buffer_set_get_token(
+    const ia_css_buffer_set_t *buffer_set);
+
+#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
+#include "ia_css_psys_buffer_set_impl.h"
+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
+
+#endif /* __IA_CSS_PSYS_BUFFER_SET_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_storage_class.h
new file mode 100644
index 000000000000..5721d46d2cff
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_storage_class.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+#define __IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+
+#include "storage_class.h"
+
+#ifndef __IA_CSS_PSYS_DATA_INLINE__
+#define IA_CSS_PSYS_DATA_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
+#define IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+#else
+#define IA_CSS_PSYS_DATA_STORAGE_CLASS_H STORAGE_CLASS_INLINE
+#define IA_CSS_PSYS_DATA_STORAGE_CLASS_C STORAGE_CLASS_INLINE
+#endif
+
+#endif /* __IA_CSS_PSYS_DATA_STORAGE_CLASS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_trace.h
new file mode 100644
index 000000000000..fc2e10251601
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_trace.h
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_DATA_TRACE_H
+#define __IA_CSS_PSYS_DATA_TRACE_H
+
+#include "ia_css_psysapi_trace.h"
+
+#define PSYS_DATA_TRACE_LEVEL_CONFIG_DEFAULT    PSYSAPI_TRACE_LOG_LEVEL_OFF
+
+/* Default sub-module tracing config */
+#if (!defined(PSYSAPI_DATA_TRACING_OVERRIDE))
+     #define PSYS_DATA_TRACE_LEVEL_CONFIG PSYS_DATA_TRACE_LEVEL_CONFIG_DEFAULT
+#endif
+
+/* Module/sub-module specific trace setting will be used if
+ * the trace level is not specified from the module or
+  PSYSAPI_DATA_TRACING_OVERRIDE is defined
+ */
+#if (defined(PSYSAPI_DATA_TRACING_OVERRIDE))
+    /* Module/sub-module specific trace setting */
+    #if PSYSAPI_DATA_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
+        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
+        #define PSYSAPI_DATA_TRACE_METHOD \
+            IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_DATA_TRACE_LEVEL_INFO \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
+            IA_CSS_TRACE_LEVEL_DISABLED
+    #elif PSYSAPI_DATA_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
+        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
+        #define PSYSAPI_DATA_TRACE_METHOD \
+            IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_DATA_TRACE_LEVEL_INFO \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
+            IA_CSS_TRACE_LEVEL_DISABLED
+    #elif PSYSAPI_DATA_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
+        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
+        #define PSYSAPI_DATA_TRACE_METHOD \
+            IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_DATA_TRACE_LEVEL_INFO \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
+            IA_CSS_TRACE_LEVEL_ENABLED
+    #else
+        #error "No PSYSAPI_DATA Tracing level defined"
+    #endif
+#else
+    /* Inherit Module trace setting */
+    #define PSYSAPI_DATA_TRACE_METHOD \
+        PSYSAPI_TRACE_METHOD
+    #define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
+        PSYSAPI_TRACE_LEVEL_ASSERT
+    #define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
+        PSYSAPI_TRACE_LEVEL_ERROR
+    #define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
+        PSYSAPI_TRACE_LEVEL_WARNING
+    #define PSYSAPI_DATA_TRACE_LEVEL_INFO \
+        PSYSAPI_TRACE_LEVEL_INFO
+    #define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
+        PSYSAPI_TRACE_LEVEL_DEBUG
+    #define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
+        PSYSAPI_TRACE_LEVEL_VERBOSE
+#endif
+
+#endif /* __IA_CSS_PSYSAPI_DATA_TRACE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_storage_class.h
new file mode 100644
index 000000000000..4aab0d4b9916
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_storage_class.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+#define __IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+
+#include "storage_class.h"
+
+#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
+#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
+#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+#else
+#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H STORAGE_CLASS_INLINE
+#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C STORAGE_CLASS_INLINE
+#endif
+
+#endif /* __IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_trace.h
new file mode 100644
index 000000000000..5c3323d24546
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_trace.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_DYNAMIC_TRACE_H
+#define __IA_CSS_PSYS_DYNAMIC_TRACE_H
+
+#include "ia_css_psysapi_trace.h"
+
+#define PSYS_DYNAMIC_TRACE_LEVEL_CONFIG_DEFAULT    PSYSAPI_TRACE_LOG_LEVEL_OFF
+
+/* Default sub-module tracing config */
+#if (!defined(PSYSAPI_DYNAMIC_TRACING_OVERRIDE))
+     #define PSYS_DYNAMIC_TRACE_LEVEL_CONFIG \
+        PSYS_DYNAMIC_TRACE_LEVEL_CONFIG_DEFAULT
+#endif
+
+/* Module/sub-module specific trace setting will be used if
+ * the trace level is not specified from the module or
+  PSYSAPI_DYNAMIC_TRACING_OVERRIDE is defined
+ */
+#if (defined(PSYSAPI_DYNAMIC_TRACING_OVERRIDE))
+    /* Module/sub-module specific trace setting */
+    #if PSYSAPI_DYNAMIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
+        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
+        #define PSYSAPI_DYNAMIC_TRACE_METHOD \
+            IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
+            IA_CSS_TRACE_LEVEL_DISABLED
+    #elif PSYSAPI_DYNAMIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
+        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
+        #define PSYSAPI_DYNAMIC_TRACE_METHOD \
+            IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
+            IA_CSS_TRACE_LEVEL_DISABLED
+    #elif PSYSAPI_DYNAMIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
+        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
+        #define PSYSAPI_DYNAMIC_TRACE_METHOD \
+            IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
+            IA_CSS_TRACE_LEVEL_ENABLED
+    #else
+        #error "No PSYSAPI_DATA Tracing level defined"
+    #endif
+#else
+    /* Inherit Module trace setting */
+    #define PSYSAPI_DYNAMIC_TRACE_METHOD \
+        PSYSAPI_TRACE_METHOD
+    #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
+        PSYSAPI_TRACE_LEVEL_ASSERT
+    #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
+        PSYSAPI_TRACE_LEVEL_ERROR
+    #define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
+        PSYSAPI_TRACE_LEVEL_WARNING
+    #define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
+        PSYSAPI_TRACE_LEVEL_INFO
+    #define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
+        PSYSAPI_TRACE_LEVEL_DEBUG
+    #define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
+        PSYSAPI_TRACE_LEVEL_VERBOSE
+#endif
+
+#endif /* __IA_CSS_PSYSAPI_DYNAMIC_TRACE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_kernel_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_kernel_trace.h
new file mode 100644
index 000000000000..2a90e8121a34
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_kernel_trace.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_KERNEL_TRACE_H
+#define __IA_CSS_PSYS_KERNEL_TRACE_H
+
+#include "ia_css_psysapi_trace.h"
+
+#define PSYS_KERNEL_TRACE_LEVEL_CONFIG_DEFAULT    PSYSAPI_TRACE_LOG_LEVEL_OFF
+
+/* Default sub-module tracing config */
+#if (!defined(PSYSAPI_KERNEL_TRACING_OVERRIDE))
+     #define PSYS_KERNEL_TRACE_LEVEL_CONFIG \
+        PSYS_KERNEL_TRACE_LEVEL_CONFIG_DEFAULT
+#endif
+
+/* Module/sub-module specific trace setting will be used if
+ * the trace level is not specified from the module or
+  PSYSAPI_KERNEL_TRACING_OVERRIDE is defined
+ */
+#if (defined(PSYSAPI_KERNEL_TRACING_OVERRIDE))
+    /* Module/sub-module specific trace setting */
+    #if PSYSAPI_KERNEL_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
+        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
+        #define PSYSAPI_KERNEL_TRACE_METHOD \
+            IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
+            IA_CSS_TRACE_LEVEL_DISABLED
+    #elif PSYSAPI_KERNEL_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
+        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
+        #define PSYSAPI_KERNEL_TRACE_METHOD \
+            IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
+            IA_CSS_TRACE_LEVEL_DISABLED
+    #elif PSYSAPI_KERNEL_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
+        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
+        #define PSYSAPI_KERNEL_TRACE_METHOD \
+            IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
+            IA_CSS_TRACE_LEVEL_ENABLED
+    #else
+        #error "No PSYSAPI_DATA Tracing level defined"
+    #endif
+#else
+    /* Inherit Module trace setting */
+    #define PSYSAPI_KERNEL_TRACE_METHOD \
+        PSYSAPI_TRACE_METHOD
+    #define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
+        PSYSAPI_TRACE_LEVEL_ASSERT
+    #define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
+        PSYSAPI_TRACE_LEVEL_ERROR
+    #define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
+        PSYSAPI_TRACE_LEVEL_WARNING
+    #define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
+        PSYSAPI_TRACE_LEVEL_INFO
+    #define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
+        PSYSAPI_TRACE_LEVEL_DEBUG
+    #define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
+        PSYSAPI_TRACE_LEVEL_VERBOSE
+#endif
+
+#endif /* __IA_CSS_PSYSAPI_KERNEL_TRACE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_manifest_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_manifest_types.h
new file mode 100644
index 000000000000..bd7bf4eec326
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_manifest_types.h
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_MANIFEST_TYPES_H
+#define __IA_CSS_PSYS_MANIFEST_TYPES_H
+
+/*! \file */
+
+/** @file ia_css_psys_manifest_types.h
+ *
+ * The types belonging to the terminal/program/
+ * program group manifest static module
+ */
+
+#include <type_support.h>
+#include "vied_nci_psys_resource_model.h"
+
+/**
+ * @addtogroup group_psysapi
+ * @{
+ */
+
+/** This value is used in the manifest to indicate that the resource
+ * offset field must be ignored and the resource is relocatable
+ */
+#define IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE ((vied_nci_resource_size_t)(-1))
+
+#define IA_CSS_CONNECTION_BITMAP_BITS 8
+typedef uint8_t ia_css_connection_bitmap_t;
+
+#define IA_CSS_CONNECTION_TYPE_BITS 32
+
+/** Describes the tranfer method of data between terminals */
+typedef enum ia_css_connection_type {
+    /** The data buffer must be fully written to main memory by the producer
+     *  before it can be read by the consumer */
+    IA_CSS_CONNECTION_MEMORY = 0,
+    /** The data transfer is a (watermark) queued stream over main memory.
+     *  The consumer may begin reading data before the data
+     *  buffer is completely written in a controlled manner. */
+    IA_CSS_CONNECTION_MEMORY_STREAM,
+    /** The data transfer is via device ports connected such that no data
+     *  is read or written to main memory. */
+    IA_CSS_CONNECTION_STREAM,
+    IA_CSS_N_CONNECTION_TYPES
+} ia_css_connection_type_t;
+
+#define IA_CSS_PROGRAM_TYPE_BITS 8
+typedef enum ia_css_program_type {
+    IA_CSS_PROGRAM_TYPE_SINGULAR = 0,
+    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB,
+    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER,
+    IA_CSS_PROGRAM_TYPE_PARALLEL_SUB,
+    IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER,
+    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB,
+    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER,
+/*
+ * Future extension; A bitmap coding starts making more sense
+ *
+    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB_PARALLEL_SUB,
+    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB_PARALLEL_SUPER,
+    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER_PARALLEL_SUB,
+    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER_PARALLEL_SUPER,
+ */
+    IA_CSS_N_PROGRAM_TYPES
+} ia_css_program_type_t;
+
+#define IA_CSS_PROGRAM_GROUP_ID_BITS 32
+typedef uint32_t ia_css_program_group_ID_t;
+#define IA_CSS_PROGRAM_ID_BITS 8
+typedef uint8_t ia_css_program_ID_t;
+
+#define IA_CSS_PROGRAM_INVALID_ID ((uint8_t)(-1))
+#define IA_CSS_PROGRAM_GROUP_INVALID_ID ((uint32_t)(-1))
+
+typedef struct ia_css_program_group_manifest_s
+ia_css_program_group_manifest_t;
+typedef struct ia_css_program_manifest_s
+ia_css_program_manifest_t;
+typedef struct ia_css_program_manifest_ext_s
+ia_css_program_manifest_ext_t;
+typedef struct ia_css_data_terminal_manifest_s
+ia_css_data_terminal_manifest_t;
+
+/* ============ Program Control Init Terminal Manifest - START ============ */
+typedef struct ia_css_program_control_init_manifest_program_desc_s
+    ia_css_program_control_init_manifest_program_desc_t;
+
+typedef struct ia_css_program_control_init_terminal_manifest_s
+    ia_css_program_control_init_terminal_manifest_t;
+/* ============ Program Control Init Terminal Manifest - END ============ */
+
+/** @} */
+
+#endif /* __IA_CSS_PSYS_MANIFEST_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_param_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_param_trace.h
new file mode 100644
index 000000000000..688ccd0ad23a
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_param_trace.h
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PARAM_TRACE_H
+#define __IA_CSS_PSYS_PARAM_TRACE_H
+
+#include "ia_css_psysapi_trace.h"
+
+#define PSYS_PARAM_TRACE_LEVEL_CONFIG_DEFAULT    PSYSAPI_TRACE_LOG_LEVEL_OFF
+
+/* Default sub-module tracing config */
+#if (!defined(PSYSAPI_PARAM_TRACING_OVERRIDE))
+     #define PSYS_PARAM_TRACE_LEVEL_CONFIG PSYS_PARAM_TRACE_LEVEL_CONFIG_DEFAULT
+#endif
+
+/* Module/sub-module specific trace setting will be used if
+ * the trace level is not specified from the module or
+  PSYSAPI_PARAM_TRACING_OVERRIDE is defined
+ */
+#if (defined(PSYSAPI_PARAM_TRACING_OVERRIDE))
+    /* Module/sub-module specific trace setting */
+    #if PSYSAPI_PARAM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
+        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
+        #define PSYSAPI_PARAM_TRACE_METHOD \
+            IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
+            IA_CSS_TRACE_LEVEL_DISABLED
+    #elif PSYSAPI_PARAM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
+        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
+        #define PSYSAPI_PARAM_TRACE_METHOD \
+            IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
+            IA_CSS_TRACE_LEVEL_DISABLED
+    #elif PSYSAPI_PARAM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
+        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
+        #define PSYSAPI_PARAM_TRACE_METHOD \
+            IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
+            IA_CSS_TRACE_LEVEL_ENABLED
+    #else
+        #error "No PSYSAPI_DATA Tracing level defined"
+    #endif
+#else
+    /* Inherit Module trace setting */
+    #define PSYSAPI_PARAM_TRACE_METHOD \
+        PSYSAPI_TRACE_METHOD
+    #define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
+        PSYSAPI_TRACE_LEVEL_ASSERT
+    #define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
+        PSYSAPI_TRACE_LEVEL_ERROR
+    #define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
+        PSYSAPI_TRACE_LEVEL_WARNING
+    #define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
+        PSYSAPI_TRACE_LEVEL_INFO
+    #define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
+        PSYSAPI_TRACE_LEVEL_DEBUG
+    #define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
+        PSYSAPI_TRACE_LEVEL_VERBOSE
+#endif
+
+#endif /* __IA_CSS_PSYSAPI_PARAM_TRACE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_private_pg_data.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_private_pg_data.h
new file mode 100644
index 000000000000..743de9d9edf3
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_private_pg_data.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PRIVATE_PG_DATA_H
+#define __IA_CSS_PSYS_PRIVATE_PG_DATA_H
+
+#include "ipu_device_acb_devices.h"
+#include "ipu_device_gp_devices.h"
+#include "type_support.h"
+
+#define PRIV_CONF_INVALID    0xFF
+#define MAX_INPUT_BUFFER    (2)
+#define MAX_OUTPUT_BUFFER    (2)
+
+struct ia_css_psys_pg_buffer_information_s {
+    unsigned int link_id; /* Terminal the buffer is connected to */
+    unsigned int buffer_base_addr;
+    unsigned int bpe;
+    unsigned int buffer_width;
+    unsigned int buffer_height;
+    unsigned int num_of_buffers;
+    unsigned int dfm_port_addr;
+};
+
+typedef struct ia_css_psys_pg_buffer_information_s ia_css_psys_pg_buffer_information_t;
+
+typedef struct {
+    uint8_t in_select; /**< corresponds to type nci_acb_port_t  0 = ISP, 1 = Acc */
+    uint8_t out_select;  /**< corresponds to type nci_acb_port_t  0 = ISP, 1 = Acc */
+} ia_css_psys_private_pg_data_acb_t;
+
+struct ia_css_psys_private_pg_data {
+    ia_css_psys_private_pg_data_acb_t acb_route[IPU_DEVICE_ACB_NUM_ACB];
+    uint8_t psa_mux_conf[IPU_DEVICE_GP_PSA_MUX_NUM_MUX];
+    uint8_t isa_mux_conf[IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX];
+    ia_css_psys_pg_buffer_information_t input_buffer_info[MAX_INPUT_BUFFER];
+    ia_css_psys_pg_buffer_information_t output_buffer_info[MAX_OUTPUT_BUFFER];
+};
+
+#endif /* __IA_CSS_PSYS_PRIVATE_PG_DATA_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.h
new file mode 100644
index 000000000000..1e2b04e6269f
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.h
@@ -0,0 +1,395 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_H
+#define __IA_CSS_PSYS_PROCESS_H
+
+/*! \file */
+
+/** @file ia_css_psys_process.h
+ *
+ * Define the methods on the process object that are not part of
+ * a single interface
+ */
+
+#include <ia_css_psys_process_types.h>
+#include <ia_css_psys_dynamic_storage_class.h>
+
+#include <vied_nci_psys_system_global.h>
+
+#include <type_support.h>                    /* uint8_t */
+
+/*
+ * Creation
+ */
+#include <ia_css_psys_process.hsys.user.h>
+
+/*
+ * Internal resources
+ */
+#include <ia_css_psys_process.hsys.kernel.h>
+
+/*
+ * Process manager
+ */
+#include <ia_css_psys_process.psys.h>
+
+/*
+ * Command processor
+ */
+
+/*! Execute a command locally or send it to be processed remotely
+
+ @param    process[in]    process object
+ @param    cmd[in]        command
+
+ @return < 0 on invalid argument(s) or process state
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_cmd(
+    ia_css_process_t *process,
+    const ia_css_process_cmd_t cmd);
+
+/*! Get the internal memory offset of the process object
+
+ @param    process[in]    process object
+ @param    mem_id[in]    memory id
+
+ @return internal memory offset,
+    IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
+*/
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_process_get_int_mem_offset(
+    const ia_css_process_t *process,
+    const vied_nci_mem_type_ID_t mem_id);
+
+/*! Get the external memory offset of the process object
+
+ @param    process[in]    process object
+ @param    mem_id[in]    memory id
+
+ @return external memory offset,
+    IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
+*/
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_process_get_ext_mem_offset(
+    const ia_css_process_t *process,
+    const vied_nci_mem_type_ID_t mem_type_id);
+
+/*! Get the stored size of the process object
+
+ @param    process[in]    process object
+
+ @return size, 0 on invalid argument
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+size_t ia_css_process_get_size(const ia_css_process_t *process);
+
+/*! Get the (pointer to) the process group parent of the process object
+
+ @param    process[in]    process object
+
+ @return the pointer to the parent, NULL on invalid argument
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_process_group_t *ia_css_process_get_parent(
+    const ia_css_process_t *process);
+
+/*! Set the (pointer to) the process group parent of the process object
+
+ @param    process[in]    process object
+ @param    parent[in]    (pointer to the) process group parent object
+
+ @return < 0 on invalid argument(s)
+ */
+extern int ia_css_process_set_parent(
+    ia_css_process_t *process,
+    ia_css_process_group_t *parent);
+
+/*! Get the unique ID of program used by the process object
+
+ @param    process[in]    process object
+
+ @return ID, 0 on invalid argument
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_program_ID_t ia_css_process_get_program_ID(
+    const ia_css_process_t *process);
+
+/*! Get the state of the process object
+
+ @param    process[in]    process object
+
+ @return state, limit value (IA_CSS_N_PROCESS_STATES) on invalid argument
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_process_state_t ia_css_process_get_state(
+    const ia_css_process_t *process);
+
+/*! Set the state of the process object
+
+ @param    process[in]    process object
+ @param    state[in]    state of the process
+
+ @return < 0 on invalid argument
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_set_state(
+    ia_css_process_t *process,
+    ia_css_process_state_t state);
+
+/*! Get the assigned cell of the the process object
+
+ @param    process[in]    process object
+
+ @return cell ID, limit value (VIED_NCI_N_CELL_ID) on invalid argument
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_cell_ID_t ia_css_process_get_cell(
+    const ia_css_process_t *process);
+
+/*! Get the number of cells the process object depends on
+
+ @param    process[in]    process object
+
+ @return number of cells
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_process_get_cell_dependency_count(
+    const ia_css_process_t *process);
+
+/*! Get the number of terminals the process object depends on
+
+ @param    process[in]    process object
+
+ @return number of terminals
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_process_get_terminal_dependency_count(
+    const ia_css_process_t *process);
+
+/*! Set n-th cell dependency of a process object
+
+ @param    process[in]    Process object
+ @param    dep_index[in]    dep index
+ @param    id[in]        dep id
+
+ @return < 0 on invalid process argument
+ */
+extern int ia_css_process_set_cell_dependency(
+    const ia_css_process_t *process,
+    const unsigned int dep_index,
+    const vied_nci_resource_id_t id);
+
+/*! Get n-th cell dependency of a process object
+
+ @param    process[in]    Process object
+ @param    cell_num[in]    n-th cell
+
+ @return n-th cell dependency,
+    IA_CSS_PROCESS_INVALID_DEPENDENCY on invalid argument(s)
+*/
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_resource_id_t ia_css_process_get_cell_dependency(
+    const ia_css_process_t *process,
+    const unsigned int cell_num);
+
+/*! Set n-th terminal dependency of a process object
+
+ @param    process[in]    Process object
+ @param    dep_index[in]    dep index
+ @param    id[in]        dep id
+
+ @return < 0 on on invalid argument(s)
+ */
+extern int ia_css_process_set_terminal_dependency(
+    const ia_css_process_t *process,
+    const unsigned int dep_index,
+    const vied_nci_resource_id_t id);
+
+/*! Get n-th terminal dependency of a process object
+
+ @param    process[in]        Process object
+ @param    terminal_num[in]    n-th cell
+
+ @return n-th terminal dependency,
+    IA_CSS_PROCESS_INVALID_DEPENDENCY on invalid argument(s)
+*/
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_process_get_terminal_dependency(
+    const ia_css_process_t *process,
+    const unsigned int terminal_num);
+
+#if HAS_DFM
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t* ia_css_process_get_dfm_port_bitmap_ptr(
+    ia_css_process_t *process);
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t* ia_css_process_get_dfm_active_port_bitmap_ptr(
+    ia_css_process_t *process);
+#endif
+
+/*! Get the cells bitmap of the the process object
+
+ @param    process[in]    process object
+
+ @return process cells bitmap
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t ia_css_process_get_cells_bitmap(
+    const ia_css_process_t *process);
+
+/*! Sets the dfm device resource allocation bitmap of
+ * the process object
+
+ @param    process[in]    process object
+ @param    dfm_dev_id[in]    dfm device id
+ @param bitmap[in]    resource bitmap
+
+ @return < 0 on invalid argument(s) or process state
+ */
+int ia_css_process_set_dfm_port_bitmap(
+    ia_css_process_t *process,
+    const vied_nci_dev_dfm_id_t dfm_dev_id,
+    const vied_nci_resource_bitmap_t bitmap);
+
+/*! Sets the active dfm ports bitmap of
+ * the process object
+
+ @param    process[in]    process object
+ @param    dfm_dev_id[in]    dfm device id
+ @param bitmap[in]    active ports bitmap
+
+ @return < 0 on invalid argument(s) or process state
+ */
+int ia_css_process_set_dfm_active_port_bitmap(
+    ia_css_process_t *process,
+    const vied_nci_dev_dfm_id_t dfm_dev_id,
+    const vied_nci_resource_bitmap_t bitmap);
+
+#if HAS_DFM
+/*! Get the dfm port bitmap of the the process object
+
+ @param    process[in]    process object
+ @param    dfm_res_id    dfm resource id
+
+ @return bitmap of all DFM ports used by process, corresponding to the input dfm resource id
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t ia_css_process_get_dfm_port_bitmap(
+    const ia_css_process_t *process,
+    vied_nci_dev_dfm_id_t  dfm_res_id);
+#endif
+/*! Get the dfm active port bitmap of the the process object
+
+ @param    process[in]    process object
+ @param    dfm_res_id[in]    dfm resource id
+
+ @return bitmap of all active DFM ports used by the process, corresponding to the input
+ dfm resource id
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t ia_css_process_get_dfm_active_port_bitmap(
+    const ia_css_process_t *process,
+    vied_nci_dev_dfm_id_t  dfm_res_id);
+
+/*! Sets the cells bitmap of
+ * the process object
+
+ @param    process[in]    process object
+ @param bitmap[in]    bitmap
+
+ @return < 0 on invalid argument(s) or process state
+ */
+int ia_css_process_set_cells_bitmap(
+    ia_css_process_t *process,
+    const vied_nci_resource_bitmap_t bitmap);
+
+#if VIED_NCI_N_DEV_CHN_ID > 0
+/*! Get the device channel id-n resource allocation offset of the process object
+
+ @param    process[in]    process object
+ @param    dev_chn_id[in]    channel id
+
+ @return resource offset, IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_process_get_dev_chn(
+    const ia_css_process_t *process,
+    const vied_nci_dev_chn_ID_t dev_chn_id);
+#endif
+/*! Get the ext mem type-n resource id of the the process object
+
+ @param    process[in]    process object
+ @param    mem_type[in]    mem type
+
+ @return resource offset, IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_mem_ID_t ia_css_process_get_ext_mem_id(
+    const ia_css_process_t *process,
+    const vied_nci_mem_type_ID_t mem_type);
+
+/*! Sets the device channel id-n resource allocation offset of
+ * the process object
+
+ @param    process[in]    process object
+ @param    dev_chn_id[in]    channel id
+ @param offset[in]    resource offset
+
+ @return < 0 on invalid argument(s) or process state
+ */
+int ia_css_process_set_dev_chn(
+    ia_css_process_t *process,
+    const vied_nci_dev_chn_ID_t dev_chn_id,
+    const vied_nci_resource_size_t offset);
+
+/*! Boolean test if the process object type is valid
+
+ @param    process[in]    process object
+ @param    p_manifest[in]    program manifest
+
+ @return true if the process object is correct, false on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_is_process_valid(
+    const ia_css_process_t *process,
+    const ia_css_program_manifest_t *p_manifest);
+
+/*! Gets the program_idx from the process object
+
+ @param    process[in] process object
+
+ @return program index
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_process_get_program_idx(
+    const ia_css_process_t *process);
+
+/*! Returns the process extension (ONLY ALLOWED TO BE USED BY FIRMWARE).
+ * @param process[in] process object
+ * @return process entension, NULL if there is none.
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_process_ext_t *ia_css_process_get_extension(
+    const ia_css_process_t *process);
+
+#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
+#include "ia_css_psys_process_impl.h"
+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
+
+#endif /* __IA_CSS_PSYS_PROCESS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.kernel.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.kernel.h
new file mode 100644
index 000000000000..2ef42d15aef7
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.kernel.h
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_HSYS_KERNEL_H
+#define __IA_CSS_PSYS_PROCESS_HSYS_KERNEL_H
+
+/**
+ * @file ia_css_psys_process.hsys.kernel.h
+ *
+ * Define the methods on the process object: Hsys kernel interface
+ */
+
+#include <ia_css_psys_process_types.h>
+
+#include <vied_nci_psys_system_global.h>
+
+/*
+ * Internal resources
+ */
+
+/*!
+ * @brief Clear all resource (offset) specifications
+ *
+ * @param[in]    process                process object
+ *
+ * @return < 0 on error
+ * @ingroup group_psysapi_process_host_kernel
+ */
+extern int ia_css_process_clear_all(ia_css_process_t *process);
+
+/*!
+ * @brief Set the cell ID resource specification
+ *
+ * @param[in]    process                process object
+ * @param[in]    cell_id                cell ID
+ *
+ * @return < 0 on error
+ * @ingroup group_psysapi_process_host_kernel
+ */
+extern int ia_css_process_set_cell(
+    ia_css_process_t                    *process,
+    const vied_nci_cell_ID_t                cell_id);
+
+/*!
+ * @brief Clear cell ID resource specification
+ *
+ * @param[in]    process                process object
+ * @return < 0 on error
+ * @ingroup group_psysapi_process_host_kernel
+ */
+extern int ia_css_process_clear_cell(ia_css_process_t *process);
+
+/*!
+ * @brief Set the memory resource (offset) specification for a memory
+ * that belongs to the cell that is assigned to the process.
+ *
+ * @param[in]    process                process object
+ * @param[in]    mem_type_id            mem type ID
+ * @param[in]    offset                offset
+ *
+ * @pre The cell ID must be set
+ * @return < 0 on error
+ * @ingroup group_psysapi_process_host_kernel
+ */
+extern int ia_css_process_set_int_mem(
+    ia_css_process_t        *process,
+    const    vied_nci_mem_type_ID_t    mem_type_id,
+    const vied_nci_resource_size_t    offset);
+
+/*!
+ * @brief Clear the memory resource (offset) specification for a memory
+ * type that belongs to the cell that is assigned to the process.
+ *
+ * @param[in]    process                process object
+ * @param[in]    mem_id                mem ID
+ *
+ * @pre The cell ID must be set
+ * @return < 0 on error
+ * @ingroup group_psysapi_process_host_kernel
+ */
+extern int ia_css_process_clear_int_mem(
+    ia_css_process_t        *process,
+    const vied_nci_mem_type_ID_t    mem_type_id);
+
+/*!
+ * @brief Set the memory resource (offset) specification for a memory
+ * that does not belong to the cell that is assigned to the process.
+ *
+ * @param[in]    process                process object
+ * @param[in]    mem_type_id                mem type ID
+ * @param[in]    offset                offset
+ *
+ * @pre The cell ID must be set
+ * @return < 0 on error
+ * @ingroup group_psysapi_process_host_kernel
+ */
+extern int ia_css_process_set_ext_mem(
+    ia_css_process_t        *process,
+    const vied_nci_mem_ID_t        mem_id,
+    const vied_nci_resource_size_t    offset);
+
+/*!
+ * @brief Clear the memory resource (offset) specification for a memory
+ * type that does not belong to the cell that is assigned to the process.
+ *
+ * @param[in]    process                process object
+ * @param[in]    mem_id                mem ID
+ *
+ * Precondition: The cell ID must be set
+ *
+ * @return < 0 on error
+ * @ingroup group_psysapi_process_host_kernel
+ */
+extern int ia_css_process_clear_ext_mem(
+    ia_css_process_t        *process,
+    const vied_nci_mem_type_ID_t    mem_type_id);
+
+/*!
+ * @brief Set a device channel resource (offset) specification.
+ *
+ * @param[in]    process                process object
+ * @param[in]    dev_chn_id            device channel ID
+ * @param[in]    offset                offset
+ *
+ * @return < 0 on error
+ * @ingroup group_psysapi_process_host_kernel
+ */
+extern int ia_css_process_set_dev_chn(
+    ia_css_process_t        *process,
+    const vied_nci_dev_chn_ID_t    dev_chn_id,
+    const vied_nci_resource_size_t    offset);
+
+/*!
+ * @brief Clear a device channel resource (offset) specification
+ *
+ * @param[in]    process                process object
+ * @param[in]    dev_chn_id            device channel ID
+ *
+ * @return < 0 on error
+ * @ingroup group_psysapi_process_host_kernel
+ */
+extern int ia_css_process_clear_dev_chn(
+    ia_css_process_t        *process,
+    const vied_nci_dev_chn_ID_t    dev_chn_id);
+
+#endif /* __IA_CSS_PSYS_PROCESS_HSYS_KERNEL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.user.h
new file mode 100644
index 000000000000..8c45d7735ea2
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.user.h
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_HSYS_USER_H
+#define __IA_CSS_PSYS_PROCESS_HSYS_USER_H
+
+/**
+ *  @file ia_css_psys_process.hsys.user.h
+ *
+ *  Define the methods on the process object: Hsys user interface
+ */
+
+#include <ia_css_program_group_param.h>        /* ia_css_program_param_t */
+
+#include <ia_css_psys_process_types.h>
+#include <ia_css_psys_manifest_types.h>
+
+#include <type_support.h>                    /* uint8_t */
+
+/*
+ * Creation
+ */
+
+/*!
+ * @brief Compute the size of storage required for allocating the process object.
+ *
+ * @param [in]    manifest            program manifest
+ * @param [in]    param                program parameters
+ *
+ * @return 0 on error
+ * @ingroup group_psysapi_process_host_user
+ */
+extern size_t ia_css_sizeof_process(
+    const ia_css_program_manifest_t            *manifest,
+    const ia_css_program_param_t            *param);
+
+/*!
+ * @brief Create the process object
+ *
+ * @param [in]    raw_mem                pre allocated memory
+ * @param [in]    manifest            program manifest
+ * @param [in]    param                program parameters
+ *
+ * @return NULL on error
+ * @ingroup group_psysapi_process_host_user
+ */
+extern ia_css_process_t *ia_css_process_create(
+    void                *raw_mem,
+    const ia_css_program_manifest_t    *manifest,
+    const ia_css_program_param_t    *param,
+    const uint32_t            program_idx);
+
+/*!
+ * @brief Destroy (the storage of) the process object
+ *
+ * @param [in]    process                process object
+ *
+ * @return NULL
+ * @ingroup group_psysapi_process_host_user
+ */
+extern ia_css_process_t *ia_css_process_destroy(
+    ia_css_process_t    *process);
+
+/*
+ * Access functions
+ */
+
+/*!
+ * @brief Print the process object to file/stream
+ *
+ * @param [in]    process                process object
+ * @param [out]    fid                file/stream handle
+ *
+ * @return < 0 on error
+ * @ingroup group_psysapi_process_host_user
+ */
+extern int ia_css_process_print(
+    const ia_css_process_t    *process,
+    void            *fid);
+
+#endif /* __IA_CSS_PSYS_PROCESS_HSYS_USER_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.psys.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.psys.h
new file mode 100644
index 000000000000..a208fdff1d61
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.psys.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_PSYS_H
+#define __IA_CSS_PSYS_PROCESS_PSYS_H
+
+/*! \file */
+
+/** @file ia_css_psys_process.psys.h
+ *
+ * Define the methods on the process object: Psys embedded interface
+ */
+
+#include <ia_css_psys_process_types.h>
+
+/*
+ * Process manager
+ */
+
+/*! Acquire the resources specificed in process object
+
+ @param    process[in]                process object
+
+ Postcondition: This is a try process if any of the
+ resources is not available, all succesfully acquired
+ ones will be release and the function will return an
+ error
+
+ @return < 0 on error
+ */
+extern int ia_css_process_acquire(ia_css_process_t *process);
+
+/*! Release the resources specificed in process object
+
+ @param    process[in]                process object
+
+ @return < 0 on error
+ */
+extern int ia_css_process_release(ia_css_process_t *process);
+
+#endif /* __IA_CSS_PSYS_PROCESS_PSYS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.h
new file mode 100644
index 000000000000..6bcea8925adf
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.h
@@ -0,0 +1,487 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_H
+#define __IA_CSS_PSYS_PROCESS_GROUP_H
+
+/*! \file */
+
+/** @file ia_css_psys_process_group.h
+ *
+ * Define the methods on the process object that are not part of
+ * a single interface
+ */
+#include "ia_css_rbm.h"
+
+#include <ia_css_psys_process_types.h>
+#include <ia_css_psys_dynamic_storage_class.h>
+
+#include <type_support.h>                    /* uint8_t */
+
+/*
+ * Creation
+ */
+#include <ia_css_psys_process_group.hsys.user.h>
+
+/*
+ * Registration of user contexts / callback info
+ * External resources
+ * Sequencing resources
+ */
+#include <ia_css_psys_process_group.hsys.kernel.h>
+
+/*
+ * Dispatcher
+ */
+#include <ia_css_psys_process_group.psys.h>
+
+/*
+ * Access to sub-structure handles / fields
+ */
+
+#include "ia_css_terminal.h"
+
+#include "ia_css_terminal_manifest_base_types.h"
+#include "ia_css_terminal_manifest_types.h"
+
+/*! Get the number of fragments on the process group
+
+ @param    process_group[in]        process group object
+
+ Note: Future change is to have a fragment count per
+ independent subgraph
+
+ @return the fragment count, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint16_t ia_css_process_group_get_fragment_count(
+    const ia_css_process_group_t        *process_group);
+
+/*! Get the fragment state on the process group
+
+ @param     process_group[in]        process group object
+ @param     fragment_state[in]        current fragment of processing
+
+ @return -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_get_fragment_state(
+    const ia_css_process_group_t        *process_group,
+    uint16_t                *fragment_state);
+
+/*! Set the fragment state on the process group
+
+ @param    process_group[in]        process group object
+ @param    fragment_state[in]        current fragment of processing
+
+ @return -1 on error
+  */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_set_fragment_state(
+    ia_css_process_group_t            *process_group,
+    uint16_t                fragment_state);
+
+/*! Get the number of processes on the process group
+
+ @param    process_group[in]        process group object
+
+ @return the process count, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_process_group_get_process_count(
+    const ia_css_process_group_t        *process_group);
+
+/*! Get the number of terminals on the process group
+
+ @param    process_group[in]        process group object
+
+ Note: Future change is to have a terminal count per
+ independent subgraph
+
+ @return the terminal count, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_process_group_get_terminal_count(
+    const ia_css_process_group_t        *process_group);
+
+/*! Get the PSYS server init time in cycles
+
+ @param    process_group[in]        process group object
+
+ @return PSYS server init time, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_process_group_get_psys_server_init_cycles(
+    const ia_css_process_group_t            *process_group);
+
+/*! \deprecated this is old and will get removed */
+/*! Get the PG load start timestamp
+
+ @param    process_group[in]        process group object
+
+ @return PG load start timestamp, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_process_group_get_pg_load_start_ts(
+    const ia_css_process_group_t            *process_group);
+
+/*! Get the PG load time in cycles
+
+ @param    process_group[in]        process group object
+
+ @return PG load time in cycles, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_process_group_get_pg_load_cycles(
+    const ia_css_process_group_t            *process_group);
+
+/*! Get the PG init time in cycles
+
+ @param    process_group[in]        process group object
+
+ @return PG init time in cycles, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_process_group_get_pg_init_cycles(
+    const ia_css_process_group_t            *process_group);
+
+/*! Get the PG processing time in cycles
+
+ @param    process_group[in]        process group object
+
+ @return PG processing time in cycles, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_process_group_get_pg_processing_cycles(
+    const ia_css_process_group_t            *process_group);
+
+/*! Get the PG next frame init time in cycles
+
+ @param    process_group[in]        process group object
+
+ @return PG processing time in cycles, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_process_group_get_pg_next_frame_init_cycles(
+    const ia_css_process_group_t            *process_group);
+
+/*! Get the PG complete time in cycles
+
+ @param    process_group[in]        process group object
+
+ @return PG processing time in cycles, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_process_group_get_pg_complete_cycles(
+    const ia_css_process_group_t            *process_group);
+
+/*! Get the (pointer to) the <terminal type> terminal of the process group object
+
+ @param    process_group[in]               process group object
+ @param    terminal_type[in]               terminal type of terminal
+
+ @return the pointer to the terminal, NULL on error
+ */
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_terminal_t *ia_css_process_group_get_terminal_from_type(
+        const ia_css_process_group_t *process_group,
+        const ia_css_terminal_type_t terminal_type);
+
+/*! Get the (pointer to) the <terminal type> terminal of the process group object
+ * for terminals which have only a single instance
+ * (cached in, cached out, program, program_ctrl_init)
+
+ @param    process_group[in]               process group object
+ @param    terminal_type[in]               terminal type of terminal
+
+ @return the pointer to the terminal, NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+const ia_css_terminal_t *ia_css_process_group_get_single_instance_terminal(
+    const ia_css_process_group_t     *process_group,
+    ia_css_terminal_type_t        term_type);
+
+/*! Get the (pointer to) the manifest indexed terminal of the process group object
+
+ @param    process_group[in]        process group object
+ @param    manifest_idx[in]        index of the terminal in manifest
+
+ @return the pointer to the terminal, NULL on error
+ */
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_terminal_t *ia_css_process_group_get_manifest_idx_terminal(
+    const ia_css_process_group_t *process_grp,
+    const unsigned int manifest_idx);
+
+/*! Get the (pointer to) the indexed terminal of the process group object
+
+ @param    process_group[in]        process group object
+ @param    terminal_index[in]        index of the terminal
+
+ @return the pointer to the terminal, NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_terminal_t *ia_css_process_group_get_terminal(
+    const ia_css_process_group_t        *process_group,
+    const unsigned int            terminal_index);
+
+/*! Get the (pointer to) the indexed process of the process group object
+
+ @param    process_group[in]        process group object
+ @param    process_index[in]        index of the process
+
+ @return the pointer to the process, NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_process_t *ia_css_process_group_get_process(
+    const ia_css_process_group_t        *process_group,
+    const unsigned int            process_index);
+
+/*! Get the stored size of the process group object
+
+ @param    process_group[in]                process group object
+
+ @return size, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+size_t ia_css_process_group_get_size(
+    const ia_css_process_group_t        *process_group);
+
+/*! Get the state of the the process group object
+
+ @param    process_group[in]        process group object
+
+ @return state, limit value on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_process_group_state_t ia_css_process_group_get_state(
+    const ia_css_process_group_t        *process_group);
+
+/*! Get the unique ID of program group used by the process group object
+
+ @param    process_group[in]        process group object
+
+ @return ID, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_program_group_ID_t ia_css_process_group_get_program_group_ID(
+    const ia_css_process_group_t        *process_group);
+
+/*! Get the resource bitmap of the process group
+
+ @param    process_group[in]        process group object
+
+ @return the reource bitmap
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t ia_css_process_group_get_resource_bitmap(
+    const ia_css_process_group_t        *process_group);
+
+/*! Set the resource bitmap of the process group
+
+ @param    process_group[in]        process group object
+ @param    resource_bitmap[in]        the resource bitmap
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_set_resource_bitmap(
+    ia_css_process_group_t            *process_group,
+    const vied_nci_resource_bitmap_t    resource_bitmap);
+
+/*! Get the kernel bitmap of the the process group object
+
+ @param    process_group[in] process group object
+
+ @return process group kernel bitmap
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_process_group_get_kernel_bitmap(
+    const ia_css_process_group_t *process_group);
+
+/*! Get the routing bitmap of the process group
+
+ @param    process_group[in]   process group object
+
+ @return routing bitmap (pointer)
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+const ia_css_rbm_t *ia_css_process_group_get_routing_bitmap(
+    const ia_css_process_group_t *process_group);
+
+/*! Set the routing bitmap of the process group
+
+ @param    process_group[in]   process group object
+ @param    rbm[in]                routing bitmap
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_set_routing_bitmap(
+    ia_css_process_group_t *process_group,
+    const ia_css_rbm_t rbm);
+
+/*! Get IPU virtual address of process group
+
+ @param     process_group[in]        process group object
+ @param     ipu_vaddress[in/out]    process group ipu virtual address
+
+ @return -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_get_ipu_vaddress(
+    const ia_css_process_group_t        *process_group,
+    vied_vaddress_t            *ipu_vaddress);
+
+/*! Set IPU virtual address of process group
+
+ @param    process_group[in]        process group object
+ @param    ipu_vaddress[in]        process group ipu address
+
+ @return -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_set_ipu_vaddress(
+    ia_css_process_group_t            *process_group,
+    vied_vaddress_t            ipu_vaddress);
+
+/*! Get protocol version used by a process group
+
+ @param    process_group[in]        process group object
+
+ @return invalid protocol version on error
+
+ @todo Add new protocol version for IPU7.  Defer this for now,
+ because it will create a LOT of disruption.
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_process_group_get_protocol_version(
+    const ia_css_process_group_t *process_group);
+
+/*! Get base queue id used by a process group
+
+ @param    process_group[in]        process group object
+
+ @return -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_process_group_get_base_queue_id(
+    ia_css_process_group_t *process_group);
+
+/*! Set base queue id used by a process group
+
+ @param    process_group[in]        process group object
+ @param    queue_id[in]            process group queue id
+
+ @return invalid queue id on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_set_base_queue_id(
+    ia_css_process_group_t *process_group,
+    uint8_t queue_id);
+
+/*! Get number of queues used by a process group
+
+ @param    process_group[in]        process group object
+
+ @return invalid number of queues (0) on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_process_group_get_num_queues(
+    ia_css_process_group_t *process_group);
+
+/*! Set number of queues used by a process group
+
+ @param    process_group[in]        process group object
+ @param    num_queues[in]            process group number of queues
+
+ @return -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_set_num_queues(
+    ia_css_process_group_t *process_group,
+    uint8_t num_queues);
+
+/*! Set error handling enable flag used by process group
+
+ @param    process_group[in]        process group object
+ @param    error_handling_enable[in]    flag to control error handling
+
+ @return -1 on error, 0 on success
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_set_error_handling_enable(
+    ia_css_process_group_t *process_group,
+    const bool error_handling_enable);
+
+/*! Get the error handling enable flag associated to the process group
+
+ @param    process_group[in]        process group object
+
+ @return error_handlnig_enable flag of the process group. On error UINT8_MAX
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_process_group_get_error_handling_enable(
+    const ia_css_process_group_t *process_group);
+
+/** Return true if the process group requires vector processor (i.e. DSP)
+ *  resources  */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_process_group_has_vp(const ia_css_process_group_t *process_group);
+
+/*! Check if terminal is enabled based on kernel enable bitmap
+
+ @param    terminal_manifest[in]        terminal manifest object
+ @param    enable_bitmap[in]        kernel enable bitmap
+
+ @return true if enabled, false if not enabled
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_process_group_is_terminal_enabled(
+    const ia_css_terminal_manifest_t *terminal_manifest,
+    ia_css_kernel_bitmap_t enable_bitmap);
+
+/*! Check if data terminal is enabled based on kernel enable bitmap
+
+ @param    data_term_manifest[in]        data terminal manifest object
+ @param    enable_bitmap[in]        kernel enable bitmap
+
+ @return true if enabled, false if not enabled
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_process_group_is_data_terminal_enabled(
+    const ia_css_data_terminal_manifest_t    *data_term_manifest,
+    ia_css_kernel_bitmap_t enable_bitmap);
+
+/*! Check if spatial terminal is enabled based on kernel enable bitmap
+
+ @param    spatial_term_man[in]    spatial    terminal manifest object
+ @param    enable_bitmap[in]        kernel enable bitmap
+
+ @return true if enabled, false if not enabled
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_process_group_is_spatial_terminal_enabled(
+    const ia_css_spatial_param_terminal_manifest_t *spatial_term_man,
+    ia_css_kernel_bitmap_t enable_bitmap);
+
+#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
+#include "ia_css_psys_process_group_impl.h"
+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
+
+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.kernel.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.kernel.h
new file mode 100644
index 000000000000..3c43d58580e5
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.kernel.h
@@ -0,0 +1,379 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_HSYS_KERNEL_H
+#define __IA_CSS_PSYS_PROCESS_GROUP_HSYS_KERNEL_H
+
+/*! \file */
+
+/** @file ia_css_psys_process_group.hsys.kernel.h
+ *
+ * Define the methods on the process group object: Hsys kernel interface
+ *
+ *  This file, together with the user space header, ia_css_psys_process_group.hsys.user.h,
+ *  defines the functions required to manage the lifetime of a process group.
+ *
+ * Sequence for settup up and queueing processing tasks with a persistent program group
+ * to IPU is:
+ *
+ * # Get Program Group manifest by ID
+ * # Create process group object based on that program group manifest
+ * # Configure process group
+ * ## Set kernel and terminal enables
+ * ## Set terminal attributes
+ * # Submit processs group
+ * # Start process group
+ * # Disown process group
+ * # Frame/Fragment processing loop
+ * ## Enqueue buffer sets - This sends the terminal buffers to FW
+ * ## Resume process group - This actually instructs FW to start processing with this PG.  The
+ * process group will process any available buffer sets until suspended or stopped, pending
+ * available resources.
+ * ## Suspend process group - Only required when multiple PG's are active, this suspends the
+ * processing of one group, which allows another PG to run with the same resources. Buffer
+ * sets for the suspended PG may continue to be queued, but will not be processed until
+ * the PG is resumed.  The decision when to suspend/resume is scheduling.
+ * # Stop process group - No more buffer sets or resume/suspend commands may be sent.
+ *
+ */
+
+#include <ia_css_psys_process_types.h>
+
+#include <ia_css_psys_buffer_set.h>
+#include <vied_nci_psys_system_global.h>
+
+#include <type_support.h>                    /* uint8_t */
+
+/*
+ * Registration of user contexts / callback info
+ */
+
+/*! Get the user (callback) token as registered in the process group
+
+ @param    process_group[in]        process group object
+
+ @return 0 on error
+ */
+extern uint64_t ia_css_process_group_get_token(
+    ia_css_process_group_t                    *process_group);
+
+/*! Set (register) a user (callback) token in the process group
+
+ The token value shall be non-zero. This token is
+ returned in each return message related to the process
+ group the token is registered with.
+
+ @param    process_group[in]        process group object
+ @param    token[in]                user token
+ @return < 0 on error
+ */
+extern int ia_css_process_group_set_token(
+    ia_css_process_group_t                    *process_group,
+    const uint64_t                            token);
+
+/*
+ * Passing of a (fragment) watermark
+ */
+
+/*! Get the fragment progress limit of the process group
+
+ @see ia_css_process_group_set_fragment_limit()
+
+ @param    process_group[in]        process group object
+
+ @return 0 on error
+
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint16_t ia_css_process_group_get_fragment_limit(
+    const ia_css_process_group_t                *process_group);
+
+/*! Set the new fragment progress limit of the process group
+
+ @param    process_group[in]        process group object
+ @param    fragment_limit[in]        New limit value
+
+ @note The limit value must be less or equal to the fragment
+ count value. The process group will not make progress beyond
+ the limit value. The limit value can be modified asynchronously
+ If the limit value is reached before an update happens, the
+ process group will suspend and will not automatically resume.
+
+ The limit is monotonically increasing. The default value is
+ equal to the fragment count
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_set_fragment_limit(
+    ia_css_process_group_t                *process_group,
+    const uint16_t                    fragment_limit);
+
+/*! Clear the fragment progress limit of the process group
+
+ @see ia_css_process_group_set_fragment_limit()
+
+ @param    process_group[in]        process group object
+
+ @note This function sets the fragment limit to zero.
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_clear_fragment_limit(
+    ia_css_process_group_t                    *process_group);
+
+/*
+ * Commands
+ */
+
+/*! Perform the start command on the process group
+
+ @param    process_group[in]        process group object
+
+ @note Start is an action of the l-Scheduler it makes the
+ process group eligible for execution.
+ For PPG's, execution will not occur until the resume
+ command is issued.  See ia_css_process_group_resume()
+
+ @par For persistent program/process groups () the start
+ command must be called once per stream instance,
+ at stream creation.
+
+ @par Precondition: The external resources that are attached to
+ the process group must be in the correct state, i.e. input
+ buffers are not-empty and output buffers not-full
+
+ @return < 0 on error
+ */
+extern int ia_css_process_group_start(
+    ia_css_process_group_t                    *process_group);
+
+/*! Perform the suspend command on the process group
+
+ @param    process_group[in]        process group object
+
+ @note Suspend indicates that the process group execution
+ is halted at the next fragment boundary. The process group
+ will not automatically resume
+
+ @par Precondition: The process group must be running
+
+ @return < 0 on error
+ */
+extern int ia_css_process_group_suspend(
+    ia_css_process_group_t                    *process_group);
+
+/*! Perform the resume command on the process group
+
+ @param    process_group[in]        process group object
+
+ @note Resume indicates that the process group is again
+ eligible for execution
+
+ @par Precondition: The process group must be started
+
+ @return < 0 on error
+ */
+extern int ia_css_process_group_resume(
+    ia_css_process_group_t                    *process_group);
+
+/*! Perform the reset command on the process group
+
+ @param    process_group[in]        process group object
+
+ @note Return the process group to the started state
+
+ @par Precondition: The process group must be running or stopped
+
+ @return < 0 on error
+ */
+extern int ia_css_process_group_reset(
+    ia_css_process_group_t                    *process_group);
+
+/*! Perform the abort command on the process group
+
+ @param    process_group[in]        process group object
+
+ @note Force the process group to the stopped state
+
+ @par Precondition: The process group must be running or started
+
+ @return < 0 on error
+ */
+extern int ia_css_process_group_abort(
+    ia_css_process_group_t                    *process_group);
+
+/*! Release ownership of the process group
+
+  For PPG's, this is the last step required before buffer
+  sets can be enqueued.
+
+ @param    process_group[in]        process group object
+
+ @note Release notifies PSYS and hands over ownership of the
+ process group from SW to FW.
+
+ @par Precondition: The process group must be in the started state
+
+ @return < 0 on error
+ */
+extern int ia_css_process_group_disown(
+    ia_css_process_group_t                    *process_group);
+
+/*
+ * External resources
+ */
+
+/*! Set (register) a data buffer to the indexed terminal in the process group
+
+ @param    process_group[in]        process group object
+ @param    buffer[in]            buffer handle
+ @param    buffer_state[in]        state of the buffer
+ @param    terminal_index[in]        index of the terminal
+
+ @note For legacy program groups (== non-PPG), the buffer handle
+ shall not be VIED_NULL, but the buffer state can be undefined; BUFFER_UNDEFINED
+
+ @par For PPG's, buffer is ignored as the buffers will be sent
+ later on with ia_css_enqueue_buffer_set().  Nonetheless, this function must be
+ called before ia_css_process_group_submit() as sets up some internal bookeeping.
+
+ @note The buffer can be in memory or streaming over memory
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_attach_buffer(
+    ia_css_process_group_t            *process_group,
+    vied_vaddress_t                buffer,
+    const ia_css_buffer_state_t        buffer_state,
+    const unsigned int            terminal_index);
+
+/*! Get (unregister) the data buffer on the indexed terminal of
+ * the process group
+
+ @param    process_group[in]        process group object
+ @param    terminal_index[in]        index of the terminal
+
+ @note Precondition: The process group must be stopped
+
+ @par Postcondition: The buffer handle shall be reset to VIED_NULL, the buffer
+ state to BUFFER_NULL
+
+ @par This function is meaningless for PPG's
+
+ @return VIED_NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_vaddress_t ia_css_process_group_detach_buffer(
+    ia_css_process_group_t            *process_group,
+    const unsigned int            terminal_index);
+
+/*! Set (register) a data buffer to the indexed terminal in the process group
+
+ @param    process_group[in]        process group object
+ @param    stream[in]                stream handle
+ @param    buffer_state[in]        state of the buffer
+ @param    terminal_index[in]        index of the terminal
+
+ @note The stream handle shall not be zero, the buffer
+ state can be undefined; BUFFER_UNDEFINED
+
+ @note The stream is used exclusive to a buffer; the latter can be in memory
+ or streaming over memory
+
+ @todo Unclear what this function is for.  Clarify!
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_attach_stream(
+    ia_css_process_group_t            *process_group,
+    uint32_t                stream,
+    const ia_css_buffer_state_t        buffer_state,
+    const unsigned int            terminal_index);
+
+/*! Get (unregister) the stream handle on the indexed terminal of
+ * the process group
+
+ @param    process_group[in]        process group object
+ @param    terminal_index[in]        index of the terminal
+
+ @par Precondition: The process group must be stopped
+
+ @par Postcondition: The stream handle shall be reset to zero, the buffer
+ state to BUFFER_NULL
+
+ @todo Unclear what this function is for.  Clarify!
+
+ @return 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_process_group_detach_stream(
+    ia_css_process_group_t            *process_group,
+    const unsigned int            terminal_index);
+
+/*
+ * Sequencing resources
+ */
+
+/*! Set (an artificial) blocking resource (barrier) in
+ * the process group resource map
+
+ @param    process_group[in]        process group object
+ @param    barrier_index[in]        index of the barrier
+
+ @note The barriers have to be set to force sequence between started
+ process groups
+
+ @return < 0 on error
+
+ @todo Seems this function no longer has any use.  Clarify!
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_set_barrier(
+    ia_css_process_group_t                    *process_group,
+    const vied_nci_barrier_ID_t                barrier_index);
+
+/*! Clear a previously set blocking resource (barrier) in
+ * the process group resource map
+
+ @param    process_group[in]        process group object
+ @param    barrier_index[in]        index of the barrier
+
+ @par Precondition: The barriers must have been set
+
+ @return < 0 on error
+
+ @todo Seems this function no longer has any use.  Clarify!
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_clear_barrier(
+    ia_css_process_group_t                    *process_group,
+    const vied_nci_barrier_ID_t                barrier_index);
+
+/*! Boolean test if the process group preconditions for start are satisfied
+
+ @param    process_group[in]        process group object
+
+ @return true if the process group can be started
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_can_process_group_start(
+    const ia_css_process_group_t            *process_group);
+
+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_HSYS_KERNEL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.user.h
new file mode 100644
index 000000000000..e166c5b4e283
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.user.h
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_HSYS_USER_H
+#define __IA_CSS_PSYS_PROCESS_GROUP_HSYS_USER_H
+
+/*! \file */
+
+/** @file ia_css_psys_process_group.hsys.user.h
+ *
+ * Define the methods on the process group object: Hsys user interface
+ *
+ * This file, together with the user space header, ia_css_psys_process_group.hsys.kernel.h,
+ *  defines the functions required to manage the lifetime of a process group.
+ */
+
+#include <ia_css_program_group_param.h>    /* ia_css_program_group_param_t */
+
+#include <ia_css_psys_process_types.h>
+#include <ia_css_psys_manifest_types.h>
+#include <ia_css_psys_buffer_set.h>
+
+#include "ia_css_psys_dynamic_storage_class.h"
+
+#include <type_support.h>                    /* uint8_t */
+
+/*
+ * Creation
+ */
+
+/*! Compute the size of storage required for allocating the process group object
+
+ @param    manifest[in]            program group manifest
+ @param    param[in]            program group parameters
+
+ @return 0 on error
+ */
+extern size_t ia_css_sizeof_process_group(
+    const ia_css_program_group_manifest_t    *manifest,
+    const ia_css_program_group_param_t    *param);
+
+/*! Checks whether a certain program is enabled.
+ *   FUNCTION IS PRIVATE TO THIS MODULE
+
+ @param    program_manifest[in] program manifest
+ @param    enable_bitmap[in]   kernel enable bitmap corresponding to process group
+
+ @return true if program is enabled (and process will be instantiated)
+ */
+extern bool ia_css_process_group_is_program_enabled(
+    const ia_css_program_manifest_t *program_manifest,
+    ia_css_kernel_bitmap_t enable_bitmap);
+
+/*! Create (the storage for) the process group object
+
+ @param    process_grp_mem[in/out]    raw memory for process group
+ @param    manifest[in]            program group manifest
+ @param    param[in]            program group parameters
+
+ @return NULL on error
+ */
+extern ia_css_process_group_t *ia_css_process_group_create(
+    void                    *process_grp_mem,
+    const ia_css_program_group_manifest_t    *manifest,
+    const ia_css_program_group_param_t    *param);
+
+/*! Destroy (the storage of) the process group object
+
+ @param    process_group[in]        process group object
+
+ @return NULL
+ */
+extern ia_css_process_group_t *ia_css_process_group_destroy(
+    ia_css_process_group_t                    *process_group);
+
+/*! Print the process group object to file/stream in
+  textual format
+
+ @param    process_group[in]        process group object
+ @param    fid[out]                file/stream handle
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_print(
+    const ia_css_process_group_t        *process_group,
+    void                    *fid);
+
+/*
+ * Commands
+ */
+
+/*! Perform the submit command on the process group
+
+ @param    process_group[in]        process group object
+
+ @note Submit is an action of the h-Scheduler it makes the
+ process group eligible for the l-Scheduler
+
+ @par Precondition : The external resources must be attached to
+ the process group
+
+ @return < 0 on error
+ */
+extern int ia_css_process_group_submit(
+    ia_css_process_group_t                    *process_group);
+
+/*! Boolean test if the process group object type is valid
+
+ @param    process_group[in]        process group object
+ @param    manifest[in]            program group manifest
+ @param    param[in]                program group parameters
+
+ @return true if the process group is correct, false on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_is_process_group_valid(
+    const ia_css_process_group_t        *process_group,
+    const ia_css_program_group_manifest_t    *manifest,
+    const ia_css_program_group_param_t    *param);
+
+/*! Boolean test if the process group preconditions for submit are satisfied
+
+ @param    process_group[in]        process group object
+
+ @return true if the process group can be submitted
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_can_process_group_submit(
+    const ia_css_process_group_t            *process_group);
+
+/*! Boolean test if the preconditions on process group and buffer set are
+    satisfied for enqueuing buffer set
+
+ @param    process_group[in]        process group object
+ @param    buffer_set[in]            buffer set object
+
+ @return true if the buffer set can be enqueued
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_can_enqueue_buffer_set(
+    const ia_css_process_group_t            *process_group,
+    const ia_css_buffer_set_t            *buffer_set);
+
+/*! Compute the cyclecount required for executing the process group object
+
+ @param    manifest[in]            program group manifest
+ @param    param[in]                program group parameters
+
+ @return 0 on error
+
+ @note Current implementation is trivial
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_process_group_compute_cycle_count(
+    const ia_css_program_group_manifest_t    *manifest,
+    const ia_css_program_group_param_t    *param);
+
+/*! Compute the number of processes required for
+ * executing the process group object
+
+ @param    manifest[in]            program group manifest
+ @param    param[in]                program group parameters
+
+ @return 0 on error
+ */
+extern uint8_t ia_css_process_group_compute_process_count(
+    const ia_css_program_group_manifest_t    *manifest,
+    const ia_css_program_group_param_t        *param);
+
+/*! Compute the number of terminals required for
+ * executing the process group object
+
+ @param    manifest[in]            program group manifest
+ @param    param[in]                program group parameters
+
+ @return 0 on error
+ */
+extern uint8_t ia_css_process_group_compute_terminal_count(
+    const ia_css_program_group_manifest_t    *manifest,
+    const ia_css_program_group_param_t        *param);
+
+/*! Get private token as registered in the process group by the implementation
+
+ @note The token value shall be non-zero. This token is private
+ to the implementation. This is in addition to the user token.
+ See ia_css_process_group_set_token()
+
+ @param    process_group[in]        process group object
+
+ @return 0 on error
+ */
+extern uint64_t ia_css_process_group_get_private_token(
+    ia_css_process_group_t                    *process_group);
+
+/*! Set private token in the process group as needed by the implementation
+
+ @param    process_group[in]        process group object
+ @param    token[in]                user token
+
+ @note The token value shall be non-zero. This token is private
+ to the implementation. This is in addition to the user token.
+ see ia_css_process_group_get_token()
+
+ @return < 0 on error, 0 on success
+ */
+extern int ia_css_process_group_set_private_token(
+    ia_css_process_group_t                    *process_group,
+    const uint64_t                            token);
+
+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_HSYS_USER_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.psys.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.psys.h
new file mode 100644
index 000000000000..49c04df55d7d
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.psys.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_PSYS_H
+#define __IA_CSS_PSYS_PROCESS_GROUP_PSYS_H
+
+/*! \file */
+
+/** @file ia_css_psys_process_group.psys.h
+ *
+ * Define the methods on the process group object: Psys embedded interface
+ */
+
+#include <ia_css_psys_process_types.h>
+
+/*
+ * Dispatcher
+ */
+
+/*! Perform the run command on the process group
+
+ @param    process_group[in]        process group object
+
+ Note: Run indicates that the process group will execute
+
+ Precondition: The process group must be started or
+ suspended and the processes have acquired the necessary
+ internal resources
+
+ @return < 0 on error
+ */
+extern int ia_css_process_group_run(
+    ia_css_process_group_t                    *process_group);
+
+/*! Perform the stop command on the process group
+
+ @param    process_group[in]        process group object
+
+ Note: Stop indicates that the process group has completed execution
+
+ Postcondition: The external resoruces can now be detached
+
+ @return < 0 on error
+ */
+extern int ia_css_process_group_stop(
+    ia_css_process_group_t                    *process_group);
+
+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_PSYS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_cmd_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_cmd_impl.h
new file mode 100644
index 000000000000..de0b78f71aeb
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_cmd_impl.h
@@ -0,0 +1,280 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_CMD_IMPL_H
+#define __IA_CSS_PSYS_PROCESS_GROUP_CMD_IMPL_H
+
+#include "type_support.h"
+#include "ia_css_psys_process_group.h"
+#include "ia_css_rbm_manifest_types.h"
+
+#define N_UINT64_IN_PROCESS_GROUP_STRUCT    2
+#define N_UINT32_IN_PROCESS_GROUP_STRUCT    8
+#define N_UINT16_IN_PROCESS_GROUP_STRUCT    5
+#define N_UINT8_IN_PROCESS_GROUP_STRUCT        8
+#define N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT    2
+
+#define SIZE_OF_PROCESS_GROUP_STRUCT_BITS \
+    (IA_CSS_RBM_BITS \
+    + IA_CSS_KERNEL_BITMAP_BITS \
+    + N_UINT64_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT64_T_BITS \
+    + N_UINT32_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT32_T_BITS \
+    + IA_CSS_PROGRAM_GROUP_ID_BITS \
+    + IA_CSS_PROCESS_GROUP_STATE_BITS \
+    + VIED_VADDRESS_BITS \
+    + VIED_NCI_RESOURCE_BITMAP_BITS \
+    + N_UINT16_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT16_T_BITS \
+    + N_UINT8_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT8_T_BITS \
+    + N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT8_T_BITS)
+
+/** Process group object describing an instance of a Program Group
+ *
+ *  This is the root structure passed in a number of PG commands via
+ *  the syscom queuing interface to firmware from the host.  A pointer
+ *  to this structure in main memroy is passed in the following
+ *  PG commands: start, resume, suspend, stop, abort.
+ *
+ *  A process group is created based on a program group specification
+ *  described in the program group manifest.  Briefly, a program group
+ *  contains programs which in turn contain kernels.  A program group
+ *  also has terminals, which connect it to the outside world.  Each
+ *  terminal represents either parameters or image data flowing in or
+ *  out of the group.  Terminals come in different types and may have
+ *  addtional attributes.  For example, a data termainal will have
+ *  a frame format attribute.
+ *  @see ia_css_process_group_create()
+ *  @see ia_css_program_group_manifest_t and related API and:
+ *  @see ia_css_pkg_dir_entry_get_type() and
+ *  ia_css_client_pkg_get_pg_manifest_offset_size() (and in general the
+ *  ia_css_pkg_dir* functions) for how to get the program group manifest
+ *  array from the binary release package.
+ *
+ *  @note Some of the fields within are used internally within the
+ *  firmware only, after the firmware copies the process group structure
+ *  to its internel cache.  The original in main memory is not updated.
+ *  All such fields should be initialized to zero, unless otherwise
+ *  noted.
+ *  See the individual field descriptions for which fields are "internal".
+ */
+struct ia_css_process_group_s {
+    /** User (callback) token / user context reference,
+     * zero is an error value
+     */
+    uint64_t token;
+    /** private token / context reference, zero is an error value */
+    uint64_t private_token;
+    /** PG routing bitmap used to set connection between program group
+     *  components */
+    ia_css_rbm_t routing_bitmap;
+    /** PG kernel bitmap.  Marks which program kernels (i.e. kernel==device, when impelementation is fixed)
+     *  are enabled. This bitmap covers all kernels in the group, no matter which program they belong to. */
+    ia_css_kernel_bitmap_t kernel_bitmap;
+    /** Size of this structure in bytes */
+    uint32_t size;
+    /** The timestamp when PG load starts
+     *  @note Internal firmware use only. */
+    /**< PSYS server init time in cycless */
+    uint32_t psys_server_init_cycles;
+    /**< The timestamp when PG load starts */
+    uint32_t pg_load_start_ts;
+    /** PG load time in cycles
+     *  @note Internal firmware use only. */
+    uint32_t pg_load_cycles;
+    /** PG init time in cycles
+     *  @note Internal firmware use only. */
+    uint32_t pg_init_cycles;
+    /** PG processing time in cycles
+     *  @note Internal firmware use only. */
+    uint32_t pg_processing_cycles;
+    /** Referral ID to program group FW.  This identifies the "type" of the process group
+     *  and associcates the process group with the program group defined in the manifest. */
+    /**< PG next frame init time in cycles */
+    uint32_t pg_next_frame_init_cycles;
+    /**< PG complete time in cycles */
+    uint32_t pg_complete_cycles;
+    /**< Referral ID to program group FW */
+    ia_css_program_group_ID_t ID;
+    /** State of the process group FSM */
+    ia_css_process_group_state_t state;
+    /** Virtual address of process group in the IPU address space */
+    vied_vaddress_t ipu_virtual_address;
+    /** Bitmap of the compute resources used by the process group  */
+    vied_nci_resource_bitmap_t resource_bitmap;
+    /** Number of fragments offered on each terminal */
+    uint16_t fragment_count;
+    /** Current fragment of processing */
+    uint16_t fragment_state;
+    /** Watermark to control fragment processing.  Set to the same value as "fragment_count"
+     *  unless you know what you are doing.
+     *  @see  fragment_count in this structure. */
+    uint16_t fragment_limit;
+    /** Offset in bytes relative to the beginning of this structure, to process_offset_table[process_count].
+     *  Must be aligned to a 64 bit boundary.
+     *  process_offset_table is an array of size "process_count", containing offsets to process objects
+     *  (each an instance of ia_css_process_t) belonging to this process group.
+     *  @see process_count in this structure.
+     *
+     *  Usually follows this process group structure. */
+    uint16_t processes_offset;
+    /** Offset in bytes, relative to the beginning of this structure, to terminal_offset_table[terminal_count].
+     *  Must be aligned to a 64 bit boundary.
+     *  terminal_offset_table is an array of size "terminal_count", containing offsets to terminal objects
+     *  (each an instance of ia_css_terminal_t or a derivative of it) belonging to this process group.
+     *  @see terminal_count in this structure.
+     *
+     *  Usually follows process_offset_table, aligned to 64-bit boundary. */
+    uint16_t terminals_offset;
+    /** Parameter dependent number of processes in this process group, determined at process
+     *  group creation taking into account the enabled kernels. That is, if all of a program's
+     *  associcated kernels are disabled, then no process is instantiated for that program and
+     *  it must not be counted in the process count.
+     *
+     *  @see processes_offset in this structure
+     *  @see ia_css_program_group_manifest_get_program_count()
+     *  @see ia_css_program_manifest_get_kernel_bitmap()
+     *  @see ia_css_process_group_compute_process_count() */
+    uint8_t process_count;
+    /** Parameter dependent number of terminals on this process group, determined at process
+     *  group creation.  Must not be greater than the terminal count as defined in the manifest,
+     *  but taking into account the enabled kernels.  That is, for those terminal types that have
+     *  kernel associations, the terminal is diabled if all of its associated kernels are disabled.
+     *  Execptions by terminal type:
+     *  - IA_CSS_TERMINAL_TYPE_PROGRAM - As described above, but parameter descriptors are examined to determine the
+     *  kernel association, as the terminal type itself does not have an associated kernel field or kernel bitmap field.
+     *  - IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT -- Always enabled
+     *  - IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN -- Always enabled, to allow HW disabling configuration to be loaded
+     *
+     *  @see terminals_offset in this structure
+     *  @see ia_css_program_group_manifest_get_terminal_count()
+     *  @see ia_css_program_manifest_get_kernel_bitmap()
+     *  @see ia_css_process_group_is_terminal_enabled()
+     *  @see ia_css_process_group_compute_terminal_count() */
+    uint8_t terminal_count;
+    /** Parameter dependent number of independent subgraphs in
+     * this process group.
+     * @note Apparently no longer used.
+     */
+    uint8_t subgraph_count;
+    /** Process group protocol version.  Identifies the state machine and
+     *  message protocol for this process group. */
+    uint8_t protocol_version;
+    /** Dedicated base queue id used for enqueueing payload buffer sets.
+     *  Each buffer set is either a frame (or fragment) processing request,
+     *  or an opportunistic parameter update (AKA "late binding")
+     *  This queue is enabled once the process group start command has
+     *  been issued. */
+    uint8_t base_queue_id;
+    /** Number of dedicated queues used */
+    uint8_t num_queues;
+    /**< Mask the send_pg_done IRQ */
+    uint8_t mask_irq;
+    /** Error handling enable\disable flag */
+    uint8_t error_handling_enable;
+#if N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT > 0
+    uint8_t padding[N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT];
+#endif
+};
+
+/*! Callback after process group is created. Implementations can provide
+ * suitable actions needed when process group is created.
+
+ @param    process_group[in]            process group object
+ @param    program_group_manifest[in]        program group manifest
+ @param    program_group_param[in]            program group parameters
+
+ @return 0 on success and non-zero on failure
+ */
+extern int ia_css_process_group_on_create(
+    ia_css_process_group_t            *process_group,
+    const ia_css_program_group_manifest_t    *program_group_manifest,
+    const ia_css_program_group_param_t    *program_group_param);
+
+/*! Callback before process group is about to be destoyed. Any implementation
+ * specific cleanups can be done here.
+
+ @param    process_group[in]                process group object
+
+ @return 0 on success and non-zero on failure
+ */
+extern int ia_css_process_group_on_destroy(
+    ia_css_process_group_t                    *process_group);
+
+/*
+ * Command processor
+ */
+
+/*! Execute a command locally or send it to be processed remotely
+
+ @param    process_group[in]        process group object
+ @param    cmd[in]                    command
+
+ @return < 0 on error
+ */
+extern int ia_css_process_group_exec_cmd(
+    ia_css_process_group_t                *process_group,
+    const ia_css_process_group_cmd_t        cmd);
+
+/*! Enqueue a buffer set corresponding to a persistent program group by
+ * sending a command to subsystem.
+
+ @param    process_group[in]        process group object
+ @param    buffer_set[in]            buffer set
+ @param    queue_offset[in]        offset to be used from the queue id
+                    specified in the process group object
+                    (0 for first buffer set for frame, 1
+                    for late binding)
+
+ @return < 0 on error
+ */
+extern int ia_css_enqueue_buffer_set(
+    ia_css_process_group_t                *process_group,
+    ia_css_buffer_set_t                *buffer_set,
+    unsigned int                    queue_offset);
+
+/*! Enqueue a parameter buffer set corresponding to a persistent program
+ *  group by sending a command to subsystem.  This allows for
+    opportunistic late parameters update, AKA "late binding".
+
+ @param    process_group[in]        process group object
+ @param    buffer_set[in]            parameter buffer set
+
+ @return < 0 on error
+ */
+extern int ia_css_enqueue_param_buffer_set(
+    ia_css_process_group_t                *process_group,
+    ia_css_buffer_set_t                *buffer_set);
+
+/*! Need to store the 'secure' mode for each PG for FW test app only
+ *
+ * @param    process_group[in]        process group object
+ * @param    secure[in]            parameter buffer set
+ *
+ * @return < 0 on error
+ */
+extern int ia_css_process_group_store(
+    ia_css_process_group_t                *process_group,
+    bool                        secure);
+
+/*! Need to get the right context for each PG for FW test app only
+ *
+ * @param    process_group[in]        process group object
+ *
+ * @return    psys_syscom context
+ */
+extern struct ia_css_syscom_context *ia_css_process_group_get_context(
+    ia_css_process_group_t *process_group);
+
+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_CMD_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_impl.h
new file mode 100644
index 000000000000..4ada788bed49
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_impl.h
@@ -0,0 +1,1846 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_IMPL_H
+#define __IA_CSS_PSYS_PROCESS_GROUP_IMPL_H
+
+#include <ia_css_psysapi_fw_version.h>
+#include <ia_css_psys_process_group.h>
+#include "ia_css_psys_process_group_cmd_impl.h"
+#include <ia_css_psys_terminal.h>
+#include <ia_css_psys_transport.h>
+#include <ia_css_psys_process.h>
+#include <ia_css_psys_terminal_manifest.h>
+#include <ia_css_psys_program_manifest.h>
+#include <ia_css_psys_program_group_manifest.h>
+#include "ia_css_terminal_manifest_types.h"
+
+#include "ia_css_rbm.h"
+
+#include <ia_css_kernel_bitmap.h>    /* ia_css_kernel_bitmap_t */
+
+#include <vied_nci_psys_system_global.h>
+#include <ia_css_program_group_data.h>
+#include "ia_css_rbm_manifest_types.h"
+#include <type_support.h>
+#include <error_support.h>
+#include <misc_support.h>
+#include <math_support.h>
+
+#include "ia_css_psys_dynamic_trace.h"
+#include "ia_css_terminal_manifest.h"
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_process_group_is_data_terminal_enabled(
+    const ia_css_data_terminal_manifest_t    *data_term_manifest,
+    ia_css_kernel_bitmap_t enable_bitmap)
+{
+    bool is_terminal_enabled = false;
+
+    ia_css_kernel_bitmap_t term_bitmap =
+        ia_css_data_terminal_manifest_get_kernel_bitmap(
+                data_term_manifest);
+    /*
+     * Terminals depend on a kernel,
+     * if the kernel is present the program it contains and
+     * the terminal the program depends on are active
+     */
+    is_terminal_enabled  = !ia_css_is_kernel_bitmap_intersection_empty(
+            enable_bitmap,
+            term_bitmap);
+    return is_terminal_enabled;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_process_group_is_spatial_terminal_enabled(
+    const ia_css_spatial_param_terminal_manifest_t *spatial_term_man,
+    ia_css_kernel_bitmap_t enable_bitmap)
+{
+    bool is_terminal_enabled = false;
+    ia_css_kernel_bitmap_t term_kernel_bitmap = ia_css_kernel_bitmap_clear();
+
+    term_kernel_bitmap =
+        ia_css_kernel_bitmap_set(
+            term_kernel_bitmap,
+            spatial_term_man->kernel_id);
+    is_terminal_enabled = !ia_css_is_kernel_bitmap_intersection_empty(
+            enable_bitmap, term_kernel_bitmap);
+    return is_terminal_enabled;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_process_group_is_terminal_enabled(
+    const ia_css_terminal_manifest_t *terminal_manifest,
+    ia_css_kernel_bitmap_t enable_bitmap)
+{
+    ia_css_terminal_type_t terminal_type;
+    bool is_terminal_enabled = false;
+
+    verifjmpexit(NULL != terminal_manifest);
+    terminal_type = ia_css_terminal_manifest_get_type(terminal_manifest);
+
+    if (ia_css_is_terminal_manifest_data_terminal(terminal_manifest)) {
+        ia_css_data_terminal_manifest_t    *data_term_manifest =
+                        (ia_css_data_terminal_manifest_t *)terminal_manifest;
+        is_terminal_enabled =
+                ia_css_process_group_is_data_terminal_enabled(data_term_manifest, enable_bitmap);
+    } else if (ia_css_is_terminal_manifest_spatial_parameter_terminal(
+                terminal_manifest)) {
+        ia_css_spatial_param_terminal_manifest_t *spatial_term_man =
+            (ia_css_spatial_param_terminal_manifest_t *)
+            terminal_manifest;
+         is_terminal_enabled = ia_css_process_group_is_spatial_terminal_enabled(spatial_term_man,
+            enable_bitmap);
+    } else if (ia_css_is_terminal_manifest_parameter_terminal(
+            terminal_manifest) && terminal_type ==
+            IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN) {
+        /*
+         * For parameter out and program control terminals, we
+         * disable the terminals if ALL the corresponding kernels
+         * are disabled, for parameter in terminals we cannot do this;
+         * even if kernels are disabled, it may be required that
+         * (HW) parameters must be supplied via the parameter
+         * in terminal (e.g. bypass bits).
+         */
+        is_terminal_enabled = true;
+
+    } else if (ia_css_is_terminal_manifest_parameter_terminal(
+            terminal_manifest) && terminal_type ==
+            IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) {
+        ia_css_kernel_bitmap_t term_kernel_bitmap = ia_css_kernel_bitmap_clear();
+        ia_css_param_terminal_manifest_t *param_term_man =
+            (ia_css_param_terminal_manifest_t *)terminal_manifest;
+        ia_css_param_manifest_section_desc_t *section_desc;
+        unsigned int section = 0;
+        uint8_t kernel_id;
+
+        for (section = 0; section < param_term_man->
+                param_manifest_section_desc_count; section++) {
+            section_desc =
+        ia_css_param_terminal_manifest_get_prm_sct_desc(
+                        param_term_man, section);
+            verifjmpexit(section_desc != NULL);
+            kernel_id = ia_css_param_manifest_section_desc_get_kernel_id(section_desc);
+            term_kernel_bitmap = ia_css_kernel_bitmap_set(
+                    term_kernel_bitmap,
+                    kernel_id);
+        }
+
+        is_terminal_enabled = !ia_css_is_kernel_bitmap_intersection_empty(
+                    enable_bitmap, term_kernel_bitmap);
+    } else if (ia_css_is_terminal_manifest_program_terminal(
+                terminal_manifest)) {
+        ia_css_kernel_bitmap_t term_kernel_bitmap = ia_css_kernel_bitmap_clear();
+        ia_css_program_terminal_manifest_t *prog_term_man =
+            (ia_css_program_terminal_manifest_t *)terminal_manifest;
+        unsigned int section = 0;
+
+        for (section = 0;
+            section < prog_term_man->fragment_param_manifest_section_desc_count;
+            section++) {
+            ia_css_fragment_param_manifest_section_desc_t *desc =
+                ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
+                    prog_term_man,
+                    section);
+            verifjmpexit(desc != NULL);
+
+            term_kernel_bitmap = ia_css_kernel_bitmap_set(
+                    term_kernel_bitmap,
+                    ia_css_fragment_param_manifest_section_desc_get_kernel_id(desc));
+        }
+
+        is_terminal_enabled = !ia_css_is_kernel_bitmap_intersection_empty(
+                    enable_bitmap, term_kernel_bitmap);
+    } else if (ia_css_is_terminal_manifest_program_control_init_terminal(
+                terminal_manifest)) {
+        is_terminal_enabled = true;
+    }
+    return is_terminal_enabled;
+EXIT:
+    return false;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint16_t ia_css_process_group_get_fragment_limit(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    uint16_t fragment_limit = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_fragment_limit(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    fragment_limit = process_group->fragment_limit;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_fragment_limit invalid argument\n");
+    }
+    return fragment_limit;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_set_fragment_limit(
+    ia_css_process_group_t *process_group,
+    const uint16_t fragment_limit)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+    uint16_t fragment_state;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_set_fragment_limit(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    retval = ia_css_process_group_get_fragment_state(process_group,
+        &fragment_state);
+
+    verifexitval(retval == 0, EINVAL);
+    verifexitval(fragment_limit > fragment_state, EINVAL);
+    verifexitval(fragment_limit <= ia_css_process_group_get_fragment_count(
+                process_group), EINVAL);
+
+    process_group->fragment_limit = fragment_limit;
+
+    retval = 0;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_fragment_limit invalid argument process_group\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_fragment_limit failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_clear_fragment_limit(
+    ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_clear_fragment_limit(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+    process_group->fragment_limit = 0;
+
+    retval = 0;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_clear_fragment_limit invalid argument process_group\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_clear_fragment_limit failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_attach_buffer(
+    ia_css_process_group_t *process_group,
+    vied_vaddress_t buffer,
+    const ia_css_buffer_state_t buffer_state,
+    const unsigned int terminal_index)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+    ia_css_terminal_t *terminal = NULL;
+
+    NOT_USED(buffer_state);
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_group_attach_buffer(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    terminal = ia_css_process_group_get_terminal(
+                process_group, terminal_index);
+
+    verifexitval(terminal != NULL, EINVAL);
+    verifexitval(ia_css_process_group_get_state(process_group) ==
+        IA_CSS_PROCESS_GROUP_READY, EINVAL);
+    verifexitval(process_group->protocol_version ==
+        IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY ||
+        process_group->protocol_version ==
+        IA_CSS_PROCESS_GROUP_PROTOCOL_PPG, EINVAL);
+
+    if (process_group->protocol_version ==
+        IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY) {
+        /*
+         * Legacy flow:
+         * Terminal address is part of the process group structure
+         */
+        retval = ia_css_terminal_set_buffer(
+            terminal, buffer);
+    } else if (process_group->protocol_version ==
+        IA_CSS_PROCESS_GROUP_PROTOCOL_PPG) {
+        /*
+         * PPG flow:
+         * Terminal address is part of external buffer set structure
+         */
+        retval = ia_css_terminal_set_terminal_index(
+            terminal, terminal_index);
+    }
+    verifexitval(retval == 0, EFAULT);
+
+    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
+        "\tTerminal 0x%lx has buffer 0x%x\n", (unsigned long int)terminal, buffer);
+
+    if (ia_css_is_terminal_data_terminal(terminal) == true) {
+        ia_css_frame_t *frame =
+            ia_css_data_terminal_get_frame(
+                (ia_css_data_terminal_t *)terminal);
+        verifexitval(frame != NULL, EINVAL);
+
+        retval = ia_css_frame_set_buffer_state(frame, buffer_state);
+        verifexitval(retval == 0, EINVAL);
+    }
+
+    retval = 0;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_attach_buffer invalid argument process_group\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_attach_buffer failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_vaddress_t ia_css_process_group_detach_buffer(
+    ia_css_process_group_t *process_group,
+    const unsigned int terminal_index)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+    vied_vaddress_t buffer = VIED_NULL;
+
+    ia_css_terminal_t *terminal = NULL;
+    ia_css_process_group_state_t state;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_group_detach_buffer(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    terminal =
+        ia_css_process_group_get_terminal(
+                process_group, terminal_index);
+    state = ia_css_process_group_get_state(process_group);
+
+    verifexitval(terminal != NULL, EINVAL);
+    verifexitval(state == IA_CSS_PROCESS_GROUP_READY, EINVAL);
+
+    buffer = ia_css_terminal_get_buffer(terminal);
+
+    if (ia_css_is_terminal_data_terminal(terminal) == true) {
+        ia_css_frame_t *frame =
+            ia_css_data_terminal_get_frame(
+                    (ia_css_data_terminal_t *)terminal);
+        verifexitval(frame != NULL, EINVAL);
+
+        retval = ia_css_frame_set_buffer_state(frame, IA_CSS_BUFFER_NULL);
+        verifexitval(retval == 0, EINVAL);
+    }
+    ia_css_terminal_set_buffer(terminal, VIED_NULL);
+
+    retval = 0;
+EXIT:
+    /*
+     * buffer pointer will appear on output,
+     * regardless of subsequent fails to avoid memory leaks
+     */
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_detach_buffer invalid argument process_group\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_detach_buffer failed (%i)\n",
+            retval);
+    }
+    return buffer;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_attach_stream(
+    ia_css_process_group_t *process_group,
+    uint32_t stream,
+    const ia_css_buffer_state_t buffer_state,
+    const unsigned int terminal_index)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_group_attach_stream(): enter:\n");
+
+    NOT_USED(process_group);
+    NOT_USED(stream);
+    NOT_USED(buffer_state);
+    NOT_USED(terminal_index);
+
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_attach_stream failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_process_group_detach_stream(
+    ia_css_process_group_t *process_group,
+    const unsigned int terminal_index)
+{
+    int retval = -1;
+    uint32_t stream = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_group_detach_stream(): enter:\n");
+
+    NOT_USED(process_group);
+    NOT_USED(terminal_index);
+
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_detach_stream failed (%i)\n",
+            retval);
+    }
+    return stream;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_set_barrier(
+    ia_css_process_group_t *process_group,
+    const vied_nci_barrier_ID_t barrier_index)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+    vied_nci_resource_bitmap_t bit_mask;
+    vied_nci_resource_bitmap_t resource_bitmap;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_set_barrier(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    resource_bitmap =
+        ia_css_process_group_get_resource_bitmap(process_group);
+
+    bit_mask = vied_nci_barrier_bit_mask(barrier_index);
+
+    verifexitval(bit_mask != 0, EINVAL);
+    verifexitval(vied_nci_is_bitmap_clear(bit_mask, resource_bitmap), EINVAL);
+
+    resource_bitmap = vied_nci_bitmap_set(resource_bitmap, bit_mask);
+
+    retval =
+        ia_css_process_group_set_resource_bitmap(
+            process_group, resource_bitmap);
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_set_barrier invalid argument process_group\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_set_barrier failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_clear_barrier(
+    ia_css_process_group_t *process_group,
+    const vied_nci_barrier_ID_t barrier_index)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+    vied_nci_resource_bitmap_t bit_mask, resource_bitmap;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_clear_barrier(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    resource_bitmap =
+        ia_css_process_group_get_resource_bitmap(process_group);
+
+    bit_mask = vied_nci_barrier_bit_mask(barrier_index);
+
+    verifexitval(bit_mask != 0, EINVAL);
+    verifexitval(vied_nci_is_bitmap_set(bit_mask, resource_bitmap), EINVAL);
+
+    resource_bitmap = vied_nci_bitmap_clear(resource_bitmap, bit_mask);
+
+    retval =
+        ia_css_process_group_set_resource_bitmap(
+                process_group, resource_bitmap);
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_clear_barrier invalid argument process_group\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_clear_barrier failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_print(
+    const ia_css_process_group_t *process_group,
+    void *fid)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+    int i;
+
+    uint8_t    process_count;
+    uint8_t terminal_count;
+    vied_vaddress_t ipu_vaddress = VIED_NULL;
+    ia_css_rbm_t routing_bitmap;
+
+    NOT_USED(fid);
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_print(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+    retval = ia_css_process_group_get_ipu_vaddress(process_group, &ipu_vaddress);
+    verifexitval(retval == 0, EINVAL);
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "=============== Process group print start ===============\n");
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+        "\tprocess_group cpu address = 0x%lx\n", (unsigned long int)process_group);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+        "\tipu_virtual_address = %x\n", ipu_vaddress);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+        "\tsizeof(process_group) = %d\n",
+        (int)ia_css_process_group_get_size(process_group));
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+        "\tfragment_count = %d\n",
+        (int)ia_css_process_group_get_fragment_count(process_group));
+
+    routing_bitmap = *ia_css_process_group_get_routing_bitmap(process_group);
+    for (i = 0; i < (int)IA_CSS_RBM_NOF_ELEMS; i++) {
+        IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
+            "\trouting_bitmap[index = %d] = 0x%X\n",
+            i, (int)routing_bitmap.data[i]);
+    }
+
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+        "\tprogram_group(process_group) = %d\n",
+        (int)ia_css_process_group_get_program_group_ID(process_group));
+    process_count = ia_css_process_group_get_process_count(process_group);
+    terminal_count =
+        ia_css_process_group_get_terminal_count(process_group);
+
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+        "\t%d processes\n", (int)process_count);
+    for (i = 0; i < (int)process_count; i++) {
+        ia_css_process_t *process =
+            ia_css_process_group_get_process(process_group, i);
+
+        retval = ia_css_process_print(process, fid);
+        verifjmpexit(retval == 0);
+    }
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+        "\t%d terminals\n", (int)terminal_count);
+    for (i = 0; i < (int)terminal_count; i++) {
+        ia_css_terminal_t *terminal =
+            ia_css_process_group_get_terminal(process_group, i);
+
+        retval = ia_css_terminal_print(terminal, fid);
+        verifjmpexit(retval == 0);
+    }
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+        "\terror_handling_enable = %u\n", process_group->error_handling_enable);
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "=============== Process group print end ===============\n");
+    retval = 0;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_print invalid argument\n");
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_is_process_group_valid(
+    const ia_css_process_group_t *process_group,
+    const ia_css_program_group_manifest_t *pg_manifest,
+    const ia_css_program_group_param_t *param)
+{
+    DECLARE_ERRVAL
+    bool invalid_flag = false;
+    uint8_t proc_idx;
+    uint8_t proc_term_idx;
+    uint8_t    process_count;
+    uint8_t    program_count;
+    uint8_t terminal_count;
+    uint8_t man_terminal_count;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_is_process_group_valid(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+    verifexitval(pg_manifest != NULL, EFAULT);
+    NOT_USED(param);
+
+    process_count = process_group->process_count;
+    terminal_count = process_group->terminal_count;
+    program_count = ia_css_program_group_manifest_get_program_count(pg_manifest);
+    man_terminal_count = ia_css_program_group_manifest_get_terminal_count(pg_manifest);
+
+    /* Validate process group */
+    invalid_flag = invalid_flag ||
+        !(program_count >= process_count) ||
+        !(man_terminal_count >= terminal_count) ||
+        !(process_group->size > process_group->processes_offset) ||
+        !(process_group->size > process_group->terminals_offset);
+
+    /* Validate processes */
+    for (proc_idx = 0; proc_idx < process_count; proc_idx++) {
+        const ia_css_process_t *process;
+        ia_css_program_manifest_t *p_manifest = NULL;
+        ia_css_program_ID_t prog_id;
+        bool no_match_found = true;
+
+        process = ia_css_process_group_get_process(process_group, proc_idx);
+        verifexitval(NULL != process, EFAULT);
+        prog_id = ia_css_process_get_program_ID(process);
+        p_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest,
+                                       ia_css_process_get_program_idx(process));
+        verifexitval(NULL != p_manifest, EFAULT);
+
+        if (prog_id == ia_css_program_manifest_get_program_ID(p_manifest)) {
+            invalid_flag = invalid_flag || !ia_css_is_process_valid(process, p_manifest);
+            no_match_found = false;
+        }
+
+        invalid_flag = invalid_flag || no_match_found;
+    }
+
+    /* Validate terminals */
+    for (proc_term_idx = 0; proc_term_idx < terminal_count; proc_term_idx++) {
+        int man_term_idx;
+        const ia_css_terminal_t *terminal;
+        const ia_css_terminal_manifest_t *terminal_manifest;
+
+        terminal = ia_css_process_group_get_terminal(process_group, proc_term_idx);
+        verifexitval(NULL != terminal, EFAULT);
+        man_term_idx = ia_css_terminal_get_terminal_manifest_index(terminal);
+        terminal_manifest = ia_css_program_group_manifest_get_term_mnfst(pg_manifest, man_term_idx);
+
+        invalid_flag = invalid_flag || !ia_css_is_terminal_valid(terminal, terminal_manifest);
+    }
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_is_process_group_valid() invalid argument\n");
+        return false;
+    } else {
+        return (!invalid_flag);
+    }
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_can_process_group_submit(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    int i;
+    bool can_submit = false;
+    int retval = -1;
+    uint8_t    terminal_count =
+        ia_css_process_group_get_terminal_count(process_group);
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_can_process_group_submit(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    for (i = 0; i < (int)terminal_count; i++) {
+        ia_css_terminal_t *terminal =
+            ia_css_process_group_get_terminal(process_group, i);
+        vied_vaddress_t buffer;
+        ia_css_buffer_state_t buffer_state;
+
+        verifexitval(terminal != NULL, EINVAL);
+
+        if (process_group->protocol_version ==
+            IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY) {
+            /*
+             * For legacy pg flow, buffer addresses are contained inside
+             * the process group structure, so these need to be validated
+             * on process group submission.
+             */
+            buffer = ia_css_terminal_get_buffer(terminal);
+            IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
+                "\tH: Terminal number(%d) is 0x%lx having buffer 0x%x\n",
+                i, (unsigned long int)terminal, buffer);
+        }
+
+        /* buffer_state is applicable only for data terminals*/
+        if (ia_css_is_terminal_data_terminal(terminal) == true) {
+            ia_css_frame_t *frame =
+                ia_css_data_terminal_get_frame(
+                    (ia_css_data_terminal_t *)terminal);
+
+            verifexitval(frame != NULL, EINVAL);
+            buffer_state = ia_css_frame_get_buffer_state(frame);
+            if ((buffer_state == IA_CSS_BUFFER_NULL) ||
+                (buffer_state == IA_CSS_N_BUFFER_STATES)) {
+                break;
+            }
+        } else if (
+            (ia_css_is_terminal_parameter_terminal(terminal)
+                != true) &&
+            (ia_css_is_terminal_program_terminal(terminal)
+                != true) &&
+            (ia_css_is_terminal_program_control_init_terminal(terminal)
+                != true) &&
+            (ia_css_is_terminal_spatial_parameter_terminal(
+                terminal) != true)) {
+            /* neither data nor parameter terminal, so error.*/
+            break;
+        }
+
+    }
+    /* Only true if no check failed */
+    can_submit = (i == terminal_count);
+
+    retval = 0;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_can_process_group_submit invalid argument process_group\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_can_process_group_submit failed (%i)\n",
+            retval);
+    }
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_can_process_group_submit(): leave:\n");
+    return can_submit;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_can_enqueue_buffer_set(
+    const ia_css_process_group_t *process_group,
+    const ia_css_buffer_set_t *buffer_set)
+{
+    DECLARE_ERRVAL
+    int i;
+    bool can_enqueue = false;
+    int retval = -1;
+    uint8_t    terminal_count;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_can_enqueue_buffer_set(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+    verifexitval(buffer_set != NULL, EFAULT);
+
+    terminal_count =
+        ia_css_process_group_get_terminal_count(process_group);
+
+    /*
+     * For ppg flow, buffer addresses are contained in the
+     * external buffer set structure, so these need to be
+     * validated before enqueueing.
+     */
+    verifexitval(process_group->protocol_version ==
+        IA_CSS_PROCESS_GROUP_PROTOCOL_PPG, EFAULT);
+
+    for (i = 0; i < (int)terminal_count; i++) {
+        ia_css_terminal_t *terminal =
+            ia_css_process_group_get_terminal(process_group, i);
+        vied_vaddress_t buffer;
+        ia_css_buffer_state_t buffer_state;
+
+        verifexitval(terminal != NULL, EINVAL);
+
+        buffer = ia_css_buffer_set_get_buffer(buffer_set, terminal);
+        IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
+            "\tH: Terminal number(%d) is 0x%lx having buffer 0x%x\n",
+            i, (unsigned long int)terminal, buffer);
+
+        /* buffer_state is applicable only for data terminals*/
+        if (ia_css_is_terminal_data_terminal(terminal) == true) {
+            ia_css_frame_t *frame =
+                ia_css_data_terminal_get_frame(
+                    (ia_css_data_terminal_t *)terminal);
+
+            verifexitval(frame != NULL, EINVAL);
+            buffer_state = ia_css_frame_get_buffer_state(frame);
+            if ((buffer_state == IA_CSS_BUFFER_NULL) ||
+                (buffer_state == IA_CSS_N_BUFFER_STATES)) {
+                break;
+            }
+        } else if (
+            (ia_css_is_terminal_parameter_terminal(terminal)
+                != true) &&
+            (ia_css_is_terminal_program_terminal(terminal)
+                != true) &&
+            (ia_css_is_terminal_program_control_init_terminal(terminal)
+                != true) &&
+            (ia_css_is_terminal_spatial_parameter_terminal(
+                terminal) != true)) {
+            /* neither data nor parameter terminal, so error.*/
+            break;
+        }
+    }
+    /* Only true if no check failed */
+    can_enqueue = (i == terminal_count);
+
+    retval = 0;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_can_enqueue_buffer_set invalid argument\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_can_enqueue_buffer_set failed (%i)\n",
+            retval);
+    }
+    return can_enqueue;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_can_process_group_start(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    int i;
+    bool can_start = false;
+    int retval = -1;
+    uint8_t    terminal_count;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_can_process_group_start(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    terminal_count =
+        ia_css_process_group_get_terminal_count(process_group);
+    for (i = 0; i < (int)terminal_count; i++) {
+        ia_css_terminal_t *terminal =
+            ia_css_process_group_get_terminal(process_group, i);
+        ia_css_buffer_state_t buffer_state;
+        bool ok = false;
+
+        verifexitval(terminal != NULL, EINVAL);
+        if (ia_css_is_terminal_data_terminal(terminal) == true) {
+            /*
+             * buffer_state is applicable only for data terminals
+             */
+            ia_css_frame_t *frame =
+                ia_css_data_terminal_get_frame(
+                    (ia_css_data_terminal_t *)terminal);
+            bool is_input = ia_css_is_terminal_input(terminal);
+            /*
+             * check for NULL here.
+             * then invoke next 2 statements
+             */
+            verifexitval(frame != NULL, EINVAL);
+            IA_CSS_TRACE_5(PSYSAPI_DYNAMIC, VERBOSE,
+                "\tTerminal %d: buffer_state %u, access_type %u, data_bytes %u, data %u\n",
+                i, frame->buffer_state, frame->access_type,
+                frame->data_bytes, frame->data);
+            buffer_state = ia_css_frame_get_buffer_state(frame);
+
+            ok = ((is_input &&
+                (buffer_state == IA_CSS_BUFFER_FULL)) ||
+                    (!is_input && (buffer_state ==
+                            IA_CSS_BUFFER_EMPTY)));
+
+        } else if (ia_css_is_terminal_parameter_terminal(terminal) ==
+                true) {
+            /*
+             * FIXME:
+             * is there any pre-requisite for param_terminal?
+             */
+            ok = true;
+        } else if (ia_css_is_terminal_program_terminal(terminal) ==
+                true) {
+            ok = true;
+        } else if (ia_css_is_terminal_program_control_init_terminal(terminal) ==
+                true) {
+            ok = true;
+        } else if (ia_css_is_terminal_spatial_parameter_terminal(
+                    terminal) == true) {
+            ok = true;
+        } else {
+            /* neither data nor parameter terminal, so error.*/
+            break;
+        }
+
+        if (!ok)
+            break;
+    }
+    /* Only true if no check failed */
+    can_start = (i == terminal_count);
+
+    retval = 0;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_can_process_group_submit invalid argument process_group\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_can_process_group_start failed (%i)\n",
+            retval);
+    }
+    return can_start;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+size_t ia_css_process_group_get_size(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    size_t size = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_size(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    size = process_group->size;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_size invalid argument\n");
+    }
+    return size;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_process_group_state_t ia_css_process_group_get_state(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    ia_css_process_group_state_t state = IA_CSS_N_PROCESS_GROUP_STATES;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_state(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    state = process_group->state;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_state invalid argument\n");
+    }
+    return state;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_process_group_get_kernel_bitmap(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    ia_css_kernel_bitmap_t bitmap = ia_css_kernel_bitmap_clear();
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+               "ia_css_process_group_get_kernel_bitmap(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    bitmap = process_group->kernel_bitmap;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+         "ia_css_process_group_get_kernel_bitmap invalid argument process\n");
+    }
+    return bitmap;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+const ia_css_rbm_t *ia_css_process_group_get_routing_bitmap(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    const ia_css_rbm_t *rbm = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_routing_bitmap(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    rbm = &(process_group->routing_bitmap);
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_routing_bitmap invalid argument\n");
+    }
+    return rbm;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint16_t ia_css_process_group_get_fragment_count(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    uint16_t fragment_count = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_fragment_count(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    fragment_count = process_group->fragment_count;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_fragment_count invalid argument\n");
+    }
+    return fragment_count;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_process_group_get_process_count(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    uint8_t process_count = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_process_count(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    process_count = process_group->process_count;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_process_count invalid argument\n");
+    }
+    return process_count;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_process_group_get_terminal_count(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    uint8_t terminal_count = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_terminal_count(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    terminal_count = process_group->terminal_count;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_terminal_count invalid argument\n");
+    }
+    return terminal_count;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_process_group_get_psys_server_init_cycles(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    uint32_t psys_server_init_cycles = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "uint32_t ia_css_process_group_get_psys_server_init_cycles(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    psys_server_init_cycles = process_group->psys_server_init_cycles;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "uint32_t ia_css_process_group_get_psys_server_init_cycles invalid argument\n");
+    }
+    return psys_server_init_cycles;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_process_group_get_pg_load_start_ts(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    uint32_t pg_load_start_ts = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_pg_load_start_ts(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    pg_load_start_ts = process_group->pg_load_start_ts;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_pg_load_start_ts invalid argument\n");
+    }
+    return pg_load_start_ts;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_process_group_get_pg_load_cycles(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    uint32_t pg_load_cycles = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_pg_load_cycles(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    pg_load_cycles = process_group->pg_load_cycles;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_pg_load_cycles invalid argument\n");
+    }
+    return pg_load_cycles;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_process_group_get_pg_init_cycles(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    uint32_t pg_init_cycles = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_pg_init_cycles(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    pg_init_cycles = process_group->pg_init_cycles;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_pg_init_cycles invalid argument\n");
+    }
+    return pg_init_cycles;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_process_group_get_pg_processing_cycles(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    uint32_t pg_processing_cycles = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_pg_processing_cycles(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    pg_processing_cycles = process_group->pg_processing_cycles;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_pg_processing_cycles invalid argument\n");
+    }
+    return pg_processing_cycles;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_process_group_get_pg_next_frame_init_cycles(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    uint32_t pg_next_frame_init_cycles = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_pg_next_frame_init_cycles(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    pg_next_frame_init_cycles = process_group->pg_next_frame_init_cycles;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_pg_next_frame_init_cycles invalid argument\n");
+    }
+    return pg_next_frame_init_cycles;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_process_group_get_pg_complete_cycles(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    uint32_t pg_complete_cycles = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_pg_complete_cycles(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    pg_complete_cycles = process_group->pg_complete_cycles;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_pg_complete_cycles invalid argument\n");
+    }
+    return pg_complete_cycles;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_terminal_t *ia_css_process_group_get_terminal_from_type(
+        const ia_css_process_group_t *process_group,
+        const ia_css_terminal_type_t terminal_type)
+{
+    unsigned int proc_cnt;
+    ia_css_terminal_t *terminal = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+            "ia_css_process_group_get_terminal_from_type(): enter:\n");
+
+    for (proc_cnt = 0; proc_cnt < (unsigned int)ia_css_process_group_get_terminal_count(process_group); proc_cnt++) {
+        terminal = ia_css_process_group_get_terminal(process_group, proc_cnt);
+        if (terminal == NULL) {
+            IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+                    "ia_css_process_group_get_terminal_from_type() Failed to get terminal %d", proc_cnt);
+            goto EXIT;
+        }
+        if (ia_css_terminal_get_type(terminal) == terminal_type) {
+            return terminal;
+        }
+        terminal = NULL; /* If not the expected type, return NULL */
+    }
+EXIT:
+    return terminal;
+}
+
+/* Returns the terminal or NULL if it was not found
+   For some of those maybe valid to not exist at all in the process group */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+const ia_css_terminal_t *ia_css_process_group_get_single_instance_terminal(
+    const ia_css_process_group_t     *process_group,
+    ia_css_terminal_type_t        term_type)
+{
+    int i, term_count;
+
+    assert(process_group != NULL);
+
+    /* Those below have at most one instance per process group */
+    assert(term_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
+        term_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT ||
+        term_type == IA_CSS_TERMINAL_TYPE_PROGRAM ||
+        term_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT);
+
+    term_count = ia_css_process_group_get_terminal_count(process_group);
+
+    for (i = 0; i < term_count; i++) {
+        const ia_css_terminal_t    *terminal = ia_css_process_group_get_terminal(process_group, i);
+
+        if (ia_css_terminal_get_type(terminal) == term_type) {
+            /* Only one parameter terminal per process group */
+            return terminal;
+        }
+    }
+
+    return NULL;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_terminal_t *ia_css_process_group_get_manifest_idx_terminal(
+    const ia_css_process_group_t *process_grp,
+    const unsigned int manifest_idx)
+{
+    DECLARE_ERRVAL
+    uint8_t i = 0;
+    uint8_t terminal_count;
+
+    terminal_count =
+        ia_css_process_group_get_terminal_count(process_grp);
+
+    for ( i = 0; i < terminal_count;
+            i++) {
+        unsigned int man_term_idx;
+        ia_css_terminal_t *terminal;
+
+        terminal =
+            ia_css_process_group_get_terminal(
+                    process_grp, i);
+        verifexitval(NULL != terminal, EFAULT);
+        man_term_idx =
+            ia_css_terminal_get_terminal_manifest_index(terminal);
+        if (man_term_idx == manifest_idx)
+            return terminal;
+    }
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_manifest_idx_terminal Error\n");
+    }
+    return NULL;
+
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_terminal_t *ia_css_process_group_get_terminal(
+    const ia_css_process_group_t *process_grp,
+    const unsigned int terminal_num)
+{
+    DECLARE_ERRVAL
+    ia_css_terminal_t *terminal_ptr = NULL;
+    uint16_t *terminal_offset_table;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_terminal(): enter:\n");
+
+    verifexitval(process_grp != NULL, EFAULT);
+    verifexitval(terminal_num < process_grp->terminal_count, EINVAL);
+
+    terminal_offset_table =
+        (uint16_t *)((char *)process_grp +
+                process_grp->terminals_offset);
+    terminal_ptr =
+        (ia_css_terminal_t *)((char *)process_grp +
+                terminal_offset_table[terminal_num]);
+
+    verifexitval(terminal_ptr != NULL, EFAULT);
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_terminal invalid argument\n");
+    }
+    return terminal_ptr;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_process_t *ia_css_process_group_get_process(
+    const ia_css_process_group_t *process_grp,
+    const unsigned int process_num)
+{
+    DECLARE_ERRVAL
+    ia_css_process_t *process_ptr = NULL;
+    uint16_t *process_offset_table;
+
+    verifexitval(process_grp != NULL, EFAULT);
+    verifexitval(process_num < process_grp->process_count, EINVAL);
+
+    process_offset_table =
+        (uint16_t *)((char *)process_grp +
+                process_grp->processes_offset);
+    process_ptr =
+        (ia_css_process_t *)((char *)process_grp +
+                process_offset_table[process_num]);
+
+    verifexitval(process_ptr != NULL, EFAULT);
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_process invalid argument\n");
+    }
+    return process_ptr;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_program_group_ID_t ia_css_process_group_get_program_group_ID(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    ia_css_program_group_ID_t id = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_program_group_ID(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    id = process_group->ID;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_program_group_ID invalid argument\n");
+    }
+    return id;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t ia_css_process_group_get_resource_bitmap(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    vied_nci_resource_bitmap_t resource_bitmap = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_resource_bitmap(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    resource_bitmap = process_group->resource_bitmap;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_resource_bitmap invalid argument\n");
+    }
+    return resource_bitmap;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_set_resource_bitmap(
+    ia_css_process_group_t *process_group,
+    const vied_nci_resource_bitmap_t resource_bitmap)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_set_resource_bitmap(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    process_group->resource_bitmap = resource_bitmap;
+
+    retval = 0;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_set_resource_bitmap invalid argument process_group\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_set_resource_bitmap failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_set_routing_bitmap(
+    ia_css_process_group_t *process_group,
+    const ia_css_rbm_t rbm)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_set_routing_bitmap(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+    process_group->routing_bitmap = rbm;
+    retval = 0;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_set_routing_bitmap invalid argument process_group\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_set_routing_bitmap failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_process_group_compute_cycle_count(
+    const ia_css_program_group_manifest_t *manifest,
+    const ia_css_program_group_param_t *param)
+{
+    DECLARE_ERRVAL
+    uint32_t cycle_count = 0;
+
+    NOT_USED(manifest);
+    NOT_USED(param);
+
+    verifexitval(manifest != NULL, EFAULT);
+    verifexitval(param != NULL, EFAULT);
+
+    cycle_count = 1;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_compute_cycle_count invalid argument\n");
+    }
+    return cycle_count;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_set_fragment_state(
+    ia_css_process_group_t *process_group,
+    uint16_t fragment_state)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_group_set_fragment_state(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+    verifexitval(fragment_state <= ia_css_process_group_get_fragment_count(
+                process_group), EINVAL);
+
+    process_group->fragment_state = fragment_state;
+    retval = 0;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_set_fragment_state invalid argument process_group\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_set_fragment_state failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_get_fragment_state(
+    const ia_css_process_group_t *process_group,
+    uint16_t *fragment_state)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_fragment_state(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+    verifexitval(fragment_state != NULL, EFAULT);
+
+    *fragment_state = process_group->fragment_state;
+    retval = 0;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_fragment_state invalid argument\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_fragment_state failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_get_ipu_vaddress(
+    const ia_css_process_group_t *process_group,
+    vied_vaddress_t *ipu_vaddress)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_ipu_vaddress(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+    verifexitval(ipu_vaddress != NULL, EFAULT);
+
+    *ipu_vaddress = process_group->ipu_virtual_address;
+    retval = 0;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_ipu_vaddress invalid argument\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_ipu_vaddress failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_set_ipu_vaddress(
+    ia_css_process_group_t *process_group,
+    vied_vaddress_t ipu_vaddress)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_set_ipu_vaddress(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    process_group->ipu_virtual_address = ipu_vaddress;
+    retval = 0;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_set_ipu_vaddress invalid argument\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_set_ipu_vaddress failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_process_group_get_protocol_version(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    uint8_t protocol_version = IA_CSS_PROCESS_GROUP_N_PROTOCOLS;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_protocol_version(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    protocol_version = process_group->protocol_version;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_protocol_version invalid argument\n");
+    }
+    return protocol_version;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_process_group_get_base_queue_id(
+    ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    uint8_t queue_id = IA_CSS_N_PSYS_CMD_QUEUE_ID;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_base_queue_id(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    queue_id = process_group->base_queue_id;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_base_queue_id invalid argument\n");
+    }
+    return queue_id;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_set_base_queue_id(
+    ia_css_process_group_t *process_group,
+    uint8_t queue_id)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_set_base_queue_id(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    /* Make sure that Driver\host don't use the main command queue or device queue for the ppg queues*/
+    if ((queue_id > IA_CSS_PSYS_CMD_QUEUE_DEVICE_ID) && ((queue_id + process_group->num_queues - 1) < IA_CSS_N_PSYS_CMD_QUEUE_ID)) {
+        process_group->base_queue_id = queue_id;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_set_base_queue_id: queue_id %u out of range for process_group 0x%lx\n",
+                       queue_id, (unsigned long int)process_group);
+    }
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_set_base_queue_id invalid argument\n");
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_process_group_get_num_queues(
+    ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    uint8_t num_queues = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_num_queues(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    num_queues = process_group->num_queues;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_num_queues invalid argument\n");
+    }
+    return num_queues;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_set_num_queues(
+    ia_css_process_group_t *process_group,
+    uint8_t num_queues)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_set_num_queues(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    process_group->num_queues = num_queues;
+    retval = 0;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_set_num_queues invalid argument\n");
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_set_error_handling_enable(
+    ia_css_process_group_t *process_group,
+    const bool error_handling_enable)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_set_error_handling_enable(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    process_group->error_handling_enable = (uint8_t)((error_handling_enable == true) ? 1 : 0);
+    retval = 0;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_set_error_handling_enable invalid argument\n");
+    }
+
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_process_group_get_error_handling_enable(
+    const ia_css_process_group_t *process_group)
+{
+    DECLARE_ERRVAL
+    uint8_t error_handling_enable = UINT8_MAX;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_error_handling_enable(): enter:\n");
+
+    verifexitval(process_group != NULL, EFAULT);
+
+    /* Error handling enable flag should serve as boolean type, so it can be either 0 or 1 */
+    assert(process_group->error_handling_enable <= (uint8_t)1);
+    error_handling_enable = process_group->error_handling_enable;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_get_error_handling_enable invalid argument\n");
+    }
+
+    return error_handling_enable;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_process_group_has_vp(const ia_css_process_group_t *process_group)
+{
+#if NUM_OF_VP_CELLS > 0
+    bool has_vp = false;
+#ifdef HAS_VP
+    uint32_t i;
+
+    uint8_t process_count = ia_css_process_group_get_process_count(process_group);
+
+    for (i = 0; i < process_count; i++) {
+        ia_css_process_t *process;
+        vied_nci_cell_ID_t cell_id;
+
+        process = ia_css_process_group_get_process(process_group, i);
+        cell_id = ia_css_process_get_cell(process);
+
+        if (VIED_NCI_VP_TYPE_ID == vied_nci_cell_get_type(cell_id)) {
+            has_vp = true;
+            break;
+        }
+    }
+#else /* not HAS_VP */
+        NOT_USED(process_group);
+#endif /* HAS_VP */
+
+    return has_vp;
+#else
+    NOT_USED(process_group);
+    return false;
+#endif
+}
+
+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_impl.h
new file mode 100644
index 000000000000..de5719c70522
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_impl.h
@@ -0,0 +1,694 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_IMPL_H
+#define __IA_CSS_PSYS_PROCESS_IMPL_H
+
+#include <ia_css_psys_process.h>
+
+#include <ia_css_psys_process_group.h>
+#include <ia_css_psys_program_manifest.h>
+
+#include <error_support.h>
+#include <misc_support.h>
+#include <assert_support.h>
+
+#include <vied_nci_psys_system_global.h>
+
+#include "ia_css_psys_dynamic_trace.h"
+#include "ia_css_psys_process_private_types.h"
+
+/** Function only to be used in FW */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_process_ext_t *ia_css_process_get_extension(const ia_css_process_t *process)
+{
+    DECLARE_ERRVAL
+    verifexitval(process != NULL, EFAULT);
+    if (process->process_extension_offset != 0) {
+        return (ia_css_process_ext_t *)((uint8_t *)process + process->process_extension_offset);
+    }
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_get_extension invalid argument\n");
+    }
+    return NULL;
+}
+
+/** Function only to be used in ia_css_psys_process_impl.h and ia_css_psys_process.h */
+STORAGE_CLASS_INLINE vied_nci_cell_ID_t ia_css_process_cells_get_cell(const ia_css_process_t *process, int index)
+{
+    assert(index < IA_CSS_PROCESS_MAX_CELLS);
+    return process->cells[index];
+}
+
+/** Function only to be used in ia_css_psys_process_impl.h and ia_css_psys_process.h */
+STORAGE_CLASS_INLINE void ia_css_process_cells_set_cell(ia_css_process_t *process, int index, vied_nci_cell_ID_t cell_id)
+{
+    assert(index < IA_CSS_PROCESS_MAX_CELLS);
+    process->cells[index] = cell_id;
+}
+
+/** Function only to be used in ia_css_psys_process_impl.h and ia_css_psys_process */
+STORAGE_CLASS_INLINE void ia_css_process_cells_clear(ia_css_process_t *process)
+{
+    int i;
+    for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
+        ia_css_process_cells_set_cell(process, i, VIED_NCI_N_CELL_ID);
+    }
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_cell_ID_t ia_css_process_get_cell(
+    const ia_css_process_t                    *process)
+{
+    DECLARE_ERRVAL
+    vied_nci_cell_ID_t    cell_id = VIED_NCI_N_CELL_ID;
+    int i = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_get_cell(): enter:\n");
+
+    verifexitval(process != NULL, EFAULT);
+
+    for (i = 1; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
+        assert(VIED_NCI_N_CELL_ID == ia_css_process_cells_get_cell(process, i));
+#ifdef __HIVECC
+#pragma hivecc unroll
+#endif
+    }
+    cell_id = ia_css_process_cells_get_cell(process, 0);
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_get_cell invalid argument\n");
+    }
+    return cell_id;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_mem_ID_t ia_css_process_get_ext_mem_id(
+    const ia_css_process_t        *process,
+    const vied_nci_mem_type_ID_t    mem_type)
+{
+    DECLARE_ERRVAL
+    ia_css_process_ext_t *process_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_get_ext_mem(): enter:\n");
+
+    verifexitval(process != NULL && mem_type < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
+    process_ext = ia_css_process_get_extension(process);
+    verifexitval(process_ext != NULL, EFAULT);
+
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_get_ext_mem invalid argument\n");
+        return IA_CSS_PROCESS_INVALID_OFFSET;
+    }
+    return process_ext->ext_mem_id[mem_type];
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_process_get_program_idx(
+    const ia_css_process_t        *process)
+{
+    DECLARE_ERRVAL
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_get_program_idx(): enter:\n");
+
+    verifexitval(process != NULL, EFAULT);
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_get_program_idx invalid argument\n");
+        return IA_CSS_PROCESS_INVALID_PROGRAM_IDX;
+    }
+    return process->program_idx;
+}
+
+#if VIED_NCI_N_DEV_CHN_ID > 0
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_resource_size_t ia_css_process_get_dev_chn(
+    const ia_css_process_t        *process,
+    const vied_nci_dev_chn_ID_t    dev_chn_id)
+{
+    DECLARE_ERRVAL
+    ia_css_process_ext_t *process_ext = NULL;
+
+    COMPILATION_ERROR_IF(VIED_NCI_N_DATA_MEM_TYPE_ID != VIED_NCI_N_MEM_TYPE_ID - 1); /* check for vied_nci_psys_resource_model.h correctness */
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_get_dev_chn(): enter:\n");
+    verifexitval(process != NULL && dev_chn_id < VIED_NCI_N_DEV_CHN_ID, EFAULT);
+    process_ext = ia_css_process_get_extension(process);
+    verifexitval(process_ext != NULL, EFAULT);
+
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_get_dev_chn(): invalid arguments\n");
+        return IA_CSS_PROCESS_INVALID_OFFSET;
+    }
+    return process_ext->dev_chn_offset[dev_chn_id];
+}
+#endif /* VIED_NCI_N_DEV_CHN_ID */
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_resource_size_t ia_css_process_get_int_mem_offset(
+    const ia_css_process_t                *process,
+    const vied_nci_mem_type_ID_t            mem_id)
+{
+    (void)process;
+    (void)mem_id;
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_get_int_mem_offset always returns 0"
+        "(internally memory feature not used).\n");
+    return 0;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_resource_size_t ia_css_process_get_ext_mem_offset(
+    const ia_css_process_t                *process,
+    const vied_nci_mem_type_ID_t            mem_type_id)
+{
+    DECLARE_ERRVAL
+    vied_nci_resource_size_t ext_mem_offset = IA_CSS_PROCESS_INVALID_OFFSET;
+    ia_css_process_ext_t *process_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_get_ext_mem_offset(): enter:\n");
+
+    verifexitval(process != NULL && mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
+    process_ext = ia_css_process_get_extension(process);
+    verifexitval(process_ext != NULL, EFAULT);
+
+EXIT:
+    if (noerror()) {
+        ext_mem_offset = process_ext->ext_mem_offset[mem_type_id];
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_get_ext_mem_offset invalid argument\n");
+    }
+
+    return ext_mem_offset;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+size_t ia_css_process_get_size(
+    const ia_css_process_t                    *process)
+{
+    DECLARE_ERRVAL
+    size_t    size = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_get_size(): enter:\n");
+
+    verifexitval(process != NULL, EFAULT);
+
+EXIT:
+    if (noerror()) {
+        size = process->size;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+                   "ia_css_process_get_size invalid argument\n");
+    }
+
+    return size;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_process_state_t ia_css_process_get_state(
+    const ia_css_process_t                    *process)
+{
+    DECLARE_ERRVAL
+    ia_css_process_state_t    state = IA_CSS_N_PROCESS_STATES;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+               "ia_css_process_get_state(): enter:\n");
+
+    verifexitval(process != NULL, EFAULT);
+
+EXIT:
+    if (noerror()) {
+        state = (ia_css_process_state_t)process->state;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+                   "ia_css_process_get_state invalid argument\n");
+    }
+
+    return state;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_set_state(
+    ia_css_process_t                    *process,
+    ia_css_process_state_t                state)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+               "ia_css_process_set_state(): enter:\n");
+
+    verifexitval(process != NULL, EFAULT);
+
+    assert(state <= UINT8_MAX);
+    process->state = state;
+    retval = 0;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_set_state invalid argument\n");
+    }
+
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_process_get_cell_dependency_count(
+    const ia_css_process_t                    *process)
+{
+    DECLARE_ERRVAL
+    uint8_t    cell_dependency_count = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+               "ia_css_process_get_cell_dependency_count(): enter:\n");
+
+    verifexitval(process != NULL, EFAULT);
+    cell_dependency_count = process->cell_dependency_count;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+        "ia_css_process_get_cell_dependency_count invalid argument\n");
+    }
+    return cell_dependency_count;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_process_get_terminal_dependency_count(
+    const ia_css_process_t                    *process)
+{
+    DECLARE_ERRVAL
+    uint8_t    terminal_dependency_count = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_get_terminal_dependency_count(): enter:\n");
+
+    verifexitval(process != NULL, EFAULT);
+    terminal_dependency_count = process->terminal_dependency_count;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_get_terminal_dependency_count invalid argument process\n");
+    }
+    return terminal_dependency_count;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_process_group_t *ia_css_process_get_parent(
+    const ia_css_process_t                    *process)
+{
+    DECLARE_ERRVAL
+    ia_css_process_group_t    *parent = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_get_parent(): enter:\n");
+
+    verifexitval(process != NULL, EFAULT);
+    if (process->parent_offset == 0) {
+        return NULL;
+    };
+    parent =
+    (ia_css_process_group_t *) ((char *)process + process->parent_offset);
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_get_parent invalid argument process\n");
+    }
+    return parent;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_program_ID_t ia_css_process_get_program_ID(
+    const ia_css_process_t                    *process)
+{
+    DECLARE_ERRVAL
+    ia_css_program_ID_t        id = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+               "ia_css_process_get_program_ID(): enter:\n");
+
+    verifexitval(process != NULL, EFAULT);
+
+    id = process->ID;
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_get_program_ID invalid argument process\n");
+    }
+    return id;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_resource_id_t ia_css_process_get_cell_dependency(
+    const ia_css_process_t *process,
+    const unsigned int cell_num)
+{
+    DECLARE_ERRVAL
+    vied_nci_resource_id_t cell_dependency =
+        IA_CSS_PROCESS_INVALID_DEPENDENCY;
+    vied_nci_resource_id_t *cell_dep_ptr = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_get_cell_dependency(): enter:\n");
+
+    verifexitval(process != NULL, EFAULT);
+    verifexitval(cell_num < process->cell_dependency_count, EFAULT);
+
+    cell_dep_ptr =
+        (vied_nci_resource_id_t *)
+        ((char *)process + process->cell_dependencies_offset);
+    cell_dependency = *(cell_dep_ptr + cell_num);
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+               "ia_css_process_get_cell_dependency invalid argument\n");
+    }
+    return cell_dependency;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_process_get_terminal_dependency(
+    const ia_css_process_t                    *process,
+    const unsigned int                    terminal_num)
+{
+    DECLARE_ERRVAL
+    uint8_t *ter_dep_ptr = NULL;
+    uint8_t ter_dep = IA_CSS_PROCESS_INVALID_DEPENDENCY;
+
+    verifexitval(process != NULL, EFAULT);
+    verifexitval(terminal_num < process->terminal_dependency_count, EFAULT);
+
+    ter_dep_ptr = (uint8_t *) ((char *)process +
+                   process->terminal_dependencies_offset);
+
+    ter_dep = *(ter_dep_ptr + terminal_num);
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+               "ia_css_process_get_terminal_dependency invalid argument\n");
+    }
+    return ter_dep;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t ia_css_process_get_cells_bitmap(
+    const ia_css_process_t *process)
+{
+    DECLARE_ERRVAL
+    vied_nci_resource_bitmap_t bitmap = 0;
+    vied_nci_cell_ID_t cell_id;
+    int i = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+               "ia_css_process_get_cell_bitmap(): enter:\n");
+
+    verifexitval(process != NULL, EFAULT);
+
+    for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
+        cell_id = ia_css_process_cells_get_cell(process, i);
+        if (VIED_NCI_N_CELL_ID != cell_id) {
+            bitmap |= (1 << cell_id);
+        }
+#ifdef __HIVECC
+#pragma hivecc unroll
+#endif
+    }
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+         "ia_css_process_get_cells_bitmap invalid argument process\n");
+    }
+
+    return bitmap;
+}
+
+#if HAS_DFM
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t* ia_css_process_get_dfm_port_bitmap_ptr(
+    ia_css_process_t *process)
+{
+    DECLARE_ERRVAL
+    vied_nci_resource_bitmap_t *p_bitmap = NULL;
+    ia_css_process_ext_t *process_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+               "ia_css_process_get_dfm_port_bitmap(): enter:\n");
+
+    verifexitval(process != NULL, EFAULT);
+    process_ext = ia_css_process_get_extension(process);
+    if (process_ext == NULL) {
+        return NULL;
+    }
+
+    p_bitmap = &process_ext->dfm_port_bitmap[0];
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+         "ia_css_process_get_dfm_port_bitmap invalid argument process\n");
+    }
+
+    return p_bitmap;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t* ia_css_process_get_dfm_active_port_bitmap_ptr(
+    ia_css_process_t *process)
+{
+    DECLARE_ERRVAL
+    vied_nci_resource_bitmap_t *p_bitmap = NULL;
+    ia_css_process_ext_t *process_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+               "ia_css_process_get_dfm_port_bitmap(): enter:\n");
+
+    verifexitval(process != NULL, EFAULT);
+    process_ext = ia_css_process_get_extension(process);
+    if (process_ext == NULL) {
+        return NULL;
+    }
+
+    p_bitmap = &process_ext->dfm_active_port_bitmap[0];
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+         "ia_css_process_get_dfm_port_bitmap invalid argument process\n");
+    }
+
+    return p_bitmap;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t ia_css_process_get_dfm_port_bitmap(
+    const ia_css_process_t *process,
+    vied_nci_dev_dfm_id_t  dfm_res_id)
+{
+    DECLARE_ERRVAL
+    vied_nci_resource_bitmap_t bitmap = 0;
+    ia_css_process_ext_t *process_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+               "ia_css_process_get_dfm_port_bitmap(): enter:\n");
+
+    verifexitval(process != NULL, EFAULT);
+    process_ext = ia_css_process_get_extension(process);
+    if (process_ext == NULL) {
+        return 0;
+    }
+    verifexitval(dfm_res_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
+    bitmap = process_ext->dfm_port_bitmap[dfm_res_id];
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+         "ia_css_process_get_dfm_port_bitmap invalid argument process\n");
+    }
+
+    return bitmap;
+}
+#endif /* HAS_DFM */
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t ia_css_process_get_dfm_active_port_bitmap(
+    const ia_css_process_t *process,
+    vied_nci_dev_dfm_id_t  dfm_res_id)
+{
+    DECLARE_ERRVAL
+    vied_nci_resource_bitmap_t bitmap = 0;
+    ia_css_process_ext_t *process_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+               "ia_css_process_get_dfm_active_port_bitmap(): enter:\n");
+
+    verifexitval(process != NULL, EFAULT);
+    process_ext = ia_css_process_get_extension(process);
+    if (process_ext == NULL) {
+        return 0;
+    }
+#if HAS_DFM
+    verifexitval(dfm_res_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
+    bitmap = process_ext->dfm_active_port_bitmap[dfm_res_id];
+#else
+    NOT_USED(dfm_res_id);
+#endif
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+         "ia_css_process_get_dfm_active_port_bitmap invalid argument process\n");
+    }
+    return bitmap;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_is_process_valid(
+    const ia_css_process_t        *process,
+    const ia_css_program_manifest_t    *p_manifest)
+{
+    DECLARE_ERRVAL
+    bool invalid_flag = false;
+    ia_css_program_ID_t prog_id;
+
+    verifexitval(NULL != process, EFAULT);
+    verifexitval(NULL != p_manifest, EFAULT);
+
+    prog_id = ia_css_process_get_program_ID(process);
+    verifjmpexit(prog_id == ia_css_program_manifest_get_program_ID(p_manifest));
+
+    invalid_flag = (process->size <= process->cell_dependencies_offset) ||
+           (process->size <= process->terminal_dependencies_offset);
+
+    if (ia_css_has_program_manifest_fixed_cell(p_manifest)) {
+        vied_nci_cell_ID_t cell_id;
+
+        cell_id = ia_css_program_manifest_get_cell_ID(p_manifest);
+        invalid_flag = invalid_flag ||
+                (cell_id != (vied_nci_cell_ID_t)(ia_css_process_get_cell(process)));
+    }
+    invalid_flag = invalid_flag ||
+        ((process->cell_dependency_count +
+          process->terminal_dependency_count) == 0) ||
+        (process->cell_dependency_count !=
+    ia_css_program_manifest_get_program_dependency_count(p_manifest)) ||
+        (process->terminal_dependency_count !=
+    ia_css_program_manifest_get_terminal_dependency_count(p_manifest));
+
+    /* TODO: to be removed once all PGs pass validation */
+    if (invalid_flag == true) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+            "ia_css_is_process_valid(): false\n");
+    }
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_is_process_valid() invalid argument\n");
+        return false;
+    } else {
+        return (!invalid_flag);
+    }
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_cmd(
+    ia_css_process_t                    *process,
+    const ia_css_process_cmd_t                cmd)
+{
+    int    retval = -1;
+    ia_css_process_state_t    state;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO, "ia_css_process_cmd(): enter:\n");
+
+    verifexit(process != NULL);
+
+    state = ia_css_process_get_state(process);
+
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO, "ia_css_process_cmd(): state: %d\n", state);
+
+    verifexit(state != IA_CSS_PROCESS_ERROR);
+    verifexit(state < IA_CSS_N_PROCESS_STATES);
+
+    switch (cmd) {
+    case IA_CSS_PROCESS_CMD_NOP:
+        break;
+    case IA_CSS_PROCESS_CMD_ACQUIRE:
+        verifexit(state == IA_CSS_PROCESS_READY);
+        break;
+    case IA_CSS_PROCESS_CMD_RELEASE:
+        verifexit(state == IA_CSS_PROCESS_READY);
+        break;
+    case IA_CSS_PROCESS_CMD_START:
+        verifexit((state == IA_CSS_PROCESS_READY)
+              || (state == IA_CSS_PROCESS_STOPPED));
+        process->state = IA_CSS_PROCESS_STARTED;
+        break;
+    case IA_CSS_PROCESS_CMD_LOAD:
+        verifexit((state == IA_CSS_PROCESS_STARTED)
+                || (state == IA_CSS_PROCESS_READY)
+                || (state == IA_CSS_PROCESS_STOPPED));
+        process->state = IA_CSS_PROCESS_RUNNING;
+        break;
+    case IA_CSS_PROCESS_CMD_STOP:
+        verifexit((state == IA_CSS_PROCESS_RUNNING)
+              || (state == IA_CSS_PROCESS_SUSPENDED));
+        process->state = IA_CSS_PROCESS_STOPPED;
+        break;
+    case IA_CSS_PROCESS_CMD_SUSPEND:
+        verifexit(state == IA_CSS_PROCESS_RUNNING);
+        process->state = IA_CSS_PROCESS_SUSPENDED;
+        break;
+    case IA_CSS_PROCESS_CMD_RESUME:
+        verifexit(state == IA_CSS_PROCESS_SUSPENDED);
+        process->state = IA_CSS_PROCESS_RUNNING;
+        break;
+    case IA_CSS_N_PROCESS_CMDS:    /* Fall through */
+    default:
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_cmd invalid cmd (0x%x)\n", cmd);
+        goto EXIT;
+    }
+    retval = 0;
+EXIT:
+    if (NULL == process) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_cmd invalid argument process\n");
+    }
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_cmd failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+#endif /* __IA_CSS_PSYS_PROCESS_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_private_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_private_types.h
new file mode 100644
index 000000000000..e2252295212e
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_private_types.h
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_PRIVATE_TYPES_H
+#define __IA_CSS_PSYS_PROCESS_PRIVATE_TYPES_H
+
+#include "ia_css_psys_process_types.h"
+#include "vied_nci_psys_resource_model.h"
+
+#define    N_UINT32_IN_PROCESS_STRUCT                0
+#define    N_UINT16_IN_PROCESS_STRUCT                1
+#define    N_UINT8_IN_PROCESS_STRUCT                8
+
+#if IA_CSS_PROCESS_STATE_BITS != 8
+#error IA_CSS_PROCESS_STATE_BITS expected to be 8
+#endif
+
+#define SIZE_OF_PROCESS_EXTENSION \
+     ((VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
+    + (VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
+    + (VIED_NCI_N_DATA_MEM_TYPE_ID * VIED_NCI_RESOURCE_SIZE_BITS) \
+    + (VIED_NCI_N_DEV_CHN_ID * VIED_NCI_RESOURCE_SIZE_BITS) \
+    + (VIED_NCI_N_DATA_MEM_TYPE_ID * VIED_NCI_RESOURCE_ID_BITS) \
+    + (N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT * 8))
+
+/** Extended process attributes describing more resource requirements
+ *  (and some DFM handling details ) beyond those covered in
+ *  ia_css_process_s.
+ */
+struct ia_css_process_ext_s {
+#if VIED_NCI_N_DEV_DFM_ID > 0
+    /** DFM port allocated to this process */
+    vied_nci_resource_bitmap_t dfm_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
+    /** Active DFM ports which need a kick */
+    vied_nci_resource_bitmap_t dfm_active_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
+#endif
+#if VIED_NCI_N_DATA_MEM_TYPE_ID > 0
+    /** (external) Memory allocation offset given to this process */
+    vied_nci_resource_size_t ext_mem_offset[VIED_NCI_N_DATA_MEM_TYPE_ID];
+#endif
+#if VIED_NCI_N_DEV_CHN_ID > 0
+    /** Device channel allocation offset given to this process */
+    vied_nci_resource_size_t dev_chn_offset[VIED_NCI_N_DEV_CHN_ID];
+#endif
+#if VIED_NCI_N_DATA_MEM_TYPE_ID > 0
+    /** (external) Memory ID */
+    vied_nci_resource_id_t ext_mem_id[VIED_NCI_N_DATA_MEM_TYPE_ID];
+#endif
+#if N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT > 0
+    /** Number of processes (mapped on cells) this process depends on */
+    uint8_t padding[N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT];
+#endif
+};
+
+#define SIZE_OF_PROCESS_STRUCT_BITS \
+    ((N_UINT32_IN_PROCESS_STRUCT * 32) \
+    + (IA_CSS_PROGRAM_ID_BITS) \
+    + (N_UINT16_IN_PROCESS_STRUCT * 16) \
+    + (IA_CSS_PROCESS_MAX_CELLS * VIED_NCI_RESOURCE_ID_BITS) \
+    + (N_UINT8_IN_PROCESS_STRUCT * 8) \
+    + ((N_PADDING_UINT8_IN_PROCESS_STRUCT) * 8))
+
+/** Process attributes describing the instantiation of a single Program
+ *  within a Program Group.
+ */
+struct ia_css_process_s {
+    /** Reference to the containing process group */
+    int16_t parent_offset;
+    /** Size of this structure */
+    uint8_t size;
+    /** Offset in bytes to Array[dependency_count] of ID's (type vied_nci_resource_id_t)
+     *  of the cells that provide input to this process.
+     *  Align to 64 bit boundary.
+     *  Set to zero if dependency_count is zero.
+     *  @see cell_dependency_count in this structure */
+    uint8_t cell_dependencies_offset;
+    /** Offset in bytes to Array[terminal_dependency_count] of indices (type: uint8_t)
+     *  of connected terminals (that is, the terminals that are associated with this process).
+     *  Each index is a key into to the process group terminal list.
+     *  Set to zero if dependency_count is zero.
+     *  @see terminal_dependency_count in this structure
+     *  @see ia_css_process_group_get_terminal() */
+    uint8_t terminal_dependencies_offset;
+    /** Offset in bytes to process extension structure, ia_css_process_ext_s
+     *  Align to 32 bit boundary.
+     *  Set to zero if extension is not used. The manifest must be queried to
+     *  find out if the extensino is necessary.
+     *  @see ia_css_program_manifest_process_requires_extension() */
+    uint8_t process_extension_offset;
+    /** Referal ID to a specific program.  This ID is unique across PG's and
+     *  can be used to retreive program meta data (AKA "program descriptor")
+     *  from the client package, including the program manifest and even
+     *  firmware program code, if the program is to be executed on a DSP. */
+    ia_css_program_ID_t ID;
+    /** Program index into the list of programs in the containing PG */
+    uint8_t program_idx;
+    /** State of the process FSM dependent on the parent FSM.  Type is actually: ia_css_process_state_t
+     *  Used by the PSYSAPI for its own process state machine and internally by FW.  For the purposes of
+     *  the ABI protocol definition, host code should just set this to IA_CSS_PROCESS_READY before sending
+     *  an IA_CSS_PROCESS_GROUP_CMD_START command to firmware.  */
+    uint8_t state;
+    /** Execution resources (e.g. DSP "cells" or fixed HW) required by the process. */
+    vied_nci_resource_id_t cells[IA_CSS_PROCESS_MAX_CELLS];
+    /** Size of the array of dependent cells pointed at by cell_dependencies_offset
+     *  Value must be set to the corresponding value from the manifest entry for this program.
+     *  As each program implies a cell (logically, if not physically) to execute the program,
+     *  the dependent cell count value in the process is the same as the dependent program count.
+     *  @see ia_css_program_manifest_get_program_dependency_count() */
+    uint8_t cell_dependency_count;
+    /** Number of terminals this process depends on.  This is the size of the array
+     *  pointed at by terminal_dependencies_offset
+     *  Value must be set to the corresponding value from the manifest entry for this program.
+     *  @see ia_css_program_manifest_get_terminal_dependency_count()
+     */
+    uint8_t terminal_dependency_count;
+#if (N_PADDING_UINT8_IN_PROCESS_STRUCT > 0)
+    /** Padding bytes for 64bit alignment*/
+    uint8_t padding[N_PADDING_UINT8_IN_PROCESS_STRUCT];
+#endif /*(N_PADDING_UINT8_IN_PROCESS_STRUCT > 0)*/
+};
+
+#endif /* __IA_CSS_PSYS_PROCESS_PRIVATE_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_types.h
new file mode 100644
index 000000000000..748db439fd8e
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_types.h
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_TYPES_H
+#define __IA_CSS_PSYS_PROCESS_TYPES_H
+
+/*! \file */
+
+/** @file ia_css_psys_process_types.h
+ *
+ * The types belonging to the terminal/process/process group dynamic module
+ */
+
+#include <type_support.h>
+#include <vied_nci_psys_system_global.h>
+
+#include <ia_css_psys_manifest_types.h>
+
+#define IA_CSS_PROCESS_INVALID_PROGRAM_IDX  ((uint32_t)-1)
+
+/* private */
+typedef enum ia_css_process_group_cmd {
+    IA_CSS_PROCESS_GROUP_CMD_NOP = 0,
+    IA_CSS_PROCESS_GROUP_CMD_SUBMIT,
+    IA_CSS_PROCESS_GROUP_CMD_ATTACH,
+    IA_CSS_PROCESS_GROUP_CMD_DETACH,
+    IA_CSS_PROCESS_GROUP_CMD_START,
+    IA_CSS_PROCESS_GROUP_CMD_DISOWN,
+    IA_CSS_PROCESS_GROUP_CMD_RUN,
+    IA_CSS_PROCESS_GROUP_CMD_STOP,
+    IA_CSS_PROCESS_GROUP_CMD_SUSPEND,
+    IA_CSS_PROCESS_GROUP_CMD_RESUME,
+    IA_CSS_PROCESS_GROUP_CMD_ABORT,
+    IA_CSS_PROCESS_GROUP_CMD_RESET,
+    IA_CSS_N_PROCESS_GROUP_CMDS
+} ia_css_process_group_cmd_t;
+
+/* private */
+#define IA_CSS_PROCESS_GROUP_STATE_BITS    32
+typedef enum ia_css_process_group_state {
+    IA_CSS_PROCESS_GROUP_ERROR = 0,
+    IA_CSS_PROCESS_GROUP_CREATED,
+    IA_CSS_PROCESS_GROUP_READY,
+    IA_CSS_PROCESS_GROUP_BLOCKED,
+    IA_CSS_PROCESS_GROUP_STARTED,
+    IA_CSS_PROCESS_GROUP_RUNNING,
+    IA_CSS_PROCESS_GROUP_STALLED,
+    IA_CSS_PROCESS_GROUP_STOPPED,
+    IA_CSS_N_PROCESS_GROUP_STATES
+} ia_css_process_group_state_t;
+
+/* private */
+typedef enum ia_css_process_cmd {
+    IA_CSS_PROCESS_CMD_NOP = 0,
+    IA_CSS_PROCESS_CMD_ACQUIRE,
+    IA_CSS_PROCESS_CMD_RELEASE,
+    IA_CSS_PROCESS_CMD_START,
+    IA_CSS_PROCESS_CMD_LOAD,
+    IA_CSS_PROCESS_CMD_STOP,
+    IA_CSS_PROCESS_CMD_SUSPEND,
+    IA_CSS_PROCESS_CMD_RESUME,
+    IA_CSS_N_PROCESS_CMDS
+} ia_css_process_cmd_t;
+
+/* private */
+#define IA_CSS_PROCESS_STATE_BITS    8
+typedef enum ia_css_process_state {
+    IA_CSS_PROCESS_ERROR = 0,
+    IA_CSS_PROCESS_CREATED,
+    IA_CSS_PROCESS_READY,
+    IA_CSS_PROCESS_STARTED,
+    IA_CSS_PROCESS_RUNNING,
+    IA_CSS_PROCESS_STOPPED,
+    IA_CSS_PROCESS_SUSPENDED,
+    IA_CSS_N_PROCESS_STATES
+} ia_css_process_state_t;
+
+/* public */
+typedef struct ia_css_process_group_s    ia_css_process_group_t;
+typedef struct ia_css_process_s        ia_css_process_t;
+typedef struct ia_css_process_ext_s    ia_css_process_ext_t;
+
+typedef struct ia_css_data_terminal_s    ia_css_data_terminal_t;
+
+#endif /* __IA_CSS_PSYS_PROCESS_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.h
new file mode 100644
index 000000000000..9a06e995aa88
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.h
@@ -0,0 +1,320 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_H
+#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_H
+
+#include "ia_css_psys_static_storage_class.h"
+
+/*! \file */
+
+/** @file ia_css_psys_program_group_manifest.h
+ *
+ * Define the methods on the program group manifest object that are not part of
+ * a single interface.
+ *
+ * Set functions in this file are for not for production use by the
+ * users (testing/simulation only).
+ */
+
+#include <ia_css_psys_manifest_types.h>
+
+#include <type_support.h>            /* uint8_t */
+
+#include <ia_css_psys_program_group_manifest.sim.h>
+
+#include <ia_css_psys_program_group_manifest.hsys.user.h>
+
+#include <ia_css_kernel_bitmap.h>        /* ia_css_kernel_bitmap_t */
+#include "ia_css_terminal_manifest.h"
+#include "ia_css_rbm_manifest_types.h"
+
+#define IA_CSS_PROGRAM_GROUP_INVALID_ALIGNMENT        ((uint8_t)(-1))
+
+/*! Get the stored size of the program group manifest object
+
+ @param    manifest[in]            program group manifest object
+
+ @return size, 0 on invalid argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+size_t ia_css_program_group_manifest_get_size(
+    const ia_css_program_group_manifest_t *manifest);
+
+/*! Get the program group ID of the program group manifest object
+
+ @param    manifest[in]            program group manifest object
+
+ @return program group ID, IA_CSS_PROGRAM_GROUP_INVALID_ID on invalid argument
+*/
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_program_group_ID_t
+ia_css_program_group_manifest_get_program_group_ID(
+    const ia_css_program_group_manifest_t *manifest);
+
+/*! Set the program group ID of the program group manifest object
+
+ @param    manifest[in]            program group manifest object
+
+ @param program group ID
+
+ @return 0 on success, -1 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_program_group_manifest_set_program_group_ID(
+    ia_css_program_group_manifest_t *manifest,
+    ia_css_program_group_ID_t id);
+
+/*! Get the storage alignment constraint of the program group binary data
+
+ @param    manifest[in]            program group manifest object
+
+ @return alignment, IA_CSS_PROGRAM_GROUP_INVALID_ALIGNMENT on invalid manifest
+    argument
+*/
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_group_manifest_get_alignment(
+    const ia_css_program_group_manifest_t *manifest);
+
+/*! Set the storage alignment constraint of the program group binary data
+
+ @param    manifest[in]            program group manifest object
+ @param    alignment[in]            alignment desired
+
+ @return < 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_program_group_manifest_set_alignment(
+    ia_css_program_group_manifest_t *manifest,
+    const uint8_t alignment);
+
+/*! Get the kernel enable bitmap of the program group
+
+ @param    manifest[in]            program group manifest object
+
+ @return bitmap, 0 on invalid manifest argument
+ */
+extern ia_css_kernel_bitmap_t
+ia_css_program_group_manifest_get_kernel_bitmap(
+    const ia_css_program_group_manifest_t *manifest);
+
+/*! Set the kernel enable bitmap of the program group
+
+ @param    manifest[in]            program group manifest object
+ @param    kernel bitmap[in]        kernel enable bitmap
+
+ @return < 0 on invalid manifest argument
+ */
+extern int ia_css_program_group_manifest_set_kernel_bitmap(
+    ia_css_program_group_manifest_t *manifest,
+    const ia_css_kernel_bitmap_t bitmap);
+
+/*! Get the number of programs in the program group manifest object
+
+ @param    manifest[in]            program group manifest object
+
+ @return program count, 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_group_manifest_get_program_count(
+    const ia_css_program_group_manifest_t *manifest);
+
+/*! Get the number of terminals in the program group manifest object
+
+ @param    manifest[in]            program group manifest object
+
+ @return terminal count, 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_group_manifest_get_terminal_count(
+    const ia_css_program_group_manifest_t *manifest);
+
+/*! Get the (pointer to) private data blob in the manifest
+
+  Private data is used by FW and is opauque to the SW stack
+
+ @param    manifest[in]            program group manifest object
+
+ @return private data blob, NULL on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+void *ia_css_program_group_manifest_get_private_data(
+    const ia_css_program_group_manifest_t *manifest);
+
+/*! Get the (pointer to) routing bitmap (rbm) manifest
+
+ @param    manifest[in]            program group manifest object
+
+ @return rbm manifest, NULL on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_rbm_manifest_t *
+ia_css_program_group_manifest_get_rbm_manifest(
+    const ia_css_program_group_manifest_t *manifest);
+
+/*! Get the (pointer to) indexed program manifest in the program group manifest
+ * object
+
+ @param    manifest[in]            program group manifest object
+ @param    program_index[in]        index of the program manifest object
+
+ @return program manifest, NULL on invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_program_manifest_t *
+ia_css_program_group_manifest_get_prgrm_mnfst(
+    const ia_css_program_group_manifest_t *manifest,
+    const unsigned int program_index);
+
+/*! Get the (pointer to) indexed terminal manifest in the program group
+ * manifest object
+
+ @param    manifest[in]            program group manifest object
+ @param    program_index[in]        index of the terminal manifest object
+
+ @return terminal manifest, NULL on invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_manifest_t *
+ia_css_program_group_manifest_get_term_mnfst(
+    const ia_css_program_group_manifest_t *manifest,
+    const unsigned int terminal_index);
+
+/*! Get the (pointer to) indexed data terminal manifest in the program group
+ * manifest object
+
+ @param    manifest[in]            program group manifest object
+ @param    program_index[in]        index of the terminal manifest object
+
+ @return data terminal manifest, NULL on invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_data_terminal_manifest_t *
+ia_css_program_group_manifest_get_data_terminal_manifest(
+    const ia_css_program_group_manifest_t *manifest,
+    const unsigned int terminal_index);
+
+/*! Get the (pointer to) indexed parameter terminal manifest in the program
+ * group manifest object
+
+ @param    manifest[in]            program group manifest object
+ @param    program_index[in]        index of the terminal manifest object
+
+ @return parameter terminal manifest, NULL on invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_param_terminal_manifest_t *
+ia_css_program_group_manifest_get_param_terminal_manifest(
+    const ia_css_program_group_manifest_t *manifest,
+    const unsigned int terminal_index);
+
+/*! Get the (pointer to) indexed spatial param terminal manifest in the program
+ * group manifest object
+
+ @param    manifest[in]            program group manifest object
+ @param    program_index[in]        index of the terminal manifest object
+
+ @return spatial param terminal manifest, NULL on invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_spatial_param_terminal_manifest_t *
+ia_css_program_group_manifest_get_spatial_param_terminal_manifest(
+    const ia_css_program_group_manifest_t *manifest,
+    const unsigned int terminal_index);
+
+/*! Get the (pointer to) indexed sliced param terminal manifest in the program
+ * group manifest object
+
+ @param    manifest[in]            program group manifest object
+ @param    program_index[in]        index of the terminal manifest object
+
+ @return sliced param terminal manifest, NULL on invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_sliced_param_terminal_manifest_t *
+ia_css_program_group_manifest_get_sliced_param_terminal_manifest(
+    const ia_css_program_group_manifest_t *manifest,
+    const unsigned int terminal_index);
+
+/*! Get the (pointer to) indexed program terminal manifest in the program group
+ * manifest object
+
+ @parammanifest[in]program group manifest object
+ @paramprogram_index[in]index of the terminal manifest object
+
+ @return program terminal manifest, NULL on invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_program_terminal_manifest_t *
+ia_css_program_group_manifest_get_program_terminal_manifest(
+    const ia_css_program_group_manifest_t *manifest,
+    const unsigned int terminal_index);
+
+/*!    initialize program group manifest
+
+ @param    manifest[in]        program group manifest object
+ @param    program_count[in]    number of programs.
+ @param    terminal_count[in]    number of terminals.
+ @param program_needs_extension[in] Array[program count]
+ @param    program_deps[in]    program dependencies for programs in pg.
+ @param    terminal_deps[in]    terminal dependencies for programs in pg.
+ @param    terminal_type[in]    array of terminal types, binary specific
+                static frame data
+ @param    cached_in_param_section_count[in]Number of parameter terminal sections
+ @param cached_out_param_section_count[in]    Number of parameter out terminal
+ @param    spatial_param_section_count[in]        Array[spatial_terminal_count]
+                        with sections per cached out
+                        terminal
+ @param sliced_in_param_section_count[in]    Array[sliced_in_terminal_count]
+                        with sections per sliced in
+                        terminal
+ @param sliced_out_param_section_count[in]    Array[sliced_out_terminal_count]
+                        with sections per sliced out
+                        terminal
+ @param    fragment_param_section_count[in]    Number of fragment parameter
+                        sections of the program init
+                        terminal,
+ @param    kernel_fragment_seq_count[in]        Number of kernel fragment
+                        seqence info.
+ @param    progctrlinit_load_section_counts[in]    Number of progctrinit load
+                        sections (size of array is program_count)
+ @param    progctrlinit_connect_section_counts[in]    Number of progctrinit connect
+                        sections (size of array is program_count)
+ @return none;
+ */
+extern void ia_css_program_group_manifest_init(
+    ia_css_program_group_manifest_t *blob,
+    const uint8_t program_count,
+    const uint8_t terminal_count,
+    const uint8_t *program_needs_extension,
+    const uint8_t *program_dependencies,
+    const uint8_t *terminal_dependencies,
+    const ia_css_terminal_type_t *terminal_type,
+    const uint16_t *cached_in_param_section_count,
+    const uint16_t *cached_out_param_section_count,
+    const uint16_t *spatial_param_section_count,
+    const uint16_t *fragment_param_section_count,
+    const uint16_t *sliced_in_param_section_count,
+    const uint16_t *sliced_out_param_section_count,
+    const uint16_t *kernel_fragment_seq_count,
+    const uint16_t *progctrlinit_load_section_counts,
+    const uint16_t *progctrlinit_connect_section_counts);
+
+#ifdef __IA_CSS_PSYS_STATIC_INLINE__
+#include "ia_css_psys_program_group_manifest_impl.h"
+#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
+
+#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.hsys.user.h
new file mode 100644
index 000000000000..dc79168a38d7
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.hsys.user.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_HSYS_USER_H
+#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_HSYS_USER_H
+
+/*! \file */
+
+/** @file ia_css_psys_program_group_manifest.hsys.user.h
+ *
+ * Define the methods on the program group manifest object: Hsys user interface
+ */
+
+#include <ia_css_psys_manifest_types.h>
+
+#include <type_support.h>    /* bool */
+
+/*! Print the program group manifest object to file/stream
+    in textual format
+
+ @param    manifest[in]        program group manifest object
+ @param    fid[out]        file/stream handle
+
+ @return < 0 on error
+ */
+extern int ia_css_program_group_manifest_print(
+    const ia_css_program_group_manifest_t *manifest,
+    void *fid);
+
+/*! Read the program group manifest object from file/stream
+  in binary format.
+
+ @see ia_css_program_group_manifest_write()
+
+ @param    fid[in]            file/stream handle
+
+ @return NULL on error
+ */
+extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_read(
+    void *fid);
+
+/*! Write the program group manifest object to file/stream
+  in binary format
+
+ @see ia_css_program_group_manifest_read()
+
+ @param    manifest[in]        program group manifest object
+ @param    fid[out]        file/stream handle
+
+ @return < 0 on error
+ */
+extern int ia_css_program_group_manifest_write(
+    const ia_css_program_group_manifest_t *manifest,
+    void *fid);
+
+/*! Boolean test if the program group manifest is valid
+
+ @param    manifest[in]        program group manifest
+
+ @return true if program group manifest is correct, false on error
+ */
+extern bool ia_css_is_program_group_manifest_valid(
+    const ia_css_program_group_manifest_t *manifest);
+
+#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_HSYS_USER_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.sim.h
new file mode 100644
index 000000000000..98d6a0235f3d
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.sim.h
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H
+#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H
+
+/*! \file */
+
+/** @file ia_css_psys_program_group_manifest.sim.h
+ *
+ * Define the methods on the program group manifest object: Simulation only
+ */
+
+#include <ia_css_psys_manifest_types.h>
+
+#include <type_support.h>    /* uint8_t */
+#include "ia_css_terminal_defs.h"
+
+/*! Create a program group manifest object from specification
+
+ @param    specification[in]        specification (index)
+
+ @return NULL on error
+ */
+extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_create(
+    const unsigned int specification);
+
+/*! Destroy the program group manifest object
+
+ @param    manifest[in]            program group manifest
+
+ @return NULL
+ */
+extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_destroy(
+    ia_css_program_group_manifest_t            *manifest);
+
+/*! Compute the size of storage required for allocating
+ * the program group (PG) manifest object
+
+ @param    program_count[in]            Number of programs in the PG
+ @param    terminal_count[in]            Number of terminals on the PG
+ @param program_needs_extension[in]        Array[program count]
+ @param    program_dependency_count[in]        Array[program_count] with the PG
+ @param    terminal_dependency_count[in]        Array[program_count] with the
+                        terminal dependencies
+ @param    terminal_type[in]            Array[terminal_count] with the
+                        terminal type
+ @param    cached_in_param_section_count[in]    Number of parameter
+                        in terminal sections
+ @param    cached_out_param_section_count[in]    Number of parameter
+                        out terminal sections
+ @param    sliced_param_section_count[in]        Array[sliced_terminal_count]
+                        with sections per
+                        sliced in terminal
+ @param    sliced_out_param_section_count[in]    Array[sliced_terminal_count]
+                        with sections per
+                        sliced out terminal
+ @param    spatial_param_section_count[in]        Array[spatial_terminal_count]
+                        with sections per
+                        spatial terminal
+ @param    fragment_param_section_count[in]    Number of fragment parameter
+                        sections of the
+                        program init terminal,
+ @param    kernel_fragment_seq_count[in]        Number of
+                        kernel_fragment_seq_count.
+ @param    progctrlinit_load_section_counts[in]    Number of progctrinit load
+                        sections (size of array is program_count)
+ @param    progctrlinit_connect_section_counts[in]    Number of progctrinit connect
+                        sections (size of array is program_count)
+ @return 0 on error
+ */
+size_t ia_css_sizeof_program_group_manifest(
+    const uint8_t            program_count,
+    const uint8_t            terminal_count,
+    const uint8_t            *program_needs_extension,
+    const uint8_t            *program_dependency_count,
+    const uint8_t            *terminal_dependency_count,
+    const ia_css_terminal_type_t    *terminal_type,
+    const uint16_t            *cached_in_param_section_count,
+    const uint16_t            *cached_out_param_section_count,
+    const uint16_t            *spatial_param_section_count,
+    const uint16_t            *fragment_param_section_count,
+    const uint16_t            *sliced_param_section_count,
+    const uint16_t            *sliced_out_param_section_count,
+    const uint16_t            *kernel_fragment_seq_count,
+    const uint16_t            *progctrlinit_load_section_counts,
+    const uint16_t            *progctrlinit_connect_section_counts);
+
+/*! Create (the storage for) the program group manifest object
+
+ @param    program_count[in]        Number of programs in the program group
+ @param    terminal_count[in]        Number of terminals on the program group
+ @param    program_dependency_count[in]    Array[program_count] with the
+                    program dependencies
+ @param    terminal_dependency_count[in]    Array[program_count] with the
+                    terminal dependencies
+ @param    terminal_type[in]        Array[terminal_count] with the
+                    terminal type
+
+ @return NULL on error
+ */
+extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_alloc(
+    const uint8_t            program_count,
+    const uint8_t            terminal_count,
+    const uint8_t            *program_dependency_count,
+    const uint8_t            *terminal_dependency_count,
+    const ia_css_terminal_type_t    *terminal_type);
+
+/*! Free (the storage of) the program group manifest object
+
+ @param    manifest[in]            program group manifest
+
+ @return NULL
+ */
+extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_free(
+    ia_css_program_group_manifest_t *manifest);
+
+#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest_impl.h
new file mode 100644
index 000000000000..e86ff93995e6
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest_impl.h
@@ -0,0 +1,417 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_IMPL_H
+#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_IMPL_H
+
+#include <ia_css_psys_program_group_manifest.h>
+#include <ia_css_psys_program_manifest.h>
+#include <ia_css_psys_terminal_manifest.h>
+#include <ia_css_kernel_bitmap.h>
+#include "ia_css_psys_program_group_private.h"
+#include "ia_css_terminal_manifest_types.h"
+#include "ia_css_psys_private_pg_data.h"
+#include <vied_nci_psys_system_global.h>    /* Safer bit mask functions */
+#include "ia_css_psys_static_trace.h"
+#include "ia_css_rbm_manifest_types.h"
+#include <error_support.h>
+#include <assert_support.h>
+#include <misc_support.h>
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+size_t ia_css_program_group_manifest_get_size(
+    const ia_css_program_group_manifest_t *manifest)
+{
+    size_t size = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_group_manifest_get_size(): enter:\n");
+
+    if (manifest != NULL) {
+        size = manifest->size;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+            "ia_css_program_group_manifest_get_size invalid argument\n");
+    }
+    return size;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_program_group_ID_t
+ia_css_program_group_manifest_get_program_group_ID(
+    const ia_css_program_group_manifest_t *manifest)
+{
+    ia_css_program_group_ID_t id = IA_CSS_PROGRAM_GROUP_INVALID_ID;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_group_manifest_get_program_group_ID(): enter:\n");
+
+    if (manifest != NULL) {
+        id = manifest->ID;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+            "ia_css_program_group_manifest_get_program_group_ID invalid argument\n");
+    }
+    return id;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+int ia_css_program_group_manifest_set_program_group_ID(
+    ia_css_program_group_manifest_t *manifest,
+    ia_css_program_group_ID_t id)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_group_manifest_set_program_group_ID(): enter:\n");
+
+    if (manifest != NULL) {
+        manifest->ID = id;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+            "ia_css_program_group_manifest_set_program_group_ID invalid argument\n");
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+int ia_css_program_group_manifest_set_alignment(
+    ia_css_program_group_manifest_t *manifest,
+    const uint8_t alignment)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_group_manifest_set_alignment(): enter:\n");
+
+    if (manifest != NULL) {
+        manifest->alignment = alignment;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+            "ia_css_program_group_manifest_set_alignment invalid argument\n");
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_group_manifest_get_alignment(
+    const ia_css_program_group_manifest_t *manifest)
+{
+    uint8_t alignment = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_group_manifest_get_alignment(): enter:\n");
+
+    if (manifest != NULL) {
+        alignment = manifest->alignment;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+            "ia_css_program_group_manifest_get_alignment invalid argument\n");
+    }
+    return alignment;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+void *ia_css_program_group_manifest_get_private_data(
+    const ia_css_program_group_manifest_t *manifest)
+{
+    void *private_data = NULL;
+
+    IA_CSS_TRACE_1(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_group_manifest_get_private_data(%p): enter:\n",
+        manifest);
+
+    verifexit(manifest != NULL);
+
+    private_data = (void *)((const char *)manifest +
+                manifest->private_data_offset);
+EXIT:
+    if (NULL == manifest) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+            "ia_css_program_group_manifest_get_private_data invalid argument\n");
+    }
+    return private_data;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_rbm_manifest_t *ia_css_program_group_manifest_get_rbm_manifest(
+    const ia_css_program_group_manifest_t *manifest)
+{
+    ia_css_rbm_manifest_t *rbm_manifest = NULL;
+
+    IA_CSS_TRACE_1(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_group_manifest_get_rbm_manifest(%p): enter:\n",
+        manifest);
+
+    verifexit(manifest != NULL);
+
+    rbm_manifest = (ia_css_rbm_manifest_t *)((const char *)manifest +
+                manifest->rbm_manifest_offset);
+
+EXIT:
+    if (NULL == manifest) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+            "ia_css_program_group_manifest_get_rbm_manifest invalid argument\n");
+    }
+    return rbm_manifest;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_program_manifest_t *
+ia_css_program_group_manifest_get_prgrm_mnfst(
+    const ia_css_program_group_manifest_t *manifest,
+    const unsigned int program_index)
+{
+    ia_css_program_manifest_t *prg_manifest_base;
+    uint8_t *program_manifest = NULL;
+    uint8_t program_count;
+    unsigned int i;
+
+    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_group_manifest_get_prgrm_mnfst(%p,%d): enter:\n",
+        manifest, program_index);
+
+    program_count =
+        ia_css_program_group_manifest_get_program_count(manifest);
+
+    verifexit(manifest != NULL);
+    verifexit(program_index < program_count);
+
+    prg_manifest_base = (ia_css_program_manifest_t *)((char *)manifest +
+        manifest->program_manifest_offset);
+    if (program_index < program_count) {
+        program_manifest = (uint8_t *)prg_manifest_base;
+        for (i = 0; i < program_index; i++) {
+            program_manifest += ((ia_css_program_manifest_t *)
+                    program_manifest)->size;
+        }
+    }
+
+EXIT:
+    if (NULL == manifest || program_index >= program_count) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+            "ia_css_program_group_manifest_get_prgrm_mnfst invalid argument\n");
+    }
+    return (ia_css_program_manifest_t *)program_manifest;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_data_terminal_manifest_t *
+ia_css_program_group_manifest_get_data_terminal_manifest(
+    const ia_css_program_group_manifest_t *manifest,
+    const unsigned int terminal_index)
+{
+    ia_css_data_terminal_manifest_t *data_terminal_manifest = NULL;
+    ia_css_terminal_manifest_t *terminal_manifest;
+
+    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_group_manifest_get_data_terminal_manifest(%p, %d): enter:\n",
+        manifest, (int)terminal_index);
+
+    terminal_manifest =
+        ia_css_program_group_manifest_get_term_mnfst(manifest,
+            terminal_index);
+
+    verifexit(ia_css_is_terminal_manifest_data_terminal(terminal_manifest));
+
+    data_terminal_manifest =
+        (ia_css_data_terminal_manifest_t *)terminal_manifest;
+EXIT:
+    return data_terminal_manifest;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_param_terminal_manifest_t *
+ia_css_program_group_manifest_get_param_terminal_manifest(
+    const ia_css_program_group_manifest_t *manifest,
+    const unsigned int terminal_index)
+{
+    ia_css_param_terminal_manifest_t *param_terminal_manifest = NULL;
+    ia_css_terminal_manifest_t *terminal_manifest;
+
+    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_group_manifest_get_param_terminal_manifest(%p, %d): enter:\n",
+        manifest, (int)terminal_index);
+
+    terminal_manifest =
+        ia_css_program_group_manifest_get_term_mnfst(manifest,
+            terminal_index);
+
+    verifexit(ia_css_is_terminal_manifest_parameter_terminal(
+            terminal_manifest));
+    param_terminal_manifest =
+        (ia_css_param_terminal_manifest_t *)terminal_manifest;
+EXIT:
+    return param_terminal_manifest;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_spatial_param_terminal_manifest_t *
+ia_css_program_group_manifest_get_spatial_param_terminal_manifest(
+    const ia_css_program_group_manifest_t *manifest,
+    const unsigned int terminal_index)
+{
+    ia_css_spatial_param_terminal_manifest_t *
+        spatial_param_terminal_manifest = NULL;
+    ia_css_terminal_manifest_t *terminal_manifest;
+
+    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_group_manifest_get_spatial_param_terminal_manifest(%p, %d): enter:\n",
+        manifest, (int)terminal_index);
+
+    terminal_manifest =
+        ia_css_program_group_manifest_get_term_mnfst(manifest,
+            terminal_index);
+
+    verifexit(ia_css_is_terminal_manifest_spatial_parameter_terminal(
+            terminal_manifest));
+
+    spatial_param_terminal_manifest =
+        (ia_css_spatial_param_terminal_manifest_t *)terminal_manifest;
+EXIT:
+    return spatial_param_terminal_manifest;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_sliced_param_terminal_manifest_t *
+ia_css_program_group_manifest_get_sliced_param_terminal_manifest(
+    const ia_css_program_group_manifest_t *manifest,
+    const unsigned int terminal_index)
+{
+    ia_css_sliced_param_terminal_manifest_t *
+        sliced_param_terminal_manifest = NULL;
+    ia_css_terminal_manifest_t *terminal_manifest;
+
+    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_group_manifest_get_sliced_param_terminal_manifest(%p, %d): enter:\n",
+        manifest, (int)terminal_index);
+
+    terminal_manifest =
+        ia_css_program_group_manifest_get_term_mnfst(manifest,
+            terminal_index);
+
+    verifexit(ia_css_is_terminal_manifest_sliced_terminal(
+            terminal_manifest));
+
+    sliced_param_terminal_manifest =
+        (ia_css_sliced_param_terminal_manifest_t *)terminal_manifest;
+EXIT:
+    return sliced_param_terminal_manifest;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_program_terminal_manifest_t *
+ia_css_program_group_manifest_get_program_terminal_manifest(
+    const ia_css_program_group_manifest_t *manifest,
+    const unsigned int terminal_index)
+{
+    ia_css_program_terminal_manifest_t *program_terminal_manifest = NULL;
+    ia_css_terminal_manifest_t *terminal_manifest;
+
+    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_group_manifest_get_program_terminal_manifest(%p, %d): enter:\n",
+        manifest, (int)terminal_index);
+
+    terminal_manifest =
+        ia_css_program_group_manifest_get_term_mnfst(manifest,
+            terminal_index);
+
+    verifexit(ia_css_is_terminal_manifest_program_terminal(
+            terminal_manifest));
+
+    program_terminal_manifest =
+        (ia_css_program_terminal_manifest_t *)terminal_manifest;
+ EXIT:
+    return program_terminal_manifest;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_terminal_manifest_t *
+ia_css_program_group_manifest_get_term_mnfst(
+    const ia_css_program_group_manifest_t *manifest,
+    const unsigned int terminal_index)
+{
+    ia_css_terminal_manifest_t *terminal_manifest = NULL;
+    ia_css_terminal_manifest_t *terminal_manifest_base;
+    uint8_t terminal_count;
+    uint8_t i = 0;
+    uint32_t offset;
+
+    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_group_manifest_get_term_mnfst(%p,%d): enter:\n",
+        manifest, (int)terminal_index);
+
+    verifexit(manifest != NULL);
+
+    terminal_count =
+        ia_css_program_group_manifest_get_terminal_count(manifest);
+
+    verifexit(terminal_index < terminal_count);
+
+    terminal_manifest_base =
+        (ia_css_terminal_manifest_t *)((char *)manifest +
+        manifest->terminal_manifest_offset);
+    terminal_manifest = terminal_manifest_base;
+    while (i < terminal_index) {
+        offset =
+        (uint32_t)ia_css_terminal_manifest_get_size(terminal_manifest);
+        terminal_manifest = (ia_css_terminal_manifest_t *)
+                ((char *)terminal_manifest + offset);
+        i++;
+    }
+EXIT:
+    return terminal_manifest;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_group_manifest_get_program_count(
+    const ia_css_program_group_manifest_t *manifest)
+{
+    uint8_t program_count = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_group_manifest_get_program_count(): enter:\n");
+
+    if (manifest != NULL) {
+        program_count = manifest->program_count;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+            "ia_css_program_group_manifest_get_program_count invalid argument\n");
+    }
+    return program_count;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_group_manifest_get_terminal_count(
+    const ia_css_program_group_manifest_t *manifest)
+{
+    uint8_t terminal_count = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_group_manifest_get_terminal_count(): enter:\n");
+
+    if (manifest != NULL) {
+        terminal_count = manifest->terminal_count;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+            "ia_css_program_group_manifest_get_terminal_count invalid argument\n");
+    }
+    return terminal_count;
+}
+
+#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_private.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_private.h
new file mode 100644
index 000000000000..04c826a3164b
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_private.h
@@ -0,0 +1,278 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_PRIVATE_H
+#define __IA_CSS_PSYS_PROGRAM_GROUP_PRIVATE_H
+
+#include "ia_css_psys_manifest_types.h"
+#include "ia_css_terminal_manifest_types.h"
+#include "ia_css_kernel_bitmap.h"
+#include "ia_css_program_group_data.h"
+#include "vied_nci_psys_resource_model.h"
+#include "ia_css_rbm_manifest_types.h"
+#include <type_support.h>
+#include <math_support.h>
+#include <platform_support.h>
+
+/**
+ * @addtogroup group_psysapi
+ * @{
+ */
+
+#define SIZE_OF_PROGRAM_GROUP_MANIFEST_STRUCT_IN_BITS \
+    ((IA_CSS_KERNEL_BITMAP_BITS) \
+    + (IA_CSS_PROGRAM_GROUP_ID_BITS) \
+    + (5 * IA_CSS_UINT16_T_BITS) \
+    + (5 * IA_CSS_UINT8_T_BITS) \
+    + (5 * IA_CSS_UINT8_T_BITS))
+
+/** @brief Meta-data for a program group
+ *
+ * Describes the contents and layout of the program group
+ * components in memory.
+ *
+ * Offsets are relative to the base address of the program group
+ * manifest object.
+ */
+struct ia_css_program_group_manifest_s {
+    /** Indicate kernels are present in this program group */
+    ia_css_kernel_bitmap_t kernel_bitmap;
+    /** Referral ID to program group FW */
+    ia_css_program_group_ID_t ID;
+    /** Offset to program manifest list.  One entry for each program. */
+    uint16_t program_manifest_offset;
+    /** Offset to terminal manifest list.  One entry for each terminal. */
+    uint16_t terminal_manifest_offset;
+    /** Offset to private data (not part of the official API) */
+    uint16_t private_data_offset;
+    /** Offset to RBM manifest */
+    uint16_t rbm_manifest_offset;
+    /** Size of this structure */
+    uint16_t size;
+    /** Storage alignment requirement (in uint8_t) */
+    uint8_t alignment;
+    /** Total number of kernels in this program group */
+    uint8_t kernel_count;
+    /** Total number of program in this program group */
+    uint8_t program_count;
+    /** Total number of terminals on this program group */
+    uint8_t terminal_count;
+    /** Total number of independent subgraphs in this program group */
+    uint8_t subgraph_count;
+    /** Padding; esnures that rbm_manifest starts on 64bit alignment */
+    uint8_t reserved[5];
+};
+
+#define SIZE_OF_PROGRAM_MANIFEST_EXT_STRUCT_IN_BYTES \
+    ((VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
+    + (VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
+    + (VIED_NCI_RESOURCE_SIZE_BITS * VIED_NCI_N_DATA_MEM_TYPE_ID * 2) \
+    + (VIED_NCI_RESOURCE_SIZE_BITS * VIED_NCI_N_DEV_CHN_ID * 2) \
+    + (2 * IA_CSS_UINT8_T_BITS * IA_CSS_MAX_INPUT_DEC_RESOURCES) \
+    + (2 * IA_CSS_UINT8_T_BITS * IA_CSS_MAX_OUTPUT_DEC_RESOURCES) \
+    + (IA_CSS_UINT8_T_BITS * VIED_NCI_N_DEV_DFM_ID) + \
+    + (N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT * IA_CSS_UINT8_T_BITS))
+
+/** "Extended" meta-data for a single program
+ *
+ * Mostly, if not completely, internal to FW and of no interest to the SW stack.
+ */
+struct ia_css_program_manifest_ext_s {
+#if VIED_NCI_N_DEV_DFM_ID > 0
+    /** DFM port allocation of this program */
+    vied_nci_resource_bitmap_t dfm_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
+    /** Active DFM ports which need a kick
+     * If an empty port is configured to run in active mode, the empty
+     * port and the corresponding full port(s) in the stream must be kicked.
+     * The empty port must always be kicked after the full port.
+     */
+    vied_nci_resource_bitmap_t dfm_active_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
+#endif
+#if VIED_NCI_N_DATA_MEM_TYPE_ID > 0
+    /** (external) Memory allocation size needs of this program */
+    vied_nci_resource_size_t ext_mem_size[VIED_NCI_N_DATA_MEM_TYPE_ID];
+    vied_nci_resource_size_t ext_mem_offset[VIED_NCI_N_DATA_MEM_TYPE_ID];
+#endif
+#if VIED_NCI_N_DEV_CHN_ID > 0
+    /** Device channel allocation size needs of this program */
+    vied_nci_resource_size_t dev_chn_size[VIED_NCI_N_DEV_CHN_ID];
+    vied_nci_resource_size_t dev_chn_offset[VIED_NCI_N_DEV_CHN_ID];
+#endif
+#if VIED_NCI_N_DEV_DFM_ID > 0
+    /** DFM ports are relocatable if value is set to 1.
+     * The flag is per dfm port type.
+     * This will not be supported for now.
+     */
+    uint8_t is_dfm_relocatable[VIED_NCI_N_DEV_DFM_ID];
+#endif
+#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
+    /** DEC compression flush service entry, describing which streams
+     *  require flush service handling for decompression (input).
+     *  @note stream ID's are the ID's used by the MMU
+     */
+    uint8_t dec_resources_input[IA_CSS_MAX_INPUT_DEC_RESOURCES];
+    /** Association of streams in dec_resources_input with the terminal
+     *  they belong to.
+     */
+    uint8_t dec_resources_input_terminal[IA_CSS_MAX_INPUT_DEC_RESOURCES];
+#endif
+#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
+    /** DEC compression flush service entry, describing which streams
+     *  require flush service handling for compression (output).
+     *  @note stream ID's are the ID's used by the MMU
+     */
+    uint8_t dec_resources_output[IA_CSS_MAX_OUTPUT_DEC_RESOURCES];
+    /** Association of streams in dec_resources_output with the terminal
+     *  they belong to.
+     */
+    uint8_t dec_resources_output_terminal[IA_CSS_MAX_OUTPUT_DEC_RESOURCES];
+#endif
+/** Padding bytes for 32bit alignment*/
+#if N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT > 0
+    uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT];
+#endif
+};
+
+#define SIZE_OF_PROGRAM_MANIFEST_STRUCT_IN_BITS \
+    (IA_CSS_KERNEL_BITMAP_BITS \
+    + IA_CSS_PROGRAM_ID_BITS \
+    + IA_CSS_PROGRAM_TYPE_BITS \
+    + (1 * IA_CSS_UINT16_T_BITS) \
+    + (IA_CSS_PROCESS_MAX_CELLS * VIED_NCI_RESOURCE_ID_BITS) \
+    + (VIED_NCI_RESOURCE_ID_BITS) \
+    + (6 * IA_CSS_UINT8_T_BITS) \
+    + (N_PADDING_UINT8_IN_PROGRAM_MANIFEST * IA_CSS_UINT8_T_BITS))
+
+/** Meta-data for a single program
+ *
+ * This structure contains only the information required for resource
+ * management and construction of the process group.
+ */
+struct ia_css_program_manifest_s {
+    /** Indicate which kernels lead to this program being used */
+    ia_css_kernel_bitmap_t kernel_bitmap;
+    /** offset to add to reach parent. This is negative value.*/
+    int16_t parent_offset;
+    uint8_t program_dependency_offset;
+    uint8_t terminal_dependency_offset;
+    /** Size of this structure */
+    uint8_t size;
+    /** offset to ia_css_program_manifest_ext_s, 0 if there is none */
+    uint8_t program_extension_offset;
+    /** Specification of for exclusive or parallel programs */
+    uint8_t program_type; /* ia_css_program_type_t */
+    /** Referral ID to a specific program FW, valid ID's != 0 */
+    ia_css_program_ID_t ID;
+    /** Array of all the cells this program needs */
+    vied_nci_resource_id_t cells[IA_CSS_PROCESS_MAX_CELLS];
+    /** (exclusive) indication of a cell type to be used by this program */
+    vied_nci_resource_id_t cell_type_id;
+    /** Number of programs this program depends on */
+    uint8_t program_dependency_count;
+    /** Number of terminals this program depends on */
+    uint8_t terminal_dependency_count;
+    /** Padding bytes for 32bit alignment*/
+#if N_PADDING_UINT8_IN_PROGRAM_MANIFEST > 0
+    uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_MANIFEST];
+#endif
+};
+
+/*
+ *Calculation for manual size check for struct ia_css_data_terminal_manifest_s
+ */
+#define SIZE_OF_DATA_TERMINAL_MANIFEST_STRUCT_IN_BITS \
+    (SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
+    + IA_CSS_FRAME_FORMAT_BITMAP_BITS \
+    + IA_CSS_CONNECTION_BITMAP_BITS \
+    + IA_CSS_KERNEL_BITMAP_BITS \
+    + (4 * (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION)) \
+    + IA_CSS_UINT16_T_BITS \
+    + IA_CSS_UINT8_T_BITS \
+    + (4*IA_CSS_UINT8_T_BITS))
+
+/** Meta-data specific for a data terminal
+ *
+ * Contains mostly capability and constraints information
+ */
+struct ia_css_data_terminal_manifest_s {
+    /** Data terminal base */
+    ia_css_terminal_manifest_t base;
+    /** Supported (4CC / MIPI / parameter) formats */
+    ia_css_frame_format_bitmap_t frame_format_bitmap;
+    /** Indicate which kernels lead to this terminal being used */
+    ia_css_kernel_bitmap_t kernel_bitmap;
+    /** Minimum size of the frame */
+    uint16_t min_size[IA_CSS_N_DATA_DIMENSION];
+    /** Maximum size of the frame */
+    uint16_t max_size[IA_CSS_N_DATA_DIMENSION];
+    /** Minimum size of a fragment that the program port can accept */
+    uint16_t min_fragment_size[IA_CSS_N_DATA_DIMENSION];
+    /** Maximum size of a fragment that the program port can accept */
+    uint16_t max_fragment_size[IA_CSS_N_DATA_DIMENSION];
+    /** Indicate if this terminal is derived from a principal terminal
+     *  @note Can't find meaningful use of this field. */
+    uint16_t terminal_dependency;
+    /** Indicate what (streaming) interface types this terminal supports */
+    ia_css_connection_bitmap_t connection_bitmap;
+    /** Indicates if compression is supported on the data associated with
+     * this terminal. '1' indicates compression is supported,
+     * '0' otherwise
+     */
+    uint8_t compression_support;
+    uint8_t reserved[4];
+};
+
+/* ============  Program Control Init Terminal Manifest - START ============ */
+#define N_PADDING_UINT8_IN_PROGCTRLINIT_MANIFEST_PROGRAM_DESC_STRUCT 4
+struct ia_css_program_control_init_manifest_program_desc_s {
+    uint16_t load_section_count;
+    uint16_t connect_section_count;
+    uint8_t padding[N_PADDING_UINT8_IN_PROGCTRLINIT_MANIFEST_PROGRAM_DESC_STRUCT];
+};
+
+#define N_PADDING_UINT8_IN_PROGCTRLINIT_TERMINAL_MANIFEST_STRUCT 2
+/** Meta-data specific for a program control init terminal
+ *
+ * Program control init terminals have parameters related
+ * to system device (i.e. non-algorithmic devices, like DMA's)
+ * configuration.
+ */
+struct ia_css_program_control_init_terminal_manifest_s {
+    ia_css_terminal_manifest_t base;
+    /** Number of programs in program group.  This terminal can contain
+     * parameters for each program.  Also size of the array at program_desc_offset.
+    */
+    uint32_t program_count;
+    /**
+     * Points to array of ia_css_program_control_init_manifest_program_desc_t
+     * with size program_count.  The descriptor describes the format of the
+     * parameter payload, which is sent separately.
+     */
+    uint16_t program_desc_offset;
+    /** align to 64 */
+    uint8_t padding[N_PADDING_UINT8_IN_PROGCTRLINIT_TERMINAL_MANIFEST_STRUCT];
+};
+/* ============  Program Control Init Terminal Manifest - END ============ */
+
+extern void ia_css_program_manifest_init(
+    ia_css_program_manifest_t    *blob,
+    const uint8_t    program_needs_extension,
+    const uint8_t    program_dependency_count,
+    const uint8_t    terminal_dependency_count);
+
+/** @} */
+
+#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_PRIVATE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.h
new file mode 100644
index 000000000000..db426f95c3a4
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.h
@@ -0,0 +1,679 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_H
+#define __IA_CSS_PSYS_PROGRAM_MANIFEST_H
+
+/*! \file */
+
+/** @file ia_css_psys_program_manifest.h
+ *
+ * Define the methods on the program manifest object that are not part of a
+ * single interface.
+ *
+ * @note The "set" functions here are for testing simulation only.
+ * Real manifests are generated in advance and must be considered read-only from
+ * the production user's perspective.
+ */
+
+#include "ia_css_psys_static_storage_class.h"
+
+#include <ia_css_psys_manifest_types.h>
+
+#include <type_support.h>            /* uint8_t */
+
+#include <ia_css_psys_program_manifest.sim.h>
+
+#include <ia_css_psys_program_manifest.hsys.user.h>
+
+#include <ia_css_kernel_bitmap.h>        /* ia_css_kernel_bitmap_t */
+
+/*
+ * Resources needs
+ */
+#include <ia_css_psys_program_manifest.hsys.kernel.h>
+
+#define IA_CSS_PROGRAM_INVALID_DEPENDENCY    ((uint8_t)(-1))
+#define IA_CSS_PROGRAM_INVALID_DEC_CONFIG    ((uint8_t)(-1))
+
+/** Retrieve extended manifest information generally not visible
+ *  to the SW stack
+ *
+ *  @see ia_css_program_manifest_ext_t
+ *  @note Function only to be used in FW
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_program_manifest_ext_t *ia_css_program_manifest_get_extension(const ia_css_program_manifest_t *program);
+
+/*! Check if the program manifest object specifies a fixed cell allocation
+
+ @param    manifest[in]            program manifest object
+
+ @return has_fixed_cell, false on invalid argument
+ */
+extern bool ia_css_has_program_manifest_fixed_cell(
+    const ia_css_program_manifest_t            *manifest);
+
+/*! Get the stored size of the program manifest object
+
+ @param    manifest[in]            program manifest object
+
+ @return size, 0 on invalid argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+size_t ia_css_program_manifest_get_size(
+    const ia_css_program_manifest_t            *manifest);
+
+/*! Get the program ID of the program manifest object
+
+ @param    manifest[in]            program manifest object
+
+ @return program ID, IA_CSS_PROGRAM_INVALID_ID on invalid argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_program_ID_t ia_css_program_manifest_get_program_ID(
+    const ia_css_program_manifest_t            *manifest);
+
+/*! Set the program ID of the program manifest object
+
+ @param    manifest[in]            program manifest object
+
+ @param program ID
+
+ @return 0 on success, -1 on invalid manifest argument
+ */
+extern int ia_css_program_manifest_set_program_ID(
+    ia_css_program_manifest_t            *manifest,
+    ia_css_program_ID_t id);
+
+/*! Get the (pointer to) the program *group* manifest which contains
+ * this program manifest
+
+ @param    manifest[in]            program manifest object
+
+ @return the pointer to the parent, NULL on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_program_group_manifest_t *ia_css_program_manifest_get_parent(
+    const ia_css_program_manifest_t            *manifest);
+
+/*! Set the offset to the beginning of the program *group* manifest
+ * which contains this program manifest
+
+ @param    manifest[in]            program manifest object
+ @param    program_offset[in]        this program's offset from
+                    program_group_manifest's base address.
+
+ @return < 0 on invalid manifest argument
+ */
+extern int ia_css_program_manifest_set_parent_offset(
+    ia_css_program_manifest_t            *manifest,
+    int32_t program_offset);
+
+/*! Get the type of the program manifest object
+
+ @param    manifest[in]            program manifest object
+
+ @return program type, limit value (IA_CSS_N_PROGRAM_TYPES) on invalid manifest
+    argument
+*/
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_program_type_t ia_css_program_manifest_get_type(
+    const ia_css_program_manifest_t            *manifest);
+
+/*! Set the type of the program manifest object
+
+ @param    manifest[in]            program manifest object
+ @param    program_type[in]        program type
+
+ @return < 0 on invalid manifest argument
+ */
+extern int ia_css_program_manifest_set_type(
+    ia_css_program_manifest_t            *manifest,
+    const ia_css_program_type_t            program_type);
+
+/*! Set the cell id of the program manifest object
+
+ @param    manifest[in]            program manifest object
+ @param    program_cell_id[in]        program cell id
+
+ @return < 0 on invalid manifest argument
+  */
+extern int ia_css_program_manifest_set_cell_ID(
+    ia_css_program_manifest_t            *manifest,
+    const vied_nci_cell_ID_t            cell_id);
+
+/*! Set the cell type of the program manifest object
+
+ @param    manifest[in]            program manifest object
+ @param    program_cell_type[in]        program cell type
+
+ @return < 0 on invalid manifest argument
+ */
+extern int ia_css_program_manifest_set_cell_type_ID(
+    ia_css_program_manifest_t            *manifest,
+    const vied_nci_cell_type_ID_t            cell_type_id);
+
+/*!
+ * Get input terminal id [val] at [idx]
+ *
+ * @param    manifest[in]        program manifest object
+ * @param    idx[in]            index
+ *
+ * @return registered terminal_id for idx
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_manifest_get_input_terminal_id(
+    ia_css_program_manifest_t   *manifest,
+    unsigned char                   idx);
+
+/*!
+ * Get output terminal id [val] at [idx]
+ *
+ * @param    manifest[in]        program manifest object
+ * @param    idx[in]            index
+ *
+ * @return registered terminal_id for idx
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_manifest_get_output_terminal_id(
+    ia_css_program_manifest_t   *manifest,
+    unsigned char                    idx);
+
+/*!
+ * Set output terminal id [val] at [idx]
+ *
+ * @param    manifest[in]        program manifest object
+ * @param    idx[in]            index
+ * @param    val[in]            value
+ *
+ */
+extern void ia_css_program_manifest_set_output_terminal_id(
+    ia_css_program_manifest_t   *manifest,
+    uint8_t                    idx,
+    uint8_t                    val);
+
+/*!
+ * Set input terminal id [val] at [idx]
+ *
+ * @param    manifest[in]        program manifest object
+ * @param    idx[in]            index
+ * @param    val[in]            value
+ *
+ */
+extern void ia_css_program_manifest_set_input_terminal_id(
+    ia_css_program_manifest_t   *manifest,
+    uint8_t                    idx,
+    uint8_t                    val);
+
+/*!
+ * Get compression input MMU stream id [val] at [idx]
+ *
+ * @param    manifest[in]        program manifest object
+ * @param    idx[in]            index
+ *
+ * @return registered stream_id for idx
+ */
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_manifest_get_input_stream_id(
+    ia_css_program_manifest_t   *manifest,
+    unsigned char                   idx);
+
+/*!
+ * Get compression output MMU stream id [val] at [idx]
+ *
+ * @param    manifest[in]        program manifest object
+ * @param    idx[in]            index
+ *
+ * @return registered stream_id for idx
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_manifest_get_output_stream_id(
+    ia_css_program_manifest_t   *manifest,
+    unsigned char                    idx);
+
+/*!
+ * Set compression output MMU stream id [val] at [idx]
+ *
+ * @param    manifest[in]        program manifest object
+ * @param    idx[in]            index
+ * @param    val[in]            value
+ *
+ */
+extern void ia_css_program_manifest_set_output_stream_id(
+    ia_css_program_manifest_t   *manifest,
+    uint8_t                    idx,
+    uint8_t                    val);
+
+/*!
+ * Set *compression* input MMU stream id [val] at [idx]
+ *
+ * @param    manifest[in]        program manifest object
+ * @param    idx[in]            index
+ * @param    val[in]            value
+ *
+ */
+extern void ia_css_program_manifest_set_input_stream_id(
+    ia_css_program_manifest_t   *manifest,
+    uint8_t                    idx,
+    uint8_t                    val);
+
+/*! Set cells bitmap for the program
+
+ @param    manifest[in]            program manifest object
+ @param    bitmap[in]                bitmap
+
+ @return 0 when not applicable and/or invalid arguments
+ */
+extern int ia_css_program_manifest_set_cells_bitmap(
+    ia_css_program_manifest_t            *manifest,
+    const vied_nci_resource_bitmap_t    bitmap);
+
+/*! Get cells bitmap for the program
+
+ @param    manifest[in]            program manifest object
+
+ @return 0 when not applicable and/or invalid arguments
+ */
+extern vied_nci_resource_bitmap_t ia_css_program_manifest_get_cells_bitmap(
+    const ia_css_program_manifest_t            *manifest);
+
+/*! Set DFM port bitmap for the program
+
+ @param    manifest[in]            program manifest object
+ @param    dfm_type_id[in]            DFM resource type ID
+ @param    bitmap[in]                bitmap
+
+ @return 0 when not applicable and/or invalid arguments
+ */
+extern int ia_css_program_manifest_set_dfm_port_bitmap(
+    ia_css_program_manifest_t            *manifest,
+    const vied_nci_dev_dfm_id_t            dfm_type_id,
+    const vied_nci_resource_bitmap_t    bitmap);
+#if HAS_DFM
+/*! Get bitmap of DFM ports requested for the program
+
+ @param    manifest[in]            program manifest object
+ @param    dfm_type_id[in]            DFM resource type ID
+
+ @return DFM port bitmap
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_port_bitmap(
+    const ia_css_program_manifest_t            *manifest,
+    const vied_nci_dev_dfm_id_t            dfm_type_id);
+#endif
+
+/*! Set active DFM port specification bitmap for the program
+
+ @param    manifest[in]            program manifest object
+ @param    dfm_type_id[in]            DFM resource type ID
+ @param    bitmap[in]                bitmap
+
+ @return 0 when not applicable and/or invalid arguments
+ */
+extern int ia_css_program_manifest_set_dfm_active_port_bitmap(
+    ia_css_program_manifest_t            *manifest,
+    const vied_nci_dev_dfm_id_t            dfm_type_id,
+    const vied_nci_resource_bitmap_t    bitmap);
+
+#if HAS_DFM
+/*! Get active DFM port specification bitmap for the program
+
+ @param    manifest[in]            program manifest object
+ @param    dfm_type_id[in]            DFM resource type ID
+
+ @return 0 when not applicable and/or invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_active_port_bitmap(
+    const ia_css_program_manifest_t            *manifest,
+    const vied_nci_dev_dfm_id_t            dfm_type_id);
+#endif
+
+/*! Set DFM device relocatability specification for the program
+
+ @param    manifest[in]            program manifest object
+ @param    dfm_type_id[in]            DFM resource type ID
+ @param is_relocatable[in]        1 if dfm device ports are relocatable, 0 otherwise
+
+ @return 0 when not applicable and/or invalid arguments
+ */
+extern int ia_css_program_manifest_set_is_dfm_relocatable(
+    ia_css_program_manifest_t            *manifest,
+    const vied_nci_dev_dfm_id_t            dfm_type_id,
+    const uint8_t                        is_relocatable);
+
+#if HAS_DFM
+/*! Get DFM device relocatability specification for the program
+
+ @param    manifest[in]            program manifest object
+ @param    dfm_type_id[in]            DFM resource type ID
+
+ @return 1 if dfm device ports are relocatable, 0 otherwise
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_manifest_get_is_dfm_relocatable(
+    const ia_css_program_manifest_t            *manifest,
+    const vied_nci_dev_dfm_id_t            dfm_type_id);
+#endif
+
+/*! Get the memory resource (size) specification for a memory
+ that belongs to the cell where the program will be mapped
+
+ @param    manifest[in]            program manifest object
+ @param    mem_type_id[in]            mem type ID
+
+ @return 0 when not applicable and/or invalid arguments
+
+ @deprecated Implementation is trival (returns 0) and
+ no known users or known intention for future use.
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_program_manifest_get_int_mem_size(
+    const ia_css_program_manifest_t            *manifest,
+    const vied_nci_mem_type_ID_t            mem_type_id);
+
+/*! Set the memory resource (size) specification for a memory
+ that belongs to the cell where the program will be mapped
+
+ @param    manifest[in]            program manifest object
+ @param    mem_type_id[in]            mem type id
+ @param    int_mem_size[in]        internal memory size
+
+ @return < 0 on invalid arguments
+ @deprecated see ia_css_program_manifest_get_int_mem_size()
+ */
+extern int ia_css_program_manifest_set_int_mem_size(
+    ia_css_program_manifest_t            *manifest,
+    const vied_nci_mem_type_ID_t            mem_type_id,
+    const vied_nci_resource_size_t            int_mem_size);
+
+/*! Get the memory resource (size) specification for a memory
+ that does not belong to the cell where the program will be mapped
+
+ @param    manifest[in]            program manifest object
+ @param    mem_type_id[in]            mem type ID
+
+ @return 0 when not applicable and/or invalid arguments
+
+ @see ia_css_program_manifest_get_ext_mem_offset()
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_size(
+    const ia_css_program_manifest_t            *manifest,
+    const vied_nci_mem_type_ID_t            mem_type_id);
+
+/*! Set the memory resource (size) specification for a memory
+ that does not belong to the cell where the program will be mapped
+
+ @param    manifest[in]            program manifest object
+ @param    mem_type_id[in]            mem type id
+ @param    ext_mem_size[in]        external memory size
+
+ @return < 0 on invalid arguments
+
+ @see ia_css_program_manifest_get_ext_mem_offset()
+ */
+extern int ia_css_program_manifest_set_ext_mem_size(
+    ia_css_program_manifest_t            *manifest,
+    const vied_nci_mem_type_ID_t            mem_type_id,
+    const vied_nci_resource_size_t            ext_mem_size);
+
+#if HAS_DFM
+/*! Get a device channel resource (size) specification
+
+ @param    manifest[in]            program manifest object
+ @param    dev_chn_id[in]            device channel ID
+
+ @return 0 when not applicable and/or invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_size(
+    const ia_css_program_manifest_t            *manifest,
+    const vied_nci_dev_chn_ID_t            dev_chn_id);
+#endif
+
+/*! Set a device channel resource (size) specification
+
+ @param    manifest[in]            program manifest object
+ @param    dev_chn_id[in]            device channel ID
+ @param    dev_chn_size[in]        device channel size
+
+ @return < 0 on invalid arguments
+ */
+extern int ia_css_program_manifest_set_dev_chn_size(
+    ia_css_program_manifest_t            *manifest,
+    const vied_nci_dev_chn_ID_t            dev_chn_id,
+    const vied_nci_resource_size_t            dev_chn_size);
+
+/*! Set a device channel resource (offset) specification
+
+ @param    manifest[in]            program manifest object
+ @param    dev_chn_id[in]            device channel ID
+ @param    dev_chn_offset[in]        device channel offset
+
+ @see ia_css_program_manifest_get_dev_chn_offset()
+
+ @return < 0 on invalid arguments
+ */
+extern int ia_css_program_manifest_set_dev_chn_offset(
+    ia_css_program_manifest_t            *manifest,
+    const vied_nci_dev_chn_ID_t            dev_chn_id,
+    const vied_nci_resource_size_t            dev_chn_offset);
+
+/*! Set the memory resource (offset) specification for a memory
+ that does not belong to the cell where the program will be mapped
+
+ @param    manifest[in]            program manifest object
+ @param    mem_type_id[in]            mem type id
+ @param    ext_mem_offset[in]        external memory offset
+
+ @see ia_css_program_manifest_get_ext_mem_offset()
+
+ @return < 0 on invalid arguments
+ */
+extern int ia_css_program_manifest_set_ext_mem_offset(
+    ia_css_program_manifest_t            *manifest,
+    const vied_nci_mem_type_ID_t            mem_type_id,
+    const vied_nci_resource_size_t            ext_mem_offset);
+
+#if HAS_DFM
+/*! Get a device channel resource (offset) specification
+
+ Used to define a resource dependency on devices that support
+ parallel users via channel multiplexing within the device.
+
+ Channel resources can be "relocatable". That is, some channel
+ is required, but the exact channel is not important and
+ can be assigned at runtime.
+
+ Other channel resources are static "fixed" in advance.  Either
+ each channel is customized for a particular need such that
+ the exact channel needs to be specified.  Alternatively, there
+ are enough channels resources available for the worst case
+ system requirement such that the channels can be statically
+ assigned in advance "fixed" channels.
+
+ Both kinds of resource dependency specification are supported here.
+
+ @param    manifest[in]            program manifest object
+ @param    dev_chn_id[in]            device channel ID
+
+ @return Valid fixed offset (if value is greater or equal to 0) or
+  IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE if offset
+  is relocatable
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_offset(
+    const ia_css_program_manifest_t            *manifest,
+    const vied_nci_dev_chn_ID_t                dev_chn_id);
+#endif
+
+/*! Get the memory resource (offset) specification for a memory
+ that does not belong to the cell where the program will be mapped.
+
+ Memory specified here is typically SRAM within IPU used for
+ intermediate storage during data transfer between processing
+ stages/main memory or as computation scratch space.
+
+ The offset specified essentially defines the location of the memory
+ within the memory device.  It can be fixed in advance (static allocation)
+ or left to the system to determine at runtime.
+
+ @param    manifest[in]            program manifest object
+ @param    mem_type_id[in]            mem type ID
+
+ @return Valid fixed offset (if value is greater or equal to 0) or
+  IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE if offset
+  is relocatable
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_offset(
+    const ia_css_program_manifest_t            *manifest,
+    const vied_nci_mem_type_ID_t            mem_type_id);
+
+/*! Get the kernel composition of the program manifest object
+
+  The collection of kernels described in the bitmap is defined
+  at the program group level. This function returns the subset
+  of kernels that are part of this program.
+ @param    manifest[in]            program manifest object
+
+ @return bitmap, 0 on invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_program_manifest_get_kernel_bitmap(
+    const ia_css_program_manifest_t            *manifest);
+
+/*! Set the kernel dependency of the program manifest object
+
+ @param    manifest[in]            program manifest object
+ @param    kernel_bitmap[in]        kernel composition bitmap
+
+ @return < 0 on invalid arguments
+ */
+extern int ia_css_program_manifest_set_kernel_bitmap(
+    ia_css_program_manifest_t            *manifest,
+    const ia_css_kernel_bitmap_t            kernel_bitmap);
+
+/*! Get the number of programs this programs depends on from the program group
+ * manifest object
+
+ @param    manifest[in]            program manifest object
+
+ @return program dependency count
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_manifest_get_program_dependency_count(
+    const ia_css_program_manifest_t            *manifest);
+
+/*! Get the index of the program which the programs at this index depends on
+    from the program manifest object
+
+ @param    manifest[in]            program manifest object
+
+ @return program dependency,
+    IA_CSS_PROGRAM_INVALID_DEPENDENCY on invalid arguments
+    */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_manifest_get_program_dependency(
+    const ia_css_program_manifest_t            *manifest,
+    const unsigned int                index);
+
+/*! Set the index of the program which the programs at this index depends on
+    in the program manifest object
+
+ @param    manifest[in]            program manifest object
+
+ @return program dependency
+ */
+extern int ia_css_program_manifest_set_program_dependency(
+    ia_css_program_manifest_t            *manifest,
+    const uint8_t                    program_dependency,
+    const unsigned int                index);
+
+/*! Get the number of terminals this programs depends on from the program group
+ * manifest object
+
+ @param    manifest[in]            program manifest object
+
+ @return program dependency count
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_manifest_get_terminal_dependency_count(
+    const ia_css_program_manifest_t            *manifest);
+
+/*! Get the index of the terminal which the programs at this index depends on
+    from the program manifest object
+
+ @param    manifest[in]            program manifest object
+
+ @return terminal dependency, IA_CSS_PROGRAM_INVALID_DEPENDENCY on error
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_manifest_get_terminal_dependency(
+    const ia_css_program_manifest_t            *manifest,
+    const unsigned int                index);
+
+/*! Set the index of the terminal which the programs at this index depends on
+    in the program manifest object
+
+ @param    manifest[in]            program manifest object
+
+ @return < 0 on invalid arguments
+ */
+extern int ia_css_program_manifest_set_terminal_dependency(
+    ia_css_program_manifest_t            *manifest,
+    const uint8_t                    terminal_dependency,
+    const unsigned int                index);
+
+/*! Check if the program manifest object specifies a subnode program
+
+ @param    manifest[in]            program manifest object
+
+ @return is_subnode, false on invalid argument
+ @deprecated for IPU7
+ */
+extern bool ia_css_is_program_manifest_subnode_program_type(
+    const ia_css_program_manifest_t            *manifest);
+
+/*! Check if the program manifest object specifies a supernode program
+
+ @param    manifest[in]            program manifest object
+
+ @return is_supernode, false on invalid argument
+ @deprecated for IPU7
+ */
+extern bool ia_css_is_program_manifest_supernode_program_type(
+    const ia_css_program_manifest_t            *manifest);
+/*! Check if the program manifest object specifies a singular program
+
+ @param    manifest[in]            program manifest object
+
+ @return is_singular, false on invalid argument
+ @deprecated for IPU7
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+bool ia_css_is_program_manifest_singular_program_type(
+    const ia_css_program_manifest_t            *manifest);
+
+#ifdef __IA_CSS_PSYS_STATIC_INLINE__
+#include "ia_css_psys_program_manifest_impl.h"
+#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
+
+#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.kernel.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.kernel.h
new file mode 100644
index 000000000000..30e31d22579b
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.kernel.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_KERNEL_H
+#define __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_KERNEL_H
+
+/*! \file */
+
+/** @file ia_css_psys_program_manifest.hsys.kernel.h
+ *
+ * Define the methods on the program manifest object: Hsys kernel interface
+ */
+
+#include <ia_css_psys_manifest_types.h>
+
+#include <vied_nci_psys_system_global.h>
+
+#include <type_support.h>                    /* uint8_t */
+#include "ia_css_psys_static_storage_class.h"
+
+/*
+ * Resources needs
+ */
+
+/*! Get the cell ID from the program manifest object
+
+ @param    manifest[in]            program manifest object
+
+ Note: If the cell ID is specified, the program this manifest belongs to
+ must be mapped on that instance. If the cell ID is invalid (limit value)
+ then the cell type ID must be specified instead
+
+ @return cell ID, limit value if not specified
+ */
+extern
+vied_nci_cell_ID_t ia_css_program_manifest_get_cell_ID(
+    const ia_css_program_manifest_t            *manifest);
+
+/*! Get the cell type ID from the program manifest object
+
+ @param    manifest[in]            program manifest object
+
+ Note: If the cell type ID is specified, the program this manifest belongs
+ to can be mapped on any instance of this clee type. If the cell type ID is
+ invalid (limit value) then a specific cell ID must be specified instead
+
+ @return cell ID, limit value if not specified
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_cell_type_ID_t ia_css_program_manifest_get_cell_type_ID(
+    const ia_css_program_manifest_t            *manifest);
+
+/*! Get the memory resource (size) specification for a memory
+ that belongs to the cell where the program will be mapped
+
+ @param    manifest[in]            program manifest object
+ @param    mem_type_id[in]            mem type ID
+
+ @return 0 when not applicable
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_program_manifest_get_int_mem_size(
+    const ia_css_program_manifest_t            *manifest,
+    const vied_nci_mem_type_ID_t            mem_type_id);
+
+/*! Get the memory resource (size) specification for a memory
+ that does not belong to the cell where the program will be mapped
+
+ @param    manifest[in]            program manifest object
+ @param    mem_type_id[in]            mem type ID
+
+ @return 0 when not applicable
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_size(
+    const ia_css_program_manifest_t            *manifest,
+    const vied_nci_mem_type_ID_t            mem_type_id);
+
+#if HAS_DFM
+/*! Get a device channel resource (size) specification
+
+ @param    manifest[in]            program manifest object
+ @param    dev_chn_id[in]            device channel ID
+
+ @return 0 when not applicable
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_size(
+    const ia_css_program_manifest_t            *manifest,
+    const vied_nci_dev_chn_ID_t                dev_chn_id);
+#endif
+#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_KERNEL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.user.h
new file mode 100644
index 000000000000..12a777003226
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.user.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_USER_H
+#define __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_USER_H
+
+/*! \file */
+
+/** @file ia_css_psys_program_manifest.hsys.user.h
+ *
+ * Define the methods on the program manifest object: Hsys user interface
+ */
+
+#include <ia_css_psys_manifest_types.h>
+
+/*! Print the program manifest object to file/stream
+    in textual format
+
+ @param    manifest[in]            program manifest object
+ @param    fid[out]                file/stream handle
+
+ @return < 0 on error
+ */
+extern int ia_css_program_manifest_print(
+    const ia_css_program_manifest_t    *manifest,
+    void                *fid);
+
+#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_USER_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.sim.h
new file mode 100644
index 000000000000..50ecd3ee8611
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.sim.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_SIM_H
+#define __IA_CSS_PSYS_PROGRAM_MANIFEST_SIM_H
+
+/*! \file */
+
+/** @file ia_css_psys_program_manifest.sim.h
+ *
+ * Define the methods on the program manifest object: Simulation only
+ */
+
+#include <ia_css_psys_manifest_types.h>
+
+#include <type_support.h>    /* uint8_t */
+
+/*! Compute the size of storage required for allocating
+ * the program manifest object
+
+ @param program_needs_extension[in]    ==1 if program manifest needs an extension struct
+ @param    program_dependency_count[in]    Number of programs this one depends on
+ @param    terminal_dependency_count[in]    Number of terminals this one depends on
+
+ @return 0 on error
+ */
+extern size_t ia_css_sizeof_program_manifest(
+    const uint8_t    program_needs_extension,
+    const uint8_t    program_dependency_count,
+    const uint8_t    terminal_dependency_count);
+
+/*! Create (the storage for) the program manifest object
+
+ @param    program_dependency_count[in]    Number of programs this one depends on
+ @param    terminal_dependency_count[in]    Number of terminals this one depends on
+
+ @return NULL on error
+ */
+extern ia_css_program_manifest_t *ia_css_program_manifest_alloc(
+    const uint8_t    program_dependency_count,
+    const uint8_t    terminal_dependency_count);
+
+/*! Destroy (the storage of) the program manifest object
+
+ @param    manifest[in]            program manifest
+
+ @return NULL
+ */
+extern ia_css_program_manifest_t *ia_css_program_manifest_free(
+    ia_css_program_manifest_t *manifest);
+
+#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_SIM_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest_impl.h
new file mode 100644
index 000000000000..04803a3812e3
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest_impl.h
@@ -0,0 +1,577 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_IMPL_H
+#define __IA_CSS_PSYS_PROGRAM_MANIFEST_IMPL_H
+
+#include <ia_css_psys_program_manifest.h>
+#include <ia_css_psys_program_group_manifest.h>
+/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_print */
+#include <ia_css_kernel_bitmap.h>
+
+#include <vied_nci_psys_system_global.h>
+#include "ia_css_psys_program_group_private.h"
+#include "ia_css_psys_static_trace.h"
+
+#include <error_support.h>
+#include <misc_support.h>
+#include <storage_class.h>
+#include <math_support.h>
+
+/** Function only to be used in FW */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_program_manifest_ext_t *ia_css_program_manifest_get_extension(const ia_css_program_manifest_t *program)
+{
+    DECLARE_ERRVAL
+    verifexitval(program != NULL, EFAULT);
+    if (program->program_extension_offset != 0) {
+        return (ia_css_program_manifest_ext_t *)((uint8_t *)program + program->program_extension_offset);
+    }
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                       "ia_css_program_manifest_get_extension invalid argument\n");
+    }
+    return NULL;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+vied_nci_resource_size_t ia_css_program_manifest_get_int_mem_size(
+    const ia_css_program_manifest_t *manifest,
+    const vied_nci_mem_type_ID_t     mem_type_id)
+{
+    (void)manifest;
+    (void)mem_type_id;
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
+                   "ia_css_program_manifest_get_int_mem_size always returns 0"
+                   "(internally memory feature not used).\n");
+    return 0;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_manifest_get_input_terminal_id(
+    ia_css_program_manifest_t *manifest,
+    unsigned char              idx)
+{
+    DECLARE_ERRVAL
+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_program_manifest_get_input_stream_id(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+    verifexitval(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES, EFAULT);
+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
+    if (manifest_ext == NULL) {
+        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+    }
+EXIT:
+    if (!noerror()) {
+        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+    }
+#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
+    return manifest_ext->dec_resources_input_terminal[idx];
+#else
+    (void) idx;
+    return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+#endif
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_manifest_get_output_terminal_id(
+    ia_css_program_manifest_t *manifest,
+    unsigned char              idx)
+{
+    DECLARE_ERRVAL
+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_program_manifest_get_output_terminal_id(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+    verifexitval(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES, EFAULT);
+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
+    if (manifest_ext == NULL) {
+        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+    }
+EXIT:
+    if (!noerror()) {
+        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+    }
+#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
+    return manifest_ext->dec_resources_output_terminal[idx];
+#else
+    (void) idx;
+    return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+#endif
+
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_manifest_get_input_stream_id(
+    ia_css_program_manifest_t  *manifest,
+    unsigned char               idx)
+{
+    DECLARE_ERRVAL
+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_program_manifest_get_input_stream_id(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+    verifexitval(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES, EFAULT);
+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
+    if (manifest_ext == NULL) {
+        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+    }
+EXIT:
+    if (!noerror()) {
+        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+    }
+#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
+    return manifest_ext->dec_resources_input[idx];
+#else
+    (void) idx;
+    return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+#endif
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_manifest_get_output_stream_id(
+    ia_css_program_manifest_t *manifest,
+    unsigned char              idx)
+{
+    DECLARE_ERRVAL
+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_program_manifest_get_output_stream_id(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+    verifexitval(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES, EFAULT);
+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
+    if (manifest_ext == NULL) {
+        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+    }
+EXIT:
+    if (!noerror()) {
+        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+    }
+#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
+    return manifest_ext->dec_resources_output[idx];
+#else
+    (void) idx;
+    return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+#endif
+}
+
+#if HAS_DFM
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_manifest_get_is_dfm_relocatable(
+    const ia_css_program_manifest_t *manifest,
+    const vied_nci_dev_dfm_id_t      dfm_type_id)
+{
+    DECLARE_ERRVAL
+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_program_manifest_get_is_dfm_relocatable(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+    verifexitval(dfm_type_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
+    if (manifest_ext == NULL) {
+        return 0;
+    }
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                       "ia_css_program_manifest_get_is_dfm_relocatable invalid argument\n");
+        return 0;
+    }
+    return manifest_ext->is_dfm_relocatable[dfm_type_id];
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_port_bitmap(
+    const ia_css_program_manifest_t  *manifest,
+    const vied_nci_dev_dfm_id_t       dfm_type_id)
+{
+    DECLARE_ERRVAL
+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_program_manifest_get_dfm_port_bitmap(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+    verifexitval(dfm_type_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
+    if (manifest_ext == NULL) {
+        return 0;
+    }
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                       "ia_css_program_manifest_get_dfm_port_bitmap invalid argument\n");
+        return 0;
+    }
+    return manifest_ext->dfm_port_bitmap[dfm_type_id];
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_active_port_bitmap(
+    const ia_css_program_manifest_t  *manifest,
+    const vied_nci_dev_dfm_id_t       dfm_type_id)
+{
+    DECLARE_ERRVAL
+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_program_manifest_get_dfm_active_port_bitmap(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+    verifexitval(dfm_type_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
+    if (manifest_ext == NULL) {
+        return 0;
+    }
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                       "ia_css_program_manifest_get_dfm_active_port_bitmap invalid argument\n");
+        return 0;
+    }
+    return manifest_ext->dfm_active_port_bitmap[dfm_type_id];
+}
+#endif /* HAS_DFM */
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_size(
+    const ia_css_program_manifest_t *manifest,
+    const vied_nci_mem_type_ID_t     mem_type_id)
+{
+    DECLARE_ERRVAL
+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_program_manifest_get_ext_mem_size(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+    verifexitval(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
+    if (manifest_ext == NULL) {
+        return 0;
+    }
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                       "ia_css_program_manifest_get_ext_mem_size invalid argument\n");
+        return 0;
+    }
+    return manifest_ext->ext_mem_size[mem_type_id];
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_offset(
+    const ia_css_program_manifest_t *manifest,
+    const vied_nci_mem_type_ID_t     mem_type_id)
+{
+    DECLARE_ERRVAL
+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_program_manifest_get_ext_mem_offset(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+    verifexitval(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
+    if (manifest_ext == NULL) {
+        return 0;
+    }
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                       "ia_css_program_manifest_get_ext_mem_offset invalid argument\n");
+         return 0;
+    }
+    return manifest_ext->ext_mem_offset[mem_type_id];
+}
+
+#if HAS_DFM
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_size(
+    const ia_css_program_manifest_t *manifest,
+    const vied_nci_dev_chn_ID_t      dev_chn_id)
+{
+    DECLARE_ERRVAL
+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_program_manifest_get_dev_chn_size(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+    verifexitval(dev_chn_id < VIED_NCI_N_DEV_CHN_ID, EFAULT);
+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
+    if (manifest_ext == NULL) {
+        return 0;
+    }
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                       "ia_css_program_manifest_get_dev_chn_size invalid argument\n");
+        return 0;
+    }
+    return manifest_ext->dev_chn_size[dev_chn_id];
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_offset(
+    const ia_css_program_manifest_t *manifest,
+    const vied_nci_dev_chn_ID_t      dev_chn_id)
+{
+    DECLARE_ERRVAL
+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_program_manifest_get_dev_chn_offset(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+    verifexitval(dev_chn_id < VIED_NCI_N_DEV_CHN_ID, EFAULT);
+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
+    if (manifest_ext == NULL) {
+        return 0;
+    }
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                       "ia_css_program_manifest_get_dev_chn_offset invalid argument\n");
+         return 0;
+    }
+    return manifest_ext->dev_chn_offset[dev_chn_id];
+}
+#endif /* HAS_DFM */
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+size_t ia_css_program_manifest_get_size(
+    const ia_css_program_manifest_t *manifest)
+{
+    DECLARE_ERRVAL
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_program_manifest_get_size(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                       "ia_css_program_manifest_get_size invalid argument\n");
+        return 0;
+    }
+
+    return manifest->size;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_program_ID_t ia_css_program_manifest_get_program_ID(
+    const ia_css_program_manifest_t *manifest)
+{
+    DECLARE_ERRVAL
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_program_manifest_get_program_ID(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                       "ia_css_program_manifest_get_program_ID invalid argument\n");
+        return IA_CSS_PROGRAM_INVALID_ID;
+    }
+    return manifest->ID;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_program_group_manifest_t *ia_css_program_manifest_get_parent(
+    const ia_css_program_manifest_t *manifest)
+{
+    DECLARE_ERRVAL
+    char *base = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_program_manifest_get_parent(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+
+    base = (char *)((char *)manifest + manifest->parent_offset);
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                       "ia_css_program_manifest_get_parent invalid argument\n");
+        return NULL;
+    }
+    return (ia_css_program_group_manifest_t *)(base);
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+vied_nci_cell_type_ID_t ia_css_program_manifest_get_cell_type_ID(
+    const ia_css_program_manifest_t *manifest)
+{
+    DECLARE_ERRVAL
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_program_manifest_get_cell_type_ID(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                       "ia_css_program_manifest_get_cell_type_ID invalid argument\n");
+        return VIED_NCI_N_CELL_TYPE_ID;
+    }
+    return manifest->cell_type_id;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_program_type_t ia_css_program_manifest_get_type(
+    const ia_css_program_manifest_t *manifest)
+{
+    DECLARE_ERRVAL
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_program_manifest_get_type(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                       "ia_css_program_manifest_get_type invalid argument\n");
+        return IA_CSS_N_PROGRAM_TYPES;
+    }
+    return manifest->program_type;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_manifest_get_terminal_dependency_count(
+    const ia_css_program_manifest_t *manifest)
+{
+    DECLARE_ERRVAL
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_program_manifest_get_terminal_dependency_count(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                       "ia_css_program_manifest_get_terminal_dependency_count invalid argument\n");
+        return 0;
+    }
+    return manifest->terminal_dependency_count;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_manifest_get_terminal_dependency(
+    const ia_css_program_manifest_t *manifest,
+    const unsigned int index)
+{
+    DECLARE_ERRVAL
+    uint8_t *terminal_dep_ptr = NULL;
+    uint8_t terminal_dependency_count;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_program_manifest_get_terminal_dependency(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+    terminal_dependency_count =
+        ia_css_program_manifest_get_terminal_dependency_count(manifest);
+    verifexitval(index < terminal_dependency_count, EFAULT);
+
+    terminal_dep_ptr = (uint8_t *)((uint8_t *)manifest +
+            manifest->terminal_dependency_offset + index);
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                       "ia_css_program_manifest_get_terminal_dependency invalid argument\n");
+        return IA_CSS_PROGRAM_INVALID_DEPENDENCY;
+    }
+    return *terminal_dep_ptr;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+bool ia_css_is_program_manifest_singular_program_type(
+    const ia_css_program_manifest_t *manifest)
+{
+    ia_css_program_type_t        program_type;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_is_program_manifest_singular_program_type(): enter:\n");
+
+    program_type = ia_css_program_manifest_get_type(manifest);
+
+/* The error return is the limit value, so no need to check on the manifest
+ * pointer
+ */
+    return (program_type == IA_CSS_PROGRAM_TYPE_SINGULAR);
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_manifest_get_program_dependency_count(
+    const ia_css_program_manifest_t *manifest)
+{
+    DECLARE_ERRVAL
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_manifest_get_program_dependency_count(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                       "ia_css_program_manifest_get_program_dependency_count invalid argument\n");
+        return 0;
+    }
+    return manifest->program_dependency_count;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_manifest_get_program_dependency(
+    const ia_css_program_manifest_t *manifest,
+    const unsigned int index)
+{
+    DECLARE_ERRVAL
+    uint8_t *program_dep_ptr = NULL;
+    uint8_t program_dependency_count;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_program_manifest_get_program_dependency(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+
+    program_dependency_count =
+        ia_css_program_manifest_get_program_dependency_count(manifest);
+
+    verifexitval(index < program_dependency_count, EFAULT);
+    program_dep_ptr =  (uint8_t *)((uint8_t *)manifest +
+            manifest->program_dependency_offset +
+            index * sizeof(uint8_t));
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                       "ia_css_program_manifest_get_program_dependency invalid argument\n");
+        return IA_CSS_PROGRAM_INVALID_DEPENDENCY;
+    }
+    return *program_dep_ptr;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_program_manifest_get_kernel_bitmap(
+    const ia_css_program_manifest_t *manifest)
+{
+    DECLARE_ERRVAL
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+                   "ia_css_program_manifest_get_kernel_bitmap(): enter:\n");
+    verifexitval(manifest != NULL, EFAULT);
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+          "ia_css_program_manifest_get_kernel_bitmap invalid argument\n");
+        return ia_css_kernel_bitmap_clear();
+    }
+    return manifest->kernel_bitmap;
+}
+
+#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_storage_class.h
new file mode 100644
index 000000000000..f1ef454e6890
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_storage_class.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+#define __IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+
+#include "storage_class.h"
+
+#ifndef __IA_CSS_PSYS_SIM_INLINE__
+#define IA_CSS_PSYS_SIM_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
+#define IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+#else
+#define IA_CSS_PSYS_SIM_STORAGE_CLASS_H STORAGE_CLASS_INLINE
+#define IA_CSS_PSYS_SIM_STORAGE_CLASS_C STORAGE_CLASS_INLINE
+#endif
+
+#endif /* __IA_CSS_PSYS_SIM_STORAGE_CLASS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_trace.h
new file mode 100644
index 000000000000..a5cf6f78aa0e
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_trace.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_SIM_TRACE_H
+#define __IA_CSS_PSYS_SIM_TRACE_H
+
+#include "ia_css_psysapi_trace.h"
+
+#define PSYS_SIM_TRACE_LEVEL_CONFIG_DEFAULT    PSYSAPI_TRACE_LOG_LEVEL_OFF
+
+/* Default sub-module tracing config */
+#if (!defined(PSYSAPI_SIM_TRACING_OVERRIDE))
+     #define PSYS_SIM_TRACE_LEVEL_CONFIG PSYS_SIM_TRACE_LEVEL_CONFIG_DEFAULT
+#endif
+
+/* Module/sub-module specific trace setting will be used if
+ * the trace level is not specified from the module or
+  PSYSAPI_SIM_TRACING_OVERRIDE is defined
+ */
+#if (defined(PSYSAPI_SIM_TRACING_OVERRIDE))
+    /* Module/sub-module specific trace setting */
+    #if PSYSAPI_SIM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
+        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
+        #define PSYSAPI_SIM_TRACE_METHOD \
+            IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_SIM_TRACE_LEVEL_ASSERT \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_SIM_TRACE_LEVEL_ERROR \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_SIM_TRACE_LEVEL_WARNING \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_SIM_TRACE_LEVEL_INFO \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_SIM_TRACE_LEVEL_DEBUG \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE \
+            IA_CSS_TRACE_LEVEL_DISABLED
+    #elif PSYSAPI_SIM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
+        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
+        #define PSYSAPI_SIM_TRACE_METHOD \
+            IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_SIM_TRACE_LEVEL_ASSERT \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_SIM_TRACE_LEVEL_ERROR \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_SIM_TRACE_LEVEL_WARNING \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_SIM_TRACE_LEVEL_INFO \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_SIM_TRACE_LEVEL_DEBUG \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE \
+            IA_CSS_TRACE_LEVEL_DISABLED
+    #elif PSYSAPI_SIM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
+        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
+        #define PSYSAPI_SIM_TRACE_METHOD \
+            IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_SIM_TRACE_LEVEL_ASSERT \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_SIM_TRACE_LEVEL_ERROR \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_SIM_TRACE_LEVEL_WARNING \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_SIM_TRACE_LEVEL_INFO \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_SIM_TRACE_LEVEL_DEBUG \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE \
+            IA_CSS_TRACE_LEVEL_ENABLED
+    #else
+        #error "No PSYSAPI_DATA Tracing level defined"
+    #endif
+#else
+    /* Inherit Module trace setting */
+    #define PSYSAPI_SIM_TRACE_METHOD    PSYSAPI_TRACE_METHOD
+    #define PSYSAPI_SIM_TRACE_LEVEL_ASSERT    PSYSAPI_TRACE_LEVEL_ASSERT
+    #define PSYSAPI_SIM_TRACE_LEVEL_ERROR    PSYSAPI_TRACE_LEVEL_ERROR
+    #define PSYSAPI_SIM_TRACE_LEVEL_WARNING    PSYSAPI_TRACE_LEVEL_WARNING
+    #define PSYSAPI_SIM_TRACE_LEVEL_INFO    PSYSAPI_TRACE_LEVEL_INFO
+    #define PSYSAPI_SIM_TRACE_LEVEL_DEBUG    PSYSAPI_TRACE_LEVEL_DEBUG
+    #define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE    PSYSAPI_TRACE_LEVEL_VERBOSE
+#endif
+
+#endif /* __IA_CSS_PSYSAPI_SIM_TRACE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_storage_class.h
new file mode 100644
index 000000000000..b6a4bd600c5b
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_storage_class.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+#define __IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+
+#include "storage_class.h"
+
+#ifndef __IA_CSS_PSYS_STATIC_INLINE__
+#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
+#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+#else
+#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_H STORAGE_CLASS_INLINE
+#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_C STORAGE_CLASS_INLINE
+#endif
+
+#endif /* __IA_CSS_PSYS_STATIC_STORAGE_CLASS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_trace.h
new file mode 100644
index 000000000000..03c355b350fb
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_trace.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_STATIC_TRACE_H
+#define __IA_CSS_PSYS_STATIC_TRACE_H
+
+#include "ia_css_psysapi_trace.h"
+
+#define PSYS_STATIC_TRACE_LEVEL_CONFIG_DEFAULT    PSYSAPI_TRACE_LOG_LEVEL_OFF
+
+/* Default sub-module tracing config */
+#if (!defined(PSYSAPI_STATIC_TRACING_OVERRIDE))
+     #define PSYS_STATIC_TRACE_LEVEL_CONFIG \
+    PSYS_STATIC_TRACE_LEVEL_CONFIG_DEFAULT
+#endif
+
+/* Module/sub-module specific trace setting will be used if
+ * the trace level is not specified from the module or
+  PSYSAPI_STATIC_TRACING_OVERRIDE is defined
+ */
+#if (defined(PSYSAPI_STATIC_TRACING_OVERRIDE))
+    /* Module/sub-module specific trace setting */
+    #if PSYSAPI_STATIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
+        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
+        #define PSYSAPI_STATIC_TRACE_METHOD \
+            IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
+            IA_CSS_TRACE_LEVEL_DISABLED
+    #elif PSYSAPI_STATIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
+        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
+        #define PSYSAPI_STATIC_TRACE_METHOD \
+            IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
+            IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
+            IA_CSS_TRACE_LEVEL_DISABLED
+    #elif PSYSAPI_STATIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
+        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
+        #define PSYSAPI_STATIC_TRACE_METHOD \
+            IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
+            IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
+            IA_CSS_TRACE_LEVEL_ENABLED
+    #else
+        #error "No PSYSAPI_DATA Tracing level defined"
+    #endif
+#else
+    /* Inherit Module trace setting */
+    #define PSYSAPI_STATIC_TRACE_METHOD \
+        PSYSAPI_TRACE_METHOD
+    #define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
+        PSYSAPI_TRACE_LEVEL_ASSERT
+    #define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
+        PSYSAPI_TRACE_LEVEL_ERROR
+    #define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
+        PSYSAPI_TRACE_LEVEL_WARNING
+    #define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
+        PSYSAPI_TRACE_LEVEL_INFO
+    #define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
+        PSYSAPI_TRACE_LEVEL_DEBUG
+    #define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
+        PSYSAPI_TRACE_LEVEL_VERBOSE
+#endif
+
+#endif /* __IA_CSS_PSYSAPI_STATIC_TRACE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.h
new file mode 100644
index 000000000000..1dcb3b3c828f
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.h
@@ -0,0 +1,403 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_TERMINAL_H
+#define __IA_CSS_PSYS_TERMINAL_H
+
+/*! \file */
+
+/** @file ia_css_psys_terminal.h
+ *
+ * Define the methods on the terminal object that are not part of
+ * a single interface
+ */
+
+#include <ia_css_program_group_data.h>    /* ia_css_frame_t */
+#include <ia_css_program_group_param.h>    /* ia_css_program_group_param_t */
+
+#include <ia_css_psys_process_types.h>
+#include <ia_css_psys_manifest_types.h>
+
+#include <type_support.h>        /* bool */
+#include <print_support.h>        /* FILE */
+#include "ia_css_psys_dynamic_storage_class.h"
+#include "ia_css_terminal.h"
+#include "ia_css_terminal_manifest_base_types.h"
+
+/*
+ * Creation
+ */
+#include <ia_css_psys_terminal.hsys.user.h>
+
+/*! Boolean test if the terminal object type is input
+
+ @param    terminal[in]            terminal object
+
+ @return true if the terminal is input, false otherwise or on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_input(
+    const ia_css_terminal_t                    *terminal);
+
+/*! Get the stored size of the terminal object
+
+ @param    terminal[in]            terminal object
+
+ @return size, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+size_t ia_css_terminal_get_size(
+    const ia_css_terminal_t                    *terminal);
+
+/*! Get the type of the terminal object
+
+ @param    terminal[in]            terminal object
+
+ @return the type of the terminal, limit value on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_terminal_type_t ia_css_terminal_get_type(
+    const ia_css_terminal_t                    *terminal);
+
+/*! Set the type of the terminal object
+
+ @param    terminal[in]            terminal object
+ @param    terminal_type[in]        type of the terminal
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_terminal_set_type(
+    ia_css_terminal_t        *terminal,
+    const ia_css_terminal_type_t    terminal_type);
+
+/*! Get the index of the terminal manifest object
+
+ @param    terminal[in]            terminal object
+
+ @return the index of the terminal manifest object, limit value on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint16_t ia_css_terminal_get_terminal_manifest_index(
+    const ia_css_terminal_t                    *terminal);
+
+/*! Set the index of the terminal manifest object
+
+ @param    terminal[in]            terminal object
+ @param    tm_index[in]            terminal manifest index
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_terminal_set_terminal_manifest_index(
+    ia_css_terminal_t    *terminal,
+    const uint16_t        tm_index);
+
+/*! Get the payload (buffer) size for all buffers that will be supplied for the terminal
+
+ @param    terminal[in]            terminal object
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_terminal_get_payload_size(
+    const ia_css_terminal_t *terminal);
+
+/*! Set the payload (buffer) size for all buffers that will be supplied for the terminal
+
+ @param    terminal[in]            terminal object
+ @param    payload_size[in]        Size of buffer that will be supplied to the terminal
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_terminal_set_payload_size(
+    ia_css_terminal_t *terminal,
+    uint32_t payload_size);
+
+/*! Get id of the terminal object
+
+ @param    terminal[in]            terminal object
+
+ @return id of terminal
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_terminal_ID_t ia_css_terminal_get_ID(
+    const ia_css_terminal_t            *terminal);
+
+/*! Get compressed byte of the data terminal object
+
+ @param    dterminal[in]            data terminal object
+ @param val[out]            is_compressed value
+
+ @@return < 0 on error
+ */
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_data_terminal_is_compressed(
+    const ia_css_data_terminal_t *dterminal,
+    uint8_t *val);
+
+/*! Get kernel id of the data terminal object
+
+ @param    dterminal[in]            data terminal object
+
+ @return kernel id of terminal
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_data_terminal_get_kernel_id(
+    const ia_css_data_terminal_t            *dterminal);
+
+/*! Get the connection type from the terminal object
+
+ @param    terminal[in]            terminal object
+
+ @return buffer type, limit value on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_connection_type_t ia_css_data_terminal_get_connection_type(
+    const ia_css_data_terminal_t    *dterminal);
+
+/*! Set the connection type of the terminal object
+
+ @param    terminal[in]            terminal object
+ @param    connection_type[in]        connection type
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_data_terminal_set_connection_type(
+    ia_css_data_terminal_t                *dterminal,
+    const ia_css_connection_type_t            connection_type);
+
+/*! Get link id of the data terminal object
+
+ @param    dterminal[in]            data terminal object
+
+ @return link id of terminal
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_data_terminal_get_link_id(
+    const ia_css_data_terminal_t            *dterminal);
+
+/*! Set link id of the terminal object
+
+ @param    terminal[in]            data terminal object
+ @param    link_id[in]            synchronization link id
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_data_terminal_set_link_id(
+    ia_css_data_terminal_t                *dterminal,
+    const uint8_t                    link_id);
+
+/*! Set stream2gen buffer size used in stream to GEN connection
+ * This function should be called, in case we are in streaming use-case, and
+ * we need to configure the stream2gen_buffer_size to be less than full image's height.
+ * Note, that the stream2gen_buffer_size is set to a defalut value of full image's height
+ * during terminal_create function.
+
+ * @param    terminal[in]            data terminal object
+ * @param    stream2gen_buffer_size[in]        Buffer size (Size's units are lines)
+
+ * @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_data_terminal_set_stream2gen_buffer_size(
+    ia_css_data_terminal_t *dterminal,
+    const uint16_t stream2gen_buffer_size);
+
+/*! Get the (pointer to) the process group parent of the terminal object
+
+ @param    terminal[in]            terminal object
+
+ @return the pointer to the parent, NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_process_group_t *ia_css_terminal_get_parent(
+    const ia_css_terminal_t                    *terminal);
+
+/*! Set the (pointer to) the process group parent of the terminal object
+
+ @param    terminal[in]    terminal object
+ @param    parent[in]    (pointer to the) process group parent object
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_terminal_set_parent(
+    ia_css_terminal_t    *terminal,
+    ia_css_process_group_t    *parent);
+
+/*! Boolean test if the terminal object type is valid
+
+ @param    terminal[in]            process terminal object
+ @param    terminal_manifest[in]        program terminal manifest
+
+ @return true if the process terminal object is correct, false on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_valid(
+    const ia_css_terminal_t         *terminal,
+    const ia_css_terminal_manifest_t *terminal_manifest);
+
+/* ================= Program Control Init Terminal - START ================= */
+
+/*!
+ * Gets the program init terminal descripor size
+ * @param manifest[in]        program control init terminal manifest
+ * @param pg_manifest[in]    program group manifest
+ * @param kernel_bitmap[in]    kernel enable bitmap
+ * @return size, error if < 0.
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+unsigned int
+ia_css_program_control_init_terminal_get_descriptor_size(
+    const ia_css_program_control_init_terminal_manifest_t *manifest,
+    const ia_css_program_group_manifest_t *pg_manifest,
+    ia_css_kernel_bitmap_t kernel_bitmap);
+
+/*!
+ * Initialize program control init terminal
+ * @param nof_fragments[in]    Number of fragments
+ * @param terminal[in]        program control init terminal
+ * @param manifest[in]        program control init terminal manifest
+ * @param pg_manifest[in]    program group manifest
+ * @param kernel_bitmap[in]    kernel enable bitmap
+ * @return < 0 on erro
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int
+ia_css_program_control_init_terminal_init(
+    ia_css_program_control_init_terminal_t *terminal,
+    const ia_css_program_control_init_terminal_manifest_t *manifest,
+    const ia_css_program_group_manifest_t *pg_manifest,
+    ia_css_kernel_bitmap_t kernel_bitmap);
+
+/*!
+ * Get a program desc for a program control init terminal
+  * @param terminal[in]        program control init terminal
+ * @param manifest[in]        program control init terminal manifest
+ * @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_program_control_init_program_desc_t *
+ia_css_program_control_init_terminal_get_program_desc(
+    const ia_css_program_control_init_terminal_t *prog_ctrl_init_terminal,
+    const unsigned int program_index
+);
+
+/*!
+ * Pretty prints the program control init termnial
+ * @param terminal[in]        program control init terminal
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+void ia_css_program_control_init_terminal_print(
+    const ia_css_program_control_init_terminal_t *terminal);
+
+/*!
+ * Returns the number of connect sections per program
+ * @param program_desc[in] program control init terminal program desc
+ * @return number of connect sections
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+unsigned int ia_css_program_control_init_terminal_get_connect_section_count(
+    const ia_css_program_control_init_program_desc_t *program_desc);
+
+/*!
+ * Returns the number of connect sections per program
+ * @param program_desc[in] program control init terminal program desc
+ * @return number of connect sections
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+unsigned int ia_css_program_control_init_terminal_get_load_section_count(
+    const ia_css_program_control_init_program_desc_t *program_desc);
+
+/*!
+ * Returns the memory offset of the first load section in the program
+ * @param program_desc[in] program control init terminal program desc
+ * @return memory offset
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+unsigned int ia_css_program_control_init_terminal_get_load_section_mem_offset(
+    const ia_css_program_control_init_program_desc_t *program_desc);
+
+/*!
+ * Gets a load section desc for a program desc
+ * of a program control init terminal
+ * @param program_desc[in]        program control init terminal program desc
+ * @param load_section_index[in]    section index
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_program_control_init_load_section_desc_t *
+ia_css_program_control_init_terminal_get_load_section_desc(
+    const ia_css_program_control_init_program_desc_t *program_desc,
+    const unsigned int load_section_index
+);
+
+/*!
+ * Gets process_id from program desc
+ * of a program control init terminal
+ * @param program_desc[in]        program control init terminal program desc
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_process_id_t ia_css_program_control_init_terminal_get_process_id(
+    const ia_css_program_control_init_program_desc_t *program_desc);
+
+/*!
+ * Set control info of program desc
+ * of a program control init terminal
+ * @param program_desc[in]    program control init terminal program desc
+ * @param process_id         unique process id used to identify the process
+ * among all active process
+ * @param num_done_events     number of events required to close the process
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+void ia_css_program_control_init_terminal_set_control_info(
+    ia_css_program_control_init_program_desc_t *program_desc,
+    ia_css_process_id_t process_id,
+    uint8_t num_done_events);
+
+/*!
+ * Gets num_done_events value from program desc
+ * of a program control init terminal
+ * @param program_desc[in]        program control init terminal program desc
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_program_control_init_terminal_get_num_done_events(
+    const ia_css_program_control_init_program_desc_t *program_desc);
+
+/*!
+ * Gets a connect section desc for a program desc
+ * of a program control init terminal
+ * @param program_desc[in]        program control init terminal program desc
+ * @param connect_section_index[in]    section index
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_program_control_init_connect_section_desc_t *
+ia_css_program_control_init_terminal_get_connect_section_desc(
+    const ia_css_program_control_init_program_desc_t *program_desc,
+    const unsigned int connect_section_index
+);
+
+/* ================= Program Control Init Terminal - END ================= */
+
+#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
+#include "ia_css_psys_terminal_impl.h"
+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
+
+#endif /* __IA_CSS_PSYS_TERMINAL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.hsys.user.h
new file mode 100644
index 000000000000..5abd321174df
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.hsys.user.h
@@ -0,0 +1,257 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_TERMINAL_HSYS_USER_H
+#define __IA_CSS_PSYS_TERMINAL_HSYS_USER_H
+
+/*! \file */
+
+/** @file ia_css_psys_terminal.hsys.user.h
+ *
+ * Define the methods on the terminal object: Hsys user interface
+ */
+
+#include <ia_css_program_group_data.h>    /* ia_css_frame_t */
+#include <ia_css_program_group_param.h>    /* ia_css_program_group_param_t */
+
+#include <ia_css_psys_process_types.h>
+#include <ia_css_psys_manifest_types.h>
+
+#include <type_support.h>                    /* bool */
+#include "ia_css_psys_dynamic_storage_class.h"
+#include "ia_css_terminal.h"
+#include "ia_css_terminal_manifest.h"
+#include "ia_css_kernel_bitmap.h"
+
+/*
+ * Creation
+ */
+
+/*
+ * This source file is created with the intention of sharing and
+ * compiled for host and firmware. Since there is no native 64bit
+ * data type support for firmware this wouldn't compile for SP
+ * tile. The part of the file that is not compilable are marked
+ * with the following __VIED_CELL marker and this comment. Once we
+ * come up with a solution to address this issue this will be
+ * removed.
+ */
+#if !defined(__VIED_CELL)
+/*! Compute the size of storage required for allocating the terminal object
+
+ @param    manifest[in]            terminal manifest
+ @param    param[in]                program group parameters
+
+ @return 0 on error
+ */
+extern size_t ia_css_sizeof_terminal(
+    const ia_css_terminal_manifest_t        *manifest,
+    const ia_css_program_group_param_t        *param);
+
+/*! Create the terminal object
+
+ @param    raw_mem[in]                pre allocated memory
+ @param    manifest[in]            terminal manifest
+ @param    terminal_param[in]        terminal parameter
+ @param enable_bitmap            program group enable bitmap
+
+ @return NULL on error
+ */
+extern ia_css_terminal_t *ia_css_terminal_create(
+    void *raw_mem,
+    const ia_css_terminal_manifest_t        *manifest,
+    const ia_css_terminal_param_t            *terminal_param,
+    ia_css_kernel_bitmap_t                enable_bitmap);
+
+/*! Destroy (the storage of) the process object
+
+ @param    terminal[in]            terminal object
+
+ @return NULL
+ */
+extern ia_css_terminal_t *ia_css_terminal_destroy(
+    ia_css_terminal_t *terminal);
+#endif /* !defined(__VIED_CELL) */
+
+/*! Print the terminal object to file/stream
+
+ @param    terminal[in]            terminal object
+ @param    fid[out]                file/stream handle
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_terminal_print(
+    const ia_css_terminal_t                    *terminal,
+    void *fid);
+
+/*! Get the (pointer to) the frame object in the terminal object
+
+ @param    terminal[in]            terminal object
+
+ @return the pointer to the frame, NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_frame_t *ia_css_data_terminal_get_frame(
+    const ia_css_data_terminal_t        *terminal);
+
+/*! Get the (pointer to) the frame descriptor object in the terminal object
+
+ @param    terminal[in]            terminal object
+
+ @return the pointer to the frame descriptor, NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_frame_descriptor_t *ia_css_data_terminal_get_frame_descriptor(
+    const ia_css_data_terminal_t        *dterminal);
+
+/*! Get the (pointer to) the fragment descriptor object in the terminal object
+
+ @param    terminal[in]            terminal object
+
+@return the pointer to the fragment descriptor, NULL on error
+*/
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_fragment_descriptor_t
+    *ia_css_data_terminal_get_fragment_descriptor(
+        const ia_css_data_terminal_t        *dterminal,
+        const unsigned int            fragment_index);
+
+/*! Get the number of fragments on the terminal
+
+ @param    terminal[in]            terminal object
+
+ @return the fragment count, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint16_t ia_css_data_terminal_get_fragment_count(
+    const ia_css_data_terminal_t        *dterminal);
+
+/*! Get the number of section on the (param)terminal
+ @param    manifest[in]            terminal manifest
+ @param    terminal_param[in]        terminal parameter
+
+ @return the section count, 0 on error
+ */
+extern uint16_t ia_css_param_terminal_compute_section_count(
+    const ia_css_terminal_manifest_t    *manifest,
+    const ia_css_program_group_param_t    *param);
+
+/*! Get the number of planes on the (data)terminal
+ @param    manifest[in]            terminal manifest
+ @param    terminal_param[in]        terminal parameter
+
+ @return the plane count, 1(default) on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_data_terminal_compute_plane_count(
+    const ia_css_terminal_manifest_t        *manifest,
+    const ia_css_program_group_param_t        *param);
+
+/*! check if given terminal is parameter terminal.
+
+ @param    terminal[in]            (base)terminal object
+
+ @return true on success, false on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_parameter_terminal(
+    const ia_css_terminal_t                    *terminal);
+
+/*! check if given terminal is program terminal.
+
+ @program    terminal[in]            (base)terminal object
+
+ @return true on success, false on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_program_terminal(
+    const ia_css_terminal_t                    *terminal);
+
+/*! check if given terminal is program control init terminal.
+
+ @program control init    terminal[in]            (base)terminal object
+
+ @return true on success, false on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_program_control_init_terminal(
+    const ia_css_terminal_t                    *terminal);
+
+/*! check if given terminal is spatial parameter terminal.
+
+ @spatial    terminal[in]            (base)terminal object
+
+ @return true on success, false on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_spatial_parameter_terminal(
+    const ia_css_terminal_t                    *terminal);
+
+/*! check if given terminal is data terminal.
+
+ @param    terminal[in]            (base)terminal object
+
+ @return true on success, false on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_data_terminal(
+    const ia_css_terminal_t                    *terminal);
+
+/*! obtain buffer out of terminal(both data & param terminals can call this)
+
+ @param    terminal[in]    (base)terminal object of either data or param terminal.
+
+ @return vied address of buffer stored in terminal
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_vaddress_t  ia_css_terminal_get_buffer(
+        const ia_css_terminal_t *terminal);
+
+/*!store a buffer in the terminal.
+
+ @param    terminal[in]    (base)terminal object of either data or param terminal.
+ @param buffer[in]    buffer in vied (hrt address) space.
+
+ @return 0 on success
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_terminal_set_buffer(ia_css_terminal_t *terminal,
+                vied_vaddress_t buffer);
+
+/*! Obtain terminal buffer index out of terminal object
+
+ @param    terminal[in]    (base)terminal object of either data or param terminal.
+
+ @return terminal buffer index stored in terminal object on success, -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_terminal_get_terminal_index(
+    const ia_css_terminal_t *terminal);
+
+/*! Store a terminal buffer index in the terminal object
+
+ @param    terminal[in]        (base)terminal object of either data or param terminal.
+ @param terminal_index[in]    terminal buffer index
+
+ @return 0 on success
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_terminal_set_terminal_index(
+    ia_css_terminal_t *terminal,
+    unsigned int terminal_index);
+
+#endif /* __IA_CSS_PSYS_TERMINAL_HSYS_USER_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_impl.h
new file mode 100644
index 000000000000..5a9657945524
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_impl.h
@@ -0,0 +1,2053 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_TERMINAL_IMPL_H
+#define __IA_CSS_PSYS_TERMINAL_IMPL_H
+
+#include <ia_css_psys_terminal.h>
+
+#include <ia_css_psys_process_types.h>
+#include <ia_css_psys_terminal_manifest.h>
+
+#include <ia_css_program_group_data.h>
+#include <ia_css_program_group_param.h>
+
+#include <ia_css_psys_process_group.h>
+#include <ia_css_psys_program_group_manifest.h>
+#include <ia_css_psys_process_group.hsys.user.h>
+
+#include <type_support.h>
+#include <error_support.h>    /* for verifexit, verifjmpexit */
+#include <assert_support.h>    /* for COMPILATION_ERROR_IF */
+#include <misc_support.h>    /* for NOT_USED */
+#include "ia_css_psys_terminal_private_types.h"
+#include "ia_css_terminal_manifest_types.h"
+#include "ia_css_psys_dynamic_trace.h"
+#include "ia_css_psys_manifest_types.h"
+#include "ia_css_psys_program_group_private.h"
+#include "ia_css_terminal_types.h"
+
+STORAGE_CLASS_INLINE int ia_css_data_terminal_print(const ia_css_terminal_t *terminal,
+    void *fid) {
+
+    DECLARE_ERRVAL
+    int retval = -1;
+    int i;
+    ia_css_data_terminal_t *dterminal = (ia_css_data_terminal_t *)terminal;
+    uint16_t fragment_count =
+        ia_css_data_terminal_get_fragment_count(dterminal);
+    verifexitval(fragment_count != 0, EINVAL);
+
+    retval = ia_css_frame_descriptor_print(
+        ia_css_data_terminal_get_frame_descriptor(dterminal),
+        fid);
+    verifexitval(retval == 0, EINVAL);
+
+    retval = ia_css_frame_print(
+        ia_css_data_terminal_get_frame(dterminal), fid);
+    verifexitval(retval == 0, EINVAL);
+
+    for (i = 0; i < (int)fragment_count; i++) {
+        retval = ia_css_fragment_descriptor_print(
+            ia_css_data_terminal_get_fragment_descriptor(
+                dterminal, i), fid);
+        verifexitval(retval == 0, EINVAL);
+    }
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+            "stream2gen_buffer_size = %u\n", dterminal->stream2gen_buffer_size);
+
+    retval = 0;
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_print failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_terminal_print(
+    const ia_css_terminal_t *terminal,
+    void *fid)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+    ia_css_terminal_type_t term_type = ia_css_terminal_get_type(terminal);
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_terminal_print(): enter:\n");
+
+    verifexitval(terminal != NULL, EFAULT);
+
+    IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
+        "\tTerminal 0x%lx sizeof %d, typeof %d, parent 0x%lx\n",
+        (unsigned long int)terminal,
+        (int)ia_css_terminal_get_size(terminal),
+        (int)ia_css_terminal_get_type(terminal),
+        (unsigned long int)ia_css_terminal_get_parent(terminal));
+
+    switch (term_type) {
+    case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
+        ia_css_program_control_init_terminal_print(
+            (ia_css_program_control_init_terminal_t *)terminal);
+    break;
+    case IA_CSS_TERMINAL_TYPE_DATA_IN:
+    case IA_CSS_TERMINAL_TYPE_DATA_OUT:
+        ia_css_data_terminal_print(terminal, fid);
+    break;
+    default:
+        /* other terminal prints are currently not supported */
+    break;
+    }
+
+    retval = 0;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_print invalid argument terminal\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_print failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_input(
+    const ia_css_terminal_t *terminal)
+{
+    DECLARE_ERRVAL
+    bool is_input = false;
+    ia_css_terminal_type_t terminal_type;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_is_terminal_input(): enter:\n");
+
+    verifexitval(terminal != NULL, EFAULT);
+
+    terminal_type = ia_css_terminal_get_type(terminal);
+
+    switch (terminal_type) {
+    case IA_CSS_TERMINAL_TYPE_DATA_IN:        /* Fall through */
+    case IA_CSS_TERMINAL_TYPE_STATE_IN:        /* Fall through */
+    case IA_CSS_TERMINAL_TYPE_PARAM_STREAM:        /* Fall through */
+    case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
+    case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
+    case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
+    case IA_CSS_TERMINAL_TYPE_PROGRAM:
+    case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
+        is_input = true;
+        break;
+    case IA_CSS_TERMINAL_TYPE_DATA_OUT:        /* Fall through */
+    case IA_CSS_TERMINAL_TYPE_STATE_OUT:
+    case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
+    case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
+    case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
+        is_input = false;
+        break;
+    default:
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_is_terminal_input: Unknown terminal type (%d)\n",
+            terminal_type);
+        goto EXIT;
+    }
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_is_terminal_input invalid argument\n");
+    }
+    return is_input;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+size_t ia_css_terminal_get_size(
+    const ia_css_terminal_t    *terminal)
+{
+    DECLARE_ERRVAL
+    size_t size = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_terminal_get_size(): enter:\n");
+
+    verifexitval(terminal != NULL, EFAULT);
+
+    size = terminal->size;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_get_size invalid argument\n");
+    }
+    return size;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_terminal_type_t ia_css_terminal_get_type(
+    const ia_css_terminal_t    *terminal)
+{
+    DECLARE_ERRVAL
+    ia_css_terminal_type_t    terminal_type = IA_CSS_N_TERMINAL_TYPES;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_terminal_get_type(): enter:\n");
+
+    verifexitval(terminal != NULL, EFAULT);
+
+    terminal_type = terminal->terminal_type;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_get_type invalid argument\n");
+    }
+    return terminal_type;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_terminal_set_type(
+    ia_css_terminal_t *terminal,
+    const ia_css_terminal_type_t terminal_type)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_terminal_set_type(): enter:\n");
+
+    verifexitval(terminal != NULL, EFAULT);
+
+    terminal->terminal_type = terminal_type;
+
+    retval = 0;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_set_type invalid argument terminal\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_set_type failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint16_t ia_css_terminal_get_terminal_manifest_index(
+    const ia_css_terminal_t *terminal)
+{
+    DECLARE_ERRVAL
+    uint16_t terminal_manifest_index;
+
+    terminal_manifest_index = 0xffff;
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_terminal_get_terminal_manifest_index(): enter:\n");
+
+    verifexitval(terminal != NULL, EFAULT);
+
+    terminal_manifest_index = terminal->tm_index;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_get_terminal_manifest_index: invalid argument\n");
+    }
+    return terminal_manifest_index;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_terminal_set_terminal_manifest_index(
+    ia_css_terminal_t *terminal,
+    const uint16_t terminal_manifest_index)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_terminal_set_terminal_manifest_index(): enter:\n");
+
+    verifexitval(terminal != NULL, EFAULT);
+    terminal->tm_index = terminal_manifest_index;
+
+    retval = 0;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_set_terminal_manifest_index: invalid argument terminal\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_set_terminal_manifest_index: failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_terminal_get_payload_size(
+    const ia_css_terminal_t *terminal)
+{
+    DECLARE_ERRVAL
+    uint32_t payload_size;
+
+    payload_size = 0;
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_terminal_get_payload_size(): enter:\n");
+
+    verifexitval(terminal != NULL, EFAULT);
+
+    payload_size = terminal->payload_size;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_get_payload_size: invalid argument\n");
+    }
+    return payload_size;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_terminal_set_payload_size(
+    ia_css_terminal_t *terminal,
+    uint32_t payload_size)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_terminal_set_payload_size(): enter:\n");
+
+    verifexitval(terminal != NULL, EFAULT);
+    terminal->payload_size = payload_size;
+
+    retval = 0;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_set_payload_size: invalid argument terminal\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_set_payload_size: failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_terminal_ID_t ia_css_terminal_get_ID(
+    const ia_css_terminal_t    *terminal)
+{
+    DECLARE_ERRVAL
+    ia_css_terminal_ID_t retval = IA_CSS_TERMINAL_INVALID_ID;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_terminal_get_ID(): enter:\n");
+
+    verifexitval(terminal != NULL, EFAULT);
+
+    retval = terminal->ID;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_get_ID invalid argument\n");
+        retval = 0;
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_data_terminal_get_kernel_id(
+    const ia_css_data_terminal_t *dterminal)
+{
+    DECLARE_ERRVAL
+    uint8_t retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_data_terminal_get_kernel_id(): enter:\n");
+
+    verifexitval(dterminal != NULL, EFAULT);
+
+    retval = dterminal->kernel_id;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_data_terminal_get_kernel_id: invalid argument\n");
+        retval =  0;
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_data_terminal_is_compressed(
+    const ia_css_data_terminal_t *dterminal,
+    uint8_t *val)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+    const ia_css_frame_descriptor_t *frame_descriptor;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_data_terminal_is_compressed enter\n");
+
+    frame_descriptor =
+        ia_css_data_terminal_get_frame_descriptor(dterminal);
+
+    verifexitval(frame_descriptor != NULL, EFAULT);
+
+    *val = frame_descriptor->is_compressed;
+    retval = 0;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_data_terminal_is_compressed: Null frame descriptor\n");
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_connection_type_t ia_css_data_terminal_get_connection_type(
+    const ia_css_data_terminal_t *dterminal)
+{
+    DECLARE_ERRVAL
+    ia_css_connection_type_t connection_type = IA_CSS_N_CONNECTION_TYPES;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_data_terminal_get_connection_type(): enter:\n");
+
+    verifexitval(dterminal != NULL, EFAULT);
+
+    connection_type = dterminal->connection_type;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_data_terminal_get_connection_type: invalid argument\n");
+    }
+    return connection_type;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_data_terminal_get_link_id(
+    const ia_css_data_terminal_t *dterminal)
+{
+    DECLARE_ERRVAL
+    uint8_t link_id = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_data_terminal_get_link_id(): enter:\n");
+
+    verifexitval(dterminal != NULL, EFAULT);
+
+    link_id = dterminal->link_id;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_data_terminal_get_link_id: invalid argument\n");
+    }
+    return link_id;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_data_terminal_set_link_id(
+    ia_css_data_terminal_t *dterminal,
+    const uint8_t link_id)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_data_terminal_set_link_id(): enter:\n");
+
+    verifexitval(dterminal != NULL, EFAULT);
+    dterminal->link_id = link_id;
+
+    retval = 0;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_data_terminal_set_link_id: invalid argument terminal\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_data_terminal_set_link_id: failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_data_terminal_set_connection_type(
+    ia_css_data_terminal_t *dterminal,
+    const ia_css_connection_type_t connection_type)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_data_terminal_set_connection_type(): enter:\n");
+
+    verifexitval(dterminal != NULL, EFAULT);
+
+    dterminal->connection_type = connection_type;
+
+    retval = 0;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_data_terminal_set_connection_type: invalid argument dterminal\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_data_terminal_set_connection_type failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_data_terminal_set_stream2gen_buffer_size(
+    ia_css_data_terminal_t *dterminal,
+    const uint16_t stream2gen_buffer_size)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_data_terminal_set_stream2gen_buffer_size(): enter:\n");
+
+    verifexitval(dterminal != NULL, EFAULT);
+
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, DEBUG,
+        "ia_css_data_terminal_set_stream2gen_buffer_size(): stream2gen_buffer_size = %u\n", stream2gen_buffer_size);
+    dterminal->stream2gen_buffer_size = stream2gen_buffer_size;
+
+    retval = 0;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_data_terminal_set_stream2gen_buffer_size: invalid argument dterminal\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_data_terminal_set_stream2gen_buffer_size failed (%i)\n",
+            retval);
+    }
+
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_process_group_t *ia_css_terminal_get_parent(
+    const ia_css_terminal_t    *terminal)
+{
+    DECLARE_ERRVAL
+    ia_css_process_group_t *parent = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_terminal_get_parent(): enter:\n");
+
+    verifexitval(terminal != NULL, EFAULT);
+    if (terminal->parent_offset == 0) {
+        return NULL;
+    }
+
+    parent = (ia_css_process_group_t *) ((char *)terminal +
+                    terminal->parent_offset);
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_get_parent invalid argument\n");
+    }
+    return parent;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_terminal_set_parent(
+    ia_css_terminal_t *terminal,
+    ia_css_process_group_t *parent)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_terminal_set_parent(): enter:\n");
+
+    verifexitval(terminal != NULL, EFAULT);
+    verifexitval(parent != NULL, EFAULT);
+
+    terminal->parent_offset = (uint16_t) ((char *)parent -
+                        (char *)terminal);
+
+    retval = 0;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_set_parent invalid argument\n");
+    }
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_set_parent failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_frame_t *ia_css_data_terminal_get_frame(
+    const ia_css_data_terminal_t *dterminal)
+{
+    DECLARE_ERRVAL
+    ia_css_frame_t *frame = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_data_terminal_get_frame(): enter:\n");
+
+    verifexitval(dterminal != NULL, EFAULT);
+
+    frame = (ia_css_frame_t    *)(&(dterminal->frame));
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_data_terminal_get_frame invalid argument\n");
+    }
+    return frame;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_frame_descriptor_t *ia_css_data_terminal_get_frame_descriptor(
+    const ia_css_data_terminal_t *dterminal)
+{
+    DECLARE_ERRVAL
+    ia_css_frame_descriptor_t *frame_descriptor = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_data_terminal_get_frame_descriptor(): enter:\n");
+
+    verifexitval(dterminal != NULL, EFAULT);
+
+    frame_descriptor =
+        (ia_css_frame_descriptor_t *)(&(dterminal->frame_descriptor));
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_data_terminal_get_frame_descriptor: invalid argument\n");
+    }
+    return frame_descriptor;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_fragment_descriptor_t *ia_css_data_terminal_get_fragment_descriptor(
+    const ia_css_data_terminal_t *dterminal,
+    const unsigned int fragment_index)
+{
+    DECLARE_ERRVAL
+    ia_css_fragment_descriptor_t *fragment_descriptor = NULL;
+    uint16_t fragment_count = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_data_terminal_get_frame_descriptor(): enter:\n");
+
+    fragment_count = ia_css_data_terminal_get_fragment_count(dterminal);
+
+    verifexitval(dterminal != NULL, EFAULT);
+    verifexitval(fragment_count != 0, EINVAL);
+    verifexitval(fragment_index < fragment_count, EINVAL);
+
+    fragment_descriptor = (ia_css_fragment_descriptor_t *)
+        ((char *)dterminal + dterminal->fragment_descriptor_offset);
+
+    fragment_descriptor += fragment_index;
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_data_terminal_get_frame_descriptor: invalid argument\n");
+    }
+    return fragment_descriptor;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint16_t ia_css_data_terminal_get_fragment_count(
+    const ia_css_data_terminal_t *dterminal)
+{
+    DECLARE_ERRVAL
+    ia_css_process_group_t *parent;
+    uint16_t fragment_count = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_data_terminal_get_fragment_count(): enter:\n");
+
+    parent = ia_css_terminal_get_parent((ia_css_terminal_t *)dterminal);
+
+    verifexitval(dterminal != NULL, EFAULT);
+    verifexitval(parent != NULL, EFAULT);
+
+    fragment_count = ia_css_process_group_get_fragment_count(parent);
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_data_terminal_get_fragment_count: invalid argument\n");
+    }
+    return fragment_count;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_parameter_terminal(
+    const ia_css_terminal_t    *terminal)
+{
+    DECLARE_ERRVAL
+    ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_is_terminal_parameter_terminal(): enter:\n");
+
+    verifexitval(terminal != NULL, EFAULT);
+
+    /* will return an error value on error */
+    terminal_type = ia_css_terminal_get_type(terminal);
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_is_terminal_parameter_terminal: invalid argument\n");
+    }
+    return (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
+        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT);
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_data_terminal(
+    const ia_css_terminal_t *terminal)
+{
+    DECLARE_ERRVAL
+    ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_is_terminal_data_terminal(): enter:\n");
+
+    verifexitval(terminal != NULL, EFAULT);
+
+    /* will return an error value on error */
+    terminal_type = ia_css_terminal_get_type(terminal);
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_is_terminal_data_terminal invalid argument\n");
+    }
+    return (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN ||
+            terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT);
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_program_terminal(
+    const ia_css_terminal_t *terminal)
+{
+    DECLARE_ERRVAL
+    ia_css_terminal_type_t    terminal_type = IA_CSS_N_TERMINAL_TYPES;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_is_terminal_program_terminal(): enter:\n");
+
+    verifexitval(terminal != NULL, EFAULT);
+
+    /* will return an error value on error */
+    terminal_type = ia_css_terminal_get_type(terminal);
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_is_terminal_program_terminal: invalid argument\n");
+    }
+    return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM);
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_program_control_init_terminal(
+    const ia_css_terminal_t *terminal)
+{
+    DECLARE_ERRVAL
+    ia_css_terminal_type_t    terminal_type = IA_CSS_N_TERMINAL_TYPES;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_is_terminal_program_control_init_terminal(): enter:\n");
+
+    verifexitval(terminal != NULL, EFAULT);
+
+    /* will return an error value on error */
+    terminal_type = ia_css_terminal_get_type(terminal);
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_is_terminal_program_control_init_terminal: invalid argument\n");
+    }
+    return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT);
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_spatial_parameter_terminal(
+    const ia_css_terminal_t *terminal)
+{
+    DECLARE_ERRVAL
+    ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_is_terminal_spatial_parameter_terminal(): enter:\n");
+
+    verifexitval(terminal != NULL, EFAULT);
+
+    /* will return an error value on error */
+    terminal_type = ia_css_terminal_get_type(terminal);
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_is_terminal_spatial_param_terminal: invalid argument\n");
+    }
+    return (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN ||
+        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT);
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_data_terminal_compute_plane_count(
+    const ia_css_terminal_manifest_t *manifest,
+    const ia_css_program_group_param_t *param)
+{
+    DECLARE_ERRVAL
+    uint8_t    plane_count = 1;
+
+    NOT_USED(manifest);
+    NOT_USED(param);
+
+    verifexitval(manifest != NULL, EFAULT);
+    verifexitval(param != NULL, EFAULT);
+    /* TODO: Implementation Missing*/
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_data_terminal_compute_plane_count(): enter:\n");
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_data_terminal_compute_plane_count: invalid argument\n");
+    }
+    return plane_count;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_vaddress_t  ia_css_terminal_get_buffer(
+    const ia_css_terminal_t *terminal)
+{
+    DECLARE_ERRVAL
+    vied_vaddress_t buffer = VIED_NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_terminal_get_buffer(): enter:\n");
+
+    verifexitval(terminal != NULL, EFAULT);
+    if (ia_css_is_terminal_data_terminal(terminal)) {
+        ia_css_frame_t *frame = ia_css_data_terminal_get_frame(
+                    (ia_css_data_terminal_t *)terminal);
+
+        verifexitval(frame != NULL, EFAULT);
+        buffer = ia_css_frame_get_buffer(frame);
+    } else if (ia_css_is_terminal_parameter_terminal(terminal)) {
+        const ia_css_param_terminal_t *param_terminal =
+            (const ia_css_param_terminal_t *)terminal;
+
+        verifexitval(param_terminal != NULL, EFAULT);
+        buffer = param_terminal->param_payload.buffer;
+    }  else if (ia_css_is_terminal_program_terminal(terminal)) {
+        const ia_css_program_terminal_t *program_terminal =
+            (const ia_css_program_terminal_t *)terminal;
+
+        verifexitval(program_terminal != NULL, EFAULT);
+        buffer = program_terminal->param_payload.buffer;
+    }  else if (ia_css_is_terminal_program_control_init_terminal(terminal)) {
+        const ia_css_program_control_init_terminal_t *program_ctrl_init_terminal =
+            (const ia_css_program_control_init_terminal_t *)terminal;
+
+        verifexitval(program_ctrl_init_terminal != NULL, EFAULT);
+        buffer = program_ctrl_init_terminal->param_payload.buffer;
+    } else if (ia_css_is_terminal_spatial_parameter_terminal(terminal)) {
+        const ia_css_spatial_param_terminal_t *spatial_terminal =
+            (const ia_css_spatial_param_terminal_t *)terminal;
+
+        verifexitval(spatial_terminal != NULL, EFAULT);
+        buffer = spatial_terminal->param_payload.buffer;
+    }
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_get_buffer: invalid argument terminal\n");
+    }
+    return buffer;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_terminal_set_buffer(
+    ia_css_terminal_t *terminal,
+    vied_vaddress_t buffer)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+    ia_css_param_terminal_t *pterminal = NULL;
+    ia_css_program_terminal_t *prog_terminal = NULL;
+    ia_css_program_control_init_terminal_t *progctrl_terminal = NULL;
+    ia_css_spatial_param_terminal_t *spatial_terminal = NULL;
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_terminal_set_buffer(): enter:\n");
+
+    if (ia_css_is_terminal_data_terminal(terminal) == true) {
+        /* Currently using Frames inside data terminal ,
+         * TODO: start directly using data.
+         */
+        ia_css_data_terminal_t *dterminal =
+            (ia_css_data_terminal_t *)terminal;
+        ia_css_frame_t *frame =
+            ia_css_data_terminal_get_frame(dterminal);
+
+        verifexitval(frame != NULL, EFAULT);
+        retval = ia_css_frame_set_buffer(frame, buffer);
+        verifexitval(retval == 0, EINVAL);
+    } else if (ia_css_is_terminal_parameter_terminal(terminal) == true) {
+        pterminal = (ia_css_param_terminal_t *)terminal;
+        verifexitval(pterminal != NULL, EFAULT);
+        pterminal->param_payload.buffer = buffer;
+        retval = 0;
+    } else if (ia_css_is_terminal_program_terminal(terminal) == true) {
+        prog_terminal = (ia_css_program_terminal_t *)terminal;
+        verifexitval(prog_terminal != NULL, EFAULT);
+        prog_terminal->param_payload.buffer = buffer;
+        retval = 0;
+    } else if (ia_css_is_terminal_program_control_init_terminal(terminal) == true) {
+        progctrl_terminal = (ia_css_program_control_init_terminal_t *)terminal;
+        verifexitval(progctrl_terminal != NULL, EFAULT);
+        progctrl_terminal->param_payload.buffer = buffer;
+        retval = 0;
+    } else if (ia_css_is_terminal_spatial_parameter_terminal(terminal) ==
+            true) {
+        spatial_terminal = (ia_css_spatial_param_terminal_t *)terminal;
+        verifexitval(spatial_terminal != NULL, EFAULT);
+        spatial_terminal->param_payload.buffer = buffer;
+        retval = 0;
+    } else {
+        return retval;
+    }
+
+    retval = 0;
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_set_buffer failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_terminal_get_terminal_index(
+    const ia_css_terminal_t *terminal)
+{
+    DECLARE_ERRVAL
+    int terminal_index = -1;
+    verifexitval(terminal != NULL, EFAULT);
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_terminal_get_terminal_index(): enter:\n");
+
+    if (ia_css_is_terminal_data_terminal(terminal)) {
+        ia_css_frame_t *frame = ia_css_data_terminal_get_frame(
+                    (ia_css_data_terminal_t *)terminal);
+
+        verifexitval(frame != NULL, EFAULT);
+        terminal_index = ia_css_frame_get_data_index(frame);
+    } else {
+        if (ia_css_is_terminal_parameter_terminal(terminal)) {
+            const ia_css_param_terminal_t *param_terminal =
+                (const ia_css_param_terminal_t *)terminal;
+            verifexitval(param_terminal != NULL, EFAULT);
+            terminal_index = param_terminal->param_payload.terminal_index;
+        }  else if (ia_css_is_terminal_program_terminal(terminal)) {
+            const ia_css_program_terminal_t *program_terminal =
+                (const ia_css_program_terminal_t *)terminal;
+            verifexitval(program_terminal != NULL, EFAULT);
+            terminal_index = program_terminal->param_payload.terminal_index;
+        }  else if (ia_css_is_terminal_program_control_init_terminal(terminal)) {
+            const ia_css_program_control_init_terminal_t *program_ctrl_init_terminal =
+                (const ia_css_program_control_init_terminal_t *)terminal;
+            verifexitval(program_ctrl_init_terminal != NULL, EFAULT);
+            terminal_index = program_ctrl_init_terminal->param_payload.terminal_index;
+        } else if (ia_css_is_terminal_spatial_parameter_terminal(terminal)) {
+            const ia_css_spatial_param_terminal_t *spatial_terminal =
+                (const ia_css_spatial_param_terminal_t *)terminal;
+            verifexitval(spatial_terminal != NULL, EFAULT);
+            terminal_index = spatial_terminal->param_payload.terminal_index;
+        } else {
+            verifjmpexit(0);
+        }
+    }
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_get_terminal_index: invalid argument\n");
+    }
+    return terminal_index;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_terminal_set_terminal_index(
+    ia_css_terminal_t *terminal,
+    unsigned int terminal_index)
+{
+    DECLARE_ERRVAL
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_terminal_set_terminal_index(): enter:\n");
+
+    if (ia_css_is_terminal_data_terminal(terminal) == true) {
+        /* Currently using Frames inside data terminal ,
+         * TODO: start directly using data.
+         */
+        ia_css_data_terminal_t *dterminal =
+            (ia_css_data_terminal_t *)terminal;
+        ia_css_frame_t *frame =
+            ia_css_data_terminal_get_frame(dterminal);
+
+        verifexitval(frame != NULL, EFAULT);
+        retval = ia_css_frame_set_data_index(frame, terminal_index);
+        verifexitval(retval == 0, EINVAL);
+    } else {
+        if (ia_css_is_terminal_parameter_terminal(terminal) == true) {
+            ia_css_param_terminal_t *pterminal =
+                (ia_css_param_terminal_t *)terminal;
+
+            pterminal->param_payload.terminal_index = terminal_index;
+            retval = 0;
+        } else if (ia_css_is_terminal_program_terminal(terminal) == true) {
+            ia_css_program_terminal_t *pterminal =
+                (ia_css_program_terminal_t *)terminal;
+
+            pterminal->param_payload.terminal_index = terminal_index;
+            retval = 0;
+        } else if (ia_css_is_terminal_program_control_init_terminal(terminal)
+                == true) {
+            ia_css_program_control_init_terminal_t *pterminal =
+                (ia_css_program_control_init_terminal_t *)terminal;
+
+            pterminal->param_payload.terminal_index = terminal_index;
+            retval = 0;
+        } else if (ia_css_is_terminal_spatial_parameter_terminal(terminal) ==
+                true) {
+            ia_css_spatial_param_terminal_t *pterminal =
+                (ia_css_spatial_param_terminal_t *)terminal;
+
+            pterminal->param_payload.terminal_index = terminal_index;
+            retval = 0;
+        } else {
+            return retval;
+        }
+    }
+
+    retval = 0;
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_set_terminal_index failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+STORAGE_CLASS_INLINE bool ia_css_is_data_terminal_valid(
+    const ia_css_terminal_t *terminal,
+    const ia_css_terminal_manifest_t *terminal_manifest,
+    const uint16_t nof_fragments)
+{
+    DECLARE_ERRVAL
+    bool invalid_flag = false;
+
+    const ia_css_data_terminal_t *dterminal =
+        (ia_css_data_terminal_t *)terminal;
+    const ia_css_data_terminal_manifest_t *dt_manifest =
+        (ia_css_data_terminal_manifest_t *)terminal_manifest;
+    const ia_css_frame_descriptor_t *frame_descriptor;
+    ia_css_frame_format_bitmap_t man_frame_format_bitmap;
+    ia_css_frame_format_bitmap_t proc_frame_format_bitmap;
+    uint16_t max_value[IA_CSS_N_DATA_DIMENSION];
+    uint16_t min_value[IA_CSS_N_DATA_DIMENSION];
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_is_data_terminal_valid enter\n");
+
+    frame_descriptor =
+        ia_css_data_terminal_get_frame_descriptor(dterminal);
+    verifexitval(frame_descriptor != NULL, EFAULT);
+    man_frame_format_bitmap =
+        ia_css_data_terminal_manifest_get_frame_format_bitmap(
+                    dt_manifest);
+    proc_frame_format_bitmap =
+        ia_css_frame_format_bit_mask(
+                frame_descriptor->frame_format_type);
+    /*
+     * TODO: Replace by 'validation of frame format type'.
+     * Currently frame format type is not correctly set by manifest,
+     * waiting for HSD 1804260604
+     */
+    if (man_frame_format_bitmap > 0) {
+        if ((man_frame_format_bitmap &
+                    proc_frame_format_bitmap) == 0) {
+            uint32_t *bitmap_arr =
+                (uint32_t *)&man_frame_format_bitmap;
+
+            NOT_USED(bitmap_arr);
+            IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+                "Frame format type not defined in manifest\n");
+            IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
+                " man bitmap_arr[]: %d,%d\n",
+                bitmap_arr[1], bitmap_arr[0]);
+            bitmap_arr = (uint32_t *)&proc_frame_format_bitmap;
+            IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
+                " proc bitmap_arr[]: %d,%d\n",
+                bitmap_arr[1], bitmap_arr[0]);
+        }
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "Frame format bitmap not defined in manifest\n");
+    }
+    ia_css_data_terminal_manifest_get_min_size(dt_manifest, min_value);
+    /*
+     * TODO: Replace by validation of Minimal frame column dimensions.
+     *  Currently not correctly set by manifest yet,
+     *  waiting for HSD 1804260604
+     */
+    if ((frame_descriptor->dimension[IA_CSS_COL_DIMENSION] <
+        min_value[IA_CSS_COL_DIMENSION])) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "Minimal frame column dimensions not set correctly (by manifest)\n");
+    }
+    /*
+     * TODO: Replace by validation of Minimal frame row dimensions.
+     * Currently not correctly set by manifest yet,
+     * waiting for HSD 1804260604
+     */
+    if (frame_descriptor->dimension[IA_CSS_ROW_DIMENSION] <
+        min_value[IA_CSS_ROW_DIMENSION]) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "Minimal frame row dimensions not set correctly (by manifest)\n");
+    }
+
+    ia_css_data_terminal_manifest_get_max_size(dt_manifest, max_value);
+    /*
+     * TODO: Replace by validation of Maximal frame column dimensions.
+     * Currently not correctly set by manifest yet,
+     * waiting for HSD 1804260604
+     */
+    if (frame_descriptor->dimension[IA_CSS_COL_DIMENSION] >
+        max_value[IA_CSS_COL_DIMENSION]) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "Maximal frame column dimensions not set correctly (by manifest)\n");
+    }
+    /*
+     * TODO: Replace by validation of Maximal frame row dimensions.
+     * Currently not correctly set by manifest yet,
+     * waiting for HSD 1804260604
+     */
+    if (frame_descriptor->dimension[IA_CSS_ROW_DIMENSION] >
+        max_value[IA_CSS_ROW_DIMENSION]) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "Maximal frame row dimensions not set correctly (by manifest)\n");
+    }
+    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, VERBOSE, "min_value: [%d,%d]\n",
+        min_value[IA_CSS_COL_DIMENSION],
+        min_value[IA_CSS_ROW_DIMENSION]);
+    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, VERBOSE, "max_value: [%d,%d]\n",
+        max_value[IA_CSS_COL_DIMENSION],
+        max_value[IA_CSS_ROW_DIMENSION]);
+    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, VERBOSE, "frame dim: [%d,%d]\n",
+        frame_descriptor->dimension[IA_CSS_COL_DIMENSION],
+        frame_descriptor->dimension[IA_CSS_ROW_DIMENSION]);
+    /*
+     * TODO: Add validation of fragment dimensions.
+     * Currently not set by manifest yet, waiting for HSD 1804260604
+     */
+    NOT_USED(nof_fragments);
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_is_data_terminal_valid() invalid argument\n");
+        return false;
+    } else {
+        return (!invalid_flag);
+    }
+}
+
+STORAGE_CLASS_INLINE void ia_css_program_terminal_seq_info_print(
+    const ia_css_kernel_fragment_sequencer_info_manifest_desc_t
+        *man_seq_info_desc,
+    const ia_css_kernel_fragment_sequencer_info_desc_t
+        *term_seq_info_desc)
+{
+    NOT_USED(man_seq_info_desc);
+    NOT_USED(term_seq_info_desc);
+
+    /* slice dimension column */
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "fragment_grid_slice_dimension: %d\n",
+        term_seq_info_desc->
+        fragment_grid_slice_dimension[IA_CSS_COL_DIMENSION]);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "max_fragment_grid_slice_dimension: %d\n",
+        man_seq_info_desc->
+        max_fragment_grid_slice_dimension[IA_CSS_COL_DIMENSION]);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "min_fragment_grid_slice_dimension: %d\n",
+        man_seq_info_desc->
+        min_fragment_grid_slice_dimension[IA_CSS_COL_DIMENSION]);
+
+    /* slice dimension row */
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "fragment_grid_slice_dimension: %d\n",
+        term_seq_info_desc->
+        fragment_grid_slice_dimension[IA_CSS_ROW_DIMENSION]);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "max_fragment_grid_slice_dimension: %d\n",
+        man_seq_info_desc->
+        max_fragment_grid_slice_dimension[IA_CSS_ROW_DIMENSION]);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "min_fragment_grid_slice_dimension: %d\n",
+        man_seq_info_desc->
+        min_fragment_grid_slice_dimension[IA_CSS_ROW_DIMENSION]);
+
+    /* slice count column */
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "fragment_grid_slice_count: %d\n",
+        term_seq_info_desc->
+        fragment_grid_slice_count[IA_CSS_COL_DIMENSION]);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "max_fragment_grid_slice_count: %d\n",
+        man_seq_info_desc->
+        max_fragment_grid_slice_count[IA_CSS_COL_DIMENSION]);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "min_fragment_grid_slice_count: %d\n",
+        man_seq_info_desc->
+        min_fragment_grid_slice_count[IA_CSS_COL_DIMENSION]);
+
+    /* slice count row */
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "fragment_grid_slice_count: %d\n",
+        term_seq_info_desc->
+        fragment_grid_slice_count[IA_CSS_ROW_DIMENSION]);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "max_fragment_grid_slice_count: %d\n",
+        man_seq_info_desc->
+        max_fragment_grid_slice_count[IA_CSS_ROW_DIMENSION]);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "min_fragment_grid_slice_count: %d\n",
+        man_seq_info_desc->
+        min_fragment_grid_slice_count[IA_CSS_ROW_DIMENSION]);
+
+    /* decimation factor column */
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "fragment_grid_point_decimation_factor: %d\n",
+        term_seq_info_desc->
+        fragment_grid_point_decimation_factor[IA_CSS_COL_DIMENSION]);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "max_fragment_grid_point_decimation_factor: %d\n",
+        man_seq_info_desc->
+        max_fragment_grid_point_decimation_factor[IA_CSS_COL_DIMENSION]
+        );
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "min_fragment_grid_point_decimation_factor: %d\n",
+        man_seq_info_desc->
+        min_fragment_grid_point_decimation_factor[IA_CSS_COL_DIMENSION]
+        );
+
+    /* decimation factor row */
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "fragment_grid_point_decimation_factor: %d\n",
+        term_seq_info_desc->
+        fragment_grid_point_decimation_factor[IA_CSS_ROW_DIMENSION]);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "max_fragment_grid_point_decimation_factor: %d\n",
+        man_seq_info_desc->
+        max_fragment_grid_point_decimation_factor[
+                    IA_CSS_ROW_DIMENSION]);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "min_fragment_grid_point_decimation_factor: %d\n",
+        man_seq_info_desc->
+        min_fragment_grid_point_decimation_factor[
+                    IA_CSS_ROW_DIMENSION]);
+
+    /* index column */
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "fragment_grid_overlay_pixel_topleft_index: %d\n",
+        term_seq_info_desc->
+        fragment_grid_overlay_pixel_topleft_index[
+                        IA_CSS_COL_DIMENSION]);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "max_fragment_grid_overlay_pixel_topleft_index: %d\n",
+        man_seq_info_desc->
+        max_fragment_grid_overlay_pixel_topleft_index[
+                        IA_CSS_COL_DIMENSION]);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "min_fragment_grid_overlay_pixel_topleft_index: %d\n",
+        man_seq_info_desc->
+        min_fragment_grid_overlay_pixel_topleft_index[
+                        IA_CSS_COL_DIMENSION]);
+
+    /* index row */
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "fragment_grid_overlay_pixel_topleft_index: %d\n",
+        term_seq_info_desc->
+        fragment_grid_overlay_pixel_topleft_index[
+                        IA_CSS_ROW_DIMENSION]);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "max_fragment_grid_overlay_pixel_topleft_index: %d\n",
+        man_seq_info_desc->
+        max_fragment_grid_overlay_pixel_topleft_index[
+                        IA_CSS_ROW_DIMENSION]);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "min_fragment_grid_overlay_pixel_topleft_index: %d\n",
+        man_seq_info_desc->
+        min_fragment_grid_overlay_pixel_topleft_index[
+                        IA_CSS_ROW_DIMENSION]);
+
+    /* dimension column */
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "fragment_grid_overlay_pixel_dimension: %d\n",
+        term_seq_info_desc->
+        fragment_grid_overlay_pixel_dimension[
+                        IA_CSS_COL_DIMENSION]);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "max_fragment_grid_overlay_pixel_dimension: %d\n",
+        man_seq_info_desc->
+        max_fragment_grid_overlay_pixel_dimension[
+                        IA_CSS_COL_DIMENSION]);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "min_fragment_grid_overlay_pixel_dimension: %d\n",
+        man_seq_info_desc->
+        min_fragment_grid_overlay_pixel_dimension[
+                        IA_CSS_COL_DIMENSION]);
+
+    /* dimension column */
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "fragment_grid_overlay_pixel_dimension: %d\n",
+        term_seq_info_desc->
+        fragment_grid_overlay_pixel_dimension[
+                        IA_CSS_ROW_DIMENSION]);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "max_fragment_grid_overlay_pixel_dimension: %d\n",
+        man_seq_info_desc->
+        max_fragment_grid_overlay_pixel_dimension[
+                        IA_CSS_ROW_DIMENSION]);
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+        "min_fragment_grid_overlay_pixel_dimension: %d\n",
+        man_seq_info_desc->
+        min_fragment_grid_overlay_pixel_dimension[
+                        IA_CSS_ROW_DIMENSION]);
+}
+
+STORAGE_CLASS_INLINE bool ia_css_is_program_terminal_valid(
+    const ia_css_terminal_t    *terminal,
+    const ia_css_terminal_manifest_t *terminal_manifest,
+    const uint16_t nof_fragments)
+{
+    DECLARE_ERRVAL
+    bool invalid_flag = false;
+    uint16_t frag_idx;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_is_program_terminal_valid enter\n");
+
+    for (frag_idx = 0; frag_idx < nof_fragments; frag_idx++) {
+        uint16_t frag_seq_info_count, seq_idx;
+        const ia_css_program_terminal_t *prog_term;
+        const ia_css_program_terminal_manifest_t *prog_term_man;
+
+        prog_term = (const ia_css_program_terminal_t *)terminal;
+        prog_term_man =
+            (const ia_css_program_terminal_manifest_t *)
+            terminal_manifest;
+        frag_seq_info_count =
+            prog_term_man->
+            kernel_fragment_sequencer_info_manifest_info_count;
+
+        for (seq_idx = 0; seq_idx < frag_seq_info_count; seq_idx++) {
+            const ia_css_kernel_fragment_sequencer_info_desc_t
+            *term_seq_info_desc;
+            const
+            ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
+            man_seq_info_desc;
+
+            term_seq_info_desc =
+        ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
+                    prog_term, frag_idx, seq_idx,
+                    frag_seq_info_count);
+            verifexitval(term_seq_info_desc != NULL, EFAULT);
+            man_seq_info_desc =
+        ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc
+                    (prog_term_man, seq_idx);
+            verifexitval(man_seq_info_desc != NULL, EFAULT);
+
+            ia_css_program_terminal_seq_info_print(
+                man_seq_info_desc, term_seq_info_desc);
+            /* slice dimension column */
+            invalid_flag = invalid_flag ||
+                (term_seq_info_desc->
+                fragment_grid_slice_dimension[
+                        IA_CSS_COL_DIMENSION] >
+                man_seq_info_desc->
+                max_fragment_grid_slice_dimension[
+                        IA_CSS_COL_DIMENSION]);
+            invalid_flag = invalid_flag ||
+                (term_seq_info_desc->
+                fragment_grid_slice_dimension[
+                        IA_CSS_COL_DIMENSION] <
+                man_seq_info_desc->
+                min_fragment_grid_slice_dimension[
+                        IA_CSS_COL_DIMENSION]);
+
+            /* slice dimension row */
+            invalid_flag = invalid_flag ||
+                (term_seq_info_desc->
+                fragment_grid_slice_dimension[
+                        IA_CSS_ROW_DIMENSION] >
+                man_seq_info_desc->
+                max_fragment_grid_slice_dimension[
+                        IA_CSS_ROW_DIMENSION]);
+            invalid_flag = invalid_flag ||
+                (term_seq_info_desc->
+                fragment_grid_slice_dimension[
+                        IA_CSS_ROW_DIMENSION] <
+                man_seq_info_desc->
+                min_fragment_grid_slice_dimension[
+                        IA_CSS_ROW_DIMENSION]);
+
+            /* slice count column */
+            invalid_flag = invalid_flag ||
+                (term_seq_info_desc->
+                fragment_grid_slice_count[
+                        IA_CSS_COL_DIMENSION] >
+                man_seq_info_desc->
+                max_fragment_grid_slice_count[
+                        IA_CSS_COL_DIMENSION]);
+            invalid_flag = invalid_flag ||
+                (term_seq_info_desc->
+                fragment_grid_slice_count[
+                        IA_CSS_COL_DIMENSION] <
+                man_seq_info_desc->
+                min_fragment_grid_slice_count[
+                        IA_CSS_COL_DIMENSION]);
+
+            /* slice count row */
+            invalid_flag = invalid_flag ||
+                (term_seq_info_desc->
+                fragment_grid_slice_count[
+                        IA_CSS_ROW_DIMENSION] >
+                man_seq_info_desc->
+                max_fragment_grid_slice_count[
+                        IA_CSS_ROW_DIMENSION]);
+            invalid_flag = invalid_flag ||
+                (term_seq_info_desc->
+                fragment_grid_slice_count[
+                        IA_CSS_ROW_DIMENSION] <
+                man_seq_info_desc->
+                min_fragment_grid_slice_count[
+                        IA_CSS_ROW_DIMENSION]);
+
+            /* decimation factor column */
+            invalid_flag = invalid_flag ||
+                (term_seq_info_desc->
+                fragment_grid_point_decimation_factor[
+                        IA_CSS_COL_DIMENSION] >
+                man_seq_info_desc->
+                max_fragment_grid_point_decimation_factor[
+                        IA_CSS_COL_DIMENSION]);
+            invalid_flag = invalid_flag ||
+                (term_seq_info_desc->
+                fragment_grid_point_decimation_factor[
+                        IA_CSS_COL_DIMENSION] <
+                man_seq_info_desc->
+                min_fragment_grid_point_decimation_factor[
+                        IA_CSS_COL_DIMENSION]);
+
+            /* decimation factor row */
+            invalid_flag = invalid_flag ||
+                (term_seq_info_desc->
+                fragment_grid_point_decimation_factor[
+                        IA_CSS_ROW_DIMENSION] >
+                man_seq_info_desc->
+                max_fragment_grid_point_decimation_factor[
+                        IA_CSS_ROW_DIMENSION]);
+            invalid_flag = invalid_flag ||
+                (term_seq_info_desc->
+                fragment_grid_point_decimation_factor[
+                        IA_CSS_ROW_DIMENSION] <
+                man_seq_info_desc->
+                min_fragment_grid_point_decimation_factor[
+                        IA_CSS_ROW_DIMENSION]);
+
+            /* index column */
+            invalid_flag = invalid_flag ||
+                (term_seq_info_desc->
+                fragment_grid_overlay_pixel_topleft_index[
+                        IA_CSS_COL_DIMENSION] >
+                man_seq_info_desc->
+                max_fragment_grid_overlay_pixel_topleft_index[
+                        IA_CSS_COL_DIMENSION]);
+            invalid_flag = invalid_flag ||
+                (term_seq_info_desc->
+                fragment_grid_overlay_pixel_topleft_index[
+                        IA_CSS_COL_DIMENSION] <
+                man_seq_info_desc->
+                min_fragment_grid_overlay_pixel_topleft_index[
+                        IA_CSS_COL_DIMENSION]);
+
+            /* index row */
+            invalid_flag = invalid_flag ||
+                (term_seq_info_desc->
+                fragment_grid_overlay_pixel_topleft_index[
+                        IA_CSS_ROW_DIMENSION] >
+                man_seq_info_desc->
+                max_fragment_grid_overlay_pixel_topleft_index[
+                        IA_CSS_ROW_DIMENSION]);
+            invalid_flag = invalid_flag ||
+                (term_seq_info_desc->
+                fragment_grid_overlay_pixel_topleft_index[
+                        IA_CSS_ROW_DIMENSION] <
+                man_seq_info_desc->
+                min_fragment_grid_overlay_pixel_topleft_index[
+                        IA_CSS_ROW_DIMENSION]);
+
+            /* dimension column */
+            invalid_flag = invalid_flag ||
+                (term_seq_info_desc->
+                fragment_grid_overlay_pixel_dimension[
+                        IA_CSS_COL_DIMENSION] >
+                man_seq_info_desc->
+                max_fragment_grid_overlay_pixel_dimension[
+                        IA_CSS_COL_DIMENSION]);
+            invalid_flag = invalid_flag ||
+                (term_seq_info_desc->
+                fragment_grid_overlay_pixel_dimension[
+                        IA_CSS_COL_DIMENSION] <
+                man_seq_info_desc->
+                min_fragment_grid_overlay_pixel_dimension[
+                        IA_CSS_COL_DIMENSION]);
+
+            /* dimension column */
+            invalid_flag = invalid_flag ||
+                (term_seq_info_desc->
+                fragment_grid_overlay_pixel_dimension[
+                        IA_CSS_ROW_DIMENSION] >
+                man_seq_info_desc->
+                max_fragment_grid_overlay_pixel_dimension[
+                        IA_CSS_ROW_DIMENSION]);
+            invalid_flag = invalid_flag ||
+                (term_seq_info_desc->
+                fragment_grid_overlay_pixel_dimension[
+                        IA_CSS_ROW_DIMENSION] <
+                man_seq_info_desc->
+                min_fragment_grid_overlay_pixel_dimension[
+                        IA_CSS_ROW_DIMENSION]);
+        }
+    }
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_is_program_terminal_valid() invalid argument\n");
+        return false;
+    }
+    if (invalid_flag == true) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_is_program_terminal_valid(): validation failed\n");
+        /* TODO: program terminal parameters not correctly defined,
+         * disable validation result until issues has been solved
+         */
+        return true;
+    }
+    return (!invalid_flag);
+}
+
+STORAGE_CLASS_INLINE bool ia_css_is_sliced_terminal_valid(
+    const ia_css_terminal_t *terminal,
+    const ia_css_terminal_manifest_t *terminal_manifest,
+    const uint16_t nof_fragments)
+{
+    DECLARE_ERRVAL
+    bool invalid_flag = false;
+    uint16_t frag_idx;
+
+    uint16_t slice_idx, section_idx;
+
+    const ia_css_sliced_param_terminal_t *sliced_term =
+        (const ia_css_sliced_param_terminal_t *)terminal;
+    verifexitval(sliced_term != NULL, EFAULT);
+    const ia_css_sliced_param_terminal_manifest_t *sliced_term_man =
+        (const ia_css_sliced_param_terminal_manifest_t *)
+        terminal_manifest;
+    verifexitval(sliced_term_man != NULL, EFAULT);
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_is_sliced_terminal_valid enter\n");
+
+    for (frag_idx = 0; frag_idx < nof_fragments; frag_idx++) {
+        const ia_css_fragment_slice_desc_t *fragment_slice_desc =
+            ia_css_sliced_param_terminal_get_fragment_slice_desc(
+                sliced_term, frag_idx);
+
+        verifexitval(fragment_slice_desc != NULL, EFAULT);
+
+        for (slice_idx = 0;
+            slice_idx < fragment_slice_desc->slice_count;
+            slice_idx++) {
+            for (section_idx = 0;
+                section_idx <
+                sliced_term_man->sliced_param_section_count;
+                section_idx++) {
+                const
+                ia_css_sliced_param_manifest_section_desc_t *
+                    slice_man_section_desc;
+                const ia_css_slice_param_section_desc_t *
+                    slice_section_desc;
+
+                slice_man_section_desc =
+        ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
+                        sliced_term_man, section_idx);
+                slice_section_desc =
+        ia_css_sliced_param_terminal_get_slice_param_section_desc(
+                        sliced_term, frag_idx,
+                        slice_idx, section_idx,
+                        sliced_term_man->
+                        sliced_param_section_count);
+                verifexitval(slice_man_section_desc != NULL, EFAULT);
+                verifexitval(slice_section_desc != NULL, EFAULT);
+
+                invalid_flag = invalid_flag ||
+                    (slice_section_desc->mem_size >
+                    slice_man_section_desc->max_mem_size);
+            }
+        }
+    }
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+                "ia_css_is_sliced_terminal_valid() invalid argument\n");
+        return false;
+    } else {
+        return (!invalid_flag);
+    }
+
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_valid(
+    const ia_css_terminal_t    *terminal,
+    const ia_css_terminal_manifest_t *terminal_manifest)
+{
+    DECLARE_ERRVAL
+    bool is_valid = false;
+    uint16_t nof_fragments;
+    ia_css_terminal_type_t terminal_type = IA_CSS_TERMINAL_INVALID_ID;
+
+    verifexitval(NULL != terminal, EFAULT);
+    verifexitval(NULL != terminal_manifest, EFAULT);
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_is_terminal_valid enter\n");
+
+    nof_fragments = ia_css_data_terminal_get_fragment_count(
+                (const ia_css_data_terminal_t *)terminal);
+    terminal_type = ia_css_terminal_get_type(terminal);
+
+    switch (terminal_type) {
+    case IA_CSS_TERMINAL_TYPE_DATA_IN:
+    case IA_CSS_TERMINAL_TYPE_DATA_OUT:
+        is_valid = ia_css_is_data_terminal_valid(terminal,
+                terminal_manifest, nof_fragments);
+        break;
+    case IA_CSS_TERMINAL_TYPE_PROGRAM:
+        is_valid = ia_css_is_program_terminal_valid(terminal,
+                terminal_manifest, nof_fragments);
+        break;
+    case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
+    case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
+    case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
+    case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
+    case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
+        /* Nothing to be validated for cached and spatial
+        *  parameters, return valid
+        */
+        is_valid = true;
+        break;
+    case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
+    case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
+        is_valid = ia_css_is_sliced_terminal_valid(terminal,
+                terminal_manifest, nof_fragments);
+        break;
+    default:
+        /* Terminal type unknown, return invalid */
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_is_terminal_valid() Terminal type %x unknown\n",
+            (int)terminal_type);
+        is_valid = false;
+        break;
+    }
+
+EXIT:
+    if (haserror(EFAULT)) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_is_terminal_valid() invalid argument\n");
+        return false;
+    }
+    /* TODO: to be removed once all PGs pass validation */
+    if (is_valid == false) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+            "ia_css_is_terminal_valid(): type: %d validation failed\n",
+            terminal_type);
+    }
+    return is_valid;
+}
+
+/* ================= Program Control Init Terminal - START ================= */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int
+ia_css_program_control_init_terminal_init(
+    ia_css_program_control_init_terminal_t *terminal,
+    const ia_css_program_control_init_terminal_manifest_t *manifest,
+    const ia_css_program_group_manifest_t *pg_manifest,
+    ia_css_kernel_bitmap_t kernel_bitmap)
+{
+    int retval = -1;
+    unsigned int i;
+    unsigned int base_load_sec;
+    unsigned int base_connect_sec;
+    unsigned int load_index = 0;
+    unsigned int connect_index = 0;
+    unsigned int load_section_count = 0;
+    unsigned int connect_section_count = 0;
+
+    ia_css_program_control_init_manifest_program_desc_t *man_progs;
+    ia_css_program_manifest_t *prog_manifest;
+
+    verifjmpexit(terminal != NULL);
+
+    man_progs =
+    ia_css_program_control_init_terminal_manifest_get_program_desc(manifest, 0);
+    verifjmpexit(man_progs != NULL);
+
+    for (i = 0; i < manifest->program_count; i++) {
+        prog_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest, i);
+        verifjmpexit(prog_manifest != NULL);
+        if (!ia_css_process_group_is_program_enabled(prog_manifest, kernel_bitmap)) {
+            continue;
+        }
+        load_section_count += man_progs[i].load_section_count;
+        connect_section_count += man_progs[i].connect_section_count;
+    }
+
+    terminal->program_count = manifest->program_count;
+    terminal->program_section_desc_offset =
+        sizeof(ia_css_program_control_init_terminal_t);
+
+    base_load_sec = /* base_load_sec relative to first program */
+        terminal->program_count *
+        sizeof(ia_css_program_control_init_program_desc_t);
+
+    base_connect_sec = base_load_sec +
+        load_section_count *
+        sizeof(ia_css_program_control_init_load_section_desc_t);
+
+    for (i = 0; i < terminal->program_count; i++) {
+        ia_css_program_control_init_program_desc_t *prog;
+
+        prog = ia_css_program_control_init_terminal_get_program_desc(
+                terminal, i);
+        verifjmpexit(prog != NULL);
+
+        prog_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest, i);
+        verifjmpexit(prog_manifest != NULL);
+        if (!ia_css_process_group_is_program_enabled(prog_manifest, kernel_bitmap)) {
+            prog->load_section_count = 0;
+            prog->connect_section_count = 0;
+            prog->load_section_desc_offset = 0;
+            prog->connect_section_desc_offset  = 0;
+            continue;
+        }
+
+        prog->load_section_count = man_progs[i].load_section_count;
+        prog->connect_section_count = man_progs[i].connect_section_count;
+
+        prog->load_section_desc_offset =
+            base_load_sec +
+            load_index *
+            sizeof(ia_css_program_control_init_load_section_desc_t) -
+            i * sizeof(ia_css_program_control_init_program_desc_t);
+        prog->connect_section_desc_offset =
+            base_connect_sec +
+            connect_index *
+            sizeof(ia_css_program_control_init_connect_section_desc_t) -
+            i * sizeof(ia_css_program_control_init_program_desc_t);
+
+        load_index += man_progs[i].load_section_count;
+        connect_index += man_progs[i].connect_section_count;
+    }
+    retval = 0;
+EXIT:
+    return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+unsigned int
+ia_css_program_control_init_terminal_get_descriptor_size(
+        const ia_css_program_control_init_terminal_manifest_t *manifest,
+        const ia_css_program_group_manifest_t *pg_manifest,
+        ia_css_kernel_bitmap_t kernel_bitmap)
+{
+    unsigned int i;
+    unsigned size = 0;
+    unsigned load_section_count = 0;
+    unsigned connect_section_count = 0;
+    ia_css_program_control_init_manifest_program_desc_t *man_progs;
+    ia_css_program_manifest_t *prog_manifest;
+    verifjmpexit(manifest != NULL);
+
+    man_progs =
+        ia_css_program_control_init_terminal_manifest_get_program_desc(
+            manifest, 0);
+    verifjmpexit(man_progs != NULL);
+
+    for (i = 0; i < manifest->program_count; i++) {
+        prog_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest, i);
+        verifjmpexit(prog_manifest != NULL);
+        if (!ia_css_process_group_is_program_enabled(prog_manifest, kernel_bitmap)) {
+            continue;
+        }
+        load_section_count += man_progs[i].load_section_count;
+        connect_section_count += man_progs[i].connect_section_count;
+    }
+
+    size = sizeof(ia_css_program_control_init_terminal_t) +
+        manifest->program_count *
+        sizeof(struct ia_css_program_control_init_program_desc_s) +
+        load_section_count *
+        sizeof(struct ia_css_program_control_init_load_section_desc_s) +
+        connect_section_count  *
+        sizeof(struct ia_css_program_control_init_connect_section_desc_s);
+EXIT:
+    return size;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+void ia_css_program_control_init_terminal_print(
+    const ia_css_program_control_init_terminal_t *terminal)
+{
+    unsigned int prog_idx, sec_idx;
+    ia_css_program_control_init_program_desc_t *prog;
+    ia_css_program_control_init_load_section_desc_t *load_sec;
+    ia_css_program_control_init_connect_section_desc_t *connect_sec;
+    unsigned mem_offset;
+    verifjmpexit(terminal != NULL);
+
+    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
+        "program_count: %d, payload_fragment_stride: %d\n",
+        terminal->program_count,
+        terminal->payload_fragment_stride);
+
+    for (prog_idx = 0; prog_idx < terminal->program_count; prog_idx++) {
+        prog = ia_css_program_control_init_terminal_get_program_desc(
+            terminal, prog_idx);
+        verifjmpexit(prog != NULL);
+        mem_offset = ia_css_program_control_init_terminal_get_load_section_mem_offset(prog);
+
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO, "program_idx: %d\n", prog_idx);
+        IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO, "\tprocess_id: %d, num_done_events: %d\n",
+            prog->control_info.process_id,
+            prog->control_info.num_done_events);
+
+        if (prog->load_section_count > 0) {
+            IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO, "\tload_sections:\n");
+        }
+        for (sec_idx = 0; sec_idx < prog->load_section_count; sec_idx++) {
+            load_sec =
+                ia_css_program_control_init_terminal_get_load_section_desc(
+                    prog, sec_idx);
+            verifjmpexit(load_sec != NULL);
+            IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
+                "\t\tdevice_descriptor_id: 0x%08x, mem_offset: %d, "
+                "mem_size: %d, mode_bitmask: %x\n",
+                load_sec->device_descriptor_id.data,
+                mem_offset,
+                load_sec->mem_size,
+                load_sec->mode_bitmask);
+            mem_offset += load_sec->mem_size;
+        }
+        if (prog->connect_section_count > 0) {
+            IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO, "\tconnect_sections:\n");
+        }
+        for (sec_idx = 0; sec_idx < prog->connect_section_count; sec_idx++) {
+            connect_sec =
+                ia_css_program_control_init_terminal_get_connect_section_desc(
+                    prog, sec_idx);
+            verifjmpexit(connect_sec != NULL);
+            IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
+                "\t\tdevice_descriptor_id: 0x%08x, "
+                "connect_terminal_ID: %d, connect_section_idx: %d, "
+                "mode_bitmask: %x\n",
+                connect_sec->device_descriptor_id.data,
+                connect_sec->connect_terminal_ID,
+                connect_sec->connect_section_idx,
+                connect_sec->mode_bitmask);
+        }
+    }
+EXIT:
+    return;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_program_control_init_program_desc_t *
+ia_css_program_control_init_terminal_get_program_desc(
+    const ia_css_program_control_init_terminal_t *prog_ctrl_init_terminal,
+    const unsigned int program_index)
+{
+    ia_css_program_control_init_program_desc_t *program_desc_base;
+    ia_css_program_control_init_program_desc_t *program_desc = NULL;
+
+    verifjmpexit(prog_ctrl_init_terminal != NULL);
+    verifjmpexit(program_index < prog_ctrl_init_terminal->program_count);
+
+    program_desc_base = (ia_css_program_control_init_program_desc_t *)
+        (((const char *)prog_ctrl_init_terminal) +
+         prog_ctrl_init_terminal->program_section_desc_offset);
+    program_desc = &(program_desc_base[program_index]);
+
+EXIT:
+    return program_desc;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_process_id_t ia_css_program_control_init_terminal_get_process_id(
+    const ia_css_program_control_init_program_desc_t *program_desc)
+{
+    ia_css_process_id_t process_id = 0;
+
+    verifjmpexit(program_desc != NULL);
+
+    process_id = program_desc->control_info.process_id;
+
+EXIT:
+    return process_id;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_program_control_init_terminal_get_num_done_events(
+    const ia_css_program_control_init_program_desc_t *program_desc)
+{
+    uint8_t num_done_events = 0;
+
+    verifjmpexit(program_desc != NULL);
+
+    num_done_events = program_desc->control_info.num_done_events;
+
+EXIT:
+    return num_done_events;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+void ia_css_program_control_init_terminal_set_control_info(
+    ia_css_program_control_init_program_desc_t *program_desc,
+    ia_css_process_id_t process_id,
+    uint8_t num_done_events)
+{
+    verifjmpexit(program_desc != NULL);
+
+    program_desc->control_info.process_id = process_id;
+    program_desc->control_info.num_done_events = num_done_events;
+
+EXIT:
+    return;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+unsigned int ia_css_program_control_init_terminal_get_connect_section_count(
+    const ia_css_program_control_init_program_desc_t *program_desc)
+{
+    assert(program_desc != NULL);
+    return program_desc->connect_section_count;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+unsigned int ia_css_program_control_init_terminal_get_load_section_count(
+    const ia_css_program_control_init_program_desc_t *program_desc)
+{
+    assert(program_desc != NULL);
+    return program_desc->load_section_count;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+unsigned int ia_css_program_control_init_terminal_get_load_section_mem_offset(
+    const ia_css_program_control_init_program_desc_t *program_desc)
+{
+    assert(program_desc != NULL);
+    return program_desc->load_section_mem_offset;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_program_control_init_load_section_desc_t *
+ia_css_program_control_init_terminal_get_load_section_desc(
+    const ia_css_program_control_init_program_desc_t *program_desc,
+    const unsigned int load_section_index)
+{
+    ia_css_program_control_init_load_section_desc_t *load_section_desc_base;
+    ia_css_program_control_init_load_section_desc_t *load_section_desc = NULL;
+
+    verifjmpexit(program_desc != NULL);
+    verifjmpexit(load_section_index < program_desc->load_section_count);
+
+    load_section_desc_base = (ia_css_program_control_init_load_section_desc_t *)
+        (((const char *)program_desc) +
+         program_desc->load_section_desc_offset);
+    load_section_desc = &(load_section_desc_base[load_section_index]);
+
+EXIT:
+    return load_section_desc;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_program_control_init_connect_section_desc_t *
+ia_css_program_control_init_terminal_get_connect_section_desc(
+    const ia_css_program_control_init_program_desc_t *program_desc,
+    const unsigned int connect_section_index)
+{
+    ia_css_program_control_init_connect_section_desc_t *connect_sec_desc_base;
+    ia_css_program_control_init_connect_section_desc_t *connect_sec_desc = NULL;
+
+    verifjmpexit(program_desc != NULL);
+    verifjmpexit(connect_section_index < program_desc->connect_section_count);
+
+    connect_sec_desc_base =
+        (ia_css_program_control_init_connect_section_desc_t *)
+        (((const char *)program_desc) +
+         program_desc->connect_section_desc_offset);
+    connect_sec_desc = &(connect_sec_desc_base[connect_section_index]);
+
+EXIT:
+    return connect_sec_desc;
+}
+
+/* ================= Program Control Init Terminal - END ================= */
+
+#endif /* __IA_CSS_PSYS_TERMINAL_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.h
new file mode 100644
index 000000000000..3255e10f9f7e
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.h
@@ -0,0 +1,621 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_H
+#define __IA_CSS_PSYS_TERMINAL_MANIFEST_H
+
+/*! \file */
+
+/** @file ia_css_psys_terminal_manifest.h
+ *
+ * Define the methods on the terminal manifest object that are not part of a
+ * single interface
+ */
+
+#include <ia_css_psys_manifest_types.h>
+
+#include <ia_css_psys_terminal_manifest.sim.h>
+
+#include <ia_css_psys_terminal_manifest.hsys.user.h>
+
+#include <ia_css_program_group_data.h>    /* ia_css_frame_format_bitmap_t */
+#include <ia_css_kernel_bitmap.h>    /* ia_css_kernel_bitmap_t */
+
+#include <type_support.h>        /* size_t */
+#include "ia_css_terminal_manifest.h"
+#include "ia_css_terminal_manifest_base_types.h"
+#include "ia_css_psys_static_storage_class.h"
+
+/*!
+ * @addtogroup group_psysapi
+ * @{
+ */
+
+/*! Check if the terminal manifest object specifies a spatial param terminal
+ * type
+
+ @param [in]    manifest            terminal manifest object
+
+ @return is_parameter_terminal, false on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_manifest_spatial_parameter_terminal(
+    const ia_css_terminal_manifest_t        *manifest);
+
+/*! Check if the terminal manifest object specifies a program terminal type
+
+ @param [in]    manifest            terminal manifest object
+
+ @return is_parameter_terminal, false on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_manifest_program_terminal(
+    const ia_css_terminal_manifest_t        *manifest);
+
+/*! Check if the terminal manifest object specifies a program control init terminal type
+ *
+ * @param [in]    manifest            terminal manifest object
+ *
+ * @return is_parameter_terminal, false on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_manifest_program_control_init_terminal(
+    const ia_css_terminal_manifest_t        *manifest);
+
+/*! Check if the terminal manifest object specifies a (cached) parameter
+ * terminal type
+
+ @param [in]    manifest            terminal manifest object
+
+ @return is_parameter_terminal, false on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_manifest_parameter_terminal(
+    const ia_css_terminal_manifest_t        *manifest);
+
+/*! Check if the terminal manifest object specifies a (sliced) parameter
+ * terminal type
+
+ @param [in]    manifest            terminal manifest object
+
+ @return is_parameter_terminal, false on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_manifest_sliced_terminal(
+    const ia_css_terminal_manifest_t        *manifest);
+
+/*! Check if the terminal manifest object specifies a data terminal type
+
+ @param [in]    manifest            terminal manifest object
+
+ @return is_data_terminal, false on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_manifest_data_terminal(
+    const ia_css_terminal_manifest_t        *manifest);
+
+/*! Get the broad terminal category
+
+ @param    manifest[in]            terminal manifest object
+
+ @return Terminal category enum
+
+  @note New for IPU7 POC
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_cat_t ia_css_terminal_manifest_get_category(
+    const ia_css_terminal_manifest_t        *manifest);
+
+/*! Set the broad terminal category
+
+ @param    manifest[in]            terminal manifest object
+ @param    category[in]            terminal category
+
+ @return < 0 on invalid arguments
+
+  @note New for IPU7 POC
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_category(
+    ia_css_terminal_manifest_t        *manifest,
+    ia_css_terminal_cat_t category);
+
+/*! Get the direction of data flow for the terminal payload
+
+ @param    manifest[in]            terminal manifest object
+
+ @return Terminal direction enum
+
+  @note New for IPU7 POC
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_dir_t ia_css_terminal_manifest_get_direction(
+    const ia_css_terminal_manifest_t        *manifest);
+
+/*! Set the direction of data flow for the terminal payload
+
+ @param    manifest[in]            terminal manifest object
+ @param    direction[in]            terminal direction
+
+ @return < 0 on invalid arguments
+
+  @note New for IPU7 POC
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_direction(
+    ia_css_terminal_manifest_t        *manifest,
+    ia_css_terminal_dir_t direction);
+
+/*! Get the Rate Of Update (ROU) for the terminal payload
+
+ @param    manifest[in]            terminal manifest object
+
+ @return Terminal rate-of-update enum
+
+  @note New for IPU7 POC
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_rou_t ia_css_terminal_manifest_get_rate_of_update(
+    const ia_css_terminal_manifest_t        *manifest);
+
+/*! Set the Rate Of Update (ROU) for the terminal payload
+
+ @param    manifest[in]            terminal manifest object
+ @param    rate_of_update[in]        terminal rate of update
+
+ @return < 0 on invalid arguments
+
+  @note New for IPU7 POC
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_rate_of_update(
+    ia_css_terminal_manifest_t        *manifest,
+    ia_css_terminal_rou_t rate_of_update);
+
+/*! Get the buffer type for the connect terminal pointer
+
+ This function is intended for connect terminals only.  If called
+ on a load terminal, it will return IA_CSS_CONNECT_BUF_TYPE_UNKNOWN
+
+ @param    manifest[in]            terminal manifest object
+
+ @return Connect terminal buffer type enum
+
+  @note New for IPU7 POC
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_connect_buf_type_t ia_css_terminal_manifest_get_connect_buffer_type(
+    const ia_css_terminal_manifest_t        *manifest);
+
+/*! Set the buffer type for the connect terminal pointer
+
+  Load terminals must be set only to IA_CSS_CONNECT_BUF_TYPE_UNKNOWN
+
+ @param    manifest[in]            terminal manifest object
+
+ @return < 0 on invalid arguments
+
+  @note New for IPU7 POC
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_connect_buffer_type(
+    ia_css_terminal_manifest_t        *manifest,
+    ia_css_connect_buf_type_t connect_buf_type);
+
+/*! Get the stored size of the terminal manifest object
+
+ @param [in]    manifest            terminal manifest object
+
+ @return size, 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+size_t ia_css_terminal_manifest_get_size(
+    const ia_css_terminal_manifest_t        *manifest);
+
+/*! Get the (pointer to) the program group manifest parent of the terminal
+ * manifest object
+
+ @param [in]    manifest            terminal manifest object
+
+ @return the pointer to the parent, NULL on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_program_group_manifest_t *ia_css_terminal_manifest_get_parent(
+    const ia_css_terminal_manifest_t        *manifest);
+
+/*! Set the (pointer to) the program group manifest parent of the terminal
+ * manifest object
+
+ @param [in]    manifest            terminal manifest object
+ @param    [in]    terminal_offset        this terminal's offset from
+                    program_group_manifest base address.
+
+ @return < 0 on invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_parent_offset(
+    ia_css_terminal_manifest_t            *manifest,
+    int32_t                        terminal_offset);
+
+/*! Get the type of the terminal manifest object
+
+ @param [in]    manifest            terminal manifest object
+
+ @return terminal type, limit value (IA_CSS_N_TERMINAL_TYPES) on invalid
+    manifest argument
+*/
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_type_t ia_css_terminal_manifest_get_type(
+    const ia_css_terminal_manifest_t        *manifest);
+
+/*! Set the type of the terminal manifest object
+
+ @param [in]    manifest            terminal manifest object
+ @param    [in]    terminal_type        terminal type
+
+ @return < 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_type(
+    ia_css_terminal_manifest_t            *manifest,
+    const ia_css_terminal_type_t            terminal_type);
+
+/*! Set the ID of the terminal manifest object
+
+ @param [in]    manifest            terminal manifest object
+ @param    [in]    ID                terminal ID
+
+ @return < 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_ID(
+    ia_css_terminal_manifest_t            *manifest,
+    const ia_css_terminal_ID_t            ID);
+
+/*! Get the type of the terminal manifest object
+
+ @param [in]    manifest            terminal manifest object
+
+ @return  terminal id, IA_CSS_TERMINAL_INVALID_ID on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_ID_t ia_css_terminal_manifest_get_ID(
+    const ia_css_terminal_manifest_t        *manifest);
+
+/*! Get the ID of the associated connection terminal
+
+  Only valid for load terminals.
+
+  @param    manifest[in]            terminal manifest object
+
+  @return  terminal id, IA_CSS_TERMINAL_INVALID_ID on invalid manifest argument
+  OR if there is no associated connect terminal
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_ID_t ia_css_terminal_manifest_get_connect_ID(
+    const ia_css_terminal_manifest_t        *manifest);
+
+/*! Set the ID of the associated connection terminal
+
+  Only valid for load terminals.
+
+  @param    manifest[in]            terminal manifest object
+  @param    ID[in]                terminal ID
+
+  @return < 0 on invalid manifest argument (including when
+  manifest describes a connect terminal, unless ID is
+  IA_CSS_TERMINAL_INVALID_ID)
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_connect_ID(
+    ia_css_terminal_manifest_t            *manifest,
+    const ia_css_terminal_ID_t            ID);
+
+/*! Returns the maximum payload size for an instance of the terminal
+   described in a manifest entry.
+
+   The payload size is the sum of the sizes of all
+   parameter sections for load terminals, or the maximum buffer size
+   for connect terminals.
+
+   @param manifest[in] Terminal manifest handle
+
+   @return Maximum size in bytes of the terminal payload
+ */
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_terminal_manifest_get_max_payload_size(
+    const ia_css_terminal_manifest_t *manifest);
+
+/*! Returns the maximum payload size for an instance of the terminal
+   described in a manifest entry.
+
+   The payload size is the sum of the sizes of all
+   parameter sections for load terminals, or the maximum buffer size
+   for connect terminals.
+
+   @param manifest[in] Terminal manifest handle
+   @param max_payload_size[in] Maximum payload size
+
+  @return < 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_max_payload_size(
+    ia_css_terminal_manifest_t            *manifest,
+    uint32_t                             max_payload_size);
+
+/*! Get the supported frame types of the (data) terminal manifest object
+
+ @param [in]    manifest            (data) terminal manifest object
+
+ @return frame format bitmap, 0 on invalid manifest argument
+*/
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_frame_format_bitmap_t
+    ia_css_data_terminal_manifest_get_frame_format_bitmap(
+        const ia_css_data_terminal_manifest_t        *manifest);
+
+/*! Set the chosen frame type for the (data) terminal manifest object
+
+ @param [in]    manifest            (data) terminal manifest object
+ @param    [in]    bitmap            frame format bitmap
+
+ @return < 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_data_terminal_manifest_set_frame_format_bitmap(
+    ia_css_data_terminal_manifest_t            *manifest,
+    ia_css_frame_format_bitmap_t            bitmap);
+
+/*! Check if the (data) terminal manifest object supports compression
+
+ @param [in]    manifest            (data) terminal manifest object
+
+ @return compression_support, true if compression is supported
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+bool ia_css_data_terminal_manifest_can_support_compression(
+    const ia_css_data_terminal_manifest_t        *manifest);
+
+/*! Set the compression support feature of the (data) terminal manifest object
+
+ @param [in]    manifest            (data) terminal manifest object
+ @param    [in]    compression_support        set true to support compression
+
+ @return < 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_data_terminal_manifest_set_compression_support(
+    ia_css_data_terminal_manifest_t            *manifest,
+    bool                        compression_support);
+
+/*! Set the supported connection types of the terminal manifest object
+
+ @param [in]    manifest            (data) terminal manifest object
+ @param    [in]    bitmap            connection bitmap
+
+ @return < 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_data_terminal_manifest_set_connection_bitmap(
+    ia_css_data_terminal_manifest_t *manifest, ia_css_connection_bitmap_t bitmap);
+
+/*! Get the connection bitmap of the (data) terminal manifest object
+
+ @param [in]    manifest            (data) terminal manifest object
+
+ @return connection bitmap, 0 on invalid manifest argument
+*/
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_connection_bitmap_t ia_css_data_terminal_manifest_get_connection_bitmap(
+        const ia_css_data_terminal_manifest_t        *manifest);
+
+/*! Get the kernel dependency of the (data) terminal manifest object
+
+ @param [in]    manifest            (data) terminal manifest object
+
+ @return kernel bitmap, 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_data_terminal_manifest_get_kernel_bitmap(
+    const ia_css_data_terminal_manifest_t        *manifest);
+
+/*! Set the kernel dependency of the (data) terminal manifest object
+
+ @param [in]    manifest            (data) terminal manifest object
+ @param    [in]    kernel_bitmap        kernel dependency bitmap
+
+ @return < 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_data_terminal_manifest_set_kernel_bitmap(
+    ia_css_data_terminal_manifest_t            *manifest,
+    const ia_css_kernel_bitmap_t            kernel_bitmap);
+
+/*! Set the unique kernel dependency of the (data) terminal manifest object
+
+ @param [in]    manifest            (data) terminal manifest object
+ @param    [in]    index            kernel dependency bitmap index
+
+ @return < 0 on invalid argument(s)
+ */
+extern int ia_css_data_terminal_manifest_set_kernel_bitmap_unique(
+    ia_css_data_terminal_manifest_t            *manifest,
+    const unsigned int                index);
+
+/*! Set the min size of the (data) terminal manifest object
+
+ @param [in]    manifest            (data) terminal manifest object
+ @param    [in]    min_size            Minimum size of the frame array
+
+ @return < 0 on invalid manifest argument
+ */
+extern int ia_css_data_terminal_manifest_set_min_size(
+    ia_css_data_terminal_manifest_t *manifest,
+    const uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
+
+/*! Set the max size of the (data) terminal manifest object
+
+ @param [in]    manifest            (data) terminal manifest object
+ @param    [in]    max_size            Maximum size of the frame array
+
+  @return < 0 on invalid manifest argument
+  */
+extern int ia_css_data_terminal_manifest_set_max_size(
+    ia_css_data_terminal_manifest_t *manifest,
+    const uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
+
+/*! Get the min size of the (data) terminal manifest object
+
+ @param [in]    manifest            (data) terminal manifest object
+ @param    [in]    min_size            Minimum size of the frame array
+
+ @return < 0 on invalid manifest argument
+ */
+extern int ia_css_data_terminal_manifest_get_min_size(
+    const ia_css_data_terminal_manifest_t *manifest,
+    uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
+
+/*! Get the max size of the (data) terminal manifest object
+
+ @param [in]    manifest            (data) terminal manifest object
+ @param    [in]    max_size            Maximum size of the frame array
+
+ @return < 0 on invalid manifest argument
+ */
+extern int ia_css_data_terminal_manifest_get_max_size(
+    const ia_css_data_terminal_manifest_t *manifest,
+    uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
+
+/*! Set the min fragment size of the (data) terminal manifest object
+
+ @param [in]    manifest            (data) terminal manifest object
+ @param    [in]    min_size            Minimum size of the fragment array
+
+ @return < 0 on invalid manifest argument
+ */
+extern int ia_css_data_terminal_manifest_set_min_fragment_size(
+    ia_css_data_terminal_manifest_t *manifest,
+    const uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
+
+/*! Set the max fragment size of the (data) terminal manifest object
+
+ @param [in]    manifest            (data) terminal manifest object
+ @param    [in]    max_size            Maximum size of the fragment array
+
+  @return < 0 on invalid manifest argument
+  */
+extern int ia_css_data_terminal_manifest_set_max_fragment_size(
+    ia_css_data_terminal_manifest_t *manifest,
+    const uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
+
+/*! Get the min fragment size of the (data) terminal manifest object
+
+ @param [in]    manifest            (data) terminal manifest object
+ @param    [in]    min_size            Minimum size of the fragment array
+
+ @return < 0 on invalid manifest argument
+ */
+extern int ia_css_data_terminal_manifest_get_min_fragment_size(
+    const ia_css_data_terminal_manifest_t *manifest,
+    uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
+
+/*! Get the max fragment size of the (data) terminal manifest object
+
+ @param [in]    manifest            (data) terminal manifest object
+ @param    [in]    max_size            Maximum size of the fragment array
+
+ @return < 0 on invalid manifest argument
+ */
+extern int ia_css_data_terminal_manifest_get_max_fragment_size(
+    const ia_css_data_terminal_manifest_t *manifest,
+    uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
+
+/*!
+ * Get the program control init connect section count for program prog.
+ * @param [in] prog program control init terminal program desc
+ * @return number of connect section for program prog.
+ */
+
+extern
+unsigned int ia_css_program_control_init_terminal_manifest_get_connect_section_count(
+    const ia_css_program_control_init_manifest_program_desc_t *prog);
+
+/*!
+ * Get the program control init load section count for program prog.
+ * @param [in] prog program control init terminal program desc
+ * @return number of load section for program prog.
+ */
+
+extern
+unsigned int ia_css_program_control_init_terminal_manifest_get_load_section_count(
+    const ia_css_program_control_init_manifest_program_desc_t *prog);
+
+/*!
+ * Get the program control init terminal manifest size.
+ * @param [in] nof_programs        Number of programs.
+ * @param [in] nof_load_sections        Array of size nof_programs,
+ *                    encoding the number of load sections.
+ * @param [in] nof_connect_sections    Array of size nof_programs,
+ *                    encoding the number of connect sections.
+ * @return < 0 on invalid manifest argument
+ */
+extern
+unsigned int ia_css_program_control_init_terminal_manifest_get_size(
+    const uint16_t nof_programs,
+    const uint16_t *nof_load_sections,
+    const uint16_t *nof_connect_sections);
+
+/*!
+ * Get the program control init terminal manifest program desc.
+ * @param [in] terminal        Program control init terminal.
+ * @param [in] program        Number of programs.
+ * @return program control init terminal program desc (or NULL if error).
+ */
+extern
+ia_css_program_control_init_manifest_program_desc_t *
+ia_css_program_control_init_terminal_manifest_get_program_desc(
+    const ia_css_program_control_init_terminal_manifest_t *terminal,
+    unsigned int program);
+
+/*!
+ * Initialize the program control init terminal manifest.
+ * @param [in] nof_programs        Number of programs
+ * @param [in] nof_load_sections        Array of size nof_programs,
+ *                    encoding the number of load sections.
+ * @param [in] nof_connect_sections    Array of size nof_programs,
+ *                    encoding the number of connect sections.
+ * @return < 0 on invalid manifest argument
+ */
+extern
+int ia_css_program_control_init_terminal_manifest_init(
+    ia_css_program_control_init_terminal_manifest_t *terminal,
+    const uint16_t nof_programs,
+    const uint16_t *nof_load_sections,
+    const uint16_t *nof_connect_sections);
+
+/*!
+ * Pretty prints the program control init terminal manifest.
+ * @param [in] terminal        Program control init terminal.
+ */
+extern
+void ia_css_program_control_init_terminal_manifest_print(
+    ia_css_program_control_init_terminal_manifest_t *terminal);
+
+#ifdef __IA_CSS_PSYS_STATIC_INLINE__
+#include "ia_css_psys_terminal_manifest_impl.h"
+#endif
+
+#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.hsys.user.h
new file mode 100644
index 000000000000..1a7b7995a848
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.hsys.user.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_HSYS_USER_H
+#define __IA_CSS_PSYS_TERMINAL_MANIFEST_HSYS_USER_H
+
+/*! \file */
+
+/** @file ia_css_psys_terminal.hsys.user.h
+ *
+ * Define the methods on the termianl manifest object: Hsys user interface
+ */
+
+#include <ia_css_psys_manifest_types.h>
+
+/*! Print the terminal manifest object to file/stream
+
+ @param    manifest[in]            terminal manifest object
+ @param    fid[out]                file/stream handle
+
+ @return < 0 on error
+ */
+extern int ia_css_terminal_manifest_print(
+    const ia_css_terminal_manifest_t    *manifest,
+    void                    *fid);
+
+#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_HSYS_USER_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.sim.h
new file mode 100644
index 000000000000..22c40422fce7
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.sim.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_SIM_H
+#define __IA_CSS_PSYS_TERMINAL_MANIFEST_SIM_H
+
+/*! \file */
+
+/** @file ia_css_psys_terminal_manifest.sim.h
+ *
+ * Define the methods on the terminal manifest object: Simulation only
+ */
+
+#include <type_support.h>                    /* size_t */
+#include "ia_css_terminal.h"
+#include "ia_css_terminal_manifest.h"
+#include "ia_css_terminal_defs.h"
+
+/*! Create (the storage for) the terminal manifest object
+
+ @param    terminal_type[in]    type of the terminal manifest {parameter, data}
+
+ @return NULL on error
+ */
+extern ia_css_terminal_manifest_t *ia_css_terminal_manifest_alloc(
+    const ia_css_terminal_type_t            terminal_type);
+
+/*! Destroy (the storage of) the terminal manifest object
+
+ @param    manifest[in]            terminal manifest
+
+ @return NULL
+ */
+extern ia_css_terminal_manifest_t *ia_css_terminal_manifest_free(
+    ia_css_terminal_manifest_t                *manifest);
+
+#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_SIM_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest_impl.h
new file mode 100644
index 000000000000..8c99fa5d0782
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest_impl.h
@@ -0,0 +1,745 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_IMPL_H
+#define __IA_CSS_PSYS_TERMINAL_MANIFEST_IMPL_H
+
+#include <ia_css_psys_terminal_manifest.h>
+
+/* Data object types on the terminals */
+#include <ia_css_program_group_data.h>
+/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_clear, ia_css_... */
+#include <ia_css_kernel_bitmap.h>
+
+#include "ia_css_psys_program_group_private.h"
+#include "ia_css_terminal_manifest.h"
+#include "ia_css_terminal_manifest_types.h"
+
+#include <error_support.h>
+#include <print_support.h>
+#include <misc_support.h>
+#include "ia_css_psys_static_trace.h"
+#include "ia_css_psys_static_storage_class.h"
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_manifest_spatial_parameter_terminal(
+    const ia_css_terminal_manifest_t *manifest)
+{
+    ia_css_terminal_type_t terminal_type;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_is_terminal_manifest_parameter_terminal(): enter:\n");
+
+    terminal_type = ia_css_terminal_manifest_get_type(manifest);
+
+    return ((terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ||
+        (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT));
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_manifest_program_terminal(
+    const ia_css_terminal_manifest_t *manifest)
+{
+    ia_css_terminal_type_t terminal_type;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_is_terminal_manifest_parameter_terminal(): enter:\n");
+
+    terminal_type = ia_css_terminal_manifest_get_type(manifest);
+
+    return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM);
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_manifest_program_control_init_terminal(
+    const ia_css_terminal_manifest_t *manifest)
+{
+    ia_css_terminal_type_t terminal_type;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_is_terminal_manifest_program_control_init_terminal(): enter:\n");
+
+    terminal_type = ia_css_terminal_manifest_get_type(manifest);
+
+    return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT);
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_manifest_parameter_terminal(
+    const ia_css_terminal_manifest_t *manifest)
+{
+    /* will return an error value on error */
+    ia_css_terminal_type_t terminal_type;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_is_terminal_manifest_parameter_terminal(): enter:\n");
+
+    terminal_type = ia_css_terminal_manifest_get_type(manifest);
+
+    return (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
+        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT);
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_manifest_data_terminal(
+    const ia_css_terminal_manifest_t *manifest)
+{
+    /* will return an error value on error */
+    ia_css_terminal_type_t terminal_type;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_is_terminal_manifest_data_terminal(): enter:\n");
+
+    terminal_type = ia_css_terminal_manifest_get_type(manifest);
+
+    return ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
+        (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT));
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_manifest_sliced_terminal(
+    const ia_css_terminal_manifest_t *manifest)
+{
+    ia_css_terminal_type_t terminal_type;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_is_terminal_manifest_sliced_terminal(): enter:\n");
+
+    terminal_type = ia_css_terminal_manifest_get_type(manifest);
+
+    return ((terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN) ||
+        (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT));
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+size_t ia_css_terminal_manifest_get_size(
+    const ia_css_terminal_manifest_t *manifest)
+{
+    size_t size = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_terminal_manifest_get_size(): enter:\n");
+
+    if (manifest != NULL) {
+        size = manifest->size;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+            "ia_css_terminal_manifest_get_size: invalid argument\n");
+    }
+    return size;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_terminal_type_t ia_css_terminal_manifest_get_type(
+    const ia_css_terminal_manifest_t *manifest)
+{
+    ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_terminal_manifest_get_type(): enter:\n");
+
+    if (manifest != NULL) {
+        terminal_type = manifest->terminal_type;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+            "ia_css_terminal_manifest_get_type: invalid argument\n");
+    }
+    return terminal_type;
+}
+
+/** Temporary implementation of attributes based on terminal type ID
+ *
+ *  A later implementation in the PG manifest generator tool will
+ *  replace this and thus remove the dependency on the legacy
+ *  terminal type.
+ */
+static void ia_css_terminal_manifest_set_attributes_by_type(
+    ia_css_terminal_manifest_t *manifest,
+    const ia_css_terminal_type_t terminal_type)
+{
+    /* Set defaults for most cases, and change in the later code for the rest. */
+    ia_css_terminal_cat_t category = IA_CSS_TERMINAL_CAT_LOAD;
+    ia_css_terminal_dir_t direction = IA_CSS_TERMINAL_DIR_IN;
+    ia_css_terminal_rou_t rou = IA_CSS_TERMINAL_ROU_FRAME;
+    ia_css_connect_buf_type_t connect_buf_type = IA_CSS_CONNECT_BUF_TYPE_UNKNOWN;
+
+    if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
+         (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) ||
+         (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ||
+         (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT)) {
+        category = IA_CSS_TERMINAL_CAT_CONNECT;
+    }
+    ia_css_terminal_manifest_set_category(manifest, category);
+
+    if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) ||
+         (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) ||
+         (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT) ||
+         (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT) ||
+         (terminal_type == IA_CSS_TERMINAL_TYPE_STATE_OUT)) {
+        direction = IA_CSS_TERMINAL_DIR_OUT;
+    }
+    ia_css_terminal_manifest_set_direction(manifest, direction);
+
+    if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
+         (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT)) {
+        rou = IA_CSS_TERMINAL_ROU_FRAG;
+    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) {
+            rou = IA_CSS_TERMINAL_ROU_STREAM;
+    }
+    ia_css_terminal_manifest_set_rate_of_update(manifest, rou);
+
+    if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
+         (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT)) {
+        connect_buf_type = IA_CSS_CONNECT_BUF_TYPE_DATA;
+    } else if ((terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ||
+             (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT)) {
+            connect_buf_type = IA_CSS_CONNECT_BUF_TYPE_META;
+    }
+    ia_css_terminal_manifest_set_connect_buffer_type(manifest, connect_buf_type);
+}
+
+/** Temporary implementation for new fields until the manfifest generator
+ *  tool will be enhance to set values directly.
+ *
+ *  - Attibutes are set to meaningful values by mapping terminal type to
+ *  attributes
+ *  - connect_ID is set to the invalid terminal ID value: IA_CSS_TERMINAL_INVALID_ID
+ *  - max_payload_size is set to UINT32_MAX
+ */
+static void ia_css_terminal_manifest_set_new_fields(
+    ia_css_terminal_manifest_t *manifest,
+    const ia_css_terminal_type_t terminal_type)
+{
+    ia_css_terminal_manifest_set_attributes_by_type(manifest, terminal_type);
+    assert(ia_css_terminal_manifest_set_connect_ID(manifest, IA_CSS_TERMINAL_INVALID_ID));
+    assert(ia_css_terminal_manifest_set_max_payload_size(manifest, UINT32_MAX));
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+int ia_css_terminal_manifest_set_type(
+    ia_css_terminal_manifest_t *manifest,
+    const ia_css_terminal_type_t terminal_type)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_terminal_manifest_set_type(): enter:\n");
+
+    if (manifest != NULL) {
+        manifest->terminal_type = terminal_type;
+        ia_css_terminal_manifest_set_new_fields(manifest, terminal_type);
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+            "ia_css_terminal_manifest_set_type failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+int ia_css_terminal_manifest_set_ID(
+    ia_css_terminal_manifest_t *manifest,
+    const ia_css_terminal_ID_t ID)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_terminal_manifest_set_ID(): enter:\n");
+
+    if (manifest != NULL) {
+        manifest->ID = ID;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+            "ia_css_terminal_manifest_set_ID failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_terminal_ID_t ia_css_terminal_manifest_get_ID(
+    const ia_css_terminal_manifest_t *manifest)
+{
+    ia_css_terminal_ID_t retval;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_terminal_manifest_get_ID(): enter:\n");
+
+    if (manifest != NULL) {
+        retval = manifest->ID;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+            "ia_css_terminal_manifest_get_ID failed\n");
+        retval = IA_CSS_TERMINAL_INVALID_ID;
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_ID_t ia_css_terminal_manifest_get_connect_ID(
+    const ia_css_terminal_manifest_t        *manifest)
+{
+    ia_css_terminal_ID_t retval;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_terminal_manifest_get_connect_ID(): enter:\n");
+
+    if (manifest != NULL) {
+        retval = manifest->assoc_ID;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+            "ia_css_terminal_manifest_get_connect_ID failed\n");
+        retval = IA_CSS_TERMINAL_INVALID_ID;
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_cat_t ia_css_terminal_manifest_get_category(
+    const ia_css_terminal_manifest_t        *manifest)
+{
+    ia_css_terminal_cat_t retval;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_terminal_manifest_get_category(): enter:\n");
+
+    if (manifest != NULL) {
+        retval = (ia_css_terminal_cat_t)manifest->attributes.category;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+            "ia_css_terminal_manifest_get_category failed\n");
+        retval = IA_CSS_TERMINAL_CAT_INVALID;
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_category(
+    ia_css_terminal_manifest_t        *manifest,
+    ia_css_terminal_cat_t category)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_terminal_manifest_set_category(): enter:\n");
+
+    if (manifest != NULL) {
+        manifest->attributes.category = category;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+            "ia_css_terminal_manifest_set_category failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_dir_t ia_css_terminal_manifest_get_direction(
+    const ia_css_terminal_manifest_t        *manifest)
+{
+    ia_css_terminal_dir_t retval;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_terminal_manifest_get_direction(): enter:\n");
+
+    if (manifest != NULL) {
+        retval = (ia_css_terminal_dir_t)manifest->attributes.direction;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+            "ia_css_terminal_manifest_get_direction failed\n");
+        retval = IA_CSS_TERMINAL_DIR_INVALID;
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_direction(
+    ia_css_terminal_manifest_t        *manifest,
+    ia_css_terminal_dir_t direction)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_terminal_manifest_set_direction(): enter:\n");
+
+    if (manifest != NULL) {
+        manifest->attributes.direction = direction;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+            "ia_css_terminal_manifest_set_direction failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_rou_t ia_css_terminal_manifest_get_rate_of_update(
+    const ia_css_terminal_manifest_t        *manifest)
+{
+    ia_css_terminal_rou_t retval;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_terminal_manifest_get_rate_of_update(): enter:\n");
+
+    if (manifest != NULL) {
+        retval = (ia_css_terminal_rou_t)manifest->attributes.rou;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+            "ia_css_terminal_manifest_get_rate_of_update failed\n");
+        retval = IA_CSS_TERMINAL_ROU_INVALID;
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_rate_of_update(
+    ia_css_terminal_manifest_t        *manifest,
+    ia_css_terminal_rou_t rate_of_update)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_terminal_manifest_set_rate_of_update(): enter:\n");
+
+    if (manifest != NULL) {
+        manifest->attributes.rou = rate_of_update;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+            "ia_css_terminal_manifest_set_rate_of_update failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_connect_buf_type_t ia_css_terminal_manifest_get_connect_buffer_type(
+    const ia_css_terminal_manifest_t        *manifest)
+{
+    ia_css_connect_buf_type_t retval;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_terminal_manifest_get_connect_buffer_type(): enter:\n");
+
+    if (manifest != NULL) {
+        retval = (ia_css_connect_buf_type_t)manifest->attributes.connect_buf_type;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+            "ia_css_terminal_manifest_get_connect_buffer_type failed\n");
+        retval = IA_CSS_CONNECT_BUF_TYPE_INVALID;
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_connect_buffer_type(
+    ia_css_terminal_manifest_t        *manifest,
+    ia_css_connect_buf_type_t connect_buf_type)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_terminal_manifest_set_connect_buffer_type(): enter:\n");
+
+    if (manifest != NULL) {
+        manifest->attributes.connect_buf_type = connect_buf_type;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+            "ia_css_terminal_manifest_set_connect_buffer_type failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_connect_ID(
+    ia_css_terminal_manifest_t            *manifest,
+    const ia_css_terminal_ID_t            ID)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_terminal_manifest_set_connect_ID(): enter:\n");
+
+    if (manifest != NULL &&
+        ((IA_CSS_TERMINAL_CAT_LOAD == ia_css_terminal_manifest_get_category(manifest)) ||
+        (IA_CSS_TERMINAL_INVALID_ID == ID))) {
+        manifest->assoc_ID = ID;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+            "ia_css_terminal_manifest_set_connect_ID failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_terminal_manifest_get_max_payload_size(
+    const ia_css_terminal_manifest_t *manifest)
+{
+    ia_css_terminal_ID_t retval;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_terminal_manifest_get_max_payload_size(): enter:\n");
+
+    if (manifest != NULL) {
+        retval = manifest->max_payload_size;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+            "ia_css_terminal_manifest_get_max_payload_size failed\n");
+        retval = IA_CSS_TERMINAL_INVALID_ID;
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_max_payload_size(
+    ia_css_terminal_manifest_t            *manifest,
+    uint32_t                             max_payload_size)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_terminal_manifest_set_max_payload_size(): enter:\n");
+
+    if (manifest != NULL) {
+        manifest->max_payload_size = max_payload_size;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+            "ia_css_terminal_manifest_set_max_payload_size failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_program_group_manifest_t *ia_css_terminal_manifest_get_parent(
+    const ia_css_terminal_manifest_t *manifest)
+{
+    ia_css_program_group_manifest_t    *parent = NULL;
+    char *base;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_terminal_manifest_get_parent(): enter:\n");
+
+    verifexit(manifest != NULL);
+
+    base = (char *)((char *)manifest + manifest->parent_offset);
+
+    parent = (ia_css_program_group_manifest_t *)(base);
+EXIT:
+    return parent;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+int ia_css_terminal_manifest_set_parent_offset(
+    ia_css_terminal_manifest_t *manifest,
+    int32_t terminal_offset)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_terminal_manifest_set_parent_offset(): enter:\n");
+
+    verifexit(manifest != NULL);
+
+    /* parent is at negative offset away from current terminal offset*/
+    manifest->parent_offset = -terminal_offset;
+
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+            "ia_css_terminal_manifest_set_parent_offset failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C ia_css_frame_format_bitmap_t
+ia_css_data_terminal_manifest_get_frame_format_bitmap(
+    const ia_css_data_terminal_manifest_t *manifest)
+{
+    ia_css_frame_format_bitmap_t bitmap = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_data_terminal_manifest_get_frame_format_bitmap(): enter:\n");
+
+    if (manifest != NULL) {
+        bitmap = manifest->frame_format_bitmap;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+            "ia_css_data_terminal_manifest_get_frame_format_bitmap invalid argument\n");
+    }
+    return bitmap;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+int ia_css_data_terminal_manifest_set_frame_format_bitmap(
+    ia_css_data_terminal_manifest_t *manifest,
+    ia_css_frame_format_bitmap_t bitmap)
+{
+    int ret = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_data_terminal_manifest_set_frame_format_bitmap(): enter:\n");
+
+    if (manifest != NULL) {
+        manifest->frame_format_bitmap = bitmap;
+        ret = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+            "ia_css_data_terminal_manifest_set_frame_format_bitmap failed (%i)\n",
+            ret);
+    }
+
+    return ret;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+bool ia_css_data_terminal_manifest_can_support_compression(
+    const ia_css_data_terminal_manifest_t *manifest)
+{
+    bool compression_support = false;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_data_terminal_manifest_get_compression_support(): enter:\n");
+
+    if (manifest != NULL) {
+        /* compression_support is used boolean encoded in uint8_t.
+         * So we only need to check
+         * if this is non-zero
+         */
+        compression_support = (manifest->compression_support != 0);
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+            "ia_css_data_terminal_manifest_can_support_compression invalid argument\n");
+    }
+
+    return compression_support;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+int ia_css_data_terminal_manifest_set_compression_support(
+    ia_css_data_terminal_manifest_t *manifest,
+    bool compression_support)
+{
+    int ret = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_data_terminal_manifest_set_compression_support(): enter:\n");
+
+    if (manifest != NULL) {
+        manifest->compression_support =
+            (compression_support == true) ? 1 : 0;
+        ret = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+            "ia_css_data_terminal_manifest_set_compression_support failed (%i)\n",
+            ret);
+    }
+
+    return ret;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_connection_bitmap_t ia_css_data_terminal_manifest_get_connection_bitmap(
+    const ia_css_data_terminal_manifest_t *manifest)
+{
+    ia_css_connection_bitmap_t connection_bitmap = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_data_terminal_manifest_get_connection_bitmap(): enter:\n");
+
+    if (manifest != NULL) {
+        connection_bitmap = manifest->connection_bitmap;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+            "ia_css_data_terminal_manifest_get_connection_bitmap invalid argument\n");
+    }
+    return connection_bitmap;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+int ia_css_data_terminal_manifest_set_connection_bitmap(
+    ia_css_data_terminal_manifest_t *manifest, ia_css_connection_bitmap_t bitmap)
+{
+    int ret = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_data_terminal_manifest_set_connection_bitmap(): enter:\n");
+
+    if (manifest != NULL) {
+        assert(bitmap != 0); /* zero means there is no connection, this is invalid. */
+        assert((bitmap >> IA_CSS_N_CONNECTION_TYPES) == 0);
+
+        manifest->connection_bitmap = bitmap;
+        ret = 0;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+            "ia_css_data_terminal_manifest_set_connection_bitmap invalid argument\n");
+    }
+    return ret;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_data_terminal_manifest_get_kernel_bitmap(
+    const ia_css_data_terminal_manifest_t *manifest)
+{
+    ia_css_kernel_bitmap_t kernel_bitmap = ia_css_kernel_bitmap_clear();
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_data_terminal_manifest_get_kernel_bitmap(): enter:\n");
+
+    if (manifest != NULL) {
+        kernel_bitmap = manifest->kernel_bitmap;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+            "ia_css_data_terminal_manifest_get_kernel_bitmap: invalid argument\n");
+    }
+    return kernel_bitmap;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+int ia_css_data_terminal_manifest_set_kernel_bitmap(
+    ia_css_data_terminal_manifest_t    *manifest,
+    const ia_css_kernel_bitmap_t kernel_bitmap)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_data_terminal_manifest_set_kernel_bitmap(): enter:\n");
+
+    if (manifest != NULL) {
+        manifest->kernel_bitmap = kernel_bitmap;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+            "ia_css_data_terminal_manifest_set_kernel_bitmap: failed (%i)\n",
+            retval);
+    }
+
+    return retval;
+}
+
+#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_private_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_private_types.h
new file mode 100644
index 000000000000..ef3b79157d43
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_private_types.h
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_TERMINAL_PRIVATE_TYPES_H
+#define __IA_CSS_PSYS_TERMINAL_PRIVATE_TYPES_H
+
+#include "ia_css_terminal_types.h"
+#include "ia_css_program_group_data.h"
+#include "ia_css_psys_manifest_types.h"
+
+#define    N_UINT16_IN_DATA_TERMINAL_STRUCT    2
+#define    N_UINT8_IN_DATA_TERMINAL_STRUCT        3
+#define    N_PADDING_UINT8_IN_DATA_TERMINAL_STRUCT    1
+
+/* ========================= Data terminal - START ========================= */
+
+#define SIZE_OF_DATA_TERMINAL_STRUCT_BITS \
+    (SIZE_OF_TERMINAL_STRUCT_BITS \
+    + IA_CSS_FRAME_DESCRIPTOR_STRUCT_BITS \
+    + IA_CSS_FRAME_STRUCT_BITS \
+    + IA_CSS_STREAM_STRUCT_BITS \
+    + IA_CSS_UINT32_T_BITS \
+    + IA_CSS_CONNECTION_TYPE_BITS \
+    + (N_UINT16_IN_DATA_TERMINAL_STRUCT * 16) \
+    + (N_UINT8_IN_DATA_TERMINAL_STRUCT * 8)    \
+    + (N_PADDING_UINT8_IN_DATA_TERMINAL_STRUCT * 8))
+
+/**
+ * The (data) terminal can be attached to a buffer or a stream.
+ * The stream interface is not necessarily limited to strict in-order access.
+ * For a stream the restriction is that contrary to a buffer it cannot be
+ * addressed directly, i.e. it behaves as a port,
+ * but it may support stream_pos() and/or seek() operations
+ */
+struct ia_css_data_terminal_s {
+    /** Data terminal base class */
+    ia_css_terminal_t base;
+    /** Properties of the image data attached to the terminal */
+    ia_css_frame_descriptor_t frame_descriptor;
+    /** Data buffer handle attached to the terminal */
+    ia_css_frame_t frame;
+    /** (exclusive) Data stream handle attached to the terminal
+     * if the data is sourced over a device port
+     *
+     * @note No known use of the field.
+     */
+    ia_css_stream_t stream;
+    /** Reserved
+    * @note No known intent for this reservation field. */
+    uint32_t reserved;
+    /** Tranfer method for send/receving data to/from this terminal. */
+    ia_css_connection_type_t connection_type;
+    /** Offset in bytes from the start of this structure to a Array[fragment_count] of
+     *  type "ia_css_fragment_descriptor_t", aligned to a 64 bit boundary.
+     *  (fragment_count being equal for all terminals in a subgraph) of fragment descriptors
+     */
+    uint16_t fragment_descriptor_offset;
+    /** Size of streaming to GEN buffer in lines. This field will be used only
+     *  at streaming use-case (connection type != IA_CSS_CONNECTION_MEMORY)
+     */
+    uint16_t stream2gen_buffer_size;
+    /** Kernel id that this terminal is associated with.  If that kernel
+     *  is disabled, this terminal is considered disabled as well.
+     *  Must be set the single kernel defined in the manifest for this terminal's
+     *  ID (ia_css_terminal_s::ID). */
+    uint8_t kernel_id;
+    /** Indicate to which subgraph this terminal belongs
+     * for common constraints
+     *
+     * @note No known use.
+     */
+    uint8_t subgraph_id;
+    /** Link ID of the data terminal.  Two terminals can optionally be
+     *  marked as linked to each other by setting the same link ID.
+     *  Hardware topology or logical or algorithmic constraints may restrict the
+     *  terminal that can be so linked.
+     *  In current practice, link ID's have special meaning related to
+     *  the connection type (see "connection_type" field in this structure) or
+     *  synchronization of program groups.
+     *  @see ia_css_isys_link_id_t
+     *  @see ia_css_data_barrier_link_id_t
+     *  @see ia_css_stream2gen_link_id_t */
+    uint8_t link_id;
+    /** Padding for 64bit alignment */
+    uint8_t padding[N_PADDING_UINT8_IN_DATA_TERMINAL_STRUCT];
+};
+/* ========================== Data terminal - END ========================== */
+
+#endif /* __IA_CSS_PSYS_TERMINAL_PRIVATE_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport.h
new file mode 100644
index 000000000000..23f84fd981be
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport.h
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_TRANSPORT_H
+#define __IA_CSS_PSYS_TRANSPORT_H
+
+#include <ia_css_psys_transport_dep.h>        /* ia_css_psys_cmd_queues */
+#include <vied_nci_psys_system_global.h>    /* vied_vaddress_t */
+
+#include <type_support.h>
+
+typedef enum ia_css_psys_event_queues {
+    /** The in-order queue for event returns */
+    IA_CSS_PSYS_EVENT_QUEUE_MAIN_ID,
+    IA_CSS_N_PSYS_EVENT_QUEUE_ID
+} ia_css_psys_event_queue_ID_t;
+
+typedef enum ia_css_psys_event_types {
+    /** No error to report. */
+    IA_CSS_PSYS_EVENT_TYPE_SUCCESS = 0,
+    /** Unknown unhandled error */
+    IA_CSS_PSYS_EVENT_TYPE_UNKNOWN_ERROR = 1,
+    /* Retrieving remote object: */
+    /** Object ID not found */
+    IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_NOT_FOUND = 2,
+    /** Objects too big, or size is zero. */
+    IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_TOO_BIG = 3,
+    /** Failed to load whole process group from tproxy/dma  */
+    IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_DDR_TRANS_ERR = 4,
+    /** The proper package could not be found */
+    IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_NULL_PKG_DIR_ADDR = 5,
+    /* Process group: */
+    /** Failed to run, error while loading frame */
+    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_LOAD_FRAME_ERR = 6,
+    /** Failed to run, error while loading fragment */
+    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_LOAD_FRAGMENT_ERR = 7,
+    /** The process count of the process group is zero */
+    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_PROCESS_COUNT_ZERO = 8,
+    /** Process(es) initialization */
+    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_PROCESS_INIT_ERR = 9,
+    /** Aborted (after host request) */
+    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_ABORT = 10,
+    /** NULL pointer in the process group */
+    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_NULL = 11,
+    /** Process group validation failed */
+    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_VALIDATION_ERR = 12,
+    /** Error handling- invalid frame detected by CSI (ISYS) */
+    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_INVALID_FRAME = 13
+} ia_css_psys_event_type_t;
+
+#define IA_CSS_PSYS_CMD_BITS    64
+struct ia_css_psys_cmd_s {
+    /** The command issued to the process group */
+    uint16_t    command;
+    /** Message field of the command */
+    uint16_t    msg;
+    /** The context reference (process group/buffer set/...) */
+    uint32_t    context_handle;
+};
+
+#define IA_CSS_PSYS_EVENT_BITS    128
+typedef struct ia_css_psys_event_s {
+    /** The (return) status of the command issued to
+     * the process group this event refers to
+     */
+    uint16_t    status;
+    /** The command issued to the process group this event refers to */
+    uint16_t    command;
+    /** The context reference (process group/buffer set/...) */
+    uint32_t    context_handle;
+    /** This token (size) must match the token registered
+     * in a process group
+     */
+    uint64_t    token;
+} ia_css_psys_event_s_t;
+
+struct ia_css_psys_buffer_s {
+    /** The in-order queue for scheduled process groups */
+    void        *host_buffer;
+    vied_vaddress_t    *isp_buffer;
+};
+
+#endif /* __IA_CSS_PSYS_TRANSPORT_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport_dep.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport_dep.h
new file mode 100644
index 000000000000..5010c5b7a7e7
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport_dep.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_TRANSPORT_DEP_H
+#define __IA_CSS_PSYS_TRANSPORT_DEP_H
+
+/*
+ * The ID's of the Psys specific queues.
+ */
+typedef enum ia_css_psys_cmd_queues {
+    /**< The in-order queue for scheduled process groups */
+    IA_CSS_PSYS_CMD_QUEUE_COMMAND_ID = 0,
+    /**< The in-order queue for commands changing psys or
+     * process group state
+     */
+    IA_CSS_PSYS_CMD_QUEUE_DEVICE_ID,
+    /**< All in-order queues for dedicated PPG commands */
+    IA_CSS_PSYS_CMD_QUEUE_PPG0_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG1_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG2_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG3_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG4_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG5_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG6_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG7_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG8_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG9_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG10_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG11_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG12_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG13_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG14_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG15_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG16_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG17_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG18_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG19_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG20_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG21_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG22_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG23_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG24_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG25_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG26_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG27_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG28_COMMAND_ID,
+    IA_CSS_PSYS_CMD_QUEUE_PPG29_COMMAND_ID,
+    IA_CSS_N_PSYS_CMD_QUEUE_ID
+} ia_css_psys_cmd_queue_ID_t;
+
+#define IA_CSS_PSYS_LATE_BINDING_QUEUE_OFFSET 1
+
+#endif /* __IA_CSS_PSYS_TRANSPORT_DEP_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi.h
new file mode 100644
index 000000000000..9033b8d1a19a
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYSAPI_H
+#define __IA_CSS_PSYSAPI_H
+
+#include <ia_css_psys_process.hsys.user.h>
+#include <ia_css_psys_process.hsys.kernel.h>
+#include <ia_css_psys_process_group.hsys.user.h>
+#include <ia_css_psys_process_group.hsys.kernel.h>
+
+#endif /* __IA_CSS_PSYSAPI_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_fw_version.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_fw_version.h
new file mode 100644
index 000000000000..89c63a75c817
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_fw_version.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYSAPI_FW_VERSION_H
+#define __IA_CSS_PSYSAPI_FW_VERSION_H
+
+/* PSYSAPI FW VERSION is taken from Makefile for FW tests */
+#define BXT_FW_RELEASE_VERSION PSYS_FIRMWARE_VERSION
+
+enum ia_css_process_group_protocol_version {
+    /**
+     * Legacy protocol
+     */
+    IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY = 0,
+    /**
+     * Persistent process group support protocol
+     */
+    IA_CSS_PROCESS_GROUP_PROTOCOL_PPG,
+    IA_CSS_PROCESS_GROUP_N_PROTOCOLS
+};
+
+#endif /* __IA_CSS_PSYSAPI_FW_VERSION_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_trace.h
new file mode 100644
index 000000000000..a98c47c3ecf4
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_trace.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYSAPI_TRACE_H
+#define __IA_CSS_PSYSAPI_TRACE_H
+
+#include "ia_css_trace.h"
+
+#define PSYSAPI_TRACE_LOG_LEVEL_OFF 0
+#define PSYSAPI_TRACE_LOG_LEVEL_NORMAL 1
+#define PSYSAPI_TRACE_LOG_LEVEL_DEBUG 2
+
+/* PSYSAPI and all the submodules in PSYSAPI will have the default tracing
+ * level set to the PSYSAPI_TRACE_CONFIG level. If not defined in the
+ * psysapi.mk fill it will be set by default to no trace
+ * (PSYSAPI_TRACE_LOG_LEVEL_OFF)
+ */
+#define PSYSAPI_TRACE_CONFIG_DEFAULT PSYSAPI_TRACE_LOG_LEVEL_OFF
+
+#if !defined(PSYSAPI_TRACE_CONFIG)
+    #define PSYSAPI_TRACE_CONFIG PSYSAPI_TRACE_CONFIG_DEFAULT
+#endif
+
+/* Module specific trace setting will be used if
+ * the trace level is not specified from the module or
+  PSYSAPI_TRACING_OVERRIDE is defined
+ */
+#if (defined(PSYSAPI_TRACE_CONFIG))
+    /* Module specific trace setting */
+    #if PSYSAPI_TRACE_CONFIG == PSYSAPI_TRACE_LOG_LEVEL_OFF
+        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
+        #define PSYSAPI_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_TRACE_LEVEL_ERROR IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_TRACE_LEVEL_WARNING IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_TRACE_LEVEL_INFO IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_TRACE_LEVEL_DEBUG IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_TRACE_LEVEL_VERBOSE IA_CSS_TRACE_LEVEL_DISABLED
+    #elif PSYSAPI_TRACE_CONFIG == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
+        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
+        #define PSYSAPI_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_TRACE_LEVEL_ERROR IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_TRACE_LEVEL_WARNING IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_TRACE_LEVEL_INFO IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_TRACE_LEVEL_DEBUG IA_CSS_TRACE_LEVEL_DISABLED
+        #define PSYSAPI_TRACE_LEVEL_VERBOSE IA_CSS_TRACE_LEVEL_DISABLED
+    #elif PSYSAPI_TRACE_CONFIG == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
+        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
+        #define PSYSAPI_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
+        #define PSYSAPI_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_TRACE_LEVEL_ERROR IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_TRACE_LEVEL_WARNING IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_TRACE_LEVEL_INFO IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_TRACE_LEVEL_DEBUG IA_CSS_TRACE_LEVEL_ENABLED
+        #define PSYSAPI_TRACE_LEVEL_VERBOSE IA_CSS_TRACE_LEVEL_ENABLED
+    #else
+        #error "No PSYSAPI_TRACE_CONFIG Tracing level defined"
+    #endif
+#else
+    #error "PSYSAPI_TRACE_CONFIG not defined"
+#endif
+
+/* Overriding submodules in PSYSAPI with a specific tracing level */
+/* #define PSYSAPI_DYNAMIC_TRACING_OVERRIDE TRACE_LOG_LEVEL_VERBOSE */
+
+#endif /* __IA_CSS_PSYSAPI_TRACE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm.h
new file mode 100644
index 000000000000..fbe6222a4e0a
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm.h
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_RBM_H
+#define __IA_CSS_RBM_H
+
+#include "ia_css_rbm_storage_class.h"
+#include <type_support.h>
+
+/*
+ * IPU6 adds a lot of mux/demux/blk,
+ * 96 bits is not enough
+ * need 160 bits (has to multiply of 32 bits)
+ * after X2B / DOL / PAF enabled in isa_lb PG
+ */
+#define IA_CSS_RBM_BITS 160
+/** An element is a 32 bit unsigned integer. 64 bit integers might cause
+ * problems in the compiler.
+ */
+#define IA_CSS_RBM_ELEM_TYPE uint32_t
+#define IA_CSS_RBM_ELEM_BITS \
+    (sizeof(IA_CSS_RBM_ELEM_TYPE)*8)
+#define IA_CSS_RBM_NOF_ELEMS \
+    ((IA_CSS_RBM_BITS) / (IA_CSS_RBM_ELEM_BITS))
+
+/** Users should make no assumption about the actual type of
+ * ia_css_rbm_t.
+ */
+typedef struct {
+    IA_CSS_RBM_ELEM_TYPE data[IA_CSS_RBM_NOF_ELEMS];
+} ia_css_rbm_elems_t;
+typedef ia_css_rbm_elems_t ia_css_rbm_t;
+
+/** Print the bits of a routing bitmap
+ * @return < 0 on error
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+int ia_css_rbm_print(
+    const ia_css_rbm_t    bitmap,
+    void *fid);
+
+/** Create an empty routing bitmap
+ * @return bitmap = 0
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+ia_css_rbm_t ia_css_rbm_clear(void);
+
+/** Creates the complement of a routing bitmap
+ * @param    bitmap[in] routing bitmap
+ * @return ~bitmap
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+ia_css_rbm_t ia_css_rbm_complement(
+    const ia_css_rbm_t bitmap);
+
+/** Create the union of two routing bitmaps
+ * @param    bitmap0[in]    routing bitmap 0
+ * @param    bitmap1[in]    routing bitmap 1
+ * @return bitmap0 | bitmap1
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+ia_css_rbm_t ia_css_rbm_union(
+    const ia_css_rbm_t bitmap0,
+    const ia_css_rbm_t bitmap1);
+
+/** Create the intersection of two routing bitmaps
+ * @param    bitmap0[in]    routing bitmap 0
+ * @param    bitmap1[in] routing bitmap 1
+ * @return bitmap0 & bitmap1
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+ia_css_rbm_t ia_css_rbm_intersection(
+    const ia_css_rbm_t            bitmap0,
+    const ia_css_rbm_t            bitmap1);
+
+/** Check if the routing bitmaps is empty
+ * @param bitmap[in] routing bitmap
+ * @return bitmap == 0
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+bool ia_css_is_rbm_empty(
+    const ia_css_rbm_t bitmap);
+
+/** Check if the intersection of two routing bitmaps is empty
+ * @param bitmap0[in] routing bitmap 0
+ * @param bitmap1[in] routing bitmap 1
+ * @return (bitmap0 & bitmap1) == 0
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+bool ia_css_is_rbm_intersection_empty(
+    const ia_css_rbm_t bitmap0,
+    const ia_css_rbm_t bitmap1);
+
+/** Check if the second routing bitmap is a subset of the first (or equal)
+ * @param bitmap0[in] routing bitmap 0
+ * @param bitmap1[in routing bitmap 1
+ * Note: An empty set is always a subset, this function
+ * returns true if bitmap 1 is empty
+ * @return (bitmap0 & bitmap1) == bitmap1
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+bool ia_css_is_rbm_subset(
+    const ia_css_rbm_t bitmap0,
+    const ia_css_rbm_t bitmap1);
+
+/** Check if the routing bitmaps are equal
+ * @param bitmap0[in] routing bitmap 0
+ * @param bitmap1[in] routing bitmap 1
+ * @return bitmap0 == bitmap1
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+bool ia_css_is_rbm_equal(
+    const ia_css_rbm_t bitmap0,
+    const ia_css_rbm_t bitmap1);
+
+/** Checks whether a specific kernel bit is set
+ * @return bitmap[index] == 1
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+int ia_css_is_rbm_set(
+    const ia_css_rbm_t bitmap,
+    const unsigned int index);
+
+/** Returns range of bits as integer
+ * @return bitmap[index, index+size]
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+int ia_css_rbm_range_val(
+    const ia_css_rbm_t bitmap,
+    const unsigned int index,
+    const unsigned int size);
+
+/** Create the union of a routing bitmap with a onehot bitmap
+ * with a bit set at index
+ * @return bitmap[index] |= 1
+*/
+IA_CSS_RBM_STORAGE_CLASS_H
+ia_css_rbm_t ia_css_rbm_set(
+    const ia_css_rbm_t bitmap,
+    const unsigned int index);
+
+/*! Set elem_index-th 32-bit element of the bitmap to elem_value
+ * @return updated bitmap
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+ia_css_rbm_t ia_css_rbm_set_element_from_uint32(
+    const ia_css_rbm_t bitmap,
+    const unsigned int elem_index,
+    const uint32_t     elem_value);
+
+/** Creates routing bitmap using a uint64 value.
+ * @return bitmap with the same bits set as in value (provided that width of bitmap is sufficient).
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+ia_css_rbm_t ia_css_rbm_create_from_uint64(
+    const uint64_t    value);
+
+/** Converts an ia_css_rbm_t type to uint64_t. Note that if
+ *  ia_css_rbm_t contains more then 64 bits, only the lowest 64 bits
+ *  are returned.
+ *  @return uint64_t representation of value
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+uint64_t ia_css_rbm_to_uint64(
+    const ia_css_rbm_t value);
+
+/** Creates a routing bitmap with the bit at index 'index' removed.
+ * @return ~(1 << index) & bitmap
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+ia_css_rbm_t ia_css_rbm_unset(
+    const ia_css_rbm_t bitmap,
+    const unsigned int index);
+
+/** Create a onehot routing bitmap with a bit set at index
+ * @return bitmap[index] = 1
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+ia_css_rbm_t ia_css_rbm_bit_mask(
+    const unsigned int index);
+
+#ifdef __IA_CSS_RBM_INLINE__
+#include "ia_css_rbm_impl.h"
+#endif /* __IA_CSS_RBM_INLINE__ */
+
+#endif /* __IA_CSS_RBM_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_impl.h
new file mode 100644
index 000000000000..0ed5684219c7
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_impl.h
@@ -0,0 +1,410 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ia_css_rbm.h"
+#include "type_support.h"
+#include "misc_support.h"
+#include "assert_support.h"
+#include "math_support.h"
+#include "ia_css_rbm_trace.h"
+
+STORAGE_CLASS_INLINE int ia_css_rbm_compute_weight(
+    const ia_css_rbm_t bitmap);
+
+STORAGE_CLASS_INLINE ia_css_rbm_t ia_css_rbm_shift(
+    const ia_css_rbm_t bitmap);
+
+IA_CSS_RBM_STORAGE_CLASS_C
+bool ia_css_is_rbm_intersection_empty(
+    const ia_css_rbm_t bitmap0,
+    const ia_css_rbm_t bitmap1)
+{
+    ia_css_rbm_t intersection;
+
+    IA_CSS_TRACE_0(RBM, VERBOSE,
+        "ia_css_is_rbm_intersection_empty(): enter:\n");
+
+    intersection = ia_css_rbm_intersection(bitmap0, bitmap1);
+    return ia_css_is_rbm_empty(intersection);
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+bool ia_css_is_rbm_empty(
+    const ia_css_rbm_t bitmap)
+{
+    unsigned int i;
+    bool is_empty = true;
+
+    IA_CSS_TRACE_0(RBM, VERBOSE,
+        "ia_css_is_rbm_empty(): enter:\n");
+    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
+        is_empty &= bitmap.data[i] == 0;
+    }
+    return is_empty;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+bool ia_css_is_rbm_equal(
+    const ia_css_rbm_t bitmap0,
+    const ia_css_rbm_t bitmap1)
+{
+    unsigned int i;
+    bool is_equal = true;
+
+    IA_CSS_TRACE_0(RBM, VERBOSE,
+        "ia_css_is_rbm_equal(): enter:\n");
+    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
+        is_equal = is_equal && (bitmap0.data[i] == bitmap1.data[i]);
+    }
+    return is_equal;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+bool ia_css_is_rbm_subset(
+    const ia_css_rbm_t bitmap0,
+    const ia_css_rbm_t bitmap1)
+{
+    unsigned int i;
+    bool is_subset = true;
+
+    /* checks if bitmap1 is subset of bitmap 0 */
+    IA_CSS_TRACE_0(RBM, VERBOSE,
+        "ia_css_is_rbm_subset(): enter:\n");
+
+    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
+        is_subset &= ((bitmap0.data[i] & bitmap1.data[i]) == bitmap1.data[i]);
+    }
+
+    return is_subset;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+ia_css_rbm_t ia_css_rbm_clear(void)
+{
+    unsigned int i;
+    ia_css_rbm_t bitmap = {{0} };
+
+    IA_CSS_TRACE_0(RBM, VERBOSE,
+        "ia_css_rbm_clear(): enter:\n");
+    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
+        bitmap.data[i] = 0;
+    }
+    return bitmap;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+ia_css_rbm_t ia_css_rbm_complement(
+    const ia_css_rbm_t bitmap)
+{
+    unsigned int i;
+    ia_css_rbm_t result = {{0} };
+
+    IA_CSS_TRACE_0(RBM, VERBOSE,
+        "ia_css_rbm_complement(): enter:\n");
+    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
+        result.data[i] = ~bitmap.data[i];
+    }
+    return result;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+ia_css_rbm_t ia_css_rbm_union(
+    const ia_css_rbm_t bitmap0,
+    const ia_css_rbm_t bitmap1)
+{
+    unsigned int i;
+    ia_css_rbm_t result = {{0} };
+
+    IA_CSS_TRACE_0(RBM, VERBOSE,
+        "ia_css_rbm_union(): enter:\n");
+    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
+        result.data[i] = (bitmap0.data[i] | bitmap1.data[i]);
+    }
+    return result;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+ia_css_rbm_t ia_css_rbm_intersection(
+    const ia_css_rbm_t bitmap0,
+    const ia_css_rbm_t bitmap1)
+{
+    unsigned int i;
+    ia_css_rbm_t result = {{0} };
+
+    IA_CSS_TRACE_0(RBM, VERBOSE,
+        "ia_css_rbm_intersection(): enter:\n");
+    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
+        result.data[i] = (bitmap0.data[i] & bitmap1.data[i]);
+    }
+    return result;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+ia_css_rbm_t ia_css_rbm_set(
+    const ia_css_rbm_t bitmap,
+    const unsigned int index)
+{
+    ia_css_rbm_t bit_mask;
+
+    IA_CSS_TRACE_0(RBM, VERBOSE,
+        "ia_css_rbm_set(): enter:\n");
+
+    bit_mask = ia_css_rbm_bit_mask(index);
+    return ia_css_rbm_union(bitmap, bit_mask);
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+ia_css_rbm_t ia_css_rbm_set_element_from_uint32(
+    const ia_css_rbm_t bitmap,
+    const unsigned int elem_index,
+    const uint32_t     elem_value)
+{
+    ia_css_rbm_t result = bitmap;
+
+    IA_CSS_TRACE_0(RBM, VERBOSE,
+        "ia_css_rbm_set_element_from_uint32(): enter:\n");
+
+    COMPILATION_ERROR_IF(sizeof(bitmap.data[elem_index]) != sizeof(elem_value));
+
+    if (elem_index < IA_CSS_RBM_NOF_ELEMS) {
+        result.data[elem_index] = elem_value;
+    } else {
+        assert(0);
+    }
+
+    return result;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+ia_css_rbm_t ia_css_rbm_create_from_uint64(
+    const uint64_t value)
+{
+    unsigned int i;
+    ia_css_rbm_t result;
+    const unsigned int bits64 = sizeof(uint64_t) * 8;
+    const unsigned int nof_elems_bits64 = bits64 / IA_CSS_RBM_ELEM_BITS;
+
+    IA_CSS_TRACE_0(RBM, VERBOSE,
+        "ia_css_rbm_create_from_uint64(): enter:\n");
+
+    result = ia_css_rbm_clear();
+    for (i = 0; i < MIN(nof_elems_bits64, IA_CSS_RBM_NOF_ELEMS); i++) {
+        /* masking is done implictly, the MSB bits of casting will be chopped off */
+        result.data[i] = (IA_CSS_RBM_ELEM_TYPE)
+            (value >> (i * IA_CSS_RBM_ELEM_BITS));
+    }
+
+    return result;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+uint64_t ia_css_rbm_to_uint64(
+    const ia_css_rbm_t value)
+{
+    const unsigned int bits64 = sizeof(uint64_t) * 8;
+    const unsigned int nof_elems_bits64 = bits64 / IA_CSS_RBM_ELEM_BITS;
+    unsigned int i;
+    uint64_t res = 0;
+
+    IA_CSS_TRACE_0(RBM, VERBOSE,
+        "ia_css_rbm_to_uint64(): enter:\n");
+
+    assert((bits64 % IA_CSS_RBM_ELEM_BITS) == 0);
+    assert(nof_elems_bits64 > 0);
+
+    for (i = 0; i < MIN(IA_CSS_RBM_NOF_ELEMS, nof_elems_bits64); i++) {
+        res |= ((uint64_t)(value.data[i]) << (i * IA_CSS_RBM_ELEM_BITS));
+    }
+    for (; i < IA_CSS_RBM_NOF_ELEMS; i++) {
+        assert(value.data[i] == 0);
+    }
+    return res;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+ia_css_rbm_t ia_css_rbm_unset(
+    const ia_css_rbm_t bitmap,
+    const unsigned int index)
+{
+    ia_css_rbm_t result;
+
+    IA_CSS_TRACE_0(RBM, VERBOSE,
+        "ia_css_rbm_unset(): enter:\n");
+
+    result = ia_css_rbm_bit_mask(index);
+    result = ia_css_rbm_complement(result);
+    return ia_css_rbm_intersection(bitmap, result);
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+ia_css_rbm_t ia_css_rbm_bit_mask(
+    const unsigned int index)
+{
+    unsigned int elem_index;
+    unsigned int elem_bit_index;
+    ia_css_rbm_t bit_mask = ia_css_rbm_clear();
+
+    assert(index < IA_CSS_RBM_BITS);
+
+    IA_CSS_TRACE_0(RBM, VERBOSE,
+        "ia_css_rbm_bit_mask(): enter:\n");
+    if (index < IA_CSS_RBM_BITS) {
+        elem_index = index / IA_CSS_RBM_ELEM_BITS;
+        elem_bit_index = index % IA_CSS_RBM_ELEM_BITS;
+        assert(elem_index < IA_CSS_RBM_NOF_ELEMS);
+
+        bit_mask.data[elem_index] = 1 << elem_bit_index;
+    }
+    return bit_mask;
+}
+
+STORAGE_CLASS_INLINE
+int ia_css_rbm_compute_weight(
+    const ia_css_rbm_t bitmap)
+{
+    ia_css_rbm_t loc_bitmap;
+    int weight = 0;
+    int i;
+
+    IA_CSS_TRACE_0(RBM, VERBOSE,
+        "ia_css_rbm_compute_weight(): enter:\n");
+
+    loc_bitmap = bitmap;
+
+    /* In fact; do not need the iterator "i" */
+    for (i = 0; (i < IA_CSS_RBM_BITS) &&
+        !ia_css_is_rbm_empty(loc_bitmap); i++) {
+        weight += ia_css_is_rbm_set(loc_bitmap, 0);
+        loc_bitmap = ia_css_rbm_shift(loc_bitmap);
+    }
+
+    return weight;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+int ia_css_rbm_range_val(
+    const ia_css_rbm_t bitmap,
+    const unsigned int index,
+    const unsigned int size)
+{
+    unsigned int elem_index;
+    unsigned int elem_bit_index;
+    unsigned int res;
+    unsigned int elem_index_end;
+    unsigned int mask;
+
+    IA_CSS_TRACE_0(RBM, VERBOSE, "ia_css_rbm_range_val(): enter:\n");
+    assert(index < IA_CSS_RBM_BITS);
+    /* Extract the bit range from the data array relevane entry */
+    elem_index = index / IA_CSS_RBM_ELEM_BITS;
+    elem_index_end = (index + size - 1) / IA_CSS_RBM_ELEM_BITS;
+    elem_bit_index = index % IA_CSS_RBM_ELEM_BITS;
+    assert(elem_index < IA_CSS_RBM_NOF_ELEMS);
+    mask =  (1 << size) - 1;
+    res = (bitmap.data[elem_index] >> elem_bit_index) & mask;
+    /* In case that the bit range is divided between 2 different data array entries */
+    if (elem_index != elem_index_end) {
+        unsigned int first_elem_size = IA_CSS_RBM_ELEM_BITS - index;
+        unsigned int second_elem_size = size - first_elem_size;
+
+        mask = (1 << second_elem_size) - 1;
+        res |= ((bitmap.data[elem_index_end] & mask) << first_elem_size);
+    }
+    return res;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+int ia_css_is_rbm_set(
+    const ia_css_rbm_t bitmap,
+    const unsigned int index)
+{
+    unsigned int elem_index;
+    unsigned int elem_bit_index;
+
+    IA_CSS_TRACE_0(RBM, VERBOSE,
+        "ia_css_is_rbm_set(): enter:\n");
+
+    assert(index < IA_CSS_RBM_BITS);
+
+    elem_index = index / IA_CSS_RBM_ELEM_BITS;
+    elem_bit_index = index % IA_CSS_RBM_ELEM_BITS;
+    assert(elem_index < IA_CSS_RBM_NOF_ELEMS);
+    return (((bitmap.data[elem_index] >> elem_bit_index) & 0x1) == 1);
+}
+
+STORAGE_CLASS_INLINE
+ia_css_rbm_t ia_css_rbm_shift(
+    const ia_css_rbm_t bitmap)
+{
+    int i;
+    unsigned int lsb_current_elem = 0;
+    unsigned int lsb_previous_elem = 0;
+    ia_css_rbm_t loc_bitmap;
+
+    IA_CSS_TRACE_0(RBM, VERBOSE,
+        "ia_css_rbm_shift(): enter:\n");
+
+    loc_bitmap = bitmap;
+
+    for (i = IA_CSS_RBM_NOF_ELEMS - 1; i >= 0; i--) {
+        lsb_current_elem = bitmap.data[i] & 0x01;
+        loc_bitmap.data[i] >>= 1;
+        loc_bitmap.data[i] |= (lsb_previous_elem << (IA_CSS_RBM_ELEM_BITS - 1));
+        lsb_previous_elem = lsb_current_elem;
+    }
+    return loc_bitmap;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+int ia_css_rbm_print(
+    const ia_css_rbm_t bitmap,
+    void               *fid)
+{
+    int i;
+    const IA_CSS_RBM_ELEM_TYPE *data = &bitmap.data[0];
+
+    NOT_USED(fid);
+
+    CT_ASSERT(IA_CSS_RBM_NOF_ELEMS > 0);
+    CT_ASSERT(IA_CSS_RBM_ELEM_BITS <= 32); /* because we print 32 bit integers */
+
+    if (IA_CSS_RBM_NOF_ELEMS == 1) {
+        IA_CSS_TRACE_1(RBM, INFO, "ia_css_rbm_print(): rbm: %08x\n",
+            data[0]);
+
+    } else if (IA_CSS_RBM_NOF_ELEMS == 2) {
+        IA_CSS_TRACE_2(RBM, INFO, "ia_css_rbm_print(): rbm: %08x %08x\n",
+            data[1], data[0]);
+
+    } else if (IA_CSS_RBM_NOF_ELEMS == 3) {
+        IA_CSS_TRACE_3(RBM, INFO, "ia_css_rbm_print(): rbm: %08x %08x %08x\n",
+            data[2], data[1], data[0]);
+
+    } else if (IA_CSS_RBM_NOF_ELEMS == 4) {
+        IA_CSS_TRACE_4(RBM, INFO, "ia_css_rbm_print(): rbm: %08x %08x %08x %08x\n",
+            data[3], data[2], data[1], data[0]);
+
+    } else {
+        IA_CSS_TRACE_0(RBM, INFO, "ia_css_rbm_print(): rbm: {\n");
+
+        for (i = IA_CSS_RBM_NOF_ELEMS - 1; i >= 0 ; i--) {
+            IA_CSS_TRACE_1(RBM, INFO, "\t%08x\n", data[i]);
+        }
+        IA_CSS_TRACE_0(RBM, INFO, "}\n");
+    }
+
+    return 0;
+}
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest.h
new file mode 100644
index 000000000000..3145e0e10f2e
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest.h
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_RBM_MANIFEST_H
+#define __IA_CSS_RBM_MANIFEST_H
+
+#include "type_support.h"
+#include "ia_css_rbm_manifest_types.h"
+
+/** Returns the descriptor size of the RBM manifest.
+ */
+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
+unsigned int
+ia_css_rbm_manifest_get_size(void);
+
+/** Initializes the RBM manifest.
+ * @param rbm[in] Routing bitmap.
+ */
+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
+void
+ia_css_rbm_manifest_init(struct ia_css_rbm_manifest_s *rbm);
+
+/** Returns a pointer to the array of mux descriptors.
+ * @param manifest[in] Routing bitmap manifest.
+ * @return NULL on error
+ */
+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
+ia_css_rbm_mux_desc_t *
+ia_css_rbm_manifest_get_muxes(const ia_css_rbm_manifest_t *manifest);
+
+/** Returns the size of mux descriptors array.
+ * @param manifest[in] Routing bitmap manifest.
+ * @return size
+ */
+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
+unsigned int
+ia_css_rbm_manifest_get_mux_count(const ia_css_rbm_manifest_t *manifest);
+
+/** Returns a pointer to the array of validation descriptors.
+ * @param manifest[in] Routing bitmap manifest.
+ * @return NULL on error
+ */
+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
+ia_css_rbm_validation_rule_t *
+ia_css_rbm_manifest_get_validation_rules(const ia_css_rbm_manifest_t *manifest);
+
+/** Returns the size of the validation descriptor array.
+ * @param manifest[in] Routing bitmap manifest.
+ * @return size
+ */
+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
+unsigned int
+ia_css_rbm_manifest_get_validation_rule_count(const ia_css_rbm_manifest_t *manifest);
+
+/** Returns a pointer to the array of terminal routing descriptors.
+ * @param manifest[in] Routing bitmap manifest.
+ * @return NULL on error
+ */
+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
+ia_css_rbm_terminal_routing_desc_t *
+ia_css_rbm_manifest_get_terminal_routing_desc(const ia_css_rbm_manifest_t *manifest);
+
+/** \brief Returns the size of the terminal routing descriptor array.
+ * Note: pretty printing differs from on host and on IPU.
+ * @param manifest[in] Routing bitmap manifest.
+ * @return size
+ */
+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
+unsigned int
+ia_css_rbm_manifest_get_terminal_routing_desc_count(const ia_css_rbm_manifest_t *manifest);
+
+/** Pretty prints the routing bitmap manifest.
+ * @param manifest[in] Routing bitmap manifest.
+ */
+void
+ia_css_rbm_manifest_print(const ia_css_rbm_manifest_t *manifest);
+
+/** \brief Pretty prints a RBM (routing bitmap).
+ * Note: pretty printing differs from on host and on IPU.
+ * @param rbm[in]             Routing bitmap.
+ * @param mux[in]             List of mux descriptors corresponding to rbm.
+ * @param mux_desc_count[in]  Number of muxes in list mux.
+ */
+void
+ia_css_rbm_pretty_print(
+    const ia_css_rbm_t *rbm,
+    const ia_css_rbm_mux_desc_t *mux,
+    unsigned int mux_desc_count);
+
+/** \brief check for the validity of a routing bitmap.
+ * @param manifest[in] Routing bitmap manifest.
+ * @param rbm[in]      Routing bitmap
+ * @return true on match.
+ */
+bool
+ia_css_rbm_manifest_check_rbm_validity(
+    const ia_css_rbm_manifest_t *manifest,
+    const ia_css_rbm_t *rbm);
+
+/** \brief sets, using manifest info, the value of a mux in the routing bitmap.
+ * @param rbm[in]             Routing bitmap.
+ * @param mux[in]             List of mux descriptors corresponding to rbm.
+ * @param mux_count[in]       Number of muxes in list mux.
+ * @param gp_dev_id[in]       ID of sub system (PSA/ISA) where the mux is located.
+ * @param mux_id[in]          ID of mux to set configuration for.
+ * @param value[in]           Value of the mux.
+ * @return routing bitmap.
+ */
+ia_css_rbm_t
+ia_css_rbm_set_mux(
+    ia_css_rbm_t rbm,
+    ia_css_rbm_mux_desc_t *mux,
+    unsigned int mux_count,
+    unsigned int gp_dev_id,
+    unsigned int mux_id,
+    unsigned int value);
+
+/** \brief Gets the value of a mux.
+ * @param rbm      routing bitmap
+ * @param mux_desc mux descriptor
+ * @return Mux value corresponding to mux_desc, -1 on error.
+ */
+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
+int
+ia_css_rbm_get_mux_value(
+    const ia_css_rbm_t *rbm,
+    const ia_css_rbm_mux_desc_t *mux_desc);
+
+#ifdef __IA_CSS_RBM_MANIFEST_INLINE__
+#include "ia_css_rbm_manifest_impl.h"
+#endif /* __IA_CSS_RBM_MANIFEST_INLINE__ */
+
+#endif /* __IA_CSS_RBM_MANIFEST_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest_types.h
new file mode 100644
index 000000000000..662b9ef342fb
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest_types.h
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_RBM_MANIFEST_TYPES_H
+#define __IA_CSS_RBM_MANIFEST_TYPES_H
+
+#include "ia_css_rbm.h"
+#include "vied_nci_psys_resource_model.h"
+
+#ifndef VIED_NCI_RBM_MAX_MUX_COUNT
+#error Please define VIED_NCI_RBM_MAX_MUX_COUNT
+#endif
+#ifndef VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT
+#error Please define VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT
+#endif
+#ifndef VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT
+#error Please define VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT
+#endif
+#ifndef N_PADDING_UINT8_IN_RBM_MANIFEST
+#error Please define N_PADDING_UINT8_IN_RBM_MANIFEST
+#endif
+
+#define SIZE_OF_RBM_MUX_DESC_S ( \
+    (4 * IA_CSS_UINT8_T_BITS))
+
+typedef struct ia_css_rbm_mux_desc_s {
+    uint8_t gp_dev_id;
+    uint8_t mux_id;
+    uint8_t offset;
+    uint8_t size_bits;
+} ia_css_rbm_mux_desc_t;
+
+#define SIZE_OF_RBM_VALIDATION_RULE_DESC_S ( \
+      (1 * IA_CSS_RBM_BITS) \
+    + (1 * IA_CSS_UINT32_T_BITS))
+
+typedef struct ia_css_rbm_validation_rule_s {
+    ia_css_rbm_t match; /* RBM is an array of 32 bit elements */
+    uint32_t expected_value;
+} ia_css_rbm_validation_rule_t;
+
+#define SIZE_OF_RBM_TERMINAL_ROUTING_DESC_S ( \
+    (4 * IA_CSS_UINT8_T_BITS))
+
+typedef struct ia_css_rbm_terminal_routing_desc_s {
+    uint8_t terminal_id;
+    uint8_t connection_state;
+    uint8_t mux_id;
+    uint8_t state;
+} ia_css_rbm_terminal_routing_desc_t;
+
+#define SIZE_OF_RBM_MANIFEST_S ( \
+      (VIED_NCI_RBM_MAX_MUX_COUNT * SIZE_OF_RBM_MUX_DESC_S) \
+    + (VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT * SIZE_OF_RBM_VALIDATION_RULE_DESC_S) \
+    + (VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT * SIZE_OF_RBM_TERMINAL_ROUTING_DESC_S) \
+    + (3 * IA_CSS_UINT16_T_BITS) \
+    + (N_PADDING_UINT8_IN_RBM_MANIFEST * IA_CSS_UINT8_T_BITS))
+
+typedef struct ia_css_rbm_manifest_s {
+#if VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT > 0
+    ia_css_rbm_validation_rule_t
+        validation_rules[VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT];
+#endif
+    uint16_t mux_desc_count;
+    uint16_t validation_rule_count;
+    uint16_t terminal_routing_desc_count;
+
+#if VIED_NCI_RBM_MAX_MUX_COUNT > 0
+    ia_css_rbm_mux_desc_t
+        mux_desc[VIED_NCI_RBM_MAX_MUX_COUNT];
+#endif
+
+#if VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT > 0
+    ia_css_rbm_terminal_routing_desc_t
+        terminal_routing_desc[VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT];
+#endif
+
+#if N_PADDING_UINT8_IN_RBM_MANIFEST > 0
+    uint8_t padding[N_PADDING_UINT8_IN_RBM_MANIFEST];
+#endif
+} ia_css_rbm_manifest_t;
+
+#endif /* __IA_CSS_RBM_MANIFEST_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_storage_class.h
new file mode 100644
index 000000000000..5f72bd1736f5
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_storage_class.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_RBM_STORAGE_CLASS_H
+#define __IA_CSS_RBM_STORAGE_CLASS_H
+
+#include "storage_class.h"
+
+#ifndef __IA_CSS_RBM_INLINE__
+#define IA_CSS_RBM_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
+#define IA_CSS_RBM_STORAGE_CLASS_C
+#else
+#define IA_CSS_RBM_STORAGE_CLASS_H STORAGE_CLASS_INLINE
+#define IA_CSS_RBM_STORAGE_CLASS_C STORAGE_CLASS_INLINE
+#endif
+
+#ifndef __IA_CSS_RBM_MANIFEST_INLINE__
+#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
+#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_C
+#else
+#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H STORAGE_CLASS_INLINE
+#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_C STORAGE_CLASS_INLINE
+#endif
+
+#endif /* __IA_CSS_RBM_STORAGE_CLASS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_trace.h
new file mode 100644
index 000000000000..80086ca502f8
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_trace.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_RBM_TRACE_H
+#define __IA_CSS_RBM_TRACE_H
+
+#include "ia_css_trace.h"
+
+/* Not using 0 to identify wrong configuration being passed from the .mk file outside.
+* Log levels not in the range below will cause a "No RBM_TRACE_CONFIG Tracing level defined"
+*/
+#define RBM_TRACE_LOG_LEVEL_OFF 1
+#define RBM_TRACE_LOG_LEVEL_NORMAL 2
+#define RBM_TRACE_LOG_LEVEL_DEBUG 3
+
+#define RBM_TRACE_CONFIG_DEFAULT RBM_TRACE_LOG_LEVEL_NORMAL
+
+#if !defined(RBM_TRACE_CONFIG)
+#    define RBM_TRACE_CONFIG RBM_TRACE_CONFIG_DEFAULT
+#endif
+
+/* IPU_RESOURCE Module tracing backend is mapped to TUNIT tracing for target platforms */
+#ifdef __HIVECC
+#    ifndef HRT_CSIM
+#        define RBM_TRACE_METHOD IA_CSS_TRACE_METHOD_TRACE
+#    else
+#        define RBM_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
+#    endif
+#else
+#    define RBM_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
+#endif
+
+#if (defined(RBM_TRACE_CONFIG))
+/* Module specific trace setting */
+#    if RBM_TRACE_CONFIG == RBM_TRACE_LOG_LEVEL_OFF
+/* RBM_TRACE_LOG_LEVEL_OFF */
+#        define RBM_TRACE_LEVEL_ASSERT    IA_CSS_TRACE_LEVEL_DISABLED
+#        define RBM_TRACE_LEVEL_ERROR    IA_CSS_TRACE_LEVEL_DISABLED
+#        define RBM_TRACE_LEVEL_WARNING    IA_CSS_TRACE_LEVEL_DISABLED
+#        define RBM_TRACE_LEVEL_INFO    IA_CSS_TRACE_LEVEL_DISABLED
+#        define RBM_TRACE_LEVEL_DEBUG    IA_CSS_TRACE_LEVEL_DISABLED
+#        define RBM_TRACE_LEVEL_VERBOSE    IA_CSS_TRACE_LEVEL_DISABLED
+#    elif RBM_TRACE_CONFIG == RBM_TRACE_LOG_LEVEL_NORMAL
+/* RBM_TRACE_LOG_LEVEL_NORMAL */
+#        define RBM_TRACE_LEVEL_ASSERT    IA_CSS_TRACE_LEVEL_DISABLED
+#        define RBM_TRACE_LEVEL_ERROR    IA_CSS_TRACE_LEVEL_ENABLED
+#        define RBM_TRACE_LEVEL_WARNING    IA_CSS_TRACE_LEVEL_DISABLED
+#        define RBM_TRACE_LEVEL_INFO    IA_CSS_TRACE_LEVEL_ENABLED
+#        define RBM_TRACE_LEVEL_DEBUG    IA_CSS_TRACE_LEVEL_DISABLED
+#        define RBM_TRACE_LEVEL_VERBOSE    IA_CSS_TRACE_LEVEL_DISABLED
+#    elif RBM_TRACE_CONFIG == RBM_TRACE_LOG_LEVEL_DEBUG
+/* RBM_TRACE_LOG_LEVEL_DEBUG */
+#        define RBM_TRACE_LEVEL_ASSERT    IA_CSS_TRACE_LEVEL_ENABLED
+#        define RBM_TRACE_LEVEL_ERROR    IA_CSS_TRACE_LEVEL_ENABLED
+#        define RBM_TRACE_LEVEL_WARNING    IA_CSS_TRACE_LEVEL_ENABLED
+#        define RBM_TRACE_LEVEL_INFO    IA_CSS_TRACE_LEVEL_ENABLED
+#        define RBM_TRACE_LEVEL_DEBUG    IA_CSS_TRACE_LEVEL_ENABLED
+#        define RBM_TRACE_LEVEL_VERBOSE    IA_CSS_TRACE_LEVEL_ENABLED
+#    else
+#        error "No RBM_TRACE_CONFIG Tracing level defined"
+#    endif
+#else
+#    error "RBM_TRACE_CONFIG not defined"
+#endif
+
+#endif /* __RBM_TRACE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal.h
new file mode 100644
index 000000000000..9959c01f6dcc
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal.h
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_TERMINAL_H
+#define __IA_CSS_TERMINAL_H
+
+#include "type_support.h"
+#include "ia_css_terminal_types.h"
+#include "ia_css_param_storage_class.h"
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_param_in_terminal_get_descriptor_size(
+    const unsigned int nof_sections
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_param_section_desc_t *
+ia_css_param_in_terminal_get_param_section_desc(
+    const ia_css_param_terminal_t *param_terminal,
+    const unsigned int section_index
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_param_out_terminal_get_descriptor_size(
+    const unsigned int nof_sections,
+    const unsigned int nof_fragments
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_param_section_desc_t *
+ia_css_param_out_terminal_get_param_section_desc(
+    const ia_css_param_terminal_t *param_terminal,
+    const unsigned int section_index,
+    const unsigned int nof_sections,
+    const unsigned int fragment_index
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+int ia_css_param_terminal_create(
+    ia_css_param_terminal_t *param_terminal,
+    const uint16_t terminal_offset,
+    const uint16_t terminal_size,
+    const uint16_t is_input_terminal
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_spatial_param_terminal_get_descriptor_size(
+    const unsigned int nof_frame_param_sections,
+    const unsigned int nof_fragments
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_fragment_grid_desc_t *
+ia_css_spatial_param_terminal_get_fragment_grid_desc(
+    const ia_css_spatial_param_terminal_t *spatial_param_terminal,
+    const unsigned int fragment_index
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_frame_grid_param_section_desc_t *
+ia_css_spatial_param_terminal_get_frame_grid_param_section_desc(
+    const ia_css_spatial_param_terminal_t *spatial_param_terminal,
+    const unsigned int section_index
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+int ia_css_spatial_param_terminal_create(
+    ia_css_spatial_param_terminal_t *spatial_param_terminal,
+    const uint16_t terminal_offset,
+    const uint16_t terminal_size,
+    const uint16_t is_input_terminal,
+    const unsigned int nof_fragments,
+    const uint32_t kernel_id
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_sliced_param_terminal_get_descriptor_size(
+    const unsigned int nof_slice_param_sections,
+    const unsigned int nof_slices[],
+    const unsigned int nof_fragments
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_fragment_slice_desc_t *
+ia_css_sliced_param_terminal_get_fragment_slice_desc(
+    const ia_css_sliced_param_terminal_t *sliced_param_terminal,
+    const unsigned int fragment_index
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_slice_param_section_desc_t *
+ia_css_sliced_param_terminal_get_slice_param_section_desc(
+    const ia_css_sliced_param_terminal_t *sliced_param_terminal,
+    const unsigned int fragment_index,
+    const unsigned int slice_index,
+    const unsigned int section_index,
+    const unsigned int nof_slice_param_sections
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+int ia_css_sliced_param_terminal_create(
+    ia_css_sliced_param_terminal_t *sliced_param_terminal,
+    const uint16_t terminal_offset,
+    const uint16_t terminal_size,
+    const uint16_t is_input_terminal,
+    const unsigned int nof_slice_param_sections,
+    const unsigned int nof_slices[],
+    const unsigned int nof_fragments,
+    const uint32_t kernel_id
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_program_terminal_get_descriptor_size(
+    const unsigned int nof_fragments,
+    const unsigned int nof_fragment_param_sections,
+    const unsigned int nof_kernel_fragment_sequencer_infos,
+    const unsigned int nof_command_objs
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_fragment_param_section_desc_t *
+ia_css_program_terminal_get_frgmnt_prm_sct_desc(
+    const ia_css_program_terminal_t *program_terminal,
+    const unsigned int fragment_index,
+    const unsigned int section_index,
+    const unsigned int nof_fragment_param_sections
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_kernel_fragment_sequencer_info_desc_t *
+ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
+    const ia_css_program_terminal_t *program_terminal,
+    const unsigned int fragment_index,
+    const unsigned int info_index,
+    const unsigned int nof_kernel_fragment_sequencer_infos
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+int ia_css_program_terminal_create(
+    ia_css_program_terminal_t *program_terminal,
+    const uint16_t terminal_offset,
+    const uint16_t terminal_size,
+    const unsigned int nof_fragments,
+    const unsigned int nof_kernel_fragment_sequencer_infos,
+    const unsigned int nof_command_objs
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+int ia_css_program_terminal_get_command_base_offset(
+    const ia_css_program_terminal_t *program_terminal,
+    const unsigned int nof_fragments,
+    const unsigned int nof_kernel_fragment_sequencer_infos,
+    const unsigned int commands_slots_used,
+    uint16_t *command_desc_offset
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+uint16_t *ia_css_program_terminal_get_line_count(
+    const ia_css_kernel_fragment_sequencer_command_desc_t
+    *kernel_fragment_sequencer_command_desc_base,
+    const unsigned int set_count
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_spatial_param_terminal_get_descriptor_size(
+    const unsigned int nof_frame_param_sections,
+    const unsigned int nof_fragments
+);
+
+#ifdef __INLINE_PARAMETERS__
+#include "ia_css_terminal_impl.h"
+#endif /* __INLINE_PARAMETERS__ */
+
+#endif /* __IA_CSS_TERMINAL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_base_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_base_types.h
new file mode 100644
index 000000000000..91dfc139ea9d
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_base_types.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_TERMINAL_BASE_TYPES_H
+#define __IA_CSS_TERMINAL_BASE_TYPES_H
+
+#include "type_support.h"
+#include "ia_css_terminal_defs.h"
+
+#define N_UINT16_IN_TERMINAL_STRUCT        3
+#define N_UINT32_IN_TERMINAL_STRUCT        1
+#define N_PADDING_UINT8_IN_TERMINAL_STRUCT    1
+
+#define SIZE_OF_TERMINAL_STRUCT_BITS \
+    (IA_CSS_TERMINAL_TYPE_BITS \
+    + N_UINT32_IN_TERMINAL_STRUCT * IA_CSS_UINT32_T_BITS \
+    + IA_CSS_TERMINAL_ID_BITS  \
+    + N_UINT16_IN_TERMINAL_STRUCT * IA_CSS_UINT16_T_BITS \
+    + N_PADDING_UINT8_IN_TERMINAL_STRUCT * IA_CSS_UINT8_T_BITS)
+
+/* ==================== Base Terminal - START ==================== */
+/** Base structure for all terminal types.
+ *
+ *  Terminals describe an opening between a program group and the outside world.
+ *  They come in various types (data, statisitics, parameters, etc.) which may have
+ *  extensions specific to those types.  This structure is the base for all of those and
+ *  must be the first field in any  subclassed terminal structure type.
+ */
+struct ia_css_terminal_s {                        /**< Base terminal */
+    ia_css_terminal_type_t            terminal_type;        /**< Type ID of the terminal.  This type enum defines the purpose of the terminal and its structure. */
+    uint32_t                payload_size;    /**< Size of buffer passed in buffer set for this terminal */
+    int16_t                    parent_offset;        /**< Offset to the containing process group */
+    uint16_t                size;            /**< Size of this whole terminal layout-structure, including subclassed extensions. */
+    uint16_t                tm_index;        /**< Index of the terminal manifest object in the program group manifest. */
+    ia_css_terminal_ID_t            ID;            /**< Absolute referal ID for this terminal, valid ID's != 0 */
+    uint8_t                    padding[N_PADDING_UINT8_IN_TERMINAL_STRUCT];
+};
+/* ==================== Base Terminal - END ==================== */
+
+#endif /* __IA_CSS_TERMINAL_BASE_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_defs.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_defs.h
new file mode 100644
index 000000000000..0766c323681f
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_defs.h
@@ -0,0 +1,209 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_TERMINAL_DEFS_H
+#define __IA_CSS_TERMINAL_DEFS_H
+
+#include "type_support.h"
+
+/**
+ * @addtogroup group_psysapi
+ * @{
+ */
+
+#define IA_CSS_TERMINAL_ID_BITS        8
+typedef uint8_t                ia_css_terminal_ID_t;
+#define IA_CSS_TERMINAL_INVALID_ID    ((ia_css_terminal_ID_t)(-1))
+
+/**
+ * Terminal category
+ *
+ * @todo New for IPU7 POC
+ */
+typedef enum ia_css_terminal_cat {
+    IA_CSS_TERMINAL_CAT_LOAD = 0, /**< Load terminal.  Payload is made of up segmented value blobs for register load. */
+    IA_CSS_TERMINAL_CAT_CONNECT, /**< Connect terminal.  Payload is a memory pointer. */
+    IA_CSS_TERMINAL_CAT_COUNT /**< Number of entries in this enumeration */
+} ia_css_terminal_cat_t;
+#define IA_CSS_TERMINAL_CAT_INVALID IA_CSS_TERMINAL_CAT_COUNT
+
+/**
+ * Terminal direction
+ *
+ * Direction is from the IPU perspective.  That is, "IN" is input consumed by IPU and "OUT" is
+ * output generated by IPU.
+ *
+ * @todo New for IPU7 POC
+ */
+typedef enum ia_css_terminal_dir {
+    IA_CSS_TERMINAL_DIR_IN = 0, /**< Input terminal. Input is consumed by IPU*/
+    IA_CSS_TERMINAL_DIR_OUT, /**< Output terminal. Output is generated by IPU */
+    IA_CSS_TERMINAL_DIR_COUNT /**< Number of entries in this enumeration */
+} ia_css_terminal_dir_t;
+#define IA_CSS_TERMINAL_DIR_INVALID IA_CSS_TERMINAL_DIR_COUNT
+
+/**
+ * Terminal Rate Of Update (ROU)
+ *
+ * Direction is from the IPU perspective.  That is, "IN" is input consumed by IPU and "OUT" is
+ * output generated by IPU.
+ *
+ * @todo New for IPU7 POC
+ */
+typedef enum ia_css_terminal_rou {
+    IA_CSS_TERMINAL_ROU_STREAM = 0, /**< Constant for all frames in a stream */
+    IA_CSS_TERMINAL_ROU_FRAME, /**< Constant for all fragments in a frame */
+    IA_CSS_TERMINAL_ROU_FRAG, /**< Requires update (i.e. not constant) for all fragments */
+    IA_CSS_TERMINAL_ROU_COUNT /**< Number of entries in this enumeration */
+} ia_css_terminal_rou_t;
+#define IA_CSS_TERMINAL_ROU_INVALID IA_CSS_TERMINAL_ROU_COUNT
+
+/**
+ * Connect terminal payload content type
+ *
+ * Defines the broad usage of the buffers defined in connect terminals
+ */
+typedef enum ia_css_connect_buf_type {
+    IA_CSS_CONNECT_BUF_TYPE_DATA = 0, /**< Image data */
+    IA_CSS_CONNECT_BUF_TYPE_META, /**< Meta data */
+    IA_CSS_CONNECT_BUF_TYPE_UNKNOWN, /**< Unknown or irrelevant (e.g. load terminal) */
+    IA_CSS_CONNECT_BUF_TYPE_COUNT /**< Number of entries in this enumeration */
+} ia_css_connect_buf_type_t;
+
+/** Unknown or irrelevant buffer type */
+#define IA_CSS_CONNECT_BUF_TYPE_INVALID IA_CSS_CONNECT_BUF_TYPE_COUNT
+
+/**
+ * Terminal type identifier
+ *
+ * @note  Will be superseded by  ia_css_terminal_cat_t, ia_css_terminal_dir_t, ia_css_terminal_rou_t,
+ * and ia_css_connect_buf_type_t
+ * To stage the changes, this type will remain - for now...
+ *
+ * Inital type to attribute mapping table for staging:
+ * ia_css_terminal_type_t                    | ia_css_terminal_cat_t | ia_css_terminal_dir_t | ia_css_terminal_rou_t | ia_css_connect_buf_type_t    | notes
+ * ----------------------------------------- | --------------------- | --------------------- | --------------------- | ---------------------------- | -----
+ * IA_CSS_TERMINAL_TYPE_DATA_IN              | CAT_CONNECT           | DIR_IN                | ROU_FRAG?             | BUF_TYPE_DATA                | Fragment handling unclear
+ * IA_CSS_TERMINAL_TYPE_DATA_OUT             | CAT_CONNECT           | DIR_OUT               | ROU_FRAG?             | BUF_TYPE_DATA                | Fragment handling unclear
+ * IA_CSS_TERMINAL_TYPE_PARAM_STREAM         | OBSOLETE              | OBSOLETE              | OBSOLETE              | OBSOLETE                     | *No meaningful use found in FW*
+ * IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN      | CAT_LOAD              | DIR_IN                | ROU_FRAME             | BUF_TYPE_UNKNOWN (load term) |
+ * IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT     | CAT_LOAD              | DIR_OUT               | ROU_FRAME             | BUF_TYPE_UNKNOWN (load term) |
+ * IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN     | CAT_CONNECT           | DIR_IN                | ROU_FRAME             | BUF_TYPE_META                |
+ * IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT    | CAT_CONNECT           | DIR_OUT               | ROU_FRAME             | BUF_TYPE_META                |
+ * IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN      | CAT_LOAD              | DIR_IN                | ROU_FRAME?            | BUF_TYPE_UNKNOWN (load term) | Usage unclear
+ * IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT     | CAT_LOAD              | DIR_OUT               | ROU_FRAME?            | BUF_TYPE_UNKNOWN (load term) | Usage unclear
+ * IA_CSS_TERMINAL_TYPE_STATE_IN             | OBSOLETE              | OBSOLETE              | OBSOLETE              | OBSOLETE                     | *No meaningful use found in FW*
+ * IA_CSS_TERMINAL_TYPE_STATE_OUT            | OBSOLETE              | OBSOLETE              | OBSOLETE              | OBSOLETE                     | *No meaningful use found in FW*
+ * IA_CSS_TERMINAL_TYPE_PROGRAM              | CAT_LOAD              | DIR_IN                | ROU_FRAG              | BUF_TYPE_UNKNOWN (load term) |
+ * IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT | CAT_LOAD - see note   | DIR_IN                | ROU_STREAM - see note | BUF_TYPE_UNKNOWN (load term) | Belongs to FW team.  Used to have both load and connect sections.  Currently calculated based on PPG terminal information, and not buffer set.
+ */
+typedef enum ia_css_terminal_type {
+    /** Data input */
+    IA_CSS_TERMINAL_TYPE_DATA_IN = 0,
+    /** Data output */
+    IA_CSS_TERMINAL_TYPE_DATA_OUT,
+    /** Type 6 parameter input */
+    IA_CSS_TERMINAL_TYPE_PARAM_STREAM,
+    /** Type 1-5 parameter input.  Constant for all fragments in a frame. */
+    IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN,
+    /** Type 1-5 parameter output */
+    IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT,
+    /** Represent the new type of terminal for the
+     * "spatial dependent parameters", when params go in
+     */
+    IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN,
+    /** Represent the new type of terminal for the
+     * "spatial dependent parameters", when params go out
+     */
+    IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT,
+    /** Represent the new type of terminal for the
+     * explicit slicing, when params go in
+     */
+    IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN,
+    /** Represent the new type of terminal for the
+     * explicit slicing, when params go out
+     */
+    IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT,
+    /** State (private data) input */
+    IA_CSS_TERMINAL_TYPE_STATE_IN,
+    /** State (private data) output */
+    IA_CSS_TERMINAL_TYPE_STATE_OUT,
+    /** Program parameters, may change per fragment */
+    IA_CSS_TERMINAL_TYPE_PROGRAM,
+    /** Program control parameters.  Non-alogrithmic parameters for system devices. */
+    IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT,
+    IA_CSS_N_TERMINAL_TYPES
+} ia_css_terminal_type_t;
+
+#define IA_CSS_TERMINAL_TYPE_BITS                32
+
+/* Temporary redirection needed to facilicate merging with the drivers
+   in a backwards compatible manner */
+#define IA_CSS_TERMINAL_TYPE_PARAM_CACHED IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN
+
+/**
+ * Dimensions of the data objects. Note that a C-style
+ * data order is assumed. Data stored by row.
+ */
+typedef enum ia_css_dimension {
+    /** The number of columns, i.e. the size of the row */
+    IA_CSS_COL_DIMENSION = 0,
+    /** The number of rows, i.e. the size of the column */
+    IA_CSS_ROW_DIMENSION = 1,
+    IA_CSS_N_DATA_DIMENSION = 2
+} ia_css_dimension_t;
+
+#define IA_CSS_N_COMMAND_COUNT (4)
+
+#ifndef PIPE_GENERATION
+/* Don't include these complex enum structures in Genpipe, it can't handle and it does not need them */
+/**
+ * enum ia_css_isys_link_id. Lists the link IDs used by the FW for On The Fly feature
+ */
+typedef enum ia_css_isys_link_id {
+    IA_CSS_ISYS_LINK_OFFLINE = 0,
+    IA_CSS_ISYS_LINK_MAIN_OUTPUT = 1,
+    IA_CSS_ISYS_LINK_PDAF_OUTPUT = 2
+} ia_css_isys_link_id_t;
+#define N_IA_CSS_ISYS_LINK_ID    (IA_CSS_ISYS_LINK_PDAF_OUTPUT + 1)
+
+/**
+ * enum ia_css_data_barrier_link_id. Lists the link IDs used by the FW for data barrier feature
+ */
+typedef enum ia_css_data_barrier_link_id {
+    IA_CSS_DATA_BARRIER_LINK_MEMORY_0 = N_IA_CSS_ISYS_LINK_ID,
+    IA_CSS_DATA_BARRIER_LINK_MEMORY_1,
+    IA_CSS_DATA_BARRIER_LINK_MEMORY_2,
+    IA_CSS_DATA_BARRIER_LINK_MEMORY_3,
+    IA_CSS_DATA_BARRIER_LINK_MEMORY_4,
+    N_IA_CSS_DATA_BARRIER_LINK_ID
+} ia_css_data_barrier_link_id_t;
+
+/**
+ * enum ia_css_stream2gen_link_id. Lists the link IDs used by the FW for streaming to GEN
+ * support.
+ */
+typedef enum ia_css_stream2gen_link_id {
+    IA_CSS_STREAM2GEN_LINK_ID_0 = N_IA_CSS_DATA_BARRIER_LINK_ID,
+    IA_CSS_STREAM2GEN_LINK_ID_1,
+    IA_CSS_STREAM2GEN_LINK_ID_2,
+    IA_CSS_STREAM2GEN_LINK_ID_3,
+    N_IA_CSS_STREAM2GEN_LINK_ID
+} ia_css_stream2gen_link_id_t;
+
+#endif /* #ifndef PIPE_GENERATION */
+/** @} */
+#endif /* __IA_CSS_TERMINAL_DEFS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_impl.h
new file mode 100644
index 000000000000..ff6ff35c5bb8
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_impl.h
@@ -0,0 +1,497 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_TERMINAL_IMPL_H
+#define __IA_CSS_TERMINAL_IMPL_H
+
+#include "ia_css_terminal.h"
+#include "ia_css_terminal_types.h"
+#include "error_support.h"
+#include "assert_support.h"
+#include "storage_class.h"
+#include "misc_support.h" /* for NOT_USED */
+
+/* Param Terminal */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+unsigned int ia_css_param_in_terminal_get_descriptor_size(
+    const unsigned int nof_sections)
+{
+    return sizeof(ia_css_param_terminal_t) +
+        nof_sections*sizeof(ia_css_param_section_desc_t);
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_param_section_desc_t *ia_css_param_in_terminal_get_param_section_desc(
+    const ia_css_param_terminal_t *param_terminal,
+    const unsigned int section_index)
+{
+    ia_css_param_section_desc_t *param_section_base;
+    ia_css_param_section_desc_t *param_section_desc = NULL;
+
+    verifjmpexit(param_terminal != NULL);
+
+    param_section_base =
+        (ia_css_param_section_desc_t *)
+        (((const char *)param_terminal) +
+                param_terminal->param_section_desc_offset);
+    param_section_desc = &(param_section_base[section_index]);
+
+EXIT:
+    return param_section_desc;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+unsigned int ia_css_param_out_terminal_get_descriptor_size(
+    const unsigned int nof_sections,
+    const unsigned int nof_fragments)
+{
+    return sizeof(ia_css_param_terminal_t) +
+        nof_fragments*nof_sections*sizeof(ia_css_param_section_desc_t);
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_param_section_desc_t *ia_css_param_out_terminal_get_param_section_desc(
+    const ia_css_param_terminal_t *param_terminal,
+    const unsigned int section_index,
+    const unsigned int nof_sections,
+    const unsigned int fragment_index)
+{
+    ia_css_param_section_desc_t *param_section_base;
+    ia_css_param_section_desc_t *param_section_desc = NULL;
+
+    verifjmpexit(param_terminal != NULL);
+
+    param_section_base =
+        (ia_css_param_section_desc_t *)
+            (((const char *)param_terminal) +
+                param_terminal->param_section_desc_offset);
+    param_section_desc =
+        &(param_section_base[(nof_sections * fragment_index) +
+                section_index]);
+
+EXIT:
+    return param_section_desc;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+int ia_css_param_terminal_create(
+    ia_css_param_terminal_t *param_terminal,
+    const uint16_t terminal_offset,
+    const uint16_t terminal_size,
+    const uint16_t is_input_terminal)
+{
+    if (param_terminal == NULL) {
+        return -EFAULT;
+    }
+
+    if (terminal_offset > (1<<15)) {
+        return -EINVAL;
+    }
+
+    param_terminal->base.terminal_type =
+        is_input_terminal ?
+        IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN :
+        IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT;
+    param_terminal->base.parent_offset =
+        0 - ((int16_t)terminal_offset);
+    param_terminal->base.size = terminal_size;
+    param_terminal->param_section_desc_offset =
+        sizeof(ia_css_param_terminal_t);
+
+    return 0;
+}
+
+/* Spatial Param Terminal */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+unsigned int ia_css_spatial_param_terminal_get_descriptor_size(
+    const unsigned int nof_frame_param_sections,
+    const unsigned int nof_fragments)
+{
+    return sizeof(ia_css_spatial_param_terminal_t) +
+        nof_frame_param_sections * sizeof(
+                ia_css_frame_grid_param_section_desc_t) +
+        nof_fragments * sizeof(ia_css_fragment_grid_desc_t);
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_fragment_grid_desc_t *
+ia_css_spatial_param_terminal_get_fragment_grid_desc(
+    const ia_css_spatial_param_terminal_t *spatial_param_terminal,
+    const unsigned int fragment_index)
+{
+    ia_css_fragment_grid_desc_t *fragment_grid_desc_base;
+    ia_css_fragment_grid_desc_t *fragment_grid_desc = NULL;
+
+    verifjmpexit(spatial_param_terminal != NULL);
+
+    fragment_grid_desc_base =
+        (ia_css_fragment_grid_desc_t *)
+            (((const char *)spatial_param_terminal) +
+            spatial_param_terminal->fragment_grid_desc_offset);
+    fragment_grid_desc = &(fragment_grid_desc_base[fragment_index]);
+
+EXIT:
+    return fragment_grid_desc;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_frame_grid_param_section_desc_t *
+ia_css_spatial_param_terminal_get_frame_grid_param_section_desc(
+    const ia_css_spatial_param_terminal_t *spatial_param_terminal,
+    const unsigned int section_index)
+{
+    ia_css_frame_grid_param_section_desc_t *
+        frame_grid_param_section_base;
+    ia_css_frame_grid_param_section_desc_t *
+        frame_grid_param_section_desc = NULL;
+
+    verifjmpexit(spatial_param_terminal != NULL);
+
+    frame_grid_param_section_base =
+        (ia_css_frame_grid_param_section_desc_t *)
+            (((const char *)spatial_param_terminal) +
+        spatial_param_terminal->frame_grid_param_section_desc_offset);
+    frame_grid_param_section_desc =
+        &(frame_grid_param_section_base[section_index]);
+
+EXIT:
+    return frame_grid_param_section_desc;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+int ia_css_spatial_param_terminal_create(
+    ia_css_spatial_param_terminal_t *spatial_param_terminal,
+    const uint16_t terminal_offset,
+    const uint16_t terminal_size,
+    const uint16_t is_input_terminal,
+    const unsigned int nof_fragments,
+    const uint32_t kernel_id)
+{
+    if (spatial_param_terminal == NULL) {
+        return -EFAULT;
+    }
+
+    if (terminal_offset > (1<<15)) {
+        return -EINVAL;
+    }
+
+    spatial_param_terminal->base.terminal_type =
+        is_input_terminal ?
+        IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN :
+        IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT;
+    spatial_param_terminal->base.parent_offset =
+        0 - ((int16_t)terminal_offset);
+    spatial_param_terminal->base.size = terminal_size;
+    spatial_param_terminal->kernel_id = kernel_id;
+    spatial_param_terminal->fragment_grid_desc_offset =
+        sizeof(ia_css_spatial_param_terminal_t);
+    spatial_param_terminal->frame_grid_param_section_desc_offset =
+        spatial_param_terminal->fragment_grid_desc_offset +
+        (nof_fragments * sizeof(ia_css_fragment_grid_desc_t));
+
+    return 0;
+}
+
+/* Sliced terminal */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+unsigned int ia_css_sliced_param_terminal_get_descriptor_size(
+    const unsigned int nof_slice_param_sections,
+    const unsigned int nof_slices[],
+    const unsigned int nof_fragments)
+{
+    unsigned int descriptor_size = 0;
+    unsigned int fragment_index;
+    unsigned int nof_slices_total = 0;
+
+    verifjmpexit(nof_slices != NULL);
+
+    for (fragment_index = 0;
+            fragment_index < nof_fragments; fragment_index++) {
+        nof_slices_total += nof_slices[fragment_index];
+    }
+
+    descriptor_size =
+        sizeof(ia_css_sliced_param_terminal_t) +
+        nof_fragments*sizeof(ia_css_fragment_slice_desc_t) +
+        nof_slices_total*nof_slice_param_sections*sizeof(
+            ia_css_fragment_param_section_desc_t);
+
+EXIT:
+    return descriptor_size;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_fragment_slice_desc_t *
+ia_css_sliced_param_terminal_get_fragment_slice_desc(
+    const ia_css_sliced_param_terminal_t *sliced_param_terminal,
+    const unsigned int fragment_index
+)
+{
+    ia_css_fragment_slice_desc_t *fragment_slice_desc_base;
+    ia_css_fragment_slice_desc_t *fragment_slice_desc = NULL;
+
+    verifjmpexit(sliced_param_terminal != NULL);
+
+    fragment_slice_desc_base =
+        (ia_css_fragment_slice_desc_t *)
+            (((const char *)sliced_param_terminal) +
+            sliced_param_terminal->fragment_slice_desc_offset);
+    fragment_slice_desc = &(fragment_slice_desc_base[fragment_index]);
+
+EXIT:
+    return fragment_slice_desc;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_slice_param_section_desc_t *
+ia_css_sliced_param_terminal_get_slice_param_section_desc(
+    const ia_css_sliced_param_terminal_t *sliced_param_terminal,
+    const unsigned int fragment_index,
+    const unsigned int slice_index,
+    const unsigned int section_index,
+    const unsigned int nof_slice_param_sections)
+{
+    ia_css_fragment_slice_desc_t *fragment_slice_desc;
+    ia_css_slice_param_section_desc_t *slice_param_section_desc_base;
+    ia_css_slice_param_section_desc_t *slice_param_section_desc = NULL;
+
+    fragment_slice_desc =
+        ia_css_sliced_param_terminal_get_fragment_slice_desc(
+            sliced_param_terminal,
+            fragment_index
+            );
+    verifjmpexit(fragment_slice_desc != NULL);
+
+    slice_param_section_desc_base =
+        (ia_css_slice_param_section_desc_t *)
+        (((const char *)sliced_param_terminal) +
+        fragment_slice_desc->slice_section_desc_offset);
+    slice_param_section_desc =
+        &(slice_param_section_desc_base[(
+            slice_index * nof_slice_param_sections) +
+                section_index]);
+
+EXIT:
+    return slice_param_section_desc;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+int ia_css_sliced_param_terminal_create(
+    ia_css_sliced_param_terminal_t *sliced_param_terminal,
+    const uint16_t terminal_offset,
+    const uint16_t terminal_size,
+    const uint16_t is_input_terminal,
+    const unsigned int nof_slice_param_sections,
+    const unsigned int nof_slices[],
+    const unsigned int nof_fragments,
+    const uint32_t kernel_id)
+{
+    unsigned int fragment_index;
+    unsigned int nof_slices_total = 0;
+
+    if (sliced_param_terminal == NULL) {
+        return -EFAULT;
+    }
+
+    if (terminal_offset > (1<<15)) {
+        return -EINVAL;
+    }
+
+    sliced_param_terminal->base.terminal_type =
+        is_input_terminal ?
+        IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN :
+        IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT;
+    sliced_param_terminal->base.parent_offset =
+        0 - ((int16_t)terminal_offset);
+    sliced_param_terminal->base.size = terminal_size;
+    sliced_param_terminal->kernel_id = kernel_id;
+    /* set here to use below to find the pointer */
+    sliced_param_terminal->fragment_slice_desc_offset =
+        sizeof(ia_css_sliced_param_terminal_t);
+    for (fragment_index = 0;
+            fragment_index < nof_fragments; fragment_index++) {
+        ia_css_fragment_slice_desc_t *fragment_slice_desc =
+            ia_css_sliced_param_terminal_get_fragment_slice_desc(
+                sliced_param_terminal,
+                fragment_index);
+        /*
+         * Error handling not required at this point
+         * since everything has been constructed/validated just above
+         */
+        fragment_slice_desc->slice_count = nof_slices[fragment_index];
+        fragment_slice_desc->slice_section_desc_offset =
+            sliced_param_terminal->fragment_slice_desc_offset +
+            (nof_fragments * sizeof(
+                    ia_css_fragment_slice_desc_t)) +
+            (nof_slices_total * nof_slice_param_sections * sizeof(
+                    ia_css_slice_param_section_desc_t));
+        nof_slices_total += nof_slices[fragment_index];
+    }
+
+    return 0;
+}
+
+/* Program terminal */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+unsigned int ia_css_program_terminal_get_descriptor_size(
+    const unsigned int nof_fragments,
+    const unsigned int nof_fragment_param_sections,
+    const unsigned int nof_kernel_fragment_sequencer_infos,
+    const unsigned int nof_command_objs)
+{
+    /*only one fragment used*/
+    return sizeof(ia_css_program_terminal_t) +
+        nof_fragment_param_sections *
+        sizeof(ia_css_fragment_param_section_desc_t) +
+        nof_fragments * nof_kernel_fragment_sequencer_infos *
+        sizeof(ia_css_kernel_fragment_sequencer_info_desc_t) +
+        nof_command_objs * sizeof(
+            ia_css_kernel_fragment_sequencer_command_desc_t);
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_fragment_param_section_desc_t *
+ia_css_program_terminal_get_frgmnt_prm_sct_desc(
+    const ia_css_program_terminal_t *program_terminal,
+    const unsigned int fragment_index,
+    const unsigned int section_index,
+    const unsigned int nof_fragment_param_sections)
+{
+    ia_css_fragment_param_section_desc_t *
+        fragment_param_section_desc_base;
+    ia_css_fragment_param_section_desc_t *
+        fragment_param_section_desc = NULL;
+    NOT_USED(fragment_index);
+
+    verifjmpexit(program_terminal != NULL);
+    verifjmpexit(section_index < nof_fragment_param_sections);
+
+    fragment_param_section_desc_base =
+        (ia_css_fragment_param_section_desc_t *)
+            (((const char *)program_terminal) +
+            program_terminal->fragment_param_section_desc_offset);
+    fragment_param_section_desc = &(fragment_param_section_desc_base[section_index]);
+EXIT:
+    return fragment_param_section_desc;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_kernel_fragment_sequencer_info_desc_t *
+ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
+    const ia_css_program_terminal_t *program_terminal,
+    const unsigned int fragment_index,
+    const unsigned int info_index,
+    const unsigned int nof_kernel_fragment_sequencer_infos)
+{
+    ia_css_kernel_fragment_sequencer_info_desc_t *
+        kernel_fragment_sequencer_info_desc_base;
+    ia_css_kernel_fragment_sequencer_info_desc_t *
+        kernel_fragment_sequencer_info_desc = NULL;
+
+    verifjmpexit(program_terminal != NULL);
+    if (nof_kernel_fragment_sequencer_infos > 0) {
+        verifjmpexit(info_index < nof_kernel_fragment_sequencer_infos);
+    }
+
+    kernel_fragment_sequencer_info_desc_base =
+        (ia_css_kernel_fragment_sequencer_info_desc_t *)
+        (((const char *)program_terminal) +
+        program_terminal->kernel_fragment_sequencer_info_desc_offset);
+    kernel_fragment_sequencer_info_desc =
+        &(kernel_fragment_sequencer_info_desc_base[(fragment_index *
+            nof_kernel_fragment_sequencer_infos) + info_index]);
+
+EXIT:
+    return kernel_fragment_sequencer_info_desc;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+int ia_css_program_terminal_create(
+    ia_css_program_terminal_t *program_terminal,
+    const uint16_t terminal_offset,
+    const uint16_t terminal_size,
+    const unsigned int nof_fragments,
+    const unsigned int nof_kernel_fragment_sequencer_infos,
+    const unsigned int nof_command_objs)
+{
+    if (program_terminal == NULL) {
+        return -EFAULT;
+    }
+
+    if (terminal_offset > (1<<15)) {
+        return -EINVAL;
+    }
+
+    program_terminal->base.terminal_type = IA_CSS_TERMINAL_TYPE_PROGRAM;
+    program_terminal->base.parent_offset = 0-((int16_t)terminal_offset);
+    program_terminal->base.size = terminal_size;
+    program_terminal->kernel_fragment_sequencer_info_desc_offset =
+        sizeof(ia_css_program_terminal_t);
+    program_terminal->fragment_param_section_desc_offset =
+        program_terminal->kernel_fragment_sequencer_info_desc_offset +
+        (nof_fragments * nof_kernel_fragment_sequencer_infos *
+        sizeof(ia_css_kernel_fragment_sequencer_info_desc_t)) +
+        (nof_command_objs * sizeof(
+            ia_css_kernel_fragment_sequencer_command_desc_t));
+
+    return 0;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+int ia_css_program_terminal_get_command_base_offset(
+    const ia_css_program_terminal_t *program_terminal,
+    const unsigned int nof_fragments,
+    const unsigned int nof_kernel_fragment_sequencer_infos,
+    const unsigned int commands_slots_used,
+    uint16_t *command_desc_offset)
+{
+    if (command_desc_offset == NULL) {
+        return -EFAULT;
+    }
+
+    *command_desc_offset = 0;
+
+    if (program_terminal == NULL) {
+        return -EFAULT;
+    }
+
+    *command_desc_offset =
+        program_terminal->kernel_fragment_sequencer_info_desc_offset +
+        (nof_fragments * nof_kernel_fragment_sequencer_infos *
+        sizeof(ia_css_kernel_fragment_sequencer_info_desc_t)) +
+        (commands_slots_used * sizeof(
+            ia_css_kernel_fragment_sequencer_command_desc_t));
+
+    return 0;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint16_t *ia_css_program_terminal_get_line_count(
+    const ia_css_kernel_fragment_sequencer_command_desc_t
+    *kernel_fragment_sequencer_command_desc_base,
+    const unsigned int set_count)
+{
+    uint16_t *line_count = NULL;
+
+    verifjmpexit(kernel_fragment_sequencer_command_desc_base != NULL);
+    line_count =
+        (uint16_t *)&(kernel_fragment_sequencer_command_desc_base[
+            set_count >> 2].line_count[set_count & 0x00000003]);
+EXIT:
+    return line_count;
+}
+
+#endif /* __IA_CSS_TERMINAL_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest.h
new file mode 100644
index 000000000000..1868b15708b7
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest.h
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_TERMINAL_MANIFEST_H
+#define __IA_CSS_TERMINAL_MANIFEST_H
+
+#include "type_support.h"
+#include "ia_css_param_storage_class.h"
+#include "ia_css_terminal_manifest_types.h"
+
+#define MANIFEST_SECTION_DESC_KERNEL_ID_MASK     0xFF
+#define MANIFEST_SECTION_DESC_KERNEL_ID_OFFSET   0
+#define MANIFEST_SECTION_DESC_REGION_ID_MASK     0xF
+#define MANIFEST_SECTION_DESC_REGION_ID_OFFSET   8
+#define MANIFEST_SECTION_DESC_MEM_TYPE_ID_MASK   0xF
+#define MANIFEST_SECTION_DESC_MEM_TYPE_ID_OFFSET 12
+
+/** Returns the size in bytes required to store this
+ *  terminal's manifest entry.
+ *
+ *  Used as part of binary manifest generation. It helps
+ *  to determine the amount of memory required
+ *  to store a parameter terminal manifest entry for
+ *  allocation before initialization
+ *
+ *  @param [in] nof_sections Number of sections (==
+ *  number of descriptors)
+ *
+ *  @return Size in bytes required for an entry.
+ */
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_param_terminal_manifest_get_size(
+    const unsigned int nof_sections
+);
+
+/** Initialize a parameter terminal manifest entry.
+ *
+ *  Used as part of binary manifest generation.
+ *
+ *  @param param_terminal Terminal entry to initialize.  Must
+ *  have been allocated with the size determined by
+ *  ia_css_param_terminal_manifest_get_size().
+ *
+ *  @return 0 on success, -EFAULT if param_terminal is NULL.
+ */
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+int ia_css_param_terminal_manifest_init(
+    ia_css_param_terminal_manifest_t *param_terminal,
+    const uint16_t section_count
+);
+
+/** Returns a section descriptor for a parameter terminal.
+ *
+ *  @param param_terminal_manifest Parameter terminal manifest handle
+ *  @param section_index Index of descriptor.  Must be smaller than the
+ *  value returned by ia_css_param_terminal_manifest_get_prm_sct_desc_count()
+ *
+ *  @return Pointer to a descriptor structure
+ */
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_param_manifest_section_desc_t *
+ia_css_param_terminal_manifest_get_prm_sct_desc(
+    const ia_css_param_terminal_manifest_t *param_terminal_manifest,
+    const unsigned int section_index
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_spatial_param_terminal_manifest_get_size(
+    const unsigned int nof_frame_param_sections
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+int ia_css_spatial_param_terminal_manifest_init(
+    ia_css_spatial_param_terminal_manifest_t *spatial_param_terminal,
+    const uint16_t section_count
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_frame_grid_param_manifest_section_desc_t *
+ia_css_spatial_param_terminal_manifest_get_frm_grid_prm_sct_desc(
+    const ia_css_spatial_param_terminal_manifest_t *
+        spatial_param_terminal_manifest,
+    const unsigned int section_index
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_sliced_param_terminal_manifest_get_size(
+    const unsigned int nof_slice_param_sections
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+int ia_css_sliced_param_terminal_manifest_init(
+    ia_css_sliced_param_terminal_manifest_t *sliced_param_terminal,
+    const uint16_t section_count
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_sliced_param_manifest_section_desc_t *
+ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
+    const ia_css_sliced_param_terminal_manifest_t *
+        sliced_param_terminal_manifest,
+    const unsigned int section_index
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_program_terminal_manifest_get_size(
+    const unsigned int nof_fragment_param_sections,
+    const unsigned int nof_kernel_fragment_sequencer_infos
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+int ia_css_program_terminal_manifest_init(
+    ia_css_program_terminal_manifest_t *program_terminal,
+    const uint16_t fragment_param_section_count,
+    const uint16_t kernel_fragment_seq_info_section_count
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_fragment_param_manifest_section_desc_t *
+ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
+    const ia_css_program_terminal_manifest_t *program_terminal_manifest,
+    const unsigned int section_index
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
+ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc(
+    const ia_css_program_terminal_manifest_t *program_terminal_manifest,
+    const unsigned int info_index
+);
+
+/*! Getter for kernel id
+
+  The function return the kernel id
+  field from the section
+  This field shouldn't accessed directly
+  only with the getter function
+ @param    [in] param manifest section desc
+
+ @return kernel_id
+ */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C uint8_t
+ia_css_param_manifest_section_desc_get_kernel_id(
+    const ia_css_param_manifest_section_desc_t *section);
+
+/*! Getter for  region_id
+
+  The function return the region_id
+  field from the section
+  This field shouldn't accessed directly
+  only with the getter function
+ @param    [in] param manifest section desc
+
+ @return region_id
+ */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_param_manifest_section_desc_get_region_id(
+    const ia_css_param_manifest_section_desc_t *section);
+
+/*! Getter for mem_type_id
+
+  The function return the mem_type_id
+  field from the section
+  This field shouldn't accessed directly
+  only with the getter function
+ @param    [in] param manifest section desc
+
+ @return mem_type_id
+ */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_param_manifest_section_desc_get_mem_type_id(
+    const ia_css_param_manifest_section_desc_t *section);
+
+/*! Getter for kernel id
+
+  The function return the kernel id
+  field from the section
+  This field shouldn't accessed directly
+  only with the getter function
+ @param    [in] fragment manifest section desc
+
+ @return kernel_id
+ */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_fragment_param_manifest_section_desc_get_kernel_id(
+    const ia_css_fragment_param_manifest_section_desc_t *section);
+
+/*! Getter for  region_id
+
+  The function return the region_id
+  field from the section
+  This field shouldn't accessed directly
+  only with the getter function
+ @param    [in] fragment manifest section desc
+
+ @return region_id
+ */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_fragment_param_manifest_section_desc_get_region_id(
+    const ia_css_fragment_param_manifest_section_desc_t *section);
+
+/*! Getter for mem_type_id
+
+  The function return the mem_type_id
+  field from the section
+  This field shouldn't accessed directly
+  only with the getter function
+ @param    [in] fragment manifest section desc
+
+ @return mem_type_id
+ */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_fragment_param_manifest_section_desc_get_mem_type_id(
+    const ia_css_fragment_param_manifest_section_desc_t *section);
+
+#ifdef __INLINE_PARAMETERS__
+#include "ia_css_terminal_manifest_impl.h"
+#endif /* __INLINE_PARAMETERS__ */
+
+#endif /* __IA_CSS_TERMINAL_MANIFEST_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_base_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_base_types.h
new file mode 100644
index 000000000000..bf4f46c80b91
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_base_types.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_TERMINAL_MANIFEST_BASE_TYPES_H
+#define __IA_CSS_TERMINAL_MANIFEST_BASE_TYPES_H
+
+#include "ia_css_terminal_defs.h"
+
+/**
+ * @addtogroup group_psysapi
+ * @{
+ */
+
+typedef struct ia_css_terminal_manifest_attributes_t {
+    uint16_t category:1; /**< load vs. connect.  @see ia_css_terminal_cat_t */
+    uint16_t direction:1; /**< input vs. output. @see ia_css_terminal_dir_t */
+    uint16_t rou:2; /**< Rate Of Update.  @see ia_css_terminal_rou_t */
+    uint16_t connect_buf_type:2; /**< image data vs. meta-data. @see ia_css_connect_buf_type_t */
+    uint16_t reserved:10;
+    } ia_css_terminal_manifest_attributes_t;
+#define IA_CSS_TERMINAL_ATTRIBUTE_BITS IA_CSS_UINT16_T_BITS
+
+#define N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT    0
+#define SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
+    (IA_CSS_TERMINAL_TYPE_BITS \
+    + IA_CSS_UINT32_T_BITS \
+    + IA_CSS_UINT16_T_BITS \
+    + IA_CSS_UINT16_T_BITS \
+    + IA_CSS_TERMINAL_ATTRIBUTE_BITS \
+    + IA_CSS_TERMINAL_ID_BITS \
+    + IA_CSS_TERMINAL_ID_BITS \
+    + (N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT*IA_CSS_UINT8_T_BITS))
+
+/* ==================== Base Terminal Manifest - START ==================== */
+struct ia_css_terminal_manifest_s {
+    ia_css_terminal_type_t                terminal_type;        /**< Type ia_css_terminal_type_t */
+    /**  Max size of payload buffer for instances of this terminal
+     *
+     *   For load terminals, this is the size of all sections, as defined in the manifest
+     *   descriptors.  For connect terminals, this is the max buffer size.
+     */
+    uint32_t                    max_payload_size;
+    int16_t                        parent_offset;        /**< Offset to the program group manifest */
+    uint16_t                    size;            /**< Size of this whole terminal-manifest layout-structure */
+    ia_css_terminal_manifest_attributes_t    attributes; /**< Bit fields describing the terminal attributes */
+    ia_css_terminal_ID_t                ID; /**< The unique identifier of this terminal in the PG */
+    /** The unique identifier of another terminal in the PG, associated with this one.
+     *  Set to IA_CSS_TERMINAL_INVALID_ID by default (--> no associated terminal) */
+    ia_css_terminal_ID_t                assoc_ID;
+#if N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT > 0
+    uint8_t                        padding[N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT];
+#endif
+};
+
+typedef struct ia_css_terminal_manifest_s
+    ia_css_terminal_manifest_t;
+
+/* ==================== Base Terminal Manifest - END ==================== */
+
+/** @} */
+
+#endif /* __IA_CSS_TERMINAL_MANIFEST_BASE_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_impl.h
new file mode 100644
index 000000000000..450a4b290434
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_impl.h
@@ -0,0 +1,391 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_TERMINAL_MANIFEST_IMPL_H
+#define __IA_CSS_TERMINAL_MANIFEST_IMPL_H
+
+#include "ia_css_terminal_manifest.h"
+#include "error_support.h"
+#include "assert_support.h"
+#include "storage_class.h"
+
+STORAGE_CLASS_INLINE void __terminal_manifest_dummy_check_alignment(void)
+{
+    COMPILATION_ERROR_IF(
+        SIZE_OF_PARAM_TERMINAL_MANIFEST_STRUCT_IN_BITS !=
+            (CHAR_BIT * sizeof(ia_css_param_terminal_manifest_t)));
+
+    COMPILATION_ERROR_IF(0 !=
+        sizeof(ia_css_param_terminal_manifest_t) % sizeof(uint64_t));
+
+    COMPILATION_ERROR_IF(
+        SIZE_OF_PARAM_TERMINAL_MANIFEST_SEC_STRUCT_IN_BITS !=
+        (CHAR_BIT * sizeof(ia_css_param_manifest_section_desc_t)));
+
+    COMPILATION_ERROR_IF(0 !=
+        sizeof(ia_css_param_manifest_section_desc_t) %
+            sizeof(uint32_t));
+
+    COMPILATION_ERROR_IF(
+        SIZE_OF_SPATIAL_PARAM_TERM_MAN_STRUCT_IN_BITS !=
+        (CHAR_BIT * sizeof(ia_css_spatial_param_terminal_manifest_t)));
+
+    COMPILATION_ERROR_IF(0 !=
+        sizeof(ia_css_spatial_param_terminal_manifest_t) %
+            sizeof(uint64_t));
+
+    COMPILATION_ERROR_IF(
+        SIZE_OF_FRAME_GRID_PARAM_MAN_SEC_STRUCT_IN_BITS !=
+        (CHAR_BIT * sizeof(
+            ia_css_frame_grid_param_manifest_section_desc_t)));
+
+    COMPILATION_ERROR_IF(0 !=
+        sizeof(ia_css_frame_grid_param_manifest_section_desc_t) %
+            sizeof(uint64_t));
+
+    COMPILATION_ERROR_IF(
+        SIZE_OF_PROG_TERM_MAN_STRUCT_IN_BITS !=
+        (CHAR_BIT * sizeof(ia_css_program_terminal_manifest_t)));
+
+    COMPILATION_ERROR_IF(0 !=
+        sizeof(ia_css_program_terminal_manifest_t)%sizeof(uint64_t));
+
+    COMPILATION_ERROR_IF(
+        SIZE_OF_FRAG_PARAM_MAN_SEC_STRUCT_IN_BITS !=
+        (CHAR_BIT * sizeof(
+            ia_css_fragment_param_manifest_section_desc_t)));
+
+    COMPILATION_ERROR_IF(0 !=
+        sizeof(ia_css_fragment_param_manifest_section_desc_t) %
+            sizeof(uint32_t));
+
+    COMPILATION_ERROR_IF(
+        SIZE_OF_KERNEL_FRAG_SEQ_INFO_MAN_STRUCT_IN_BITS !=
+        (CHAR_BIT * sizeof(
+            ia_css_kernel_fragment_sequencer_info_manifest_desc_t))
+        );
+
+    COMPILATION_ERROR_IF(0 != sizeof(
+        ia_css_kernel_fragment_sequencer_info_manifest_desc_t) %
+            sizeof(uint64_t));
+
+    COMPILATION_ERROR_IF(
+        SIZE_OF_PARAM_TERMINAL_MANIFEST_STRUCT_IN_BITS !=
+        (CHAR_BIT * sizeof(ia_css_sliced_param_terminal_manifest_t)));
+
+    COMPILATION_ERROR_IF(0 !=
+        sizeof(ia_css_sliced_param_terminal_manifest_t) %
+            sizeof(uint64_t));
+
+    COMPILATION_ERROR_IF(
+        SIZE_OF_SLICED_PARAM_MAN_SEC_STRUCT_IN_BITS !=
+        (CHAR_BIT * sizeof
+            (ia_css_sliced_param_manifest_section_desc_t)));
+
+    COMPILATION_ERROR_IF(0 !=
+        sizeof(ia_css_sliced_param_manifest_section_desc_t) %
+            sizeof(uint64_t));
+}
+
+/* Parameter Terminal */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+unsigned int ia_css_param_terminal_manifest_get_size(
+    const unsigned int nof_sections)
+{
+
+    return sizeof(ia_css_param_terminal_manifest_t) +
+        nof_sections*sizeof(ia_css_param_manifest_section_desc_t);
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+int ia_css_param_terminal_manifest_init(
+    ia_css_param_terminal_manifest_t *param_terminal,
+    const uint16_t section_count)
+{
+    if (param_terminal == NULL) {
+        return -EFAULT;
+    }
+
+    param_terminal->param_manifest_section_desc_count = section_count;
+    param_terminal->param_manifest_section_desc_offset = sizeof(
+                ia_css_param_terminal_manifest_t);
+
+    return 0;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_param_manifest_section_desc_t *
+ia_css_param_terminal_manifest_get_prm_sct_desc(
+    const ia_css_param_terminal_manifest_t *param_terminal_manifest,
+    const unsigned int section_index)
+{
+    ia_css_param_manifest_section_desc_t *param_manifest_section_base;
+    ia_css_param_manifest_section_desc_t *
+        param_manifest_section_desc = NULL;
+
+    verifjmpexit(param_terminal_manifest != NULL);
+
+    param_manifest_section_base =
+        (ia_css_param_manifest_section_desc_t *)
+        (((const char *)param_terminal_manifest)
+        + param_terminal_manifest->param_manifest_section_desc_offset);
+
+    param_manifest_section_desc =
+        &(param_manifest_section_base[section_index]);
+
+EXIT:
+    return param_manifest_section_desc;
+}
+
+/* Spatial Parameter Terminal */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+unsigned int ia_css_spatial_param_terminal_manifest_get_size(
+    const unsigned int nof_frame_param_sections)
+{
+    return sizeof(ia_css_spatial_param_terminal_manifest_t) +
+        nof_frame_param_sections * sizeof(
+            ia_css_frame_grid_param_manifest_section_desc_t);
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+int ia_css_spatial_param_terminal_manifest_init(
+    ia_css_spatial_param_terminal_manifest_t *spatial_param_terminal,
+    const uint16_t section_count)
+{
+    if (spatial_param_terminal == NULL) {
+        return -EFAULT;
+    }
+
+    spatial_param_terminal->
+        frame_grid_param_manifest_section_desc_count = section_count;
+    spatial_param_terminal->
+        frame_grid_param_manifest_section_desc_offset =
+        sizeof(ia_css_spatial_param_terminal_manifest_t);
+
+    return 0;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_frame_grid_param_manifest_section_desc_t *
+ia_css_spatial_param_terminal_manifest_get_frm_grid_prm_sct_desc(
+    const ia_css_spatial_param_terminal_manifest_t *
+        spatial_param_terminal_manifest,
+    const unsigned int section_index)
+{
+    ia_css_frame_grid_param_manifest_section_desc_t *
+        frame_param_manifest_section_base;
+    ia_css_frame_grid_param_manifest_section_desc_t *
+        frame_param_manifest_section_desc = NULL;
+
+    verifjmpexit(spatial_param_terminal_manifest != NULL);
+
+    frame_param_manifest_section_base =
+        (ia_css_frame_grid_param_manifest_section_desc_t *)
+        (((const char *)spatial_param_terminal_manifest) +
+            spatial_param_terminal_manifest->
+            frame_grid_param_manifest_section_desc_offset);
+    frame_param_manifest_section_desc =
+        &(frame_param_manifest_section_base[section_index]);
+
+EXIT:
+    return frame_param_manifest_section_desc;
+}
+
+/* Sliced Terminal */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+unsigned int ia_css_sliced_param_terminal_manifest_get_size(
+    const unsigned int nof_slice_param_sections)
+{
+    return sizeof(ia_css_spatial_param_terminal_manifest_t) +
+        nof_slice_param_sections *
+        sizeof(ia_css_sliced_param_manifest_section_desc_t);
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+int ia_css_sliced_param_terminal_manifest_init(
+    ia_css_sliced_param_terminal_manifest_t *sliced_param_terminal,
+    const uint16_t section_count)
+{
+    if (sliced_param_terminal == NULL) {
+        return -EFAULT;
+    }
+
+    sliced_param_terminal->sliced_param_section_count = section_count;
+    sliced_param_terminal->sliced_param_section_offset =
+        sizeof(ia_css_sliced_param_terminal_manifest_t);
+
+    return 0;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_sliced_param_manifest_section_desc_t *
+ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
+    const ia_css_sliced_param_terminal_manifest_t *
+        sliced_param_terminal_manifest,
+    const unsigned int section_index)
+{
+    ia_css_sliced_param_manifest_section_desc_t *
+        sliced_param_manifest_section_base;
+    ia_css_sliced_param_manifest_section_desc_t *
+        sliced_param_manifest_section_desc = NULL;
+
+    verifjmpexit(sliced_param_terminal_manifest != NULL);
+
+    sliced_param_manifest_section_base =
+        (ia_css_sliced_param_manifest_section_desc_t *)
+        (((const char *)sliced_param_terminal_manifest) +
+            sliced_param_terminal_manifest->
+            sliced_param_section_offset);
+    sliced_param_manifest_section_desc =
+        &(sliced_param_manifest_section_base[section_index]);
+
+EXIT:
+    return sliced_param_manifest_section_desc;
+}
+
+/* Program Terminal */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+unsigned int ia_css_program_terminal_manifest_get_size(
+    const unsigned int nof_fragment_param_sections,
+    const unsigned int nof_kernel_fragment_sequencer_infos)
+{
+    return sizeof(ia_css_program_terminal_manifest_t) +
+        nof_fragment_param_sections *
+        sizeof(ia_css_fragment_param_manifest_section_desc_t) +
+        nof_kernel_fragment_sequencer_infos *
+        sizeof(ia_css_kernel_fragment_sequencer_info_manifest_desc_t);
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+int ia_css_program_terminal_manifest_init(
+    ia_css_program_terminal_manifest_t *program_terminal,
+    const uint16_t fragment_param_section_count,
+    const uint16_t kernel_fragment_seq_info_section_count)
+{
+    if (program_terminal == NULL) {
+        return -EFAULT;
+    }
+
+    program_terminal->fragment_param_manifest_section_desc_count =
+        fragment_param_section_count;
+    program_terminal->fragment_param_manifest_section_desc_offset =
+        sizeof(ia_css_program_terminal_manifest_t);
+
+    program_terminal->kernel_fragment_sequencer_info_manifest_info_count =
+        kernel_fragment_seq_info_section_count;
+    program_terminal->kernel_fragment_sequencer_info_manifest_info_offset =
+        sizeof(ia_css_program_terminal_manifest_t) +
+        fragment_param_section_count*sizeof(
+            ia_css_fragment_param_manifest_section_desc_t);
+
+    return 0;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_fragment_param_manifest_section_desc_t *
+ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
+    const ia_css_program_terminal_manifest_t *program_terminal_manifest,
+    const unsigned int section_index)
+{
+    ia_css_fragment_param_manifest_section_desc_t *
+        fragment_param_manifest_section_base;
+    ia_css_fragment_param_manifest_section_desc_t *
+        fragment_param_manifest_section = NULL;
+
+    verifjmpexit(program_terminal_manifest != NULL);
+
+    fragment_param_manifest_section_base =
+        (ia_css_fragment_param_manifest_section_desc_t *)
+        (((const char *)program_terminal_manifest) +
+        program_terminal_manifest->
+        fragment_param_manifest_section_desc_offset);
+    fragment_param_manifest_section =
+        &(fragment_param_manifest_section_base[section_index]);
+
+EXIT:
+    return fragment_param_manifest_section;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
+ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc(
+    const ia_css_program_terminal_manifest_t *program_terminal_manifest,
+    const unsigned int info_index)
+{
+    ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
+        kernel_manifest_fragment_sequencer_info_manifest_desc_base;
+    ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
+        kernel_manifest_fragment_sequencer_info_manifest_desc = NULL;
+
+    verifjmpexit(program_terminal_manifest != NULL);
+
+    kernel_manifest_fragment_sequencer_info_manifest_desc_base =
+        (ia_css_kernel_fragment_sequencer_info_manifest_desc_t *)
+        (((const char *)program_terminal_manifest) +
+        program_terminal_manifest->
+        kernel_fragment_sequencer_info_manifest_info_offset);
+
+    kernel_manifest_fragment_sequencer_info_manifest_desc =
+        &(kernel_manifest_fragment_sequencer_info_manifest_desc_base[
+                info_index]);
+
+EXIT:
+    return kernel_manifest_fragment_sequencer_info_manifest_desc;
+}
+
+/* Start ...*/
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_param_manifest_section_desc_get_kernel_id(
+    const ia_css_param_manifest_section_desc_t *section)
+{
+    return (section->info >> MANIFEST_SECTION_DESC_KERNEL_ID_OFFSET) & MANIFEST_SECTION_DESC_KERNEL_ID_MASK;
+}
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_param_manifest_section_desc_get_region_id(
+    const ia_css_param_manifest_section_desc_t *section)
+{
+    return (section->info >> MANIFEST_SECTION_DESC_REGION_ID_OFFSET) & MANIFEST_SECTION_DESC_REGION_ID_MASK;
+}
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_param_manifest_section_desc_get_mem_type_id(
+    const ia_css_param_manifest_section_desc_t *section)
+{
+    return (section->info >> MANIFEST_SECTION_DESC_MEM_TYPE_ID_OFFSET) & MANIFEST_SECTION_DESC_MEM_TYPE_ID_MASK;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_fragment_param_manifest_section_desc_get_kernel_id(
+    const ia_css_fragment_param_manifest_section_desc_t *section)
+{
+    return (section->info >> MANIFEST_SECTION_DESC_KERNEL_ID_OFFSET) & MANIFEST_SECTION_DESC_KERNEL_ID_MASK;
+}
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_fragment_param_manifest_section_desc_get_region_id(
+    const ia_css_fragment_param_manifest_section_desc_t *section)
+{
+    return (section->info >> MANIFEST_SECTION_DESC_REGION_ID_OFFSET) & MANIFEST_SECTION_DESC_REGION_ID_MASK;
+}
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_fragment_param_manifest_section_desc_get_mem_type_id(
+    const ia_css_fragment_param_manifest_section_desc_t *section)
+{
+    return (section->info >> MANIFEST_SECTION_DESC_MEM_TYPE_ID_OFFSET) & MANIFEST_SECTION_DESC_MEM_TYPE_ID_MASK;
+}
+
+/* End ...*/
+
+#endif /* __IA_CSS_TERMINAL_MANIFEST_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_types.h
new file mode 100644
index 000000000000..220ac9b3faa8
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_types.h
@@ -0,0 +1,349 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_TERMINAL_MANIFEST_TYPES_H
+#define __IA_CSS_TERMINAL_MANIFEST_TYPES_H
+
+#include "ia_css_terminal_defs.h"
+#include "type_support.h"
+#include "ia_css_base_types.h"
+#include "ia_css_terminal_manifest_base_types.h"
+
+/**
+ * @addtogroup group_psysapi
+ * @{
+ */
+
+#define SIZE_OF_PARAM_TERMINAL_MANIFEST_SEC_STRUCT_IN_BITS \
+    (2 * IA_CSS_UINT16_T_BITS)
+
+/* =============== Cached Param Terminal Manifest - START ============== */
+/** Descriptor for a single manifest parameter section.
+ *
+ * Each descriptor describes a single contiguous parameter payload that will
+ * be written to hardware registers or other memory.  It defines the maximum
+ * size of the section payload (critical for allocation and security), the device the
+ * section belongs to, and the target memory type (usually device registers).
+ *
+ * A region ID allows specifying multiple sections for a single device when a
+ * device's configuration registers are not all contigous.
+ */
+struct ia_css_param_manifest_section_desc_s {
+    /** Maximum size of the related parameter region */
+    uint16_t max_mem_size;
+    /** mem_type, region and kernel_id
+      * - mem_type - Memory targeted by this section
+      * (Register MMIO Interface/DMEM/VMEM/GMEM etc)
+      * - Region - subsection id within the specified memory
+      * - kernel_id - Indication of the kernel/device this parameter belongs to */
+    uint16_t info;
+};
+
+typedef struct ia_css_param_manifest_section_desc_s
+    ia_css_param_manifest_section_desc_t;
+
+#define N_PADDING_UINT8_IN_PARAM_TERMINAL_MAN_STRUCT 4
+#define SIZE_OF_PARAM_TERMINAL_MANIFEST_STRUCT_IN_BITS \
+    (SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
+    + (2*IA_CSS_UINT16_T_BITS) \
+    + (N_PADDING_UINT8_IN_PARAM_TERMINAL_MAN_STRUCT * IA_CSS_UINT8_T_BITS))
+
+/** Frame constant parameters terminal manifest
+ *
+ * This is the "header" for a list of parameter sections described by
+ * ia_css_param_manifest_section_desc_s.
+ */
+struct ia_css_param_terminal_manifest_s {
+    /** Parameter terminal manifest base */
+    ia_css_terminal_manifest_t base;
+    /**
+     * Number of cached parameter sections, coming from manifest
+     * but also shared by the terminal
+     */
+    uint16_t param_manifest_section_desc_count;
+    /**
+     * Points to the variable array of
+     * struct ia_css_param_section_desc_s
+     */
+    uint16_t param_manifest_section_desc_offset;
+    /** align to 64 */
+    uint8_t padding[N_PADDING_UINT8_IN_PARAM_TERMINAL_MAN_STRUCT];
+};
+
+typedef struct ia_css_param_terminal_manifest_s
+    ia_css_param_terminal_manifest_t;
+/* ================= Cached Param Terminal Manifest - End ================ */
+
+/* ================= Spatial Param Terminal Manifest - START ============= */
+
+#define SIZE_OF_FRAG_GRID_MAN_STRUCT_IN_BITS \
+    ((IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS) \
+    + (IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS))
+
+struct ia_css_fragment_grid_manifest_desc_s {
+    /* Min resolution width/height of the spatial parameters
+     * for the fragment measured in compute units
+     */
+    uint16_t min_fragment_grid_dimension[IA_CSS_N_DATA_DIMENSION];
+    /* Max resolution width/height of the spatial parameters
+     * for the fragment measured in compute units
+     */
+    uint16_t max_fragment_grid_dimension[IA_CSS_N_DATA_DIMENSION];
+};
+
+typedef struct ia_css_fragment_grid_manifest_desc_s
+    ia_css_fragment_grid_manifest_desc_t;
+
+#define N_PADDING_UINT8_IN_FRAME_GRID_PARAM_MAN_SEC_STRUCT 1
+#define SIZE_OF_FRAME_GRID_PARAM_MAN_SEC_STRUCT_IN_BITS \
+    (1 * IA_CSS_UINT32_T_BITS \
+    + 3 * IA_CSS_UINT8_T_BITS \
+    + N_PADDING_UINT8_IN_FRAME_GRID_PARAM_MAN_SEC_STRUCT * IA_CSS_UINT8_T_BITS)
+
+struct ia_css_frame_grid_param_manifest_section_desc_s {
+    /* Maximum buffer total size allowed for
+     * this frame of parameters
+     */
+    uint32_t max_mem_size;
+    /* Memory space targeted by this section
+     * (Register MMIO Interface/DMEM/VMEM/GMEM etc)
+     */
+    uint8_t mem_type_id;
+    /* Region id within the specified memory space */
+    uint8_t region_id;
+    /* size in bytes of each compute unit for
+     * the specified memory space and region
+     */
+    uint8_t elem_size;
+    /* align to 64 */
+    uint8_t padding[N_PADDING_UINT8_IN_FRAME_GRID_PARAM_MAN_SEC_STRUCT];
+};
+
+typedef struct ia_css_frame_grid_param_manifest_section_desc_s
+    ia_css_frame_grid_param_manifest_section_desc_t;
+
+#define SIZE_OF_FRAME_GRID_MAN_STRUCT_IN_BITS \
+    ((IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS) \
+    + (IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS))
+
+struct ia_css_frame_grid_manifest_desc_s {
+    /* Min resolution width/height of the spatial parameters for
+     * the frame measured in compute units
+     */
+    uint16_t min_frame_grid_dimension[IA_CSS_N_DATA_DIMENSION];
+    /* Max resolution width/height of the spatial parameters for
+     * the frame measured in compute units
+     */
+    uint16_t max_frame_grid_dimension[IA_CSS_N_DATA_DIMENSION];
+};
+
+typedef struct ia_css_frame_grid_manifest_desc_s
+    ia_css_frame_grid_manifest_desc_t;
+
+#define N_PADDING_UINT8_IN_SPATIAL_PARAM_TERM_MAN_STRUCT 2
+#define SIZE_OF_SPATIAL_PARAM_TERM_MAN_STRUCT_IN_BITS \
+    ((SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS) \
+    + (SIZE_OF_FRAME_GRID_MAN_STRUCT_IN_BITS) \
+    + (SIZE_OF_FRAG_GRID_MAN_STRUCT_IN_BITS) \
+    + (2 * IA_CSS_UINT16_T_BITS) \
+    + (2 * IA_CSS_UINT8_T_BITS) \
+    + (N_PADDING_UINT8_IN_SPATIAL_PARAM_TERM_MAN_STRUCT * \
+    IA_CSS_UINT8_T_BITS))
+
+/** Spatial parameters terminal manifest */
+struct ia_css_spatial_param_terminal_manifest_s {
+    /** terminal manifest base object */
+    ia_css_terminal_manifest_t base;
+    /** Contains limits for the frame spatial parameters */
+    ia_css_frame_grid_manifest_desc_t frame_grid_desc;
+    /**
+     * Constains limits for the fragment spatial parameters
+     * - COMMON AMONG FRAGMENTS
+     */
+    ia_css_fragment_grid_manifest_desc_t common_fragment_grid_desc;
+    /**
+     * Number of frame spatial parameter sections, they are set
+     * in slice-steps through frame processing
+     */
+    uint16_t frame_grid_param_manifest_section_desc_count;
+    /**
+     * Points to the variable array of
+     * ia_css_frame_spatial_param_manifest_section_desc_t
+     */
+    uint16_t frame_grid_param_manifest_section_desc_offset;
+    /**
+     * Indication of the kernel this spatial parameter terminal belongs to
+     * SHOULD MATCH TO INDEX AND BE USED ONLY FOR CHECK
+     */
+    uint8_t kernel_id;
+    /**
+     * Groups together compute units in order to achieve alignment
+     * requirements for transfes and to achieve canonical frame
+     * representation
+     */
+    uint8_t compute_units_p_elem;
+    /** align to 64 */
+    uint8_t padding[N_PADDING_UINT8_IN_SPATIAL_PARAM_TERM_MAN_STRUCT];
+};
+
+typedef struct ia_css_spatial_param_terminal_manifest_s
+    ia_css_spatial_param_terminal_manifest_t;
+
+/* ================= Spatial Param Terminal Manifest - END ================ */
+
+/* ================= Sliced Param Terminal Manifest - START =============== */
+
+#define N_PADDING_UINT8_IN_SLICED_TERMINAL_MAN_SECTION_STRUCT (2)
+#define SIZE_OF_SLICED_PARAM_MAN_SEC_STRUCT_IN_BITS \
+    (1 * IA_CSS_UINT32_T_BITS \
+    + 2 * IA_CSS_UINT8_T_BITS \
+    + N_PADDING_UINT8_IN_SLICED_TERMINAL_MAN_SECTION_STRUCT * IA_CSS_UINT8_T_BITS)
+
+struct ia_css_sliced_param_manifest_section_desc_s {
+    /** Maximum size of the related parameter region */
+    uint32_t max_mem_size;
+    /**
+     * Memory targeted by this section
+     * (Register MMIO Interface/DMEM/VMEM/GMEM etc)
+     */
+    uint8_t mem_type_id;
+    /** Region id within the specified memory */
+    uint8_t region_id;
+    /** align to 64 */
+    uint8_t padding[N_PADDING_UINT8_IN_SLICED_TERMINAL_MAN_SECTION_STRUCT];
+};
+
+typedef struct ia_css_sliced_param_manifest_section_desc_s
+    ia_css_sliced_param_manifest_section_desc_t;
+
+#define N_PADDING_UINT8_IN_SLICED_TERMINAL_MANIFEST_STRUCT 3
+#define SIZE_OF_SLICED_TERMINAL_MANIFEST_STRUCT_IN_BITS \
+    (SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
+    + 2 * IA_CSS_UINT16_T_BITS \
+    + 1 * IA_CSS_UINT8_T_BITS \
+    + N_PADDING_UINT8_IN_SLICED_TERMINAL_MANIFEST_STRUCT * IA_CSS_UINT8_T_BITS)
+
+/* Frame constant parameters terminal manifest */
+struct ia_css_sliced_param_terminal_manifest_s {
+    /** terminal manifest base object */
+    ia_css_terminal_manifest_t base;
+    /**
+     * Number of the array elements
+     * sliced_param_section_offset points to
+     */
+    uint16_t sliced_param_section_count;
+    /**
+     * Points to array of ia_css_sliced_param_manifest_section_desc_s
+     * which constain info for the slicing of the parameters
+     */
+    uint16_t sliced_param_section_offset;
+    /** Kernel identifier */
+    uint8_t kernel_id;
+    /** align to 64 */
+    uint8_t padding[N_PADDING_UINT8_IN_SLICED_TERMINAL_MANIFEST_STRUCT];
+};
+
+typedef struct ia_css_sliced_param_terminal_manifest_s
+    ia_css_sliced_param_terminal_manifest_t;
+
+/* ================= Slice Param Terminal Manifest - End =============== */
+
+/* ================= Program Terminal Manifest - START ================= */
+
+#define SIZE_OF_FRAG_PARAM_MAN_SEC_STRUCT_IN_BITS \
+    (2 * IA_CSS_UINT16_T_BITS)
+
+/** Fragment constant parameters manifest */
+struct ia_css_fragment_param_manifest_section_desc_s {
+    /** Maximum size of the related parameter region */
+    uint16_t max_mem_size;
+    /** (mem_type, region and kernel_id) */
+    uint16_t info;
+};
+
+typedef struct ia_css_fragment_param_manifest_section_desc_s
+    ia_css_fragment_param_manifest_section_desc_t;
+
+#define SIZE_OF_KERNEL_FRAG_SEQ_INFO_MAN_STRUCT_IN_BITS \
+    (10*IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS)
+
+struct ia_css_kernel_fragment_sequencer_info_manifest_desc_s {
+    /* Slice dimensions */
+    uint16_t min_fragment_grid_slice_dimension[IA_CSS_N_DATA_DIMENSION];
+    /* Slice dimensions */
+    uint16_t max_fragment_grid_slice_dimension[IA_CSS_N_DATA_DIMENSION];
+    /* Nof slices */
+    uint16_t min_fragment_grid_slice_count[IA_CSS_N_DATA_DIMENSION];
+    /* Nof slices */
+    uint16_t max_fragment_grid_slice_count[IA_CSS_N_DATA_DIMENSION];
+    /* Grid point decimation factor */
+    uint16_t
+    min_fragment_grid_point_decimation_factor[IA_CSS_N_DATA_DIMENSION];
+    /* Grid point decimation factor */
+    uint16_t
+    max_fragment_grid_point_decimation_factor[IA_CSS_N_DATA_DIMENSION];
+    /* Relative position of grid origin to pixel origin */
+    int16_t
+    min_fragment_grid_overlay_pixel_topleft_index[IA_CSS_N_DATA_DIMENSION];
+    /* Relative position of grid origin to pixel origin */
+    int16_t
+    max_fragment_grid_overlay_pixel_topleft_index[IA_CSS_N_DATA_DIMENSION];
+    /* Dimension of grid */
+    int16_t
+    min_fragment_grid_overlay_pixel_dimension[IA_CSS_N_DATA_DIMENSION];
+    /* Dimension of grid */
+    int16_t
+    max_fragment_grid_overlay_pixel_dimension[IA_CSS_N_DATA_DIMENSION];
+};
+
+typedef struct ia_css_kernel_fragment_sequencer_info_manifest_desc_s
+    ia_css_kernel_fragment_sequencer_info_manifest_desc_t;
+
+#define N_PADDING_UINT8_IN_PROGRAM_TERM_MAN_STRUCT 2
+#define SIZE_OF_PROG_TERM_MAN_STRUCT_IN_BITS \
+    ((SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS) \
+    + (IA_CSS_UINT32_T_BITS) \
+    + (5*IA_CSS_UINT16_T_BITS) \
+    + (N_PADDING_UINT8_IN_PROGRAM_TERM_MAN_STRUCT * IA_CSS_UINT8_T_BITS))
+
+/** Program parameters terminal */
+struct ia_css_program_terminal_manifest_s {
+    /** terminal manifest base object */
+    ia_css_terminal_manifest_t base;
+    /** Connection manager passes seq info as single blob at the moment */
+    uint32_t sequencer_info_kernel_id;
+    /** Maximum number of command secriptors supported
+     * by the program group
+     */
+    uint16_t max_kernel_fragment_sequencer_command_desc;
+    /** The total count of prog-init parameter descriptors */
+    uint16_t fragment_param_manifest_section_desc_count;
+    /** The offset of the manifest section descriptor from the base of this structure */
+    uint16_t fragment_param_manifest_section_desc_offset;
+    uint16_t kernel_fragment_sequencer_info_manifest_info_count;
+    uint16_t kernel_fragment_sequencer_info_manifest_info_offset;
+    /** align to 64 */
+    uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_TERM_MAN_STRUCT];
+};
+
+typedef struct ia_css_program_terminal_manifest_s
+    ia_css_program_terminal_manifest_t;
+
+/* ==================== Program Terminal Manifest - END ==================== */
+
+/** @} */
+
+#endif /* __IA_CSS_TERMINAL_MANIFEST_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_types.h
new file mode 100644
index 000000000000..7e6350820f22
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_types.h
@@ -0,0 +1,477 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_TERMINAL_TYPES_H
+#define __IA_CSS_TERMINAL_TYPES_H
+
+#include "type_support.h"
+#include "ia_css_base_types.h"
+#include "ia_css_terminal_base_types.h"
+
+typedef struct ia_css_program_control_init_load_section_desc_s
+    ia_css_program_control_init_load_section_desc_t;
+typedef struct ia_css_program_control_init_connect_section_desc_s
+    ia_css_program_control_init_connect_section_desc_t;
+typedef struct ia_css_program_control_init_program_desc_s
+    ia_css_program_control_init_program_desc_t;
+typedef struct ia_css_program_control_init_terminal_s
+    ia_css_program_control_init_terminal_t;
+
+typedef struct ia_css_program_terminal_s ia_css_program_terminal_t;
+typedef struct ia_css_fragment_param_section_desc_s
+    ia_css_fragment_param_section_desc_t;
+typedef struct ia_css_kernel_fragment_sequencer_info_desc_s
+    ia_css_kernel_fragment_sequencer_info_desc_t;
+typedef struct ia_css_kernel_fragment_sequencer_command_desc_s
+    ia_css_kernel_fragment_sequencer_command_desc_t;
+
+typedef struct ia_css_sliced_param_terminal_s ia_css_sliced_param_terminal_t;
+typedef struct ia_css_fragment_slice_desc_s ia_css_fragment_slice_desc_t;
+typedef struct ia_css_slice_param_section_desc_s
+    ia_css_slice_param_section_desc_t;
+
+typedef struct ia_css_spatial_param_terminal_s ia_css_spatial_param_terminal_t;
+typedef struct ia_css_frame_grid_desc_s ia_css_frame_grid_desc_t;
+typedef struct ia_css_frame_grid_param_section_desc_s
+    ia_css_frame_grid_param_section_desc_t;
+typedef struct ia_css_fragment_grid_desc_s ia_css_fragment_grid_desc_t;
+
+typedef struct ia_css_param_terminal_s ia_css_param_terminal_t;
+typedef struct ia_css_param_section_desc_s ia_css_param_section_desc_t;
+
+typedef struct ia_css_param_payload_s ia_css_param_payload_t;
+typedef struct ia_css_terminal_s ia_css_terminal_t;
+
+/* =================== Generic Parameter Payload - START =================== */
+#define N_UINT64_IN_PARAM_PAYLOAD_STRUCT    1
+#define N_UINT32_IN_PARAM_PAYLOAD_STRUCT    1
+
+#define IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
+    (N_UINT64_IN_PARAM_PAYLOAD_STRUCT * IA_CSS_UINT64_T_BITS \
+    + VIED_VADDRESS_BITS \
+    + N_UINT32_IN_PARAM_PAYLOAD_STRUCT * IA_CSS_UINT32_T_BITS)
+
+struct ia_css_param_payload_s {
+    /**
+     * Temporary variable holding the host address of the parameter buffer
+     * as PSYS is handling the parameters on the host side for the moment
+     */
+    uint64_t host_buffer;
+    /**
+     * Base virtual addresses to parameters in subsystem virtual
+     * memory space
+     * NOTE: Used in legacy pg flow
+     */
+    vied_vaddress_t buffer;
+    /**
+     * Offset to buffer address within external buffer set structure
+     * NOTE: Used in ppg flow
+     */
+    uint32_t terminal_index;
+};
+/* =================== Generic Parameter Payload - End ==================== */
+
+/* ==================== Cached Param Terminal - START ==================== */
+#define N_UINT32_IN_PARAM_SEC_STRUCT 2
+
+#define SIZE_OF_PARAM_SEC_STRUCT_BITS \
+    (N_UINT32_IN_PARAM_SEC_STRUCT * IA_CSS_UINT32_T_BITS)
+
+/** Parameters section */
+struct ia_css_param_section_desc_s {
+    /** Offset of the parameter allocation in memory */
+    uint32_t mem_offset;
+    /** Memory allocation size needs of this parameter */
+    uint32_t mem_size;
+};
+
+#define N_UINT16_IN_PARAM_TERMINAL_STRUCT        1
+#define N_PADDING_UINT8_IN_PARAM_TERMINAL_STRUCT    6
+
+#define SIZE_OF_PARAM_TERMINAL_STRUCT_BITS \
+    (SIZE_OF_TERMINAL_STRUCT_BITS \
+    + IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
+    + N_UINT16_IN_PARAM_TERMINAL_STRUCT * IA_CSS_UINT16_T_BITS \
+    + N_PADDING_UINT8_IN_PARAM_TERMINAL_STRUCT * IA_CSS_UINT8_T_BITS)
+
+/** "Cached" parameters terminal for parameter that do not change
+ * at frame scope.
+ */
+struct ia_css_param_terminal_s {
+    /** Parameter terminal base */
+    ia_css_terminal_t base;
+    /** Helps to identify the parameter buffer when sent later on with the buffer set  */
+    ia_css_param_payload_t param_payload;
+    /** Points to the variable array of ia_css_param_section_desc_t */
+    uint16_t param_section_desc_offset;
+    uint8_t padding[N_PADDING_UINT8_IN_PARAM_TERMINAL_STRUCT];
+};
+/* ==================== Cached Param Terminal - End ==================== */
+
+/* ==================== Spatial Param Terminal - START ==================== */
+#define N_UINT16_IN_FRAG_GRID_STRUCT (2 * IA_CSS_N_DATA_DIMENSION)
+
+#define SIZE_OF_FRAG_GRID_STRUCT_BITS \
+    (N_UINT16_IN_FRAG_GRID_STRUCT * IA_CSS_UINT16_T_BITS)
+
+struct ia_css_fragment_grid_desc_s {
+    /**
+     * Offset width/height of the top-left compute unit of the
+     * fragment compared to the frame
+     */
+    uint16_t fragment_grid_index[IA_CSS_N_DATA_DIMENSION];
+    /**
+     * Resolution width/height of the spatial parameters that
+     * correspond to the fragment measured in compute units
+     */
+    uint16_t fragment_grid_dimension[IA_CSS_N_DATA_DIMENSION];
+};
+
+#define N_UINT32_IN_FRAME_GRID_PARAM_SEC_STRUCT        3
+#define N_PADDING_UINT8_IN_FRAME_GRID_PARAM_SEC_STRUCT    4
+
+#define SIZE_OF_FRAME_GRID_PARAM_SEC_STRUCT_BITS \
+    (N_UINT32_IN_FRAME_GRID_PARAM_SEC_STRUCT * IA_CSS_UINT32_T_BITS \
+    + N_PADDING_UINT8_IN_FRAME_GRID_PARAM_SEC_STRUCT * IA_CSS_UINT8_T_BITS)
+
+/**
+ * A plane of parameters with spatial aspect
+ * (compute units correlated to pixel data)
+ */
+struct ia_css_frame_grid_param_section_desc_s {
+    /** Offset of the parameter allocation in memory */
+    uint32_t mem_offset;
+    /** Memory allocation size needs of this parameter */
+    uint32_t mem_size;
+    /**
+     * stride in bytes of each line of compute units for
+     * the specified memory space and region
+     */
+    uint32_t stride;
+    uint8_t  padding[N_PADDING_UINT8_IN_FRAME_GRID_PARAM_SEC_STRUCT];
+};
+
+#define N_UINT16_IN_FRAME_GRID_STRUCT_STRUCT IA_CSS_N_DATA_DIMENSION
+#define N_PADDING_UINT8_IN_FRAME_GRID_STRUCT 4
+
+#define SIZE_OF_FRAME_GRID_STRUCT_BITS \
+    (N_UINT16_IN_FRAME_GRID_STRUCT_STRUCT * IA_CSS_UINT16_T_BITS \
+    + N_PADDING_UINT8_IN_FRAME_GRID_STRUCT * IA_CSS_UINT8_T_BITS)
+
+struct ia_css_frame_grid_desc_s {
+    /** Resolution width/height of the frame of
+     * spatial parameters measured in compute units
+     */
+    uint16_t frame_grid_dimension[IA_CSS_N_DATA_DIMENSION];
+    uint8_t padding[N_PADDING_UINT8_IN_FRAME_GRID_STRUCT];
+};
+
+#define N_UINT32_IN_SPATIAL_PARAM_TERM_STRUCT 1
+#define N_UINT16_IN_SPATIAL_PARAM_TERM_STRUCT 2
+
+#define SIZE_OF_SPATIAL_PARAM_TERM_STRUCT_BITS \
+    (SIZE_OF_TERMINAL_STRUCT_BITS \
+    + IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
+    + SIZE_OF_FRAME_GRID_STRUCT_BITS \
+    + N_UINT32_IN_SPATIAL_PARAM_TERM_STRUCT * IA_CSS_UINT32_T_BITS \
+    + N_UINT16_IN_SPATIAL_PARAM_TERM_STRUCT * IA_CSS_UINT16_T_BITS)
+
+struct ia_css_spatial_param_terminal_s {
+    /** Spatial Parameter terminal base */
+    ia_css_terminal_t base;
+    /** Spatial Parameter buffer handle attached to the terminal */
+    ia_css_param_payload_t param_payload;
+    /** Contains info for the frame of spatial parameters */
+    ia_css_frame_grid_desc_t frame_grid_desc;
+    /** Kernel identifier */
+    uint32_t kernel_id;
+    /**
+     * Points to the variable array of
+     * ia_css_frame_grid_param_section_desc_t
+     */
+    uint16_t frame_grid_param_section_desc_offset;
+    /**
+     * Points to array of ia_css_fragment_spatial_desc_t
+     * which constain info for the fragments of spatial parameters
+     */
+    uint16_t fragment_grid_desc_offset;
+};
+/* ==================== Spatial Param Terminal - END ==================== */
+
+/* ==================== Sliced Param Terminal - START ==================== */
+#define N_UINT32_IN_SLICE_PARAM_SECTION_DESC_STRUCT 2
+
+#define SIZE_OF_SLICE_PARAM_SECTION_DESC_STRUCT_BITS \
+    (N_UINT32_IN_SLICE_PARAM_SECTION_DESC_STRUCT * IA_CSS_UINT32_T_BITS)
+
+/** A Slice of parameters ready to be trasferred from/to registers */
+struct ia_css_slice_param_section_desc_s {
+    /** Offset of the parameter allocation in memory */
+    uint32_t mem_offset;
+    /** Memory allocation size needs of this parameter */
+    uint32_t mem_size;
+};
+
+#define N_UINT16_IN_FRAGMENT_SLICE_DESC_STRUCT        2
+#define N_PADDING_UINT8_FRAGMENT_SLICE_DESC_STRUCT    4
+
+#define SIZE_OF_FRAGMENT_SLICE_DESC_STRUCT_BITS \
+    (N_UINT16_IN_FRAGMENT_SLICE_DESC_STRUCT * IA_CSS_UINT16_T_BITS \
+    + N_PADDING_UINT8_FRAGMENT_SLICE_DESC_STRUCT * IA_CSS_UINT8_T_BITS)
+
+struct ia_css_fragment_slice_desc_s {
+    /**
+     * Points to array of ia_css_slice_param_section_desc_t
+     * which constain info for each prameter slice
+     */
+    uint16_t slice_section_desc_offset;
+    /** Number of slices for the parameters for this fragment */
+    uint16_t slice_count;
+    uint8_t padding[N_PADDING_UINT8_FRAGMENT_SLICE_DESC_STRUCT];
+};
+
+#define N_UINT32_IN_SLICED_PARAM_TERMINAL_STRUCT    1
+#define N_UINT16_IN_SLICED_PARAM_TERMINAL_STRUCT    1
+#define N_PADDING_UINT8_SLICED_PARAM_TERMINAL_STRUCT    2
+
+#define SIZE_OF_SLICED_PARAM_TERM_STRUCT_BITS \
+    (SIZE_OF_TERMINAL_STRUCT_BITS \
+    + IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
+    + N_UINT32_IN_SLICED_PARAM_TERMINAL_STRUCT * IA_CSS_UINT32_T_BITS \
+    + N_UINT16_IN_SLICED_PARAM_TERMINAL_STRUCT * IA_CSS_UINT16_T_BITS \
+    + N_PADDING_UINT8_SLICED_PARAM_TERMINAL_STRUCT * IA_CSS_UINT8_T_BITS)
+
+struct ia_css_sliced_param_terminal_s {
+    /** Spatial Parameter terminal base */
+    ia_css_terminal_t base;
+    /** Spatial Parameter buffer handle attached to the terminal */
+    ia_css_param_payload_t param_payload;
+    /** Kernel identifier */
+    uint32_t kernel_id;
+    /**
+     * Points to array of ia_css_fragment_slice_desc_t
+     * which constain info for the slicing of the parameters
+     */
+    uint16_t fragment_slice_desc_offset;
+    uint8_t padding[N_PADDING_UINT8_SLICED_PARAM_TERMINAL_STRUCT];
+};
+/* ==================== Sliced Param Terminal - END ==================== */
+
+/* ================= Program Control Init Terminal - START ================= */
+#define SIZE_OF_PROG_CONTROL_INIT_LOAD_SECTION_DESC_STRUCT_BITS    \
+    (DEVICE_DESCRIPTOR_ID_BITS    \
+    + (2 * IA_CSS_UINT16_T_BITS)    \
+    )
+struct ia_css_program_control_init_load_section_desc_s {
+    /** Device descriptor */
+    device_descriptor_id_t device_descriptor_id;    /* 32 bits */
+    /** Memory allocation size needs of this parameter */
+    uint16_t mem_size;
+    /** (Applicable to) mode bitmask */
+    uint16_t mode_bitmask;
+};
+
+#define MODE_BITMASK_MEMORY          (1u << IA_CSS_CONNECTION_MEMORY)
+#define MODE_BITMASK_MEMORY_STREAM   (1u << IA_CSS_CONNECTION_MEMORY_STREAM)
+#define MODE_BITMASK_STREAM          (1u << IA_CSS_CONNECTION_STREAM)
+#define MODE_BITMASK_DONT_CARE       (MODE_BITMASK_MEMORY | MODE_BITMASK_MEMORY_STREAM | MODE_BITMASK_STREAM)
+#define MODE_BITMASK_TOP             (1u << (IA_CSS_CONNECTION_STREAM + 1))
+#define MODE_BITMASK_MIDDLE          (1u << (IA_CSS_CONNECTION_STREAM + 2))
+#define MODE_BITMASK_BOTTOM          (1u << (IA_CSS_CONNECTION_STREAM + 3))
+
+struct connect_section_idx_bitfields_s {
+    uint16_t plane_id : 4;
+    uint16_t bottom_lines : 6;
+    uint16_t top_lines : 6;
+};
+
+union connect_section_idx_t {
+    struct connect_section_idx_bitfields_s as_bitfield;
+    uint16_t as_uint_16;
+};
+
+#define SIZE_OF_PROG_CONTROL_INIT_CONNECT_SECTION_DESC_STRUCT_BITS    \
+    (DEVICE_DESCRIPTOR_ID_BITS    \
+    + (1 * IA_CSS_UINT16_T_BITS)    \
+    + (1 * IA_CSS_UINT8_T_BITS)    \
+    + IA_CSS_TERMINAL_ID_BITS    \
+    )
+struct ia_css_program_control_init_connect_section_desc_s {
+    /** Device descriptor */
+    device_descriptor_id_t device_descriptor_id;    /* 32 bits */
+    /** Connected terminal section (plane) index */
+    uint16_t connect_section_idx;
+    /** (Applicable to) mode bitmask */
+    uint8_t mode_bitmask;
+    /** Absolute referral ID for the connected terminal */
+    ia_css_terminal_ID_t connect_terminal_ID;
+};
+
+#define N_PADDING_UINT8_IN_PROG_DESC_CONTROL_INFO    (1)
+#define N_PADDING_UINT8_IN_PROG_CTRL_INIT_PROGRAM_DESC_STRUCT (0)
+#define SIZE_OF_PROGRAM_DESC_CONTROL_INFO_STRUCT_BITS \
+    (1 * IA_CSS_UINT16_T_BITS)    \
+    + (1 * IA_CSS_UINT8_T_BITS)    \
+    + (N_PADDING_UINT8_IN_PROG_DESC_CONTROL_INFO * IA_CSS_UINT8_T_BITS)
+
+#define SIZE_OF_PROG_CONTROL_INIT_PROG_DESC_STRUCT_BITS    \
+    (4 * IA_CSS_UINT16_T_BITS)    \
+    + (SIZE_OF_PROGRAM_DESC_CONTROL_INFO_STRUCT_BITS) \
+    + (2 * IA_CSS_UINT8_T_BITS) \
+    + (1 * IA_CSS_UINT16_T_BITS) \
+    + (N_PADDING_UINT8_IN_PROG_CTRL_INIT_PROGRAM_DESC_STRUCT * \
+        IA_CSS_UINT8_T_BITS)
+
+struct ia_css_program_desc_control_info_s {
+    /** 12-bit process identifier */
+    ia_css_process_id_t process_id;
+    /** number of done acks required to close the process */
+    uint8_t num_done_events;
+    uint8_t padding[N_PADDING_UINT8_IN_PROG_DESC_CONTROL_INFO];
+};
+
+struct ia_css_program_control_init_program_desc_s {
+    /** Number of load sections in this program */
+    uint16_t load_section_count;
+    /** Points to variable size array of
+     * ia_css_program_control_init_load_section_desc_s
+     * in relation to its program_desc
+     */
+    uint16_t load_section_desc_offset;
+    /** Number of connect sections in this program */
+    uint16_t connect_section_count;
+    /** Points to variable size array of
+     * ia_css_program_control_init_connect_section_desc_s
+     * in relation to its program_desc
+     */
+    uint16_t connect_section_desc_offset;
+    struct ia_css_program_desc_control_info_s control_info;
+    /** number of load sections that are filled */
+    uint8_t filled_load_sections;
+    /** number of connect sections that are filled */
+    uint8_t filled_connect_sections;
+    /** mem_offset for the first load section */
+    uint16_t load_section_mem_offset;
+    /* align to 64 bits */
+    /* uint8_t padding[N_PADDING_UINT8_IN_PROG_CTRL_INIT_PROGRAM_DESC_STRUCT];*/
+};
+
+#define SIZE_OF_PROG_CONTROL_INIT_TERM_STRUCT_BITS \
+    (SIZE_OF_TERMINAL_STRUCT_BITS \
+    + IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
+    + (1 * IA_CSS_UINT32_T_BITS) \
+    + (2 * IA_CSS_UINT16_T_BITS) \
+    )
+struct ia_css_program_control_init_terminal_s {
+    /** Parameter terminal base */
+    ia_css_terminal_t base;
+    /** Parameter buffer handle attached to the terminal */
+    ia_css_param_payload_t param_payload;
+    /** Fragment stride for the payload, used to find the base
+     * of the payload for a given fragment
+     */
+    uint32_t payload_fragment_stride;
+    /** Points to the variable array of
+     * ia_css_program_control_init_program_desc_s
+     */
+    uint16_t program_section_desc_offset;
+    /** Number of instantiated programs in program group (processes) */
+    uint16_t program_count;
+};
+/* ================= Program Control Init Terminal - END ================= */
+
+/* ==================== Program Terminal - START ==================== */
+
+#define N_UINT32_IN_FRAG_PARAM_SEC_STRUCT 2
+
+#define SIZE_OF_FRAG_PARAM_SEC_STRUCT_BITS \
+    (N_UINT32_IN_FRAG_PARAM_SEC_STRUCT * IA_CSS_UINT32_T_BITS)
+
+/** Fragment constant parameters section */
+struct ia_css_fragment_param_section_desc_s {
+    /** Offset of the parameter allocation in memory */
+    uint32_t mem_offset;
+    /** Memory allocation size needs of this parameter */
+    uint32_t mem_size;
+};
+
+#define N_UINT16_IN_FRAG_SEQ_COMMAND_STRUCT IA_CSS_N_COMMAND_COUNT
+
+#define SIZE_OF_FRAG_SEQ_COMMANDS_STRUCT_BITS \
+    (N_UINT16_IN_FRAG_SEQ_COMMAND_STRUCT * IA_CSS_UINT16_T_BITS)
+
+/** 4 commands packe together to save memory space */
+struct ia_css_kernel_fragment_sequencer_command_desc_s {
+    /** Contains the "(command_index%4) == index" command desc */
+    uint16_t line_count[IA_CSS_N_COMMAND_COUNT];
+};
+
+#define N_UINT16_IN_FRAG_SEQ_INFO_STRUCT (5 * IA_CSS_N_DATA_DIMENSION + 2)
+
+#define SIZE_OF_FRAG_SEQ_INFO_STRUCT_BITS \
+    (N_UINT16_IN_FRAG_SEQ_INFO_STRUCT * IA_CSS_UINT16_T_BITS)
+
+struct ia_css_kernel_fragment_sequencer_info_desc_s {
+    /** Slice dimensions */
+    uint16_t fragment_grid_slice_dimension[IA_CSS_N_DATA_DIMENSION];
+    /** Nof slices */
+    uint16_t fragment_grid_slice_count[IA_CSS_N_DATA_DIMENSION];
+    /** Grid point decimation factor */
+    uint16_t
+    fragment_grid_point_decimation_factor[IA_CSS_N_DATA_DIMENSION];
+    /** Relative position of grid origin to pixel origin */
+    int16_t
+    fragment_grid_overlay_pixel_topleft_index[IA_CSS_N_DATA_DIMENSION];
+    /** Size of active fragment region */
+    int16_t
+    fragment_grid_overlay_pixel_dimension[IA_CSS_N_DATA_DIMENSION];
+    /** If >0 it overrides the standard fragment sequencer info */
+    uint16_t command_count;
+    /**
+     * To be used only if command_count>0, points to the descriptors
+     * for the commands (ia_css_kernel_fragment_sequencer_command_desc_s)
+     */
+    uint16_t command_desc_offset;
+};
+
+#define N_UINT16_IN_PROG_TERM_STRUCT        2
+#define N_PADDING_UINT8_IN_PROG_TERM_STRUCT    0
+#define N_UINT8_PROG_TERM_STRIDE_SIZE       4
+#define UNIFIED_PROG_TERM_FRAG_DESC
+
+#define SIZE_OF_PROG_TERM_STRUCT_BITS \
+    (SIZE_OF_TERMINAL_STRUCT_BITS \
+    + IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
+    + N_UINT16_IN_PROG_TERM_STRUCT * IA_CSS_UINT16_T_BITS \
+    + N_UINT8_PROG_TERM_STRIDE_SIZE * IA_CSS_UINT8_T_BITS)
+
+struct ia_css_program_terminal_s {
+    /** Program terminal base */
+    ia_css_terminal_t base;
+    /** Program terminal buffer handle attached to the terminal */
+    ia_css_param_payload_t param_payload;
+    /** Points to array of ia_css_fragment_param_desc_s */
+    uint16_t fragment_param_section_desc_offset;
+    /** Points to array of ia_css_kernel_fragment_sequencer_info_s */
+    uint16_t kernel_fragment_sequencer_info_desc_offset;
+    /* stride to next fragment*/
+    uint32_t payload_fragment_stride;
+    /** align to 64 */
+    /*uint8_t padding[N_PADDING_UINT8_IN_PROG_TERM_STRUCT];*/
+};
+/* ==================== Program Terminal - END ==================== */
+
+#endif /* __IA_CSS_TERMINAL_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_trace.h
new file mode 100644
index 000000000000..6ab5e289b096
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_trace.h
@@ -0,0 +1,1002 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*! \file */
+
+#ifndef __IA_CSS_TRACE_H
+#define __IA_CSS_TRACE_H
+
+/*
+** Configurations
+*/
+
+/**
+ * STEP 1: Define {Module Name}_TRACE_METHOD to one of the following.
+ *         Where:
+ *             {Module Name} is the name of the targeted module.
+ *
+ *         Example:
+ *             #define NCI_DMA_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
+ */
+
+/**< Use whatever method of tracing that best suits the platform
+ * this code is compiled for.
+ */
+#define IA_CSS_TRACE_METHOD_NATIVE  1
+/**< Use the Tracing NCI. */
+#define IA_CSS_TRACE_METHOD_TRACE   2
+
+/**
+ * STEP 2: Define {Module Name}_TRACE_LEVEL_{Level} to one of the following.
+ *         Where:
+ *             {Module Name} is the name of the targeted module.
+ *             {Level}, in decreasing order of severity, is one of the
+ *     following values: {ASSERT, ERROR, WARNING, INFO, DEBUG,
+ *                       VERBOSE, FATAL}.
+ *         Example:
+ *             #define NCI_DMA_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_DISABLED
+ *             #define NCI_DMA_TRACE_LEVEL_ERROR  IA_CSS_TRACE_LEVEL_ENABLED
+ */
+/**< Disables the corresponding trace level. */
+#define IA_CSS_TRACE_LEVEL_DISABLED 0
+/**< Enables the corresponding trace level. */
+#define IA_CSS_TRACE_LEVEL_ENABLED  1
+
+/*
+ * Used in macro definition with do-while loop
+ * for removing checkpatch warnings
+ */
+#define IA_CSS_TRACE_FILE_DUMMY_DEFINE
+
+/**
+ * STEP 3: Define IA_CSS_TRACE_PRINT_FILE_LINE to have file name and
+ * line printed with every log message.
+ *
+ *       Example:
+ *           #define IA_CSS_TRACE_PRINT_FILE_LINE
+ */
+
+/*
+** Interface
+*/
+
+/*
+** Static
+*/
+
+/**
+ * Logs a message with zero arguments if the targeted severity level is enabled
+ * at compile-time.
+ * @param module The targeted module.
+ * @param severity The severity level of the trace message. In decreasing order:
+ *                 {ASSERT, ERROR, WARNING, INFO, DEBUG, VERBOSE}.
+ * @param format The message to be traced.
+ */
+#define IA_CSS_TRACE_0(module, severity, format) \
+    IA_CSS_TRACE_IMPL(module, 0, severity, format)
+
+/**
+ * Logs a message with one argument if the targeted severity level is enabled
+ * at compile-time.
+ * @see IA_CSS_TRACE_0
+ */
+#define IA_CSS_TRACE_1(module, severity, format, a1) \
+    IA_CSS_TRACE_IMPL(module, 1, severity, format, a1)
+
+/**
+ * Logs a message with two arguments if the targeted severity level is enabled
+ * at compile-time.
+ * @see IA_CSS_TRACE_0
+ */
+#define IA_CSS_TRACE_2(module, severity, format, a1, a2) \
+    IA_CSS_TRACE_IMPL(module, 2, severity, format, a1, a2)
+
+/**
+ * Logs a message with three arguments if the targeted severity level
+ * is enabled at compile-time.
+ * @see IA_CSS_TRACE_0
+ */
+#define IA_CSS_TRACE_3(module, severity, format, a1, a2, a3) \
+    IA_CSS_TRACE_IMPL(module, 3, severity, format, a1, a2, a3)
+
+/**
+ * Logs a message with four arguments if the targeted severity level is enabled
+ * at compile-time.
+ * @see IA_CSS_TRACE_0
+ */
+#define IA_CSS_TRACE_4(module, severity, format, a1, a2, a3, a4) \
+    IA_CSS_TRACE_IMPL(module, 4, severity, format, a1, a2, a3, a4)
+
+/**
+ * Logs a message with five arguments if the targeted severity level is enabled
+ * at compile-time.
+ * @see IA_CSS_TRACE_0
+ */
+#define IA_CSS_TRACE_5(module, severity, format, a1, a2, a3, a4, a5) \
+    IA_CSS_TRACE_IMPL(module, 5, severity, format, a1, a2, a3, a4, a5)
+
+/**
+ * Logs a message with six arguments if the targeted severity level is enabled
+ * at compile-time.
+ * @see IA_CSS_TRACE_0
+ */
+#define IA_CSS_TRACE_6(module, severity, format, a1, a2, a3, a4, a5, a6) \
+    IA_CSS_TRACE_IMPL(module, 6, severity, format, a1, a2, a3, a4, a5, a6)
+
+/**
+ * Logs a message with seven arguments if the targeted severity level
+ * is enabled at compile-time.
+ * @see IA_CSS_TRACE_0
+ */
+#define IA_CSS_TRACE_7(module, severity, format, a1, a2, a3, a4, a5, a6, a7) \
+    IA_CSS_TRACE_IMPL(module, 7, severity, format, \
+                    a1, a2, a3, a4, a5, a6, a7)
+
+/*
+** Dynamic
+*/
+
+/**
+* Declares, but does not define, dynamic tracing functions and variables
+* for module \p module.  For each module, place an instance of this macro
+* in the compilation unit in which you want to use dynamic tracing facility
+* so as to inform the compiler of the declaration of the available functions.
+* An invocation of this function does not enable any of the available tracing
+* levels.  Do not place a semicolon after a call to this macro.
+* @see IA_CSS_TRACE_DYNAMIC_DEFINE
+*/
+#define IA_CSS_TRACE_DYNAMIC_DECLARE(module) \
+    IA_CSS_TRACE_DYNAMIC_DECLARE_IMPL(module)
+/**
+* Declares the configuration function for the dynamic api seperatly, if one
+* wants to use it.
+*/
+#define IA_CSS_TRACE_DYNAMIC_DECLARE_CONFIG_FUNC(module) \
+    IA_CSS_TRACE_DYNAMIC_DECLARE_CONFIG_FUNC_IMPL(module)
+
+/**
+* Defines dynamic tracing functions and variables for module \p module.
+* For each module, place an instance of this macro in one, and only one,
+* of your SOURCE files so as to allow the linker resolve the related symbols.
+* An invocation of this macro does not enable any of the available tracing
+* levels.  Do not place a semicolon after a call to this macro.
+* @see IA_CSS_TRACE_DYNAMIC_DECLARE
+*/
+#define IA_CSS_TRACE_DYNAMIC_DEFINE(module) \
+    IA_CSS_TRACE_DYNAMIC_DEFINE_IMPL(module)
+/**
+* Defines the configuration function for the dynamic api seperatly, if one
+* wants to use it.
+*/
+#define IA_CSS_TRACE_DYNAMIC_DEFINE_CONFIG_FUNC(module) \
+    IA_CSS_TRACE_DYNAMIC_DEFINE_CONFIG_FUNC_IMPL(module)
+
+/**
+ * Logs a message with zero arguments if the targeted severity level is enabled
+ * both at compile-time, and run-time.
+ * @param module The targeted module.
+ * @param severity The severity level of the trace message. In decreasing order:
+ *                 {ASSERT, ERROR, WARNING, INFO, DEBUG, VERBOSE}.
+ * @param format The message to be traced.
+ */
+#define IA_CSS_TRACE_DYNAMIC_0(module, severity, format) \
+    IA_CSS_TRACE_DYNAMIC_IMPL(module, 0, severity, format)
+
+/**
+ * Logs a message with one argument if the targeted severity level is enabled
+ * both at compile-time, and run-time.
+ * @see IA_CSS_TRACE_DYNAMIC_0
+ */
+#define IA_CSS_TRACE_DYNAMIC_1(module, severity, format, a1) \
+    IA_CSS_TRACE_DYNAMIC_IMPL(module, 1, severity, format, a1)
+
+/**
+ * Logs a message with two arguments if the targeted severity level is enabled
+ * both at compile-time, and run-time.
+ * @see IA_CSS_TRACE_DYNAMIC_0
+ */
+#define IA_CSS_TRACE_DYNAMIC_2(module, severity, format, a1, a2) \
+    IA_CSS_TRACE_DYNAMIC_IMPL(module, 2, severity, format, a1, a2)
+
+/**
+ * Logs a message with three arguments if the targeted severity level
+ * is enabled both at compile-time, and run-time.
+ * @see IA_CSS_TRACE_DYNAMIC_0
+ */
+#define IA_CSS_TRACE_DYNAMIC_3(module, severity, format, a1, a2, a3) \
+    IA_CSS_TRACE_DYNAMIC_IMPL(module, 3, severity, format, a1, a2, a3)
+
+/**
+ * Logs a message with four arguments if the targeted severity level is enabled
+ * both at compile-time, and run-time.
+ * @see IA_CSS_TRACE_DYNAMIC_0
+ */
+#define IA_CSS_TRACE_DYNAMIC_4(module, severity, format, a1, a2, a3, a4) \
+    IA_CSS_TRACE_DYNAMIC_IMPL(module, 4, severity, format, a1, a2, a3, a4)
+
+/**
+ * Logs a message with five arguments if the targeted severity level is enabled
+ * both at compile-time, and run-time.
+ * @see IA_CSS_TRACE_DYNAMIC_0
+ */
+#define IA_CSS_TRACE_DYNAMIC_5(module, severity, format, a1, a2, a3, a4, a5) \
+    IA_CSS_TRACE_DYNAMIC_IMPL(module, 5, severity, format, \
+                        a1, a2, a3, a4, a5)
+
+/**
+ * Logs a message with six arguments if the targeted severity level is enabled
+ * both at compile-time, and run-time.
+ * @see IA_CSS_TRACE_DYNAMIC_0
+ */
+#define IA_CSS_TRACE_DYNAMIC_6(module, severity, format, \
+                        a1, a2, a3, a4, a5, a6) \
+    IA_CSS_TRACE_DYNAMIC_IMPL(module, 6, severity, format, \
+                        a1, a2, a3, a4, a5, a6)
+
+/**
+ * Logs a message with seven arguments if the targeted severity level
+ * is enabled both at compile-time, and run-time.
+ * @see IA_CSS_TRACE_DYNAMIC_0
+ */
+#define IA_CSS_TRACE_DYNAMIC_7(module, severity, format, \
+                        a1, a2, a3, a4, a5, a6, a7) \
+    IA_CSS_TRACE_DYNAMIC_IMPL(module, 7, severity, format, \
+                        a1, a2, a3, a4, a5, a6, a7)
+
+/*
+** Implementation
+*/
+
+/* CAT */
+#define IA_CSS_TRACE_CAT_IMPL(a, b) a ## b
+#define IA_CSS_TRACE_CAT(a, b) IA_CSS_TRACE_CAT_IMPL(a, b)
+
+/* Bridge */
+#if defined(__HIVECC) || defined(__GNUC__)
+#define IA_CSS_TRACE_IMPL(module, argument_count, severity, arguments ...) \
+    IA_CSS_TRACE_CAT( \
+        IA_CSS_TRACE_CAT( \
+            IA_CSS_TRACE_CAT( \
+                IA_CSS_TRACE_CAT( \
+                    IA_CSS_TRACE_CAT( \
+                        IA_CSS_TRACE_, \
+                        argument_count \
+                    ), \
+                    _ \
+                ), \
+                IA_CSS_TRACE_CAT( \
+                    module, \
+                    _TRACE_METHOD \
+                ) \
+            ), \
+            _ \
+        ), \
+        IA_CSS_TRACE_CAT( \
+            IA_CSS_TRACE_CAT( \
+                module, \
+                _TRACE_LEVEL_ \
+            ), \
+            severity \
+        ) \
+        ( \
+            IA_CSS_TRACE_CAT( \
+                IA_CSS_TRACE_CAT( \
+                    IA_CSS_TRACE_CAT( \
+                        IA_CSS_TRACE_SEVERITY_, \
+                        severity \
+                    ), \
+                    _ \
+                ), \
+                IA_CSS_TRACE_CAT( \
+                    module, \
+                    _TRACE_METHOD \
+                ) \
+            ), \
+            #module, \
+            ## arguments \
+        ) \
+    )
+
+/* Bridge */
+#define IA_CSS_TRACE_DYNAMIC_IMPL(module, argument_count, severity, \
+                            arguments ...) \
+    do { \
+        if (IA_CSS_TRACE_CAT(IA_CSS_TRACE_CAT(module, _trace_level_), \
+                            severity)) { \
+            IA_CSS_TRACE_IMPL(module, argument_count, severity, \
+                            ## arguments); \
+        } \
+    } while (0)
+#elif defined(_MSC_VER)
+#define IA_CSS_TRACE_IMPL(module, argument_count, severity, ...) \
+    IA_CSS_TRACE_CAT( \
+        IA_CSS_TRACE_CAT( \
+            IA_CSS_TRACE_CAT( \
+                IA_CSS_TRACE_CAT( \
+                    IA_CSS_TRACE_CAT( \
+                        IA_CSS_TRACE_, \
+                        argument_count \
+                    ), \
+                    _ \
+                ), \
+                IA_CSS_TRACE_CAT( \
+                    module, \
+                    _TRACE_METHOD \
+                ) \
+            ), \
+            _ \
+        ), \
+        IA_CSS_TRACE_CAT( \
+            IA_CSS_TRACE_CAT( \
+                module, \
+                _TRACE_LEVEL_ \
+            ), \
+            severity \
+        ) \
+        ( \
+            IA_CSS_TRACE_CAT( \
+                IA_CSS_TRACE_CAT( \
+                    IA_CSS_TRACE_CAT( \
+                        IA_CSS_TRACE_SEVERITY_, \
+                        severity \
+                    ), \
+                    _ \
+                ), \
+                IA_CSS_TRACE_CAT( \
+                    module, \
+                    _TRACE_METHOD \
+                ) \
+            ), \
+            #module, \
+            __VA_ARGS__  \
+        ) \
+    )
+
+/* Bridge */
+#define IA_CSS_TRACE_DYNAMIC_IMPL(module, argument_count, severity, ...) \
+    do { \
+        if (IA_CSS_TRACE_CAT(IA_CSS_TRACE_CAT(module, _trace_level_), \
+                            severity)) { \
+            IA_CSS_TRACE_IMPL(module, argument_count, severity, \
+                            __VA_ARGS__); \
+        } \
+    } while (0)
+#endif
+
+/*
+** Native Backend
+*/
+
+#if defined(__HIVECC)
+    #define IA_CSS_TRACE_PLATFORM_CELL
+#elif defined(__XTENSA__)
+    #define IA_CSS_TRACE_PLATFORM_XTENSA
+#elif defined(XTENSA_HOST)
+    #define IA_CSS_TRACE_PLATFORM_XTENSA
+#elif defined(__GNUC__)
+    #define IA_CSS_TRACE_PLATFORM_HOST
+
+    #define IA_CSS_TRACE_NATIVE(severity, module, format, arguments ...) \
+    do { \
+        IA_CSS_TRACE_FILE_PRINT_COMMAND; \
+        PRINT(IA_CSS_TRACE_FORMAT_AUG_NATIVE(severity, module, \
+                        format),  ## arguments); \
+    } while (0)
+    /* TODO: In case Host Side tracing is needed to be mapped to the
+     * Tunit, the following "IA_CSS_TRACE_TRACE" needs to be modified from
+     * PRINT to vied_nci_tunit_print function calls
+    */
+    #define IA_CSS_TRACE_TRACE(severity, module, format, arguments ...) \
+    do { \
+        IA_CSS_TRACE_FILE_PRINT_COMMAND; \
+        PRINT(IA_CSS_TRACE_FORMAT_AUG_TRACE(severity, module, \
+                        format),  ## arguments); \
+    } while (0)
+
+#elif defined(_MSC_VER)
+    #define IA_CSS_TRACE_PLATFORM_HOST
+
+#ifdef _KERNEL_MODE
+    #define IA_CSS_TRACE_NATIVE(severity, module, format, ...) \
+        do { \
+            IA_CSS_TRACE_FILE_PRINT_COMMAND; \
+            P##severity(IA_CSS_TRACE_FORMAT_AUG_NATIVE(#severity, \
+                    module, format),  __VA_ARGS__); \
+        } while (0)
+    /* TODO: In case Host Side tracing is needed to be mapped to the
+     * Tunit, the following "IA_CSS_TRACE_TRACE" needs to be modified from
+     * PRINT to vied_nci_tunit_print function calls
+    */
+    #define IA_CSS_TRACE_TRACE(severity, module, format, ...) \
+        do { \
+            IA_CSS_TRACE_FILE_PRINT_COMMAND; \
+            P##severity(IA_CSS_TRACE_FORMAT_AUG_TRACE(#severity, \
+                    module, format),  __VA_ARGS__); \
+        } while (0)
+#else
+    #define IA_CSS_TRACE_NATIVE(severity, module, format, ...) \
+        do { \
+            IA_CSS_TRACE_FILE_PRINT_COMMAND; \
+            PRINT(IA_CSS_TRACE_FORMAT_AUG_NATIVE(severity, \
+                    module, format),  __VA_ARGS__); \
+        } while (0)
+    /* TODO: In case Host Side tracing is needed to be mapped to the
+     * Tunit, the following "IA_CSS_TRACE_TRACE" needs to be modified from
+     * PRINT to vied_nci_tunit_print function calls
+    */
+    #define IA_CSS_TRACE_TRACE(severity, module, format, ...) \
+        do { \
+            IA_CSS_TRACE_FILE_PRINT_COMMAND; \
+            PRINT(IA_CSS_TRACE_FORMAT_AUG_TRACE(severity, \
+                    module, format),  __VA_ARGS__); \
+        } while (0)
+#endif
+#else
+    #error Unsupported platform!
+#endif /* Platform */
+
+#if defined(IA_CSS_TRACE_PLATFORM_CELL)
+    #include <hive/attributes.h> /* VOLATILE */
+
+    #ifdef IA_CSS_TRACE_PRINT_FILE_LINE
+        #define IA_CSS_TRACE_FILE_PRINT_COMMAND \
+            do { \
+                OP___printstring(__FILE__":") VOLATILE; \
+                OP___printdec(__LINE__) VOLATILE; \
+                OP___printstring("\n") VOLATILE; \
+            } while (0)
+    #else
+        #define IA_CSS_TRACE_FILE_PRINT_COMMAND
+    #endif
+
+    #define IA_CSS_TRACE_MODULE_SEVERITY_PRINT(module, severity) \
+        do { \
+            IA_CSS_TRACE_FILE_DUMMY_DEFINE; \
+            OP___printstring("["module"]:["severity"]:") \
+            VOLATILE; \
+        } while (0)
+
+    #define IA_CSS_TRACE_MSG_NATIVE(severity, module, format) \
+        do { \
+            IA_CSS_TRACE_FILE_PRINT_COMMAND; \
+            OP___printstring("["module"]:["severity"]: "format) \
+            VOLATILE; \
+        } while (0)
+
+    #define IA_CSS_TRACE_ARG_NATIVE(module, severity, i, value) \
+        do { \
+            IA_CSS_TRACE_MODULE_SEVERITY_PRINT(module, severity); \
+            OP___dump(i, value) VOLATILE; \
+        } while (0)
+
+    #define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
+        IA_CSS_TRACE_MSG_NATIVE(severity, module, format)
+
+    #define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
+        do { \
+            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
+        } while (0)
+
+    #define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
+        do { \
+            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
+        } while (0)
+
+    #define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
+        do { \
+            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
+        } while (0)
+
+    #define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
+                        a1, a2, a3, a4) \
+        do { \
+            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
+        } while (0)
+
+    #define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
+                        a1, a2, a3, a4, a5) \
+        do { \
+            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 5, a5); \
+        } while (0)
+
+    #define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
+                        a1, a2, a3, a4, a5, a6) \
+        do { \
+            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 5, a5); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 6, a6); \
+        } while (0)
+
+    #define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
+                        a1, a2, a3, a4, a5, a6, a7) \
+        do { \
+            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 5, a5); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 6, a6); \
+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 7, a7); \
+        } while (0)
+    /*
+    ** Tracing Backend
+    */
+#if !defined(HRT_CSIM) && !defined(NO_TUNIT)
+    #include "vied_nci_tunit.h"
+#endif
+    #define IA_CSS_TRACE_AUG_FORMAT_TRACE(format, module) \
+        "[" module "]" format " : PID = %x : Timestamp = %d : PC = %x"
+
+    #define IA_CSS_TRACE_TRACE_0(severity, module, format) \
+        vied_nci_tunit_print(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
+                                module), \
+            severity)
+
+    #define IA_CSS_TRACE_TRACE_1(severity, module, format, a1) \
+        vied_nci_tunit_print1i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
+                                module), \
+            severity, a1)
+
+    #define IA_CSS_TRACE_TRACE_2(severity, module, format, a1, a2) \
+        vied_nci_tunit_print2i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
+                                module), \
+            severity, a1, a2)
+
+    #define IA_CSS_TRACE_TRACE_3(severity, module, format, a1, a2, a3) \
+        vied_nci_tunit_print3i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
+                                module), \
+            severity, a1, a2, a3)
+
+    #define IA_CSS_TRACE_TRACE_4(severity, module, format, a1, a2, a3, a4) \
+        vied_nci_tunit_print4i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
+                                module), \
+            severity, a1, a2, a3, a4)
+
+    #define IA_CSS_TRACE_TRACE_5(severity, module, format, \
+                        a1, a2, a3, a4, a5) \
+        vied_nci_tunit_print5i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
+                                module), \
+            severity, a1, a2, a3, a4, a5)
+
+    #define IA_CSS_TRACE_TRACE_6(severity, module, format, \
+                        a1, a2, a3, a4, a5, a6) \
+        vied_nci_tunit_print6i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
+                                module), \
+            severity, a1, a2, a3, a4, a5, a6)
+
+    #define IA_CSS_TRACE_TRACE_7(severity, module, format, \
+                        a1, a2, a3, a4, a5, a6, a7) \
+        vied_nci_tunit_print7i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
+                                module), \
+            severity, a1, a2, a3, a4, a5, a6, a7)
+
+#elif defined(IA_CSS_TRACE_PLATFORM_XTENSA)
+    #include "print_support_xtensa.h"
+
+    /* TODO: Tunit tracing is not yet supported on Xtensa platforms,
+     * proper Trace functions will be created once supported.
+     */
+
+    #define IA_CSS_TRACE_TRACE_0(severity, module, format)
+    #define IA_CSS_TRACE_TRACE_1(severity, module, format, a1)
+    #define IA_CSS_TRACE_TRACE_2(severity, module, format, a1, a2)
+    #define IA_CSS_TRACE_TRACE_3(severity, module, format, a1, a2, a3)
+    #define IA_CSS_TRACE_TRACE_4(severity, module, format, a1, a2, a3, a4)
+    #define IA_CSS_TRACE_TRACE_5(severity, module, format, a1, a2, a3, a4, a5)
+    #define IA_CSS_TRACE_TRACE_6(severity, module, format, a1, a2, a3, a4, a5, a6)
+    #define IA_CSS_TRACE_TRACE_7(severity, module, format, a1, a2, a3, a4, a5, a6, a7)
+
+#ifdef __XTENSA_FW__
+    #define SOURCE "FW"
+#else
+    #define SOURCE "HOST"
+#endif
+
+#if defined(XTENSA_PRINT_USE_SIMCALL)
+
+    #define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
+    simcall_log_msg_0("[" SOURCE "]:[" module "]:[" severity "]: " format)
+
+    #define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
+    simcall_log_msg_1("[" SOURCE "]:[" module "]:[" severity "]: " format, a1)
+
+    #define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
+    simcall_log_msg_2("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2)
+
+    #define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
+    simcall_log_msg_3("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3)
+
+    #define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
+                        a1, a2, a3, a4) \
+    simcall_log_msg_4("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4)
+
+    #define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
+                        a1, a2, a3, a4, a5) \
+    simcall_log_msg_5("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5)
+
+    #define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
+                        a1, a2, a3, a4, a5, a6) \
+    simcall_log_msg_6("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6)
+
+    #define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
+                        a1, a2, a3, a4, a5, a6, a7) \
+    simcall_log_msg_7("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6, a7)
+
+#elif defined(XTENSA_PRINT_USE_PRINTF)
+
+    #define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
+    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format)
+
+    #define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
+    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1)
+
+    #define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
+    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2)
+
+    #define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
+    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3)
+
+    #define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
+                        a1, a2, a3, a4) \
+    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4)
+
+    #define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
+                        a1, a2, a3, a4, a5) \
+    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5)
+
+    #define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
+                        a1, a2, a3, a4, a5, a6) \
+    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6)
+
+    #define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
+                        a1, a2, a3, a4, a5, a6, a7) \
+    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6, a7)
+
+#endif
+#elif defined(IA_CSS_TRACE_PLATFORM_HOST)
+    #include "print_support.h"
+
+    #ifdef IA_CSS_TRACE_PRINT_FILE_LINE
+        #define IA_CSS_TRACE_FILE_PRINT_COMMAND \
+                PRINT("%s:%d:\n", __FILE__, __LINE__)
+    #else
+        #define IA_CSS_TRACE_FILE_PRINT_COMMAND
+    #endif
+
+    #define IA_CSS_TRACE_FORMAT_AUG_NATIVE(severity, module, format) \
+            "[" module "]:[" severity "]: " format
+
+    #define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
+        IA_CSS_TRACE_NATIVE(severity, module, format)
+
+    #define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
+        IA_CSS_TRACE_NATIVE(severity, module, format, a1)
+
+    #define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
+        IA_CSS_TRACE_NATIVE(severity, module, format, a1, a2)
+
+    #define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
+        IA_CSS_TRACE_NATIVE(severity, module, format, a1, a2, a3)
+
+    #define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
+                        a1, a2, a3, a4) \
+        IA_CSS_TRACE_NATIVE(severity, module, format, a1, a2, a3, a4)
+
+    #define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
+                        a1, a2, a3, a4, a5) \
+        IA_CSS_TRACE_NATIVE(severity, module, format, \
+                        a1, a2, a3, a4, a5)
+
+    #define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
+                        a1, a2, a3, a4, a5, a6) \
+        IA_CSS_TRACE_NATIVE(severity, module, format, \
+                        a1, a2, a3, a4, a5, a6)
+
+    #define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
+                        a1, a2, a3, a4, a5, a6, a7) \
+        IA_CSS_TRACE_NATIVE(severity, module, format, \
+                        a1, a2, a3, a4, a5, a6, a7)
+
+    #define IA_CSS_TRACE_FORMAT_AUG_TRACE(severity, module, format) \
+            "["module"]:["severity"]: "format
+
+    #define IA_CSS_TRACE_TRACE_0(severity, module, format) \
+        IA_CSS_TRACE_TRACE(severity, module, format)
+
+    #define IA_CSS_TRACE_TRACE_1(severity, module, format, a1) \
+        IA_CSS_TRACE_TRACE(severity, module, format, a1)
+
+    #define IA_CSS_TRACE_TRACE_2(severity, module, format, a1, a2) \
+        IA_CSS_TRACE_TRACE(severity, module, format, a1, a2)
+
+    #define IA_CSS_TRACE_TRACE_3(severity, module, format, a1, a2, a3) \
+        IA_CSS_TRACE_TRACE(severity, module, format, a1, a2, a3)
+
+    #define IA_CSS_TRACE_TRACE_4(severity, module, format, \
+                        a1, a2, a3, a4) \
+        IA_CSS_TRACE_TRACE(severity, module, format, a1, a2, a3, a4)
+
+    #define IA_CSS_TRACE_TRACE_5(severity, module, format, \
+                        a1, a2, a3, a4, a5) \
+        IA_CSS_TRACE_TRACE(severity, module, format, \
+                        a1, a2, a3, a4, a5)
+
+    #define IA_CSS_TRACE_TRACE_6(severity, module, format, \
+                        a1, a2, a3, a4, a5, a6) \
+        IA_CSS_TRACE_TRACE(severity, module, format, \
+                        a1, a2, a3, a4, a5, a6)
+
+    #define IA_CSS_TRACE_TRACE_7(severity, module, format, \
+                        a1, a2, a3, a4, a5, a6, a7) \
+        IA_CSS_TRACE_TRACE(severity, module, format, \
+                        a1, a2, a3, a4, a5, a6, a7)
+#endif
+
+/* Disabled */
+/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
+#define IA_CSS_TRACE_0_1_0(severity, module, format)
+#define IA_CSS_TRACE_1_1_0(severity, module, format, arg1)
+#define IA_CSS_TRACE_2_1_0(severity, module, format, arg1, arg2)
+#define IA_CSS_TRACE_3_1_0(severity, module, format, arg1, arg2, arg3)
+#define IA_CSS_TRACE_4_1_0(severity, module, format, arg1, arg2, arg3, arg4)
+#define IA_CSS_TRACE_5_1_0(severity, module, format, arg1, arg2, arg3, arg4, \
+                            arg5)
+#define IA_CSS_TRACE_6_1_0(severity, module, format, arg1, arg2, arg3, arg4, \
+                            arg5, arg6)
+#define IA_CSS_TRACE_7_1_0(severity, module, format, arg1, arg2, arg3, arg4, \
+                            arg5, arg6, arg7)
+
+/* Enabled */
+/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
+#define IA_CSS_TRACE_0_1_1 IA_CSS_TRACE_NATIVE_0
+#define IA_CSS_TRACE_1_1_1 IA_CSS_TRACE_NATIVE_1
+#define IA_CSS_TRACE_2_1_1 IA_CSS_TRACE_NATIVE_2
+#define IA_CSS_TRACE_3_1_1 IA_CSS_TRACE_NATIVE_3
+#define IA_CSS_TRACE_4_1_1 IA_CSS_TRACE_NATIVE_4
+#define IA_CSS_TRACE_5_1_1 IA_CSS_TRACE_NATIVE_5
+#define IA_CSS_TRACE_6_1_1 IA_CSS_TRACE_NATIVE_6
+#define IA_CSS_TRACE_7_1_1 IA_CSS_TRACE_NATIVE_7
+
+#if defined(_MSC_VER) && defined(_KERNEL_MODE)
+/* Enabled */
+/* Legend: IA_CSS_TRACE_SEVERITY_{Severity Level}_{Backend ID} */
+#define IA_CSS_TRACE_SEVERITY_ASSERT_1  ASSERT
+#define IA_CSS_TRACE_SEVERITY_ERROR_1   ERROR
+#define IA_CSS_TRACE_SEVERITY_WARNING_1 WARNING
+#define IA_CSS_TRACE_SEVERITY_INFO_1    INFO
+#define IA_CSS_TRACE_SEVERITY_DEBUG_1   DEBUG
+#define IA_CSS_TRACE_SEVERITY_VERBOSE_1 VERBOSE
+#define IA_CSS_TRACE_SEVERITY_FATAL_1   FATAL
+#else
+/* Enabled */
+/* Legend: IA_CSS_TRACE_SEVERITY_{Severity Level}_{Backend ID} */
+#define IA_CSS_TRACE_SEVERITY_ASSERT_1  "Assert"
+#define IA_CSS_TRACE_SEVERITY_ERROR_1   "Error"
+#define IA_CSS_TRACE_SEVERITY_WARNING_1 "Warning"
+#define IA_CSS_TRACE_SEVERITY_INFO_1    "Info"
+#define IA_CSS_TRACE_SEVERITY_DEBUG_1   "Debug"
+#define IA_CSS_TRACE_SEVERITY_VERBOSE_1 "Verbose"
+#define IA_CSS_TRACE_SEVERITY_FATAL_1   "Fatal"
+#endif
+/* Disabled */
+/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
+#define IA_CSS_TRACE_0_2_0(severity, module, format)
+#define IA_CSS_TRACE_1_2_0(severity, module, format, arg1)
+#define IA_CSS_TRACE_2_2_0(severity, module, format, arg1, arg2)
+#define IA_CSS_TRACE_3_2_0(severity, module, format, arg1, arg2, arg3)
+#define IA_CSS_TRACE_4_2_0(severity, module, format, arg1, arg2, arg3, arg4)
+#define IA_CSS_TRACE_5_2_0(severity, module, format, arg1, arg2, arg3, arg4, \
+                            arg5)
+#define IA_CSS_TRACE_6_2_0(severity, module, format, arg1, arg2, arg3, arg4, \
+                            arg5, arg6)
+#define IA_CSS_TRACE_7_2_0(severity, module, format, arg1, arg2, arg3, arg4, \
+                            arg5, arg6, arg7)
+
+/* Enabled */
+/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
+#define IA_CSS_TRACE_0_2_1 IA_CSS_TRACE_TRACE_0
+#define IA_CSS_TRACE_1_2_1 IA_CSS_TRACE_TRACE_1
+#define IA_CSS_TRACE_2_2_1 IA_CSS_TRACE_TRACE_2
+#define IA_CSS_TRACE_3_2_1 IA_CSS_TRACE_TRACE_3
+#define IA_CSS_TRACE_4_2_1 IA_CSS_TRACE_TRACE_4
+#define IA_CSS_TRACE_5_2_1 IA_CSS_TRACE_TRACE_5
+#define IA_CSS_TRACE_6_2_1 IA_CSS_TRACE_TRACE_6
+#define IA_CSS_TRACE_7_2_1 IA_CSS_TRACE_TRACE_7
+
+/* Enabled */
+/* Legend: IA_CSS_TRACE_SEVERITY_{Severity Level}_{Backend ID} */
+#define IA_CSS_TRACE_SEVERITY_ASSERT_2  VIED_NCI_TUNIT_MSG_SEVERITY_FATAL
+#define IA_CSS_TRACE_SEVERITY_ERROR_2   VIED_NCI_TUNIT_MSG_SEVERITY_ERROR
+#define IA_CSS_TRACE_SEVERITY_WARNING_2 VIED_NCI_TUNIT_MSG_SEVERITY_WARNING
+#define IA_CSS_TRACE_SEVERITY_INFO_2    VIED_NCI_TUNIT_MSG_SEVERITY_NORMAL
+#define IA_CSS_TRACE_SEVERITY_DEBUG_2   VIED_NCI_TUNIT_MSG_SEVERITY_USER1
+#define IA_CSS_TRACE_SEVERITY_VERBOSE_2 VIED_NCI_TUNIT_MSG_SEVERITY_USER2
+
+/*
+** Dynamicism
+*/
+
+#define IA_CSS_TRACE_DYNAMIC_DECLARE_IMPL(module) \
+    do { \
+        void IA_CSS_TRACE_CAT(module, _trace_assert_enable)(void); \
+        void IA_CSS_TRACE_CAT(module, _trace_assert_disable)(void); \
+        void IA_CSS_TRACE_CAT(module, _trace_error_enable)(void); \
+        void IA_CSS_TRACE_CAT(module, _trace_error_disable)(void); \
+        void IA_CSS_TRACE_CAT(module, _trace_warning_enable)(void); \
+        void IA_CSS_TRACE_CAT(module, _trace_warning_disable)(void); \
+        void IA_CSS_TRACE_CAT(module, _trace_info_enable)(void); \
+        void IA_CSS_TRACE_CAT(module, _trace_info_disable)(void); \
+        void IA_CSS_TRACE_CAT(module, _trace_debug_enable)(void); \
+        void IA_CSS_TRACE_CAT(module, _trace_debug_disable)(void); \
+        void IA_CSS_TRACE_CAT(module, _trace_verbose_enable)(void); \
+        void IA_CSS_TRACE_CAT(module, _trace_verbose_disable)(void); \
+    } while (0)
+
+#define IA_CSS_TRACE_DYNAMIC_DECLARE_CONFIG_FUNC_IMPL(module) \
+    do { \
+        IA_CSS_TRACE_FILE_DUMMY_DEFINE; \
+        void IA_CSS_TRACE_CAT(module, _trace_configure)\
+            (int argc, const char *const *argv); \
+    } while (0)
+
+#include "platform_support.h"
+#include "type_support.h"
+
+#define IA_CSS_TRACE_DYNAMIC_DEFINE_IMPL(module) \
+    static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_assert); \
+    static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_error); \
+    static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_warning); \
+    static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_info); \
+    static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_debug); \
+    static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_verbose); \
+    \
+    void IA_CSS_TRACE_CAT(module, _trace_assert_enable)(void) \
+    { \
+        IA_CSS_TRACE_CAT(module, _trace_level_assert) = 1; \
+    } \
+    \
+    void IA_CSS_TRACE_CAT(module, _trace_assert_disable)(void) \
+    { \
+        IA_CSS_TRACE_CAT(module, _trace_level_assert) = 0; \
+    } \
+    \
+    void IA_CSS_TRACE_CAT(module, _trace_error_enable)(void) \
+    { \
+        IA_CSS_TRACE_CAT(module, _trace_level_error) = 1; \
+    } \
+    \
+    void IA_CSS_TRACE_CAT(module, _trace_error_disable)(void) \
+    { \
+        IA_CSS_TRACE_CAT(module, _trace_level_error) = 0; \
+    } \
+    \
+    void IA_CSS_TRACE_CAT(module, _trace_warning_enable)(void) \
+    { \
+        IA_CSS_TRACE_CAT(module, _trace_level_warning) = 1; \
+    } \
+    \
+    void IA_CSS_TRACE_CAT(module, _trace_warning_disable)(void) \
+    { \
+        IA_CSS_TRACE_CAT(module, _trace_level_warning) = 0; \
+    } \
+    \
+    void IA_CSS_TRACE_CAT(module, _trace_info_enable)(void) \
+    { \
+        IA_CSS_TRACE_CAT(module, _trace_level_info) = 1; \
+    } \
+    \
+    void IA_CSS_TRACE_CAT(module, _trace_info_disable)(void) \
+    { \
+        IA_CSS_TRACE_CAT(module, _trace_level_info) = 0; \
+    } \
+    \
+    void IA_CSS_TRACE_CAT(module, _trace_debug_enable)(void) \
+    { \
+        IA_CSS_TRACE_CAT(module, _trace_level_debug) = 1; \
+    } \
+    \
+    void IA_CSS_TRACE_CAT(module, _trace_debug_disable)(void) \
+    { \
+        IA_CSS_TRACE_CAT(module, _trace_level_debug) = 0; \
+    } \
+    \
+    void IA_CSS_TRACE_CAT(module, _trace_verbose_enable)(void) \
+    { \
+        IA_CSS_TRACE_CAT(module, _trace_level_verbose) = 1; \
+    } \
+    \
+    void IA_CSS_TRACE_CAT(module, _trace_verbose_disable)(void) \
+    { \
+        IA_CSS_TRACE_CAT(module, _trace_level_verbose) = 0; \
+    }
+
+#define IA_CSS_TRACE_DYNAMIC_DEFINE_CONFIG_FUNC_IMPL(module) \
+void IA_CSS_TRACE_CAT(module, _trace_configure)(const int argc, \
+                const char *const *const argv) \
+{ \
+    int i = 1; \
+    const char *levels = 0; \
+    \
+    while (i < argc) { \
+        if (!strcmp(argv[i], "-" #module "_trace")) { \
+            ++i; \
+            \
+            if (i < argc) { \
+                levels = argv[i]; \
+                \
+                while (*levels) { \
+                    switch (*levels++) { \
+                    case 'a': \
+                        IA_CSS_TRACE_CAT \
+                    (module, _trace_assert_enable)(); \
+                        break; \
+                        \
+                    case 'e': \
+                        IA_CSS_TRACE_CAT \
+                    (module, _trace_error_enable)(); \
+                        break; \
+                        \
+                    case 'w': \
+                        IA_CSS_TRACE_CAT \
+                    (module, _trace_warning_enable)(); \
+                        break; \
+                        \
+                    case 'i': \
+                        IA_CSS_TRACE_CAT \
+                    (module, _trace_info_enable)(); \
+                        break; \
+                        \
+                    case 'd': \
+                        IA_CSS_TRACE_CAT \
+                    (module, _trace_debug_enable)(); \
+                        break; \
+                        \
+                    case 'v': \
+                        IA_CSS_TRACE_CAT \
+                    (module, _trace_verbose_enable)(); \
+                        break; \
+                        \
+                    default: \
+                    } \
+                } \
+            } \
+        } \
+        \
+    ++i; \
+    } \
+}
+
+#endif /* __IA_CSS_TRACE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_acb_devices.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_acb_devices.h
new file mode 100644
index 000000000000..0fc17cca1a74
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_acb_devices.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IPU_DEVICE_ACB_DEVICES_H
+#define __IPU_DEVICE_ACB_DEVICES_H
+
+enum ipu_device_acb_id {
+    /* PSA accelerators */
+    IPU_DEVICE_ACB_RYNR_ID = 0,
+    IPU_DEVICE_ACB_DEMOSAIC_ID,
+    IPU_DEVICE_ACB_VCSC_ID,
+    IPU_DEVICE_ACB_GLTM_ID,
+    IPU_DEVICE_ACB_XNR_ID,
+    IPU_DEVICE_ACB_ACM_ID, /* ACM is called VCA in HW */
+    IPU_DEVICE_ACB_GAMMASTAR_ID,
+    IPU_DEVICE_ACB_GTC_ID,
+    IPU_DEVICE_ACB_YUV1_ID,
+    IPU_DEVICE_ACB_DVS_ID,
+    /* ISA accelerators */
+    IPU_DEVICE_ACB_X2B_MD_ID,
+    IPU_DEVICE_ACB_X2B_SVE_RGBIR_ID,
+    IPU_DEVICE_ACB_B2B_ID,
+    IPU_DEVICE_ACB_B2R_ID,
+    IPU_DEVICE_ACB_ICA_ID,
+    IPU_DEVICE_ACB_LSC_ID,
+    IPU_DEVICE_ACB_DPC_ID,
+    IPU_DEVICE_ACB_R2I_SIE_ID,
+    IPU_DEVICE_ACB_R2I_DS_A_ID,
+    IPU_DEVICE_ACB_R2I_DS_B_ID,
+    IPU_DEVICE_ACB_AWB_ID,
+    IPU_DEVICE_ACB_AF_ID,
+    IPU_DEVICE_ACB_PAF_ID,
+    IPU_DEVICE_ACB_AE_ID,
+    IPU_DEVICE_ACB_SIS_A_ID,
+    IPU_DEVICE_ACB_SIS_B_ID,
+    IPU_DEVICE_ACB_ICA_S_ID,
+    IPU_DEVICE_ACB_ICA_M_ID,
+    IPU_DEVICE_ACB_DOL_ID,
+    IPU_DEVICE_ACB_NUM_ACB
+};
+
+#define IPU_DEVICE_ACB_NUM_PSA_ACB (IPU_DEVICE_ACB_DVS_ID + 1)
+#define IPU_DEVICE_ACB_NUM_ISA_ACB (IPU_DEVICE_ACB_NUM_ACB - IPU_DEVICE_ACB_NUM_PSA_ACB)
+
+#endif /* __IPU_DEVICE_ACB_DEVICES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_gp_devices.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_gp_devices.h
new file mode 100644
index 000000000000..a531352bc640
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_gp_devices.h
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IPU_DEVICE_GP_DEVICES_H
+#define __IPU_DEVICE_GP_DEVICES_H
+#include "math_support.h"
+#include "type_support.h"
+
+enum ipu_device_gp_id {
+    IPU_DEVICE_GP_PSA = 0,
+    IPU_DEVICE_GP_ISA_STATIC,
+    IPU_DEVICE_GP_ISA_RUNTIME,
+    IPU_DEVICE_GP_NUM_GP
+};
+
+/* The PSA_* naming in the enum members refers to the internal separation of
+ * the PSA. Using it this way should make this change transparent
+ * to higher layers.
+ *
+ * For details on the values and usage of the muxes see Figures 3-1
+ * in section 2.1.3 and Figure 3-3 in section 2.2.2 of the IPU-5 General
+ * Fixed Function MAS. Additionally, refer to the respective description
+ * fields in the RDL files on the SDK (either psa_ip_top_system.rdl
+ * or isa_ps_system.rdl).
+ */
+enum ipu_device_gp_psa_mux_id {
+    /* Mux/demuxes */
+    /* 0 - BNLM output pixel stream; 1 - BNLM output delta stream */
+    IPU_DEVICE_GP_PSA_1_NOISE_MUX = 0,
+    /* 0 - To XNR; 1 - WB/DM */
+    IPU_DEVICE_GP_PSA_2_STILLS_MODE_MUX,
+    /* 0 - To Gamma_Star; 1 - To VCA; 2 - To VCSC */
+    IPU_DEVICE_GP_PSA_2_V2S_RGB_4_DEMUX,
+    /* 0 - input from Gamma_star; 1 - input from VCA; 2 input from DMSC */
+    IPU_DEVICE_GP_PSA_2_S2V_F_INPUT_MUX,
+    /* 0 - To IEFD. 1 - To GLTM; 2 - To DM */
+    IPU_DEVICE_GP_PSA_2_V2S_5_DEMUX,
+    /* 0 - VCSC output is chosen; 1 - BNLM output is chosen */
+    IPU_DEVICE_GP_PSA_3_VCSC_BP_MUX,
+    /* 0 - v2s_1 output; 1 - ISA downscaled stream; 2 - ISA original sized stream */
+    IPU_DEVICE_GP_LBFF_V2S_1_OUTPUT_MUX,
+    /* Device blockers */
+    /* BNLM pixel output block enable */
+    IPU_DEVICE_GP_PSA_1_BNLM_PIXEL_YUV_STRM_BLK,
+    /* BNLM pixel output block enable */
+    IPU_DEVICE_GP_PSA_1_BNLM_PIXEL_BAYER_STRM_BLK,
+    /* BNLM delta output block enable */
+    IPU_DEVICE_GP_PSA_1_BNLM_DELTA_STRM_BLK,
+    /* Block pixel stream to gltm from vcsc */
+    IPU_DEVICE_GP_PSA_3_VCSC_TO_GLTM_BLK,
+    /* Block pixel stream to gltm from bnlm */
+    IPU_DEVICE_GP_PSA_3_BNLM_TO_GLTM_BLK,
+    /* Frame size reg for strmCrop H */
+    IPU_DEVICE_GP_LBFF_S2V_H_FRAME_SIZE,
+    IPU_DEVICE_GP_PSA_MUX_NUM_MUX
+};
+
+enum ipu_device_gp_isa_static_mux_id {
+    /* Muxes/demuxes */
+    /* 0 - to ISL.S2V; 1 - to PSA */
+    IPU_DEVICE_GP_ISA_STATIC_ISA_ORIG_OUT_DEMUX_SEL = 0,
+    /* 0 - to ISL.S2V; 1 - to PSA */
+    IPU_DEVICE_GP_ISA_STATIC_ISA_SCALED_A_OUT_DEMUX_SEL,
+    /* 0 - Input Correction; 1 - B2B mux */
+    IPU_DEVICE_GP_ISA_STATIC_AWB_MUX_SEL,
+    /* 0 - Input Correction; 1 - B2B mux */
+    IPU_DEVICE_GP_ISA_STATIC_AE_MUX_SEL,
+    /* 0 - Input Correction; 1 - B2B mux */
+    IPU_DEVICE_GP_ISA_STATIC_AF_MUX_SEL,
+    /* 0 - to Lsc; 1 - to Dpc; 2 - to X2b */
+    IPU_DEVICE_GP_ISA_STATIC_ISA_INPUT_CORR_DEMUX_SEL,
+    /* 0 - Input correction; 1 - Dpc; 2 - X2b */
+    IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_SEL,
+    /* 0 - to B2b; 1 - to Dpc; 2 - X2b*/
+    IPU_DEVICE_GP_ISA_STATIC_LSC_DEMUX_SEL,
+    /* 0 - to Lsc; 1 - to B2b; 2 - to X2b */
+    IPU_DEVICE_GP_ISA_STATIC_DPC_DEMUX_SEL,
+    /* 0 - Lsc; 1 - Input correction; 2 - X2b */
+    IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_SEL,
+    /* 0 - Lsc; 1 - X2b; 2 - Input correction */
+    IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_SEL,
+    /* 0 - to Lsc; 1 - to Dpc; 2 - to B2b */
+    IPU_DEVICE_GP_ISA_STATIC_X2B_DEMUX_SEL,
+    /* 0 - Lsc; 1 - Dpc; 2 - X2b */
+    IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_SEL,
+    /* 0 - Through X2B SVE RGBIR; 1 - Bypass */
+    IPU_DEVICE_GP_ISA_STATIC_SVE_RGBIR_BP_MUX_DEMUX_SEL,
+    /* 0 - X2B SVE RGBIR; 1- X2B MD */
+    IPU_DEVICE_GP_ISA_STATIC_IR_DEPTH_MUX_SEL,
+    /* 0 - External PAF CH0/1; 1 - DPC extracted PAF CH0/1; 2 - X2B extracted PAF CH0/1 */
+    IPU_DEVICE_GP_ISA_STATIC_PAF_SRC_SEL,
+    /* 0 - to Dol mux; 1 - to Dol */
+    IPU_DEVICE_GP_ISA_STATIC_MAIN_INPUT_DOL_DEMUX_SEL,
+    /* 0 - Main input; 1 - Dol */
+    IPU_DEVICE_GP_ISA_STATIC_DOL_MUX_SEL,
+    /* Blockers */
+    /* ISA input correction Port block */
+    IPU_DEVICE_GP_ISA_STATIC_ISA_INPUT_CORR_PORT_BLK,
+    /* AWB Mux input correction Port block */
+    IPU_DEVICE_GP_ISA_STATIC_AWBMUX_INPUT_CORR_PORT_BLK,
+    /* AE Mux input correction Port block */
+    IPU_DEVICE_GP_ISA_STATIC_AEMUX_INPUT_CORR_PORT_BLK,
+    /* AF Mux input correction Port block */
+    IPU_DEVICE_GP_ISA_STATIC_AFMUX_INPUT_CORR_PORT_BLK,
+    /* AWB Mux B2B Mux Port block */
+    IPU_DEVICE_GP_ISA_STATIC_AWBMUX_B2B_MUX_PORT_BLK,
+    /* AE Mux B2B Mux Port block */
+    IPU_DEVICE_GP_ISA_STATIC_AEMUX_B2B_MUX_PORT_BLK,
+    /* AF Mux B2B Mux Port block */
+    IPU_DEVICE_GP_ISA_STATIC_AFMUX_B2B_MUX_PORT_BLK,
+    /* PAF stream sync configuration */
+    IPU_DEVICE_GP_ISA_STATIC_PAF_STREAM_SYNC_CFG,
+    /* Paf Mux gddpc Port block */
+    IPU_DEVICE_GP_ISA_STATIC_PAF_GDDPC_PORT_BLK,
+    /* Paf Mux input isa Port block */
+    IPU_DEVICE_GP_ISA_STATIC_PAF_ISA_STREAM_PORT_BLK,
+    /* Paf Mux X2B Port block */
+    IPU_DEVICE_GP_ISA_STATIC_PAF_X2B_PORT_BLK,
+    /* SIS A port block */
+    IPU_DEVICE_GP_ISA_STATIC_SIS_A_PORT_BLK,
+    /* SIS B port block */
+    IPU_DEVICE_GP_ISA_STATIC_SIS_B_PORT_BLK,
+    /* Lsc mux Input Corr demux port block */
+    IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_INPUT_CORR_DEMUX_PORT_BLK,
+    /* Dpc mux Lsc demux port block */
+    IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_INPUT_CORR_DEMUX_PORT_BLK,
+    /* Dpc mux Lsc demux port block */
+    IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_LSC_DEMUX_PORT_BLK,
+    /* Dpc mux X2b demux port block */
+    IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_X2B_DEMUX_PORT_BLK,
+    /* Dpc mux Lsc demux port block */
+    IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_DPC_DEMUX_PORT_BLK,
+    /* Lsc mux X2b demux port block */
+    IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_X2B_DEMUX_PORT_BLK,
+    /* X2b mux Lsc demux port block */
+    IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_LSC_DEMUX_PORT_BLK,
+    /* X2b mux Dpc demux port block */
+    IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_DPC_DEMUX_PORT_BLK,
+    /* X2b mux Input Corr demux port block */
+    IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_INPUT_CORR_DEMUX_PORT_BLK,
+    /* B2b mux Lsc demux port block */
+    IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_LSC_DEMUX_PORT_BLK,
+    /* B2b mux X2b demux port block */
+    IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_X2B_DEMUX_PORT_BLK,
+    /* B2b mux Dpc demux port block */
+    IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_DPC_DEMUX_PORT_BLK,
+    /* B2b B2b mux port block */
+    IPU_DEVICE_GP_ISA_STATIC_B2B_B2B_MUX_PORT_BLK,
+    /* Stat B2b mux port block */
+    IPU_DEVICE_GP_ISA_STATIC_3A_STAT_B2B_MUX_PORT_BLK,
+    /* Stat Input correction mux port block */
+    IPU_DEVICE_GP_ISA_STATIC_3A_STAT_INPUT_CORR_MUX_PORT_BLK,
+    /* Sis A B2b port block */
+    IPU_DEVICE_GP_ISA_STATIC_SIS_A_B2B_PORT_BLK,
+    /* Sis B B2b port block */
+    IPU_DEVICE_GP_ISA_STATIC_SIS_B_B2B_PORT_BLK,
+    /* ISA Orig B2b port block */
+    IPU_DEVICE_GP_ISA_STATIC_ISA_ORIG_B2B_PORT_BLK,
+    /* B2r B2b port block */
+    IPU_DEVICE_GP_ISA_STATIC_B2R_B2B_PORT_BLK,
+    /* ISA Scaled A Out R2i port block */
+    IPU_DEVICE_GP_ISA_STATIC_ISA_SCALED_A_OUT_R2I_PORT_BLK,
+    /* ISA Scaled B Out R2i port block */
+    IPU_DEVICE_GP_ISA_STATIC_ISA_SCALED_B_OUT_R2I_PORT_BLK,
+    /* ISA Full Out R2i port block */
+    IPU_DEVICE_GP_ISA_STATIC_ISA_FULL_OUT_R2I_PORT_BLK,
+    /* Ir Depth Out X2b port block */
+    IPU_DEVICE_GP_ISA_STATIC_IR_DEPTH_OUT_X2B_PORT_BLK,
+    /* Main input Dol demux port block */
+    IPU_DEVICE_GP_ISA_STATIC_MAIN_INPUT_DOL_DEMUX_PORT_BLK,
+    /* 0 - pif_yuv_mode disabled; 1 - pif_yuv_mode enabled */
+    IPU_DEVICE_GP_ISA_PIF_YUV_MODE_EN,
+    IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX
+};
+
+enum ipu_device_gp_isa_runtime_mux_id {
+    /* frame dim */
+    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_ORIG_OUT,
+    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_FULL_OUT,
+    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SCALED_A,
+    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SCALED_B,
+    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SIS_A,
+    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SIS_B,
+    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_STRMCROP_A,
+    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_STRMCROP_B,
+    IPU_DEVICE_GP_ISA_RUNTIME_MUX_NUM_MUX
+};
+
+/* The value below is the largest *MUX_NUM_MUX of the mux enums. */
+#define IPU_DEVICE_GP_MAX_NUM ((uint32_t)(IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX))
+
+#endif /* __IPU_DEVICE_GP_DEVICES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/math_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/math_support.h
new file mode 100644
index 000000000000..05180a3b927f
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/math_support.h
@@ -0,0 +1,328 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __MATH_SUPPORT_H
+#define __MATH_SUPPORT_H
+
+#include "storage_class.h" /* for STORAGE_CLASS_INLINE */
+#include "type_support.h"
+#include "assert_support.h"
+
+/* in case we have min/max/MIN/MAX macro's undefine them */
+#ifdef min
+#undef min
+#endif
+#ifdef max
+#undef max
+#endif
+#ifdef MIN /* also defined in include/hrt/numeric.h from SDK */
+#undef MIN
+#endif
+#ifdef MAX
+#undef MAX
+#endif
+
+#ifndef INT8_MIN
+#define INT8_MIN        (-127 - 1)
+#endif
+
+#ifndef INT8_MAX
+#define INT8_MAX        (127)
+#endif
+
+#ifndef UINT8_MAX
+#define UINT8_MAX       (0xffUL)
+#endif
+
+#ifndef UINT16_MAX
+#define UINT16_MAX       (0xffffUL)
+#endif
+
+#ifndef UINT32_MAX
+#define UINT32_MAX       (0xffffffffUL)
+#endif
+
+#define IS_ODD(a) ((a) & 0x1)
+#define IS_EVEN(a) (!IS_ODD(a))
+#define IS_POWER2(a) (!((a)&((a)-1)))
+#define IS_MULTIPLE_OF(a, b) ((a % b) == 0)
+#define IS_MASK_BITS_SET(a, b)    ((a & b) != 0)
+
+/*To Find next power of 2 number from x */
+#define bit2(x)            ((x)      | ((x) >> 1))
+#define bit4(x)            (bit2(x)  | (bit2(x) >> 2))
+#define bit8(x)            (bit4(x)  | (bit4(x) >> 4))
+#define bit16(x)           (bit8(x)  | (bit8(x) >> 8))
+#define bit32(x)           (bit16(x) | (bit16(x) >> 16))
+#define NEXT_POWER_OF_2(x) (bit32(x-1) + 1)
+
+/* force a value to a lower even value */
+#define EVEN_FLOOR(x)    ((x) & ~1UL)
+
+/* A => B */
+#define IMPLIES(a, b) (!(a) || (b))
+
+/* The ORIG_BITS th bit is the sign bit */
+/* Sign extends a ORIG_BITS bits long signed number to a 64-bit signed number */
+/* By type casting it can relimited to any valid type-size
+ * (32-bit signed or 16-bit or 8-bit)
+ */
+/* By masking it can be transformed to any arbitrary bit size */
+#define SIGN_EXTEND(VAL, ORIG_BITS) \
+((~(((VAL)&(1ULL<<((ORIG_BITS)-1)))-1))|(VAL))
+
+#define EXTRACT_BIT(a, b)    ((a >> b) & 1)
+
+/* for preprocessor and array sizing use MIN and MAX
+   otherwise use min and max */
+#define MAX(a, b)        (((a) > (b)) ? (a) : (b))
+#define MIN(a, b)        (((a) < (b)) ? (a) : (b))
+#define CLIP(a, b, c)        MIN((MAX((a), (b))), (c))
+/* Integer round-down division of a with b */
+#define FLOOR_DIV(a, b)        ((b) ? ((a) / (b)) : 0)
+/* Align a to the lower multiple of b */
+#define FLOOR_MUL(a, b)        (FLOOR_DIV(a, b) * (b))
+/* Integer round-up division of a with b */
+#define CEIL_DIV(a, b)        ((b) ? (((a) + (b) - 1) / (b)) : 0)
+/* Align a to the upper multiple of b */
+#define CEIL_MUL(a, b)        (CEIL_DIV(a, b) * (b))
+/* Align a to the upper multiple of b - fast implementation
+ * for cases when b=pow(2,n)
+ */
+#define CEIL_MUL2(a, b)        (((a) + (b) - 1) & ~((b) - 1))
+/* integer round-up division of a with pow(2,b) */
+#define CEIL_SHIFT(a, b)    (((a) + (1UL << (b)) - 1) >> (b))
+/* Align a to the upper multiple of pow(2,b) */
+#define CEIL_SHIFT_MUL(a, b)    (CEIL_SHIFT(a, b) << (b))
+/* Absolute difference of a and b */
+#define ABS_DIF(a, b)        (((a) > (b)) ? ((a) - (b)) : ((b) - (a)))
+#define ABS(a) ABS_DIF(a, 0)
+/* Square of x */
+#define SQR(x)            ((x)*(x))
+/* Integer round-half-down division of a nad b */
+#define ROUND_HALF_DOWN_DIV(a, b)    ((b) ? ((a) + (b / 2) - 1) / (b) : 0)
+/* Align a to the round-half-down multiple of b */
+#define ROUND_HALF_DOWN_MUL(a, b)    (ROUND_HALF_DOWN_DIV(a, b) * (b))
+
+#define MAX3(a, b, c)        MAX((a), MAX((b), (c)))
+#define MIN3(a, b, c)        MIN((a), MIN((b), (c)))
+#define MAX4(a, b, c, d)    MAX((MAX((a), (b))), (MAX((c), (d))))
+#define MIN4(a, b, c, d)    MIN((MIN((a), (b))), (MIN((c), (d))))
+
+/* min and max should not be macros as they will evaluate their arguments twice.
+   if you really need a macro (e.g. for CPP or for initializing an array)
+   use MIN() and MAX(), otherwise use min() and max() */
+
+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(a) ((sizeof(a) / sizeof(*(a))))
+#endif
+
+#ifndef BYTES
+#define BYTES(bit) (((bit)+7)/8)
+#endif
+
+#if !defined(PIPE_GENERATION)
+STORAGE_CLASS_INLINE unsigned int max_value_bits(unsigned int bits)
+{
+    return (bits == 0) ? 0 : ((2 * ((1 << ((bits) - 1)) - 1)) + 1);
+}
+STORAGE_CLASS_INLINE unsigned int max_value_bytes(unsigned int bytes)
+{
+    return max_value_bits(IA_CSS_UINT8_T_BITS * bytes);
+}
+STORAGE_CLASS_INLINE int max(int a, int b)
+{
+    return MAX(a, b);
+}
+
+STORAGE_CLASS_INLINE int min(int a, int b)
+{
+    return MIN(a, b);
+}
+
+STORAGE_CLASS_INLINE int clip(int a, int b, int c)
+{
+    return min(max(a, b), c);
+}
+
+STORAGE_CLASS_INLINE unsigned int umax(unsigned int a, unsigned int b)
+{
+    return MAX(a, b);
+}
+
+STORAGE_CLASS_INLINE unsigned int umin(unsigned int a, unsigned int b)
+{
+    return MIN(a, b);
+}
+
+STORAGE_CLASS_INLINE unsigned int uclip(unsigned int a, unsigned int b,
+                    unsigned int c)
+{
+    return umin(umax(a, b), c);
+}
+
+STORAGE_CLASS_INLINE unsigned int ceil_div(unsigned int a, unsigned int b)
+{
+    return CEIL_DIV(a, b);
+}
+
+STORAGE_CLASS_INLINE unsigned int ceil_mul(unsigned int a, unsigned int b)
+{
+    return CEIL_MUL(a, b);
+}
+
+STORAGE_CLASS_INLINE unsigned int ceil_mul2(unsigned int a, unsigned int b)
+{
+    return CEIL_MUL2(a, b);
+}
+
+STORAGE_CLASS_INLINE unsigned int ceil_shift(unsigned int a, unsigned int b)
+{
+    return CEIL_SHIFT(a, b);
+}
+
+STORAGE_CLASS_INLINE unsigned int ceil_shift_mul(unsigned int a, unsigned int b)
+{
+    return CEIL_SHIFT_MUL(a, b);
+}
+
+STORAGE_CLASS_INLINE int abs_dif(int a, int b)
+{
+    return ABS_DIF(a, b);
+}
+
+STORAGE_CLASS_INLINE unsigned int uabs_dif(unsigned int a, unsigned int b)
+{
+    return ABS_DIF(a, b);
+}
+
+STORAGE_CLASS_INLINE unsigned int round_half_down_div(unsigned int a,
+        unsigned int b)
+{
+    return ROUND_HALF_DOWN_DIV(a, b);
+}
+
+STORAGE_CLASS_INLINE unsigned int round_half_down_mul(unsigned int a,
+        unsigned int b)
+{
+    return ROUND_HALF_DOWN_MUL(a, b);
+}
+
+STORAGE_CLASS_INLINE unsigned int ceil_pow2(uint32_t a)
+{
+    unsigned int retval = 0;
+
+    if (IS_POWER2(a)) {
+        retval =  (unsigned int)a;
+    } else {
+        unsigned int v = a;
+
+        v |= v>>1;
+        v |= v>>2;
+        v |= v>>4;
+        v |= v>>8;
+        v |= v>>16;
+        retval =  (unsigned int)(v+1);
+    }
+    return retval;
+}
+
+STORAGE_CLASS_INLINE unsigned int floor_log2(uint32_t a)
+{
+    static const uint8_t de_bruijn[] = {
+        0,  9,  1, 10, 13, 21,  2, 29, 11, 14, 16, 18, 22, 25,  3, 30,
+        8, 12, 20, 28, 15, 17, 24,  7, 19, 27, 23,  6, 26,  5,  4, 31
+    };
+    uint32_t v = a;
+
+    v |= v>>1;
+    v |= v>>2;
+    v |= v>>4;
+    v |= v>>8;
+    v |= v>>16;
+    return (unsigned int)de_bruijn[(v*0x07C4ACDDU)>>27];
+}
+
+/* Divide by small power of two */
+STORAGE_CLASS_INLINE unsigned int
+udiv2_small_i(uint32_t a, uint32_t b)
+{
+    assert(b <= 2);
+    return a >> (b-1);
+}
+
+/* optimized divide for small results
+ * a will be divided by b
+ * outbits is the number of bits needed for the result
+ * the smaller the cheaper the function will be.
+ * if the result doesn't fit in the number of output bits
+ * the result is incorrect and the function will assert
+ */
+STORAGE_CLASS_INLINE unsigned int
+udiv_medium(uint32_t a, uint32_t b, unsigned outbits)
+{
+    int bit;
+    unsigned res = 0;
+    unsigned mask;
+
+#ifdef VOLCANO
+#pragma ipu unroll
+#endif
+    for (bit = outbits-1 ; bit >= 0; bit--) {
+        mask = 1<<bit;
+        if (a >= (b<<bit)) {
+            res |= mask; /* set the bit */
+            a = a - (b<<bit);
+        }
+#ifdef __HIVECC
+#pragma hivecc unroll
+#endif
+    }
+    /* check if the remainder is smaller than the divisor.
+     * if not we didn't produce enough output bits
+     */
+    assert(a < b);
+    return res;
+}
+
+#if !defined(__VIED_CELL)
+/*
+ * For SP and ISP, SDK provides the definition of OP_std_modadd.
+ * We need it only for host
+ */
+STORAGE_CLASS_INLINE unsigned int OP_std_modadd(int a, int b, int c)
+{
+    return (a+b < 0 ? a+b+c : a+b >= c ? a+b-c : a+b);
+}
+
+/*
+ * For SP and ISP, SDK provides the definition of OP_asp_slor.
+ * We need it only for host
+ */
+STORAGE_CLASS_INLINE unsigned int OP_asp_slor(int a, int b, int c)
+{
+    return ((a << c) | b);
+}
+#else
+#include "hive/customops.h"
+#endif /* !defined(__VIED_CELL) */
+
+#endif /* !defined(PIPE_GENERATION) */
+#if !defined(__KERNEL__)
+#define clamp(a, min_val, max_val) MIN(MAX((a), (min_val)), (max_val))
+#endif /* !defined(__KERNEL__) */
+
+#endif /* __MATH_SUPPORT_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/misc_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/misc_support.h
new file mode 100644
index 000000000000..c7b2debe8bcb
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/misc_support.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __MISC_SUPPORT_H
+#define __MISC_SUPPORT_H
+
+/* suppress compiler warnings on unused variables */
+#ifndef NOT_USED
+#define NOT_USED(a) ((void)(a))
+#endif
+
+/* Calculate the  total bytes for pow(2) byte alignment */
+#define tot_bytes_for_pow2_align(pow2, cur_bytes) \
+    ((cur_bytes + (pow2 - 1)) & ~(pow2 - 1))
+
+/* Display the macro value given a string */
+#define _STR(x) #x
+#define STR(x) _STR(x)
+
+/* Concatenate */
+#ifndef CAT /* also defined in <hive/attributes.h> */
+#define _CAT(a, b)    a ## b
+#define CAT(a, b)    _CAT(a, b)
+#endif
+
+#define _CAT3(a, b, c)    a ## b ## c
+#define CAT3(a, b, c)    _CAT3(a, b, c)
+
+/* NO_HOIST, NO_CSE, NO_ALIAS attributes must be ignored for host code */
+#ifndef __HIVECC
+#ifndef NO_HOIST
+#define NO_HOIST
+#endif
+#ifndef NO_CSE
+#define NO_CSE
+#endif
+#ifndef NO_ALIAS
+#define NO_ALIAS
+#endif
+#endif
+
+enum hive_method_id {
+    HIVE_METHOD_ID_CRUN,
+    HIVE_METHOD_ID_UNSCHED,
+    HIVE_METHOD_ID_SCHED,
+    HIVE_METHOD_ID_TARGET
+};
+
+/* Derive METHOD */
+#if defined(C_RUN)
+    #define HIVE_METHOD "crun"
+    #define HIVE_METHOD_ID HIVE_METHOD_ID_CRUN
+#elif defined(HRT_UNSCHED)
+    #define HIVE_METHOD "unsched"
+    #define HIVE_METHOD_ID HIVE_METHOD_ID_UNSCHED
+#elif defined(HRT_SCHED)
+    #define HIVE_METHOD "sched"
+    #define HIVE_METHOD_ID HIVE_METHOD_ID_SCHED
+#else
+    #define HIVE_METHOD "target"
+    #define HIVE_METHOD_ID HIVE_METHOD_ID_TARGET
+    #define HRT_TARGET 1
+#endif
+
+#endif /* __MISC_SUPPORT_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/pg_control_init_framework.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/pg_control_init_framework.h
new file mode 100644
index 000000000000..4f3b03093984
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/pg_control_init_framework.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __PG_CONTROL_INIT_FRAMEWORK_H
+#define __PG_CONTROL_INIT_FRAMEWORK_H
+
+#include <type_support.h>
+#include <ia_css_psys_process_types.h>
+#include <ia_css_terminal_types.h>
+#include <ia_css_kernel_user_param_types.h>
+
+#pragma GCC visibility push(default)
+
+enum pg_control_init_ret_type {
+	PG_CONTROL_INIT_SUCCESS  = 0,
+	PG_CONTROL_INIT_FAILURE = (1 << 0)
+};
+
+/*
+ * @brief  Fill the program control init desc.
+ *
+ * @param[in]  process_group Process group.
+ * @param[out] terminal      Program control init terminal.
+ *
+ * @retval  0  Successful.
+ * @retval  1  Error.
+ */
+
+int pg_control_init_terminal_init(
+		ia_css_process_group_t *process_group,
+		ia_css_program_control_init_terminal_t *terminal);
+
+/**
+ * @brief  Fill the program control init payload.
+ *
+ * @param[in]  process_group    Process group.
+ * @param[in]  params           Kernel user parameters object.
+ * @param[in]  payload_address  Host address in payload.
+ *
+ * @retval 0   Successful.
+ * @retval 1  Error.
+ */
+
+int pg_control_init_fill_payload(
+	const ia_css_process_group_t *process_group,
+	const ia_css_kernel_user_param_t *params,
+	void *payload_address);
+
+/**
+ * @brief  Get the payload size
+ *
+ * @param[in]   process_group Process group
+ * @param[out]  payload_size  Payload size to be allocated for the process.
+ *
+ * @retval 0   Successful.
+ * @retval 1  Error.
+ */
+
+int pg_control_init_get_payload_size(
+	const ia_css_process_group_t *process_group,
+	unsigned int *payload_size);
+
+#pragma GCC visibility pop
+
+#endif /*__PG_CONTROL_INIT_FRAMEWORK_H*/
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/platform_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/platform_support.h
new file mode 100644
index 000000000000..4f779ef53241
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/platform_support.h
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __PLATFORM_SUPPORT_H
+#define __PLATFORM_SUPPORT_H
+
+#include "storage_class.h"
+
+#define MSEC_IN_SEC 1000
+#define NSEC_IN_MSEC 1000000
+
+#define NUM_SLEEP_MSEC_WA_XTENSA 1
+
+#if defined(_MSC_VER)
+#include <string.h>
+
+#define IA_CSS_EXTERN
+#define SYNC_WITH(x)
+#define CSS_ALIGN(d, a) _declspec(align(a)) d
+
+STORAGE_CLASS_INLINE void ia_css_sleep(void)
+{
+    /* Placeholder for driver team*/
+}
+
+STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
+{
+    /* Placeholder for driver team*/
+    (void)delay_time_ms;
+}
+
+#elif defined(__HIVECC)
+#include <string.h>
+#include <hive/support.h>
+#include <hive/attributes.h>
+
+#define IA_CSS_EXTERN extern
+#define CSS_ALIGN(d, a) d __attribute__((aligned(a)))
+STORAGE_CLASS_INLINE void ia_css_sleep(void)
+{
+    OP___schedule();
+}
+
+#elif defined(__KERNEL__)
+#include <linux/string.h>
+#include <linux/delay.h>
+
+#define IA_CSS_EXTERN
+#define CSS_ALIGN(d, a) d __aligned(a)
+
+STORAGE_CLASS_INLINE void ia_css_sleep(void)
+{
+    usleep_range(1, 50);
+}
+#elif defined(__XTENSA_FW__)
+
+#include <hive/support.h>
+
+#define ALIAS_ATTR(target) __attribute__((alias(#target)))
+#define WEAK_ALIAS_ATTR(target) __attribute__((weak, alias(#target)))
+
+#elif defined(__GNUC__)
+#include <string.h>
+
+#define IA_CSS_EXTERN
+#define CSS_ALIGN(d, a) d __attribute__((aligned(a)))
+
+/* Define some __HIVECC specific macros to nothing to allow host code compilation */
+#ifndef NO_ALIAS
+#define NO_ALIAS
+#endif
+
+#ifndef SYNC_WITH
+#define SYNC_WITH(x)
+#endif
+
+#if defined(HRT_CSIM)
+#include "hrt/host.h" /* Using hrt_sleep from hrt/host.h */
+STORAGE_CLASS_INLINE void ia_css_sleep(void)
+{
+    /* For the SDK still using hrt_sleep */
+    hrt_sleep();
+}
+STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
+{
+    /* For the SDK still using hrt_sleep */
+    unsigned int long i = 0;
+
+    for (i = 0; i < delay_time_ms; i++) {
+        hrt_sleep();
+    }
+}
+#elif defined(__XTENSA_FW__) /* XTENSA FW */
+STORAGE_CLASS_INLINE void ia_css_sleep(void)
+{
+    /* do nothing */
+}
+#elif defined(IPUSIM_SLEEP)
+#include "hrt/host.h"
+#include "misc_support.h" /* for NOT_USED macro */
+STORAGE_CLASS_INLINE void ia_css_sleep(void)
+{
+    hrt_sleep();
+}
+STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
+{
+    /* if hrt_sleep_ns(delay_time_ms) is used here, it slows tests dramatically.
+     * hrt_sleep_ns(delay_time_ms * 1000000) causes an effective hang.
+     * This is because ia_css_sleep_msec is used thousands of times (BUG).
+     * hrt_sleep_ns(1) is fine (NUM_SLEEP_MSEC_WA_XTENSA = 1).
+     */
+    NOT_USED(delay_time_ms);
+    hrt_sleep_ns(NUM_SLEEP_MSEC_WA_XTENSA);
+}
+#else
+#include <time.h>
+STORAGE_CLASS_INLINE void ia_css_sleep(void)
+{
+    struct timespec delay_time;
+
+    delay_time.tv_sec = 0;
+    delay_time.tv_nsec = 10;
+    nanosleep(&delay_time, NULL);
+}
+STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
+{
+    struct timespec delay_time;
+
+    if (delay_time_ms >= MSEC_IN_SEC) {
+        delay_time.tv_sec = delay_time_ms / MSEC_IN_SEC;
+        delay_time.tv_nsec = (delay_time_ms % MSEC_IN_SEC) * NSEC_IN_MSEC;
+    } else {
+        delay_time.tv_sec = 0;
+        delay_time.tv_nsec = delay_time_ms * NSEC_IN_MSEC;
+    }
+    nanosleep(&delay_time, NULL);
+}
+#endif
+
+#else
+
+#if defined(__XTENSA_FW__)
+
+#define CSS_ALIGN(d, a) d
+
+#define ia_css_sleep()
+
+#if defined(__XTENSA_EL__)
+#define __IEEE_LITTLE_ENDIAN
+#else
+#define __IEEE_BIG_ENDIAN
+#endif
+
+#endif
+#include <string.h>
+#endif
+
+/*needed for the include in stdint.h for various environments */
+#include "type_support.h"
+#include "storage_class.h"
+
+#define MAX_ALIGNMENT            8
+#define aligned_uint8(type, obj)    CSS_ALIGN(uint8_t obj, 1)
+#define aligned_int8(type, obj)        CSS_ALIGN(int8_t obj, 1)
+#define aligned_uint16(type, obj)    CSS_ALIGN(uint16_t obj, 2)
+#define aligned_int16(type, obj)    CSS_ALIGN(int16_t obj, 2)
+#define aligned_uint32(type, obj)    CSS_ALIGN(uint32_t obj, 4)
+#define aligned_int32(type, obj)    CSS_ALIGN(int32_t obj, 4)
+
+/* needed as long as hivecc does not define the type (u)int64_t */
+#if defined(__HIVECC)
+#define aligned_uint64(type, obj)    CSS_ALIGN(unsigned long long obj, 8)
+#define aligned_int64(type, obj)    CSS_ALIGN(signed long long obj, 8)
+#else
+#define aligned_uint64(type, obj)    CSS_ALIGN(uint64_t obj, 8)
+#define aligned_int64(type, obj)    CSS_ALIGN(int64_t obj, 8)
+#endif
+#define aligned_enum(enum_type, obj)    CSS_ALIGN(uint32_t obj, 4)
+#define aligned_struct(struct_type, obj)    struct_type obj
+
+#endif /* __PLATFORM_SUPPORT_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/print_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/print_support.h
new file mode 100644
index 000000000000..9ddffb4b5c41
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/print_support.h
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __PRINT_SUPPORT_H
+#define __PRINT_SUPPORT_H
+
+#if defined(_MSC_VER)
+#ifdef _KERNEL_MODE
+
+/* TODO: Windows driver team to provide tracing mechanism for kernel mode
+ * e.g. DbgPrint and DbgPrintEx
+ */
+extern void FwTracePrintPWARN(const char *fmt, ...);
+extern void FwTracePrintPRINT(const char *fmt, ...);
+extern void FwTracePrintPERROR(const char *fmt, ...);
+extern void FwTracePrintPDEBUG(const char *fmt, ...);
+extern void FwTracePrintPFATAL(const char *fmt, ...);
+
+#define PWARN(format, ...)    FwTracePrintPWARN(format, __VA_ARGS__)
+#define PWARNING(format, ...)    FwTracePrintPWARN(format, __VA_ARGS__)
+#define PRINT(format, ...)    FwTracePrintPRINT(format, __VA_ARGS__)
+#define PINFO(format, ...)    FwTracePrintPRINT(format, __VA_ARGS__)
+#define PERROR(format, ...)    FwTracePrintPERROR(format, __VA_ARGS__)
+#define PDEBUG(format, ...)    FwTracePrintPDEBUG(format, __VA_ARGS__)
+#define PVERBOSE(format, ...)    FwTracePrintPRINT(format, __VA_ARGS__)
+#define PFATAL(format, ...)    FwTracePrintPFATAL(format, __VA_ARGS__)
+
+#else
+/* Windows usermode compilation */
+#include <stdio.h>
+
+/* To change the defines below, communicate with Windows team first
+ * to ensure they will not get flooded with prints
+ */
+/* This is temporary workaround to avoid flooding userspace
+ * Windows driver with prints
+ */
+
+#define PWARN(format, ...)
+#define PWARNING(format, ...)
+#define PRINT(format, ...)
+#define PINFO(format, ...)
+#define PERROR(format, ...)    printf("error: " format, __VA_ARGS__)
+#define PDEBUG(format, ...)
+#define PVERBOSE(format, ...)
+#define PFATAL(format, ...)
+
+#endif /* _KERNEL_MODE */
+#elif defined(__HIVECC)
+#include <hive/support.h>
+/* To be revised
+
+#define PWARN(format)
+#define PRINT(format)                OP___printstring(format)
+#define PERROR(variable)            OP___dump(9999, arguments)
+#define PDEBUG(variable)            OP___dump(__LINE__, arguments)
+
+*/
+
+#define PRINTSTRING(str) OP___printstring(str)
+
+#elif defined(__KERNEL__)
+#include <linux/kernel.h>
+#include <linux/printk.h>
+
+#define PWARN(format, arguments...)    pr_debug(format, ##arguments)
+#define PRINT(format, arguments...)    pr_debug(format, ##arguments)
+#define PERROR(format, arguments...)    pr_debug(format, ##arguments)
+#define PDEBUG(format, arguments...)    pr_debug(format, ##arguments)
+
+#elif defined(__XTENSA_FW__)
+
+#include "print_support_xtensa.h"
+
+#elif defined(XTENSA_HOST)
+
+#include "print_support_xtensa.h"
+
+#else
+
+#include <stdio.h>
+
+#define PRINT_HELPER(prefix, format, ...) printf(prefix format "%s", __VA_ARGS__)
+
+/** WA_1507432540 - Limit prints to PERROR only
+ * Workaround to avoid flooding host with prints.
+ */
+#ifdef HOST_LOGLEVEL_ERROR_ONLY
+
+/* The trailing "" allows the edge case of printing single string */
+#define PWARN(...)
+#define PRINT(...)
+#define PERROR(...) PRINT_HELPER("error: ", __VA_ARGS__, "")
+#define PDEBUG(...)
+
+#else
+
+/* The trailing "" allows the edge case of printing single string */
+#define PWARN(...)  PRINT_HELPER("warning: ", __VA_ARGS__, "")
+#define PRINT(...)  PRINT_HELPER("", __VA_ARGS__, "")
+#define PERROR(...) PRINT_HELPER("error: ", __VA_ARGS__, "")
+#define PDEBUG(...) PRINT_HELPER("debug: ", __VA_ARGS__, "")
+
+#endif
+#define PRINTSTRING(str) PRINT(str)
+
+#endif
+#endif /* __PRINT_SUPPORT_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/psys_system_global_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/psys_system_global_impl.h
new file mode 100644
index 000000000000..72eb0cf5bc09
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/psys_system_global_impl.h
@@ -0,0 +1,504 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __PSYS_SYSTEM_GLOBAL_IMPL_H
+#define __PSYS_SYSTEM_GLOBAL_IMPL_H
+
+#include <vied_nci_psys_system_global.h>
+
+#include "ia_css_psys_sim_trace.h"
+#include <assert_support.h>
+
+/* Use vied_bits instead, however for test purposes we uses explicit type
+ * checking
+ */
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_bit_mask(
+    const unsigned int                        index)
+{
+    vied_nci_resource_bitmap_t    bit_mask = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "vied_nci_bit_mask(): enter:\n");
+
+    if (index < VIED_NCI_RESOURCE_BITMAP_BITS)
+        bit_mask = (vied_nci_resource_bitmap_t)1 << index;
+
+    return bit_mask;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_bitmap_set(
+    const vied_nci_resource_bitmap_t        bitmap,
+    const vied_nci_resource_bitmap_t        bit_mask)
+{
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "vied_nci_bitmap_set(): enter:\n");
+
+/*
+    assert(vied_nci_is_bitmap_one_hot(bit_mask));
+*/
+    return bitmap | bit_mask;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_bitmap_clear(
+    const vied_nci_resource_bitmap_t        bitmap,
+    const vied_nci_resource_bitmap_t        bit_mask)
+{
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_bitmap_clear(): enter:\n");
+
+/*
+    assert(vied_nci_is_bitmap_one_hot(bit_mask));
+*/
+    return bitmap & (~bit_mask);
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_bitfield_mask(
+        const unsigned int position,
+        const unsigned int size)
+{
+    vied_nci_resource_bitmap_t    bit_mask = 0;
+    vied_nci_resource_bitmap_t ones = (vied_nci_resource_bitmap_t)-1;
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+               "vied_nci_bitfield_mask(): enter:\n");
+
+    if (position < VIED_NCI_RESOURCE_BITMAP_BITS)
+        bit_mask = (ones >> (sizeof(vied_nci_resource_bitmap_t) - size)) << position;
+
+    return bit_mask;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_bitmap_set_bitfield(
+    const vied_nci_resource_bitmap_t        bitmap,
+    const unsigned int                        index,
+    const unsigned int                        size)
+{
+    vied_nci_resource_bitmap_t    ret = 0;
+    vied_nci_resource_bitmap_t    bit_mask = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+               "vied_nci_bit_mask_set_bitfield(): enter:\n");
+
+    bit_mask = vied_nci_bitfield_mask(index, size);
+    ret = vied_nci_bitmap_set(bitmap, bit_mask);
+
+    return ret;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_bitmap_set_unique(
+    const vied_nci_resource_bitmap_t        bitmap,
+    const vied_nci_resource_bitmap_t        bit_mask)
+{
+    vied_nci_resource_bitmap_t    ret = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_bitmap_set_unique(): enter:\n");
+
+    if ((bitmap & bit_mask) == 0)
+        ret = bitmap | bit_mask;
+
+    return ret;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_bit_mask_set_unique(
+    const vied_nci_resource_bitmap_t        bitmap,
+    const unsigned int                        index)
+{
+    vied_nci_resource_bitmap_t    ret = 0;
+    vied_nci_resource_bitmap_t    bit_mask;
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+               "vied_nci_bit_mask_set_unique(): enter:\n");
+
+    bit_mask = vied_nci_bit_mask(index);
+
+    if (((bitmap & bit_mask) == 0) && (bit_mask != 0))
+        ret = bitmap | bit_mask;
+
+    return ret;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+bool vied_nci_is_bitmap_empty(
+    const vied_nci_resource_bitmap_t        bitmap)
+{
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_is_bitmap_empty(): enter:\n");
+
+    return (bitmap == 0);
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+bool vied_nci_is_bitmap_set(
+    const vied_nci_resource_bitmap_t        bitmap,
+    const vied_nci_resource_bitmap_t        bit_mask)
+{
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_is_bitmap_set(): enter:\n");
+
+/*
+    assert(vied_nci_is_bitmap_one_hot(bit_mask));
+*/
+    return !vied_nci_is_bitmap_clear(bitmap, bit_mask);
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+bool vied_nci_is_bit_set_in_bitmap(
+    const vied_nci_resource_bitmap_t        bitmap,
+    const unsigned int        index)
+{
+
+    vied_nci_resource_bitmap_t bitmask;
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_is_bit_set_in_bitmap(): enter:\n");
+    bitmask = vied_nci_bit_mask(index);
+    return vied_nci_is_bitmap_set(bitmap, bitmask);
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+bool vied_nci_is_bitmap_clear(
+    const vied_nci_resource_bitmap_t        bitmap,
+    const vied_nci_resource_bitmap_t        bit_mask)
+{
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_is_bitmap_clear(): enter:\n");
+
+/*
+    assert(vied_nci_is_bitmap_one_hot(bit_mask));
+*/
+    return ((bitmap & bit_mask) == 0);
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+int vied_nci_bitmap_compute_weight(
+    const vied_nci_resource_bitmap_t        bitmap)
+{
+    vied_nci_resource_bitmap_t    loc_bitmap = bitmap;
+    int    weight = 0;
+    int    i;
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_bitmap_compute_weight(): enter:\n");
+
+    /* Do not need the iterator "i" */
+    for (i = 0; (i < VIED_NCI_RESOURCE_BITMAP_BITS) &&
+            (loc_bitmap != 0); i++) {
+        weight += loc_bitmap & 0x01;
+        loc_bitmap >>= 1;
+    }
+
+    return weight;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_bitmap_union(
+    const vied_nci_resource_bitmap_t    bitmap0,
+    const vied_nci_resource_bitmap_t    bitmap1)
+{
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_bitmap_union(): enter:\n");
+    return (bitmap0 | bitmap1);
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_bitmap_intersection(
+    const vied_nci_resource_bitmap_t        bitmap0,
+    const vied_nci_resource_bitmap_t        bitmap1)
+{
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "ia_css_kernel_bitmap_intersection(): enter:\n");
+    return (bitmap0 & bitmap1);
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_bitmap_xor(
+    const vied_nci_resource_bitmap_t        bitmap0,
+    const vied_nci_resource_bitmap_t        bitmap1)
+{
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "vied_nci_bitmap_xor(): enter:\n");
+    return (bitmap0 ^ bitmap1);
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_cell_bit_mask(
+    const vied_nci_cell_ID_t        cell_id)
+{
+    vied_nci_resource_bitmap_t    bit_mask = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_cell_bit_mask(): enter:\n");
+
+    if (cell_id < VIED_NCI_N_CELL_ID) {
+        bit_mask = (vied_nci_resource_bitmap_t)1 << cell_id;
+    }
+    return bit_mask;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_barrier_bit_mask(
+    const vied_nci_barrier_ID_t        barrier_id)
+{
+    vied_nci_resource_bitmap_t    bit_mask = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_barrier_bit_mask(): enter:\n");
+
+    if (((barrier_id + VIED_NCI_N_CELL_ID) < VIED_NCI_RESOURCE_BITMAP_BITS)) {
+        bit_mask = (vied_nci_resource_bitmap_t)1 <<
+                (barrier_id + VIED_NCI_N_CELL_ID);
+    }
+    return bit_mask;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_cell_type_ID_t vied_nci_cell_get_type(
+    const vied_nci_cell_ID_t        cell_id)
+{
+    vied_nci_cell_type_ID_t    cell_type = VIED_NCI_N_CELL_TYPE_ID;
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_cell_get_type(): enter:\n");
+
+    if (cell_id < VIED_NCI_N_CELL_ID) {
+        cell_type = (vied_nci_cell_type_ID_t)vied_nci_cell_type[cell_id];
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
+            "vied_nci_cell_get_type(): invalid argument\n");
+    }
+
+    return cell_type;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_mem_ID_t vied_nci_ext_mem_get_id_from_type(
+    const vied_nci_mem_type_ID_t        mem_type)
+{
+    vied_nci_mem_ID_t    mem_id = VIED_NCI_N_MEM_ID;
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_ext_mem_get_id_from_type(): enter:\n");
+
+    if (mem_type < (unsigned)VIED_NCI_N_MEM_ID && vied_nci_mem_is_ext_type(mem_type)) {
+        mem_id = (vied_nci_mem_ID_t)vied_nci_ext_mem[mem_type];
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
+            "vied_nci_ext_mem_get_id_from_type(): invalid argument\n");
+    }
+
+    return mem_id;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_mem_type_ID_t vied_nci_mem_get_type(
+    const vied_nci_mem_ID_t            mem_id)
+{
+    vied_nci_mem_type_ID_t    mem_type = VIED_NCI_N_MEM_TYPE_ID;
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_mem_get_type(): enter:\n");
+
+    if (mem_id < VIED_NCI_N_MEM_ID) {
+        mem_type = (vied_nci_mem_type_ID_t)vied_nci_mem_type[mem_id];
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
+            "vied_nci_mem_get_type(): invalid argument\n");
+    }
+
+    return mem_type;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+uint16_t vied_nci_mem_get_size(
+    const vied_nci_mem_ID_t            mem_id)
+{
+    uint16_t    mem_size = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_mem_get_size(): enter:\n");
+
+    if (mem_id < VIED_NCI_N_MEM_ID) {
+        mem_size = vied_nci_mem_size[mem_id];
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
+            "vied_nci_mem_get_size(): invalid argument\n");
+    }
+
+    return mem_size;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+uint16_t vied_nci_dev_chn_get_size(
+    const vied_nci_dev_chn_ID_t        dev_chn_id)
+{
+    uint16_t    dev_chn_size = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_dev_chn_get_size(): enter:\n");
+#ifndef IPU_SYSVER_ipu7v1
+    if (dev_chn_id < VIED_NCI_N_DEV_CHN_ID) {
+        dev_chn_size = vied_nci_dev_chn_size[dev_chn_id];
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
+            "vied_nci_dev_chn_get_size(): invalid argument\n");
+    }
+#else
+    ((void)(dev_chn_id)); /* not used in ipu7 */
+#endif
+    return dev_chn_size;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+bool vied_nci_is_cell_of_type(
+    const vied_nci_cell_ID_t        cell_id,
+    const vied_nci_cell_type_ID_t    cell_type_id)
+{
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_is_cell_of_type(): enter:\n");
+
+    return ((vied_nci_cell_get_type(cell_id) ==
+         cell_type_id) && (cell_type_id !=
+         VIED_NCI_N_CELL_TYPE_ID));
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+bool vied_nci_is_mem_of_type(
+    const vied_nci_mem_ID_t            mem_id,
+    const vied_nci_mem_type_ID_t    mem_type_id)
+{
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_is_mem_of_type(): enter:\n");
+
+    return ((vied_nci_mem_get_type(mem_id) == mem_type_id) &&
+        (mem_type_id != VIED_NCI_N_MEM_TYPE_ID));
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+bool vied_nci_is_cell_mem_of_type(
+    const vied_nci_cell_ID_t        cell_id,
+    const uint16_t                    mem_index,
+    const vied_nci_mem_type_ID_t    mem_type_id)
+{
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_is_cell_mem_of_type(): enter:\n");
+
+    return ((vied_nci_cell_get_mem_type(cell_id, mem_index) == mem_type_id)
+        && (mem_type_id != VIED_NCI_N_MEM_TYPE_ID));
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+bool vied_nci_has_cell_mem_of_id(
+    const vied_nci_cell_ID_t        cell_id,
+    const vied_nci_mem_ID_t            mem_id)
+{
+    uint16_t        mem_index;
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_has_cell_mem_of_id(): enter:\n");
+
+    for (mem_index = 0; mem_index < VIED_NCI_N_MEM_TYPE_ID; mem_index++) {
+        if ((vied_nci_cell_get_mem(cell_id, mem_index) == mem_id) &&
+            (mem_id != VIED_NCI_N_MEM_ID)) {
+            break;
+        }
+    }
+
+    return (mem_index < VIED_NCI_N_MEM_TYPE_ID);
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+uint16_t vied_nci_cell_get_mem_count(
+    const vied_nci_cell_ID_t        cell_id)
+{
+    uint16_t    mem_count = 0;
+    vied_nci_cell_type_ID_t    cell_type;
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_cell_get_mem_count(): enter:\n");
+
+    cell_type = vied_nci_cell_get_type(cell_id);
+
+    if (cell_type < VIED_NCI_N_CELL_TYPE_ID)
+        mem_count = vied_nci_N_cell_mem[cell_type];
+
+    return mem_count;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_mem_type_ID_t vied_nci_cell_get_mem_type(
+    const vied_nci_cell_ID_t        cell_id,
+    const uint16_t                    mem_index)
+{
+    vied_nci_mem_type_ID_t    mem_type = VIED_NCI_N_MEM_TYPE_ID;
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_cell_get_mem_type(): enter:\n");
+
+    if ((cell_id < VIED_NCI_N_CELL_ID) &&
+        (mem_index < VIED_NCI_N_MEM_TYPE_ID)) {
+        mem_type = (vied_nci_mem_type_ID_t)(vied_nci_cell_mem_type[
+                vied_nci_cell_get_type(cell_id)][mem_index]);
+    }
+
+    return mem_type;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_mem_ID_t vied_nci_cell_get_mem(
+    const vied_nci_cell_ID_t        cell_id,
+    const uint16_t                    mem_index)
+{
+    vied_nci_mem_ID_t    mem_id = VIED_NCI_N_MEM_ID;
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+        "vied_nci_cell_get_mem(): enter:\n");
+
+    if ((cell_id < VIED_NCI_N_CELL_ID) &&
+        (mem_index < VIED_NCI_N_MEM_TYPE_ID)) {
+        mem_id = (vied_nci_mem_ID_t)(vied_nci_cell_mem[cell_id][mem_index]);
+    }
+
+    return mem_id;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_mem_type_ID_t vied_nci_cell_type_get_mem_type(
+    const vied_nci_cell_type_ID_t    cell_type_id,
+    const uint16_t                    mem_index)
+{
+    vied_nci_mem_type_ID_t    mem_type = VIED_NCI_N_MEM_TYPE_ID;
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+               "vied_nci_cell_type_get_mem_type(): enter:\n");
+
+    if ((cell_type_id < VIED_NCI_N_CELL_TYPE_ID)
+            && (mem_index < VIED_NCI_N_MEM_TYPE_ID)) {
+        mem_type = (vied_nci_mem_type_ID_t)(vied_nci_cell_mem_type[cell_type_id][mem_index]);
+    }
+
+    return mem_type;
+}
+
+#endif /* __PSYS_SYSTEM_GLOBAL_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/storage_class.h
new file mode 100644
index 000000000000..aeb9ffb3b367
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/storage_class.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __STORAGE_CLASS_H
+#define __STORAGE_CLASS_H
+
+#define STORAGE_CLASS_EXTERN \
+extern
+
+#if defined(_MSC_VER)
+#define STORAGE_CLASS_INLINE \
+static __inline
+#elif defined(__HIVECC)
+#define STORAGE_CLASS_INLINE \
+static inline
+#elif defined(__XTENSA_FW__)
+#include "storage_class_xtensa.h"
+#else
+#define STORAGE_CLASS_INLINE \
+static inline
+#endif
+
+/* Register struct */
+#ifndef __register
+#if defined(__HIVECC) && !defined(PIPE_GENERATION)
+#define __register register
+#else
+#define __register
+#endif
+#endif
+
+/* Memory attribute */
+#ifndef MEM
+#ifdef PIPE_GENERATION
+#elif defined(__HIVECC)
+#include <hive/attributes.h>
+#else
+#define MEM(any_mem)
+#endif
+#endif
+
+#endif /* __STORAGE_CLASS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/type_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/type_support.h
new file mode 100644
index 000000000000..57fea54527a8
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/type_support.h
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __TYPE_SUPPORT_H
+#define __TYPE_SUPPORT_H
+
+/* Per the DLI spec, types are in "type_support.h" and
+ * "platform_support.h" is for unclassified/to be refactored
+ * platform specific definitions.
+ */
+#define IA_CSS_UINT8_T_BITS    8
+#define IA_CSS_UINT16_T_BITS    16
+#define IA_CSS_UINT32_T_BITS    32
+#define IA_CSS_INT32_T_BITS    32
+#define IA_CSS_UINT64_T_BITS    64
+
+#if defined(_MSC_VER)
+#include <stdint.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <limits.h>
+#if defined(_M_X64)
+#define HOST_ADDRESS(x) (unsigned long long)(x)
+#else
+#define HOST_ADDRESS(x) (unsigned long)(x)
+#endif
+
+#elif defined(PARAM_GENERATION)
+/* Nothing */
+#elif defined(__HIVECC)
+#include <stdint.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <limits.h>
+#define HOST_ADDRESS(x) (unsigned long)(x)
+
+typedef long long int64_t;
+typedef unsigned long long uint64_t;
+
+#elif defined(__XTENSA_FW__)
+#include "type_support_xtensa.h"
+#elif defined(__KERNEL__)
+#include <linux/types.h>
+#include <linux/limits.h>
+
+#define CHAR_BIT (8)
+#define HOST_ADDRESS(x) (unsigned long)(x)
+
+#elif defined(__GNUC__)
+#include <stdint.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <limits.h>
+#define HOST_ADDRESS(x) (unsigned long)(x)
+
+#else /* default is for the FIST environment */
+#include <stdint.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <limits.h>
+#define HOST_ADDRESS(x) (unsigned long)(x)
+
+#endif
+#if !defined(PIPE_GENERATION) && !defined(IO_GENERATION)
+/* genpipe cannot handle the void* syntax */
+typedef void *HANDLE;
+#endif
+
+#endif /* __TYPE_SUPPORT_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_acb_route_type.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_acb_route_type.h
new file mode 100644
index 000000000000..3ceb0c70c2db
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_acb_route_type.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef VIED_NCI_ACB_ROUTE_TYPE_H_
+#define VIED_NCI_ACB_ROUTE_TYPE_H_
+
+#include "type_support.h"
+
+typedef enum {
+    NCI_ACB_PORT_ISP = 0,
+    NCI_ACB_PORT_ACC = 1,
+    NCI_ACB_PORT_INVALID = 0xFF
+} nci_acb_port_t;
+
+typedef struct {
+    /* 0 = ISP, 1 = Acc */
+    nci_acb_port_t in_select;
+    /* 0 = ISP, 1 = Acc */
+    nci_acb_port_t out_select;
+    /* When set, Ack will be sent only when Eof arrives */
+    uint32_t ignore_line_num;
+    /* Fork adapter to enable streaming to both output
+     * (next acb out and isp out)
+     */
+    uint32_t fork_acb_output;
+} nci_acb_route_t;
+
+#endif /* VIED_NCI_ACB_ROUTE_TYPE_H_ */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_resource_model.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_resource_model.h
new file mode 100644
index 000000000000..6d649617c16b
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_resource_model.h
@@ -0,0 +1,380 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __VIED_NCI_PSYS_RESOURCE_MODEL_H
+#define __VIED_NCI_PSYS_RESOURCE_MODEL_H
+
+#include "type_support.h"
+#include "storage_class.h"
+
+#define HAS_DFM                 1
+#define HAS_DMA_INTERNAL        1
+#define NON_RELOC_RESOURCE_SUPPORT    1
+#define IA_CSS_KERNEL_BITMAP_BITS     128
+
+/* Defines for the routing bitmap in the program group manifest.
+ */
+#define VIED_NCI_RBM_MAX_MUX_COUNT            46
+#define VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT        17
+#define VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT        4
+#define N_PADDING_UINT8_IN_RBM_MANIFEST            2
+
+/* The amount of padding bytes needed to make
+ * ia_css_process_s/ia_css_process_ext_s/
+ * ia_css_program_manifest_s/ia_css_program_manifest_ext_s
+ * structures 32 bit aligned (source files have check on this)
+ */
+#define    N_PADDING_UINT8_IN_PROCESS_STRUCT        0
+#define N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT        0
+#define    N_PADDING_UINT8_IN_PROGRAM_MANIFEST        0
+#define    N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT        2
+
+/*
+ * Cell IDs
+ */
+typedef enum {
+    VIED_NCI_SP0_ID = 0,
+    VIED_NCI_VP0_ID,
+    VIED_NCI_PSA_ACC_BNLM_ID,
+    VIED_NCI_PSA_ACC_DM_ID,
+    VIED_NCI_PSA_ACC_ACM_ID,
+    VIED_NCI_PSA_ACC_GTC_YUV1_ID,
+    VIED_NCI_BB_ACC_OFS_PIN_MAIN_ID,
+    VIED_NCI_BB_ACC_OFS_PIN_DISPLAY_ID,
+    VIED_NCI_BB_ACC_OFS_PIN_PP_ID,
+    VIED_NCI_PSA_ACC_GAMMASTAR_ID,
+    VIED_NCI_PSA_ACC_GLTM_ID,
+    VIED_NCI_PSA_ACC_XNR_ID,
+    VIED_NCI_PSA_VCSC_ID,    /* VCSC */
+    VIED_NCI_ISA_ICA_ID,
+    VIED_NCI_ISA_LSC_ID,
+    VIED_NCI_ISA_DPC_ID,
+    VIED_NCI_ISA_SIS_A_ID,
+    VIED_NCI_ISA_SIS_B_ID,
+    VIED_NCI_ISA_B2B_ID,
+    VIED_NCI_ISA_B2R_R2I_SIE_ID,
+    VIED_NCI_ISA_R2I_DS_A_ID,
+    VIED_NCI_ISA_R2I_DS_B_ID,
+    VIED_NCI_ISA_AWB_ID,
+    VIED_NCI_ISA_AE_ID,
+    VIED_NCI_ISA_AF_ID,
+    VIED_NCI_ISA_DOL_ID,
+    VIED_NCI_ISA_ICA_MEDIUM_ID,
+    VIED_NCI_ISA_X2B_MD_ID,
+    VIED_NCI_ISA_X2B_SVE_RGBIR_ID,
+    VIED_NCI_ISA_PAF_ID,
+    VIED_NCI_BB_ACC_GDC0_ID,
+    VIED_NCI_BB_ACC_TNR_ID,
+} vied_nci_cell_ID_t;
+
+#define VIED_NCI_N_CELL_ID (VIED_NCI_BB_ACC_TNR_ID + 1)
+
+/*
+ * In several places we don't need to size the look up tables for the full amount of cells
+ * because they are only used for the VP and SP cells and not for the accelerator cells.
+ * It is important that these cells are in the beginning of the LUT
+ */
+#define VIED_NCI_N_PROG_CELLS (VIED_NCI_VP0_ID + 1)
+
+/*
+ * Barrier bits (to model process group dependencies)
+ * todo verify that this is valid for ipu6
+ */
+typedef enum {
+    VIED_NCI_BARRIER0_ID,
+    VIED_NCI_BARRIER1_ID,
+    VIED_NCI_BARRIER2_ID,
+    VIED_NCI_BARRIER3_ID,
+    VIED_NCI_BARRIER4_ID,
+    VIED_NCI_BARRIER5_ID,
+    VIED_NCI_BARRIER6_ID,
+    VIED_NCI_BARRIER7_ID
+} vied_nci_barrier_ID_t;
+
+#define VIED_NCI_N_BARRIER_ID (VIED_NCI_BARRIER7_ID + 1)
+/*
+ * Cell types
+ */
+typedef enum {
+    VIED_NCI_SP_CTRL_TYPE_ID = 0,
+    VIED_NCI_SP_SERVER_TYPE_ID,
+    VIED_NCI_VP_TYPE_ID,
+    VIED_NCI_ACC_PSA_TYPE_ID,
+    VIED_NCI_ACC_ISA_TYPE_ID,
+    VIED_NCI_ACC_OSA_TYPE_ID,
+    VIED_NCI_GDC_TYPE_ID,
+    VIED_NCI_TNR_TYPE_ID,
+    VIED_NCI_N_CELL_TYPE_ID
+} vied_nci_cell_type_ID_t;
+
+/*
+ * Memory IDs
+ */
+typedef enum {
+    VIED_NCI_VMEM0_ID = 0, /* ISP0 VMEM */
+    VIED_NCI_TRANSFER_VMEM0_ID, /* TRANSFER VMEM 0 */
+    VIED_NCI_TRANSFER_VMEM1_ID, /* TRANSFER VMEM 1 */
+    VIED_NCI_LB_VMEM_ID, /* LB VMEM */
+    VIED_NCI_BAMEM0_ID, /* ISP0 BAMEM */
+    VIED_NCI_DMEM0_ID, /* SPC0 Dmem */
+    VIED_NCI_DMEM1_ID, /* SPP0 Dmem */
+    VIED_NCI_DMEM2_ID, /* SPP1 Dmem */
+    VIED_NCI_DMEM3_ID, /* ISP0 Dmem */
+    VIED_NCI_PMEM0_ID  /* ISP0 PMEM */
+} vied_nci_mem_ID_t;
+
+#define VIED_NCI_N_MEM_ID (VIED_NCI_PMEM0_ID + 1)
+/*
+ * Memory types
+ */
+typedef enum {
+    VIED_NCI_TRANSFER_VMEM0_TYPE_ID = 0,
+    VIED_NCI_TRANSFER_VMEM1_TYPE_ID,
+    VIED_NCI_LB_VMEM_TYPE_ID,
+    VIED_NCI_DMEM_TYPE_ID,
+    VIED_NCI_VMEM_TYPE_ID,
+    VIED_NCI_BAMEM_TYPE_ID,
+    VIED_NCI_PMEM_TYPE_ID
+} vied_nci_mem_type_ID_t;
+
+#define VIED_NCI_N_MEM_TYPE_ID (VIED_NCI_PMEM_TYPE_ID + 1)
+/******************************************************/
+
+/* Excluding PMEM */
+#define VIED_NCI_N_DATA_MEM_TYPE_ID     6 /* = MAX(vied_nci_mem_type_ID_t) */
+
+#define VIED_NCI_N_SP_CTRL_MEM        2
+#define VIED_NCI_N_SP_SERVER_MEM    2
+#define VIED_NCI_N_VP_MEM        4
+#define VIED_NCI_N_ACC_PSA_MEM        0
+#define VIED_NCI_N_ACC_ISA_MEM        0
+#define VIED_NCI_N_ACC_OSA_MEM        0
+#define VIED_NCI_N_GDC_MEM        0
+#define VIED_NCI_N_TNR_MEM        0
+
+#define VIED_NCI_N_VP_CELL        1
+#define VIED_NCI_N_ACC_CELL        13
+/******************************************************/
+/*
+ * Device IDs
+ * todo verify that this is valid for ipu6
+ */
+typedef enum {
+    VIED_NCI_DEV_CHN_DMA_EXT0_ID = 0,
+    VIED_NCI_DEV_CHN_DMA_EXT1_READ_ID,
+    VIED_NCI_DEV_CHN_DMA_EXT1_WRITE_ID,
+    VIED_NCI_DEV_CHN_DMA_INTERNAL_ID,
+    VIED_NCI_DEV_CHN_DMA_ISA_ID,
+} vied_nci_dev_chn_ID_t;
+
+#define VIED_NCI_N_DEV_CHN_ID (VIED_NCI_DEV_CHN_DMA_ISA_ID + 1)
+
+/*
+ * DFM devices
+ */
+typedef enum {
+    VIED_NCI_DEV_DFM_BB_FULL_PORT_ID = 0,
+    VIED_NCI_DEV_DFM_BB_EMPTY_PORT_ID,
+    VIED_NCI_DEV_DFM_ISL_FULL_PORT_ID,
+    VIED_NCI_DEV_DFM_ISL_EMPTY_PORT_ID,
+    VIED_NCI_DEV_DFM_LB_FULL_PORT_ID,
+    VIED_NCI_DEV_DFM_LB_EMPTY_PORT_ID
+} vied_nci_dev_dfm_id_t;
+
+#define VIED_NCI_N_DEV_DFM_ID (VIED_NCI_DEV_DFM_LB_EMPTY_PORT_ID + 1)
+
+/*
+ * Link IDs
+ */
+typedef enum {
+    VIED_NCI_LINK_OTF_OFFLINE = 0,
+    VIED_NCI_LINK_OTF_MAIN_OUTPUT,
+    VIED_NCI_LINK_OTF_PDAF_OUTPUT,
+    VIED_NCI_LINK_DATA_BARRIER_0,
+    VIED_NCI_LINK_DATA_BARRIER_1,
+    VIED_NCI_LINK_DATA_BARRIER_2,
+    VIED_NCI_LINK_DATA_BARRIER_3,
+    VIED_NCI_LINK_DATA_BARRIER_4,
+    VIED_NCI_N_LINK_ID
+} vied_nci_link_ID_t;
+
+/*
+ * Psys server local object caches space
+ */
+typedef enum {
+    VIED_NCI_PSYS_SERVER_LOCAL_OBJECT_CACHE_0 = 0,
+    VIED_NCI_PSYS_SERVER_LOCAL_OBJECT_CACHE_1,
+    VIED_NCI_PSYS_SERVER_LOCAL_OBJECT_CACHE_2,
+    VIED_NCI_N_PSYS_SERVER_LOCAL_OBJECT_CACHES
+} vied_nci_psys_server_local_object_cache_t;
+
+/******************************************************/
+/*todo verify  for ipu6*/
+/*
+ * Memory size (previously in vied_nci_psys_system.c)
+ * VMEM: in words, 64 Byte per word.
+ * TRANSFER VMEM0: in words, 64 Byte per word
+ * TRANSFER VMEM1: in words, 64 Byte per word
+ * LB VMEM: in words, 64 Byte per word.
+ * BAMEM: in words, 64 Byte per word
+ * DMEM: in words, 4 Byte per word.
+ * PMEM: in words, 64 Byte per word.
+ */
+#define VIED_NCI_TRANSFER_VMEM0_WORD_SIZE     64
+#define VIED_NCI_TRANSFER_VMEM1_WORD_SIZE     64
+#define VIED_NCI_LB_VMEM_WORD_SIZE     64
+#define VIED_NCI_DMEM_WORD_SIZE      4
+#define VIED_NCI_VMEM_WORD_SIZE     64
+#define VIED_NCI_BAMEM_WORD_SIZE    64
+#define VIED_NCI_PMEM_WORD_SIZE     64
+
+/* ISP VMEM  words $HIVECORES/idsp/include/hive/cell_params.h*/
+#define VIED_NCI_VMEM0_MAX_SIZE            (0x0800)
+#define VIED_NCI_TRANSFER_VMEM0_MAX_SIZE    (0x0800) /* Transfer VMEM0 words, ref HAS Transfer*/
+#define VIED_NCI_TRANSFER_VMEM1_MAX_SIZE    (0x0800) /* Transfer VMEM1 words, ref HAS Transfer*/
+#define VIED_NCI_LB_VMEM_MAX_SIZE        (0x0400) /* LB VMEM words */
+/* ISP BAMEM words $HIVECORES/idsp/include/hive/cell_params.h */
+#define VIED_NCI_BAMEM0_MAX_SIZE        (0x0800)
+#define VIED_NCI_DMEM0_MAX_SIZE            (0x4000)
+#define VIED_NCI_DMEM1_MAX_SIZE            (0x1000)
+#define VIED_NCI_DMEM2_MAX_SIZE            (0x1000)
+#define VIED_NCI_DMEM3_MAX_SIZE            (0x1000)
+#define VIED_NCI_PMEM0_MAX_SIZE            (0x0500)
+
+/*
+ * Number of channels per device
+ */
+#define VIED_NCI_DEV_CHN_DMA_EXT0_MAX_SIZE        (30)
+#define VIED_NCI_DEV_CHN_GDC_MAX_SIZE            (0)
+#define VIED_NCI_DEV_CHN_DMA_EXT1_READ_MAX_SIZE        (30)
+/*
+ NOTE: once FW code will support DMA with one unit
+ descriptor #channels will be cut but half (36->18).
+*/
+#define VIED_NCI_DEV_CHN_DMA_EXT1_WRITE_MAX_SIZE    (37)
+#define VIED_NCI_DEV_CHN_DMA_INTERNAL_MAX_SIZE        (8)
+#define VIED_NCI_DEV_CHN_DMA_IPFD_MAX_SIZE        (0)
+#define VIED_NCI_DEV_CHN_DMA_ISA_MAX_SIZE        (2)
+
+/*
+ * Number of ports per DFM device
+ */
+#define VIED_NCI_DEV_DFM_BB_FULL_PORT_ID_MAX_SIZE        (32)
+#define VIED_NCI_DEV_DFM_ISL_FULL_PORT_ID_MAX_SIZE        (32)
+#define VIED_NCI_DEV_DFM_LB_FULL_PORT_ID_MAX_SIZE        (32)
+#define VIED_NCI_DEV_DFM_BB_EMPTY_PORT_ID_MAX_SIZE        (32)
+#define VIED_NCI_DEV_DFM_ISL_EMPTY_PORT_ID_MAX_SIZE        (32)
+#define VIED_NCI_DEV_DFM_LB_EMPTY_PORT_ID_MAX_SIZE        (32)
+/******************************************************/
+
+/*
+ * Storage of the resource and resource type enumerators
+ */
+#define VIED_NCI_RESOURCE_ID_BITS    8
+typedef uint8_t                vied_nci_resource_id_t;
+
+#define VIED_NCI_RESOURCE_SIZE_BITS    16
+typedef uint16_t            vied_nci_resource_size_t;
+
+#define VIED_NCI_RESOURCE_BITMAP_BITS    32
+typedef uint32_t            vied_nci_resource_bitmap_t;
+
+#define IA_CSS_PROCESS_INVALID_DEPENDENCY    ((vied_nci_resource_id_t)(-1))
+#define IA_CSS_PROCESS_INVALID_OFFSET        ((vied_nci_resource_size_t)(-1))
+#define IA_CSS_PROCESS_MAX_CELLS        1
+
+#define IA_CSS_MAX_INPUT_DEC_RESOURCES        4
+#define IA_CSS_MAX_OUTPUT_DEC_RESOURCES        4
+/*
+ * Resource specifications
+ * Note that the FAS uses the terminology local/remote memory. In the PSYS API,
+ * these are called internal/external memory.
+ */
+
+/* resource spec for internal (local) memory */
+struct vied_nci_resource_spec_int_mem_s {
+    vied_nci_resource_id_t        type_id;
+    vied_nci_resource_size_t    size;
+    vied_nci_resource_size_t    offset;
+};
+
+typedef struct vied_nci_resource_spec_int_mem_s
+    vied_nci_resource_spec_int_mem_t;
+
+/* resource spec for external (remote) memory */
+struct vied_nci_resource_spec_ext_mem_s {
+    vied_nci_resource_id_t        type_id;
+    vied_nci_resource_size_t    size;
+    vied_nci_resource_size_t    offset;
+};
+
+typedef struct vied_nci_resource_spec_ext_mem_s
+    vied_nci_resource_spec_ext_mem_t;
+
+/* resource spec for device channel */
+struct vied_nci_resource_spec_dev_chn_s {
+    vied_nci_resource_id_t        type_id;
+    vied_nci_resource_size_t    size;
+    vied_nci_resource_size_t    offset;
+};
+
+typedef struct vied_nci_resource_spec_dev_chn_s
+    vied_nci_resource_spec_dev_chn_t;
+
+/* resource spec for DFM port */
+struct vied_nci_resource_spec_dfm_port_s {
+    vied_nci_resource_id_t        type_id;
+    vied_nci_resource_bitmap_t    bitmask;
+};
+
+typedef struct vied_nci_resource_spec_dfm_port_s
+    vied_nci_resource_spec_dfm_port_t;
+
+/* resource spec for all contiguous resources */
+struct vied_nci_resource_spec_s {
+    vied_nci_resource_spec_int_mem_t int_mem[VIED_NCI_N_MEM_TYPE_ID];
+    vied_nci_resource_spec_ext_mem_t ext_mem[VIED_NCI_N_DATA_MEM_TYPE_ID];
+    vied_nci_resource_spec_dev_chn_t dev_chn[VIED_NCI_N_DEV_CHN_ID];
+};
+
+typedef struct vied_nci_resource_spec_s vied_nci_resource_spec_t;
+
+#ifndef PIPE_GENERATION
+
+extern const uint8_t /* vied_nci_cell_type_ID_t */ vied_nci_cell_type[VIED_NCI_N_CELL_ID];
+extern const uint8_t /* vied_nci_mem_type_ID_t */ vied_nci_mem_type[VIED_NCI_N_MEM_ID];
+extern const uint16_t vied_nci_N_cell_mem[VIED_NCI_N_CELL_TYPE_ID];
+extern const uint8_t /* vied_nci_mem_type_ID_t */
+    vied_nci_cell_mem_type[VIED_NCI_N_CELL_TYPE_ID][VIED_NCI_N_MEM_TYPE_ID];
+extern const uint8_t /* vied_nci_mem_ID_t */
+    vied_nci_ext_mem[VIED_NCI_N_MEM_TYPE_ID];
+extern const uint8_t /* vied_nci_mem_ID_t */
+    vied_nci_cell_mem[VIED_NCI_N_CELL_ID][VIED_NCI_N_MEM_TYPE_ID];
+extern const uint16_t vied_nci_mem_size[VIED_NCI_N_MEM_ID];
+extern const uint16_t vied_nci_mem_word_size[VIED_NCI_N_DATA_MEM_TYPE_ID];
+extern const uint16_t vied_nci_dev_chn_size[VIED_NCI_N_DEV_CHN_ID];
+extern const uint16_t vied_nci_dfm_port_size[VIED_NCI_N_DEV_DFM_ID];
+
+STORAGE_CLASS_INLINE
+uint32_t vied_nci_mem_is_ext_type(const vied_nci_mem_type_ID_t mem_type_id)
+{
+    return((mem_type_id == VIED_NCI_TRANSFER_VMEM0_TYPE_ID) ||
+        (mem_type_id == VIED_NCI_TRANSFER_VMEM1_TYPE_ID) ||
+        (mem_type_id == VIED_NCI_LB_VMEM_TYPE_ID));
+}
+
+#endif /* PIPE_GENERATION */
+#endif /* __VIED_NCI_PSYS_RESOURCE_MODEL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_system_global.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_system_global.h
new file mode 100644
index 000000000000..5597ab02a4f2
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_system_global.h
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __VIED_NCI_PSYS_SYSTEM_GLOBAL_H
+#define __VIED_NCI_PSYS_SYSTEM_GLOBAL_H
+
+#include <type_support.h>
+#include "ia_css_base_types.h"
+#include "ia_css_psys_sim_storage_class.h"
+#include "vied_nci_psys_resource_model.h"
+
+/*
+ * Key system types
+ */
+/* Subsystem internal physical address */
+#define VIED_ADDRESS_BITS 32
+
+/* typedef uint32_t vied_address_t; */
+
+/* Subsystem internal virtual address */
+
+/* Subsystem internal data bus */
+#define VIED_DATA_BITS 32
+typedef uint32_t vied_data_t;
+
+#define VIED_NULL ((vied_vaddress_t)0)
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_bit_mask(
+    const unsigned                    index);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_bitmap_set(
+    const vied_nci_resource_bitmap_t        bitmap,
+    const vied_nci_resource_bitmap_t        bit_mask);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_bitmap_clear(
+    const vied_nci_resource_bitmap_t        bitmap,
+    const vied_nci_resource_bitmap_t        bit_mask);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+bool vied_nci_is_bitmap_empty(
+    const vied_nci_resource_bitmap_t        bitmap);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+bool vied_nci_is_bitmap_set(
+    const vied_nci_resource_bitmap_t        bitmap,
+    const vied_nci_resource_bitmap_t        bit_mask);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+bool vied_nci_is_bit_set_in_bitmap(
+    const vied_nci_resource_bitmap_t        bitmap,
+    const unsigned int        index);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+bool vied_nci_is_bitmap_clear(
+    const vied_nci_resource_bitmap_t        bitmap,
+    const vied_nci_resource_bitmap_t        bit_mask);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+int vied_nci_bitmap_compute_weight(
+    const vied_nci_resource_bitmap_t        bitmap);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_bitmap_union(
+    const vied_nci_resource_bitmap_t        bitmap0,
+    const vied_nci_resource_bitmap_t        bitmap1);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_bitmap_intersection(
+    const vied_nci_resource_bitmap_t        bitmap0,
+    const vied_nci_resource_bitmap_t        bitmap1);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_bitmap_xor(
+    const vied_nci_resource_bitmap_t        bitmap0,
+    const vied_nci_resource_bitmap_t        bitmap1);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_bitmap_set_unique(
+    const vied_nci_resource_bitmap_t        bitmap,
+    const vied_nci_resource_bitmap_t        bit_mask);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_bitfield_mask(
+        const unsigned int position,
+        const unsigned int size);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_bitmap_set_bitfield(
+const vied_nci_resource_bitmap_t        bitmap,
+const unsigned int                        index,
+const unsigned int                        size);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_bit_mask_set_unique(
+    const vied_nci_resource_bitmap_t        bitmap,
+    const unsigned                    index);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_cell_bit_mask(
+    const vied_nci_cell_ID_t        cell_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_barrier_bit_mask(
+    const vied_nci_barrier_ID_t        barrier_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_cell_type_ID_t vied_nci_cell_get_type(
+    const vied_nci_cell_ID_t        cell_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_mem_ID_t vied_nci_ext_mem_get_id_from_type(
+    const vied_nci_mem_type_ID_t        mem_type);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_mem_type_ID_t vied_nci_mem_get_type(
+    const vied_nci_mem_ID_t            mem_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+uint16_t vied_nci_mem_get_size(
+    const vied_nci_mem_ID_t            mem_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+uint16_t vied_nci_dev_chn_get_size(
+    const vied_nci_dev_chn_ID_t        dev_chn_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+bool vied_nci_is_cell_of_type(
+    const vied_nci_cell_ID_t        cell_id,
+    const vied_nci_cell_type_ID_t    cell_type_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+bool vied_nci_is_mem_of_type(
+    const vied_nci_mem_ID_t            mem_id,
+    const vied_nci_mem_type_ID_t    mem_type_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+bool vied_nci_is_cell_mem_of_type(
+    const vied_nci_cell_ID_t        cell_id,
+    const uint16_t                    mem_index,
+    const vied_nci_mem_type_ID_t    mem_type_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+bool vied_nci_has_cell_mem_of_id(
+    const vied_nci_cell_ID_t        cell_id,
+    const vied_nci_mem_ID_t            mem_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+uint16_t vied_nci_cell_get_mem_count(
+    const vied_nci_cell_ID_t        cell_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_mem_type_ID_t vied_nci_cell_get_mem_type(
+    const vied_nci_cell_ID_t        cell_id,
+    const uint16_t                    mem_index);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_mem_ID_t vied_nci_cell_get_mem(
+    const vied_nci_cell_ID_t        cell_id,
+    const uint16_t                    mem_index);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_mem_type_ID_t vied_nci_cell_type_get_mem_type(
+    const vied_nci_cell_type_ID_t    cell_type_id,
+    const uint16_t                    mem_index);
+
+#ifdef __IA_CSS_PSYS_SIM_INLINE__
+#include "psys_system_global_impl.h"
+#endif /* __IA_CSS_PSYS_SIM_INLINE__ */
+
+#endif /* __VIED_NCI_PSYS_SYSTEM_GLOBAL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_kernel_bitmap.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_kernel_bitmap.c
new file mode 100644
index 000000000000..35a1dcc78de2
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_kernel_bitmap.c
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <ia_css_kernel_bitmap.h>
+#include <type_support.h>
+#include <misc_support.h>
+#include <assert_support.h>
+#include "math_support.h"
+#include "ia_css_psys_kernel_trace.h"
+
+#ifndef __IA_CSS_KERNEL_BITMAP_INLINE__
+#include "ia_css_kernel_bitmap_impl.h"
+#endif /* __IA_CSS_KERNEL_BITMAP_INLINE__ */
+
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_element_from_uint32(
+    ia_css_kernel_bitmap_t                bitmap,
+    const unsigned int                elem_index,
+    const uint32_t                    elem_value)
+{
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+        "ia_css_kernel_bitmap_set_element_from_uint32(): enter:\n");
+
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+    COMPILATION_ERROR_IF(sizeof(bitmap.data[elem_index]) != sizeof(elem_value));
+
+    if (elem_index < IA_CSS_KERNEL_BITMAP_NOF_ELEMS) {
+        bitmap.data[elem_index] = elem_value;
+    } else {
+        assert(0);
+    }
+#else
+    COMPILATION_ERROR_IF(IA_CSS_KERNEL_BITMAP_BITS != 64);
+
+    bitmap &= ~((((ia_css_kernel_bitmap_t) 1 << IA_CSS_KERNEL_BITMAP_ELEM_BITS) - 1) <<
+                            (elem_index * IA_CSS_KERNEL_BITMAP_ELEM_BITS));
+    bitmap |= (ia_css_kernel_bitmap_t) elem_value << (elem_index * IA_CSS_KERNEL_BITMAP_ELEM_BITS);
+#endif
+
+    return bitmap;
+}
+
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_create_from_uint64(
+    const uint64_t value)
+{
+    const unsigned int bits64 = sizeof(uint64_t) * 8;
+    const unsigned int nof_elems_bits64 = bits64 / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
+    unsigned int i;
+    ia_css_kernel_bitmap_t result;
+
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+        "ia_css_kernel_bitmap_create_from_uint64(): enter:\n");
+
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+    result = ia_css_kernel_bitmap_clear();
+    for (i = 0; i < MIN(nof_elems_bits64, IA_CSS_KERNEL_BITMAP_NOF_ELEMS); i++) {
+        /* masking is done implictly, the MSB bits of casting will bel chopped off */
+        result.data[i] = (IA_CSS_KERNEL_BITMAP_ELEM_TYPE)
+            (value >> (i * IA_CSS_KERNEL_BITMAP_ELEM_BITS));
+    }
+
+#if IA_CSS_KERNEL_BITMAP_BITS < 64
+    if ((value >> IA_CSS_KERNEL_BITMAP_BITS) != 0) {
+        IA_CSS_TRACE_0(PSYSAPI_KERNEL, ERROR,
+            "ia_css_kernel_bitmap_create_from_uint64(): "
+            "kernel bitmap is not wide enough to encode value\n");
+        assert(0);
+    }
+#endif
+#else
+    NOT_USED(i);
+    NOT_USED(nof_elems_bits64);
+    result = value;
+#endif /* IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS */
+    return result;
+}
+
+uint64_t ia_css_kernel_bitmap_to_uint64(
+    const ia_css_kernel_bitmap_t value)
+{
+    const unsigned int bits64 = sizeof(uint64_t) * 8;
+    const unsigned int nof_elems_bits64 = bits64 / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
+    unsigned int i;
+    uint64_t res = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+        "ia_css_kernel_bitmap_to_uint64(): enter:\n");
+
+    assert((bits64 % IA_CSS_KERNEL_BITMAP_ELEM_BITS) == 0);
+    assert(nof_elems_bits64 > 0);
+
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+    for (i = 0; i < MIN(IA_CSS_KERNEL_BITMAP_ELEM_BITS, nof_elems_bits64); i++) {
+        res |= ((uint64_t)(value.data[i]) << (i * IA_CSS_KERNEL_BITMAP_ELEM_BITS));
+    }
+    for (; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
+        assert(value.data[i] == 0);
+    }
+    return res;
+#else
+    (void)i;
+    (void)res;
+    (void)nof_elems_bits64;
+    return (uint64_t)value;
+#endif /* IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS */
+}
+
+int ia_css_kernel_bitmap_print(
+    const ia_css_kernel_bitmap_t            bitmap,
+    void                        *fid)
+{
+    int retval = -1;
+    int bit;
+    unsigned int bit_index = 0;
+    ia_css_kernel_bitmap_t loc_bitmap;
+
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, INFO,
+        "ia_css_kernel_bitmap_print(): enter:\n");
+
+    NOT_USED(fid);
+    NOT_USED(bit);
+
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, INFO, "kernel bitmap {\n");
+
+    loc_bitmap = bitmap;
+
+    for (bit_index = 0; (bit_index < IA_CSS_KERNEL_BITMAP_BITS) &&
+        !ia_css_is_kernel_bitmap_empty(loc_bitmap); bit_index++) {
+
+        bit = ia_css_is_kernel_bitmap_set(loc_bitmap, 0);
+        loc_bitmap = ia_css_kernel_bitmap_shift(loc_bitmap);
+        IA_CSS_TRACE_2(PSYSAPI_KERNEL, INFO, "\t%d\t = %d\n", bit_index, bit);
+    }
+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, INFO, "}\n");
+
+    retval = 0;
+    return retval;
+}
+
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_data.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_data.c
new file mode 100644
index 000000000000..62369e7d8308
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_data.c
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ia_css_psys_data_storage_class.h"
+
+/*
+ * Functions to possibly inline
+ */
+
+#ifdef __IA_CSS_PSYS_DATA_INLINE__
+STORAGE_CLASS_INLINE int
+__ia_css_program_group_data_avoid_warning_on_empty_file(void) { return 0; }
+#else /* __IA_CSS_PSYS_DATA_INLINE__ */
+#include "ia_css_program_group_data_impl.h"
+#endif /* __IA_CSS_PSYS_DATA_INLINE__ */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_param.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_param.c
new file mode 100644
index 000000000000..e4ab5b901a4a
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_param.c
@@ -0,0 +1,769 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <ia_css_program_group_param.h>
+#include <ia_css_program_group_param_private.h>
+#include <ia_css_psys_manifest_types.h>
+#include <ia_css_psys_program_group_manifest.h>
+#include <ia_css_psysapi_fw_version.h>
+#include <error_support.h>
+#include <misc_support.h>
+#include <assert_support.h>
+#include <type_support.h>
+#include <print_support.h>
+
+#include "ia_css_psys_param_trace.h"
+
+static int
+ia_css_terminal_param_init(ia_css_terminal_param_t *terminal_param,
+               uint32_t offset,
+               enum ia_css_frame_format_type frame_format_type);
+
+static int
+ia_css_program_param_init(ia_css_program_param_t *program_param,
+                int32_t offset);
+
+size_t ia_css_sizeof_program_group_param(
+    const uint8_t program_count,
+    const uint8_t terminal_count,
+    const uint16_t fragment_count)
+{
+    size_t    size = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+        "ia_css_sizeof_program_group_param(): enter:\n");
+
+    verifexit(program_count != 0);
+    verifexit(terminal_count != 0);
+    verifexit(fragment_count != 0);
+
+    size += sizeof(ia_css_program_group_param_t);
+    size += program_count * fragment_count * sizeof(ia_css_program_param_t);
+    size += terminal_count * sizeof(ia_css_terminal_param_t);
+EXIT:
+    if (0 == program_count || 0 == terminal_count || 0 == fragment_count) {
+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+            "ia_css_sizeof_program_group_param invalid argument\n");
+    }
+    return size;
+}
+
+size_t ia_css_program_group_param_get_size(
+    const ia_css_program_group_param_t        *program_group_param)
+{
+    size_t    size = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+               "ia_css_program_group_param_get_size(): enter:\n");
+
+    if (program_group_param != NULL) {
+        size = program_group_param->size;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+              "ia_css_program_group_param_get_size invalid argument\n");
+    }
+    return size;
+}
+
+size_t ia_css_program_param_get_size(
+    const ia_css_program_param_t            *param)
+{
+    size_t    size = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+               "ia_css_program_param_get_size(): enter:\n");
+
+    if (param != NULL) {
+        size = param->size;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+            "ia_css_program_param_get_size invalid argument\n");
+    }
+    return size;
+}
+
+ia_css_program_param_t *ia_css_program_group_param_get_program_param(
+    const ia_css_program_group_param_t *param,
+    const int i)
+{
+    ia_css_program_param_t    *program_param = NULL;
+    ia_css_program_param_t    *program_param_base;
+    int program_count = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+        "ia_css_program_group_param_get_program_param(): enter:\n");
+
+    verifexit(param != NULL);
+
+    program_count =
+        (int)ia_css_program_group_param_get_program_count(param);
+
+    verifexit(i < program_count);
+
+    program_param_base = (ia_css_program_param_t *)
+            (((char *)param) + param->program_param_offset);
+
+    program_param = &program_param_base[i];
+
+EXIT:
+    if (NULL == param || i >= program_count) {
+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+            "ia_css_program_group_param_get_program_param invalid argument\n");
+    }
+    return program_param;
+}
+
+size_t ia_css_terminal_param_get_size(
+    const ia_css_terminal_param_t            *param)
+{
+    size_t    size = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+        "ia_css_terminal_param_get_size(): enter:\n");
+
+    if (param != NULL) {
+        size = param->size;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+            "ia_css_terminal_param_get_size invalid argument\n");
+    }
+
+    return size;
+}
+
+ia_css_terminal_param_t *ia_css_program_group_param_get_terminal_param(
+    const ia_css_program_group_param_t        *param,
+    const int        i)
+{
+    ia_css_terminal_param_t    *terminal_param = NULL;
+    ia_css_terminal_param_t    *terminal_param_base;
+    int program_count = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+        "ia_css_program_group_param_get_terminal_param(): enter:\n");
+
+    verifexit(param != NULL);
+
+    program_count =
+        (int)ia_css_program_group_param_get_terminal_count(param);
+
+    verifexit(i < program_count);
+
+    terminal_param_base = (ia_css_terminal_param_t *)
+            (((char *)param) + param->terminal_param_offset);
+    terminal_param = &terminal_param_base[i];
+EXIT:
+    if (NULL == param || i >= program_count) {
+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+            "ia_css_program_group_param_get_terminal_param invalid argument\n");
+    }
+    return terminal_param;
+}
+
+uint8_t ia_css_program_group_param_get_program_count(
+    const ia_css_program_group_param_t        *param)
+{
+    uint8_t    program_count = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+        "ia_css_program_group_param_get_program_count(): enter:\n");
+
+    if (param != NULL) {
+        program_count = param->program_count;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+            "ia_css_program_group_param_get_program_count invalid argument\n");
+    }
+    return program_count;
+}
+
+uint8_t ia_css_program_group_param_get_terminal_count(
+    const ia_css_program_group_param_t        *param)
+{
+    uint8_t    terminal_count = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+        "ia_css_program_group_param_get_terminal_count(): enter:\n");
+
+    if (param != NULL) {
+        terminal_count = param->terminal_count;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+            "ia_css_program_group_param_get_terminal_count invalid argument\n");
+    }
+    return terminal_count;
+}
+
+uint16_t ia_css_program_group_param_get_fragment_count(
+    const ia_css_program_group_param_t        *param)
+{
+    uint8_t    fragment_count = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+        "ia_css_program_group_param_get_fragment_count(): enter:\n");
+
+    if (param != NULL) {
+        fragment_count = (uint8_t)param->fragment_count;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+            "ia_css_program_group_param_get_fragment_count invalid argument\n");
+    }
+    return fragment_count;
+}
+
+int ia_css_program_group_param_set_protocol_version(
+    ia_css_program_group_param_t *param,
+    uint8_t protocol_version)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+         "ia_css_program_group_param_set_protocol_version(): enter:\n");
+
+    if (param != NULL) {
+        param->protocol_version = protocol_version;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+            "ia_css_program_group_param_set_protocol_version failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+uint8_t ia_css_program_group_param_get_protocol_version(
+    const ia_css_program_group_param_t *param)
+{
+    uint8_t protocol_version = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+         "ia_css_program_group_param_get_protocol_version(): enter:\n");
+
+    if (param != NULL) {
+        protocol_version = param->protocol_version;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+            "ia_css_program_group_param_get_protocol_version invalid argument\n");
+    }
+    return protocol_version;
+}
+
+int ia_css_program_group_param_set_kernel_enable_bitmap(
+    ia_css_program_group_param_t    *param,
+    const ia_css_kernel_bitmap_t    bitmap)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+         "ia_css_program_group_param_set_kernel_enable_bitmap(): enter:\n");
+
+    if (param != NULL) {
+        param->kernel_enable_bitmap = bitmap;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+            "ia_css_program_group_param_set_kernel_enable_bitmap failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+ia_css_kernel_bitmap_t ia_css_program_group_param_get_kernel_enable_bitmap(
+    const ia_css_program_group_param_t        *param)
+{
+    ia_css_kernel_bitmap_t    bitmap = ia_css_kernel_bitmap_clear();
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+         "ia_css_program_group_param_get_kernel_enable_bitmap(): enter:\n");
+
+    if (param != NULL) {
+        bitmap = param->kernel_enable_bitmap;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+            "ia_css_program_group_param_get_kernel_enable_bitmap invalid argument\n");
+    }
+    return bitmap;
+}
+
+int ia_css_program_param_set_kernel_enable_bitmap(
+    ia_css_program_param_t        *program_param,
+    const ia_css_kernel_bitmap_t    bitmap)
+{
+    assert(0);
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, ERROR,
+        "ia_css_program_param_set_kernel_enable_bitmap(): deprecated API function:\n");
+
+    if (program_param != NULL) {
+        program_param->kernel_enable_bitmap = bitmap;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_PARAM, ERROR,
+            "ia_css_program_param_set_kernel_enable_bitmap failed\n");
+    }
+    return -1;
+}
+
+ia_css_kernel_bitmap_t ia_css_program_param_get_kernel_enable_bitmap(
+    const ia_css_program_param_t    *program_param)
+{
+    ia_css_kernel_bitmap_t    bitmap = ia_css_kernel_bitmap_clear();
+    char *base;
+
+    assert(0);
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, ERROR,
+        "ia_css_program_param_get_kernel_enable_bitmap():  deprecated API function:\n");
+
+    verifexit(program_param != NULL);
+    verifexit(program_param->parent_offset != 0);
+
+    base = (char *)((char *)program_param + program_param->parent_offset);
+    bitmap = ((ia_css_program_group_param_t *)base)->kernel_enable_bitmap;
+EXIT:
+    if (NULL == program_param || 0 == program_param->parent_offset)    {
+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+            "ia_css_program_param_get_kernel_enable_bitmap invalid argument\n");
+    }
+    return bitmap;
+}
+
+ia_css_kernel_bitmap_t ia_css_terminal_param_get_kernel_enable_bitmap(
+    const ia_css_terminal_param_t            *param)
+{
+    ia_css_kernel_bitmap_t    bitmap = ia_css_kernel_bitmap_clear();
+    char *base;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+        "ia_css_terminal_param_get_kernel_enable_bitmap(): enter:\n");
+
+    verifexit(param != NULL);
+    verifexit(param->parent_offset != 0);
+
+    base = (char *)((char *)param + param->parent_offset);
+    bitmap = ((ia_css_program_group_param_t *)base)->kernel_enable_bitmap;
+EXIT:
+    if (NULL == param || 0 == param->parent_offset) {
+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+            "ia_css_terminal_param_get_kernel_enable_bitmap invalid argument\n");
+    }
+    return bitmap;
+}
+
+ia_css_frame_format_type_t ia_css_terminal_param_get_frame_format_type(
+    const ia_css_terminal_param_t    *param)
+{
+    ia_css_frame_format_type_t ft = IA_CSS_N_FRAME_FORMAT_TYPES;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+        "ia_css_terminal_param_get_frame_format_type(): enter:\n");
+
+    verifexit(param != NULL);
+
+    ft = param->frame_format_type;
+EXIT:
+    if (NULL == param) {
+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+            "ia_css_terminal_param_get_frame_format_type invalid argument\n");
+    }
+    return ft;
+}
+
+int ia_css_terminal_param_set_frame_format_type(
+    ia_css_terminal_param_t        *param,
+    const ia_css_frame_format_type_t    data_format_type)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+        "ia_css_terminal_param_set_frame_format_type(): enter:\n");
+
+    if (param != NULL) {
+        param->frame_format_type = data_format_type;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+            "ia_css_terminal_param_set_frame_format_type failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+uint8_t ia_css_terminal_param_get_bpp(
+    const ia_css_terminal_param_t    *param)
+{
+    uint8_t bpp = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+               "ia_css_terminal_param_get_bpp(): enter:\n");
+
+    verifexit(param != NULL);
+
+    bpp = param->bpp;
+
+EXIT:
+    if (NULL == param) {
+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+            "ia_css_terminal_param_get_bpp invalid argument\n");
+    }
+    return bpp;
+}
+
+int ia_css_terminal_param_set_bpp(
+    ia_css_terminal_param_t    *param,
+    const uint8_t bpp)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+               "ia_css_terminal_param_set_bpp(): enter:\n");
+
+    if (param != NULL) {
+        param->bpp = bpp;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+            "ia_css_terminal_param_set_bpp failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+int ia_css_terminal_param_get_dimensions(
+    const ia_css_terminal_param_t    *param,
+    uint16_t dimensions[IA_CSS_N_DATA_DIMENSION])
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+        "ia_css_terminal_param_get_dimensions(): enter:\n");
+
+    if (param != NULL) {
+        dimensions[IA_CSS_COL_DIMENSION] =
+            param->dimensions[IA_CSS_COL_DIMENSION];
+        dimensions[IA_CSS_ROW_DIMENSION] =
+            param->dimensions[IA_CSS_ROW_DIMENSION];
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+          "ia_css_terminal_param_get_dimensions failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+int ia_css_terminal_param_set_dimensions(
+    ia_css_terminal_param_t    *param,
+    const uint16_t dimensions[IA_CSS_N_DATA_DIMENSION])
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+        "ia_css_terminal_param_set_dimensions(): enter:\n");
+
+    if (param != NULL) {
+        param->dimensions[IA_CSS_COL_DIMENSION] =
+                dimensions[IA_CSS_COL_DIMENSION];
+        param->dimensions[IA_CSS_ROW_DIMENSION] =
+                dimensions[IA_CSS_ROW_DIMENSION];
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+          "ia_css_terminal_param_set_dimensions failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+int ia_css_terminal_param_set_stride(
+    ia_css_terminal_param_t        *param,
+    const uint32_t stride)
+{
+    int retval = -1;
+
+    verifexit(param != NULL);
+    param->stride = stride;
+    retval = 0;
+
+EXIT:
+    return retval;
+}
+
+uint32_t ia_css_terminal_param_get_stride(
+    const ia_css_terminal_param_t    *param)
+{
+    uint32_t stride = 0;
+
+    verifexit(param != NULL);
+    stride = param->stride;
+
+EXIT:
+    return stride;
+}
+
+static int ia_css_program_param_init(
+        ia_css_program_param_t *program_param,
+        int32_t offset)
+{
+    int retval = -1;
+
+    COMPILATION_ERROR_IF(
+        SIZE_OF_PROGRAM_PARAM_STRUCT_IN_BITS !=
+                (CHAR_BIT * sizeof(ia_css_program_param_t)));
+    verifexit(program_param != NULL);
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
+        "ia_css_program_param_init(): enter:\n");
+
+    program_param->size = sizeof(ia_css_program_param_t);
+    /* parent is at negative offset from current program.*/
+    program_param->parent_offset = -offset;
+    /*TODO: Kernel_bitmap setting. ?*/
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+            "ia_css_program_param_init failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+static int
+ia_css_terminal_param_init(ia_css_terminal_param_t *terminal_param,
+            uint32_t offset,
+            enum ia_css_frame_format_type frame_format_type)
+{
+    int retval = -1;
+
+    COMPILATION_ERROR_IF(
+        SIZE_OF_TERMINAL_PARAM_STRUCT_IN_BITS !=
+            (CHAR_BIT * sizeof(ia_css_terminal_param_t)));
+    verifexit(terminal_param != NULL);
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
+        "ia_css_terminal_param_init(): enter:\n");
+
+    terminal_param->size = sizeof(ia_css_terminal_param_t);
+    /* parent is at negative offset from current program.*/
+    terminal_param->parent_offset = -((int32_t)offset);
+    /*TODO: Kernel_bitmap setting. ?*/
+    terminal_param->frame_format_type = frame_format_type;
+
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+            "ia_css_terminal_param_init failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+ia_css_program_group_param_t *
+ia_css_terminal_param_get_parent(
+    const ia_css_terminal_param_t            *param)
+{
+    ia_css_program_group_param_t *parent = NULL;
+    char *base;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+               "ia_css_terminal_param_get_parent(): enter:\n");
+
+    verifexit(NULL != param);
+
+    base = (char *)((char *)param + param->parent_offset);
+
+    parent = (ia_css_program_group_param_t *)(base);
+EXIT:
+    if (NULL == param) {
+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+            "ia_css_terminal_param_get_parent invalid argument\n");
+    }
+    return parent;
+}
+
+int ia_css_program_group_param_init(
+    ia_css_program_group_param_t *blob,
+    const uint8_t    program_count,
+    const uint8_t    terminal_count,
+    const uint16_t    fragment_count,
+    const enum ia_css_frame_format_type *frame_format_types)
+{
+    int i = 0;
+    char *param_base;
+    uint32_t offset;
+    int  retval = -1;
+
+    COMPILATION_ERROR_IF(
+        SIZE_OF_PROGRAM_GROUP_PARAM_STRUCT_IN_BITS !=
+            (CHAR_BIT * sizeof(ia_css_program_group_param_t)));
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
+        "ia_css_program_group_param_init(): enter:\n");
+
+    assert(blob != 0);
+
+    verifexit(blob != NULL);
+    verifexit(frame_format_types != NULL);
+
+    blob->program_count = program_count;
+    blob->fragment_count = fragment_count;
+    blob->terminal_count = terminal_count;
+    blob->program_param_offset = sizeof(ia_css_program_group_param_t);
+    blob->terminal_param_offset = blob->program_param_offset +
+                sizeof(ia_css_program_param_t) * program_count;
+
+    param_base = (char *)((char *)blob + blob->program_param_offset);
+    offset = blob->program_param_offset;
+
+    for (i = 0; i < program_count; i++) {
+        ia_css_program_param_init(
+            (ia_css_program_param_t *)param_base, offset);
+        offset += sizeof(ia_css_program_param_t);
+        param_base += sizeof(ia_css_program_param_t);
+    }
+
+    param_base = (char *)((char *)blob + blob->terminal_param_offset);
+    offset = blob->terminal_param_offset;
+
+    for (i = 0; i < terminal_count; i++) {
+        ia_css_terminal_param_init(
+            (ia_css_terminal_param_t *)param_base,
+            offset,
+            frame_format_types[i]);
+
+        offset += sizeof(ia_css_terminal_param_t);
+        param_base += sizeof(ia_css_terminal_param_t);
+    }
+
+    /*
+     * For now, set legacy flow by default. This can be removed as soon
+     * as all hosts/drivers explicitly set the protocol version.
+     */
+    blob->protocol_version = IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY;
+
+    blob->size = (uint32_t)ia_css_sizeof_program_group_param(program_count,
+                                terminal_count,
+                                fragment_count);
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+               "ia_css_program_group_param_init failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+int ia_css_program_group_param_print(
+    const ia_css_program_group_param_t        *param,
+    void                        *fid)
+{
+    int    retval = -1;
+    int        i;
+    uint8_t    program_count, terminal_count;
+    ia_css_kernel_bitmap_t    bitmap;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
+               "ia_css_program_group_param_print(): enter:\n");
+
+    verifexit(param != NULL);
+    NOT_USED(fid);
+
+    IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
+        "sizeof(program_group_param) = %d\n",
+        (int)ia_css_program_group_param_get_size(param));
+
+    program_count = ia_css_program_group_param_get_program_count(param);
+    terminal_count = ia_css_program_group_param_get_terminal_count(param);
+
+    bitmap = ia_css_program_group_param_get_kernel_enable_bitmap(param);
+    verifexit(ia_css_kernel_bitmap_print(bitmap, fid) == 0);
+
+    IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
+        "%d program params\n", (int)program_count);
+    for (i = 0; i < (int)program_count; i++) {
+        ia_css_program_param_t *program_param =
+            ia_css_program_group_param_get_program_param(param, i);
+
+        retval = ia_css_program_param_print(program_param, fid);
+        verifjmpexit(retval == 0);
+    }
+    IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO, "%d terminal params\n",
+               (int)terminal_count);
+    for (i = 0; i < (int)terminal_count; i++) {
+        ia_css_terminal_param_t    *terminal_param =
+            ia_css_program_group_param_get_terminal_param(param, i);
+
+        retval = ia_css_terminal_param_print(terminal_param, fid);
+        verifjmpexit(retval == 0);
+    }
+
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+              "ia_css_program_group_param_print failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+int ia_css_terminal_param_print(
+    const ia_css_terminal_param_t            *param,
+    void                        *fid)
+{
+    int    retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
+        "ia_css_terminal_param_print(): enter:\n");
+
+    verifexit(param != NULL);
+    NOT_USED(fid);
+
+    IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
+        "sizeof(terminal_param) = %d\n",
+        (int)ia_css_terminal_param_get_size(param));
+
+    IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
+        "\tframe_format_type = %d\n", param->frame_format_type);
+
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+            "ia_css_terminal_param_print failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+int ia_css_program_param_print(
+    const ia_css_program_param_t            *param,
+    void                        *fid)
+{
+    int    retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
+        "ia_css_program_param_print(): enter:\n");
+
+    verifexit(param != NULL);
+    NOT_USED(fid);
+
+    IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO, "sizeof(program_param) = %d\n",
+               (int)ia_css_program_param_get_size(param));
+
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+            "ia_css_program_param_print failed (%i)\n", retval);
+    }
+    return retval;
+}
+
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process.c
new file mode 100644
index 000000000000..a05e1075a48f
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process.c
@@ -0,0 +1,1038 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ia_css_psys_process.h"
+#include "ia_css_psys_dynamic_storage_class.h"
+#include "ia_css_psys_process_private_types.h"
+#include "ia_css_program_group_param_private.h"
+#include "math_support.h"
+
+/* *****************************************************
+ * Functions to possibly inline
+ * ******************************************************/
+#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
+#include "ia_css_psys_process_impl.h"
+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
+
+/* *****************************************************
+ * Functions not to inline and not available to firmware
+ * ******************************************************/
+#if !defined(__HIVECC)
+STORAGE_CLASS_INLINE bool  ia_css_program_manifest_process_requires_extension(
+    const ia_css_program_manifest_t            *manifest)
+{
+    int i;
+    bool requires_extension = false;
+
+    verifexit(manifest != NULL);
+
+    for (i = 0; i < VIED_NCI_N_DATA_MEM_TYPE_ID; i++) {
+        requires_extension |=
+            (ia_css_program_manifest_get_ext_mem_size(manifest, i) != 0);
+    }
+
+#if HAS_DFM
+    for (i = 0; i < VIED_NCI_N_DEV_CHN_ID; i++) {
+        requires_extension |=
+            (ia_css_program_manifest_get_dev_chn_size(manifest, i) != 0);
+    }
+    for (i = 0; i < VIED_NCI_N_DEV_DFM_ID; i++) {
+        requires_extension |=
+            (ia_css_program_manifest_get_dfm_port_bitmap(manifest, i) != 0);
+        requires_extension |=
+            (ia_css_program_manifest_get_dfm_active_port_bitmap(manifest, i) != 0);
+    }
+#endif /* HAS_DFM */
+EXIT:
+    return requires_extension;
+}
+
+size_t ia_css_sizeof_process(
+    const ia_css_program_manifest_t            *manifest,
+    const ia_css_program_param_t            *param)
+{
+    size_t    size = 0;
+
+    uint8_t    program_dependency_count;
+    uint8_t terminal_dependency_count;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_sizeof_process(): enter:\n");
+
+    verifexit(manifest != NULL);
+    verifexit(param != NULL);
+
+    size += sizeof(ia_css_process_t);
+
+    if (ia_css_program_manifest_process_requires_extension(manifest)) {
+        /* align start of extension to 32 bit */
+        size = CEIL_MUL(size, sizeof(uint32_t));
+        size += sizeof(ia_css_process_ext_t);
+    }
+
+    program_dependency_count =
+        ia_css_program_manifest_get_program_dependency_count(manifest);
+    terminal_dependency_count =
+        ia_css_program_manifest_get_terminal_dependency_count(manifest);
+
+    size += program_dependency_count*sizeof(vied_nci_resource_id_t);
+    size += terminal_dependency_count*sizeof(vied_nci_resource_id_t);
+
+    /* align whole structure to 32 bit */
+    size = CEIL_MUL(size, sizeof(uint32_t));
+EXIT:
+    if (NULL == manifest || NULL == param) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_sizeof_process invalid argument\n");
+    }
+    return size;
+}
+
+ia_css_process_t *ia_css_process_create(
+    void                    *raw_mem,
+    const ia_css_program_manifest_t        *manifest,
+    const ia_css_program_param_t        *param,
+    const uint32_t                program_idx)
+{
+    int retval = -1, size = 0;
+    ia_css_process_t *process = NULL;
+    bool create_extension;
+
+    uint8_t    program_dependency_count;
+    uint8_t    terminal_dependency_count;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_create(): enter:\n");
+
+    verifexit(manifest != NULL);
+    verifexit(param != NULL);
+    verifexit(raw_mem != NULL);
+
+    process = (ia_css_process_t *)raw_mem;;
+    verifexit(process != NULL);
+    create_extension = ia_css_program_manifest_process_requires_extension(manifest);
+
+    process->state = IA_CSS_PROCESS_CREATED;
+
+    program_dependency_count =
+        ia_css_program_manifest_get_program_dependency_count(manifest);
+    terminal_dependency_count =
+        ia_css_program_manifest_get_terminal_dependency_count(manifest);
+
+    /* A process requires at least one input or output */
+    verifexit((program_dependency_count +
+           terminal_dependency_count) != 0);
+
+    size += sizeof(ia_css_process_t);
+
+    if (create_extension == true) {
+        /* align start of extension to 32 bit */
+        size = CEIL_MUL(size, sizeof(uint32_t));
+        process->process_extension_offset = (uint8_t)size;
+        size += sizeof(ia_css_process_ext_t);
+    } else {
+        process->process_extension_offset = 0;
+    }
+    if (program_dependency_count != 0) {
+        process->cell_dependencies_offset = (uint8_t)size;
+        size += program_dependency_count * sizeof(vied_nci_resource_id_t);
+    } else {
+        process->cell_dependencies_offset = 0;
+    }
+    if (terminal_dependency_count != 0) {
+        process->terminal_dependencies_offset = (uint8_t)size;;
+        size += terminal_dependency_count * sizeof(uint8_t);
+    } else {
+        process->terminal_dependencies_offset = 0;
+    }
+
+    /* align whole structure to 32 bit */
+    size = CEIL_MUL(size, sizeof(uint32_t));
+
+    process->size = (uint8_t)ia_css_sizeof_process(manifest, param);
+    assert((size_t)size == process->size);
+    /* The following assert also implies that:
+     * process->terminal_dependencies_offset,
+     * process->cell_dependencies_offset,
+     * process->process_extension_offset,
+     * are <= UINT8_MAX
+     */
+    assert(size <= UINT8_MAX);
+
+    process->ID = ia_css_program_manifest_get_program_ID(manifest);
+    verifexit(process->ID != 0);
+    assert(program_idx <= UINT8_MAX);
+    process->program_idx = program_idx;
+
+    process->cell_dependency_count = program_dependency_count;
+    process->terminal_dependency_count = terminal_dependency_count;
+
+    process->parent_offset = 0;
+    verifexit(ia_css_process_clear_all(process) == 0);
+
+    process->state = IA_CSS_PROCESS_READY;
+    retval = 0;
+
+    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_create(): Created successfully process 0x%lx ID 0x%x\n",
+        (unsigned long int)process, process->ID);
+
+EXIT:
+    if (NULL == manifest || NULL == param) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_create invalid argument\n");
+    }
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_create failed (%i)\n", retval);
+        process = ia_css_process_destroy(process);
+    }
+    return process;
+}
+
+ia_css_process_t *ia_css_process_destroy(
+    ia_css_process_t *process)
+{
+
+    return process;
+}
+
+int ia_css_process_set_cell(
+    ia_css_process_t                    *process,
+    const vied_nci_cell_ID_t                cell_id)
+{
+    int    retval = -1;
+    vied_nci_resource_bitmap_t        bit_mask;
+    vied_nci_resource_bitmap_t        resource_bitmap;
+    ia_css_process_group_t            *parent;
+    ia_css_process_group_state_t    parent_state;
+    ia_css_process_state_t            state;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_set_cell(): enter:\n");
+
+    verifexit(process != NULL);
+
+    parent = ia_css_process_get_parent(process);
+    verifexit(parent != NULL);
+
+    parent_state = ia_css_process_group_get_state(parent);
+    state = ia_css_process_get_state(process);
+
+/* Some programs are mapped on a fixed cell,
+ * when the process group is created
+ */
+    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
+        (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
+        (parent_state == IA_CSS_PROCESS_GROUP_CREATED) ||
+        /* If the process group has already been created, but no VP cell
+         * has been assigned to this process (i.e. not fixed in
+         * manifest), then we need to set the cell of this process
+         * while its parent state is READY (the ready state is set at
+         * the end of ia_css_process_group_create)
+         */
+        (parent_state == IA_CSS_PROCESS_GROUP_READY)));
+    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
+
+/* Some programs are mapped on a fixed cell, thus check is not secure,
+ * but it will detect a preset, the process manager will do the secure check
+ */
+    verifexit(ia_css_process_get_cell(process) ==
+          VIED_NCI_N_CELL_ID);
+
+    bit_mask = vied_nci_cell_bit_mask(cell_id);
+    resource_bitmap = ia_css_process_group_get_resource_bitmap(parent);
+
+    verifexit(bit_mask != 0);
+    verifexit(vied_nci_is_bitmap_clear(bit_mask, resource_bitmap));
+
+    ia_css_process_cells_clear(process);
+    ia_css_process_cells_set_cell(process, 0, cell_id);
+
+    resource_bitmap = vied_nci_bitmap_set(resource_bitmap, bit_mask);
+
+    retval = ia_css_process_group_set_resource_bitmap(
+            parent, resource_bitmap);
+EXIT:
+    if (NULL == process) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_set_cell invalid argument process\n");
+    }
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_set_cell failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+int ia_css_process_clear_cell(
+    ia_css_process_t *process)
+{
+    int    retval = -1;
+    vied_nci_cell_ID_t                cell_id;
+    ia_css_process_group_t            *parent;
+    vied_nci_resource_bitmap_t        resource_bitmap;
+    vied_nci_resource_bitmap_t        bit_mask;
+    ia_css_process_group_state_t    parent_state;
+    ia_css_process_state_t            state;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+               "ia_css_process_clear_cell(): enter:\n");
+    verifexit(process != NULL);
+
+    cell_id = ia_css_process_get_cell(process);
+    parent = ia_css_process_get_parent(process);
+    verifexit(parent != NULL);
+
+    parent_state = ia_css_process_group_get_state(parent);
+    state = ia_css_process_get_state(process);
+
+    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED)
+           || (parent_state == IA_CSS_PROCESS_GROUP_STARTED)));
+    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
+
+    bit_mask = vied_nci_cell_bit_mask(cell_id);
+    resource_bitmap = ia_css_process_group_get_resource_bitmap(parent);
+
+    verifexit(bit_mask != 0);
+    verifexit(vied_nci_is_bitmap_set(bit_mask, resource_bitmap));
+
+    ia_css_process_cells_clear(process);
+
+    resource_bitmap = vied_nci_bitmap_clear(resource_bitmap, bit_mask);
+
+    retval = ia_css_process_group_set_resource_bitmap(
+            parent, resource_bitmap);
+EXIT:
+    if (NULL == process) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_clear_cell invalid argument process\n");
+    }
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_clear_cell failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+int ia_css_process_set_int_mem(
+    ia_css_process_t                *process,
+    const vied_nci_mem_type_ID_t            mem_type_id,
+    const vied_nci_resource_size_t            offset)
+{
+    (void)process;
+    (void)mem_type_id;
+    (void)offset;
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+        "ia_css_process_set_int_mem should not be called"
+        "(internally memory feature not used).\n");
+    return 0;
+}
+
+int ia_css_process_clear_int_mem(
+    ia_css_process_t *process,
+    const vied_nci_mem_type_ID_t mem_type_id)
+{
+    (void)process;
+    (void)mem_type_id;
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+        "ia_css_process_clear_int_mem should not be called"
+        "(internally memory feature not used).\n");
+    return 0;
+}
+
+int ia_css_process_set_ext_mem(
+    ia_css_process_t *process,
+    const vied_nci_mem_ID_t mem_id,
+    const vied_nci_resource_size_t offset)
+{
+    int    retval = -1;
+    ia_css_process_group_t    *parent;
+    vied_nci_cell_ID_t    cell_id;
+    ia_css_process_group_state_t    parent_state;
+    ia_css_process_state_t    state;
+    vied_nci_mem_type_ID_t mem_type_id;
+    ia_css_process_ext_t *process_ext;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+               "ia_css_process_set_ext_mem(): enter:\n");
+
+    verifexit(process != NULL);
+    process_ext = ia_css_process_get_extension(process);
+    verifexit(process_ext != NULL);
+
+    parent = ia_css_process_get_parent(process);
+    verifexit(parent != NULL);
+    cell_id = ia_css_process_get_cell(process);
+
+    parent_state = ia_css_process_group_get_state(parent);
+    state = ia_css_process_get_state(process);
+
+    /* TODO : separate process group start and run from
+    *      process_group_exec_cmd()
+    */
+    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
+           (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
+           (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
+    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
+
+    /* Check that the memory actually exists, "vied_nci_has_cell_mem_of_id()"
+    * will return false on error
+    */
+
+    mem_type_id = vied_nci_mem_get_type(mem_id);
+#ifdef HAS_PMEM
+    if (((!vied_nci_has_cell_mem_of_id(cell_id, mem_id) &&
+        (mem_type_id != VIED_NCI_PMEM_TYPE_ID))
+        || vied_nci_mem_is_ext_type(mem_type_id)) &&
+        (mem_id < VIED_NCI_N_MEM_ID)) {
+
+        verifexit(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID);
+        process_ext->ext_mem_id[mem_type_id] = mem_id;
+        process_ext->ext_mem_offset[mem_type_id] = offset;
+        retval = 0;
+    }
+#else /* not HAS_PMEM */
+    if (((!vied_nci_has_cell_mem_of_id(cell_id, mem_id))
+            || vied_nci_mem_is_ext_type(mem_type_id)) &&
+            (mem_id < VIED_NCI_N_MEM_ID)) {
+
+        verifexit(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID);
+        process_ext->ext_mem_id[mem_type_id] = mem_id;
+        process_ext->ext_mem_offset[mem_type_id] = offset;
+        retval = 0;
+    }
+#endif /* HAS_PMEM */
+
+EXIT:
+    if (NULL == process) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_set_ext_mem invalid argument process\n");
+    }
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_set_ext_mem failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+int ia_css_process_clear_ext_mem(
+    ia_css_process_t *process,
+    const vied_nci_mem_type_ID_t mem_type_id)
+{
+    int    retval = -1;
+    ia_css_process_group_t            *parent;
+    ia_css_process_group_state_t    parent_state;
+    ia_css_process_state_t            state;
+    ia_css_process_ext_t *process_ext;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+               "ia_css_process_clear_ext_mem(): enter:\n");
+
+    verifexit(process != NULL);
+    verifexit(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID);
+    process_ext = ia_css_process_get_extension(process);
+    if (process_ext == NULL) {
+        return 0;
+    }
+
+    parent = ia_css_process_get_parent(process);
+    verifexit(parent != NULL);
+    state = ia_css_process_get_state(process);
+
+    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
+
+    parent_state = ia_css_process_group_get_state(parent);
+
+    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
+           (parent_state == IA_CSS_PROCESS_GROUP_STARTED)));
+
+    process_ext->ext_mem_id[mem_type_id] = VIED_NCI_N_MEM_ID;
+    process_ext->ext_mem_offset[mem_type_id] = IA_CSS_PROCESS_INVALID_OFFSET;
+
+    retval = 0;
+EXIT:
+    if (NULL == process || mem_type_id >= VIED_NCI_N_DATA_MEM_TYPE_ID) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_clear_ext_mem invalid argument\n");
+    }
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_clear_ext_mem failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+int ia_css_process_set_cells_bitmap(
+    ia_css_process_t *process,
+    const vied_nci_resource_bitmap_t bitmap)
+{
+    int    retval = -1;
+    ia_css_process_group_t            *parent;
+    ia_css_process_group_state_t    parent_state;
+    ia_css_process_state_t            state;
+    int array_index = 0;
+    int bit_index;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+               "ia_css_process_set_cells_bitmap(): enter:\n");
+
+    verifexit(process != NULL);
+    parent = ia_css_process_get_parent(process);
+    verifexit(parent != NULL);
+    state = ia_css_process_get_state(process);
+
+    parent_state = ia_css_process_group_get_state(parent);
+
+    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
+        (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
+        (parent_state == IA_CSS_PROCESS_GROUP_CREATED) ||
+        (parent_state == IA_CSS_PROCESS_GROUP_READY)));
+    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
+
+    for (bit_index = 0; bit_index < VIED_NCI_N_CELL_ID; bit_index++) {
+        if (vied_nci_is_bit_set_in_bitmap(bitmap, bit_index)) {
+            verifexit(array_index < IA_CSS_PROCESS_MAX_CELLS);
+            ia_css_process_cells_set_cell(process,
+                array_index, (vied_nci_cell_ID_t)bit_index);
+            array_index++;
+        }
+    }
+    for (; array_index < IA_CSS_PROCESS_MAX_CELLS; array_index++) {
+        ia_css_process_cells_set_cell(process,
+            array_index, VIED_NCI_N_CELL_ID);
+    }
+
+    retval = 0;
+EXIT:
+    if (NULL == process) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_set_cells_bitmap invalid argument\n");
+    }
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_set_cells_bitmap failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+#if VIED_NCI_N_DEV_CHN_ID > 0
+int ia_css_process_set_dev_chn(
+    ia_css_process_t *process,
+    const vied_nci_dev_chn_ID_t dev_chn_id,
+    const vied_nci_resource_size_t offset)
+{
+    int    retval = -1;
+    ia_css_process_group_t            *parent;
+    ia_css_process_group_state_t    parent_state;
+    ia_css_process_state_t            state;
+    ia_css_process_ext_t *process_ext;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+               "ia_css_process_set_dev_chn(): enter:\n");
+
+    verifexit(process != NULL);
+    verifexit(dev_chn_id <= VIED_NCI_N_DEV_CHN_ID);
+    process_ext = ia_css_process_get_extension(process);
+    verifexit(process_ext != NULL);
+
+    parent = ia_css_process_get_parent(process);
+    verifexit(parent != NULL);
+    state = ia_css_process_get_state(process);
+
+    parent_state = ia_css_process_group_get_state(parent);
+
+    /* TODO : separate process group start and run from
+    *      process_group_exec_cmd()
+    */
+    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
+           (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
+           (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
+    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
+
+    process_ext->dev_chn_offset[dev_chn_id] = offset;
+
+    retval = 0;
+EXIT:
+    if (NULL == process || dev_chn_id >= VIED_NCI_N_DEV_CHN_ID) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_set_dev_chn invalid argument\n");
+    }
+    if (retval != 0) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+                    "ia_css_process_set_dev_chn invalid argument\n");
+    }
+    return retval;
+}
+
+int ia_css_process_clear_dev_chn(
+    ia_css_process_t *process,
+    const vied_nci_dev_chn_ID_t dev_chn_id)
+{
+    int    retval = -1;
+    ia_css_process_group_t            *parent;
+    ia_css_process_group_state_t    parent_state;
+    ia_css_process_state_t            state;
+    ia_css_process_ext_t *process_ext;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+               "ia_css_process_clear_dev_chn(): enter:\n");
+
+    verifexit(process != NULL);
+    process_ext = ia_css_process_get_extension(process);
+    if (process_ext == NULL) {
+        return 0;
+    }
+
+    parent = ia_css_process_get_parent(process);
+    verifexit(parent != NULL);
+
+    parent_state = ia_css_process_group_get_state(parent);
+    state = ia_css_process_get_state(process);
+
+    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED)
+           || (parent_state == IA_CSS_PROCESS_GROUP_STARTED)));
+    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
+
+    verifexit(dev_chn_id <= VIED_NCI_N_DEV_CHN_ID);
+
+    process_ext->dev_chn_offset[dev_chn_id] = IA_CSS_PROCESS_INVALID_OFFSET;
+
+    retval = 0;
+EXIT:
+    if (NULL == process) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+             "ia_css_process_clear_dev_chn invalid argument process\n");
+    }
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_clear_dev_chn failed (%i)\n", retval);
+    }
+    return retval;
+}
+#endif /* VIED_NCI_N_DEV_CHN_ID */
+
+#if HAS_DFM
+int ia_css_process_set_dfm_port_bitmap(
+    ia_css_process_t                 *process,
+    const vied_nci_dev_dfm_id_t      dfm_dev_id,
+    const vied_nci_resource_bitmap_t bitmap)
+{
+    int    retval = -1;
+    ia_css_process_group_t            *parent;
+    ia_css_process_group_state_t    parent_state;
+    ia_css_process_state_t            state;
+    ia_css_process_ext_t *process_ext;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+               "ia_css_process_set_dfm_port(): enter:\n");
+
+    verifexit(process != NULL);
+    process_ext = ia_css_process_get_extension(process);
+    if (process_ext == NULL && bitmap == 0) {
+        return 0;
+    }
+    verifexit(process_ext != NULL);
+
+    parent = ia_css_process_get_parent(process);
+    verifexit(parent != NULL);
+    state = ia_css_process_get_state(process);
+
+    parent_state = ia_css_process_group_get_state(parent);
+
+    /* TODO : separate process group start and run from
+    *      process_group_exec_cmd()
+    */
+    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
+           (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
+           (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
+    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
+
+    verifexit(dfm_dev_id <= VIED_NCI_N_DEV_DFM_ID);
+    process_ext->dfm_port_bitmap[dfm_dev_id] = bitmap;
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_set_dfm_port invalid argument\n");
+    }
+    return retval;
+}
+
+int ia_css_process_set_dfm_active_port_bitmap(
+    ia_css_process_t                 *process,
+    const vied_nci_dev_dfm_id_t      dfm_dev_id,
+    const vied_nci_resource_bitmap_t bitmap)
+{
+    int    retval = -1;
+    ia_css_process_group_t            *parent;
+    ia_css_process_group_state_t    parent_state;
+    ia_css_process_state_t            state;
+    ia_css_process_ext_t *process_ext;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+               "ia_css_process_set_dfm_active_port_bitmap(): enter:\n");
+
+    verifexit(process != NULL);
+    process_ext = ia_css_process_get_extension(process);
+    if (process_ext == NULL && bitmap == 0) {
+        return 0;
+    }
+    verifexit(process_ext != NULL);
+
+    parent = ia_css_process_get_parent(process);
+    verifexit(parent != NULL);
+    state = ia_css_process_get_state(process);
+
+    parent_state = ia_css_process_group_get_state(parent);
+
+    /* TODO : separate process group start and run from
+    *      process_group_exec_cmd()
+    */
+    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
+           (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
+           (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
+    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
+    verifexit(dfm_dev_id <= VIED_NCI_N_DEV_DFM_ID);
+    process_ext->dfm_active_port_bitmap[dfm_dev_id] = bitmap;
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_set_dfm_active_port_bitmap invalid argument\n");
+    }
+    return retval;
+}
+#endif /* HAS_DFM */
+
+int ia_css_process_clear_all(
+    ia_css_process_t *process)
+{
+    int    retval = -1;
+    ia_css_process_group_t            *parent;
+    ia_css_process_group_state_t    parent_state;
+    ia_css_process_state_t            state;
+    ia_css_process_ext_t *process_ext;
+    int    mem_index;
+    int    dev_chn_index;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+               "ia_css_process_clear_all(): enter:\n");
+
+    verifexit(process != NULL);
+    process_ext = ia_css_process_get_extension(process);
+
+    state = ia_css_process_get_state(process);
+
+    parent = ia_css_process_get_parent(process);
+    if (parent != NULL) {
+        parent_state = ia_css_process_group_get_state(parent);
+    } else {
+        parent_state = IA_CSS_N_PROCESS_GROUP_STATES;
+    }
+
+/* Resource clear can only be called in excluded states contrary to set */
+    verifexit((parent_state != IA_CSS_PROCESS_GROUP_RUNNING) ||
+           (parent_state == IA_CSS_N_PROCESS_GROUP_STATES));
+    verifexit((state == IA_CSS_PROCESS_CREATED) ||
+          (state == IA_CSS_PROCESS_READY));
+
+#if VIED_NCI_N_DEV_CHN_ID > 0
+    if (process_ext != NULL) {
+        for (dev_chn_index = 0; dev_chn_index < VIED_NCI_N_DEV_CHN_ID;
+            dev_chn_index++) {
+            process_ext->dev_chn_offset[dev_chn_index] =
+                IA_CSS_PROCESS_INVALID_OFFSET;
+        }
+    }
+#else
+    NOT_USED(dev_chn_index);
+#endif /* VIED_NCI_N_DEV_CHN_ID */
+    if (process_ext != NULL) {
+        /* No difference whether a cell_id has been set or not, clear all */
+        for (mem_index = 0; mem_index < VIED_NCI_N_DATA_MEM_TYPE_ID;
+            mem_index++) {
+            process_ext->ext_mem_id[mem_index] = VIED_NCI_N_MEM_ID;
+            process_ext->ext_mem_offset[mem_index] =
+                IA_CSS_PROCESS_INVALID_OFFSET;
+        }
+    }
+
+    ia_css_process_cells_clear(process);
+
+    retval = 0;
+EXIT:
+    if (NULL == process) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_clear_all invalid argument process\n");
+    }
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_clear_all failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+int ia_css_process_acquire(
+    ia_css_process_t *process)
+{
+    int    retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_acquire(): enter:\n");
+
+    verifexit(process != NULL);
+
+    retval = 0;
+EXIT:
+    if (NULL == process) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_acquire invalid argument process\n");
+    }
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_acquire failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+int ia_css_process_release(
+    ia_css_process_t *process)
+{
+    int    retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_release(): enter:\n");
+
+    verifexit(process != NULL);
+
+    retval = 0;
+EXIT:
+    if (NULL == process) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_t invalid argument process\n");
+    }
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_release failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+int ia_css_process_print(const ia_css_process_t *process, void *fid)
+{
+    int        retval = -1;
+    int        i, dev_chn_index;
+    uint16_t mem_index;
+    uint8_t    cell_dependency_count, terminal_dependency_count;
+    ia_css_process_ext_t *process_ext;
+    NOT_USED(fid);
+
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_print(process 0x%lx): enter:\n", (unsigned long int)process);
+
+    verifexit(process != NULL);
+    process_ext = ia_css_process_get_extension(process);
+
+    IA_CSS_TRACE_7(PSYSAPI_DYNAMIC, INFO,
+    "\tprocess 0x%lx, sizeof %d, program_idx %d, programID %d, state %d, parent 0x%lx, cell %d\n",
+        (unsigned long int)process,
+        (int)ia_css_process_get_size(process),
+        (int)ia_css_process_get_program_idx(process),
+        (int)ia_css_process_get_program_ID(process),
+        (int)ia_css_process_get_state(process),
+        (unsigned long int)ia_css_process_get_parent(process),
+        (int)ia_css_process_get_cell(process));
+
+    if (process_ext != NULL) {
+        for (mem_index = 0; mem_index < (int)VIED_NCI_N_DATA_MEM_TYPE_ID;
+            mem_index++) {
+            /* TODO: in case of an cells_bitmap = [],
+            * vied_nci_cell_get_mem_type will return a wrong result.
+            */
+            IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
+                "\texternal index %d, type %d, id %d offset 0x%x\n",
+                mem_index,
+                (int)vied_nci_cell_get_mem_type(ia_css_process_get_cell(process),
+                                mem_index),
+                (int)(process_ext->ext_mem_id[mem_index]),
+                process_ext->ext_mem_offset[mem_index]);
+        }
+#if VIED_NCI_N_DEV_CHN_ID > 0
+        for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_CHN_ID;
+            dev_chn_index++) {
+            IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
+                "\tdevice channel index %d, type %d, offset 0x%x\n",
+                dev_chn_index,
+                (int)dev_chn_index,
+                process_ext->dev_chn_offset[dev_chn_index]);
+        }
+#else
+        NOT_USED(dev_chn_index);
+#endif /* VIED_NCI_N_DEV_CHN_ID */
+#if HAS_DFM
+        for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_DFM_ID;
+            dev_chn_index++) {
+            IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
+                "\tdfm device index %d, type %d, bitmap 0x%x active_ports_bitmap 0x%x\n",
+                dev_chn_index, dev_chn_index,
+                process_ext->dfm_port_bitmap[dev_chn_index],
+                process_ext->dfm_active_port_bitmap[dev_chn_index]);
+        }
+#endif
+    }
+
+    for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
+        IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
+            "\tcells[%d] = 0x%x\n",
+            i, ia_css_process_cells_get_cell(process, i));
+    }
+
+    cell_dependency_count =
+        ia_css_process_get_cell_dependency_count(process);
+    if (cell_dependency_count == 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+            "\tcell_dependencies[%d] {};\n", cell_dependency_count);
+    } else {
+        vied_nci_resource_id_t cell_dependency;
+
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+            "\tcell_dependencies[%d] {", cell_dependency_count);
+        for (i = 0; i < (int)cell_dependency_count - 1; i++) {
+            cell_dependency =
+                ia_css_process_get_cell_dependency(process, i);
+            IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+                "%4d, ", cell_dependency);
+        }
+        cell_dependency =
+            ia_css_process_get_cell_dependency(process, i);
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+            "%4d}\n", cell_dependency);
+        (void)cell_dependency;
+    }
+
+    terminal_dependency_count =
+        ia_css_process_get_terminal_dependency_count(process);
+    if (terminal_dependency_count == 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+            "\tterminal_dependencies[%d] {};\n",
+            terminal_dependency_count);
+    } else {
+        uint8_t terminal_dependency;
+
+        terminal_dependency_count =
+            ia_css_process_get_terminal_dependency_count(process);
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+            "\tterminal_dependencies[%d] {",
+            terminal_dependency_count);
+        for (i = 0; i < (int)terminal_dependency_count - 1; i++) {
+            terminal_dependency =
+                 ia_css_process_get_terminal_dependency(process, i);
+            IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+                "%4d, ", terminal_dependency);
+        }
+        terminal_dependency =
+            ia_css_process_get_terminal_dependency(process, i);
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+            "%4d}\n", terminal_dependency);
+        (void)terminal_dependency;
+    }
+
+    retval = 0;
+EXIT:
+    if (NULL == process) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_print invalid argument process\n");
+    }
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_print failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+int ia_css_process_set_parent(
+    ia_css_process_t                    *process,
+    ia_css_process_group_t                    *parent)
+{
+    int    retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+               "ia_css_process_set_parent(): enter:\n");
+
+    verifexit(process != NULL);
+    verifexit(parent != NULL);
+
+    process->parent_offset = (uint16_t) ((char *)parent - (char *)process);
+    retval = 0;
+EXIT:
+    if (NULL == process || NULL == parent) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_set_parent invalid argument\n");
+    }
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_set_parent failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+int ia_css_process_set_cell_dependency(
+    const ia_css_process_t                    *process,
+    const unsigned int                    dep_index,
+    const vied_nci_resource_id_t                id)
+{
+    int retval = -1;
+    uint8_t *process_dep_ptr;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_set_cell_dependency(): enter:\n");
+    verifexit(process != NULL);
+
+    process_dep_ptr =
+        (uint8_t *)process + process->cell_dependencies_offset +
+               dep_index*sizeof(vied_nci_resource_id_t);
+
+    *process_dep_ptr = id;
+    retval = 0;
+EXIT:
+    return retval;
+}
+
+int ia_css_process_set_terminal_dependency(
+    const ia_css_process_t                *process,
+    const unsigned int                dep_index,
+    const vied_nci_resource_id_t        id)
+{
+    int retval = -1;
+    uint8_t *terminal_dep_ptr;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_set_terminal_dependency(): enter:\n");
+    verifexit(process != NULL);
+    verifexit(ia_css_process_get_terminal_dependency_count(process) > dep_index);
+
+    terminal_dep_ptr =
+        (uint8_t *)process + process->terminal_dependencies_offset +
+               dep_index*sizeof(uint8_t);
+
+    *terminal_dep_ptr = id;
+    retval = 0;
+EXIT:
+    return retval;
+}
+
+#endif /* !defined(__HIVECC) */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group.c
new file mode 100644
index 000000000000..5b3c65023bb7
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group.c
@@ -0,0 +1,826 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ia_css_psys_process_group.h"
+#include "ia_css_psys_dynamic_storage_class.h"
+#include "ia_css_psys_dynamic_trace.h"
+#include "ia_css_program_group_param_private.h"
+
+/*
+ * Functions to possibly inline
+ */
+
+#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
+#include "ia_css_psys_process_group_impl.h"
+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
+
+/*
+ * Functions not to inline
+ */
+
+/* This header is need for cpu memset to 0
+* and process groups are not created in SP
+*/
+#if !defined(__VIED_CELL)
+#include "cpu_mem_support.h"
+#endif
+
+/* This source file is created with the intention of sharing and
+* compiled for host and firmware. Since there is no native 64bit
+* data type support for firmware this wouldn't compile for SP
+* tile. The part of the file that is not compilable are marked
+* with the following __VIED_CELL marker and this comment. Once we
+* come up with a solution to address this issue this will be
+* removed.
+*/
+#if !defined(__VIED_CELL)
+
+/*  FUNCTION IS PRIVATE TO THIS MODULE; other C files in this module need it */
+bool ia_css_process_group_is_program_enabled(
+    const ia_css_program_manifest_t *program_manifest,
+    ia_css_kernel_bitmap_t enable_bitmap)
+{
+    ia_css_kernel_bitmap_t program_bitmap =
+        ia_css_program_manifest_get_kernel_bitmap(program_manifest);
+    ia_css_program_type_t program_type =
+        ia_css_program_manifest_get_type(program_manifest);
+    ia_css_kernel_bitmap_t program_enable_bitmap;
+
+    if (!ia_css_is_kernel_bitmap_intersection_empty(enable_bitmap,
+                program_bitmap)) {
+
+        if (program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB ||
+            program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER ||
+            program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) {
+            /*
+             * EXCLUSIVE_SUB programs are subsets of
+             * EXCLUSIVE_SUPER so the bits of the enable_bitmap
+             * that refer to those are those of their
+             * EXCLUSIVE_SUPER program (on which the depend) and
+             * not the subset that their own program_bitmap has
+             */
+            if (program_type ==
+                    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB ||
+                    program_type ==
+                    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) {
+                ia_css_kernel_bitmap_t super_program_bitmap;
+
+                const ia_css_program_group_manifest_t *
+                    prog_group_manifest =
+            ia_css_program_manifest_get_parent(program_manifest);
+                uint8_t super_prog_idx =
+                ia_css_program_manifest_get_program_dependency(
+                        program_manifest, 0);
+                const ia_css_program_manifest_t    *
+                    super_program_manifest =
+            ia_css_program_group_manifest_get_prgrm_mnfst(
+                    prog_group_manifest, super_prog_idx);
+
+                verifexit(super_program_manifest != NULL);
+                if (((program_type ==
+                    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
+                    (ia_css_program_manifest_get_type(
+                    super_program_manifest) !=
+                    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER))
+                    || ((program_type ==
+                    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) &&
+                    (ia_css_program_manifest_get_type(
+                    super_program_manifest) !=
+                    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER))) {
+                    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+                        "ia_css_process_group_is_program_enabled(): Error\n");
+                    verifexit(0);
+                }
+
+                super_program_bitmap =
+                ia_css_program_manifest_get_kernel_bitmap(
+                        super_program_manifest);
+                program_enable_bitmap =
+                    ia_css_kernel_bitmap_intersection(
+                        enable_bitmap,
+                        super_program_bitmap);
+            } else {
+                program_enable_bitmap =
+                    ia_css_kernel_bitmap_intersection(
+                        enable_bitmap, program_bitmap);
+            }
+
+            if (ia_css_is_kernel_bitmap_equal(
+                program_enable_bitmap, program_bitmap)) {
+                return true;
+            }
+        } else if (program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER) {
+            /*
+             * Virtual super programs are not selectable
+             * only the virtual sub programs
+             */
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+EXIT:
+    return false;
+}
+
+size_t ia_css_sizeof_process_group(
+    const ia_css_program_group_manifest_t *manifest,
+    const ia_css_program_group_param_t *param)
+{
+    size_t size = 0, tmp_size;
+    int i, error_val = -1;
+    uint8_t    process_count, process_num;
+    uint8_t terminal_count;
+    ia_css_kernel_bitmap_t enable_bitmap;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_sizeof_process_group(): enter:\n");
+
+    verifexit(manifest != NULL);
+    verifexit(param != NULL);
+
+    COMPILATION_ERROR_IF(
+        SIZE_OF_PROCESS_GROUP_STRUCT_BITS !=
+            (CHAR_BIT * sizeof(ia_css_process_group_t)));
+
+    COMPILATION_ERROR_IF(0 !=
+            sizeof(ia_css_process_group_t) % sizeof(uint64_t));
+
+    process_count =
+        ia_css_process_group_compute_process_count(manifest, param);
+    terminal_count =
+        ia_css_process_group_compute_terminal_count(manifest, param);
+
+    verifexit(process_count != 0);
+    verifexit(terminal_count != 0);
+
+    size += sizeof(ia_css_process_group_t);
+
+    tmp_size = process_count * sizeof(uint16_t);
+    size += tot_bytes_for_pow2_align(sizeof(uint64_t), tmp_size);
+
+    tmp_size = terminal_count * sizeof(uint16_t);
+    size += tot_bytes_for_pow2_align(sizeof(uint64_t), tmp_size);
+
+    enable_bitmap =
+        ia_css_program_group_param_get_kernel_enable_bitmap(param);
+    process_num = 0;
+    for (i = 0; i < (int)ia_css_program_group_manifest_get_program_count(
+                manifest); i++) {
+        ia_css_program_manifest_t *program_manifest =
+        ia_css_program_group_manifest_get_prgrm_mnfst(manifest, i);
+        ia_css_program_param_t *program_param =
+            ia_css_program_group_param_get_program_param(param, i);
+
+        if (ia_css_process_group_is_program_enabled(
+                    program_manifest, enable_bitmap)) {
+            verifexit(process_num < process_count);
+            size += ia_css_sizeof_process(
+                    program_manifest, program_param);
+            process_num++;
+        }
+    }
+
+    verifexit(process_num == process_count);
+
+    for (i = 0; i < (int)ia_css_program_group_manifest_get_terminal_count(
+                manifest); i++) {
+        ia_css_terminal_manifest_t *terminal_manifest =
+            ia_css_program_group_manifest_get_term_mnfst(
+                    manifest, i);
+
+        if (ia_css_process_group_is_terminal_enabled(
+                    terminal_manifest, enable_bitmap)) {
+            size += ia_css_sizeof_terminal(
+                    terminal_manifest, param);
+        }
+    }
+
+    error_val = 0;
+
+EXIT:
+    if (NULL == manifest || NULL == param) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_sizeof_process_group invalid argument\n");
+    }
+    if (error_val != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_sizeof_process_group ERROR(%d)\n", error_val);
+    }
+    return error_val ? 0 : size;
+}
+
+ia_css_process_group_t *ia_css_process_group_create(
+    void *process_grp_mem,
+    const ia_css_program_group_manifest_t *manifest,
+    const ia_css_program_group_param_t *param)
+{
+    size_t size = ia_css_sizeof_process_group(manifest, param);
+    int retval = -1;
+    int ret;
+    int i;
+    ia_css_process_group_t *process_group = NULL;
+    uint8_t process_count, process_num;
+    uint8_t    terminal_count, terminal_num;
+    uint16_t fragment_count;
+    char *process_grp_raw_ptr;
+    uint16_t *process_tab_ptr, *terminal_tab_ptr;
+    ia_css_kernel_bitmap_t enable_bitmap;
+    uint8_t manifest_terminal_count;
+
+    IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_group_create(process_grp_mem %p, manifest %p, group_param %p): enter:\n",
+        process_grp_mem, manifest, param);
+
+    verifexit(process_grp_mem != NULL);
+    verifexit(manifest != NULL);
+    verifexit(param != NULL);
+    verifexit(ia_css_is_program_group_manifest_valid(manifest));
+    verifexit(size != 0);
+
+    process_group = (ia_css_process_group_t    *)process_grp_mem;
+    ia_css_cpu_mem_set_zero(process_group, size);
+    process_grp_raw_ptr = (char *) process_group;
+
+    process_group->state = IA_CSS_PROCESS_GROUP_CREATED;
+
+    process_group->protocol_version =
+        ia_css_program_group_param_get_protocol_version(param);
+
+    fragment_count = ia_css_program_group_param_get_fragment_count(param);
+    process_count =
+        ia_css_process_group_compute_process_count(manifest, param);
+    terminal_count =
+        ia_css_process_group_compute_terminal_count(manifest, param);
+    enable_bitmap =
+        ia_css_program_group_param_get_kernel_enable_bitmap(param);
+
+    process_group->fragment_count = fragment_count;
+    process_group->process_count = process_count;
+    process_group->terminal_count = terminal_count;
+    process_group->kernel_bitmap = enable_bitmap;
+
+    process_grp_raw_ptr += sizeof(ia_css_process_group_t);
+    process_tab_ptr = (uint16_t *) process_grp_raw_ptr;
+    process_group->processes_offset =
+        (uint16_t)(process_grp_raw_ptr - (char *)process_group);
+
+    process_grp_raw_ptr += tot_bytes_for_pow2_align(
+            sizeof(uint64_t), process_count * sizeof(uint16_t));
+    terminal_tab_ptr = (uint16_t *) process_grp_raw_ptr;
+    process_group->terminals_offset =
+        (uint16_t)(process_grp_raw_ptr - (char *)process_group);
+
+    /* Move raw pointer to the first process */
+    process_grp_raw_ptr += tot_bytes_for_pow2_align(
+            sizeof(uint64_t), terminal_count * sizeof(uint16_t));
+
+    /* Set default */
+    verifexit(ia_css_process_group_set_fragment_limit(
+                process_group, fragment_count) == 0);
+
+    /* Set process group terminal dependency list */
+    /* This list is used during creating the process dependency list */
+    manifest_terminal_count =
+        ia_css_program_group_manifest_get_terminal_count(manifest);
+
+    terminal_num = 0;
+    for (i = 0; i < (int)manifest_terminal_count; i++) {
+        ia_css_terminal_manifest_t *t_manifest =
+            ia_css_program_group_manifest_get_term_mnfst(
+                    manifest, i);
+
+        verifexit(NULL != t_manifest);
+
+        if (ia_css_process_group_is_terminal_enabled(
+                    t_manifest, enable_bitmap)) {
+            ia_css_terminal_t *terminal = NULL;
+            ia_css_terminal_param_t *terminal_param =
+                ia_css_program_group_param_get_terminal_param(
+                        param, i);
+
+            verifexit(NULL != terminal_param);
+            terminal_tab_ptr[terminal_num] =
+                (uint16_t)(process_grp_raw_ptr -
+                        (char *)process_group);
+            terminal = ia_css_terminal_create(
+                    process_grp_raw_ptr, t_manifest,
+                    terminal_param, enable_bitmap);
+            verifexit(terminal != NULL);
+            verifexit((ia_css_terminal_set_parent(
+                    terminal, process_group) == 0));
+            verifexit((ia_css_terminal_set_terminal_manifest_index(
+                    terminal, i) == 0));
+            IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+                "ia_css_process_group_create: terminal_manifest_index %d\n",
+                i);
+
+            process_grp_raw_ptr += ia_css_terminal_get_size(
+                            terminal);
+            terminal_num++;
+        } else {
+            IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO, "Skip terminal %d\n", i);
+        }
+    }
+    verifexit(terminal_num == terminal_count);
+
+    process_num = 0;
+    for (i = 0; i < (int)ia_css_program_group_manifest_get_program_count(
+                manifest); i++) {
+        ia_css_process_t *process = NULL;
+        ia_css_program_manifest_t *program_manifest =
+            ia_css_program_group_manifest_get_prgrm_mnfst(
+                    manifest, i);
+        ia_css_program_param_t *program_param =
+            ia_css_program_group_param_get_program_param(param, i);
+        unsigned int prog_dep_index, proc_dep_index;
+        unsigned int term_dep_index, term_index;
+
+        verifexit(program_manifest != 0);
+        verifexit(program_param    != NULL);
+
+        if (ia_css_process_group_is_program_enabled(
+                    program_manifest, enable_bitmap)) {
+
+            verifexit(process_num < process_count);
+
+            process_tab_ptr[process_num] =
+                (uint16_t)(process_grp_raw_ptr -
+                        (char *)process_group);
+
+            /* instead of using program_param,
+             * we can provide this directly to ia_css_process_create.
+             * The corresponding public setter function is deprecated and will assert
+             * upon use. */
+            program_param->kernel_enable_bitmap =
+                ia_css_kernel_bitmap_intersection(
+                        ia_css_program_manifest_get_kernel_bitmap(program_manifest),
+                        /*pg*/enable_bitmap);
+
+            process = ia_css_process_create(
+                    process_grp_raw_ptr,
+                    program_manifest,
+                    program_param,
+                    i);
+            verifexit(process != NULL);
+
+            ia_css_process_set_parent(process, process_group);
+            if (ia_css_has_program_manifest_fixed_cell(
+                        program_manifest)) {
+                vied_nci_cell_ID_t cell_id =
+                    ia_css_program_manifest_get_cell_ID(
+                            program_manifest);
+
+                IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+                    "ia_css_process_group_create: cell_id %d\n",
+                    cell_id);
+                ia_css_process_set_cell(process, cell_id);
+            }
+
+            process_grp_raw_ptr += ia_css_process_get_size(
+                    process);
+            /*
+             * Set process dependencies of process derived
+             * from program manifest
+             */
+            for (prog_dep_index = 0; prog_dep_index <
+            ia_css_program_manifest_get_program_dependency_count(
+                program_manifest); prog_dep_index++) {
+                uint8_t dep_prog_idx =
+                ia_css_program_manifest_get_program_dependency(
+                    program_manifest, prog_dep_index);
+                const ia_css_program_manifest_t *
+                dep_prg_manifest =
+            ia_css_program_group_manifest_get_prgrm_mnfst(
+                    manifest, dep_prog_idx);
+                ia_css_program_ID_t id =
+                ia_css_program_manifest_get_program_ID(
+                        dep_prg_manifest);
+
+                verifexit(id != 0);
+                for (proc_dep_index = 0;
+                        proc_dep_index < process_num;
+                        proc_dep_index++) {
+                    ia_css_process_t *dep_process =
+                    ia_css_process_group_get_process(
+                            process_group,
+                            proc_dep_index);
+
+                    ia_css_process_set_cell_dependency(
+                            process,
+                            prog_dep_index, 0);
+
+                if (ia_css_process_get_program_ID(
+                        dep_process) == id) {
+                    ia_css_process_set_cell_dependency(
+                            process,
+                            prog_dep_index,
+                            proc_dep_index);
+                        break;
+                    }
+                }
+            }
+            process_num++;
+
+            /*
+             * Set terminal dependencies of process derived
+             * from program manifest
+             */
+            for (term_dep_index = 0; term_dep_index <
+            ia_css_program_manifest_get_terminal_dependency_count(
+                program_manifest); term_dep_index++) {
+                uint8_t pm_term_index =
+                ia_css_program_manifest_get_terminal_dependency
+                    (program_manifest, term_dep_index);
+
+                verifexit(pm_term_index < manifest_terminal_count);
+                IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
+                    "ia_css_process_group_create(): term_dep_index: %d, pm_term_index: %d\n",
+                    term_dep_index, pm_term_index);
+                for (term_index = 0;
+                    term_index < terminal_count;
+                    term_index++) {
+                    ia_css_terminal_t *terminal =
+                    ia_css_process_group_get_terminal(
+                            process_group,
+                            term_index);
+
+                if (ia_css_terminal_get_terminal_manifest_index
+                        (terminal) == pm_term_index) {
+                    ia_css_process_set_terminal_dependency(
+                            process,
+                            term_dep_index,
+                            term_index);
+                    IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
+                        "ia_css_process_group_create() set_terminal_dependency(process: %d, dep_idx: %d, term_idx: %d)\n",
+                        i, term_dep_index, term_index);
+
+                        break;
+                    }
+                }
+            }
+        }
+    }
+    verifexit(process_num == process_count);
+
+    process_group->size =
+        (uint32_t)ia_css_sizeof_process_group(manifest, param);
+    process_group->ID =
+        ia_css_program_group_manifest_get_program_group_ID(manifest);
+
+    /* Initialize performance measurement fields to zero */
+    process_group->pg_load_start_ts        = 0;
+    process_group->pg_load_cycles        = 0;
+    process_group->pg_init_cycles        = 0;
+    process_group->pg_processing_cycles    = 0;
+    process_group->pg_complete_cycles    = 0;
+
+    process_group->error_handling_enable = 0;
+
+    verifexit(process_group->size != 0);
+    verifexit(process_group->ID != 0);
+
+    ret = ia_css_process_group_on_create(process_group, manifest, param);
+    verifexit(ret == 0);
+
+    process_group->state = IA_CSS_PROCESS_GROUP_READY;
+    retval = 0;
+
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_group_create(): Created successfully process group ID 0x%x\n",
+        process_group->ID);
+
+EXIT:
+    if (NULL == process_grp_mem || NULL == manifest || NULL == param) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_group_create invalid argument\n");
+    }
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_create failed (%i)\n", retval);
+        process_group = ia_css_process_group_destroy(process_group);
+    }
+    return process_group;
+}
+
+ia_css_process_group_t *ia_css_process_group_destroy(
+    ia_css_process_group_t *process_group)
+{
+    if (process_group != NULL) {
+        ia_css_process_group_on_destroy(process_group);
+        process_group = NULL;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_group_destroy invalid argument\n");
+    }
+    return process_group;
+}
+
+int ia_css_process_group_submit(
+    ia_css_process_group_t *process_group)
+{
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_group_submit(): enter:\n");
+
+    return ia_css_process_group_exec_cmd(process_group,
+        IA_CSS_PROCESS_GROUP_CMD_SUBMIT);
+}
+
+int ia_css_process_group_start(
+    ia_css_process_group_t *process_group)
+{
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_group_start(): enter:\n");
+
+    return ia_css_process_group_exec_cmd(process_group,
+        IA_CSS_PROCESS_GROUP_CMD_START);
+}
+
+int ia_css_process_group_stop(
+    ia_css_process_group_t *process_group)
+{
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_group_stop(): enter:\n");
+
+    return ia_css_process_group_exec_cmd(process_group,
+        IA_CSS_PROCESS_GROUP_CMD_STOP);
+}
+
+int ia_css_process_group_run(
+    ia_css_process_group_t *process_group)
+{
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_group_run(): enter:\n");
+
+    return ia_css_process_group_exec_cmd(process_group,
+        IA_CSS_PROCESS_GROUP_CMD_RUN);
+}
+
+int ia_css_process_group_suspend(
+    ia_css_process_group_t *process_group)
+{
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_group_suspend(): enter:\n");
+
+    return ia_css_process_group_exec_cmd(process_group,
+        IA_CSS_PROCESS_GROUP_CMD_SUSPEND);
+}
+
+int ia_css_process_group_resume(
+    ia_css_process_group_t *process_group)
+{
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_group_resume(): enter:\n");
+
+    return ia_css_process_group_exec_cmd(process_group,
+        IA_CSS_PROCESS_GROUP_CMD_RESUME);
+}
+
+int ia_css_process_group_reset(
+    ia_css_process_group_t *process_group)
+{
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_group_reset(): enter:\n");
+
+    return ia_css_process_group_exec_cmd(process_group,
+        IA_CSS_PROCESS_GROUP_CMD_RESET);
+}
+
+int ia_css_process_group_abort(
+    ia_css_process_group_t *process_group)
+{
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_group_abort(): enter:\n");
+
+    return ia_css_process_group_exec_cmd(process_group,
+        IA_CSS_PROCESS_GROUP_CMD_ABORT);
+}
+
+int ia_css_process_group_disown(
+    ia_css_process_group_t *process_group)
+{
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_process_group_disown(): enter:\n");
+
+    return ia_css_process_group_exec_cmd(process_group,
+        IA_CSS_PROCESS_GROUP_CMD_DISOWN);
+}
+
+uint64_t ia_css_process_group_get_token(
+    ia_css_process_group_t *process_group)
+{
+    uint64_t token = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_token(): enter:\n");
+
+    verifexit(process_group != NULL);
+
+    token = process_group->token;
+
+EXIT:
+    if (NULL == process_group) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_group_get_token invalid argument\n");
+    }
+    return token;
+}
+
+int ia_css_process_group_set_token(
+    ia_css_process_group_t *process_group,
+    const uint64_t token)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_set_token(): enter:\n");
+
+    verifexit(process_group != NULL);
+    verifexit(token != 0);
+
+    process_group->token = token;
+
+    retval = 0;
+EXIT:
+    if (NULL == process_group || 0 == token) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_group_set_token invalid argument\n");
+    }
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_set_token failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+uint64_t ia_css_process_group_get_private_token(
+    ia_css_process_group_t *process_group)
+{
+    uint64_t token = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_get_private_token(): enter:\n");
+
+    verifexit(process_group != NULL);
+
+    token = process_group->private_token;
+
+EXIT:
+    if (NULL == process_group) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_group_get_private_token invalid argument\n");
+    }
+    return token;
+}
+
+int ia_css_process_group_set_private_token(
+    ia_css_process_group_t *process_group,
+    const uint64_t token)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_set_private_token(): enter:\n");
+
+    verifexit(process_group != NULL);
+    verifexit(token != 0);
+
+    process_group->private_token = token;
+
+    retval = 0;
+EXIT:
+    if (NULL == process_group || 0 == token) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_group_set_private_token invalid argument\n");
+    }
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_process_group_set_private_token failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+uint8_t ia_css_process_group_compute_process_count(
+    const ia_css_program_group_manifest_t *manifest,
+    const ia_css_program_group_param_t *param)
+{
+    uint8_t process_count = 0;
+    ia_css_kernel_bitmap_t total_bitmap;
+    ia_css_kernel_bitmap_t enable_bitmap;
+    int i;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_compute_process_count(): enter:\n");
+
+    verifexit(manifest != NULL);
+    verifexit(param != NULL);
+
+    total_bitmap =
+        ia_css_program_group_manifest_get_kernel_bitmap(manifest);
+    enable_bitmap =
+        ia_css_program_group_param_get_kernel_enable_bitmap(param);
+
+    verifexit(ia_css_is_program_group_manifest_valid(manifest));
+    verifexit(ia_css_is_kernel_bitmap_subset(total_bitmap, enable_bitmap));
+    verifexit(!ia_css_is_kernel_bitmap_empty(enable_bitmap));
+
+    for (i = 0; i <
+        (int)ia_css_program_group_manifest_get_program_count(manifest);
+            i++) {
+        ia_css_program_manifest_t *program_manifest =
+            ia_css_program_group_manifest_get_prgrm_mnfst(
+                    manifest, i);
+        ia_css_kernel_bitmap_t program_bitmap =
+            ia_css_program_manifest_get_kernel_bitmap(
+                    program_manifest);
+        /*
+         * Programs can be orthogonal,
+         * a mutually exclusive subset,
+         * or a concurrent subset
+         */
+        if (!ia_css_is_kernel_bitmap_intersection_empty(enable_bitmap,
+                    program_bitmap)) {
+            ia_css_program_type_t program_type =
+                ia_css_program_manifest_get_type(
+                        program_manifest);
+            /*
+             * An exclusive subnode < exclusive supernode,
+             * so simply don't count it
+             */
+            if (program_type !=
+                IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB &&
+                program_type !=
+                IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) {
+                process_count++;
+            }
+        }
+    }
+
+EXIT:
+    if (NULL == manifest || NULL == param) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_group_compute_process_count invalid argument\n");
+    }
+    return process_count;
+}
+
+uint8_t ia_css_process_group_compute_terminal_count(
+    const ia_css_program_group_manifest_t *manifest,
+    const ia_css_program_group_param_t *param)
+{
+    uint8_t terminal_count = 0;
+    ia_css_kernel_bitmap_t total_bitmap, enable_bitmap;
+    int i;
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_process_group_compute_terminal_count(): enter:\n");
+
+    verifexit(manifest != NULL);
+    verifexit(param != NULL);
+
+    total_bitmap =
+        ia_css_program_group_manifest_get_kernel_bitmap(manifest);
+    enable_bitmap =
+        ia_css_program_group_param_get_kernel_enable_bitmap(param);
+
+    verifexit(ia_css_is_program_group_manifest_valid(manifest));
+    verifexit(ia_css_is_kernel_bitmap_subset(total_bitmap, enable_bitmap));
+    verifexit(!ia_css_is_kernel_bitmap_empty(enable_bitmap));
+
+    for (i = 0; i <
+        (int)ia_css_program_group_manifest_get_terminal_count(
+            manifest); i++) {
+        ia_css_terminal_manifest_t *tmanifest =
+            ia_css_program_group_manifest_get_term_mnfst(
+                    manifest, i);
+
+        if (ia_css_process_group_is_terminal_enabled(
+                    tmanifest, enable_bitmap)) {
+            terminal_count++;
+        }
+    }
+
+EXIT:
+    if (NULL == manifest || NULL == param) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_process_group_compute_terminal_count invalid argument\n");
+    }
+    return terminal_count;
+}
+#endif /* !defined(__VIED_CELL) */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group_cmd_impl.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group_cmd_impl.c
new file mode 100644
index 000000000000..07c42c7c10c9
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group_cmd_impl.c
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ia_css_psys_process_group_cmd_impl.h"
+#include "ia_css_psysapi.h"
+#include "ia_css_psys_process.h"
+#include "ia_css_psys_process.psys.h"
+#include "ia_css_psys_process_group.h"
+#include "ia_css_psys_process_group.psys.h"
+#include "error_support.h"
+#include "vied_nci_psys_system_global.h"
+#include "misc_support.h"
+
+#include "ia_css_psys_sim_trace.h"
+
+/* Dummy implementation for sim */
+int ia_css_process_group_on_create(
+    ia_css_process_group_t                    *process_group,
+    const ia_css_program_group_manifest_t    *program_group_manifest,
+    const ia_css_program_group_param_t        *program_group_param)
+{
+    NOT_USED(process_group);
+    NOT_USED(program_group_manifest);
+    NOT_USED(program_group_param);
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, INFO, "ia_css_process_group_on_create(): enter: \n");
+
+    return 0;
+}
+
+/* Dummy implementation for sim */
+int ia_css_process_group_on_destroy(
+    ia_css_process_group_t                    *process_group)
+{
+    NOT_USED(process_group);
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, INFO, "ia_css_process_group_on_destroy(): enter: \n");
+
+    return 0;
+}
+
+int ia_css_process_group_exec_cmd(
+    ia_css_process_group_t                    *process_group,
+    const ia_css_process_group_cmd_t        cmd)
+{
+    int    retval = -1;
+    ia_css_process_group_state_t    state;
+
+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "ia_css_process_group_exec_cmd(): enter: \n");
+
+    state = ia_css_process_group_get_state(process_group);
+
+    verifexit(process_group != NULL);
+    verifexit(state != IA_CSS_PROCESS_GROUP_ERROR);
+    verifexit(state < IA_CSS_N_PROCESS_GROUP_STATES);
+
+    switch (cmd) {
+    case IA_CSS_PROCESS_GROUP_CMD_NOP:
+        break;
+    case IA_CSS_PROCESS_GROUP_CMD_SUBMIT:
+        verifexit(state == IA_CSS_PROCESS_GROUP_READY);
+
+/* External resource availability checks */
+        verifexit(ia_css_can_process_group_submit(process_group));
+
+        process_group->state = IA_CSS_PROCESS_GROUP_BLOCKED;
+        break;
+    case IA_CSS_PROCESS_GROUP_CMD_ATTACH:
+        verifexit(state == IA_CSS_PROCESS_GROUP_READY);
+        break;
+    case IA_CSS_PROCESS_GROUP_CMD_DETACH:
+        verifexit(state == IA_CSS_PROCESS_GROUP_READY);
+        break;
+    case IA_CSS_PROCESS_GROUP_CMD_START:
+        verifexit(state == IA_CSS_PROCESS_GROUP_BLOCKED);
+
+/* External resource state checks */
+        verifexit(ia_css_can_process_group_start(process_group));
+
+        process_group->state = IA_CSS_PROCESS_GROUP_STARTED;
+        break;
+    case IA_CSS_PROCESS_GROUP_CMD_DISOWN:
+
+        /* empty call to match API ownership change between host and firmware */
+
+        break;
+    case IA_CSS_PROCESS_GROUP_CMD_RUN:
+        verifexit(state == IA_CSS_PROCESS_GROUP_STARTED);
+        process_group->state = IA_CSS_PROCESS_GROUP_RUNNING;
+        break;
+    case IA_CSS_PROCESS_GROUP_CMD_STOP:
+        verifexit(state == IA_CSS_PROCESS_GROUP_RUNNING);
+        process_group->state = IA_CSS_PROCESS_GROUP_STOPPED;
+        break;
+    case IA_CSS_PROCESS_GROUP_CMD_SUSPEND:
+        verifexit(state == IA_CSS_PROCESS_GROUP_RUNNING);
+        process_group->state = IA_CSS_PROCESS_GROUP_STARTED;
+        break;
+    case IA_CSS_PROCESS_GROUP_CMD_RESUME:
+        verifexit(state == IA_CSS_PROCESS_GROUP_STARTED);
+        process_group->state = IA_CSS_PROCESS_GROUP_RUNNING;
+        break;
+    case IA_CSS_PROCESS_GROUP_CMD_ABORT:
+        verifexit(((state == IA_CSS_PROCESS_GROUP_RUNNING) || (state == IA_CSS_PROCESS_GROUP_STARTED)));
+        process_group->state = IA_CSS_PROCESS_GROUP_STOPPED;
+        break;
+    case IA_CSS_PROCESS_GROUP_CMD_RESET:
+/* We accept a reset command in the stopped state, mostly for simplifying the statemachine test */
+        verifexit(((state == IA_CSS_PROCESS_GROUP_RUNNING) || (state == IA_CSS_PROCESS_GROUP_STARTED) || (state == IA_CSS_PROCESS_GROUP_STOPPED)));
+        process_group->state = IA_CSS_PROCESS_GROUP_BLOCKED;
+        break;
+    case IA_CSS_N_PROCESS_GROUP_CMDS:    /* Fall through */
+    default:
+        verifexit(false);
+        break;
+    }
+
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_SIM, ERROR, "ia_css_process_group_exec_cmd failed (%i)\n", retval);
+    }
+    return retval;
+}
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_group_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_group_manifest.c
new file mode 100644
index 000000000000..c8f33b2b6211
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_group_manifest.c
@@ -0,0 +1,1081 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ia_css_psys_static_storage_class.h"
+#include "ia_css_psys_program_group_manifest.h"
+#include "ia_css_rbm_manifest.h"
+
+#ifndef IPU7_ERROR_MISSING_DISABLE_SECTION
+#include "vied_nci_acb_route_type.h" /* only used for printing. */
+#endif /* IPU7_ERROR_MISSING_DISABLE_SECTION */
+
+/*
+ * Functions to possibly inline
+ */
+
+#ifndef __IA_CSS_PSYS_STATIC_INLINE__
+#include "ia_css_psys_program_group_manifest_impl.h"
+#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
+
+/*
+ * Functions not to inline
+ */
+
+/*
+ * We need to refactor those files in order to
+ * build in the firmware only what is needed,
+ * switches are put current to workaround compilation problems
+ * in the firmware (for example lack of uint64_t support)
+ * supported in the firmware
+ */
+#if !defined(__HIVECC)
+size_t ia_css_sizeof_program_group_manifest(
+    const uint8_t program_count,
+    const uint8_t terminal_count,
+    const uint8_t *program_needs_extension,
+    const uint8_t *program_dependency_count,
+    const uint8_t *terminal_dependency_count,
+    const ia_css_terminal_type_t *terminal_type,
+    const uint16_t *cached_in_param_section_count,
+    const uint16_t *cached_out_param_section_count,
+    const uint16_t *spatial_param_section_count,
+    const uint16_t *fragment_param_section_count,
+    const uint16_t *sliced_param_section_count,
+    const uint16_t *sliced_out_param_section_count,
+    const uint16_t *kernel_fragment_seq_count,
+    const uint16_t *progctrlinit_load_section_counts,
+    const uint16_t *progctrlinit_connect_section_counts)
+{
+    size_t size = 0;
+    int i = 0;
+    int j = 0;
+    int k = 0;
+    int l = 0;
+    int m = 0;
+    int n = 0;
+    int o = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_sizeof_program_group_manifest(): enter:\n");
+
+    verifexit(program_count != 0);
+    verifexit(program_dependency_count != NULL);
+    verifexit(terminal_dependency_count != NULL);
+
+    size += sizeof(ia_css_program_group_manifest_t);
+
+    /* Private payload in the program group manifest */
+    size += ceil_mul(sizeof(struct ia_css_psys_private_pg_data),
+                sizeof(uint64_t));
+    /* RBM manifest in the program group manifest */
+    size += ceil_mul(sizeof(ia_css_rbm_manifest_t),
+                sizeof(uint64_t));
+
+    for (i = 0; i < (int)program_count; i++) {
+        size += ia_css_sizeof_program_manifest(
+                program_needs_extension[i],
+                program_dependency_count[i],
+                terminal_dependency_count[i]);
+    }
+
+    for (i = 0; i < (int)terminal_count; i++) {
+        switch (terminal_type[i]) {
+        case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
+            size += ia_css_param_terminal_manifest_get_size(
+                    cached_in_param_section_count[j]);
+            j++;
+            break;
+        case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
+            size += ia_css_param_terminal_manifest_get_size(
+                    cached_out_param_section_count[k]);
+            k++;
+            break;
+        case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
+        case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
+            size += ia_css_spatial_param_terminal_manifest_get_size(
+                    spatial_param_section_count[l]);
+            l++;
+            break;
+        case IA_CSS_TERMINAL_TYPE_PROGRAM:
+            size += ia_css_program_terminal_manifest_get_size(
+                    fragment_param_section_count[m],
+                    kernel_fragment_seq_count[m]);
+            m++;
+            break;
+        case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
+            size += ia_css_program_control_init_terminal_manifest_get_size(
+                program_count,
+                progctrlinit_load_section_counts,
+                progctrlinit_connect_section_counts);
+            break;
+        case IA_CSS_TERMINAL_TYPE_DATA_IN:
+        case IA_CSS_TERMINAL_TYPE_DATA_OUT:
+            size += sizeof(ia_css_data_terminal_manifest_t);
+            break;
+        case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
+            size += ia_css_sliced_param_terminal_manifest_get_size(
+                    sliced_param_section_count[n]);
+            n++;
+            break;
+        case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
+            size += ia_css_sliced_param_terminal_manifest_get_size(
+                sliced_out_param_section_count[o]);
+            o++;
+            break;
+        default:
+            IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                "ia_css_sizeof_program_group_manifest invalid argument\n");
+        }
+    }
+
+EXIT:
+    if (0 == program_count || 0 == terminal_count ||
+        NULL == program_dependency_count ||
+        NULL == terminal_dependency_count) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+            "ia_css_sizeof_program_group_manifest invalid argument\n");
+    }
+    return size;
+}
+
+/*
+ * Currently, the design of XNR kernel inside the *_pregdc program group,
+ * does not fit the exact model as is being asserted on in
+ * ia_css_is_program_group_manifest_valid. We therefore disable some checks.
+ * Further investigation is needed to determine whether *_pregdc program group
+ * can be canged or that the model must be changed.
+ * #define USE_SIMPLIFIED_GRAPH_MODEL 1 allows multiple programs to be
+ * connected to the same terminal, and it allows a kernel be mapped over
+ * multiple programs.
+ */
+#define USE_SIMPLIFIED_GRAPH_MODEL 1
+
+/*
+ * Model and/or check refinements
+ * - Parallel programs do not yet have mutual exclusive alternatives
+ * - The pgram dependencies do not need to be acyclic
+ * - Parallel programs need to have an equal kernel requirement
+ */
+bool ia_css_is_program_group_manifest_valid(
+    const ia_css_program_group_manifest_t *manifest)
+{
+    int i;
+    bool is_valid = false;
+    uint8_t terminal_count;
+    uint8_t program_count;
+    ia_css_kernel_bitmap_t total_bitmap;
+    ia_css_kernel_bitmap_t check_bitmap;
+    ia_css_kernel_bitmap_t terminal_bitmap;
+    /*
+     * Use a standard bitmap type for the minimum logic to check the DAG,
+     * generic functions can be used for the kernel enable bitmaps; Later
+     */
+    vied_nci_resource_bitmap_t resource_bitmap;
+    int terminal_bitmap_weight;
+    int num_parameter_terminal_in = 0;
+    int num_parameter_terminal_out = 0;
+    int num_program_terminal = 0;
+    int num_program_terminal_sequencer_info = 0;
+    bool has_program_control_init_terminal = false;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_is_program_group_manifest_valid(): enter:\n");
+
+    verifexit(manifest != NULL);
+    verifexit(ia_css_program_group_manifest_get_size(manifest) != 0);
+    verifexit(ia_css_program_group_manifest_get_alignment(manifest) != 0);
+    verifexit(ia_css_program_group_manifest_get_program_group_ID(manifest) != 0);
+
+    terminal_count =
+        ia_css_program_group_manifest_get_terminal_count(manifest);
+    program_count =
+        ia_css_program_group_manifest_get_program_count(manifest);
+    total_bitmap =
+        ia_css_program_group_manifest_get_kernel_bitmap(manifest);
+    check_bitmap = ia_css_kernel_bitmap_clear();
+    resource_bitmap = vied_nci_bit_mask(VIED_NCI_RESOURCE_BITMAP_BITS);
+    terminal_bitmap = ia_css_kernel_bitmap_clear();
+
+    verifexit(program_count != 0);
+    verifexit(terminal_count != 0);
+    verifexit(!ia_css_is_kernel_bitmap_empty(total_bitmap));
+    verifexit(vied_nci_is_bitmap_empty(resource_bitmap));
+
+    /* Check the kernel bitmaps for terminals */
+    for (i = 0; i < (int)terminal_count; i++) {
+        ia_css_terminal_manifest_t *terminal_manifest_i =
+            ia_css_program_group_manifest_get_term_mnfst(
+                manifest, i);
+        bool is_parameter_in =
+            (IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ==
+            ia_css_terminal_manifest_get_type(
+                terminal_manifest_i));
+        bool is_parameter_out =
+            (IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT ==
+            ia_css_terminal_manifest_get_type(
+                terminal_manifest_i));
+        bool is_data =
+            ia_css_is_terminal_manifest_data_terminal(
+                terminal_manifest_i);
+        bool is_program =
+            ia_css_is_terminal_manifest_program_terminal(
+                terminal_manifest_i);
+        bool is_spatial_param =
+            ia_css_is_terminal_manifest_spatial_parameter_terminal(
+                terminal_manifest_i);
+        bool is_program_control_init =
+            ia_css_is_terminal_manifest_program_control_init_terminal(
+                terminal_manifest_i);
+
+        if (is_parameter_in) {
+            num_parameter_terminal_in = is_parameter_in;
+        } else if (is_parameter_out) {
+            num_parameter_terminal_out = is_parameter_out;
+        } else if (is_data) {
+            ia_css_data_terminal_manifest_t *dterminal_manifest_i =
+                (ia_css_data_terminal_manifest_t *)
+                terminal_manifest_i;
+            ia_css_kernel_bitmap_t terminal_bitmap_i =
+                ia_css_data_terminal_manifest_get_kernel_bitmap(
+                    dterminal_manifest_i);
+            /*
+             * A terminal must depend on kernels that are a subset
+             * of the total, correction, it can only depend on one
+             * kernel
+             */
+            verifexit(!ia_css_is_kernel_bitmap_empty(
+                    terminal_bitmap_i));
+            verifexit(ia_css_is_kernel_bitmap_subset(
+                    total_bitmap, terminal_bitmap_i));
+            verifexit(ia_css_is_kernel_bitmap_onehot(
+                    terminal_bitmap_i));
+        } else if (is_program) {
+            verifexit(terminal_manifest_i);
+            num_program_terminal += is_program;
+            num_program_terminal_sequencer_info +=
+                ((ia_css_program_terminal_manifest_t *)
+                terminal_manifest_i)->
+            kernel_fragment_sequencer_info_manifest_info_count;
+        } else if (is_program_control_init) {
+            has_program_control_init_terminal = is_program_control_init;
+        } else {
+            const ia_css_spatial_param_terminal_manifest_t
+                *spatial_param_man =
+            (const ia_css_spatial_param_terminal_manifest_t *)
+                terminal_manifest_i;
+            verifexit(spatial_param_man);
+            verifexit(is_spatial_param);
+
+            terminal_bitmap =
+                ia_css_kernel_bitmap_set(terminal_bitmap,
+                spatial_param_man->kernel_id);
+            verifexit(!ia_css_is_kernel_bitmap_empty(terminal_bitmap));
+            verifexit(ia_css_is_kernel_bitmap_subset(
+                    total_bitmap, terminal_bitmap));
+        }
+    }
+
+    /* Check the kernel bitmaps for programs */
+    for (i = 0; i < (int)program_count; i++) {
+        int j;
+        ia_css_program_manifest_t *program_manifest_i =
+            ia_css_program_group_manifest_get_prgrm_mnfst(
+                manifest, i);
+        ia_css_program_type_t program_type_i =
+            ia_css_program_manifest_get_type(program_manifest_i);
+        ia_css_kernel_bitmap_t program_bitmap_i =
+            ia_css_program_manifest_get_kernel_bitmap(
+                program_manifest_i);
+        uint8_t program_dependency_count_i =
+            ia_css_program_manifest_get_program_dependency_count(
+                program_manifest_i);
+        uint8_t terminal_dependency_count_i =
+            ia_css_program_manifest_get_terminal_dependency_count(
+                program_manifest_i);
+        uint8_t program_dependency_i0 =
+            ia_css_program_manifest_get_program_dependency(
+                program_manifest_i, 0);
+        bool is_sub_i =
+            ia_css_is_program_manifest_subnode_program_type(
+                program_manifest_i);
+        bool is_exclusive_sub_i =
+            (program_type_i == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB);
+        bool is_virtual_sub_i =
+            (program_type_i == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB);
+        bool is_super_i =
+            ia_css_is_program_manifest_supernode_program_type(
+                program_manifest_i);
+
+        /*
+         * A program must have kernels that
+         * are a subset of the total
+         */
+        verifexit(!ia_css_is_kernel_bitmap_empty(
+                program_bitmap_i));
+        verifexit(ia_css_is_kernel_bitmap_subset(
+                total_bitmap, program_bitmap_i));
+        verifexit((program_type_i != IA_CSS_N_PROGRAM_TYPES));
+        verifexit((program_dependency_count_i + terminal_dependency_count_i) != 0);
+        /*
+         * Checks for subnodes
+         * - Parallel subnodes cannot depend on terminals
+         * - Exclusive subnodes must depend on
+         *   fewer terminals than the supernode
+         * - Subnodes only depend on a supernode of the same type
+         * - Must have a subset of the supernode's kernels
+         *   (but not equal)
+         * - This tests only positive cases
+         * Checks for singular or supernodes
+         * - Cannot depend on exclusive subnodes
+         * - No intersection between kernels
+         *   (too strict for multiple instances ?)
+         */
+        if (is_sub_i) {
+            /* Subnode */
+            ia_css_program_manifest_t *program_manifest_k =
+            ia_css_program_group_manifest_get_prgrm_mnfst(
+                manifest, program_dependency_i0);
+            ia_css_program_type_t program_type_k =
+                ia_css_program_manifest_get_type(
+                    program_manifest_k);
+            ia_css_kernel_bitmap_t program_bitmap_k =
+                ia_css_program_manifest_get_kernel_bitmap(
+                    program_manifest_k);
+
+            verifexit(program_dependency_count_i == 1);
+            if (is_exclusive_sub_i || is_virtual_sub_i) {
+                verifexit(terminal_dependency_count_i <=
+                    ia_css_program_manifest_get_terminal_dependency_count(
+                        program_manifest_k));
+            } else{
+                verifexit(terminal_dependency_count_i == 0);
+            }
+            verifexit(program_type_k ==
+                (is_exclusive_sub_i ?
+                    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER :
+                is_virtual_sub_i ?
+                    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER :
+                    IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER));
+            verifexit(!ia_css_is_kernel_bitmap_equal(
+                    program_bitmap_k, program_bitmap_i));
+            verifexit(ia_css_is_kernel_bitmap_subset(
+                    program_bitmap_k, program_bitmap_i));
+        } else {
+            /* Singular or Supernode */
+            int k;
+            ia_css_kernel_bitmap_t program_bitmap_k;
+
+            for (k = 0; k < program_dependency_count_i; k++) {
+                uint8_t program_dependency_k =
+                ia_css_program_manifest_get_program_dependency(
+                    program_manifest_i, k);
+                ia_css_program_manifest_t *program_manifest_k =
+                ia_css_program_group_manifest_get_prgrm_mnfst(
+                manifest, (int)program_dependency_k);
+                ia_css_program_type_t program_type_k =
+                ia_css_program_manifest_get_type(
+                    program_manifest_k);
+                program_bitmap_k =
+                ia_css_program_manifest_get_kernel_bitmap(
+                    program_manifest_k);
+
+                verifexit(program_dependency_k <
+                    program_count);
+                verifexit((program_type_k !=
+                    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
+                    (program_type_k !=
+                    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB));
+                verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
+                ia_css_is_kernel_bitmap_intersection_empty(
+                    program_bitmap_i, program_bitmap_k));
+            }
+        }
+
+        /* Check for relations */
+        for (j = 0; j < (int)program_count; j++) {
+            int k;
+            ia_css_program_manifest_t *program_manifest_j =
+            ia_css_program_group_manifest_get_prgrm_mnfst(
+                manifest, j);
+            ia_css_program_type_t program_type_j =
+            ia_css_program_manifest_get_type(program_manifest_j);
+            ia_css_kernel_bitmap_t program_bitmap_j =
+            ia_css_program_manifest_get_kernel_bitmap(
+                program_manifest_j);
+            uint8_t program_dependency_count_j =
+            ia_css_program_manifest_get_program_dependency_count(
+                program_manifest_j);
+            uint8_t program_dependency_j0 =
+            ia_css_program_manifest_get_program_dependency(
+                program_manifest_j, 0);
+            bool is_sub_j =
+            ia_css_is_program_manifest_subnode_program_type(
+                program_manifest_j);
+            bool is_super_j =
+            ia_css_is_program_manifest_supernode_program_type(
+                program_manifest_j);
+            bool is_virtual_sub_j =
+            (program_type_j == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB);
+            bool is_j_subset_i =
+            ia_css_is_kernel_bitmap_subset(
+                program_bitmap_i, program_bitmap_j);
+            bool is_i_subset_j =
+            ia_css_is_kernel_bitmap_subset(
+                program_bitmap_j, program_bitmap_i);
+
+            /* Test below would fail for i==j */
+            if (i == j)
+                continue;
+
+            /* Empty sets are always subsets, but meaningless */
+            verifexit(!ia_css_is_kernel_bitmap_empty(
+                    program_bitmap_j));
+
+            /*
+             * Checks for mutual subnodes
+             * - Parallel subnodes must have an equal
+             *   set of kernels
+             * - Exclusive and virtual subnodes must
+             *   have an unequal set of kernels
+             * Checks for subnodes
+             * - Subnodes must have a subset of kernels
+             */
+            if (((program_type_i ==
+                IA_CSS_PROGRAM_TYPE_PARALLEL_SUB) &&
+                (program_type_j ==
+                IA_CSS_PROGRAM_TYPE_PARALLEL_SUB)) ||
+                ((program_type_i ==
+                IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
+                (program_type_j ==
+                IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB)) ||
+                ((program_type_i ==
+                IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) &&
+                (program_type_j ==
+                IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB))) {
+
+                verifexit(program_dependency_count_j == 1);
+                verifexit(program_dependency_i0 != i);
+                verifexit(program_dependency_j0 != i);
+
+                if (program_dependency_i0 ==
+                    program_dependency_j0) {
+                    verifexit(is_sub_i);
+                    /*
+                     * Subnodes are subsets,
+                     * not for virtual nodes
+                     */
+                    if (!is_virtual_sub_i)
+                        verifexit(
+                            ((is_j_subset_i ||
+                            is_i_subset_j)));
+                    /*
+                     * That must be equal for
+                     * parallel subnodes,
+                     * must be unequal for
+                     * exlusive and virtual subnodes
+                     */
+                    verifexit(
+                    ((is_j_subset_i && is_i_subset_j) ^
+                    (is_exclusive_sub_i |
+                    is_virtual_sub_i)));
+
+                }
+                if (is_j_subset_i || is_i_subset_j) {
+                    /* One being subset of the other does not necessarily mean that they are part
+                     * of the same "cluster" (i.e. having same super dependency).
+                     */
+                    /* verifexit(program_dependency_i0 ==
+                     *    program_dependency_j0);
+                     */
+                }
+                /* If subnodes are the same, they need different program dependency. */
+                if (ia_css_is_kernel_bitmap_equal(program_bitmap_i, program_bitmap_j)) {
+                    verifexit(program_dependency_i0 != program_dependency_j0);
+                }
+            }
+
+            if (((program_type_i ==
+                IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER) &&
+                (program_type_j ==
+                IA_CSS_PROGRAM_TYPE_PARALLEL_SUB)) ||
+                ((program_type_i ==
+                IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER) &&
+                (program_type_j ==
+                IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB)) ||
+                ((program_type_i ==
+                IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER) &&
+                (program_type_j ==
+                IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB))) {
+
+                verifexit(program_dependency_count_j == 1);
+                verifexit(!is_i_subset_j);
+
+                if (program_dependency_j0 == i) {
+                    verifexit(program_dependency_i0 !=
+                        program_dependency_j0);
+                    verifexit(is_super_i);
+                    verifexit(is_j_subset_i);
+
+                }
+                if (is_j_subset_i) {
+                    /* verifexit(program_dependency_j0 == i); */
+                    /* A sub that is subset of a super, is not necessarily dependent to it. */
+                }
+            }
+
+            /*
+             * Checks for dependent nodes
+             * - Cannot depend on exclusive subnodes
+             * - No intersection between kernels
+             *   (too strict for multiple instances ?)
+             *   unless a subnode
+             */
+            for (k = 0; k < (int)program_dependency_count_j; k++) {
+                uint8_t program_dependency_k =
+                ia_css_program_manifest_get_program_dependency(
+                    program_manifest_j, k);
+
+                verifexit((program_dependency_k <
+                    program_count));
+                if (program_dependency_k == i) {
+                    /* program[j] depends on program[i] */
+                    verifexit((i != j));
+                    verifexit((program_type_i !=
+                    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
+                    (program_type_i !=
+                    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB));
+                    verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
+                (ia_css_is_kernel_bitmap_intersection_empty(
+                program_bitmap_i, program_bitmap_j) ^ is_sub_j));
+                }
+            }
+
+            /*
+             * Checks for supernodes and subnodes
+             * - Detect nodes that kernel-wise are subsets,
+             *   but not connected to the correct supernode
+             * - We do not (yet) detect if programs properly
+             *   depend on all parallel nodes
+             */
+            if (!ia_css_is_kernel_bitmap_intersection_empty(
+                program_bitmap_i, program_bitmap_j)) {
+                /*
+                 * This test will pass if
+                 * the program manifest is NULL,
+                 * but that's no concern here
+                 */
+                verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
+            !ia_css_is_program_manifest_singular_program_type(
+                program_manifest_i));
+                verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
+            !ia_css_is_program_manifest_singular_program_type(
+                program_manifest_j));
+                if (!is_virtual_sub_j)
+                    verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
+                    (is_j_subset_i || is_i_subset_j));
+                if (is_super_i) {
+                    /* verifexit(is_sub_j); */
+                    /* verifexit(program_dependency_j0 == i); */
+                }
+                if (is_super_j) {
+                    /* verifexit(is_sub_i); */
+                    /* verifexit(program_dependency_i0 == j); */
+                }
+                if (is_super_i && is_super_j) {
+                    /* Allow two supernodes to intersect as long as they are different */
+                    verifexit(!ia_css_is_kernel_bitmap_equal(program_bitmap_i, program_bitmap_j));
+                }
+                /* A bitmap intersect does not necessarily need to mean super and sub. */
+                /* A sub that intersects with a super, is not necessarily dependent to it. */
+            }
+        }
+        check_bitmap = ia_css_kernel_bitmap_union(
+                    check_bitmap, program_bitmap_i);
+        /*
+         * A terminal can be bound to only a single
+         * (of multiple concurrent) program(s),
+         * i.e. the one that holds the iterator to control it
+         * Only singular and super nodes can depend on a terminal.
+         * This loop accumulates all terminal
+         * dependencies over all programs
+         */
+        for (j = 0; j < (int)terminal_dependency_count_i; j++) {
+            uint8_t terminal_dependency =
+            ia_css_program_manifest_get_terminal_dependency(
+                    program_manifest_i, j);
+
+            verifexit(terminal_dependency < terminal_count);
+            if ((program_type_i !=
+                IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
+                (program_type_i !=
+                IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB)) {
+                /* If the subnode always came after the */
+                /* supernode we could check for presence */
+                resource_bitmap =
+                    vied_nci_bit_mask_set_unique(
+                        resource_bitmap,
+                        terminal_dependency);
+                verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
+                    !vied_nci_is_bitmap_empty(
+                        resource_bitmap));
+            }
+        }
+    }
+    verifexit(ia_css_is_kernel_bitmap_equal(
+            total_bitmap, check_bitmap));
+
+    terminal_bitmap_weight =
+        vied_nci_bitmap_compute_weight(resource_bitmap);
+    verifexit(terminal_bitmap_weight >= 0);
+    if (num_parameter_terminal_in ||
+        num_parameter_terminal_out ||
+        num_program_terminal ||
+        has_program_control_init_terminal) {
+        int skip_terminal_count = 0;
+
+        skip_terminal_count += num_parameter_terminal_in;
+        skip_terminal_count += num_parameter_terminal_out;
+        skip_terminal_count += num_program_terminal;
+        skip_terminal_count -= num_program_terminal_sequencer_info;
+        if (has_program_control_init_terminal) {
+            skip_terminal_count++;
+        }
+        verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
+            (terminal_bitmap_weight ==
+            (terminal_count - skip_terminal_count)));
+    } else
+        verifexit((terminal_bitmap_weight == terminal_count));
+
+    is_valid = true;
+EXIT:
+    if (is_valid == false) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+            "ia_css_is_program_group_manifest_valid: failed\n");
+    }
+    return is_valid;
+}
+
+#if !defined(__HIVECC)
+int ia_css_program_group_manifest_set_kernel_bitmap(
+    ia_css_program_group_manifest_t *manifest,
+    const ia_css_kernel_bitmap_t bitmap)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_group_manifest_set_kernel_bitmap(): enter:\n");
+
+    if (manifest != NULL) {
+        manifest->kernel_bitmap = bitmap;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+            "ia_css_program_group_manifest_set_kernel_bitmap invalid argument\n");
+    }
+    return retval;
+}
+#endif
+
+ia_css_kernel_bitmap_t ia_css_program_group_manifest_get_kernel_bitmap(
+    const ia_css_program_group_manifest_t *manifest)
+{
+    ia_css_kernel_bitmap_t bitmap = ia_css_kernel_bitmap_clear();
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_group_manifest_get_kernel_bitmap(): enter:\n");
+
+    if (manifest != NULL) {
+        bitmap = manifest->kernel_bitmap;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+            "ia_css_program_group_manifest_get_kernel_bitmap invalid argument\n");
+    }
+    return bitmap;
+}
+
+#if !defined(__HIVECC)
+void ia_css_program_group_manifest_init(
+    ia_css_program_group_manifest_t *blob,
+    const uint8_t program_count,
+    const uint8_t terminal_count,
+    const uint8_t *program_needs_extension,
+    const uint8_t *program_dependencies,
+    const uint8_t *terminal_dependencies,
+    const ia_css_terminal_type_t *terminal_type,
+    const uint16_t *cached_in_param_section_count,
+    const uint16_t *cached_out_param_section_count,
+    const uint16_t *spatial_param_section_count,
+    const uint16_t *fragment_param_section_count,
+    const uint16_t *sliced_in_param_section_count,
+    const uint16_t *sliced_out_param_section_count,
+    const uint16_t *kernel_fragment_seq_count,
+    const uint16_t *progctrlinit_load_section_counts,
+    const uint16_t *progctrlinit_connect_section_counts)
+{
+    int i = 0;
+    int j = 0;
+    int k = 0;
+    int l = 0;
+    int m = 0;
+    int n = 0;
+    int o = 0;
+    int result;
+    uint32_t offset = 0;
+    char *prg_manifest_base, *terminal_manifest_base;
+    size_t program_size = 0;
+
+    /*
+     * assert(blob != NULL);
+     */
+    COMPILATION_ERROR_IF(
+        SIZE_OF_DATA_TERMINAL_MANIFEST_STRUCT_IN_BITS !=
+            (CHAR_BIT * sizeof(ia_css_data_terminal_manifest_t)));
+    COMPILATION_ERROR_IF(
+        SIZE_OF_PROGRAM_GROUP_MANIFEST_STRUCT_IN_BITS !=
+            (CHAR_BIT * sizeof(ia_css_program_group_manifest_t)));
+    COMPILATION_ERROR_IF(
+        SIZE_OF_PROGRAM_MANIFEST_STRUCT_IN_BITS !=
+            (CHAR_BIT * sizeof(ia_css_program_manifest_t)));
+    COMPILATION_ERROR_IF(
+        SIZE_OF_PROGRAM_MANIFEST_EXT_STRUCT_IN_BYTES !=
+            (CHAR_BIT * sizeof(ia_css_program_manifest_ext_t)));
+
+    COMPILATION_ERROR_IF(0 != sizeof(ia_css_program_manifest_t)%sizeof(uint32_t));
+    COMPILATION_ERROR_IF(0 != sizeof(ia_css_program_manifest_ext_t)%sizeof(uint32_t));
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
+        "ia_css_program_group_manifest_init(): enter:\n");
+
+    for (i = 0; i < (int)program_count; i++) {
+        program_size +=
+            ia_css_sizeof_program_manifest(
+                program_needs_extension[i],
+                program_dependencies[i],
+                terminal_dependencies[i]);
+    }
+
+    /* A program group ID cannot be zero */
+    blob->ID = 1;
+    blob->program_count = program_count;
+    blob->terminal_count = terminal_count;
+    blob->program_manifest_offset = sizeof(ia_css_program_group_manifest_t);
+    blob->terminal_manifest_offset =
+        (uint32_t)blob->program_manifest_offset + program_size;
+
+    prg_manifest_base = (char *)
+        (((char *)blob) + blob->program_manifest_offset);
+    offset = blob->program_manifest_offset;
+    for (i = 0; i < (int)program_count; i++) {
+        ia_css_program_manifest_init(
+            (ia_css_program_manifest_t *)prg_manifest_base,
+            program_needs_extension[i],
+            program_dependencies[i], terminal_dependencies[i]);
+        ia_css_program_manifest_set_parent_offset(
+            (ia_css_program_manifest_t *)prg_manifest_base, offset);
+        program_size =
+            ia_css_sizeof_program_manifest(
+                program_needs_extension[i],
+                program_dependencies[i],
+                terminal_dependencies[i]);
+        prg_manifest_base += program_size;
+        offset += (uint32_t)program_size;
+    }
+
+    offset = blob->terminal_manifest_offset;
+    terminal_manifest_base = (char *) (((char *)blob) + offset);
+    for (i = 0; i < (int)terminal_count; i++) {
+        size_t terminal_size = 0;
+        ia_css_terminal_manifest_t *term_manifest =
+            (ia_css_terminal_manifest_t *)terminal_manifest_base;
+
+        ia_css_terminal_manifest_set_parent_offset(
+                (ia_css_terminal_manifest_t *)
+                terminal_manifest_base,
+                offset);
+        switch (terminal_type[i]) {
+        case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
+            result = ia_css_param_terminal_manifest_init(
+                (ia_css_param_terminal_manifest_t *)
+                term_manifest,
+                cached_in_param_section_count[j]);
+            if (0 == result) {
+                terminal_size =
+                ia_css_param_terminal_manifest_get_size(
+                    cached_in_param_section_count[j]);
+                j++;
+            } else {
+                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+                    "ia_css_param_terminal_manifest_init failed in cached in terminal\n");
+            }
+            break;
+        case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
+            result = ia_css_param_terminal_manifest_init(
+                (ia_css_param_terminal_manifest_t *)
+                term_manifest,
+                cached_out_param_section_count[k]);
+            if (0 == result) {
+                terminal_size =
+                ia_css_param_terminal_manifest_get_size(
+                    cached_out_param_section_count[k]);
+                k++;
+            } else {
+                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+                    "ia_css_param_terminal_manifest_init failed\n");
+            }
+            break;
+        case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
+        case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
+            result = ia_css_spatial_param_terminal_manifest_init(
+                (ia_css_spatial_param_terminal_manifest_t *)
+                term_manifest,
+                spatial_param_section_count[l]);
+            if (0 == result) {
+                terminal_size =
+            ia_css_spatial_param_terminal_manifest_get_size(
+                spatial_param_section_count[l]);
+                l++;
+            } else {
+                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+                    "ia_css_spatial_param_terminal_manifest_init failed in spatial terminal\n");
+            }
+            break;
+        case IA_CSS_TERMINAL_TYPE_PROGRAM:
+            result = ia_css_program_terminal_manifest_init(
+                (ia_css_program_terminal_manifest_t *)
+                term_manifest,
+                fragment_param_section_count[m],
+                kernel_fragment_seq_count[m]);
+            if (0 == result) {
+                terminal_size =
+                ia_css_program_terminal_manifest_get_size(
+                    fragment_param_section_count[m],
+                    kernel_fragment_seq_count[m]);
+                m++;
+            } else {
+                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+                    "ia_css_program_terminal_manifest_init failed in program terminal\n");
+            }
+            break;
+        case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
+            result = ia_css_program_control_init_terminal_manifest_init(
+                (ia_css_program_control_init_terminal_manifest_t *)
+                term_manifest,
+                program_count,
+                progctrlinit_load_section_counts,
+                progctrlinit_connect_section_counts);
+            if (0 == result) {
+                terminal_size =
+                ia_css_program_control_init_terminal_manifest_get_size(
+                    program_count,
+                    NULL,
+                    NULL);
+            } else {
+                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+                    "ia_css_program_control_init_terminal_manifest_init failed\n");
+            }
+            break;
+        case IA_CSS_TERMINAL_TYPE_DATA_IN:
+        case IA_CSS_TERMINAL_TYPE_DATA_OUT:
+            terminal_size = sizeof(ia_css_data_terminal_manifest_t);
+            break;
+        case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
+            result = ia_css_sliced_param_terminal_manifest_init(
+                (ia_css_sliced_param_terminal_manifest_t *)
+                term_manifest,
+                sliced_in_param_section_count[n]);
+            if (0 == result) {
+                terminal_size =
+            ia_css_sliced_param_terminal_manifest_get_size(
+                sliced_in_param_section_count[n]);
+                n++;
+            } else {
+                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+                    "ia_css_param_terminal_manifest_init in sliced terminal failed\n");
+            }
+            break;
+        case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
+            result = ia_css_sliced_param_terminal_manifest_init(
+                (ia_css_sliced_param_terminal_manifest_t *)
+                term_manifest,
+                sliced_out_param_section_count[o]);
+            if (0 == result) {
+                terminal_size =
+                ia_css_sliced_param_terminal_manifest_get_size(
+                    sliced_out_param_section_count[o]);
+                n++;
+            } else {
+                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+                    "ia_css_param_terminal_manifest_init in sliced out terminal failed\n");
+            }
+            break;
+        default:
+            IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                "ia_css_program_group_manifest_init invalid argument\n");
+        }
+        term_manifest->size = (uint16_t)terminal_size;
+        /* index: i equal to terminal ID due to sorted of the terminals array */
+        term_manifest->ID = i;
+        term_manifest->terminal_type = terminal_type[i];
+        terminal_manifest_base += terminal_size;
+        offset += (uint32_t)terminal_size;
+    }
+
+    /* Set the private program group manifest blob offset */
+    blob->private_data_offset = offset;
+    offset += ceil_mul(sizeof(struct ia_css_psys_private_pg_data),
+                sizeof(uint64_t));
+
+    /* Set the RBM manifest blob offset */
+    blob->rbm_manifest_offset = offset;
+    offset += ceil_mul(sizeof(ia_css_rbm_manifest_t),
+                sizeof(uint64_t));
+
+    assert(offset <= UINT16_MAX);
+    blob->size = (uint16_t)offset;
+}
+#endif
+
+int ia_css_program_group_manifest_print(
+    const ia_css_program_group_manifest_t *manifest,
+    void *fid)
+{
+    int retval = -1;
+    int i;
+    uint8_t program_count, terminal_count;
+    ia_css_kernel_bitmap_t bitmap;
+    struct ia_css_psys_private_pg_data *priv_data;
+    ia_css_rbm_manifest_t *rbm_manifest;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
+        "ia_css_program_group_manifest_print(): enter:\n");
+
+    NOT_USED(fid);
+
+    verifexit(manifest != NULL);
+
+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+        "sizeof(manifest) = %d\n",
+        (int)ia_css_program_group_manifest_get_size(manifest));
+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+        "alignment(manifest) = %d\n",
+        (int)ia_css_program_group_manifest_get_alignment(manifest));
+
+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+        "program group ID = %d\n",
+        (int)ia_css_program_group_manifest_get_program_group_ID(
+            manifest));
+
+    program_count =
+        ia_css_program_group_manifest_get_program_count(manifest);
+    terminal_count =
+        ia_css_program_group_manifest_get_terminal_count(manifest);
+
+    bitmap = ia_css_program_group_manifest_get_kernel_bitmap(manifest);
+    verifexit(ia_css_kernel_bitmap_print(bitmap, fid) == 0);
+
+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+        "%d program manifests\n", (int)program_count);
+    for (i = 0; i < (int)program_count; i++) {
+        ia_css_program_manifest_t *program_manifest =
+            ia_css_program_group_manifest_get_prgrm_mnfst(
+                manifest, i);
+
+        retval = ia_css_program_manifest_print(program_manifest, fid);
+        verifjmpexit(retval == 0);
+    }
+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+        "%d terminal manifests\n", (int)terminal_count);
+    for (i = 0; i < (int)terminal_count; i++) {
+        ia_css_terminal_manifest_t *terminal_manifest =
+            ia_css_program_group_manifest_get_term_mnfst(
+                manifest, i);
+
+        retval = ia_css_terminal_manifest_print(
+                terminal_manifest, fid);
+        verifjmpexit(retval == 0);
+    }
+
+    priv_data =
+        (struct ia_css_psys_private_pg_data *)
+        ia_css_program_group_manifest_get_private_data(manifest);
+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+        "private_data_offset %d\n", manifest->private_data_offset);
+
+    for (i = 0; i < IPU_DEVICE_GP_PSA_MUX_NUM_MUX; i++) {
+        IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+            "PSA MUX id %d mux val %d\n", i,
+            priv_data->psa_mux_conf[i]);
+
+    }
+
+    for (i = 0; i < IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX; i++) {
+        IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+            "ISA MUX id %d mux val %d\n", i,
+            priv_data->isa_mux_conf[i]);
+
+    }
+
+#ifndef IPU7_ERROR_MISSING_DISABLE_SECTION
+    for (i = 0; i < IPU_DEVICE_ACB_NUM_ACB; i++) {
+
+        if (priv_data->acb_route[i].in_select !=
+            NCI_ACB_PORT_INVALID) {
+
+            assert(priv_data->acb_route[i].in_select !=
+                NCI_ACB_PORT_INVALID &&
+                priv_data->acb_route[i].out_select !=
+                NCI_ACB_PORT_INVALID);
+
+            IA_CSS_TRACE_3(PSYSAPI_STATIC, INFO,
+                "Route Cell id %d In %d Out %d\n", i,
+                priv_data->acb_route[i].in_select,
+                priv_data->acb_route[i].out_select);
+        }
+
+    }
+#endif /* IPU7_ERROR_MISSING_DISABLE_SECTION */
+
+    for (i = 0; i < MAX_INPUT_BUFFER; i++) {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: link_id = %d\n",
+                priv_data->input_buffer_info[i].link_id);
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: buffer_base_addr 0x%x\n",
+                priv_data->input_buffer_info[i].buffer_base_addr);
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: bpe = %d\n",
+                priv_data->input_buffer_info[i].bpe);
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: buffer_width = %d\n",
+                priv_data->input_buffer_info[i].buffer_width);
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: buffer_height = %d\n",
+                priv_data->input_buffer_info[i].buffer_height);
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: num_of_buffers = %d\n",
+                priv_data->input_buffer_info[i].num_of_buffers);
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: dfm_port_addr = 0x%x\n",
+                priv_data->input_buffer_info[i].dfm_port_addr);
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO, "======== Input Buffer: end ===========\n");
+    }
+
+    rbm_manifest = ia_css_program_group_manifest_get_rbm_manifest((ia_css_program_group_manifest_t *)manifest);
+    ia_css_rbm_manifest_print(rbm_manifest);
+
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+            "ia_css_program_group_manifest_print failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+#endif /* !defined(__HIVECC) */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_manifest.c
new file mode 100644
index 000000000000..185baec014aa
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_manifest.c
@@ -0,0 +1,972 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <ia_css_psys_program_manifest.h>
+#include <ia_css_psys_program_group_manifest.h>
+/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_print */
+#include <ia_css_kernel_bitmap.h>
+
+#include <vied_nci_psys_system_global.h>
+#include "ia_css_psys_program_group_private.h"
+#include "ia_css_psys_static_trace.h"
+
+#include <error_support.h>
+#include <misc_support.h>
+#include <storage_class.h>
+#include <math_support.h>
+
+/* *****************************************************
+ * Functions to possibly inline
+ * ******************************************************/
+#ifndef __IA_CSS_PSYS_STATIC_INLINE__
+#include "ia_css_psys_program_manifest_impl.h"
+#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
+
+/* *****************************************************
+ * Functions not to inline and available to firmware
+ * ******************************************************/
+bool ia_css_has_program_manifest_fixed_cell(
+    const ia_css_program_manifest_t *manifest)
+{
+    DECLARE_ERRVAL
+    bool has_fixed_cell = false;
+    vied_nci_cell_ID_t cell_id;
+    vied_nci_cell_type_ID_t    cell_type_id;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_has_program_manifest_fixed_cell(): enter:\n");
+
+    verifexitval(manifest != NULL, EFAULT);
+
+    cell_id      = ia_css_program_manifest_get_cell_ID(manifest);
+    cell_type_id = ia_css_program_manifest_get_cell_type_ID(manifest);
+
+    has_fixed_cell = ((cell_id != VIED_NCI_N_CELL_ID) &&
+              (cell_type_id == VIED_NCI_N_CELL_TYPE_ID));
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+           "ia_css_has_program_manifest_fixed_cell invalid argument\n");
+        return false;
+    }
+    return has_fixed_cell;
+}
+
+vied_nci_resource_bitmap_t ia_css_program_manifest_get_cells_bitmap(
+    const ia_css_program_manifest_t            *manifest)
+{
+    DECLARE_ERRVAL
+    vied_nci_resource_bitmap_t    bitmap = 0;
+    int i = 0;
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_manifest_get_cells_bitmap(): enter:\n");
+
+    verifexitval(manifest != NULL, EFAULT);
+
+    for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
+        if (VIED_NCI_N_CELL_ID != manifest->cells[i]) {
+            bitmap |= (1 << manifest->cells[i]);
+        }
+#ifdef __HIVECC
+#pragma hivecc unroll
+#endif
+    }
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+         "ia_css_program_manifest_get_cells_bitmap invalid argument\n");
+    }
+    return bitmap;
+}
+
+bool ia_css_is_program_manifest_subnode_program_type(
+    const ia_css_program_manifest_t *manifest)
+{
+    ia_css_program_type_t        program_type;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_is_program_manifest_subnode_program_type(): enter:\n");
+
+    program_type = ia_css_program_manifest_get_type(manifest);
+/* The error return is the limit value, so no need to check on the manifest
+ * pointer
+ */
+    return (program_type == IA_CSS_PROGRAM_TYPE_PARALLEL_SUB) ||
+            (program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) ||
+            (program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB);
+}
+
+bool ia_css_is_program_manifest_supernode_program_type(
+    const ia_css_program_manifest_t *manifest)
+{
+    ia_css_program_type_t program_type;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+           "ia_css_is_program_manifest_supernode_program_type(): enter:\n");
+
+    program_type = ia_css_program_manifest_get_type(manifest);
+
+/* The error return is the limit value, so no need to check on the manifest
+ * pointer
+ */
+    return (program_type == IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER) ||
+            (program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER) ||
+            (program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER);
+}
+
+vied_nci_cell_ID_t ia_css_program_manifest_get_cell_ID(
+    const ia_css_program_manifest_t *manifest)
+{
+    DECLARE_ERRVAL
+
+    vied_nci_cell_ID_t cell_id = VIED_NCI_N_CELL_ID;
+    int i = 0;
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_manifest_get_cell_ID(): enter:\n");
+
+    verifexitval(manifest != NULL, EFAULT);
+
+    for (i = 1; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
+        assert(VIED_NCI_N_CELL_ID == manifest->cells[i]);
+#ifdef __HIVECC
+#pragma hivecc unroll
+#endif
+    }
+    cell_id = manifest->cells[0];
+EXIT:
+    if (!noerror()) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+          "ia_css_program_manifest_get_cell_ID invalid argument\n");
+        return VIED_NCI_N_CELL_ID;
+    }
+    return cell_id;
+}
+
+/* *****************************************************
+ * Functions not to inline and not available to firmware
+ * ******************************************************/
+#if !defined(__HIVECC)
+size_t ia_css_sizeof_program_manifest(
+    const uint8_t program_needs_extension,
+    const uint8_t program_dependency_count,
+    const uint8_t terminal_dependency_count)
+{
+    size_t    size = 0;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_sizeof_program_manifest(): enter:\n");
+
+    size += sizeof(ia_css_program_manifest_t);
+    if (program_needs_extension == 1) {
+        /* align manifest extension to 32 bit */
+        size = CEIL_MUL(size, sizeof(uint32_t));
+        size += sizeof(ia_css_program_manifest_ext_t);
+    }
+    size += program_dependency_count * sizeof(uint8_t);
+    size += terminal_dependency_count * sizeof(uint8_t);
+    /* align whole structure to 32 bit */
+    size = ceil_mul(size, sizeof(uint32_t));
+
+    return size;
+}
+
+int ia_css_program_manifest_set_program_ID(
+    ia_css_program_manifest_t            *manifest,
+    ia_css_program_ID_t id)
+{
+    int ret = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_manifest_set_program_ID(): enter:\n");
+
+    if (manifest != NULL) {
+        assert(id < UINT8_MAX && IA_CSS_PROGRAM_ID_BITS == 8);
+        manifest->ID = id;
+        ret = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+           "ia_css_program_manifest_set_program_ID failed (%i)\n", ret);
+    }
+    return ret;
+}
+
+int ia_css_program_manifest_set_parent_offset(
+    ia_css_program_manifest_t    *manifest,
+    int32_t program_offset)
+{
+    int    retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_manifest_set_parent_offset(): enter:\n");
+
+    verifexit(manifest != NULL);
+
+    /* parent is at negative offset away from current program offset*/
+    assert((int16_t)(-program_offset) == -program_offset);
+    manifest->parent_offset = (int16_t)(-program_offset);
+
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+            "ia_css_program_manifest_set_parent_offset failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+int ia_css_program_manifest_set_type(
+    ia_css_program_manifest_t                *manifest,
+    const ia_css_program_type_t                program_type)
+{
+    int    retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_manifest_set_type(): enter:\n");
+
+    if (manifest != NULL) {
+        assert(program_type < UINT8_MAX && IA_CSS_PROGRAM_TYPE_BITS == 8);
+        manifest->program_type = (ia_css_program_type_t)program_type;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+              "ia_css_program_manifest_set_type failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+int ia_css_program_manifest_set_kernel_bitmap(
+    ia_css_program_manifest_t            *manifest,
+    const ia_css_kernel_bitmap_t            kernel_bitmap)
+{
+    int    retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_manifest_set_kernel_bitmap(): enter:\n");
+
+    if (manifest != NULL) {
+        manifest->kernel_bitmap = kernel_bitmap;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+            "ia_css_program_manifest_set_kernel_bitmap failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+int ia_css_program_manifest_set_cell_ID(
+    ia_css_program_manifest_t            *manifest,
+    const vied_nci_cell_ID_t            cell_id)
+{
+    int    retval = -1;
+    int i = 0;
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_manifest_set_cell_ID(): enter:\n");
+    if (manifest != NULL) {
+        manifest->cells[0] = cell_id;
+        for (i = 1; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
+            manifest->cells[i] = VIED_NCI_N_CELL_ID;
+        }
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+           "ia_css_program_manifest_set_cell_ID failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+int ia_css_program_manifest_set_cell_type_ID(
+    ia_css_program_manifest_t            *manifest,
+    const vied_nci_cell_type_ID_t            cell_type_id)
+{
+    int    retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_manifest_set_cell_type_ID(): enter:\n");
+    if (manifest != NULL) {
+        manifest->cell_type_id = cell_type_id;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+            "ia_css_program_manifest_set_cell_type_ID failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+void ia_css_program_manifest_set_input_terminal_id(
+    ia_css_program_manifest_t   *manifest,
+    unsigned char                   idx,
+    unsigned char                   val)
+{
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+               "ia_css_program_manifest_set_input_terminal_id(): enter:\n");
+    if (manifest != NULL) {
+#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
+        ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+        manifest_ext = ia_css_program_manifest_get_extension(manifest);
+        if (manifest_ext == NULL) {
+            return;
+        }
+        assert(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES);
+        manifest_ext->dec_resources_input_terminal[idx] = val;
+#else
+        (void) idx;
+        (void) val;
+#endif
+    }
+}
+
+void ia_css_program_manifest_set_output_terminal_id(
+    ia_css_program_manifest_t   *manifest,
+    unsigned char                    idx,
+    unsigned char                    val)
+{
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+               "ia_css_program_manifest_set_output_terminal_id(): enter:\n");
+    if (manifest != NULL) {
+#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
+        ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+        manifest_ext = ia_css_program_manifest_get_extension(manifest);
+        if (manifest_ext == NULL) {
+            return;
+        }
+        assert(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES);
+        manifest_ext->dec_resources_output_terminal[idx] = val;
+#else
+        (void) idx;
+        (void) val;
+        (void) manifest_ext;
+#endif
+    }
+}
+
+void ia_css_program_manifest_set_input_stream_id(
+    ia_css_program_manifest_t   *manifest,
+    unsigned char                   idx,
+    unsigned char                   val)
+{
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+               "ia_css_program_manifest_set_input_stream_id(): enter:\n");
+    if (manifest != NULL) {
+#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
+        ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+        manifest_ext = ia_css_program_manifest_get_extension(manifest);
+        if (manifest_ext == NULL) {
+            return;
+        }
+        assert(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES);
+        manifest_ext->dec_resources_input[idx] = val;
+#else
+        (void) idx;
+        (void) val;
+#endif
+    }
+}
+
+void ia_css_program_manifest_set_output_stream_id(
+    ia_css_program_manifest_t   *manifest,
+    unsigned char                    idx,
+    unsigned char                    val)
+{
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+               "ia_css_program_manifest_set_output_stream_id(): enter:\n");
+    if (manifest != NULL) {
+#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
+        ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+        manifest_ext = ia_css_program_manifest_get_extension(manifest);
+        if (manifest_ext == NULL) {
+            return;
+        }
+        assert(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES);
+        manifest_ext->dec_resources_output[idx] = val;
+#else
+        (void) idx;
+        (void) val;
+#endif
+    }
+}
+
+int ia_css_program_manifest_set_cells_bitmap(
+    ia_css_program_manifest_t            *manifest,
+    const vied_nci_resource_bitmap_t    bitmap)
+{
+    int retval = -1;
+    int array_index = 0;
+    int bit_index;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+               "ia_css_program_manifest_set_cells_bitmap(): enter:\n");
+
+    if (manifest != NULL) {
+        for (bit_index = 0; bit_index < VIED_NCI_N_CELL_ID; bit_index++) {
+            if (vied_nci_is_bit_set_in_bitmap(bitmap, bit_index)) {
+                verifexit(array_index < IA_CSS_PROCESS_MAX_CELLS);
+                manifest->cells[array_index] = (vied_nci_cell_ID_t)bit_index;
+                array_index++;
+            }
+        }
+        for (; array_index < IA_CSS_PROCESS_MAX_CELLS; array_index++) {
+            manifest->cells[array_index] = VIED_NCI_N_CELL_ID;
+        }
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+         "ia_css_program_manifest_set_cells_bitmap invalid argument\n");
+    }
+EXIT:
+    return retval;
+}
+
+#if HAS_DFM
+int ia_css_program_manifest_set_dfm_port_bitmap(
+    ia_css_program_manifest_t            *manifest,
+    const vied_nci_dev_dfm_id_t          dfm_type_id,
+    const vied_nci_resource_bitmap_t     bitmap)
+{
+    int retval = -1;
+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+               "ia_css_program_manifest_set_dfm_port_bitmap(): enter:\n");
+
+    verifexit(manifest != NULL);
+    verifexit(dfm_type_id < VIED_NCI_N_DEV_DFM_ID);
+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
+    if (manifest_ext == NULL && bitmap == 0) {
+        return 0;
+    }
+    verifexit(manifest_ext != NULL);
+    manifest_ext->dfm_port_bitmap[dfm_type_id] = bitmap;
+    retval = 0;
+
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                "ia_css_program_manifest_set_dfm_port_bitmap invalid argument\n");
+    }
+    return retval;
+}
+
+int ia_css_program_manifest_set_dfm_active_port_bitmap(
+    ia_css_program_manifest_t           *manifest,
+    const vied_nci_dev_dfm_id_t          dfm_type_id,
+    const vied_nci_resource_bitmap_t     bitmap)
+{
+    int retval = -1;
+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+            "ia_css_program_manifest_set_dfm_active_port_bitmap(): enter:\n");
+
+    verifexit(manifest != NULL);
+    verifexit(dfm_type_id < VIED_NCI_N_DEV_DFM_ID);
+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
+    if (manifest_ext == NULL && bitmap == 0) {
+        return 0;
+    }
+    verifexit(manifest_ext != NULL);
+    manifest_ext->dfm_active_port_bitmap[dfm_type_id] = bitmap;
+    retval = 0;
+
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                "ia_css_program_manifest_set_dfm_active_port_bitmap invalid argument\n");
+    }
+    return retval;
+}
+
+int ia_css_program_manifest_set_is_dfm_relocatable(
+    ia_css_program_manifest_t       *manifest,
+    const vied_nci_dev_dfm_id_t      dfm_type_id,
+    const uint8_t                    is_relocatable)
+{
+    int retval = -1;
+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+            "ia_css_program_manifest_set_is_dfm_relocatable(): enter:\n");
+
+    verifexit(manifest != NULL);
+    verifexit(dfm_type_id < VIED_NCI_N_DEV_DFM_ID);
+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
+    if (manifest_ext == NULL) {
+        return 0;
+    }
+    manifest_ext->is_dfm_relocatable[dfm_type_id] = is_relocatable;
+    retval = 0;
+
+    EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+                "ia_css_program_manifest_set_is_dfm_relocatable invalid argument\n");
+    }
+
+    return retval;
+}
+#endif /* HAS_DFM */
+
+int ia_css_program_manifest_set_int_mem_size(
+    ia_css_program_manifest_t            *manifest,
+    const vied_nci_mem_type_ID_t            mem_type_id,
+    const vied_nci_resource_size_t            int_mem_size)
+{
+    (void)manifest;
+    (void)mem_type_id;
+    if (int_mem_size != 0) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+            "ia_css_program_manifest_set_int_mem_size should not be called"
+            "(internally memory feature not used).\n");
+        return -1;
+    }
+    return 0;
+}
+
+int ia_css_program_manifest_set_ext_mem_size(
+    ia_css_program_manifest_t            *manifest,
+    const vied_nci_mem_type_ID_t            mem_type_id,
+    const vied_nci_resource_size_t            ext_mem_size)
+{
+    int retval = -1;
+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+    if (manifest == NULL) {
+        return retval;
+    }
+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
+    if (manifest_ext == NULL && ext_mem_size == 0) {
+        return 0;
+    } else if (manifest_ext == NULL) {
+        return retval;
+    }
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+               "ia_css_program_manifest_set_ext_mem_size(): enter:\n");
+
+    if (manifest != NULL && mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID) {
+        manifest_ext->ext_mem_size[mem_type_id] = ext_mem_size;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+         "ia_css_program_manifest_set_ext_mem_size invalid argument\n");
+    }
+
+    return retval;
+}
+
+int ia_css_program_manifest_set_ext_mem_offset(
+    ia_css_program_manifest_t            *manifest,
+    const vied_nci_mem_type_ID_t            mem_type_id,
+    const vied_nci_resource_size_t            ext_mem_offset)
+{
+    int retval = -1;
+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+    if (manifest == NULL) {
+        return retval;
+    }
+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
+    if (manifest_ext == NULL && ext_mem_offset ==
+        (vied_nci_resource_size_t)IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE) {
+        return 0;
+    } else if (manifest_ext == NULL) {
+        return retval;
+    }
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+               "ia_css_program_manifest_set_ext_mem_offset(): enter:\n");
+
+    if (manifest != NULL && mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID) {
+        manifest_ext->ext_mem_offset[mem_type_id] = ext_mem_offset;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+         "ia_css_program_manifest_set_ext_mem_offset invalid argument\n");
+    }
+
+    return retval;
+}
+
+int ia_css_program_manifest_set_dev_chn_size(
+    ia_css_program_manifest_t            *manifest,
+    const vied_nci_dev_chn_ID_t            dev_chn_id,
+    const vied_nci_resource_size_t            dev_chn_size)
+{
+    int retval = -1;
+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+    if (manifest == NULL) {
+        return retval;
+    }
+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
+    if (manifest_ext == NULL && dev_chn_size == 0) {
+        return 0;
+    } else if (manifest_ext == NULL) {
+        return retval;
+    }
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+               "ia_css_program_manifest_set_dev_chn_size(): enter:\n");
+#ifndef IPU_SYSVER_ipu7v1
+    if (manifest != NULL && dev_chn_id < VIED_NCI_N_DEV_CHN_ID) {
+        manifest_ext->dev_chn_size[dev_chn_id] = dev_chn_size;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+         "ia_css_program_manifest_set_dev_chn_size invalid argument\n");
+    }
+#else
+    NOT_USED(dev_chn_id);
+#endif
+    return retval;
+}
+
+int ia_css_program_manifest_set_dev_chn_offset(
+    ia_css_program_manifest_t            *manifest,
+    const vied_nci_dev_chn_ID_t            dev_chn_id,
+    const vied_nci_resource_size_t            dev_chn_offset)
+{
+    int retval = -1;
+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+    if (manifest == NULL) {
+        return retval;
+    }
+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
+    if (manifest_ext == NULL && dev_chn_offset ==
+        (vied_nci_resource_size_t)IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE) {
+        return 0;
+    } else if (manifest_ext == NULL) {
+        return retval;
+    }
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+               "ia_css_program_manifest_set_dev_chn_offset(): enter:\n");
+#ifndef IPU_SYSVER_ipu7v1
+    if (manifest != NULL && dev_chn_id < VIED_NCI_N_DEV_CHN_ID) {
+        manifest_ext->dev_chn_offset[dev_chn_id] = dev_chn_offset;
+        retval = 0;
+    } else {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+         "ia_css_program_manifest_set_dev_chn_offset invalid argument\n");
+    }
+#else
+    NOT_USED(dev_chn_id);
+#endif
+    return retval;
+}
+
+int ia_css_program_manifest_set_program_dependency(
+    ia_css_program_manifest_t    *manifest,
+    const uint8_t            program_dependency,
+    const unsigned int        index)
+{
+    int    retval = -1;
+    uint8_t *program_dep_ptr;
+    uint8_t    program_dependency_count;
+    uint8_t    program_count;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_manifest_set_program_dependency(): enter:\n");
+
+    program_dependency_count =
+        ia_css_program_manifest_get_program_dependency_count(manifest);
+    program_count =
+        ia_css_program_group_manifest_get_program_count(
+            ia_css_program_manifest_get_parent(manifest));
+
+    if ((index < program_dependency_count) &&
+        (program_dependency < program_count)) {
+        program_dep_ptr = (uint8_t *)((uint8_t *)manifest +
+                  manifest->program_dependency_offset +
+                  index*sizeof(uint8_t));
+         *program_dep_ptr = program_dependency;
+        retval = 0;
+    }
+
+    if (retval != 0) {
+        IA_CSS_TRACE_3(PSYSAPI_STATIC, ERROR,
+            "ia_css_program_manifest_set_program_dependency(m, %d, %d) failed (%i)\n",
+            program_dependency, index, retval);
+    }
+    return retval;
+}
+
+int ia_css_program_manifest_set_terminal_dependency(
+    ia_css_program_manifest_t            *manifest,
+    const uint8_t                    terminal_dependency,
+    const unsigned int                index)
+{
+    int    retval = -1;
+    uint8_t *terminal_dep_ptr;
+    uint8_t terminal_dependency_count =
+        ia_css_program_manifest_get_terminal_dependency_count(manifest);
+    uint8_t terminal_count =
+        ia_css_program_group_manifest_get_terminal_count(
+            ia_css_program_manifest_get_parent(manifest));
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_program_manifest_set_terminal_dependency(): enter:\n");
+
+    if ((index < terminal_dependency_count) &&
+            (terminal_dependency < terminal_count)) {
+        terminal_dep_ptr = (uint8_t *)((uint8_t *)manifest +
+                  manifest->terminal_dependency_offset + index);
+         *terminal_dep_ptr = terminal_dependency;
+        retval = 0;
+    }
+
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+            "ia_css_program_manifest_set_terminal_dependency failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+void ia_css_program_manifest_init(
+    ia_css_program_manifest_t    *blob,
+    const uint8_t    program_needs_extension,
+    const uint8_t    program_dependency_count,
+    const uint8_t    terminal_dependency_count)
+{
+    size_t size = 0;
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
+        "ia_css_program_manifest_init(): enter:\n");
+
+    /*TODO: add assert*/
+    if (!blob)
+        return;
+
+    blob->ID = 1;
+    blob->program_dependency_count = program_dependency_count;
+    blob->terminal_dependency_count = terminal_dependency_count;
+
+    size += sizeof(ia_css_program_manifest_t);
+    if (program_needs_extension == 1) {
+        /* align start of extension to 32 bit */
+        size = CEIL_MUL(size, sizeof(uint32_t));
+        blob->program_extension_offset = size;
+        size += sizeof(ia_css_program_manifest_ext_t);
+    } else {
+        blob->program_extension_offset = 0;
+    }
+    blob->program_dependency_offset = size;
+    size += sizeof(uint8_t) * program_dependency_count;
+    blob->terminal_dependency_offset = size;
+    size += sizeof(uint8_t) * terminal_dependency_count;
+    /* align whole structure to 32 bit */
+    size = CEIL_MUL(size, sizeof(uint32_t));
+
+    blob->size = (uint8_t)ia_css_sizeof_program_manifest(
+        program_needs_extension,
+        program_dependency_count,
+        terminal_dependency_count);
+
+    assert(blob->size == size);
+    /* The following assert also implies that:
+     * blob->program_extension_offset,
+     * blob->program_dependency_offset,
+     * blob->terminal_dependency_offset,
+     * are <= UINT8_MAX
+     */
+    assert(size <= UINT8_MAX);
+}
+
+int ia_css_program_manifest_print(
+    const ia_css_program_manifest_t *manifest,
+    void *fid)
+{
+    int            retval = -1;
+    int            i, mem_index, dev_chn_index;
+
+    vied_nci_cell_type_ID_t    cell_type_id;
+    uint8_t                    program_dependency_count;
+    uint8_t                    terminal_dependency_count;
+    ia_css_kernel_bitmap_t    bitmap;
+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
+               "ia_css_program_manifest_print(): enter:\n");
+
+    verifexit(manifest != NULL);
+    NOT_USED(fid);
+
+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "sizeof(manifest) = %d\n",
+        (int)ia_css_program_manifest_get_size(manifest));
+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "program ID = %d\n",
+        (int)ia_css_program_manifest_get_program_ID(manifest));
+
+    bitmap = ia_css_program_manifest_get_kernel_bitmap(manifest);
+    verifexit(ia_css_kernel_bitmap_print(bitmap, fid) == 0);
+
+    if (ia_css_has_program_manifest_fixed_cell(manifest)) {
+        vied_nci_cell_ID_t cell_id =
+                  ia_css_program_manifest_get_cell_ID(manifest);
+
+        cell_type_id = vied_nci_cell_get_type(cell_id);
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "cell(program) = %d\n",
+            (int)cell_id);
+    } else {
+        cell_type_id =
+            ia_css_program_manifest_get_cell_type_ID(manifest);
+    }
+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "cell type(program) = %d\n",
+        (int)cell_type_id);
+
+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
+    if (manifest_ext != NULL) {
+    for (mem_index = 0; mem_index < (int)VIED_NCI_N_MEM_TYPE_ID;
+         mem_index++) {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\ttype(internal mem) type = %d\n",
+        (int)vied_nci_cell_type_get_mem_type(cell_type_id, mem_index));
+    }
+
+    for (mem_index = 0; mem_index < (int)VIED_NCI_N_DATA_MEM_TYPE_ID;
+         mem_index++) {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\ttype(external mem) type = %d\n",
+            (int)(vied_nci_mem_type_ID_t)mem_index);
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\ttype(external mem) size = %d\n",
+            manifest_ext->ext_mem_size[mem_index]);
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\ttype(external mem) offset = %d\n",
+            manifest_ext->ext_mem_offset[mem_index]);
+    }
+#if HAS_DFM
+    for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_CHN_ID;
+         dev_chn_index++) {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\ttype(device channel) type = %d\n",
+            (int)dev_chn_index);
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\ttype(device channel) size = %d\n",
+            manifest_ext->dev_chn_size[dev_chn_index]);
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\ttype(device channel) offset = %d\n",
+            manifest_ext->dev_chn_offset[dev_chn_index]);
+    }
+    for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_DFM_ID;
+        dev_chn_index++) {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\ttype(dfm port) type = %d\n",
+            (int)dev_chn_index);
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\ttype(dfm port) port_bitmap = %x\n",
+            manifest_ext->dfm_port_bitmap[dev_chn_index]);
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\ttype(dfm port) active_port_bitmap = %x\n",
+            manifest_ext->dfm_active_port_bitmap[dev_chn_index]);
+
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\ttype(dfm port) is_dfm_relocatable = %d\n",
+            manifest_ext->is_dfm_relocatable[dev_chn_index]);
+    }
+#else
+    NOT_USED(dev_chn_index);
+#endif /* HAS_DFM */
+#ifdef USE_DEC400
+    for (i = 0; i < IA_CSS_MAX_INPUT_DEC_RESOURCES; i++) {
+        IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+            "\tEncoder stream id for idx = %d is: %d \n",
+            i,
+            manifest_ext->dec_resources_input[i]);
+
+    }
+    for (i = 0; i < IA_CSS_MAX_OUTPUT_DEC_RESOURCES; i++) {
+        IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+            "\tDecoder stream id for idx: = %d is: %d\n",
+            i,
+            manifest_ext->dec_resources_output[i]);
+
+    }
+#endif
+    }
+
+    for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\ttype(cells) bitmap = %d\n",
+            manifest->cells[i]);
+    }
+    program_dependency_count =
+        ia_css_program_manifest_get_program_dependency_count(manifest);
+    if (program_dependency_count == 0) {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "program_dependencies[%d] {};\n",
+            program_dependency_count);
+    } else {
+        uint8_t prog_dep;
+
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "program_dependencies[%d] {\n",
+            program_dependency_count);
+        for (i = 0; i < (int)program_dependency_count - 1; i++) {
+            prog_dep =
+            ia_css_program_manifest_get_program_dependency(
+                manifest, i);
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+                "\t %4d,\n", prog_dep);
+        }
+        prog_dep =
+        ia_css_program_manifest_get_program_dependency(manifest, i);
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\t %4d }\n", prog_dep);
+        (void)prog_dep;
+    }
+
+    terminal_dependency_count =
+        ia_css_program_manifest_get_terminal_dependency_count(manifest);
+    if (terminal_dependency_count == 0) {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "terminal_dependencies[%d] {};\n",
+            terminal_dependency_count);
+    } else {
+        uint8_t term_dep;
+
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "terminal_dependencies[%d] {\n",
+            terminal_dependency_count);
+        for (i = 0; i < (int)terminal_dependency_count - 1; i++) {
+            term_dep =
+            ia_css_program_manifest_get_terminal_dependency(
+                manifest, i);
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+                "\t %4d,\n", term_dep);
+        }
+        term_dep =
+           ia_css_program_manifest_get_terminal_dependency(manifest, i);
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\t %4d }\n", term_dep);
+        (void)term_dep;
+    }
+    (void)cell_type_id;
+
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+            "ia_css_program_manifest_print failed (%i)\n", retval);
+    }
+    return retval;
+}
+
+#endif /* !defined(__HIVECC) */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal.c
new file mode 100644
index 000000000000..c71219549595
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal.c
@@ -0,0 +1,534 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ia_css_psys_dynamic_storage_class.h"
+#include "ia_css_psys_terminal_private_types.h"
+#include "ia_css_terminal_types.h"
+
+/*
+ * Functions to possibly inline
+ */
+
+#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
+#include "ia_css_psys_terminal_impl.h"
+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
+
+/*
+ * Functions not to inline
+ */
+
+/*
+ * This source file is created with the intention of sharing and
+ * compiled for host and firmware. Since there is no native 64bit
+ * data type support for firmware this wouldn't compile for SP
+ * tile. The part of the file that is not compilable are marked
+ * with the following __VIED_CELL marker and this comment. Once we
+ * come up with a solution to address this issue this will be
+ * removed.
+ */
+#if !defined(__VIED_CELL)
+size_t ia_css_sizeof_terminal(
+    const ia_css_terminal_manifest_t *manifest,
+    const ia_css_program_group_param_t *param)
+{
+    size_t size = 0;
+    uint16_t fragment_count =
+        ia_css_program_group_param_get_fragment_count(param);
+
+    COMPILATION_ERROR_IF(
+        SIZE_OF_DATA_TERMINAL_STRUCT_BITS !=
+        (CHAR_BIT * sizeof(ia_css_data_terminal_t)));
+
+    COMPILATION_ERROR_IF(
+        0 != sizeof(ia_css_data_terminal_t)%sizeof(uint64_t));
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_sizeof_terminal(): enter:\n");
+
+    verifexit(manifest != NULL);
+    verifexit(param != NULL);
+
+    if (ia_css_is_terminal_manifest_parameter_terminal(manifest)) {
+        const ia_css_param_terminal_manifest_t *param_term_man =
+            (const ia_css_param_terminal_manifest_t *)manifest;
+        verifexit(param_term_man != NULL);
+        if (ia_css_terminal_manifest_get_type(manifest) ==
+                IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN) {
+            size = ia_css_param_in_terminal_get_descriptor_size(
+            param_term_man->param_manifest_section_desc_count);
+        } else if (ia_css_terminal_manifest_get_type(manifest) ==
+                IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) {
+            size = ia_css_param_out_terminal_get_descriptor_size(
+            param_term_man->param_manifest_section_desc_count,
+            fragment_count);
+        } else {
+            assert(NULL == "Invalid parameter terminal type");
+            IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+                "ia_css_sizeof_terminal(): Invalid parameter terminal type:\n");
+            verifjmpexit(0);
+        }
+    } else if (ia_css_is_terminal_manifest_data_terminal(manifest)) {
+        size += sizeof(ia_css_data_terminal_t);
+        size += fragment_count * sizeof(ia_css_fragment_descriptor_t);
+    } else if (ia_css_is_terminal_manifest_program_terminal(manifest)) {
+        ia_css_program_terminal_manifest_t *prog_term_man =
+            (ia_css_program_terminal_manifest_t *)manifest;
+
+        size = ia_css_program_terminal_get_descriptor_size(
+            fragment_count,
+            prog_term_man->
+            fragment_param_manifest_section_desc_count,
+            prog_term_man->
+            kernel_fragment_sequencer_info_manifest_info_count,
+            (fragment_count * prog_term_man->
+            max_kernel_fragment_sequencer_command_desc));
+    } else if (ia_css_is_terminal_manifest_spatial_parameter_terminal(
+                manifest)) {
+        ia_css_spatial_param_terminal_manifest_t *spatial_param_term =
+            (ia_css_spatial_param_terminal_manifest_t *)manifest;
+        size = ia_css_spatial_param_terminal_get_descriptor_size(
+        spatial_param_term->
+        frame_grid_param_manifest_section_desc_count,
+            fragment_count);
+    } else if (ia_css_is_terminal_manifest_program_control_init_terminal(
+                manifest)) {
+        ia_css_program_control_init_terminal_manifest_t *progctrlinit_term_man =
+            (ia_css_program_control_init_terminal_manifest_t *)manifest;
+        ia_css_program_group_manifest_t *pg_manifest =
+            ia_css_terminal_manifest_get_parent(manifest);
+        ia_css_kernel_bitmap_t kernel_bitmap =
+            ia_css_program_group_param_get_kernel_enable_bitmap(param);
+
+        verifjmpexit(pg_manifest != NULL);
+        size = ia_css_program_control_init_terminal_get_descriptor_size(
+            progctrlinit_term_man, pg_manifest, kernel_bitmap);
+    }
+EXIT:
+    if (NULL == manifest || NULL == param) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_sizeof_terminal invalid argument\n");
+    }
+    return size;
+}
+
+ia_css_terminal_t *ia_css_terminal_create(
+    void *raw_mem,
+    const ia_css_terminal_manifest_t *manifest,
+    const ia_css_terminal_param_t *terminal_param,
+    ia_css_kernel_bitmap_t enable_bitmap)
+{
+    char *terminal_raw_ptr;
+    ia_css_terminal_t *terminal = NULL;
+    uint16_t fragment_count;
+    int i, j;
+    int retval = -1;
+    ia_css_program_group_param_t *param;
+
+    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_terminal_create(manifest %p, terminal_param %p): enter:\n",
+        manifest, terminal_param);
+
+    param = ia_css_terminal_param_get_parent(terminal_param);
+    fragment_count = ia_css_program_group_param_get_fragment_count(param);
+
+    verifexit(manifest != NULL);
+    verifexit(param != NULL);
+
+    terminal_raw_ptr = (char *) raw_mem;
+
+    terminal = (ia_css_terminal_t *) terminal_raw_ptr;
+    verifexit(terminal != NULL);
+
+    terminal->size = (uint16_t)ia_css_sizeof_terminal(manifest, param);
+    verifexit(ia_css_terminal_set_type(
+        terminal, ia_css_terminal_manifest_get_type(manifest)) == 0);
+
+    terminal->ID = ia_css_terminal_manifest_get_ID(manifest);
+
+    verifexit(ia_css_terminal_set_buffer(terminal,
+                VIED_NULL) == 0);
+
+    if (ia_css_is_terminal_manifest_data_terminal(manifest) == true) {
+        ia_css_data_terminal_t *dterminal =
+            (ia_css_data_terminal_t *)terminal;
+        ia_css_frame_t *frame =
+            ia_css_data_terminal_get_frame(dterminal);
+        ia_css_kernel_bitmap_t intersection =
+            ia_css_kernel_bitmap_intersection(enable_bitmap,
+            ia_css_data_terminal_manifest_get_kernel_bitmap(
+            (const ia_css_data_terminal_manifest_t *)manifest));
+
+        verifexit(frame != NULL);
+        verifexit(ia_css_frame_set_buffer_state(
+                frame, IA_CSS_BUFFER_NULL) == 0);
+        verifexit(ia_css_is_kernel_bitmap_onehot(intersection) ==
+                    true);
+
+        terminal_raw_ptr += sizeof(ia_css_data_terminal_t);
+        dterminal->fragment_descriptor_offset =
+            (uint16_t) (terminal_raw_ptr - (char *)terminal);
+
+        dterminal->kernel_id = 0;
+        while (!ia_css_is_kernel_bitmap_empty(intersection)) {
+            intersection = ia_css_kernel_bitmap_shift(
+                    intersection);
+            dterminal->kernel_id++;
+        }
+        assert(dterminal->kernel_id > 0);
+        dterminal->kernel_id -= 1;
+
+        /* some terminal and fragment initialization */
+        dterminal->frame_descriptor.frame_format_type =
+            terminal_param->frame_format_type;
+        for (i = 0; i < IA_CSS_N_DATA_DIMENSION; i++) {
+            dterminal->frame_descriptor.dimension[i] =
+                terminal_param->dimensions[i];
+        }
+        dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] =
+            terminal_param->stride;
+        dterminal->frame_descriptor.bpp = terminal_param->bpp;
+        dterminal->frame_descriptor.bpe = terminal_param->bpe;
+        switch (dterminal->frame_descriptor.frame_format_type) {
+        case IA_CSS_DATA_FORMAT_UYVY:
+        case IA_CSS_DATA_FORMAT_YUYV:
+        case IA_CSS_DATA_FORMAT_YUV420_LINE:
+        case IA_CSS_DATA_FORMAT_Y800:
+        case IA_CSS_DATA_FORMAT_RGB565:
+        case IA_CSS_DATA_FORMAT_RGBA888:
+        case IA_CSS_DATA_FORMAT_BAYER_GRBG:
+        case IA_CSS_DATA_FORMAT_BAYER_RGGB:
+        case IA_CSS_DATA_FORMAT_BAYER_BGGR:
+        case IA_CSS_DATA_FORMAT_BAYER_GBRG:
+        case IA_CSS_DATA_FORMAT_RAW:
+        case IA_CSS_DATA_FORMAT_RAW_PACKED:
+        case IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED:
+        case IA_CSS_DATA_FORMAT_PAF_NON_INTERLEAVED:
+        case IA_CSS_DATA_FORMAT_PAF_INTERLEAVED:
+        case IA_CSS_DATA_FORMAT_IR:
+            dterminal->frame_descriptor.plane_count = 1;
+            dterminal->frame_descriptor.plane_offsets[0] = 0;
+            break;
+        case IA_CSS_DATA_FORMAT_NV12:
+        case IA_CSS_DATA_FORMAT_NV21:
+        case IA_CSS_DATA_FORMAT_NV16:
+        case IA_CSS_DATA_FORMAT_NV61:
+        case IA_CSS_DATA_FORMAT_P010:
+        case IA_CSS_DATA_FORMAT_P010_MSB:
+        case IA_CSS_DATA_FORMAT_P016:
+        case IA_CSS_DATA_FORMAT_P016_MSB:
+        case IA_CSS_DATA_FORMAT_P012_MSB:
+            dterminal->frame_descriptor.plane_count = 2;
+            dterminal->frame_descriptor.plane_offsets[0] = 0;
+            dterminal->frame_descriptor.plane_offsets[1] =
+                dterminal->frame_descriptor.plane_offsets[0] +
+                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
+                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
+            break;
+        case IA_CSS_DATA_FORMAT_P010_TILEY:
+        case IA_CSS_DATA_FORMAT_P016_TILEY:
+        case IA_CSS_DATA_FORMAT_P016_MSB_TILEY:
+        case IA_CSS_DATA_FORMAT_P010_MSB_TILEY:
+        case IA_CSS_DATA_FORMAT_NV12_TILEY:
+            dterminal->frame_descriptor.plane_count = 2;
+            dterminal->frame_descriptor.plane_offsets[0] = 0;
+            dterminal->frame_descriptor.plane_offsets[1] =
+                dterminal->frame_descriptor.plane_offsets[0] +
+                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
+                CEIL_MUL(dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION], 32);
+            break;
+        case IA_CSS_DATA_FORMAT_YUV444:
+        case IA_CSS_DATA_FORMAT_RGB888:
+        case IA_CSS_DATA_FORMAT_YUV420_VECTORIZED:
+            dterminal->frame_descriptor.plane_count = 3;
+            dterminal->frame_descriptor.plane_offsets[0] = 0;
+            dterminal->frame_descriptor.plane_offsets[1] =
+                dterminal->frame_descriptor.plane_offsets[0] +
+                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
+                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
+            dterminal->frame_descriptor.plane_offsets[2] =
+                dterminal->frame_descriptor.plane_offsets[1] +
+                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
+                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
+            break;
+        case IA_CSS_DATA_FORMAT_YUV420:
+        case IA_CSS_DATA_FORMAT_YV12:
+            dterminal->frame_descriptor.plane_count = 3;
+            dterminal->frame_descriptor.plane_offsets[0] = 0;
+            dterminal->frame_descriptor.plane_offsets[1] =
+                dterminal->frame_descriptor.plane_offsets[0] +
+                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
+                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
+            dterminal->frame_descriptor.plane_offsets[2] =
+                dterminal->frame_descriptor.plane_offsets[1] +
+                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
+                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/2;
+            break;
+        case IA_CSS_DATA_FORMAT_BAYER_PLANAR:
+            dterminal->frame_descriptor.plane_count = 4;
+            dterminal->frame_descriptor.plane_offsets[0] = 0;
+            dterminal->frame_descriptor.plane_offsets[1] =
+                dterminal->frame_descriptor.plane_offsets[0] +
+                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
+                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/2;
+            dterminal->frame_descriptor.plane_offsets[2] =
+                dterminal->frame_descriptor.plane_offsets[1] +
+                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
+                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/ 2;
+            dterminal->frame_descriptor.plane_offsets[3] =
+                dterminal->frame_descriptor.plane_offsets[2] +
+                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
+                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/2;
+            break;
+        default:
+            /* Unset, resulting in potential terminal connect issues */
+            dterminal->frame_descriptor.plane_count = 1;
+            dterminal->frame_descriptor.plane_offsets[0] = 0;
+            break;
+        }
+        /*
+         * Initial solution for single fragment initialization
+         * TODO:
+         * where to get the fragment description params from???
+         */
+        if (fragment_count > 0) {
+            ia_css_fragment_descriptor_t *fragment_descriptor =
+                (ia_css_fragment_descriptor_t *)
+                terminal_raw_ptr;
+
+            fragment_descriptor->index[IA_CSS_COL_DIMENSION] =
+                terminal_param->index[IA_CSS_COL_DIMENSION];
+            fragment_descriptor->index[IA_CSS_ROW_DIMENSION] =
+                terminal_param->index[IA_CSS_ROW_DIMENSION];
+            fragment_descriptor->offset[0] =
+                terminal_param->offset;
+            for (i = 0; i < IA_CSS_N_DATA_DIMENSION; i++) {
+                fragment_descriptor->dimension[i] =
+                    terminal_param->fragment_dimensions[i];
+            }
+        }
+        /* end fragment stuff */
+
+        /* Set the stream2gen_buffer_size to the full frame height. Driver should override it using dynamic API if smaller buffer size is required */
+        dterminal->stream2gen_buffer_size = dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
+    } else if (ia_css_is_terminal_manifest_parameter_terminal(manifest) ==
+            true) {
+        ia_css_param_terminal_t *pterminal =
+            (ia_css_param_terminal_t *)terminal;
+        uint16_t section_count =
+            ((const ia_css_param_terminal_manifest_t *)manifest)->
+            param_manifest_section_desc_count;
+        size_t curr_offset = 0;
+
+        pterminal->param_section_desc_offset =
+            sizeof(ia_css_param_terminal_t);
+
+        for (i = 0; i < section_count; i++) {
+            ia_css_param_section_desc_t *section =
+            ia_css_param_in_terminal_get_param_section_desc(
+                    pterminal, i);
+            const ia_css_param_manifest_section_desc_t *
+                man_section =
+        ia_css_param_terminal_manifest_get_prm_sct_desc(
+            (const ia_css_param_terminal_manifest_t *)manifest, i);
+
+            verifjmpexit(man_section != NULL);
+            verifjmpexit(section != NULL);
+
+            section->mem_size = man_section->max_mem_size;
+            section->mem_offset = curr_offset;
+            curr_offset += man_section->max_mem_size;
+        }
+    } else if (ia_css_is_terminal_manifest_program_terminal(manifest) ==
+            true &&
+        ia_css_terminal_manifest_get_type(manifest) ==
+        IA_CSS_TERMINAL_TYPE_PROGRAM) { /* for program terminal */
+        ia_css_program_terminal_t *prog_terminal =
+            (ia_css_program_terminal_t *)terminal;
+        const ia_css_program_terminal_manifest_t *prog_terminal_man =
+            (const ia_css_program_terminal_manifest_t *)manifest;
+        verifjmpexit(prog_terminal_man != NULL);
+
+        ia_css_kernel_fragment_sequencer_info_desc_t
+        *sequencer_info_desc_base = NULL;
+        uint16_t section_count = prog_terminal_man->
+        fragment_param_manifest_section_desc_count;
+        uint16_t manifest_info_count =
+            prog_terminal_man->
+            kernel_fragment_sequencer_info_manifest_info_count;
+        /* information needs to come from user or manifest once
+         * the size sizeof function is updated.
+         */
+        uint16_t nof_command_objs = 0;
+        size_t curr_offset = 0;
+
+        prog_terminal->kernel_fragment_sequencer_info_desc_offset =
+            sizeof(ia_css_program_terminal_t);
+        prog_terminal->fragment_param_section_desc_offset =
+            prog_terminal->
+            kernel_fragment_sequencer_info_desc_offset +
+            (fragment_count * manifest_info_count *
+            sizeof(ia_css_kernel_fragment_sequencer_info_desc_t)) +
+            (nof_command_objs *
+            sizeof(
+            ia_css_kernel_fragment_sequencer_command_desc_t));
+
+        NOT_USED(sequencer_info_desc_base);
+        /*Save fragments set fragment_count to 1*/
+        fragment_count = 1;
+        for (i = 0; i < fragment_count; i++) {
+            for (j = 0; j < section_count; j++) {
+                ia_css_fragment_param_section_desc_t *section =
+            ia_css_program_terminal_get_frgmnt_prm_sct_desc(
+                    prog_terminal, i, j, section_count);
+            const ia_css_fragment_param_manifest_section_desc_t *
+            man_section =
+ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc
+                (prog_terminal_man, j);
+
+                verifjmpexit(man_section != NULL);
+                verifjmpexit(section != NULL);
+
+                section->mem_size = man_section->max_mem_size;
+                section->mem_offset = curr_offset;
+                curr_offset += man_section->max_mem_size;
+            }
+
+            sequencer_info_desc_base =
+        ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
+                    prog_terminal, i, 0,
+                    manifest_info_count);
+        prog_terminal->payload_fragment_stride = curr_offset;
+
+            /*
+             * This offset cannot be initialized properly
+             * since the number of commands in every sequencer
+             * is not known at this point
+             */
+            /*for (j = 0; j < manifest_info_count; j++) {
+                sequencer_info_desc_base[j].
+                    command_desc_offset =
+                prog_terminal->
+                kernel_fragment_sequencer_info_desc_offset +
+                (manifest_info_count *
+                sizeof(
+                ia_css_kernel_fragment_sequencer_info_desc_t) +
+                (nof_command_objs *
+                sizeof(
+                ia_css_kernel_fragment_sequencer_command_desc_t
+                ));
+            }*/
+        }
+    } else if (ia_css_is_terminal_manifest_spatial_parameter_terminal(
+                manifest) == true) {
+        ia_css_spatial_param_terminal_t *spatial_param_terminal =
+            (ia_css_spatial_param_terminal_t *)terminal;
+        ia_css_spatial_param_terminal_manifest_t *
+            spatia_param_terminal_man =
+            (ia_css_spatial_param_terminal_manifest_t *)manifest;
+
+        /* Initialize the spatial terminal structure */
+        spatial_param_terminal->fragment_grid_desc_offset =
+            sizeof(ia_css_spatial_param_terminal_t);
+        spatial_param_terminal->frame_grid_param_section_desc_offset =
+            spatial_param_terminal->fragment_grid_desc_offset +
+            (fragment_count * sizeof(ia_css_fragment_grid_desc_t));
+        spatial_param_terminal->kernel_id =
+            spatia_param_terminal_man->kernel_id;
+    } else if (ia_css_is_terminal_manifest_sliced_terminal(manifest) ==
+            true) {
+        ia_css_sliced_param_terminal_t *sliced_param_terminal =
+            (ia_css_sliced_param_terminal_t *)terminal;
+        ia_css_sliced_param_terminal_manifest_t
+        *sliced_param_terminal_man =
+            (ia_css_sliced_param_terminal_manifest_t *)manifest;
+
+        /* Initialize the sliced terminal structure */
+        sliced_param_terminal->fragment_slice_desc_offset =
+            sizeof(ia_css_sliced_param_terminal_t);
+        sliced_param_terminal->kernel_id =
+            sliced_param_terminal_man->kernel_id;
+    } else if (ia_css_is_terminal_manifest_program_control_init_terminal(
+            manifest) == true) {
+        ia_css_program_group_manifest_t *pg_manifest =
+            ia_css_terminal_manifest_get_parent(manifest);
+        ia_css_program_group_param_t *pg_param =
+            ia_css_terminal_param_get_parent(terminal_param);
+        ia_css_kernel_bitmap_t kernel_bitmap;
+
+        verifjmpexit(pg_manifest != NULL && pg_param != NULL);
+        kernel_bitmap =
+            ia_css_program_group_param_get_kernel_enable_bitmap(pg_param);
+
+        verifjmpexit(ia_css_program_control_init_terminal_init(
+            (ia_css_program_control_init_terminal_t *)
+            terminal,
+            (const ia_css_program_control_init_terminal_manifest_t *)
+            manifest, pg_manifest, kernel_bitmap) == 0);
+    } else {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_create failed, not a data or param terminal. Returning (%i)\n",
+            EFAULT);
+        goto EXIT;
+    }
+
+    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
+                   "ia_css_terminal_create(): Created successfully terminal %p, terminal ID = %d\n", terminal,
+                   terminal->ID);
+
+    retval = 0;
+EXIT:
+    if (NULL == manifest) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_terminal_create invalid argument\n");
+    }
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+            "ia_css_terminal_create failed (%i)\n", retval);
+        terminal = ia_css_terminal_destroy(terminal);
+    }
+    return terminal;
+}
+
+ia_css_terminal_t *ia_css_terminal_destroy(
+    ia_css_terminal_t *terminal)
+{
+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+        "ia_css_terminal_destroy(terminal %p): enter:\n", terminal);
+    return terminal;
+}
+
+uint16_t ia_css_param_terminal_compute_section_count(
+    const ia_css_terminal_manifest_t *manifest,
+    const ia_css_program_group_param_t *param) /* Delete 2nd argument*/
+{
+    uint16_t section_count = 0;
+
+    NOT_USED(param);
+
+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+        "ia_css_param_terminal_compute_section_count(): enter:\n");
+
+    verifexit(manifest != NULL);
+    section_count = ((const ia_css_param_terminal_manifest_t *)manifest)->
+                param_manifest_section_desc_count;
+EXIT:
+    if (NULL == manifest || NULL == param) {
+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+            "ia_css_param_terminal_compute_section_count: invalid argument\n");
+    }
+    return section_count;
+}
+#endif /* !defined(__VIED_CELL) */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal_manifest.c
new file mode 100644
index 000000000000..dcb58a915aca
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal_manifest.c
@@ -0,0 +1,776 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <ia_css_psys_terminal_manifest.h>
+
+/* Data object types on the terminals */
+#include <ia_css_program_group_data.h>
+/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_clear, ia_css_... */
+#include <ia_css_kernel_bitmap.h>
+
+#include "ia_css_psys_program_group_private.h"
+#include "ia_css_terminal_manifest.h"
+#include "ia_css_terminal_manifest_types.h"
+
+#include <error_support.h>
+#include <print_support.h>
+#include <misc_support.h>
+#include "ia_css_psys_static_trace.h"
+
+#ifndef __IA_CSS_PSYS_STATIC_INLINE__
+#include "ia_css_psys_terminal_manifest_impl.h"
+#endif
+#include "ia_css_terminal_manifest.h"
+
+/* We need to refactor those files in order to build in the firmware only
+   what is needed, switches are put current to workaround compilation problems
+   in the firmware (for example lack of uint64_t support)
+   supported in the firmware
+  */
+#if !defined(__HIVECC)
+static const char *terminal_type_strings[IA_CSS_N_TERMINAL_TYPES + 1] = {
+    "IA_CSS_TERMINAL_TYPE_DATA_IN",
+    "IA_CSS_TERMINAL_TYPE_DATA_OUT",
+    "IA_CSS_TERMINAL_TYPE_PARAM_STREAM",
+    /**< Type 1-5 parameter input */
+    "IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN",
+    /**< Type 1-5 parameter output */
+    "IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT",
+    /**< Represent the new type of terminal for
+     * the "spatial dependent parameters", when params go in
+     */
+    "IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN",
+    /**< Represent the new type of terminal for
+     * the "spatial dependent parameters", when params go out
+     */
+    "IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT",
+    /**< Represent the new type of terminal for
+     * the explicit slicing, when params go in
+     */
+    "IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN",
+    /**< Represent the new type of terminal for
+     * the explicit slicing, when params go out
+     */
+    "IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT",
+    /**< State (private data) input */
+    "IA_CSS_TERMINAL_TYPE_STATE_IN",
+    /**< State (private data) output */
+    "IA_CSS_TERMINAL_TYPE_STATE_OUT",
+    "IA_CSS_TERMINAL_TYPE_PROGRAM",
+    "IA_CSS_TERMINAL_TYPR_PROGRAM_CONTROL_INIT",
+    "UNDEFINED_TERMINAL_TYPE"};
+
+int ia_css_data_terminal_manifest_set_kernel_bitmap_unique(
+    ia_css_data_terminal_manifest_t *manifest,
+    const unsigned int index)
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_data_terminal_manifest_set_kernel_bitmap_unique(): enter:\n");
+
+    if (manifest != NULL) {
+        ia_css_kernel_bitmap_t kernel_bitmap =
+                    ia_css_kernel_bitmap_clear();
+
+        kernel_bitmap = ia_css_kernel_bitmap_set(kernel_bitmap, index);
+        verifexit(!ia_css_is_kernel_bitmap_empty(kernel_bitmap));
+        verifexit(ia_css_data_terminal_manifest_set_kernel_bitmap(
+                manifest, kernel_bitmap) == 0);
+        retval = 0;
+    }
+
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+            "ia_css_data_terminal_manifest_set_kernel_bitmap_unique failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+int ia_css_data_terminal_manifest_set_min_size(
+    ia_css_data_terminal_manifest_t    *manifest,
+    const uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_data_terminal_manifest_set_min_size(): enter:\n");
+
+    verifexit(manifest != NULL);
+
+    manifest->min_size[IA_CSS_COL_DIMENSION] =
+        min_size[IA_CSS_COL_DIMENSION];
+    manifest->min_size[IA_CSS_ROW_DIMENSION] =
+        min_size[IA_CSS_ROW_DIMENSION];
+    retval = 0;
+
+EXIT:
+    if (NULL == manifest) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+            "ia_css_data_terminal_manifest_set_min_size: invalid argument\n");
+    }
+    return retval;
+}
+
+int ia_css_data_terminal_manifest_set_max_size(
+    ia_css_data_terminal_manifest_t    *manifest,
+    const uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_data_terminal_manifest_set_max_size(): enter:\n");
+
+    verifexit(manifest != NULL);
+
+    manifest->max_size[IA_CSS_COL_DIMENSION] =
+        max_size[IA_CSS_COL_DIMENSION];
+    manifest->max_size[IA_CSS_ROW_DIMENSION] =
+        max_size[IA_CSS_ROW_DIMENSION];
+    retval = 0;
+
+EXIT:
+    if (NULL == manifest) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+            "ia_css_data_terminal_manifest_set_max_size: invalid argument\n");
+    }
+    return retval;
+}
+#endif
+
+int ia_css_data_terminal_manifest_get_min_size(
+    const ia_css_data_terminal_manifest_t *manifest,
+    uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_data_terminal_manifest_get_min_size(): enter:\n");
+
+    verifexit(manifest != NULL);
+
+    min_size[IA_CSS_COL_DIMENSION] =
+        manifest->min_size[IA_CSS_COL_DIMENSION];
+    min_size[IA_CSS_ROW_DIMENSION] =
+        manifest->min_size[IA_CSS_ROW_DIMENSION];
+    retval = 0;
+
+EXIT:
+    if (NULL == manifest) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+            "ia_css_data_terminal_manifest_get_min_size: invalid argument\n");
+    }
+    return retval;
+}
+
+int ia_css_data_terminal_manifest_get_max_size(
+    const ia_css_data_terminal_manifest_t *manifest,
+    uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_data_terminal_manifest_get_max_size(): enter:\n");
+
+    verifexit(manifest != NULL);
+
+    max_size[IA_CSS_COL_DIMENSION] =
+        manifest->max_size[IA_CSS_COL_DIMENSION];
+    max_size[IA_CSS_ROW_DIMENSION] =
+        manifest->max_size[IA_CSS_ROW_DIMENSION];
+    retval = 0;
+
+EXIT:
+    if (NULL == manifest) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+            "ia_css_data_terminal_manifest_get_max_size: invalid argument\n");
+    }
+    return retval;
+}
+
+#if !defined(__HIVECC)
+int ia_css_data_terminal_manifest_set_min_fragment_size(
+    ia_css_data_terminal_manifest_t    *manifest,
+    const uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_data_terminal_manifest_set_min_fragment_size(): enter:\n");
+
+    verifexit(manifest != NULL);
+
+    manifest->min_fragment_size[IA_CSS_COL_DIMENSION] =
+        min_size[IA_CSS_COL_DIMENSION];
+    manifest->min_fragment_size[IA_CSS_ROW_DIMENSION] =
+        min_size[IA_CSS_ROW_DIMENSION];
+    retval = 0;
+
+EXIT:
+    if (NULL == manifest) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+            "ia_css_data_terminal_manifest_set_min_fragment_size invalid argument\n");
+    }
+    return retval;
+}
+
+int ia_css_data_terminal_manifest_set_max_fragment_size(
+    ia_css_data_terminal_manifest_t    *manifest,
+    const uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_data_terminal_manifest_set_max_fragment_size(): enter:\n");
+
+    verifexit(manifest != NULL);
+
+    manifest->max_fragment_size[IA_CSS_COL_DIMENSION] =
+        max_size[IA_CSS_COL_DIMENSION];
+    manifest->max_fragment_size[IA_CSS_ROW_DIMENSION] =
+        max_size[IA_CSS_ROW_DIMENSION];
+    retval = 0;
+
+EXIT:
+    if (NULL == manifest) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+            "ia_css_data_terminal_manifest_set_max_fragment_size invalid argument\n");
+    }
+    return retval;
+}
+#endif
+
+int ia_css_data_terminal_manifest_get_min_fragment_size(
+    const ia_css_data_terminal_manifest_t *manifest,
+    uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_data_terminal_manifest_get_min_fragment_size(): enter:\n");
+
+    verifexit(manifest != NULL);
+
+    min_size[IA_CSS_COL_DIMENSION] =
+        manifest->min_fragment_size[IA_CSS_COL_DIMENSION];
+    min_size[IA_CSS_ROW_DIMENSION] =
+        manifest->min_fragment_size[IA_CSS_ROW_DIMENSION];
+    retval = 0;
+
+EXIT:
+    if (NULL == manifest) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+            "ia_css_data_terminal_manifest_get_min_fragment_size invalid argument\n");
+    }
+    return retval;
+}
+
+int ia_css_data_terminal_manifest_get_max_fragment_size(
+    const ia_css_data_terminal_manifest_t *manifest,
+    uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
+{
+    int retval = -1;
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+        "ia_css_data_terminal_manifest_get_max_fragment_size(): enter:\n");
+
+    verifexit(manifest != NULL);
+
+    max_size[IA_CSS_COL_DIMENSION] =
+        manifest->max_fragment_size[IA_CSS_COL_DIMENSION];
+    max_size[IA_CSS_ROW_DIMENSION] =
+        manifest->max_fragment_size[IA_CSS_ROW_DIMENSION];
+    retval = 0;
+
+EXIT:
+    if (NULL == manifest) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+            "ia_css_data_terminal_manifest_get_max_fragment_size invalid argument\n");
+    }
+    return retval;
+}
+
+/* We need to refactor those files in order to build in the firmware only
+   what is needed, switches are put current to workaround compilation problems
+   in the firmware (for example lack of uint64_t support)
+   supported in the firmware
+  */
+#if !defined(__HIVECC)
+
+#define PRINT_DIMENSION(name, var) IA_CSS_TRACE_3(PSYSAPI_STATIC, \
+    INFO, "%s:\t%d %d\n", \
+    (name), \
+    (var)[IA_CSS_COL_DIMENSION], \
+    (var)[IA_CSS_ROW_DIMENSION])
+
+int ia_css_terminal_manifest_print(
+    const ia_css_terminal_manifest_t *manifest,
+    void *fid)
+{
+    int retval = -1;
+    ia_css_terminal_type_t terminal_type =
+        ia_css_terminal_manifest_get_type(manifest);
+
+    IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
+        "ia_css_terminal_manifest_print(): enter:\n");
+
+    verifexit(manifest != NULL);
+    NOT_USED(fid);
+    NOT_USED(terminal_type_strings);
+
+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "sizeof(manifest) = %d\n",
+        (int)ia_css_terminal_manifest_get_size(manifest));
+#ifndef __XTENSA_FW__
+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "typeof(manifest) = %s\n",
+            terminal_type_strings[terminal_type]);
+#endif
+    if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
+        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) {
+        ia_css_param_terminal_manifest_t *pterminal_manifest =
+            (ia_css_param_terminal_manifest_t *)manifest;
+        uint16_t section_count =
+            pterminal_manifest->param_manifest_section_desc_count;
+        int    i;
+
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "sections(manifest) = %d\n", (int)section_count);
+        for (i = 0; i < section_count; i++) {
+            const ia_css_param_manifest_section_desc_t *manifest =
+        ia_css_param_terminal_manifest_get_prm_sct_desc(
+            pterminal_manifest, i);
+            verifjmpexit(manifest != NULL);
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+                "kernel_id = %d\n", (int)ia_css_param_manifest_section_desc_get_kernel_id(manifest));
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+                "mem_type_id = %d\n",
+                (int)ia_css_param_manifest_section_desc_get_mem_type_id(manifest));
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+                "max_mem_size = %d\n",
+                (int)manifest->max_mem_size);
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+                "region_id = %d\n",
+                (int)ia_css_param_manifest_section_desc_get_region_id(manifest));
+        }
+    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN ||
+        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT) {
+        ia_css_sliced_param_terminal_manifest_t
+        *sliced_terminal_manifest =
+            (ia_css_sliced_param_terminal_manifest_t *)manifest;
+        uint32_t kernel_id;
+        uint16_t section_count;
+        uint16_t section_idx;
+
+        kernel_id = sliced_terminal_manifest->kernel_id;
+        section_count =
+            sliced_terminal_manifest->sliced_param_section_count;
+
+        NOT_USED(kernel_id);
+
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "kernel_id = %d\n", (int)kernel_id);
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "section_count = %d\n", (int)section_count);
+
+        for (section_idx = 0; section_idx < section_count;
+            section_idx++) {
+            ia_css_sliced_param_manifest_section_desc_t
+                *sliced_param_manifest_section_desc;
+
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+                "section %d\n", (int)section_idx);
+            sliced_param_manifest_section_desc =
+        ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
+                sliced_terminal_manifest, section_idx);
+            verifjmpexit(sliced_param_manifest_section_desc !=
+                NULL);
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+                "mem_type_id = %d\n",
+            (int)sliced_param_manifest_section_desc->mem_type_id);
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+                "region_id = %d\n",
+            (int)sliced_param_manifest_section_desc->region_id);
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+                "max_mem_size = %d\n",
+            (int)sliced_param_manifest_section_desc->max_mem_size);
+        }
+    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM) {
+        ia_css_program_terminal_manifest_t *program_terminal_manifest =
+            (ia_css_program_terminal_manifest_t *)manifest;
+        uint32_t sequencer_info_kernel_id;
+        uint16_t max_kernel_fragment_sequencer_command_desc;
+        uint16_t kernel_fragment_sequencer_info_manifest_info_count;
+        uint16_t seq_info_idx;
+        uint16_t section_count =
+            program_terminal_manifest->fragment_param_manifest_section_desc_count;
+        uint16_t sec_idx;
+
+        sequencer_info_kernel_id =
+            program_terminal_manifest->sequencer_info_kernel_id;
+        max_kernel_fragment_sequencer_command_desc =
+            program_terminal_manifest->
+            max_kernel_fragment_sequencer_command_desc;
+        kernel_fragment_sequencer_info_manifest_info_count =
+            program_terminal_manifest->
+            kernel_fragment_sequencer_info_manifest_info_count;
+
+        NOT_USED(sequencer_info_kernel_id);
+        NOT_USED(max_kernel_fragment_sequencer_command_desc);
+
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "sequencer_info_kernel_id = %d\n",
+            (int)sequencer_info_kernel_id);
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "max_kernel_fragment_sequencer_command_desc = %d\n",
+            (int)max_kernel_fragment_sequencer_command_desc);
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "kernel_fragment_sequencer_info_manifest_info_count = %d\n",
+            (int)
+            kernel_fragment_sequencer_info_manifest_info_count);
+
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "fragment_param_manifest_section_desc_count = %d\n", (int)section_count);
+        for (sec_idx = 0; sec_idx < section_count; sec_idx++) {
+            const ia_css_fragment_param_manifest_section_desc_t *ptmanifest =
+        ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
+            program_terminal_manifest, sec_idx);
+            NOT_USED(ptmanifest);
+            verifjmpexit(manifest != NULL);
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+                "kernel_id = %d\n", (int)ia_css_fragment_param_manifest_section_desc_get_kernel_id(ptmanifest));
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+                "mem_type_id = %d\n",
+                (int)ia_css_fragment_param_manifest_section_desc_get_mem_type_id(ptmanifest));
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+                "max_mem_size = %d\n",
+                (int)ptmanifest->max_mem_size);
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+                "region_id = %d\n",
+                (int)ia_css_fragment_param_manifest_section_desc_get_region_id(ptmanifest));
+        }
+        for (seq_info_idx = 0; seq_info_idx <
+            kernel_fragment_sequencer_info_manifest_info_count;
+                seq_info_idx++) {
+            ia_css_kernel_fragment_sequencer_info_manifest_desc_t
+                *sequencer_info_manifest_desc;
+
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+                "sequencer info %d\n", (int)seq_info_idx);
+            sequencer_info_manifest_desc =
+        ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc
+                (program_terminal_manifest, seq_info_idx);
+            verifjmpexit(sequencer_info_manifest_desc != NULL);
+            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+                "min_fragment_grid_slice_dimension[] = {%d, %d}\n",
+                (int)sequencer_info_manifest_desc->
+                min_fragment_grid_slice_dimension[
+                        IA_CSS_COL_DIMENSION],
+                (int)sequencer_info_manifest_desc->
+                min_fragment_grid_slice_dimension[
+                        IA_CSS_ROW_DIMENSION]);
+            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+                "max_fragment_grid_slice_dimension[] = {%d, %d}\n",
+                (int)sequencer_info_manifest_desc->
+                max_fragment_grid_slice_dimension[
+                        IA_CSS_COL_DIMENSION],
+                (int)sequencer_info_manifest_desc->
+                max_fragment_grid_slice_dimension[
+                        IA_CSS_ROW_DIMENSION]);
+            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+                "min_fragment_grid_slice_count[] = {%d, %d}\n",
+                (int)sequencer_info_manifest_desc->
+                min_fragment_grid_slice_count[
+                        IA_CSS_COL_DIMENSION],
+                (int)sequencer_info_manifest_desc->
+                min_fragment_grid_slice_count[
+                        IA_CSS_ROW_DIMENSION]);
+            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+                "max_fragment_grid_slice_count[] = {%d, %d}\n",
+                (int)sequencer_info_manifest_desc->
+                max_fragment_grid_slice_count[
+                        IA_CSS_COL_DIMENSION],
+                (int)sequencer_info_manifest_desc->
+                max_fragment_grid_slice_count[
+                        IA_CSS_ROW_DIMENSION]);
+            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+                "min_fragment_grid_point_decimation_factor[] = {%d, %d}\n",
+                (int)sequencer_info_manifest_desc->
+                min_fragment_grid_point_decimation_factor[
+                        IA_CSS_COL_DIMENSION],
+                (int)sequencer_info_manifest_desc->
+                min_fragment_grid_point_decimation_factor[
+                        IA_CSS_ROW_DIMENSION]);
+            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+                "max_fragment_grid_point_decimation_factor[] = {%d, %d}\n",
+                (int)sequencer_info_manifest_desc->
+                max_fragment_grid_point_decimation_factor[
+                        IA_CSS_COL_DIMENSION],
+                (int)sequencer_info_manifest_desc->
+                max_fragment_grid_point_decimation_factor[
+                        IA_CSS_ROW_DIMENSION]);
+            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+                "min_fragment_grid_overlay_on_pixel_topleft_index[] = {%d, %d}\n",
+                (int)sequencer_info_manifest_desc->
+            min_fragment_grid_overlay_pixel_topleft_index[
+                        IA_CSS_COL_DIMENSION],
+                (int)sequencer_info_manifest_desc->
+            min_fragment_grid_overlay_pixel_topleft_index[
+                        IA_CSS_ROW_DIMENSION]);
+            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+                "max_fragment_grid_overlay_on_pixel_topleft_index[] = {%d, %d}\n",
+                (int)sequencer_info_manifest_desc->
+            max_fragment_grid_overlay_pixel_topleft_index[
+                        IA_CSS_COL_DIMENSION],
+                (int)sequencer_info_manifest_desc->
+            max_fragment_grid_overlay_pixel_topleft_index[
+                        IA_CSS_ROW_DIMENSION]);
+            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+                "min_fragment_grid_overlay_on_pixel_dimension[] = {%d, %d}\n",
+                (int)sequencer_info_manifest_desc->
+                min_fragment_grid_overlay_pixel_dimension[
+                        IA_CSS_COL_DIMENSION],
+                (int)sequencer_info_manifest_desc->
+                min_fragment_grid_overlay_pixel_dimension[
+                        IA_CSS_ROW_DIMENSION]);
+            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+                "max_fragment_grid_overlay_on_pixel_dimension[] = {%d, %d}\n",
+                (int)sequencer_info_manifest_desc->
+                max_fragment_grid_overlay_pixel_dimension[
+                        IA_CSS_COL_DIMENSION],
+                (int)sequencer_info_manifest_desc->
+                max_fragment_grid_overlay_pixel_dimension[
+                        IA_CSS_ROW_DIMENSION]);
+        }
+    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) {
+        ia_css_program_control_init_terminal_manifest_t *progctrlinit_man =
+            (ia_css_program_control_init_terminal_manifest_t *)manifest;
+        ia_css_program_control_init_terminal_manifest_print(progctrlinit_man);
+    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN ||
+        terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) {
+
+        ia_css_data_terminal_manifest_t *dterminal_manifest =
+            (ia_css_data_terminal_manifest_t *)manifest;
+        int i;
+
+        NOT_USED(dterminal_manifest);
+
+        verifexit(ia_css_kernel_bitmap_print(
+            ia_css_data_terminal_manifest_get_kernel_bitmap(
+                dterminal_manifest), fid) == 0);
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "formats(manifest) = %04x\n",
+        (int)ia_css_data_terminal_manifest_get_frame_format_bitmap(
+            dterminal_manifest));
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "connection(manifest) = %04x\n",
+        (int)ia_css_data_terminal_manifest_get_connection_bitmap(
+            dterminal_manifest));
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "dependent(manifest) = %d\n",
+            (int)dterminal_manifest->terminal_dependency);
+
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\tmin_size[%d]   = {\n",
+            IA_CSS_N_DATA_DIMENSION);
+        for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+                "\t\t%4d,\n", dterminal_manifest->min_size[i]);
+        }
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\t\t%4d }\n", dterminal_manifest->min_size[i]);
+
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\tmax_size[%d]   = {\n", IA_CSS_N_DATA_DIMENSION);
+        for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\t\t%4d,\n", dterminal_manifest->max_size[i]);
+        }
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\t\t%4d }\n", dterminal_manifest->max_size[i]);
+
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\tmin_fragment_size[%d]   = {\n",
+            IA_CSS_N_DATA_DIMENSION);
+        for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+                "\t\t%4d,\n",
+                dterminal_manifest->min_fragment_size[i]);
+        }
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\t\t%4d }\n",
+            dterminal_manifest->min_fragment_size[i]);
+
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\tmax_fragment_size[%d]   = {\n",
+            IA_CSS_N_DATA_DIMENSION);
+        for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+                "\t\t%4d,\n",
+                dterminal_manifest->max_fragment_size[i]);
+        }
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+            "\t\t%4d }\n",
+            dterminal_manifest->max_fragment_size[i]);
+
+    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN ||
+        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT) {
+
+        ia_css_spatial_param_terminal_manifest_t *stm =
+            (ia_css_spatial_param_terminal_manifest_t *)manifest;
+        ia_css_frame_grid_param_manifest_section_desc_t *sec;
+        int sec_count =
+            stm->frame_grid_param_manifest_section_desc_count;
+        int sec_index;
+
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "kernel_id:\t\t%d\n",
+            stm->kernel_id);
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "compute_units_p_elem:\t%d\n",
+            stm->compute_units_p_elem);
+#ifndef __XTENSA_FW__
+        PRINT_DIMENSION("min_fragment_grid_dimension",
+            stm->common_fragment_grid_desc.min_fragment_grid_dimension);
+        PRINT_DIMENSION("max_fragment_grid_dimension",
+            stm->common_fragment_grid_desc.max_fragment_grid_dimension);
+        PRINT_DIMENSION("min_frame_grid_dimension",
+            stm->frame_grid_desc.min_frame_grid_dimension);
+        PRINT_DIMENSION("max_frame_grid_dimension",
+            stm->frame_grid_desc.max_frame_grid_dimension);
+#endif
+        for (sec_index = 0; sec_index < sec_count; sec_index++) {
+            sec = ia_css_spatial_param_terminal_manifest_get_frm_grid_prm_sct_desc(
+                stm, sec_index);
+            verifjmpexit(sec != NULL);
+
+            IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO, "--------------------------\n");
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tmem_type_id:\t%d\n",
+                sec->mem_type_id);
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tregion_id:\t%d\n",
+                sec->region_id);
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\telem_size:\t%d\n",
+                sec->elem_size);
+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tmax_mem_size:\t%d\n",
+                sec->max_mem_size);
+        }
+    } else if (terminal_type < IA_CSS_N_TERMINAL_TYPES) {
+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+            "terminal type can not be pretty printed, not supported\n");
+    }
+
+    retval = 0;
+EXIT:
+    if (retval != 0) {
+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+            "ia_css_terminal_manifest_print failed (%i)\n",
+            retval);
+    }
+    return retval;
+}
+
+/* Program control init Terminal */
+unsigned int ia_css_program_control_init_terminal_manifest_get_connect_section_count(
+    const ia_css_program_control_init_manifest_program_desc_t *prog)
+{
+    assert(prog);
+    return prog->connect_section_count;
+}
+
+unsigned int ia_css_program_control_init_terminal_manifest_get_load_section_count(
+    const ia_css_program_control_init_manifest_program_desc_t *prog)
+{
+    assert(prog);
+    return prog->load_section_count;
+}
+
+unsigned int ia_css_program_control_init_terminal_manifest_get_size(
+    const uint16_t nof_programs,
+    const uint16_t *nof_load_sections,
+    const uint16_t *nof_connect_sections)
+{
+    (void)nof_load_sections; /* might be needed in future */
+    (void)nof_connect_sections; /* might be needed in future */
+
+    return sizeof(ia_css_program_control_init_terminal_manifest_t) +
+        nof_programs *
+        sizeof(ia_css_program_control_init_manifest_program_desc_t);
+}
+
+ia_css_program_control_init_manifest_program_desc_t *
+ia_css_program_control_init_terminal_manifest_get_program_desc(
+    const ia_css_program_control_init_terminal_manifest_t *terminal,
+    unsigned int program)
+{
+    ia_css_program_control_init_manifest_program_desc_t *progs;
+
+    assert(terminal != NULL);
+    assert(program < terminal->program_count);
+
+    progs = (ia_css_program_control_init_manifest_program_desc_t *)
+        ((const char *)terminal + terminal->program_desc_offset);
+
+    return &progs[program];
+}
+
+int ia_css_program_control_init_terminal_manifest_init(
+    ia_css_program_control_init_terminal_manifest_t *terminal,
+    const uint16_t nof_programs,
+    const uint16_t *nof_load_sections,
+    const uint16_t *nof_connect_sections)
+{
+    unsigned int i;
+    ia_css_program_control_init_manifest_program_desc_t *progs;
+
+    if (terminal == NULL) {
+        return -EFAULT;
+    }
+
+    terminal->program_count = nof_programs;
+    terminal->program_desc_offset =
+        sizeof(ia_css_program_control_init_terminal_manifest_t);
+
+    progs = ia_css_program_control_init_terminal_manifest_get_program_desc(
+        terminal, 0);
+
+    for (i = 0; i < nof_programs; i++) {
+        progs[i].load_section_count = nof_load_sections[i];
+        progs[i].connect_section_count = nof_connect_sections[i];
+    }
+    return 0;
+}
+
+void ia_css_program_control_init_terminal_manifest_print(
+    ia_css_program_control_init_terminal_manifest_t *terminal)
+{
+    unsigned int i;
+
+    ia_css_program_control_init_manifest_program_desc_t *progs;
+
+    progs = ia_css_program_control_init_terminal_manifest_get_program_desc(
+        terminal, 0);
+
+    assert(progs);
+    (void)progs;
+
+    for (i = 0; i < terminal->program_count; i++) {
+        IA_CSS_TRACE_3(PSYSAPI_STATIC, INFO,
+            "program index: %d, load sec: %d, connect sec: %d\n",
+            i,
+            progs[i].load_section_count,
+            progs[i].connect_section_count);
+    }
+}
+
+#endif
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_rbm.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_rbm.c
new file mode 100644
index 000000000000..85982fb184a4
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_rbm.c
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_RBM_INLINE__
+#include "ia_css_rbm_impl.h"
+#endif /* __IA_CSS_RBM_INLINE__ */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal.c
new file mode 100644
index 000000000000..4a124962fefb
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal.c
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifdef __INLINE_PARAMETERS__
+#include "storage_class.h"
+STORAGE_CLASS_INLINE int __ia_css_param_avoid_warning_on_empty_file(void) { return 0; }
+#else /* __INLINE_PARAMETERS__ */
+#include "ia_css_terminal_impl.h"
+#endif /* __INLINE_PARAMETERS__ */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal_manifest.c
new file mode 100644
index 000000000000..d051f1d38657
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal_manifest.c
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifdef __INLINE_PARAMETERS__
+#include "storage_class.h"
+STORAGE_CLASS_INLINE int __ia_css_param_avoid_warning_on_empty_file(void) { return 0; }
+#else /* __INLINE_PARAMETERS__ */
+#include "ia_css_terminal_manifest_impl.h"
+#endif /* __INLINE_PARAMETERS__ */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/vied_nci_psys_system.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/vied_nci_psys_system.c
new file mode 100644
index 000000000000..8d69d999c9ba
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/vied_nci_psys_system.c
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ia_css_psys_sim_storage_class.h"
+
+/*
+ * Functions to possibly inline
+ */
+
+#ifdef __IA_CSS_PSYS_SIM_INLINE__
+STORAGE_CLASS_INLINE int
+__ia_css_psys_system_global_avoid_warning_on_empty_file(void) { return 0; }
+#else /* __IA_CSS_PSYS_SIM_INLINE__ */
+#include "psys_system_global_impl.h"
+#endif /* __IA_CSS_PSYS_SIM_INLINE__ */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/assert_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/assert_support.h
new file mode 100644
index 000000000000..1cd354e845a1
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/assert_support.h
@@ -0,0 +1,210 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ASSERT_SUPPORT_H
+#define __ASSERT_SUPPORT_H
+
+/* This file provides support for run-time assertions
+ * and compile-time assertions.
+ *
+ * Run-time asstions are provided via the following syntax:
+ *     assert(condition)
+ * Run-time assertions are disabled using the NDEBUG flag.
+ *
+ * Compile time assertions are provided via the following syntax:
+ *     COMPILATION_ERROR_IF(condition);
+ * A compile-time assertion will fail to compile if the condition is false.
+ * The condition must be constant, such that it can be evaluated
+ * at compile time.
+ *
+ * OP___assert is deprecated.
+ */
+
+#define IA_CSS_ASSERT(expr) assert(expr)
+
+#ifdef __KLOCWORK__
+/* Klocwork does not see that assert will lead to abortion
+ * as there is no good way to tell this to KW and the code
+ * should not depend on assert to function (actually the assert
+ * could be disabled in a release build) it was decided to
+ * disable the assert for KW scans (by defining NDEBUG)
+ * see also:
+ * http://www.klocwork.com/products/documentation/current/
+ * Tuning_C/C%2B%2B_analysis#Assertions
+ */
+#define NDEBUG
+#endif /* __KLOCWORK__ */
+
+/**
+ * The following macro can help to test the size of a struct at compile
+ * time rather than at run-time. It does not work for all compilers; see
+ * below.
+ *
+ * Depending on the value of 'condition', the following macro is expanded to:
+ * - condition==true:
+ *     an expression containing an array declaration with negative size,
+ *     usually resulting in a compilation error
+ * - condition==false:
+ *     (void) 1; // C statement with no effect
+ *
+ * example:
+ *  COMPILATION_ERROR_IF( sizeof(struct host_sp_queues) !=
+ *			SIZE_OF_HOST_SP_QUEUES_STRUCT);
+ *
+ * verify that the macro indeed triggers a compilation error with your compiler:
+ *  COMPILATION_ERROR_IF( sizeof(struct host_sp_queues) !=
+ *			(sizeof(struct host_sp_queues)+1) );
+ *
+ * Not all compilers will trigger an error with this macro;
+ * use a search engine to search for BUILD_BUG_ON to find other methods.
+ */
+#ifdef __XTENSA_FW__
+
+#include "assert_support_xtensa.h"
+
+#else
+
+#define COMPILATION_ERROR_IF(condition) \
+((void)sizeof(char[1 - 2*!!(condition)]))
+
+#endif
+/* Compile time assertion */
+#ifndef CT_ASSERT
+#define CT_ASSERT(cnd) ((void)sizeof(char[(cnd)?1 :  -1]))
+#endif /* CT_ASSERT */
+
+#ifdef NDEBUG
+
+#define assert(cnd) ((void)0)
+
+#else
+
+#include "storage_class.h"
+
+#if defined(_MSC_VER)
+#ifdef _KERNEL_MODE
+/* Windows kernel mode compilation */
+#include <ntddk.h>
+#define assert(cnd) ASSERT(cnd)
+#else
+/* Windows usermode compilation */
+#include <assert.h>
+#endif
+
+#elif defined(__XTENSA_FW__)
+/* assert added in assert_support_xtensa*/
+#elif defined(__HIVECC)
+
+/*
+ * target: assert disabled
+ * sched: assert enabled only when SCHED_DEBUG is defined
+ * unsched: assert enabled
+ */
+#if defined(HRT_HW)
+#define assert(cnd) ((void)0)
+#elif defined(HRT_SCHED) && !defined(DEBUG_SCHED)
+#define assert(cnd) ((void)0)
+#elif defined(PIPE_GENERATION)
+#define assert(cnd) ((void)0)
+#else
+#include <hive/support.h>
+#define assert(cnd) OP___csim_assert(cnd)
+#endif
+
+#elif defined(__KERNEL__)
+#include <linux/bug.h>
+
+#ifndef KERNEL_ASSERT_TO_BUG
+#ifndef KERNEL_ASSERT_TO_BUG_ON
+#ifndef KERNEL_ASSERT_TO_WARN_ON
+#ifndef KERNEL_ASSERT_TO_WARN_ON_INF_LOOP
+#ifndef KERNEL_ASSERT_UNDEFINED
+/* Default */
+#define KERNEL_ASSERT_TO_BUG
+#endif /*KERNEL_ASSERT_UNDEFINED*/
+#endif /*KERNEL_ASSERT_TO_WARN_ON_INF_LOOP*/
+#endif /*KERNEL_ASSERT_TO_WARN_ON*/
+#endif /*KERNEL_ASSERT_TO_BUG_ON*/
+#endif /*KERNEL_ASSERT_TO_BUG*/
+
+#ifdef KERNEL_ASSERT_TO_BUG
+/* TODO: it would be cleaner to use this:
+ * #define assert(cnd) BUG_ON(cnd)
+ * but that causes many compiler warnings (==errors) under Android
+ * because it seems that the BUG_ON() macro is not seen as a check by
+ * gcc like the BUG() macro is. */
+#define assert(cnd)							\
+	do {								\
+		if (!(cnd)) {						\
+			BUG();						\
+		}							\
+	} while (0)
+#endif /*KERNEL_ASSERT_TO_BUG*/
+
+#ifdef KERNEL_ASSERT_TO_BUG_ON
+#define assert(cnd) BUG_ON(!(cnd))
+#endif /*KERNEL_ASSERT_TO_BUG_ON*/
+
+#ifdef KERNEL_ASSERT_TO_WARN_ON
+#define assert(cnd) WARN_ON(!(cnd))
+#endif /*KERNEL_ASSERT_TO_WARN_ON*/
+
+#ifdef KERNEL_ASSERT_TO_WARN_ON_INF_LOOP
+#define assert(cnd)							\
+	do {								\
+		int not_cnd = !(cnd);					\
+		WARN_ON(not_cnd);					\
+		if (not_cnd) {						\
+			for (;;) {					\
+			}						\
+		}							\
+	} while (0)
+#endif /*KERNEL_ASSERT_TO_WARN_ON_INF_LOOP*/
+
+#ifdef KERNEL_ASSERT_UNDEFINED
+#include KERNEL_ASSERT_DEFINITION_FILESTRING
+#endif /*KERNEL_ASSERT_UNDEFINED*/
+
+#elif defined(__FIST__) || defined(__GNUC__)
+
+#include "assert.h"
+
+#else /* default is for unknown environments */
+#define assert(cnd) ((void)0)
+#endif
+
+#endif /* NDEBUG */
+#ifndef PIPE_GENERATION
+/* Deprecated OP___assert, this is still used in ~1000 places
+ * in the code. This will be removed over time.
+ * The implementation for the pipe generation tool is in see support.isp.h */
+#define OP___assert(cnd) assert(cnd)
+
+#ifdef C_RUN
+#define compile_time_assert(cond) OP___assert(cond)
+#else
+#include "storage_class.h"
+extern void _compile_time_assert(void);
+STORAGE_CLASS_INLINE void compile_time_assert(unsigned cond)
+{
+	/* Call undefined function if cond is false */
+	if (!cond)
+		_compile_time_assert();
+}
+#endif
+#endif /* PIPE_GENERATION */
+
+#endif /* __ASSERT_SUPPORT_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/cpu_mem_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/cpu_mem_support.h
new file mode 100644
index 000000000000..88ef0971fed8
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/cpu_mem_support.h
@@ -0,0 +1,239 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CPU_MEM_SUPPORT_H
+#define __CPU_MEM_SUPPORT_H
+
+#include "storage_class.h"
+#include "assert_support.h"
+#include "type_support.h"
+
+STORAGE_CLASS_INLINE void*
+ia_css_cpu_mem_copy(void *dst, const void *src, unsigned int size)
+{
+	/* memcpy cannot be used in in Windows (function is not allowed),
+	 * and the safer function memcpy_s is not available on other platforms.
+	 * Because usage of ia_css_cpu_mem_copy is minimal, we implement it here in an easy,
+	 * but sub-optimal way.
+	 */
+	unsigned int i;
+
+	assert(dst != NULL && src != NULL);
+
+	if (!(dst != NULL && src != NULL)) {
+		return NULL;
+	}
+	for (i = 0; i < size; i++) {
+		((char *)dst)[i] = ((char *)src)[i];
+	}
+	return dst;
+}
+
+#if defined(__KERNEL__)
+
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#include <asm/cacheflush.h>
+
+/* TODO: remove, workaround for issue in hrt file ibuf_ctrl_2600_config.c
+ * error checking code added to SDK that uses calls to exit function
+ */
+#define exit(a) return
+
+STORAGE_CLASS_INLINE void*
+ia_css_cpu_mem_alloc(unsigned int size)
+{
+	return kmalloc(size, GFP_KERNEL);
+}
+
+STORAGE_CLASS_INLINE void*
+ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
+{
+	return ia_css_cpu_mem_alloc(size); /* todo: align to page size */
+}
+
+STORAGE_CLASS_INLINE void
+ia_css_cpu_mem_protect(void *ptr, unsigned int size, int prot)
+{
+	/* nothing here yet */
+}
+
+STORAGE_CLASS_INLINE void*
+ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
+{
+	return memset(dst, 0, size); /* available in kernel in linux/string.h */
+}
+
+STORAGE_CLASS_INLINE void
+ia_css_cpu_mem_free(void *ptr)
+{
+	kfree(ptr);
+}
+
+STORAGE_CLASS_INLINE void
+ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
+{
+	/* parameter check here */
+	if (ptr == NULL)
+		return;
+
+	clflush_cache_range(ptr, size);
+}
+
+STORAGE_CLASS_INLINE void
+ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
+{
+	/* for now same as flush */
+	ia_css_cpu_mem_cache_flush(ptr, size);
+}
+
+#elif defined(_MSC_VER)
+
+#include <stdlib.h>
+#include <string.h>
+#include <stddef.h>
+
+extern void *hrt_malloc(size_t bytes, int zero_mem);
+extern void *hrt_free(void *ptr);
+extern void hrt_mem_cache_flush(void *ptr, unsigned int size);
+extern void hrt_mem_cache_invalidate(void *ptr, unsigned int size);
+
+#define malloc(a)	hrt_malloc(a, 1)
+#define free(a)		hrt_free(a)
+
+#define CSS_PAGE_SIZE	(1<<12)
+
+STORAGE_CLASS_INLINE void*
+ia_css_cpu_mem_alloc(unsigned int size)
+{
+	return malloc(size);
+}
+
+STORAGE_CLASS_INLINE void*
+ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
+{
+	unsigned int buffer_size = size;
+
+	/* Currently hrt_malloc calls Windows ExAllocatePoolWithTag() routine
+	 * to request system memory. If the number of bytes is equal or bigger
+	 * than the page size, then the returned address is page aligned,
+	 * but if it's smaller it's not necessarily page-aligned We agreed
+	 * with Windows team that we allocate a full page
+	 * if it's less than page size
+	*/
+	if (buffer_size < CSS_PAGE_SIZE)
+		buffer_size = CSS_PAGE_SIZE;
+
+	return ia_css_cpu_mem_alloc(buffer_size);
+}
+
+STORAGE_CLASS_INLINE void*
+ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
+{
+	return memset(dst, 0, size);
+}
+
+STORAGE_CLASS_INLINE void
+ia_css_cpu_mem_free(void *ptr)
+{
+	free(ptr);
+}
+
+STORAGE_CLASS_INLINE void
+ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
+{
+#ifdef _KERNEL_MODE
+	hrt_mem_cache_flush(ptr, size);
+#else
+	(void)ptr;
+	(void)size;
+#endif
+}
+
+STORAGE_CLASS_INLINE void
+ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
+{
+#ifdef _KERNEL_MODE
+	hrt_mem_cache_invalidate(ptr, size);
+#else
+	(void)ptr;
+	(void)size;
+#endif
+}
+
+#else
+
+#include <stdlib.h>
+#include <string.h>
+#include <stddef.h>
+/* Needed for the MPROTECT */
+#include <unistd.h>
+#include <sys/types.h>
+
+/* For host only, not fw */
+#ifndef __XTENSA_FW__
+#include <sys/mman.h>
+#include <malloc.h>
+#endif
+
+STORAGE_CLASS_INLINE void*
+ia_css_cpu_mem_alloc(unsigned int size)
+{
+	return malloc(size);
+}
+
+#ifdef _SC_PAGE_SIZE
+STORAGE_CLASS_INLINE void*
+ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
+{
+	int pagesize;
+
+	pagesize = sysconf(_SC_PAGE_SIZE);
+	return memalign(pagesize, size);
+}
+#endif /*_SC_PAGE_SIZE*/
+
+STORAGE_CLASS_INLINE void*
+ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
+{
+	return memset(dst, 0, size);
+}
+
+STORAGE_CLASS_INLINE void
+ia_css_cpu_mem_free(void *ptr)
+{
+	free(ptr);
+}
+
+STORAGE_CLASS_INLINE void
+ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
+{
+	/* not needed in simulation */
+	(void)ptr;
+	(void)size;
+}
+
+STORAGE_CLASS_INLINE void
+ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
+{
+	/* not needed in simulation */
+	(void)ptr;
+	(void)size;
+}
+
+#endif
+#endif /* __CPU_MEM_SUPPORT_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/error_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/error_support.h
new file mode 100644
index 000000000000..ede5d846e67e
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/error_support.h
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ERROR_SUPPORT_H
+#define __ERROR_SUPPORT_H
+
+#if defined(__KERNEL__)
+#include <linux/errno.h>
+#else
+#include <errno.h>
+#endif
+#include <assert_support.h>
+
+/* OS-independent definition of IA_CSS errno values */
+/* #define IA_CSS_EINVAL 1 */
+/* #define IA_CSS_EFAULT 2 */
+
+#ifdef __HIVECC
+#define ERR_EMBEDDED 1
+#else
+#define ERR_EMBEDDED 0
+#endif
+
+#if ERR_EMBEDDED
+#define DECLARE_ERRVAL
+#else
+#define DECLARE_ERRVAL \
+	int _errval = 0;
+#endif
+
+/* Use "owl" in while to prevent compiler warnings in Windows */
+#define ALWAYS_FALSE ((void)0, 0)
+
+#define verifret(cond, error_type) \
+do {                               \
+	if (!(cond)) {             \
+		return error_type; \
+	}                          \
+} while (ALWAYS_FALSE)
+
+#define verifjmp(cond, error_tag)    \
+do {                                \
+	if (!(cond)) {                   \
+		goto error_tag;             \
+	}                               \
+} while (ALWAYS_FALSE)
+
+#define verifexit(cond)  \
+do {                               \
+	if (!(cond)) {              \
+		goto EXIT;         \
+	}                          \
+} while (ALWAYS_FALSE)
+
+#if ERR_EMBEDDED
+#define verifexitval(cond, error_tag) \
+do {                               \
+	assert(cond);		   \
+} while (ALWAYS_FALSE)
+#else
+#define verifexitval(cond, error_tag) \
+do {                               \
+	if (!(cond)) {              \
+		_errval = (error_tag); \
+		goto EXIT;         \
+	}                          \
+} while (ALWAYS_FALSE)
+#endif
+
+#if ERR_EMBEDDED
+#define haserror(error_tag) (0)
+#else
+#define haserror(error_tag) \
+	(_errval == (error_tag))
+#endif
+
+#if ERR_EMBEDDED
+#define noerror() (1)
+#else
+#define noerror() \
+	(_errval == 0)
+#endif
+
+#define verifjmpexit(cond)         \
+do {                               \
+	if (!(cond)) {             \
+		goto EXIT;         \
+	}                          \
+} while (ALWAYS_FALSE)
+
+#define verifjmpexitsetretval(cond, retval)         \
+do {                               \
+	if (!(cond)) {              \
+		retval = -1;	   \
+		goto EXIT;         \
+	}                          \
+} while (ALWAYS_FALSE)
+
+#endif /* __ERROR_SUPPORT_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/frame_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/frame_support.h
new file mode 100644
index 000000000000..6142ecb43058
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/frame_support.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __FRAME_SUPPORT_H
+#define __FRAME_SUPPORT_H
+
+#define INTERLEAVED_FRAME_TYPE_NUM_PLANES	1
+#define YUV_SEMI_PLANAR_FRAME_TYPE_NUM_PLANES	2
+#define YUV_PLANAR_FRAME_TYPE_NUM_PLANES	3
+#define BAYER_PLANAR_FRAME_TYPE_NUM_PLANES	4
+
+/* genpipe doesn't support B = A in enum definition */
+#ifndef PIPE_GENERATION
+
+enum image_iterator_planes {
+	IMG_ITER_PLANE_0 = 0,
+	IMG_ITER_PLANE_1,
+	IMG_ITER_PLANE_2,
+	IMG_ITER_PLANE_3,
+	IMG_ITER_MAX_NUM_PLANES
+};
+
+enum interleaved_frames_types_planes {
+	INTERLEAVED_FRAME_MAIN_PLANE = 0,
+	INTERLEAVED_FRAME_NUM_PLANES
+};
+
+enum yuv_semi_planar_frame_types_planes {
+	YUV_SEMI_PLANAR_FRAME_Y_PLANE = 0,
+	YUV_SEMI_PLANAR_FRAME_UV_PLANE,
+	YUV_SEMI_PLANAR_FRAME_NUM_PLANES
+};
+
+enum yuv_planar_frame_types_planes {
+	YUV_PLANAR_FRAME_Y_PLANE = 0,
+	YUV_PLANAR_FRAME_U_PLANE,
+	YUV_PLANAR_FRAME_V_PLANE,
+	YUV_PLANAR_FRAME_NUM_PLANES
+};
+
+enum bayer_planar_frame_types_planes {
+	BAYER_PLANAR_FRAME_GR_PLANE = 0,
+	BAYER_PLANAR_FRAME_R_PLANE,
+	BAYER_PLANAR_FRAME_B_PLANE,
+	BAYER_PLANAR_FRAME_GB_PLANE,
+	BAYER_PLANAR_FRAME_NUM_PLANES
+};
+
+#endif /* PIPE_GENERATION */
+#endif	/* __FRAME_SUPPORT_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_base_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_base_types.h
new file mode 100644
index 000000000000..d0de17c1e224
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_base_types.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_BASE_TYPES_H
+#define __IA_CSS_BASE_TYPES_H
+
+#include "type_support.h"
+
+#define VIED_VADDRESS_BITS				32
+
+#define DEVICE_DESCRIPTOR_ID_BITS			32
+
+#define SIZE_OF_TERMINAL_LOAD_TRANSFER_STRUCT_BITS \
+	(2 * IA_CSS_UINT32_T_BITS + \
+	VIED_VADDRESS_BITS + \
+	2 * IA_CSS_UINT16_T_BITS)
+
+#define SIZE_OF_TERMINAL_STORE_TRANSFER_STRUCT_BITS \
+	(2 * IA_CSS_UINT32_T_BITS + \
+	VIED_VADDRESS_BITS + \
+	2 * IA_CSS_UINT16_T_BITS)
+
+#define SIZE_OF_TERMINAL_LOAD_TRANSFER_STRUCT (SIZE_OF_TERMINAL_LOAD_TRANSFER_STRUCT_BITS / CHAR_BIT)
+#define SIZE_OF_TERMINAL_STORE_TRANSFER_STRUCT (SIZE_OF_TERMINAL_STORE_TRANSFER_STRUCT_BITS / CHAR_BIT)
+
+typedef uint32_t vied_vaddress_t;
+
+typedef struct {
+	uint8_t device_id;
+	uint8_t instance_id;
+	uint8_t channel_id;
+	uint8_t section_id;
+} device_descriptor_fields_t;
+
+typedef union {
+	device_descriptor_fields_t fields;
+	uint32_t data;
+} device_descriptor_id_t;
+
+typedef uint16_t ia_css_process_id_t;
+
+#endif /* __IA_CSS_BASE_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs.h
new file mode 100644
index 000000000000..b4a152592471
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs.h
@@ -0,0 +1,789 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_ISA_PARAMETER_DEFS_H
+#define __IA_CSS_ISA_PARAMETER_DEFS_H
+
+#include "ia_css_isa_parameter_defs_dep.h"
+
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_INL			(0)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_GLOBAL		(0)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_0		(1)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_1		(1)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_2		(1)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PCLN			(0)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_0		(1)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_1		(1)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_2		(1)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC			(1)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_IDS			(0)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AWB		(1)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AF		(1)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE_CCM		(0)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE		(1)
+
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_INL			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_GLOBAL			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_0		(1)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_1		(1)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_2		(1)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PCLN			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_0		(1)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_1		(1)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_2		(1)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_IDS			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AWB		(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AF			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE_CCM		(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE			(0)
+
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_INL			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_GLOBAL		(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_0		(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_1		(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_2		(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PCLN			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_0		(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_1		(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_2		(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_IDS			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AWB		(1)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AF		(1)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE_CCM		(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE		(0)
+
+#define IA_CSS_ISA_NEEDS_SLICED_IN_INL				(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_GLOBAL			(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_0		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_1		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_2		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_PCLN			(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_0		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_1		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_2		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_DPC				(1)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_IDS				(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AWB			(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AF			(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE_CCM		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE			(0)
+
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_INL			(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_GLOBAL			(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_0		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_1		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_2		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PCLN			(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_0		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_1		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_2		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_DPC			(1)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_IDS			(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AWB		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AF			(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE_CCM		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE			(0)
+
+/* ==================== INL specs - START ==================== */
+/* in addition to register bank, it has a 0x200 memory bank to store LUT, found in reg_descr.hsd */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_SECTION_COUNT						(2)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_0						(0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_0					(0x204)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_1						(0x204)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_1					(0x0)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_INL_SECTION_COUNT						(0)
+
+/* Spatial Parameter Terminal In does not exist for INL */
+
+/* Spatial Parameter Terminal Out does not exist for INL */
+
+/* Sliced Parameter Terminal In does not exist for INL */
+
+/* Sliced Parameter Terminal Out does not exist for INL */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_INL_SECTION_COUNT							(0)
+/* ==================== INL specs - END ==================== */
+
+/* ==================== BLC_GLOBAL specs - START ==================== */
+/* in addition to register bank, it has a 0xC00 memory bank to store LUT, found in reg_descr.hsd */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_SECTION_COUNT						(2)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_0					(0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_0					(0xC08)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_1					(0x20)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_1					(0xC0C)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_GLOBAL_SECTION_COUNT					(0)
+
+/* Spatial Parameter Terminal In does not exist for BLC_GLOBAL */
+
+/* Spatial Parameter Terminal Out does not exist for BLC_GLOBAL */
+
+/* Sliced Parameter Terminal In does not exist for BLC_GLOBAL */
+
+/* Sliced Parameter Terminal Out does not exist for BLC_GLOBAL */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_GLOBAL_SECTION_COUNT						(0)
+/* ==================== BLC_GLOBAL specs - END ==================== */
+
+/* ==================== BLC_SENSOR_TYPE_0 specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT					(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0				(0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0				(0xC08)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_0_SECTION_COUNT				(0)
+
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SECTION_COUNT			(4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM		(8)
+
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE		(128)	/* HW limit for slice height calculation */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH	(8)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH	(64)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT	(8)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT	(64)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0			(0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0	(0x0)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_1		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_1			(0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_1	(0x300)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_1		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_2		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_2			(0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_2	(0x600)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_2		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_3		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_3			(0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_3	(0x900)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_3		(0x100)
+
+/* Spatial Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_0 */
+
+/* Sliced Parameter Terminal In does not exist for BLC_SENSOR_TYPE_0 */
+
+/* Sliced Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_0 */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT					(1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0				(0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0				(0xC00)
+/* ==================== BLC_SENSOR_TYPE_0 specs - END ==================== */
+
+/* ==================== BLC_SENSOR_TYPE_1 specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT					(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0				(0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0				(0xC08)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_1_SECTION_COUNT				(0)
+
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SECTION_COUNT			(4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM		(2)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE		(128)	/* HW limit for slice height calculation */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH	(8)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH	(64)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT	(8)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT	(64)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0			(0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0	(0x0)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_1		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_1			(0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_1	(0x300)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_1		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_2		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_2			(0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_2	(0x600)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_2		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_3		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_3			(0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_3	(0x900)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_3		(0x100)
+
+/* Spatial Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_1 */
+
+/* Sliced Parameter Terminal In does not exist for BLC_SENSOR_TYPE_1 */
+
+/* Sliced Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_1 */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT					(1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0				(0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0				(0xC00)
+/* ==================== BLC_SENSOR_TYPE_1 specs - END ==================== */
+
+/* ==================== BLC_SENSOR_TYPE_2 specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT					(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0				(0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0				(0xC08)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_2_SECTION_COUNT				(0)
+
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SECTION_COUNT			(8)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM		(1)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE		(32)	/* HW limit for slice height calculation */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH	(8)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH	(32)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT	(8)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT	(32)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0		(0x80)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0			(0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0	(0x0)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_1		(0x80)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_1			(0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_1	(0x300)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_1		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_2		(0x80)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_2			(0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_2	(0x600)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_2		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_3		(0x80)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_3			(0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_3	(0x900)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_3		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_4		(0x80)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_4			(0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_4	(0x80)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_4		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_5		(0x80)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_5			(0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_5	(0x380)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_5		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_6		(0x80)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_6			(0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_6	(0x680)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_6		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_7		(0x80)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_7			(0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_7	(0x980)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_7		(0x100)
+
+/* Spatial Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_2 */
+
+/* Sliced Parameter Terminal In does not exist for BLC_SENSOR_TYPE_2 */
+
+/* Sliced Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_2 */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT					(1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0				(0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0				(0xC00)
+/* ==================== BLC_SENSOR_TYPE_2 specs - END ==================== */
+
+/* ==================== PCLN specs - START ==================== */
+/* in addition to register bank, it has a 0x800 memory bank to store LUT, found in reg_descr.hsd */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_SECTION_COUNT						(2)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_0						(0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_0					(0x820)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_1						(0x820)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_1					(0x0)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PCLN_SECTION_COUNT						(0)
+
+/* Spatial Parameter Terminal In does not exist for PCLN */
+
+/* Spatial Parameter Terminal Out does not exist for PCLN */
+
+/* Sliced Parameter Terminal In does not exist for PCLN */
+
+/* Sliced Parameter Terminal Out does not exist for PCLN */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_PCLN_SECTION_COUNT							(0)
+/* ==================== PCLN specs - END ==================== */
+
+/* ==================== LSC_SENSOR_TYPE_0 specs - START ==================== */
+/* in addition to register bank, it has a 0xC00 memory bank to store LUT, found in reg_descr.hsd */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT					(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0				(0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0				(0xC08)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT				(0)
+
+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
+
+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_0 */
+
+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT					(1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0				(0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0				(0xC00)
+/* ==================== LSC_SENSOR_TYPE_0 specs - END ==================== */
+
+/* ==================== LSC_SENSOR_TYPE_1 specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT					(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0				(0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0				(0xC08)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT				(0)
+
+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
+
+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_1 */
+
+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT					(1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0				(0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0				(0xC00)
+/* ==================== LSC_SENSOR_TYPE_1 specs - END ==================== */
+
+/* ==================== LSC_SENSOR_TYPE_2 specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT					(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0				(0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0				(0xC08)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT				(0)
+
+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
+
+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_2 */
+
+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT					(1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0				(0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0				(0xC00)
+/* ==================== LSC_SENSOR_TYPE_2 specs - END ==================== */
+
+/* ==================== BNR specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_SECTION_COUNT			(2)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_0	(0x2C)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_0	(0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_1	(0xA4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_1	(0x34)
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_SECTION_COUNT			(1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_MAX_SIZE_SECTION_0		(0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_DEST_OFFSET_SECTION_0	(0x2C)
+/* ==================== BNR specs - END ==================== */
+
+/* ==================== ISA_DM specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_SECTION_COUNT			(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_MAX_SIZE_SECTION_0		(0x2C)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_DEST_OFFSET_SECTION_0	(0x0)
+
+/* ==================== ISA_DM specs - END ==================== */
+
+/* ==================== IDS specs - START ==================== */
+/* IDS is HW revision dependent */
+/* ==================== IDS specs - END ==================== */
+
+/* ==================== 3A_STAT_AWB specs - START ==================== */
+/* AWB parameter properties are in the platform specific ia_css_parameter_defs_dep.h file */
+/* ==================== 3A_STAT_AWB specs - END ==================== */
+
+/* ==================== 3A_STAT_AF specs - START ==================== */
+/* in addition to register bank, it has a 0x400 memory bank to store output, found in reg_descr.hsd */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_SECTION_COUNT						(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0					(0x88)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0					(0x40C)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT					(0)
+
+/* Spatial Parameter Terminal In does not exist for 3A_STAT_AF */
+
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT				(2)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_COMPUTE_UNITS_PER_ELEM			(1)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_PER_SLICE		(32)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH		(16)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH		(32)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT		(16)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT		(32)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_0			(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_0			(0x8)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_0		(0x0)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_0		(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_1			(0x100)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_1			(0x8)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_1		(0x200)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_1		(0x100)
+
+/* Sliced Parameter Terminal In does not exist for 3A_STAT_AF */
+
+/* Sliced Parameter Terminal Out does not exist for 3A_STAT_AF */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_SECTION_COUNT						(1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0					(0xC)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0					(0x400)
+/* ==================== 3A_STAT_AF specs - END ==================== */
+
+/* ==================== 3A_STAT_AE_CCM specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT					(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_MAX_SIZE_SECTION_0				(0x7C)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_DEST_OFFSET_SECTION_0				(0x0)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_CCM_SECTION_COUNT					(0)
+
+/* Spatial Parameter Terminal In does not exist for 3A_STAT_AE_CCM */
+
+/* Spatial Parameter Terminal Out does not exist for 3A_STAT_AE_CCM */
+
+/* Sliced Parameter Terminal In does not exist for 3A_STAT_AE_CCM */
+
+/* Sliced Parameter Terminal Out does not exist for 3A_STAT_AE_CCM */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT					(0)
+/* ==================== 3A_STAT_AE_CCM specs - END ==================== */
+
+/* ==================== 3A_STAT_AE specs - START ==================== */
+/* in addition to register bank, it has a 0x180 memory bank to store LUT and a 0x2000 memory bank to store output,
+   found in reg_descr.hsd */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_SECTION_COUNT						(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0					(0xC)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0					(0x18C)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_SECTION_COUNT					(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_MAX_SIZE_SECTION_0				(0x2000)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_DEST_OFFSET_SECTION_0				(0x200)
+
+/* Spatial Parameter Terminal In does not exist for 3A_STAT_AE */
+
+/* Spatial Parameter Terminal Out does not exist for 3A_STAT_AE */
+
+/* Sliced Parameter Terminal In does not exist for 3A_STAT_AE */
+
+/* Sliced Parameter Terminal Out does not exist for 3A_STAT_AE */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_SECTION_COUNT						(2)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0					(0xC)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0					(0x180)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_1					(0x180)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_1					(0x0)
+/* ==================== 3A_STAT_AE specs - END ==================== */
+
+/* TODO: REMOVE BACKWARD COMPATIBILITY */
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_INL_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_1
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_INL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_INL_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_INL_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_INL_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_1
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_GLOBAL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_GLOBAL_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_GLOBAL_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_GLOBAL_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_0_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_3
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_3
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_3
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_3
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_1_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_3
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_3
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_3
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_3
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_2_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_2
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_3
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_3
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_3
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_3
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_4
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_4
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_4
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_4
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_5
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_5
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_5
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_5
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_6
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_6
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_6
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_6
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_7
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_7
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_7
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_7
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_1
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_PCLN_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PCLN_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_PCLN_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_PCLN_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_COMPUTE_UNITS_PER_ELEM
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_PER_SLICE
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_1
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_COMPUTE_UNITS_PER_ELEM
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_PER_SLICE
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_1
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_CCM_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_CCM_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_CCM_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_CCM_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_1
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_1
+
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_INL IA_CSS_ISA_KERNEL_IS_PRIMARY_INL
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_GLOBAL IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_GLOBAL
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_0 IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_0
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_1 IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_1
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_2 IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_2
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_PCLN IA_CSS_ISA_KERNEL_IS_PRIMARY_PCLN
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_0 IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_0
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_1 IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_1
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_2 IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_2
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_DPC IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_IDS IA_CSS_ISA_KERNEL_IS_PRIMARY_IDS
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AWB IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AWB
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AF IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AF
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AE_CCM IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE_CCM
+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AE IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_INL IA_CSS_ISA_NEEDS_SPATIAL_IN_INL
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_GLOBAL IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_GLOBAL
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_0
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_1
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_2
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_PCLN IA_CSS_ISA_NEEDS_SPATIAL_IN_PCLN
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_0
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_1
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_2
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_DPC IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_IDS IA_CSS_ISA_NEEDS_SPATIAL_IN_IDS
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AWB IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AWB
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AF IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AF
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE_CCM
+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AE IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_INL IA_CSS_ISA_NEEDS_SPATIAL_OUT_INL
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_GLOBAL IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_GLOBAL
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_0
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_1
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_2
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_PCLN IA_CSS_ISA_NEEDS_SPATIAL_OUT_PCLN
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_0
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_1
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_2
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_DPC IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_IDS IA_CSS_ISA_NEEDS_SPATIAL_OUT_IDS
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AWB IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AWB
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AF IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AF
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE_CCM
+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AE IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_INL IA_CSS_ISA_NEEDS_SLICED_IN_INL
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_GLOBAL IA_CSS_ISA_NEEDS_SLICED_IN_BLC_GLOBAL
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_0
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_1
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_2
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_PCLN IA_CSS_ISA_NEEDS_SLICED_IN_PCLN
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_0
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_1
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_2
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_DPC IA_CSS_ISA_NEEDS_SLICED_IN_DPC
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_IDS IA_CSS_ISA_NEEDS_SLICED_IN_IDS
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AWB IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AWB
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AF IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AF
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE_CCM
+#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AE IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_INL IA_CSS_ISA_NEEDS_SLICED_OUT_INL
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_GLOBAL IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_GLOBAL
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_0
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_1
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_2
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_PCLN IA_CSS_ISA_NEEDS_SLICED_OUT_PCLN
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_0
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_1
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_2
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_DPC IA_CSS_ISA_NEEDS_SLICED_OUT_DPC
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_IDS IA_CSS_ISA_NEEDS_SLICED_OUT_IDS
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AWB IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AWB
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AF IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AF
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE_CCM
+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AE IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE
+/* END OF TODO */
+
+#endif /* __IA_CSS_ISA_PARAMETER_DEFS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs_dep.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs_dep.h
new file mode 100644
index 000000000000..4310e41192f4
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs_dep.h
@@ -0,0 +1,580 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_ISA_PARAMETER_DEFS_DEP_H
+#define __IA_CSS_ISA_PARAMETER_DEFS_DEP_H
+
+#include "ia_css_ff_awb_statistics_param_defs.h"
+
+/*
+ * TODO: Adapt this file for IPU6!
+ */
+
+/* ==================== DPC_V2 specific properties ==================== */
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC_V2			(1)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC_V2			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC_V2			(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_DPC_V2			(1)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_DPC_V2			(1)
+
+/* ==================== PDAF specific properties ==================== */
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PAF			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PAF				(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PAF			(1)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_PAF				(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PAF				(0)
+
+/* ==================== DPC_PEXT specific properties ==================== */
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC_PEXT			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC_PEXT			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC_PEXT			(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_DPC_PEXT			(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_DPC_PEXT			(0)
+
+/* ==================== SIS specific properties ==================== */
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_SIS_WB_SIS			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_SIS_WB_SIS			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_SIS_WB_SIS			(0)
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_SIS_SIS			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_SIS_SIS			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_SIS_SIS			(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_SIS_WB_SIS			(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_SIS_SIS			(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_SIS_WB_SIS			(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_SIS_SIS			(0)
+
+/* ==================== STREAM_CROP specific properties ==================== */
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_STREAM_CROP		(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_STREAM_CROP			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_STREAM_CROP		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_STREAM_CROP			(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_STREAM_CROP			(0)
+
+/* ========== PIFCONV_A_INPUT specific properties ================= */
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_A_INPUT		(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_A_INPUT		(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_A_INPUT		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_A_INPUT		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_A_INPUT		(0)
+
+/* ========== PIFCONV_B_INPUT specific properties ================= */
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_B_INPUT		(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_B_INPUT		(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_B_INPUT		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_B_INPUT		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_B_INPUT		(0)
+
+/* ========== PIFCONV_OUTPUT_NONSCALED specific properties ================= */
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_OUTPUT_NONSCALED		(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_OUTPUT_NONSCALED		(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_OUTPUT_NONSCALED		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_OUTPUT_NONSCALED		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_OUTPUT_NONSCALED		(0)
+
+/* ========== PIFCONV_OUTPUT_SCALED specific properties ================= */
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_OUTPUT_SCALED		(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_OUTPUT_SCALED		(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_OUTPUT_SCALED		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_OUTPUT_SCALED		(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_OUTPUT_SCALED		(0)
+
+/* ========== PIFCONV_OUTPUT_SIS specific properties ================= */
+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_OUTPUT_SIS			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_OUTPUT_SIS			(0)
+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_OUTPUT_SIS			(0)
+#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_OUTPUT_SIS			(0)
+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_OUTPUT_SIS			(0)
+
+/* ==================== IDS specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_SECTION_COUNT						(5)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0					(0x0C)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0					(0x00)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_1					(0x10)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_1					(0x14)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_2					(0x18)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_2					(0x50)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_3					(0x20C)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_3					(0x68)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_4					(0x24)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_4					(0x274)
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_SECTION_COUNT						(1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0						(0x08)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0					(0x0C)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_V3_1_SECTION_COUNT					(0)
+
+/* Spatial Parameter Terminal In does not exist for IDS */
+
+/* Spatial Parameter Terminal Out does not exist for IDS */
+
+/* Sliced Parameter Terminal In does not exist for IDS */
+
+/* Sliced Parameter Terminal Out does not exist for IDS */
+
+/* ==================== IDS specs - END ==================== */
+
+/* ==================== DPC specs used in PSYS - START ==================== */
+/* in addition to register bank, it has a 0x3000 memory bank to store LUT, found in reg_descr.hsd */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_SECTION_COUNT						(5)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_0					(0x4)		/* GDC Control */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_0					(0x3378)	/* GDC/DPC Control */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_1					(0x1C0)		/* CfgTable */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_1					(0x3000)	/* CfgTable */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_2					(0x40)		/* HDR factors */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_2					(0x3488)	/* HDR factors */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_3					(0x4)		/* AF Grid Enable */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_3					(0x34C8)	/* AF Grid Enable */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_4					(0x8)		/* AF Statistics pixels */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_4					(0x34D4)	/* AF Statistics pixels */
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_SECTION_COUNT						(4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_0					(0x4)		/* GDC Control */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_0					(0x3378)	/* GDC/DPC Control */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_1					(0x1C0)		/* CfgTable */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_1					(0x3000)	/* CfgTable */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_2					(0x40)		/* HDR factors */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_2					(0x3488)	/* HDR factors */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_3					(0x4)		/* AF Grid Enable */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_3					(0x34C8)	/* AF Grid Enable */
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT					(0)
+
+/* Spatial Parameter Terminal In does not exist for DPC */
+
+/* Spatial Parameter Terminal Out does not exist for DPC */
+
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SECTION_COUNT					(2)
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_0			(0x4)		/* DPC static LUT limit */
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0			(0x3380)	/* DPC static LUT limit */
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0			(0x4)		/* DPC static LUT limit */
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_1			(0x1000)	/* DPC static LUT */
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1			(0x0)		/* DPC static LUT */
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1			(0x1000)	/* DPC static LUT */
+
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT					(2)
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_0			(0x4)		/* AF LUT limit */
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0			(0x34CC)	/* AF LUT limit */
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0			(0x4)		/* AF LUT limit */
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_1			(0x800)		/* AF Pixels metadata */
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1			(0x2000)	/* AF Pixels metadata */
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1			(0x800)		/* AF Pixels metadata */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_SECTION_COUNT						(3)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_0						(0x4)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_0					(0x337C) /* DPC Control */
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_1						(0x1B8)		/* CfgUnitMapping */
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_1					(0x31C0)	/* CfgUnitMapping */
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_2						(0x100)		/* AF pixels grid cfg */
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_2					(0x3388)	/* AF pixels grid cfg */
+
+/* ==================== DPC specs - END ==================== */
+
+/* ==================== DPC_PEXT specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_SECTION_COUNT						(2)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_MAX_SIZE_SECTION_0					(0x8)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_DEST_OFFSET_SECTION_0					(0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_MAX_SIZE_SECTION_1					(0x8)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_DEST_OFFSET_SECTION_1					(0xC)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_PEXT_SECTION_COUNT					(0)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_PEXT_SECTION_COUNT						(0)
+/* ==================== DPC_PEXT specs - END ==================== */
+
+/* TODO check ae values */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_COMPUTE_UNITS_PER_ELEM (1)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH (16)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT (80)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_ELEM_SIZE_SECTION_0 (0)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH (16)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT (80)
+
+/* todo check gddpc_pext values when enabling this terminal */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_COMPUTE_UNITS_PER_ELEM (8)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH (8)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT (8)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_ELEM_SIZE_SECTION_0 (0)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH (64)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT (64)
+
+/* ==================== PAF specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_SECTION_COUNT							(2)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_MAX_SIZE_SECTION_0						(0x18)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_DEST_OFFSET_SECTION_0						(0x0)
+
+/* This is an PAF ACB configuration an not really the configuration on PAF FF. Hence giving - offsets*/
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_MAX_SIZE_SECTION_1						(0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_DEST_OFFSET_SECTION_1						(-0xB0)
+
+#define	IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PAF_SECTION_COUNT						(0)
+/* Number of PAF blocks = 12*16 PAF blocks
+ * Max number of phase steps in each block: 11 steps (0-10)
+ * 	for step 10, only the LSB values are valid and MSB 2bytes are reserved
+ * 	Hence for each block height, we will have to read in 12 steps
+ * Size of each phase value =  2 bytes
+ * Total size required for PAF output = 2bytes * 12*16 blocks *12 steps
+ * */
+
+/* Spatial Parameter Terminal In does not exist for PAF*/
+
+/* Spatial Parameter Terminal Out for PAF*/
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_SECTION_COUNT					(1)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_COMPUTE_UNITS_PER_ELEM				(1)	/**/
+
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_MAX_SLICE_SIZE_SECTION_0				(0x1200) /*12*16 #PAF blocks# * 2bytes*12 #Phase output size per block#*/
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_ELEM_SIZE_SECTION_0				(0x18)	/*Size of each phase output in a grid*/
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_SLICE_0_DEST_OFFSET_SECTION_0			(0x200)	/*FF register offset from kernel base*/
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_NEXT_SLICE_OFFSET_SECTION_0			(0x180)	/*Determines the next FF location*/
+
+/* Sliced Parameter Terminal In does not exist for PAF*/
+
+/* Sliced Parameter Terminal Out does not exist for PAF*/
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_PAF_SECTION_COUNT							(0)
+/* ==================== PAF specs - END ==================== */
+
+/* ==================== LSC_SENSOR_TYPE_0 specs - START ==================== */
+/* in addition to register bank, it has a 0xC00 memory bank to store LUT, found in reg_descr.hsd */
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT				(0)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SECTION_COUNT			(1)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM		(2)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE		(128)	/* HW limit for slice height calculation */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH	(8)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH	(64)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT	(8)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT	(64)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0		(0x400)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0			(0x4)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0	(0x0)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0		(0x400)
+
+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
+
+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_0 */
+
+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
+/* ==================== LSC_SENSOR_TYPE_0 specs - END ==================== */
+
+/* ==================== LSC_SENSOR_TYPE_1 specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT				(0)
+
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SECTION_COUNT			(1)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM		(1)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE		(128)	/* HW limit for slice height calculation */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH	(8)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH	(64)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT	(8)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT	(64)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0		(0x400)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0			(0x8)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0	(0x0)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0		(0x400)
+
+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
+
+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_1 */
+
+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
+/* ==================== LSC_SENSOR_TYPE_1 specs - END ==================== */
+
+/* ==================== LSC_SENSOR_TYPE_2 specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT				(0)
+
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SECTION_COUNT			(1)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM		(1)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE		(32)	/* HW limit for slice height calculation */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH	(8)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH	(32)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT	(8)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT	(32)	/* HW limit for checking only */
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0		(0x400)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0			(0x20)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0	(0x0)
+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0		(0x400)
+
+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
+
+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_2 */
+
+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
+
+/* ==================== LSC_SENSOR_TYPE_2 specs - END ==================== */
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_SECTION_COUNT				IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_SECTION_COUNT
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_0			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_0			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_1			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_1
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_1			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_2			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_2
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_2			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_2
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_3			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_3
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_3			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_3
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_4			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_4
+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_4			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_4
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_SECTION_COUNT			IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_V3_1_SECTION_COUNT
+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_SECTION_COUNT				IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_SECTION_COUNT
+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_MAX_SIZE_SECTION_0			IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0
+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_DEST_OFFSET_SECTION_0			IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_SECTION_COUNT					IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_SECTION_COUNT
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_0				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_0
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_0				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_1				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_1
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_1				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_2				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_2
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_2				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_2
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_3				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_3
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_3				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_3
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_4				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_4
+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_4				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_4
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT				IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SECTION_COUNT			IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SECTION_COUNT
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_0		IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_0	IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_0		IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_1		IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_1
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_1	IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_1		IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT			IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_0		IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_0	IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_0	IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_1		IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_1
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_1	IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_1	IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_SECTION_COUNT					IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_SECTION_COUNT
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_0				IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_0
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_0				IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_1				IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_1
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_1				IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_2				IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_2
+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_2				IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_2
+
+/* ==================== LCA specs -- START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_SECTION_COUNT			(6)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_0	(0xc) /* 0x0 to 0xb */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_0	(0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_1	(0xcc) /* 0x10 to 0xdb */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_1	(0x10)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_2	(0x510) /* 0x100 to 0x60f */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_2	(0x100)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_3	(0x510) /* 0x6c0 to 0xbcf */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_3	(0x6c0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_4	(0x510) /* 0xc80 to 0x118f */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_4	(0xc80)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_5	(0x510) /* 0x1240 to 0x174f */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_5	(0x1240)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LCA_SECTION_COUNT		(0)
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LCA_SECTION_COUNT			(1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LCA_MAX_SIZE_SECTION_0		(4) /* 0x1800 to 0x1803*/
+#define IA_CSS_ISA_PROGRAM_TERMINAL_LCA_DEST_OFFSET_SECTION_0	(0x1800)
+/* ==================== LCA specs -- END ==================== */
+
+/* ==================== WBA_WBA specs - START ==================== */
+#define IA_CSS_PSA_PARAMETER_TERMINAL_B2B_WBA_SECTION_COUNT               (1)
+#define IA_CSS_PSA_PARAMETER_TERMINAL_B2B_WBA_MAX_SIZE_SECTION_0          (0x20)
+#define IA_CSS_PSA_PARAMETER_TERMINAL_B2B_WBA_DEST_OFFSET_SECTION_0       (0x0)
+/* ==================== WBA_WBA specs - END ==================== */
+
+/* leave those for now to pass isys compilation */
+/* ==================== SIS_WB_SIS specs - START ==================== */
+/* This device is similar to the WBA device in the PSA (with respect to registermap) */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_SECTION_COUNT            (2)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_MAX_SIZE_SECTION_0       (0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_DEST_OFFSET_SECTION_0    (0x1C)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_MAX_SIZE_SECTION_1       (0x1C)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_DEST_OFFSET_SECTION_1    (0x0)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_SIS_WB_SIS_SECTION_COUNT        (0)
+
+/* Spatial Parameter Terminal In does not exist for SIS_WB_SIS */
+
+/* Spatial Parameter Terminal Out does not exist for SIS_WB_SIS */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_SIS_WB_SIS_SECTION_COUNT              (0)
+/* ==================== SIS_WB_SIS specs - END ==================== */
+
+/* ==================== SIS_SIS specs - START ==================== */
+/* TODO: The SIS device does not yet expose the functionality for cropping */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_SIS_SECTION_COUNT               (1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_SIS_MAX_SIZE_SECTION_0          (0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_SIS_DEST_OFFSET_SECTION_0       (0x0)
+
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_SIS_SIS_SECTION_COUNT           (0)
+
+/* Spatial Parameter Terminal In does not exist for SIS_SIS */
+
+/* Spatial Parameter Terminal Out does not exist for SIS_SIS */
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_SIS_SIS_SECTION_COUNT                 (0)
+/* ==================== SIS_SIS specs - END ==================== */
+
+/* ==================== STREAM_CROP specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_STREAM_CROP_SECTION_COUNT		(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_STREAM_CROP_MAX_SIZE_SECTION_0	(0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_STREAM_CROP_DEST_OFFSET_SECTION_0	(0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_STREAM_CROP_SECTION_COUNT	(0)
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_STREAM_CROP_SECTION_COUNT		(1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_STREAM_CROP_MAX_SIZE_SECTION_0	(0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_STREAM_CROP_DEST_OFFSET_SECTION_0	(0x4)
+/* ==================== STREAM_CROP specs - END ==================== */
+
+/* ==================== BNR specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_SECTION_COUNT			(2)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_0	(0x2C)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_0	(0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_1	(0xA4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_1	(0x34)
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_SECTION_COUNT			(1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_MAX_SIZE_SECTION_0		(0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_DEST_OFFSET_SECTION_0	(0x2C)
+/* ==================== BNR specs - END ==================== */
+
+/* ==================== ISA_DM specs - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_SECTION_COUNT			(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_MAX_SIZE_SECTION_0		(0x2C)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_DEST_OFFSET_SECTION_0	(0x0)
+
+/* ==================== ISA_DM specs - END ==================== */
+
+/* ====================  specs PIFCONV_SIS_A- START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_A_SECTION_COUNT			(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_A_MAX_SIZE_SECTION_0		(0xc)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_A_DEST_OFFSET_SECTION_0		(0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SIS_A_SECTION_COUNT		(0)
+/* ====================  specs PIFCONV_SIS_A- END ==================== */
+
+/* ====================  specs PIFCONV_SIS_B- START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_B_SECTION_COUNT			(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_B_MAX_SIZE_SECTION_0		(0x12)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_B_DEST_OFFSET_SECTION_0		(0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SIS_B_SECTION_COUNT		(0)
+/* ====================  specs PIFCONV_SIS_B- END ==================== */
+
+/* ====================  specs PIFCONV_ISA_ORIG- START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_ORIG_SECTION_COUNT			(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_ORIG_MAX_SIZE_SECTION_0		(0xc)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_ORIG_DEST_OFFSET_SECTION_0		(0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_ISA_ORIG_SECTION_COUNT		(0)
+/* ====================  specs PIFCONV_ISA_ORIG- END ==================== */
+
+/* ====================  specs PIFCONV_ISA_SCALED_A- START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_A_SECTION_COUNT			(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_A_MAX_SIZE_SECTION_0		(0xc)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_A_DEST_OFFSET_SECTION_0		(0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SCALED_A_SECTION_COUNT		(0)
+/* ====================  specs PIFCONV_ISA_SCALED_A- END ==================== */
+
+/* ====================  specs PIFCONV_ISA_SCALED_B- START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_B_SECTION_COUNT			(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_B_MAX_SIZE_SECTION_0		(0xc)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_B_DEST_OFFSET_SECTION_0		(0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SCALED_B_SECTION_COUNT		(0)
+/* ====================  specs PIFCONV_ISA_SCALED_B- END ==================== */
+
+/* ====================  specs PIFCONV_ISA_FULL- START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_FULL_SECTION_COUNT			(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_FULL_MAX_SIZE_SECTION_0		(0xc)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_FULL_DEST_OFFSET_SECTION_0		(0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_ISA_FULL_SECTION_COUNT		(0)
+/* ====================  specs -PIFCONV_ISA_FULL_OUT END ==================== */
+
+/* ====================  specs PIFCONV_ISA_IR_DEPTH - START ==================== */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_SECTION_COUNT			(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_MAX_SIZE_SECTION_0		(0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_DEST_OFFSET_SECTION_0		(0x0)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_SECTION_COUNT		(0)
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_SECTION_COUNT			(2)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_MAX_SIZE_SECTION_0		(0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_DEST_OFFSET_SECTION_0		(0x4)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_MAX_SIZE_SECTION_1		(0x4)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_DEST_OFFSET_SECTION_1		(0x0) /* 0 because this register is in GPreg, NOT in Pifconv device. */
+/* ====================  specs PIFCONV_ISA_IR_DEPTH - END ==================== */
+
+/* ==================== PIXEL FORMATTER specs - START ==================== */
+/* The base address of the Pixel Formatter device is 0x271000 */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIXEL_FORMATTER_SECTION_COUNT		(1)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIXEL_FORMATTER_MAX_SIZE_SECTION_0	(0x4)
+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIXEL_FORMATTER_DEST_OFFSET_SECTION_0	(0x0) /* Base address of the Config register in the Pixel Formatter device: Taken from MAS */
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIXEL_FORMATTER_SECTION_COUNT		(0x0)
+
+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIXEL_FORMATTER_SECTION_COUNT		(1)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIXEL_FORMATTER_MAX_SIZE_SECTION_0		(0x8)
+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIXEL_FORMATTER_DEST_OFFSET_SECTION_0	(0x20) /* Base address of Start register in the Pixel Formatter device: Taken from MAS
+											and base address of size register in the Pixel Formatter device is 0x24. */
+
+/* TODO: REMOVE BACKWARD COMPATIBILITY */
+/* NOT USED defs - needed for legacy*/
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_SECTION_COUNT					IA_P2P_PARAM_IN_TERMINAL_FF_AWB_STATISTICS_SECTION_COUNT
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0			IA_P2P_PARAM_IN_TERMINAL_FF_AWB_STATISTICS_SECTION_0_SIZE
+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0			IA_P2P_PARAM_IN_TERMINAL_FF_AWB_STATISTICS_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT				IA_P2P_PROGRAM_TERMINAL_FF_AWB_STATISTICS_SECTION_COUNT
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0				IA_P2P_PROGRAM_TERMINAL_FF_AWB_STATISTICS_SECTION_0_SIZE
+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_SECTION_COUNT					IA_P2P_PROGRAM_TERMINAL_FF_AWB_STATISTICS_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_IDS_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_1
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_2
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_2
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_3
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_3
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_4 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_4
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_4 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_4
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_IDS_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_IDS_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_IDS_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_IDS_MAX_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_IDS_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_IDS_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_IDS_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_DPC_SECTION_COUNT
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_1
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_2
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_2
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_3
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_3
+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_SECTION_COUNT IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SECTION_COUNT
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_1
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_0
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_0
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_1
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_1
+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_1
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_DPC_SECTION_COUNT
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_0
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_1
+#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_1
+/* END OF TODO */
+
+#endif /* __IA_CSS_ISA_PARAMETER_DEFS_DEP_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap.h
new file mode 100644
index 000000000000..8670a1c80d4c
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap.h
@@ -0,0 +1,262 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_KERNEL_BITMAP_H
+#define __IA_CSS_KERNEL_BITMAP_H
+
+/*! \file */
+
+/** @file ia_css_kernel_bitmap.h
+ *
+ * The types and operations to make logic decisions given kernel bitmaps
+ * "ia_css_kernel_bitmap_t" can be larger than native types
+ */
+
+#include <type_support.h>
+#include "vied_nci_psys_resource_model.h"
+#include "ia_css_kernel_bitmap_storage_class.h"
+
+/**
+ * @addtogroup group_psysapi
+ * @{
+ */
+
+#define IA_CSS_KERNEL_BITMAP_ELEM_TYPE uint32_t
+#define IA_CSS_KERNEL_BITMAP_ELEM_BITS \
+	(sizeof(IA_CSS_KERNEL_BITMAP_ELEM_TYPE)*8)
+#define IA_CSS_KERNEL_BITMAP_NOF_ELEMS \
+	((IA_CSS_KERNEL_BITMAP_BITS) / (IA_CSS_KERNEL_BITMAP_ELEM_BITS))
+
+/** An element is a 32 bit unsigned integer. 64 bit integers might cause
+ * problems in the compiler.
+ */
+typedef struct {
+	IA_CSS_KERNEL_BITMAP_ELEM_TYPE data[IA_CSS_KERNEL_BITMAP_NOF_ELEMS];
+} ia_css_kernel_bitmap_elems_t;
+
+/** Users should make no assumption about the actual type of
+ * ia_css_kernel_bitmap_t.
+ * Users should use IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS in
+ * case they erroneously assume that this type is uint64_t and they
+ * cannot change their implementation.
+ */
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+typedef ia_css_kernel_bitmap_elems_t ia_css_kernel_bitmap_t;
+#else
+typedef uint64_t ia_css_kernel_bitmap_t;
+#if IA_CSS_KERNEL_BITMAP_BITS > 64
+#error IA_CSS_KERNEL_BITMAP_BITS > 64 not supported \
+	with IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+#endif
+#endif
+
+/*! Print the bits of a kernel bitmap
+
+ @return < 0 on error
+ */
+extern int ia_css_kernel_bitmap_print(
+	const ia_css_kernel_bitmap_t	bitmap,
+	void				*fid);
+
+/*! Create an empty kernel bitmap
+
+ @return bitmap = 0
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_clear(void);
+
+/*! Creates the complement of a kernel bitmap
+ * @param	[in] bitmap kernel bitmap
+ * @return ~bitmap
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_complement(
+	const ia_css_kernel_bitmap_t bitmap);
+
+/*! Create the union of two kernel bitmaps
+
+ @param	[in] bitmap0					kernel bitmap 0
+ @param	[in] bitmap1					kernel bitmap 1
+
+ @return bitmap0 | bitmap1
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_union(
+	const ia_css_kernel_bitmap_t			bitmap0,
+	const ia_css_kernel_bitmap_t			bitmap1);
+
+/*! Create the intersection of two kernel bitmaps
+
+ @param	[in] bitmap0					kernel bitmap 0
+ @param	[in] bitmap1					kernel bitmap 1
+
+ @return bitmap0 & bitmap1
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_intersection(
+	const ia_css_kernel_bitmap_t			bitmap0,
+	const ia_css_kernel_bitmap_t			bitmap1);
+
+/*! Check if the kernel bitmaps is empty
+
+ @param	[in] bitmap					kernel bitmap
+
+ @return bitmap == 0
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+bool ia_css_is_kernel_bitmap_empty(
+	const ia_css_kernel_bitmap_t			bitmap);
+
+/*! Check if the intersection of two kernel bitmaps is empty
+
+ @param	[in] bitmap0					kernel bitmap 0
+ @param	[in] bitmap1					kernel bitmap 1
+
+ @return (bitmap0 & bitmap1) == 0
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+bool ia_css_is_kernel_bitmap_intersection_empty(
+	const ia_css_kernel_bitmap_t			bitmap0,
+	const ia_css_kernel_bitmap_t			bitmap1);
+
+/*! Check if the second kernel bitmap is a subset of the first (or equal)
+
+ @param	[in] bitmap0					kernel bitmap 0
+ @param	[in] bitmap1					kernel bitmap 1
+
+ Note: An empty set is always a subset, this function
+ returns true if bitmap 1 is empty
+
+ @return (bitmap0 & bitmap1) == bitmap1
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+bool ia_css_is_kernel_bitmap_subset(
+	const ia_css_kernel_bitmap_t			bitmap0,
+	const ia_css_kernel_bitmap_t			bitmap1);
+
+/*! Check if the kernel bitmaps are equal
+
+ @param	[in] bitmap0					kernel bitmap 0
+ @param	[in] bitmap1					kernel bitmap 1
+
+ @return bitmap0 == bitmap1
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+bool ia_css_is_kernel_bitmap_equal(
+	const ia_css_kernel_bitmap_t			bitmap0,
+	const ia_css_kernel_bitmap_t			bitmap1);
+
+/*! Right shift kernel bitmap
+
+ @param	[in] bitmap					kernel bitmap 0
+
+ @return bitmap >> 1
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_shift(
+	const ia_css_kernel_bitmap_t			bitmap);
+
+/*! Check if the kernel bitmaps contains only a single element
+
+ @param	[in] bitmap					kernel bitmap
+
+ @return weight(bitmap) == 1
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+bool ia_css_is_kernel_bitmap_onehot(
+	const ia_css_kernel_bitmap_t			bitmap);
+
+/*! Checks whether a specific kernel bit is set
+ * @return bitmap[index] == 1
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+int ia_css_is_kernel_bitmap_set(
+	const ia_css_kernel_bitmap_t	bitmap,
+	const unsigned int		index);
+
+/*! Create the union of a kernel bitmap with a onehot bitmap
+ * with a bit set at index
+
+ @return bitmap[index] |= 1
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set(
+	const ia_css_kernel_bitmap_t			bitmap,
+	const unsigned int						index);
+
+/*! Set elem_index-th 32-bit element of the bitmap
+ * to elem_value
+
+ @return updated bitmap
+ */
+extern ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_element_from_uint32(
+	ia_css_kernel_bitmap_t			bitmap,
+	const unsigned int			elem_index,
+	const uint32_t				elem_value);
+
+/*! Creates kernel bitmap using a uint64 value.
+ * @return bitmap with the same bits set as in value (provided that width of bitmap is sufficient).
+ */
+extern ia_css_kernel_bitmap_t ia_css_kernel_bitmap_create_from_uint64(
+	const uint64_t	value);
+
+/*! Converts an ia_css_kernel_bitmap_t type to uint64_t. Note that if
+ *  ia_css_kernel_bitmap_t contains more then 64 bits, only the lowest 64 bits
+ *  are returned.
+ *  @return uint64_t representation of value
+*/
+extern uint64_t ia_css_kernel_bitmap_to_uint64(
+	const ia_css_kernel_bitmap_t value);
+
+/*! Creates a kernel bitmap with the bit at index 'index' removed.
+ * @return ~(1 << index) & bitmap
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_unset(
+	const ia_css_kernel_bitmap_t	bitmap,
+	const unsigned int		index);
+
+/*! Set a previously clear field of a kernel bitmap at index
+
+ @return if bitmap[index] == 0, bitmap[index] -> 1, else 0
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_unique(
+	const ia_css_kernel_bitmap_t			bitmap,
+	const unsigned int						index);
+
+/*! Create a onehot kernel bitmap with a bit set at index
+
+ @return bitmap[index] = 1
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_kernel_bit_mask(
+	const unsigned int						index);
+
+/*! Create a random bitmap
+
+ @return bitmap[index] = 1
+ */
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_kernel_ran_bitmap(void);
+
+/*! @} */
+
+#ifdef __IA_CSS_KERNEL_BITMAP_INLINE__
+#include "ia_css_kernel_bitmap_impl.h"
+#endif /* __IA_CSS_KERNEL_BITMAP_INLINE__ */
+
+#endif /* __IA_CSS_KERNEL_BITMAP_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_impl.h
new file mode 100644
index 000000000000..b0b9ea9c0add
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_impl.h
@@ -0,0 +1,340 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_KERNEL_BITMAP_IMPL_IMPL_H
+#define __IA_CSS_KERNEL_BITMAP_IMPL_IMPL_H
+
+#include <ia_css_kernel_bitmap.h>
+#include <type_support.h>
+#include <misc_support.h>
+#include <assert_support.h>
+#include "math_support.h"
+#include "ia_css_psys_kernel_trace.h"
+#include "ia_css_kernel_bitmap_storage_class.h"
+
+STORAGE_CLASS_INLINE
+int ia_css_kernel_bitmap_compute_weight(
+	const ia_css_kernel_bitmap_t			bitmap)
+{
+	ia_css_kernel_bitmap_t	loc_bitmap;
+	int	weight = 0;
+	int	i;
+
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+		       "ia_css_kernel_bitmap_compute_weight(): enter:\n");
+
+	loc_bitmap = bitmap;
+
+	/* In fact; do not need the iterator "i" */
+	for (i = 0; (i < IA_CSS_KERNEL_BITMAP_BITS) &&
+		    !ia_css_is_kernel_bitmap_empty(loc_bitmap); i++) {
+		weight += ia_css_is_kernel_bitmap_set(loc_bitmap, 0);
+		loc_bitmap = ia_css_kernel_bitmap_shift(loc_bitmap);
+	}
+
+	return weight;
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+bool ia_css_is_kernel_bitmap_intersection_empty(
+	const ia_css_kernel_bitmap_t			bitmap0,
+	const ia_css_kernel_bitmap_t			bitmap1)
+{
+	ia_css_kernel_bitmap_t intersection;
+
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+		"ia_css_is_kernel_bitmap_intersection_empty(): enter:\n");
+
+	intersection = ia_css_kernel_bitmap_intersection(bitmap0, bitmap1);
+	return ia_css_is_kernel_bitmap_empty(intersection);
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+bool ia_css_is_kernel_bitmap_empty(
+	const ia_css_kernel_bitmap_t			bitmap)
+{
+	unsigned int i;
+	bool is_empty = true;
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+		       "ia_css_is_kernel_bitmap_empty(): enter:\n");
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+	for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
+		is_empty &= bitmap.data[i] == 0;
+	}
+#else
+	NOT_USED(i);
+	is_empty = (bitmap == 0);
+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
+	return is_empty;
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+bool ia_css_is_kernel_bitmap_equal(
+	const ia_css_kernel_bitmap_t			bitmap0,
+	const ia_css_kernel_bitmap_t			bitmap1)
+{
+	unsigned int i;
+	bool is_equal = true;
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+		       "ia_css_is_kernel_bitmap_equal(): enter:\n");
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+	for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
+		is_equal = is_equal && (bitmap0.data[i] == bitmap1.data[i]);
+	}
+#else
+	NOT_USED(i);
+	is_equal = (bitmap0 == bitmap1);
+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
+	return is_equal;
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+bool ia_css_is_kernel_bitmap_onehot(
+	const ia_css_kernel_bitmap_t			bitmap)
+{
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+		       "ia_css_is_kernel_bitmap_onehot(): enter:\n");
+	return ia_css_kernel_bitmap_compute_weight(bitmap) == 1;
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+bool ia_css_is_kernel_bitmap_subset(
+	const ia_css_kernel_bitmap_t			bitmap0,
+	const ia_css_kernel_bitmap_t			bitmap1)
+{
+	ia_css_kernel_bitmap_t intersection;
+
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+		       "ia_css_is_kernel_bitmap_subset(): enter:\n");
+
+	intersection = ia_css_kernel_bitmap_intersection(bitmap0, bitmap1);
+	return ia_css_is_kernel_bitmap_equal(intersection, bitmap1);
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_clear(void)
+{
+	unsigned int i;
+	ia_css_kernel_bitmap_t bitmap = {{0} };
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+		       "ia_css_kernel_bitmap_clear(): enter:\n");
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+	for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
+		bitmap.data[i] = 0;
+	}
+#else
+	NOT_USED(i);
+	bitmap = 0;
+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
+	return bitmap;
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_complement(
+	const ia_css_kernel_bitmap_t bitmap)
+{
+	unsigned int i;
+	ia_css_kernel_bitmap_t result = {{0} };
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+		"ia_css_kernel_bitmap_complement(): enter:\n");
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+	for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
+		result.data[i] = ~bitmap.data[i];
+	}
+#else
+	NOT_USED(i);
+	result = ~bitmap;
+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
+	return result;
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_union(
+	const ia_css_kernel_bitmap_t			bitmap0,
+	const ia_css_kernel_bitmap_t			bitmap1)
+{
+	unsigned int i;
+	ia_css_kernel_bitmap_t result = {{0} };
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+		       "ia_css_kernel_bitmap_union(): enter:\n");
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+	for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
+		result.data[i] = (bitmap0.data[i] | bitmap1.data[i]);
+	}
+#else
+	NOT_USED(i);
+	result = (bitmap0 | bitmap1);
+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
+	return result;
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_intersection(
+	const ia_css_kernel_bitmap_t			bitmap0,
+	const ia_css_kernel_bitmap_t			bitmap1)
+{
+	unsigned int i;
+	ia_css_kernel_bitmap_t result = {{0} };
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+		       "ia_css_kernel_bitmap_intersection(): enter:\n");
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+	for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
+		result.data[i] = (bitmap0.data[i] & bitmap1.data[i]);
+	}
+#else
+	NOT_USED(i);
+	result = (bitmap0 & bitmap1);
+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
+	return result;
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set(
+	const ia_css_kernel_bitmap_t			bitmap,
+	const unsigned int						index)
+{
+	ia_css_kernel_bitmap_t	bit_mask;
+
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+		"ia_css_kernel_bitmap_set(): enter:\n");
+
+	bit_mask = ia_css_kernel_bit_mask(index);
+	return ia_css_kernel_bitmap_union(bitmap, bit_mask);
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_unset(
+	const ia_css_kernel_bitmap_t	bitmap,
+	const unsigned int		index)
+{
+	ia_css_kernel_bitmap_t result;
+
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+		"ia_css_kernel_bitmap_unset(): enter:\n");
+
+	result = ia_css_kernel_bit_mask(index);
+	result = ia_css_kernel_bitmap_complement(result);
+	return ia_css_kernel_bitmap_intersection(bitmap, result);
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_unique(
+	const ia_css_kernel_bitmap_t			bitmap,
+	const unsigned int						index)
+{
+	ia_css_kernel_bitmap_t	ret;
+	ia_css_kernel_bitmap_t	bit_mask;
+
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+		       "ia_css_kernel_bitmap_set_unique(): enter:\n");
+
+	ret = ia_css_kernel_bitmap_clear();
+	bit_mask = ia_css_kernel_bit_mask(index);
+
+	if (ia_css_is_kernel_bitmap_intersection_empty(bitmap, bit_mask)
+			&& !ia_css_is_kernel_bitmap_empty(bit_mask)) {
+		ret = ia_css_kernel_bitmap_union(bitmap, bit_mask);
+	}
+	return ret;
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_kernel_bit_mask(
+	const unsigned int						index)
+{
+	unsigned int elem_index;
+	unsigned int elem_bit_index;
+	ia_css_kernel_bitmap_t bit_mask = ia_css_kernel_bitmap_clear();
+
+	/* Assert disabled for staging, because some PGs do not satisfy this condition */
+	/* assert(index < IA_CSS_KERNEL_BITMAP_BITS); */
+
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+		"ia_css_kernel_bit_mask(): enter:\n");
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+	if (index < IA_CSS_KERNEL_BITMAP_BITS) {
+		elem_index     = index / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
+		elem_bit_index = index % IA_CSS_KERNEL_BITMAP_ELEM_BITS;
+		assert(elem_index < IA_CSS_KERNEL_BITMAP_NOF_ELEMS);
+
+		bit_mask.data[elem_index] = 1 << elem_bit_index;
+	}
+#else
+	NOT_USED(elem_index);
+	NOT_USED(elem_bit_index);
+	if (index < IA_CSS_KERNEL_BITMAP_BITS) {
+		bit_mask = (ia_css_kernel_bitmap_t)1 << index;
+	}
+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
+	return bit_mask;
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+int ia_css_is_kernel_bitmap_set(
+	const ia_css_kernel_bitmap_t	bitmap,
+	const unsigned int				index)
+{
+	unsigned int elem_index;
+	unsigned int elem_bit_index;
+
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+		       "ia_css_is_kernel_bitmap_set(): enter:\n");
+
+	assert(index < IA_CSS_KERNEL_BITMAP_BITS);
+
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+	elem_index     = index / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
+	elem_bit_index = index % IA_CSS_KERNEL_BITMAP_ELEM_BITS;
+	assert(elem_index < IA_CSS_KERNEL_BITMAP_NOF_ELEMS);
+	return (((bitmap.data[elem_index] >> elem_bit_index) & 0x1) == 1);
+#else
+	NOT_USED(elem_index);
+	NOT_USED(elem_bit_index);
+	return (((bitmap >> index) & 0x1) == 1);
+#endif /* IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS */
+}
+
+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_shift(
+	const ia_css_kernel_bitmap_t			bitmap)
+{
+	int i;
+	unsigned int lsb_current_elem = 0;
+	unsigned int lsb_previous_elem = 0;
+	ia_css_kernel_bitmap_t loc_bitmap;
+
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+		       "ia_css_kernel_bitmap_shift(): enter:\n");
+
+	loc_bitmap = bitmap;
+
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+	for (i = IA_CSS_KERNEL_BITMAP_NOF_ELEMS - 1; i >= 0; i--) {
+		lsb_current_elem = bitmap.data[i] & 0x01;
+		loc_bitmap.data[i] >>= 1;
+		loc_bitmap.data[i] |= (lsb_previous_elem << (IA_CSS_KERNEL_BITMAP_ELEM_BITS - 1));
+		lsb_previous_elem = lsb_current_elem;
+	}
+#else
+	NOT_USED(i);
+	NOT_USED(lsb_current_elem);
+	NOT_USED(lsb_previous_elem);
+	loc_bitmap >>= 1;
+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
+	return loc_bitmap;
+}
+
+#endif /* __IA_CSS_KERNEL_BITMAP_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_storage_class.h
new file mode 100644
index 000000000000..8b7cd391bd1b
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_storage_class.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+#define __IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
+
+#include "storage_class.h"
+
+#ifndef __IA_CSS_KERNEL_BITMAP_INLINE__
+#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
+#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
+#else
+#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H STORAGE_CLASS_INLINE
+#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C STORAGE_CLASS_INLINE
+#endif
+
+#endif /* __IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_user_param_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_user_param_types.h
new file mode 100644
index 000000000000..bf02f187c1b4
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_user_param_types.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_KERNEL_USER_PARAM_TYPES_H
+#define __IA_CSS_KERNEL_USER_PARAM_TYPES_H
+
+#include "type_support.h"
+
+#define KERNEL_USER_PARAM_S_PADDING 4
+
+#define SIZE_OF_KERNEL_USER_PARAM_S ( \
+	  (1 * IA_CSS_UINT64_T_BITS) \
+	+ (1 * IA_CSS_UINT32_T_BITS) \
+	+ (4 * IA_CSS_UINT16_T_BITS) \
+	+ (KERNEL_USER_PARAM_S_PADDING * IA_CSS_UINT8_T_BITS))
+
+/** \brief A kernel user parameter object.
+ * Always use ia_css_kernel_user_param_get_descriptor_size or
+ * ia_css_kernel_user_param_get_descriptor_size_using_kernel_info to get the
+ * appropriate size for the kernel user parameter object.
+ *
+ * Use an init function like ia_css_kernel_user_param_init to initialize
+ * the kernel user parameter object.
+ *
+ * Never instantiate this struct in a different way.
+ */
+typedef struct ia_css_kernel_user_param_s {
+	/* Parameter buffer handle attached to the terminal */
+	union {
+		void *p;
+		uint64_t not_used;  /* ensures same struct layout on 64 and 32 bit compilations */
+	} payload_buffer;
+	/* Buffer size */
+	uint32_t payload_buffer_size;
+	/* Points to the variable array of ia_css_kernel_user_param_desc_s */
+	uint16_t kernel_desc_offset;
+	/* Number of kernels in program group */
+	uint16_t kernel_count;
+	/* Number of fragments in frame */
+	uint16_t fragment_count;
+	/* Fragment stride in bytes */
+	uint16_t fragment_stride;
+	/* padding */
+	uint8_t padding[KERNEL_USER_PARAM_S_PADDING];
+} ia_css_kernel_user_param_t;
+
+typedef struct ia_css_kernel_user_param_kernel_desc_s {
+	/* kernel identifier */
+	uint32_t kernel_id;
+	/* Points to the variable array of ia_css_kernel_user_param_cfg_desc_t */
+	uint16_t cfg_desc_offset;
+	/* Number of configurations for this kernel */
+	uint16_t cfg_desc_count;
+} ia_css_kernel_user_param_kernel_desc_t;
+
+typedef struct ia_css_kernel_user_param_cfg_desc_s {
+	/* Offset of the parameter allocation in memory */
+	uint32_t mem_offset;
+	/* Memory allocation size needs of this parameter */
+	uint32_t mem_size;
+} ia_css_kernel_user_param_cfg_desc_t;
+
+/*!
+ * Construction information to construct a kernel user param object.
+ * This type is only used for ia_css_kernel_user_param_init and
+ * ia_css_kernel_user_param_get_descriptor_size_using_kernel_info.
+ */
+typedef struct ia_css_kernel_user_param_kernel_info_s {
+	uint32_t kernel_id;
+	uint16_t section_count;
+	uint32_t *section_sizes; /**< Array of size section_count. Each element
+		encode the size in bytes or a kernel config (section). */
+} ia_css_kernel_user_param_kernel_info_t;
+
+#endif /* __IA_CSS_KERNEL_USER_PARAM_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_param_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_param_storage_class.h
new file mode 100644
index 000000000000..6716c1ec30f2
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_param_storage_class.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PARAM_STORAGE_CLASS_H
+#define __IA_CSS_PARAM_STORAGE_CLASS_H
+
+#include "storage_class.h"
+
+#ifndef __INLINE_PARAMETERS__
+#define IA_CSS_PARAMETERS_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
+#define IA_CSS_PARAMETERS_STORAGE_CLASS_C
+#else
+#define IA_CSS_PARAMETERS_STORAGE_CLASS_H STORAGE_CLASS_INLINE
+#define IA_CSS_PARAMETERS_STORAGE_CLASS_C STORAGE_CLASS_INLINE
+#endif
+
+#endif /* __IA_CSS_PARAM_STORAGE_CLASS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data.h
new file mode 100644
index 000000000000..a12da5873188
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data.h
@@ -0,0 +1,449 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PROGRAM_GROUP_DATA_H
+#define __IA_CSS_PROGRAM_GROUP_DATA_H
+
+#include "ia_css_psys_data_storage_class.h"
+
+/*! \file */
+
+/** @file ia_css_program_group_data.h
+ *
+ * Define the data objects that are passed to the process groups
+ * i.e. frames and matrices with their sub-structures
+ *
+ * The data objects are separate from the process group terminal,
+ * although they are stored by value rather than by reference and
+ * make the process group terminal dependendent on its definition
+ *
+ * This frame definition overloads the current CSS frame definition
+ * they are the same object, just a slightly different implementation
+ */
+
+#include <vied_nci_psys_system_global.h>	/* vied_vaddress_t */
+
+#include <type_support.h>
+#include "ia_css_program_group_data_defs.h"	/* ia_css_frame_format_type */
+
+#include "ia_css_terminal_defs.h"
+
+/**
+ * Frame buffer state used for sequencing
+ * (see FAS 5.5.3)
+ *
+ * The buffer can be in DDR or a handle to a stream
+ */
+typedef enum ia_css_buffer_state {
+	IA_CSS_BUFFER_NULL = 0,
+	IA_CSS_BUFFER_UNDEFINED,
+	IA_CSS_BUFFER_EMPTY,
+	IA_CSS_BUFFER_NONEMPTY,
+	IA_CSS_BUFFER_FULL,
+	IA_CSS_N_BUFFER_STATES
+} ia_css_buffer_state_t;
+
+#define IA_CSS_BUFFER_STATE_IN_BITS	32
+
+/**
+ * Pointer state used to signal MMU invalidation
+ */
+typedef enum ia_css_pointer_state {
+	IA_CSS_POINTER_INVALID = 0,
+	IA_CSS_POINTER_VALID,
+	IA_CSS_N_POINTER_STATES
+} ia_css_pointer_state_t;
+
+#define IA_CSS_POINTER_STATE_IN_BITS	32
+
+/**
+ * Access direction needed to select the access port
+ *
+ * @note No known use of any literal in this
+ * enumeration.
+ */
+typedef enum ia_css_access_type {
+	IA_CSS_ACCESS_LOCKED = 0,
+	IA_CSS_ACCESS_READ,
+	IA_CSS_ACCESS_WRITE,
+	IA_CSS_ACCESS_MODIFY,
+	IA_CSS_N_ACCESS_TYPES
+} ia_css_access_type_t;
+
+#define IA_CSS_ACCESS_TYPE_IN_BITS	32
+
+/**
+ * Access attribute needed to select the access port
+ *	- public : snooped
+ *	- private: non-snooped
+ * Naming is a bit awkward, lack of inspiration
+ *
+ * @note No known use of any literal in this
+ * enumeration.
+ */
+typedef enum ia_css_access_scope {
+	IA_CSS_ACCESS_PRIVATE = 0,
+	IA_CSS_ACCESS_PUBLIC,
+	IA_CSS_N_ACCESS_SCOPES
+} ia_css_access_scopes_t;
+
+#define IA_CSS_ACCESS_SCOPES_IN_BITS	32
+
+#define IA_CSS_N_FRAME_PLANES			6
+
+#define IA_CSS_FRAME_FORMAT_BITMAP_BITS	64
+
+typedef uint64_t ia_css_frame_format_bitmap_t;
+
+typedef struct ia_css_param_frame_descriptor_s ia_css_param_frame_descriptor_t;
+typedef struct ia_css_param_frame_s		ia_css_param_frame_t;
+
+typedef struct ia_css_frame_descriptor_s	ia_css_frame_descriptor_t;
+typedef struct ia_css_frame_s				ia_css_frame_t;
+typedef struct ia_css_fragment_descriptor_s	ia_css_fragment_descriptor_t;
+
+typedef struct ia_css_stream_s			ia_css_stream_t;
+
+#define	N_UINT64_IN_STREAM_STRUCT			1
+
+#define	IA_CSS_STREAM_STRUCT_BITS \
+	(N_UINT64_IN_STREAM_STRUCT * 64)
+
+struct ia_css_stream_s {
+	uint64_t dummy;
+};
+
+struct ia_css_param_frame_descriptor_s {
+	uint16_t	size;		/**< Size of the descriptor */
+	uint32_t	buffer_count;	/**< Number of parameter buffers */
+};
+
+struct ia_css_param_frame_s {
+	/** Base virtual addresses to parameters in subsystem virtual
+	 * memory space
+	 */
+	vied_vaddress_t *data;
+};
+
+#define IA_CSS_N_CMPR_OFFSET_PLANES  IA_CSS_N_FRAME_PLANES
+
+#define N_UINT32_IN_FRAME_DESC_STRUCT \
+	(1 + IA_CSS_N_FRAME_PLANES + IA_CSS_N_CMPR_OFFSET_PLANES + (IA_CSS_N_DATA_DIMENSION - 1))
+#define N_UINT16_IN_FRAME_DESC_STRUCT (1 + IA_CSS_N_DATA_DIMENSION)
+#define N_UINT8_IN_FRAME_DESC_STRUCT 4
+#define N_PADDING_UINT8_IN_FRAME_DESC_STRUCT 2
+
+#define	IA_CSS_FRAME_DESCRIPTOR_STRUCT_BITS \
+	(IA_CSS_FRAME_FORMAT_TYPE_BITS \
+	+ (N_UINT32_IN_FRAME_DESC_STRUCT * 32) \
+	+ (N_UINT16_IN_FRAME_DESC_STRUCT * 16) \
+	+ (N_UINT8_IN_FRAME_DESC_STRUCT * 8) \
+	+ (N_PADDING_UINT8_IN_FRAME_DESC_STRUCT * 8))
+
+/**
+ * Structure defining the frame (size and access) properties for
+ * inbuild types only.
+ *
+ * The inbuild types like FourCC, MIPI and CSS private types are supported
+ * by FW all other types are custom types which interpretation must be encoded
+ * on the buffer itself or known by the source and sink
+ */
+struct ia_css_frame_descriptor_s {
+	/** Indicates if this is a generic type or inbuild with
+	  * variable size descriptor.
+	  */
+	ia_css_frame_format_type_t frame_format_type;
+	/** Number of data planes (pointers) */
+	uint32_t plane_count;
+	/** Plane offsets accounting for fragments */
+	uint32_t plane_offsets[IA_CSS_N_FRAME_PLANES];
+	/** Physical size aspects */
+	uint32_t stride[IA_CSS_N_DATA_DIMENSION - 1];
+	/** Tile status buffer offsets for DEC400 compression */
+	uint32_t ts_offsets[IA_CSS_N_FRAME_PLANES];
+	/** Logical dimensions */
+	uint16_t dimension[IA_CSS_N_DATA_DIMENSION];
+	/** Size of this descriptor */
+	uint16_t size;
+	/** Bits per pixel (meaningful bits, AKA precision) */
+	uint8_t bpp;
+	/** Bits per element (bits required for storage of the pixel in memory) */
+	uint8_t bpe;
+	/** 1 if terminal uses compressed datatype, 0 otherwise */
+	uint8_t is_compressed;
+	/** 1 if pixel data is signed, 0 otherwise */
+	uint8_t is_signed;
+	/** Padding for 64bit alignment */
+	uint8_t padding[N_PADDING_UINT8_IN_FRAME_DESC_STRUCT];
+};
+
+#define	N_UINT32_IN_FRAME_STRUCT		2
+#define	N_PADDING_UINT8_IN_FRAME_STRUCT	4
+
+#define	IA_CSS_FRAME_STRUCT_BITS \
+	(IA_CSS_BUFFER_STATE_IN_BITS \
+	+ IA_CSS_ACCESS_TYPE_IN_BITS \
+	+ IA_CSS_POINTER_STATE_IN_BITS \
+	+ IA_CSS_ACCESS_SCOPES_IN_BITS \
+	+ VIED_VADDRESS_BITS \
+	+ (N_UINT32_IN_FRAME_STRUCT * 32) \
+	+ (N_PADDING_UINT8_IN_FRAME_STRUCT * 8))
+
+/**
+ * Main frame structure holding the main store and auxilary access properties
+ * the "pointer_state" and "access_scope" should be encoded on the
+ * "vied_vaddress_t" type
+ *
+ * @note A number of fields in this structure are either no longer
+ * used, or their use is trivialized, in the current code base.  This is
+ * due to the Persistent Program Group (PPG) concept which separated the
+ * attatchment of frame buffers into a separate structure, the buffer set.
+ * @par Set all unused fields to zero, unless otherwise noted.
+ * @see ia_css_buffer_set_s
+ */
+struct ia_css_frame_s {
+	/** State of the frame for purpose of sequencing.
+	 *
+	 *  @note This field is apparently a leftover from the pre-PPG
+	 *  type of program group and no longer has any real use.
+	 *  For PPG's, set to IA_CSS_BUFFER_FULL for input frames and
+	 *  IA_CSS_BUFFER_EMPTY for output frames */
+	ia_css_buffer_state_t buffer_state;
+	/** Access direction, may change when buffer state changes.
+	 *
+	 *  @note Cannot find any use of this. */
+	ia_css_access_type_t access_type;
+	/** State of the pointer for purpose of embedded MMU coherency
+	 * @note No known non-trivial use of the field.
+	 */
+	ia_css_pointer_state_t pointer_state;
+	/** Access to the pointer for purpose of host cache coherency
+	*  @note Cannot find any use of this. */
+	ia_css_access_scopes_t access_scope;
+	/** Base virtual address to data in IPU subsystem virtual memory space.
+	 *  @note No longer used for PPG's */
+	vied_vaddress_t data;
+	/** Index into the array of buffer addresses within the buffer set structure
+	 *  which is sent separately. The value at that location replaces the
+	 *  "data" field in this structure.  */
+	uint32_t data_index;
+	/** Total buffer allocation size in bytes */
+	uint32_t data_bytes;
+	/** Padding for 64bit alignment */
+	uint8_t padding[N_PADDING_UINT8_IN_FRAME_STRUCT];
+};
+
+#define	N_UINT16_IN_FRAGMENT_DESC_STRUCT	(3 * IA_CSS_N_DATA_DIMENSION)
+#define	N_PADDING_UINT8_IN_FRAGMENT_DESC_STRUCT 4
+
+#define	IA_CSS_FRAGMENT_DESCRIPTOR_STRUCT_BITS \
+	((N_UINT16_IN_FRAME_DESC_STRUCT * 16) \
+	+ (N_PADDING_UINT8_IN_FRAGMENT_DESC_STRUCT * 8))
+
+/**
+ * Structure defining the fragment (size and access) properties.
+ *
+ * All cropping and padding effects are described by the difference between
+ * the frame size and its location and the fragment size(s) and location(s)
+ */
+struct ia_css_fragment_descriptor_s {
+	/** Logical dimensions of the fragment */
+	uint16_t dimension[IA_CSS_N_DATA_DIMENSION];
+	/** Logical location of the fragment in the frame */
+	uint16_t index[IA_CSS_N_DATA_DIMENSION];
+	/** Fractional start (phase) of the fragment in the access unit */
+	uint16_t offset[IA_CSS_N_DATA_DIMENSION];
+	/** Padding for 64bit alignment */
+	uint8_t padding[N_PADDING_UINT8_IN_FRAGMENT_DESC_STRUCT];
+};
+
+/*! Print the frame object to file/stream
+
+ @param	frame[in]			frame object
+ @param	fid[out]			file/stream handle
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+int ia_css_frame_print(
+	const ia_css_frame_t *frame, void *fid);
+
+/*! Get the data buffer handle from the frame object
+
+@param	frame[in]			frame object
+
+@return buffer pointer, VIED_NULL on error
+*/
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+const vied_vaddress_t *ia_css_frame_get_buffer_host_virtual_address(
+	const ia_css_frame_t *frame);
+
+/*! Get the data buffer handle from the frame object
+
+ @param	frame[in]			frame object
+
+ @return buffer pointer, VIED_NULL on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+vied_vaddress_t ia_css_frame_get_buffer(const ia_css_frame_t *frame);
+
+/*! Set the data buffer handle on the frame object
+
+ @param	frame[in]			frame object
+ @param	buffer[in]			buffer pointer
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+int ia_css_frame_set_buffer(
+	ia_css_frame_t *frame, vied_vaddress_t buffer);
+
+/*! Get the data buffer index in the frame object
+
+ @param	frame[in]			frame object
+
+ @return data buffer index on success, -1 on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+int ia_css_frame_get_data_index(
+	const ia_css_frame_t *frame);
+
+/*! Set the data buffer index in the frame object
+
+ @param	frame[in]			frame object
+ @param	data_index[in]			data buffer index
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+int ia_css_frame_set_data_index(
+	ia_css_frame_t *frame,
+	unsigned int data_index);
+
+/*! Set the data buffer size on the frame object
+
+ @param	frame[in]			frame object
+ @param	size[in]			number of data bytes
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+int ia_css_frame_set_data_bytes(
+	ia_css_frame_t *frame, unsigned size);
+
+/*! Get the data buffer state from the frame object
+
+ @param	frame[in]			frame object
+
+ @return buffer state, limit value on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+ia_css_buffer_state_t ia_css_frame_get_buffer_state(
+	const ia_css_frame_t *frame);
+
+/*! Set the data buffer state of the frame object
+
+ @param	frame[in]			frame object
+ @param	buffer_state[in]		buffer state
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+int ia_css_frame_set_buffer_state(ia_css_frame_t *frame,
+	const ia_css_buffer_state_t buffer_state);
+
+/*! Get the data pointer state from the frame object
+
+ @param	frame[in]			frame object
+
+ @return pointer state, limit value on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+ia_css_pointer_state_t ia_css_frame_get_pointer_state(
+	const ia_css_frame_t *frame);
+
+/*! Set the data pointer state of the frame object
+
+ @param	frame[in]			frame object
+ @param	pointer_state[in]		pointer state
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+int ia_css_frame_set_pointer_state(ia_css_frame_t *frame,
+	const ia_css_pointer_state_t pointer_state);
+
+/*! Print the frame descriptor object to file/stream
+
+ @param	frame_descriptor[in]	frame descriptor object
+ @param	fid[out]		file/stream handle
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+int ia_css_frame_descriptor_print(
+	const ia_css_frame_descriptor_t *frame_descriptor, void *fid);
+
+/*! Print the fragment descriptor object to file/stream
+
+ @param	fragment_descriptor[in]	fragment descriptor object
+ @param	fid[out]		file/stream handle
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+int ia_css_fragment_descriptor_print(
+	const ia_css_fragment_descriptor_t *fragment_descriptor, void *fid);
+
+/*! Compute the bitmap for the frame format type
+
+ @param	frame_format_type[in]	frame format type
+
+ @return 0 on error
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+ia_css_frame_format_bitmap_t ia_css_frame_format_bit_mask(
+	const ia_css_frame_format_type_t frame_format_type);
+
+/*! clear frame format bitmap
+
+ @return cleared bitmap
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+ia_css_frame_format_bitmap_t ia_css_frame_format_bitmap_clear(void);
+
+/*! Compute the size of storage required for the data descriptor object
+ * on a terminal
+ *@param       plane_count[in]	The number of data planes in the buffer
+ */
+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+size_t ia_css_sizeof_frame_descriptor(
+		const uint8_t plane_count);
+/*! Compute the size of storage required for the kernel parameter descriptor
+ * object on a terminal
+
+ @param	section_count[in]	The number of parameter sections in the buffer
+
+ @return 0 on error
+ */
+extern size_t ia_css_sizeof_kernel_param_descriptor(
+	const uint16_t section_count);
+
+#ifdef __IA_CSS_PSYS_DATA_INLINE__
+#include "ia_css_program_group_data_impl.h"
+#endif /* __IA_CSS_PSYS_DATA_INLINE__ */
+
+#endif /* __IA_CSS_PROGRAM_GROUP_DATA_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_defs.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_defs.h
new file mode 100644
index 000000000000..6033eee6d191
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_defs.h
@@ -0,0 +1,244 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PROGRAM_GROUP_DATA_DEFS_H
+#define __IA_CSS_PROGRAM_GROUP_DATA_DEFS_H
+
+#include "frame_support.h"
+
+/**
+ * Pre-defined frame format
+ *
+ * Those formats have inbuild support of traffic
+ * and access functions
+ *
+ * Note that the formats are for terminals, so there
+ * is no distinction between input and output formats
+ *	- Custom formats with ot without descriptor
+ *	- 4CC formats such as YUV variants
+ *	- MIPI (line) formats as produced by CSI receivers
+ *	- MIPI (sensor) formats such as Bayer or RGBC
+ *	- CSS internal formats (private types)
+ *  - CSS parameters (type 1 - 6)
+ */
+#define IA_CSS_FRAME_FORMAT_TYPE_BITS 32
+typedef enum ia_css_frame_format_type {
+	IA_CSS_DATA_CUSTOM_NO_DESCRIPTOR = 0,
+	IA_CSS_DATA_CUSTOM,
+
+	/** 12 bit YUV 411, Y, UV 2-plane  (8 bit per element) */
+	IA_CSS_DATA_FORMAT_NV11,
+	/** bpp bit YUV 420, Y, U, V 3-plane (bpp/1.5 bpe) */
+	IA_CSS_DATA_FORMAT_YUV420,
+	/** 12 bit YUV 420, Y, V, U 3-plane (8 bit per element) */
+	IA_CSS_DATA_FORMAT_YV12,
+	/** 12 bit YUV 420, Y, UV 2-plane (8 bit per element) */
+	IA_CSS_DATA_FORMAT_NV12,
+	/** 16 bit YUV 420, Y, UV 2-plane (8 bit per element) */
+	IA_CSS_DATA_FORMAT_NV12_16,
+	/** 12 bit YUV 420, Intel proprietary tiled format, TileY */
+	IA_CSS_DATA_FORMAT_NV12_TILEY,
+	/** 12 bit YUV 420, Y, VU 2-plane  (8 bit per element) */
+	IA_CSS_DATA_FORMAT_NV21,
+	/** bpp bit YUV 422, Y, U, V 3-plane (bpp/2 bpe) */
+	IA_CSS_DATA_FORMAT_YUV422,
+	/** 16 bit YUV 422, Y, V, U 3-plane  (8 bit per element) */
+	IA_CSS_DATA_FORMAT_YV16,
+	/** 16 bit YUV 422, Y, UV 2-plane  (8 bit per element) */
+	IA_CSS_DATA_FORMAT_NV16,
+	/** 16 bit YUV 422, Y, VU 2-plane  (8 bit per element) */
+	IA_CSS_DATA_FORMAT_NV61,
+	/** 16 bit YUV 422, UYVY 1-plane interleaved  (8 bit per element) */
+	IA_CSS_DATA_FORMAT_UYVY,
+	/** 16 bit YUV 422, YUYV 1-plane interleaved  (8 bit per element) */
+	IA_CSS_DATA_FORMAT_YUYV,
+	/** bpp bit YUV 444, Y, U, V 3-plane (bpp/3 bpe) */
+	IA_CSS_DATA_FORMAT_YUV444,
+	/** 8 bit monochrome plane */
+	IA_CSS_DATA_FORMAT_Y800,
+
+	/** 5-6-5 bit packed (1-plane) RGB (16bpp, ~5 bpe) */
+	IA_CSS_DATA_FORMAT_RGB565,
+	/** 24 bit RGB, 3 planes  (8 bit per element) */
+	IA_CSS_DATA_FORMAT_RGB888,
+	/** 32 bit RGB-Alpha, 1 plane  (8 bit per element) */
+	IA_CSS_DATA_FORMAT_RGBA888,
+
+	/** bpp bit raw, [[Gr, R];[B, Gb]] 1-plane (bpp == bpe) */
+	IA_CSS_DATA_FORMAT_BAYER_GRBG,
+	/** bpp bit raw, [[R, Gr];[Gb, B]] 1-plane (bpp == bpe) */
+	IA_CSS_DATA_FORMAT_BAYER_RGGB,
+	/** bpp bit raw, [[B, Gb];[Gr, R]] 1-plane (bpp == bpe) */
+	IA_CSS_DATA_FORMAT_BAYER_BGGR,
+	/** bpp bit raw, [[Gb, B];[R, Gr]] 1-plane (bpp == bpe) */
+	IA_CSS_DATA_FORMAT_BAYER_GBRG,
+
+	/** bpp bit (NV12) YUV 420, Y, UV 2-plane derived 3-line,
+	 * 2-Y, 1-UV (bpp/1.5 bpe): M420 format
+	 */
+	IA_CSS_DATA_FORMAT_YUV420_LINE,
+	/** Deprecated RAW, 1 plane */
+	IA_CSS_DATA_FORMAT_RAW,
+	/** Deprecated RAW, 1 plane, packed */
+	IA_CSS_DATA_FORMAT_RAW_PACKED,
+	/** Internal, for advanced ISP */
+	IA_CSS_DATA_FORMAT_QPLANE6,
+	/** 1D byte stream, used for jpeg 1-plane */
+	IA_CSS_DATA_FORMAT_BINARY_8,
+	/** Deprecated MIPI frame, 1D byte stream 1 plane */
+	IA_CSS_DATA_FORMAT_MIPI,
+	/** 12 bit [[YY];[UYVY]] 1-plane interleaved 2-line
+	 * (8 bit per element)
+	 */
+	IA_CSS_DATA_FORMAT_MIPI_YUV420_8,
+	/** 15 bit [[YY];[UYVY]] 1-plane interleaved 2-line
+	 * (10 bit per element)
+	 */
+	IA_CSS_DATA_FORMAT_MIPI_YUV420_10,
+	/** 12 bit [[UY];[VY]] 1-plane interleaved 2-line (8 bit per element) */
+	IA_CSS_DATA_FORMAT_MIPI_LEGACY_YUV420_8,
+
+	/** Type 1-5 parameter, not fragmentable */
+	IA_CSS_DATA_GENERIC_PARAMETER,
+	/** Video stabilisation Type 6 parameter, fragmentable */
+	IA_CSS_DATA_DVS_PARAMETER,
+	/** Video stabilisation Type 6 parameter, coordinates */
+	IA_CSS_DATA_DVS_COORDINATES,
+	/** Dead Pixel correction Type 6 parameter, fragmentable */
+	IA_CSS_DATA_DPC_PARAMETER,
+	/** Lens Shading Correction Type 6 parameter, fragmentable */
+	IA_CSS_DATA_LSC_PARAMETER,
+	/** 3A statistics output HI. */
+	IA_CSS_DATA_S3A_STATISTICS_HI,
+	/** 3A statistics output LO. */
+	IA_CSS_DATA_S3A_STATISTICS_LO,
+	/** histogram output */
+	IA_CSS_DATA_S3A_HISTOGRAM,
+	/** GammaStar grid */
+	IA_CSS_DATA_GAMMASTAR_GRID,
+
+	/** Gr R B Gb Gr R B Gb  in PIXELS  (also called isys interleaved) */
+	IA_CSS_DATA_FORMAT_BAYER_LINE_INTERLEAVED,
+	/** Gr R B Gb Gr R B Gb  in VECTORS (VCC IMAGE, ISP NWAY depentdent) */
+	IA_CSS_DATA_FORMAT_BAYER_VECTORIZED,
+	/** Gr R B Gb 4-planes */
+	IA_CSS_DATA_FORMAT_BAYER_PLANAR,
+	/** Gr R Gr R ... | B Gb B Gb ..  in VECTORS (ISP NWAY depentdent) */
+	IA_CSS_DATA_FORMAT_BAYER_GRBG_VECTORIZED,
+
+	/** 16 bit YUV 420, Y even plane, Y uneven plane,
+	 * UV plane vector interleaved
+	 */
+	IA_CSS_DATA_FORMAT_YUV420_VECTORIZED,
+	/** 16 bit YUV 420, YYUVYY vector interleaved */
+	IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED,
+
+	/** 12 bit YUV 420, Intel proprietary tiled format, TileYf */
+	IA_CSS_DATA_FORMAT_NV12_TILEYF,
+
+	/** Y samples appear first in the memory. All Y samples are array of WORDs;
+	* even number of lines ;
+	* Surface stride can be larger than the width of Y plane.
+	* This array is followed immediately by chroma array.
+	* Chroma array is an array of WORDs, with interleaved U/V samples.
+	* If the interleaved U/V plane is addresses as an * array of DWORDs,
+	* the least significant word contains U sample. The stride of the
+	* interleaved U/V plane is equal to Y plane. 10 bit data.
+	*/
+	IA_CSS_DATA_FORMAT_P010,
+
+	/** MSB aligned version of P010*/
+	IA_CSS_DATA_FORMAT_P010_MSB,
+
+	/** P016/P012 Y samples appear first in the memory.
+	* All Y samples are array of WORDs;
+	* even number of lines ;
+	* Surface stride can be larger than the width of Y plane.
+	* This array is followed immediately by chroma array.
+	* Chroma array is an array of WORDs, with interleaved U/V samples.
+	* If the interleaved U/V plane is addresses as an * array of DWORDs,
+	* the least significant word contains U sample. The stride of the
+	* interleaved U/V plane is equal to Y plane. 12 bit data.
+	*/
+	IA_CSS_DATA_FORMAT_P016,
+
+	/** MSB aligned version of P016*/
+	IA_CSS_DATA_FORMAT_P016_MSB,
+
+	/** TILEY representation of P010 LSB-aligned format */
+	IA_CSS_DATA_FORMAT_P010_TILEY,
+
+	/** TILEY representation of P010 MSB-aligned format */
+	IA_CSS_DATA_FORMAT_P010_MSB_TILEY,
+
+	/** TILEY representation of P016 LSB-aligned format */
+	IA_CSS_DATA_FORMAT_P016_TILEY,
+
+	/** TILEY representation of P016 MSB-aligned format*/
+	IA_CSS_DATA_FORMAT_P016_MSB_TILEY,
+
+	/** TILEYf representation of P010*/
+	IA_CSS_DATA_FORMAT_P010_TILEYF,
+
+	/** TILEYf representation of P010 MSB aligned*/
+	IA_CSS_DATA_FORMAT_P010_MSB_TILEYF,
+
+	/** TILEYf representation of P016*/
+	IA_CSS_DATA_FORMAT_P016_TILEYF,
+
+	/** TILEYf representation of P016 MSB aligned*/
+	IA_CSS_DATA_FORMAT_P016_MSB_TILEYF,
+
+	/** consists of L and R PDAF pixel line pairs.
+	 * If line n is L pixel line, n+1 will be R pixel line.
+	 * Depending on mode - First line can be L or R pixel line and
+	 * the line pair sequence can also alternate. 1-plane (bpp == bpe)
+	 */
+	IA_CSS_DATA_FORMAT_PAF_NON_INTERLEAVED,
+
+	/** consists of L and R PDAF pixel pairs.
+         * Depending on mode - Pixel pairs can be LRLR.., RLRL.. and
+         * alternating between the above two as well. 1-plane (bpp == bpe) */
+	IA_CSS_DATA_FORMAT_PAF_INTERLEAVED,
+
+	/** bpp bit raw, INFRA-RED (IR) 1-plane (bpp == bpe) */
+	IA_CSS_DATA_FORMAT_IR,
+
+	/** MSB aligned version of P012*/
+	IA_CSS_DATA_FORMAT_P012_MSB,
+
+	/* Each tile is stored in consecutive addresses in DDR.
+	 * The scanning walking order within a tile is raster order
+	 * (line-by-line).
+	 */
+	/* NV12 is a semi-planar (two planes) format: A plane of 8 bit Y samples
+	 * followed by an interleaved 8 bit U/V
+	 * samples plane.
+	 */
+	IA_CSS_DATA_FORMAT_NV12_TILE,
+	/*P010 is similar to NV12, but with 10 bit values,
+	 * each stored in a 16b container (msb aligned, 6 lsb are zero).
+	 */
+	IA_CSS_DATA_FORMAT_P010_TILE,
+	/* P012 is similar to P010, but with 12 bit values,
+	 * each stored in a 16b containers (msb aligned, 4 lsb are zero).
+	 */
+	IA_CSS_DATA_FORMAT_P012_TILE,
+
+	IA_CSS_N_FRAME_FORMAT_TYPES
+} ia_css_frame_format_type_t;
+
+#endif /* __IA_CSS_PROGRAM_GROUP_DATA_DEFS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_impl.h
new file mode 100644
index 000000000000..461e29bfef5f
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_impl.h
@@ -0,0 +1,461 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PROGRAM_GROUP_DATA_IMPL_H
+#define __IA_CSS_PROGRAM_GROUP_DATA_IMPL_H
+
+#include "ia_css_program_group_data.h"
+#include "ia_css_psys_data_trace.h"
+#include <error_support.h>	/* for verifexit */
+#include <assert_support.h>	/* for COMPILATION_ERROR_IF */
+#include <misc_support.h>	/* for NOT_USED */
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+int ia_css_frame_print(
+	const ia_css_frame_t *frame, void *fid)
+{
+	int retval = -1;
+
+	NOT_USED(fid);
+
+	IA_CSS_TRACE_0(PSYSAPI_DATA, INFO, "ia_css_frame_print(): enter:\n");
+
+	verifexit(frame != NULL);
+
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+		"\tbuffer = %d\n", ia_css_frame_get_buffer(frame));
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+		"\tbuffer_state = %d\n", ia_css_frame_get_buffer_state(frame));
+	/* IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\tbuffer_state = %s\n",
+	 * ia_css_buffer_state_string(ia_css_frame_get_buffer_state(frame)));
+	 */
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+	       "\tpointer_state = %d\n", ia_css_frame_get_pointer_state(frame));
+	/* IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\tpointer_state = %s\n",
+	 * ia_css_pointer_state_string(ia_css_frame_get_pointer_state(frame)));
+	 */
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+		"\tdata_bytes = %d\n", frame->data_bytes);
+
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
+			"ia_css_frame_print failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+const vied_vaddress_t *ia_css_frame_get_buffer_host_virtual_address(
+	const ia_css_frame_t *frame) {
+
+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+		"ia_css_frame_get_buffer_host_virtual_address(): enter:\n");
+
+	verifexit(frame != NULL);
+	return &(frame->data);
+
+EXIT:
+	if (NULL == frame) {
+		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
+			"ia_css_frame_get_buffer_host_virtual_address invalid argument\n");
+	}
+	return NULL;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+vied_vaddress_t	ia_css_frame_get_buffer(
+	const ia_css_frame_t *frame)
+{
+	vied_vaddress_t	buffer = VIED_NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+		"ia_css_frame_get_buffer(): enter:\n");
+
+	verifexit(frame != NULL);
+	buffer = frame->data;
+
+EXIT:
+	if (NULL == frame) {
+		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
+		       "ia_css_frame_get_buffer invalid argument\n");
+	}
+	return buffer;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+int ia_css_frame_set_buffer(
+	ia_css_frame_t *frame,
+	vied_vaddress_t buffer)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+		"ia_css_frame_set_buffer(): enter:\n");
+
+	verifexit(frame != NULL);
+	frame->data = buffer;
+
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
+			"ia_css_frame_set_buffer failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+int ia_css_frame_get_data_index(
+	const ia_css_frame_t *frame)
+{
+	int data_index = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+		"ia_css_frame_get_data_index(): enter:\n");
+
+	verifexit(frame != NULL);
+
+	data_index = frame->data_index;
+
+EXIT:
+	if (NULL == frame) {
+		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
+		       "ia_css_frame_get_data_index invalid argument\n");
+	}
+	return data_index;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+int ia_css_frame_set_data_index(
+	ia_css_frame_t *frame,
+	unsigned int data_index)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+		"ia_css_frame_set_data_index(): enter:\n");
+
+	verifexit(frame != NULL);
+
+	frame->data_index = data_index;
+
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
+			"ia_css_frame_set_data_index failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+int ia_css_frame_set_data_bytes(
+	ia_css_frame_t *frame,
+	unsigned int size)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+		"ia_css_frame_set_data_bytes(): enter:\n");
+
+	verifexit(frame != NULL);
+	frame->data_bytes = size;
+
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
+			"ia_css_frame_set_data_bytes failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+ia_css_buffer_state_t ia_css_frame_get_buffer_state(
+	const ia_css_frame_t *frame)
+{
+	ia_css_buffer_state_t buffer_state = IA_CSS_N_BUFFER_STATES;
+
+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+		"ia_css_frame_get_buffer_state(): enter:\n");
+
+	verifexit(frame != NULL);
+	buffer_state = frame->buffer_state;
+
+EXIT:
+	if (NULL == frame) {
+		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
+			"ia_css_frame_get_buffer_state invalid argument\n");
+	}
+	return buffer_state;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+int ia_css_frame_set_buffer_state(
+	ia_css_frame_t *frame,
+	const ia_css_buffer_state_t buffer_state)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+		"ia_css_frame_set_buffer_state(): enter:\n");
+
+	verifexit(frame != NULL);
+	frame->buffer_state = buffer_state;
+
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
+			"ia_css_frame_set_buffer_state failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+ia_css_pointer_state_t ia_css_frame_get_pointer_state(
+	const ia_css_frame_t *frame)
+{
+	ia_css_pointer_state_t pointer_state = IA_CSS_N_POINTER_STATES;
+
+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+		"ia_css_frame_get_pointer_state(): enter:\n");
+
+	verifexit(frame != NULL);
+	pointer_state = frame->pointer_state;
+
+EXIT:
+	if (NULL == frame) {
+		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
+			"ia_css_frame_get_pointer_state invalid argument\n");
+	}
+	return pointer_state;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+int ia_css_frame_set_pointer_state(
+	ia_css_frame_t *frame,
+	const ia_css_pointer_state_t pointer_state)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+		"ia_css_frame_set_pointer_state(): enter:\n");
+
+	verifexit(frame != NULL);
+	frame->pointer_state = pointer_state;
+
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
+			"ia_css_frame_set_pointer_state failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+int ia_css_frame_descriptor_print(
+	const ia_css_frame_descriptor_t *frame_descriptor,
+	void *fid)
+{
+	int retval = -1;
+	int i;
+	uint8_t frame_plane_count;
+
+	NOT_USED(fid);
+
+	IA_CSS_TRACE_0(PSYSAPI_DATA, INFO,
+		"ia_css_frame_descriptor_print(): enter:\n");
+
+	COMPILATION_ERROR_IF(IA_CSS_N_DATA_DIMENSION <= 0);
+
+	verifexit(frame_descriptor != NULL);
+
+	IA_CSS_TRACE_0(PSYSAPI_DATA, INFO,
+		"ia_css_frame_descriptor_print(): enter:\n");
+
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+		"\tframe_format_type = %d\n",
+		frame_descriptor->frame_format_type);
+	/* IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\tframe_format_type = %s\n",
+	 * ia_css_frame_format_string(frame_descriptor->frame_format_type));
+	 */
+
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+		"\tbpp = %d\n", frame_descriptor->bpp);
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+		"\tbpe = %d\n", frame_descriptor->bpe);
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+		"\tis_compressed = %d\n", frame_descriptor->is_compressed);
+
+	frame_plane_count = IA_CSS_N_FRAME_PLANES;
+	/* frame_plane_count =
+	 * ia_css_frame_plane_count(frame_descriptor->frame_format_type);
+	 */
+
+	verifexit(frame_plane_count > 0);
+
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+		"\tplane_offsets[%d]: [\n", frame_plane_count);
+	for (i = 0; i < (int)frame_plane_count - 1; i++) {
+		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+			"\t%4d,\n", frame_descriptor->plane_offsets[i]);
+	}
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+		"\t%4d ]\n", frame_descriptor->plane_offsets[i]);
+
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+		"\tts_offsets[%d]: [\n", frame_plane_count);
+	for (i = 0; i < (int)frame_plane_count - 1; i++) {
+		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+			"\t%4d,\n", frame_descriptor->ts_offsets[i]);
+	}
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+		"\t%4d ]\n", frame_descriptor->ts_offsets[i]);
+
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+		"\tdimension[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
+	for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
+		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+			"\t%4d,\n", frame_descriptor->dimension[i]);
+	}
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+		"\t%4d }\n", frame_descriptor->dimension[i]);
+
+	COMPILATION_ERROR_IF(0 > (IA_CSS_N_DATA_DIMENSION - 2));
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+		"\tstride[%d] = {\n", IA_CSS_N_DATA_DIMENSION - 1);
+	for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 2; i++) {
+		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+			"\t%4d,\n", frame_descriptor->stride[i]);
+	}
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+		"\t%4d }\n", frame_descriptor->stride[i]);
+
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
+			"ia_css_frame_descriptor_print failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+int ia_css_fragment_descriptor_print(
+	const ia_css_fragment_descriptor_t *fragment_descriptor,
+	void *fid)
+{
+	int retval = -1;
+	int i;
+
+	NOT_USED(fid);
+
+	IA_CSS_TRACE_0(PSYSAPI_DATA, INFO,
+		"ia_css_fragment_descriptor_print(): enter:\n");
+
+	verifexit(fragment_descriptor != NULL);
+
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+		"dimension[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
+	for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
+		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+			"\t%4d,\n", fragment_descriptor->dimension[i]);
+	}
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+		"\t%4d }\n", fragment_descriptor->dimension[i]);
+
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+		"index[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
+	for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
+		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+			"\t%4d,\n", fragment_descriptor->index[i]);
+	}
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+		"\t%4d }\n", fragment_descriptor->index[i]);
+
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+		"offset[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
+	for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
+		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
+			"\t%4d,\n", fragment_descriptor->offset[i]);
+	}
+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\t%4d }\n",
+		fragment_descriptor->offset[i]);
+
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
+		      "ia_css_fragment_descriptor_print failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+ia_css_frame_format_bitmap_t ia_css_frame_format_bit_mask(
+	const ia_css_frame_format_type_t frame_format_type)
+{
+	ia_css_frame_format_bitmap_t bit_mask = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+		"ia_css_frame_format_bit_mask(): enter:\n");
+
+	if (frame_format_type < IA_CSS_N_FRAME_FORMAT_TYPES) {
+		bit_mask = (ia_css_frame_format_bitmap_t)1 << frame_format_type;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
+			"ia_css_frame_format_bit_mask invalid argument\n");
+	}
+
+	return bit_mask;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+ia_css_frame_format_bitmap_t ia_css_frame_format_bitmap_clear(void)
+{
+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+		       "ia_css_frame_format_bitmap_clear(): enter:\n");
+
+	return 0;
+}
+
+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+size_t ia_css_sizeof_frame_descriptor(
+		const uint8_t plane_count)
+{
+	size_t size = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
+		       "ia_css_sizeof_frame_descriptor(): enter:\n");
+
+	verifexit(plane_count > 0);
+	size += sizeof(ia_css_frame_descriptor_t);
+	size += plane_count * sizeof(uint32_t);
+
+EXIT:
+	if (0 == plane_count) {
+		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
+			"ia_css_sizeof_frame_descriptor invalid argument\n");
+	}
+	return size;
+}
+
+#endif /* __IA_CSS_PROGRAM_GROUP_DATA_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.h
new file mode 100644
index 000000000000..94d5ff4555df
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.h
@@ -0,0 +1,295 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_H
+#define __IA_CSS_PROGRAM_GROUP_PARAM_H
+
+/*! \file */
+
+/** @file ia_css_program_group_param.h
+ *
+ * Define the methods on the program group parameter object that are not part
+ * of a single interface
+ */
+#include <ia_css_program_group_param_types.h>
+
+#include <ia_css_program_group_param.sim.h>
+
+#include <ia_css_kernel_bitmap.h>	/* ia_css_kernel_bitmap_t */
+
+#include <type_support.h>
+
+/*! Get the stored size of the program group parameter object
+
+ @param	param[in]			program group parameter object
+
+ @return size, 0 on error
+ */
+extern size_t ia_css_program_group_param_get_size(
+	const ia_css_program_group_param_t		*param);
+
+/*! initialize program_group_param
+
+ @param	blob[in]	program group parameter object
+ @param	program_count[in]		number of  terminals.
+ @param	terminal_count[in]		number of  terminals.
+ @param	fragment_count[in]		number of  terminals.
+
+ @return 0 if success, else failure.
+ */
+extern int ia_css_program_group_param_init(
+	ia_css_program_group_param_t *blob,
+	const uint8_t	program_count,
+	const uint8_t	terminal_count,
+	const uint16_t	fragment_count,
+	const enum ia_css_frame_format_type *frame_format_types);
+/*! Get the program parameter object from a program group parameter object
+
+ @param	program_group_param[in]		program group parameter object
+ @param	i[in]				program parameter index
+
+ @return program parameter pointer, NULL on error
+ */
+extern ia_css_program_param_t *ia_css_program_group_param_get_program_param(
+	const ia_css_program_group_param_t *param,
+	const int i);
+
+/*! Get the terminal parameter object from a program group parameter object
+
+ @param	program_group_param[in]		program group parameter object
+ @param	i[in]				terminal parameter index
+
+ @return terminal parameter pointer, NULL on error
+ */
+extern ia_css_terminal_param_t *ia_css_program_group_param_get_terminal_param(
+	const ia_css_program_group_param_t *param,
+	const int i);
+
+/*! Get the fragment count from a program group parameter object
+
+ @param	program_group_param[in]		program group parameter object
+
+ @return fragment count, 0 on error
+ */
+extern uint16_t ia_css_program_group_param_get_fragment_count(
+	const ia_css_program_group_param_t		*param);
+
+/*! Get the program count from a program group parameter object
+
+ @param	program_group_param[in]		program group parameter object
+
+ @return program count, 0 on error
+ */
+extern uint8_t ia_css_program_group_param_get_program_count(
+	const ia_css_program_group_param_t		*param);
+
+/*! Get the terminal count from a program group parameter object
+
+ @param	program_group_param[in]		program group parameter object
+
+ @return terminal count, 0 on error
+ */
+extern uint8_t ia_css_program_group_param_get_terminal_count(
+	const ia_css_program_group_param_t		*param);
+
+/*! Set the protocol version in a program group parameter object
+
+ @param	program_group_param[in]		program group parameter object
+ @param	protocol_version[in]		protocol version
+
+ @return nonzero on error
+*/
+extern int
+ia_css_program_group_param_set_protocol_version(
+	ia_css_program_group_param_t *param,
+	uint8_t protocol_version);
+
+/*! Get the protocol version from a program group parameter object
+
+ @param	program_group_param[in]		program group parameter object
+
+ @return protocol version
+*/
+extern uint8_t
+ia_css_program_group_param_get_protocol_version(
+	const ia_css_program_group_param_t *param);
+
+/*! Set the kernel enable bitmap from a program group parameter object
+
+ @param	param[in]			program group parameter object
+ @param	bitmap[in]			kernel enable bitmap
+
+ @return non-zero on error
+ */
+extern int ia_css_program_group_param_set_kernel_enable_bitmap(
+	ia_css_program_group_param_t	*param,
+	const ia_css_kernel_bitmap_t	bitmap);
+
+/*! Get the kernel enable bitmap from a program group parameter object
+
+ @param	program_group_param[in]		program group parameter object
+
+ @return kernel enable bitmap, 0 on error
+*/
+extern ia_css_kernel_bitmap_t
+ia_css_program_group_param_get_kernel_enable_bitmap(
+	const ia_css_program_group_param_t *param);
+
+/*! Get the stored size of the program parameter object
+
+ @param	param[in]			program parameter object
+
+ @return size, 0 on error
+ */
+extern size_t ia_css_program_param_get_size(
+	const ia_css_program_param_t			*param);
+
+/*! Set the kernel enable bitmap from a program parameter object, DEPRECATED
+
+ @param	program_param[in]		program parameter object
+ @param	bitmap[in]			kernel enable bitmap
+
+ @return non-zero on error
+ */
+extern int ia_css_program_param_set_kernel_enable_bitmap(
+	ia_css_program_param_t	*program_param,
+	const ia_css_kernel_bitmap_t	bitmap);
+
+/*! Get the kernel enable bitmap from a program parameter object
+
+ @param	program_param[in]		program parameter object DEPRECATED
+
+ Note: This function returns in fact the kernel enable of the program group
+      parameters
+
+ @return kernel enable bitmap, 0 on error
+ */
+extern ia_css_kernel_bitmap_t ia_css_program_param_get_kernel_enable_bitmap(
+	const ia_css_program_param_t			*param);
+
+/*! Get the stored size of the terminal parameter object
+
+ @param	param[in]			terminal parameter object
+
+ @return size, 0 on error
+ */
+extern size_t ia_css_terminal_param_get_size(
+	const ia_css_terminal_param_t			*param);
+
+/*! Get the kernel enable bitmap from a terminal parameter object
+
+ @param	terminal_param[in]		terminal parameter object
+
+ Note: This function returns in fact the kernel enable of the program group
+       parameters
+
+ @return kernel enable bitmap, 0 on error
+ */
+extern ia_css_kernel_bitmap_t ia_css_terminal_param_get_kernel_enable_bitmap(
+	const ia_css_terminal_param_t			*param);
+
+/*! Get the parent object for this terminal param.
+
+ @param	terminal_param[in]		terminal parameter object
+
+ @return parent program group param object
+ */
+extern ia_css_program_group_param_t *ia_css_terminal_param_get_parent(
+	const ia_css_terminal_param_t			*param);
+
+/*! Get the data format type associated with the terminal.
+
+ @param	terminal_param[in]		terminal parameter object
+
+ @return data format type (ia_css_data_format_type_t)
+ */
+extern ia_css_frame_format_type_t ia_css_terminal_param_get_frame_format_type(
+	const ia_css_terminal_param_t	*terminal_param);
+
+/*! Set the data format type associated with the terminal.
+
+ @param	terminal_param[in]		terminal parameter object
+ @param data_format_type[in]		data format type
+
+ @return non-zero on error.
+ */
+extern int ia_css_terminal_param_set_frame_format_type(
+	ia_css_terminal_param_t	*terminal_param,
+	const ia_css_frame_format_type_t data_format_type);
+
+/*! Get bits per pixel on the frame associated with the terminal.
+
+ @param	terminal_param[in]		terminal parameter object
+
+ @return bits per pixel
+ */
+extern uint8_t ia_css_terminal_param_get_bpp(
+	const ia_css_terminal_param_t	*terminal_param);
+
+/*! Set bits per pixel on the frame associated with the terminal.
+
+ @param	terminal_param[in]		terminal parameter object
+ @param bpp[in]				bits per pixel
+
+ @return non-zero on error.
+ */
+extern int ia_css_terminal_param_set_bpp(
+	ia_css_terminal_param_t	*terminal_param,
+	const uint8_t bpp);
+
+/*! Get dimensions on the frame associated with the terminal.
+
+ @param	terminal_param[in]		terminal parameter object
+ @param	dimensions[out]			dimension array
+
+ @return non-zero on error.
+ */
+extern int ia_css_terminal_param_get_dimensions(
+	const ia_css_terminal_param_t	*terminal_param,
+	uint16_t dimensions[IA_CSS_N_DATA_DIMENSION]);
+
+/*! Set dimensions on the frame associated with the terminal.
+
+ @param	terminal_param[in]		terminal parameter object
+ @param	dimensions[in]			dimension array
+
+ @return non-zero on error.
+ */
+extern int ia_css_terminal_param_set_dimensions(
+	ia_css_terminal_param_t	*terminal_param,
+	const uint16_t dimensions[IA_CSS_N_DATA_DIMENSION]);
+
+/*! Get stride on the frame associated with the terminal.
+
+ @param	terminal_param[in]		terminal parameter object
+
+ @return stride of the frame to be attached.
+ */
+extern uint32_t ia_css_terminal_param_get_stride(
+	const ia_css_terminal_param_t	*terminal_param);
+
+/*! Set stride on the frame associated with the terminal.
+
+ @param	terminal_param[in]		terminal parameter object
+ @param	stride[in]				stride
+
+ @return non-zero on error.
+ */
+extern int ia_css_terminal_param_set_stride(
+	ia_css_terminal_param_t	*terminal_param,
+	const uint32_t stride);
+
+#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.sim.h
new file mode 100644
index 000000000000..3b98832312e1
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.sim.h
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_SIM_H
+#define __IA_CSS_PROGRAM_GROUP_PARAM_SIM_H
+
+/*! \file */
+
+/** @file ia_css_program_group_param.sim.h
+ *
+ * Define the methods on the program group parameter object: Simulation only
+ */
+#include <ia_css_program_group_param_types.h>
+
+#include <ia_css_psys_manifest_types.h>
+
+#include <type_support.h>
+
+/* Simulation */
+
+/*! Create a program group parameter object from specification
+
+ @param	specification[in]		specification (index)
+ @param	manifest[in]			program group manifest
+
+ @return NULL on error
+ */
+extern ia_css_program_group_param_t *ia_css_program_group_param_create(
+	const unsigned int			specification,
+	const ia_css_program_group_manifest_t	*manifest);
+
+/*! Destroy the program group parameter object
+
+ @param	program_group_param[in]		program group parameter object
+
+ @return NULL
+ */
+extern ia_css_program_group_param_t *ia_css_program_group_param_destroy(
+	ia_css_program_group_param_t			*param);
+
+/*! Compute the size of storage required for allocating
+ * the program group parameter object
+
+ @param	program_count[in]	Number of programs in the process group
+ @param	terminal_count[in]	Number of terminals on the process group
+ @param	fragment_count[in]	Number of fragments on the terminals of
+				the process group
+
+ @return 0 on error
+ */
+size_t ia_css_sizeof_program_group_param(
+	const uint8_t	program_count,
+	const uint8_t	terminal_count,
+	const uint16_t	fragment_count);
+
+/*! Allocate (the store of) a program group parameter object
+
+ @param	program_count[in]	Number of programs in the process group
+ @param	terminal_count[in]	Number of terminals on the process group
+ @param	fragment_count[in]	Number of fragments on the terminals of
+				the process group
+
+ @return program group parameter pointer, NULL on error
+ */
+extern ia_css_program_group_param_t *ia_css_program_group_param_alloc(
+	const uint8_t	program_count,
+	const uint8_t	terminal_count,
+	const uint16_t	fragment_count);
+
+/*! Free (the store of) a program group parameter object
+
+ @param	program_group_param[in]		program group parameter object
+
+ @return NULL
+ */
+extern ia_css_program_group_param_t *ia_css_program_group_param_free(
+	ia_css_program_group_param_t			*param);
+
+/*! Print the program group parameter object to file/stream
+
+ @param	param[in]	program group parameter object
+ @param	fid[out]	file/stream handle
+
+ @return < 0 on error
+ */
+extern int ia_css_program_group_param_print(
+	const ia_css_program_group_param_t	*param,
+	void					*fid);
+
+/*! Allocate (the store of) a program parameter object
+
+ @return program parameter pointer, NULL on error
+ */
+extern ia_css_program_param_t *ia_css_program_param_alloc(void);
+
+/*! Free (the store of) a program parameter object
+
+ @param	param[in]	program parameter object
+
+ @return NULL
+ */
+extern ia_css_program_param_t *ia_css_program_param_free(
+	ia_css_program_param_t					*param);
+
+/*! Print the program parameter object to file/stream
+
+ @param	param[in]					program parameter object
+ @param	fid[out]					file/stream handle
+
+ @return < 0 on error
+ */
+extern int ia_css_program_param_print(
+	const ia_css_program_param_t	*param,
+	void				*fid);
+
+/*! Allocate (the store of) a terminal parameter object
+
+ @return terminal parameter pointer, NULL on error
+ */
+extern ia_css_terminal_param_t *ia_css_terminal_param_alloc(void);
+
+/*! Free (the store of) a terminal parameter object
+
+ @param	param[in]	terminal parameter object
+
+ @return NULL
+ */
+extern ia_css_terminal_param_t *ia_css_terminal_param_free(
+	ia_css_terminal_param_t					*param);
+
+/*! Print the terminal parameter object to file/stream
+
+ @param	param[in]	terminal parameter object
+ @param	fid[out]	file/stream handle
+
+ @return < 0 on error
+ */
+extern int ia_css_terminal_param_print(
+	const ia_css_terminal_param_t	*param,
+	void				*fid);
+
+#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_SIM_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_private.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_private.h
new file mode 100644
index 000000000000..6b8bdb23fc10
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_private.h
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_PRIVATE_H
+#define __IA_CSS_PROGRAM_GROUP_PARAM_PRIVATE_H
+
+#include <ia_css_program_group_param.h>
+#include <ia_css_psys_manifest_types.h>
+#include <ia_css_psys_program_group_manifest.h>
+#include <ia_css_psys_terminal_manifest.h>
+#include <ia_css_kernel_bitmap.h>
+#include <ia_css_program_group_data.h>
+#include <type_support.h>
+
+#define N_PADDING_UINT8_IN_PROGRAM_GROUP_PARAM_STRUCT 7
+#define SIZE_OF_PROGRAM_GROUP_PARAM_STRUCT_IN_BITS \
+	(IA_CSS_KERNEL_BITMAP_BITS \
+	+ (3 * IA_CSS_UINT32_T_BITS) \
+	+ IA_CSS_UINT16_T_BITS \
+	+ (3 * IA_CSS_UINT8_T_BITS) \
+	+ (N_PADDING_UINT8_IN_PROGRAM_GROUP_PARAM_STRUCT * IA_CSS_UINT8_T_BITS))
+
+/* tentative; co-design with ISP algorithm */
+struct ia_css_program_group_param_s {
+	/** The enable bits for each individual kernel */
+	ia_css_kernel_bitmap_t kernel_enable_bitmap;
+	/** Size of this structure */
+	uint32_t size;
+	/** Offset of program parameters array from the base of this structure.  See ia_css_program_param_s */
+	uint32_t program_param_offset;
+	/** Offset of terminal parameters array from the base of this structure.  See ia_css_terminal_param_s */
+	uint32_t terminal_param_offset;
+	/** Number of (explicit) fragments to use in a frame */
+	uint16_t fragment_count;
+	/** Number of active programs */
+	uint8_t program_count;
+	/** Number of active terminals */
+	uint8_t terminal_count;
+	/** Program group protocol version */
+	uint8_t protocol_version;
+	uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_GROUP_PARAM_STRUCT];
+};
+
+#define SIZE_OF_PROGRAM_PARAM_STRUCT_IN_BITS \
+	(IA_CSS_KERNEL_BITMAP_BITS \
+	+ IA_CSS_UINT32_T_BITS \
+	+ IA_CSS_INT32_T_BITS)
+
+/* private */
+struct ia_css_program_param_s {
+	/** Bitmap of kernel encapsulated by this program.  If all of these kernels are
+	 *  disabled, the program will be disabled too. */
+	ia_css_kernel_bitmap_t kernel_enable_bitmap;
+	/** Size of this structure */
+	uint32_t size;
+	/** Offset to add to reach parent. This is negative value.*/
+	int32_t parent_offset;
+};
+
+#define SIZE_OF_TERMINAL_PARAM_STRUCT_IN_BITS \
+	(IA_CSS_UINT32_T_BITS \
+	+ IA_CSS_FRAME_FORMAT_TYPE_BITS \
+	+ IA_CSS_INT32_T_BITS \
+	+ (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION) \
+	+ (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION) \
+	+ (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION) \
+	+ IA_CSS_INT32_T_BITS \
+	+ IA_CSS_UINT16_T_BITS \
+	+ IA_CSS_UINT8_T_BITS \
+	+ (IA_CSS_UINT8_T_BITS * 1))
+
+#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_PRIVATE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_types.h
new file mode 100644
index 000000000000..4d81cca96eb4
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_types.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_TYPES_H
+#define __IA_CSS_PROGRAM_GROUP_PARAM_TYPES_H
+
+/*! \file */
+
+/** @file ia_css_program_group_param_types.h
+ *
+ * Define the parameter objects that are necessary to create the process
+ * groups i.e. enable parameters and parameters to set-up frame descriptors
+ */
+
+#include <ia_css_program_group_data.h>
+#include <ia_css_kernel_bitmap.h>	/* ia_css_kernel_bitmap_t */
+#include <ia_css_terminal_defs.h>
+
+#include <type_support.h>
+/*! make this public so that driver can populate,
+ * size, bpp, dimensions for all terminals.
+ *
+ * Currently one API is provided to get frame_format_type.
+ *
+ * frame_format_type is set during ia_css_terminal_param_init().
+ * Value for that is const and binary specific.
+ */
+struct ia_css_terminal_param_s {
+	uint32_t size;	/**< Size of this structure */
+	/** Indicates if this is a generic type or inbuild
+	 * with variable size descriptor
+	 */
+	ia_css_frame_format_type_t frame_format_type;
+	/** offset to add to reach parent. This is negative value.*/
+	int32_t parent_offset;
+	uint16_t dimensions[IA_CSS_N_DATA_DIMENSION];/**< Logical dimensions */
+	/** Mapping to the index field of the terminal descriptor */
+	uint16_t index[IA_CSS_N_DATA_DIMENSION];
+	/** Logical fragment dimension,
+	 * TODO: fragment dimensions can be different per fragment
+	 */
+	uint16_t fragment_dimensions[IA_CSS_N_DATA_DIMENSION];
+	uint32_t stride;/**< Stride (buffer width) of a frame in bytes */
+	uint16_t offset;/**< Offset in bytes to first fragment */
+	uint8_t bpp;	/**< Bits per pixel.  The number of bits with significant data. */
+	uint8_t bpe;	/**< Bits per element  The number of bits required to store the pixel.  Must be >= bpp. */
+};
+
+typedef struct ia_css_program_group_param_s	ia_css_program_group_param_t;
+typedef struct ia_css_program_param_s		ia_css_program_param_t;
+typedef struct ia_css_terminal_param_s		ia_css_terminal_param_t;
+
+#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_buffer_set.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_buffer_set.h
new file mode 100644
index 000000000000..27ae62d79211
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_buffer_set.h
@@ -0,0 +1,290 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_BUFFER_SET_H
+#define __IA_CSS_PSYS_BUFFER_SET_H
+
+#include "ia_css_base_types.h"
+#include "ia_css_psys_dynamic_storage_class.h"
+#include "ia_css_psys_process_types.h"
+#include "ia_css_terminal_types.h"
+#include "ia_css_kernel_bitmap.h"
+#include "ia_css_rbm.h"
+
+#define N_UINT64_IN_BUFFER_SET_STRUCT		1
+#define N_UINT16_IN_BUFFER_SET_STRUCT		1
+#define N_UINT8_IN_BUFFER_SET_STRUCT		1
+#define N_PADDING_UINT8_IN_BUFFER_SET_STRUCT	1
+#define SIZE_OF_BUFFER_SET \
+	(N_UINT64_IN_BUFFER_SET_STRUCT * IA_CSS_UINT64_T_BITS \
+	+ IA_CSS_KERNEL_BITMAP_BITS \
+	+ IA_CSS_KERNEL_BITMAP_BITS \
+	+ IA_CSS_KERNEL_BITMAP_BITS \
+	+ IA_CSS_RBM_BITS \
+	+ VIED_VADDRESS_BITS \
+	+ VIED_VADDRESS_BITS \
+	+ N_UINT16_IN_BUFFER_SET_STRUCT * IA_CSS_UINT16_T_BITS \
+	+ N_UINT8_IN_BUFFER_SET_STRUCT * IA_CSS_UINT8_T_BITS \
+	+ N_PADDING_UINT8_IN_BUFFER_SET_STRUCT * IA_CSS_UINT8_T_BITS)
+
+typedef struct ia_css_buffer_set_s ia_css_buffer_set_t;
+
+struct ia_css_buffer_set_s {
+	/** Token for user context reference */
+	uint64_t token;
+	/** Enable bits for each individual kernel
+	 * For integration, all 0's should be treated as uninitialized and
+	 * assume all processes are enabled */
+	ia_css_kernel_bitmap_t kernel_enable_bitmap;
+	/** Enable bits for each individual terminals per call */
+	ia_css_kernel_bitmap_t terminal_enable_bitmap;
+	/** Enable bits for each individual routing per call */
+	ia_css_kernel_bitmap_t routing_enable_bitmap;
+	/** Enable bits for routing per call */
+	ia_css_rbm_t rbm;
+	/** IPU virtual address of this buffer set */
+	vied_vaddress_t ipu_virtual_address;
+	/** IPU virtual address of the process group corresponding to this buffer set */
+	vied_vaddress_t process_group_handle;
+	/** Number of terminal buffer addresses in this structure */
+	uint16_t terminal_count;
+	/** Frame id to associate with this buffer set */
+	uint8_t frame_counter;
+	/** Padding for 64bit alignment */
+	uint8_t padding[N_PADDING_UINT8_IN_BUFFER_SET_STRUCT];
+};
+
+#define N_PADDING_UINT8_IN_DYNAMIC_TERMINAL_DESCRIPTOR_STRUCT	3
+#define SIZE_OF_DYNAMIC_TERMINAL_DESCRIPTOR \
+	VIED_VADDRESS_BITS \
+	+ ( 1 * IA_CSS_UINT8_T_BITS) \
+	+ ( N_PADDING_UINT8_IN_DYNAMIC_TERMINAL_DESCRIPTOR_STRUCT * IA_CSS_UINT8_T_BITS)
+
+typedef struct ia_css_dynamic_terminal_descriptor_s ia_css_dynamic_terminal_descriptor_t;
+struct ia_css_dynamic_terminal_descriptor_s {
+	/** Terminal buffer virtual address */
+	vied_vaddress_t virtual_buffer_address;
+	/** Per-frame compression control, boolean semantics */
+	uint8_t enable_compression;
+	/** Padding for 64bit alignment */
+	uint8_t padding[N_PADDING_UINT8_IN_DYNAMIC_TERMINAL_DESCRIPTOR_STRUCT];
+};
+
+/*! Construct a buffer set object at specified location
+
+ @param	buffer_set_mem[in]	memory location to create buffer set object
+ @param	process_group[in]	process group corresponding to this buffer set
+ @param	frame_counter[in]	frame number for this buffer set object
+
+ @return pointer to buffer set object on success, NULL on error
+ */
+ia_css_buffer_set_t *ia_css_buffer_set_create(
+	void *buffer_set_mem,
+	const ia_css_process_group_t *process_group,
+	const unsigned int frame_counter);
+
+/*! Compute size (in bytes) required for full buffer set object
+
+ @param	process_group[in]	process group corresponding to this buffer set
+
+ @return size in bytes of buffer set object on success, 0 on error
+ */
+size_t ia_css_sizeof_buffer_set(
+	const ia_css_process_group_t *process_group);
+
+/*! Set a buffer address in a buffer set object
+
+ @param	buffer_set[in]		buffer set object to set buffer in
+ @param	terminal_index[in]	terminal index to use as a reference between
+				buffer and terminal
+ @param	buffer[in]		buffer address to store
+
+ @return 0 on success, -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_buffer_set_set_buffer(
+	ia_css_buffer_set_t *buffer_set,
+	const unsigned int terminal_index,
+	const vied_vaddress_t buffer);
+
+/*! Get virtual buffer address from a buffer set object and terminal object by
+   resolving the index used
+
+ @param	buffer_set[in]		buffer set object to get buffer from
+ @param	terminal[in]		terminal object to get buffer of
+
+ @return virtual buffer address on success, VIED_NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_vaddress_t ia_css_buffer_set_get_buffer(
+	const ia_css_buffer_set_t *buffer_set,
+	const ia_css_terminal_t *terminal);
+
+/*! Set ipu virtual address of a buffer set object within the buffer set object
+
+ @param	buffer_set[in]		buffer set object to set ipu address in
+ @param	ipu_vaddress[in]	ipu virtual address of the buffer set object
+
+ @return 0 on success, -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_buffer_set_set_ipu_address(
+	ia_css_buffer_set_t *buffer_set,
+	const vied_vaddress_t ipu_vaddress);
+
+/*! Get ipu virtual address from a buffer set object
+
+ @param	buffer_set[in]		buffer set object to get ipu address from
+
+ @return virtual buffer set address on success, VIED_NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_vaddress_t ia_css_buffer_set_get_ipu_address(
+	const ia_css_buffer_set_t *buffer_set);
+
+/*! Set kernel enable bitmap of a buffer set object within the buffer set object
+
+ @param	buffer_set[in]			buffer set object to set kernel enable bitmap in
+ @param	kernel_enable_bitmap[in]	kernel enable bitmap of the buffer set object
+
+ @return 0 on success, -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_buffer_set_set_kernel_enable_bitmap(
+	ia_css_buffer_set_t *buffer_set,
+	const ia_css_kernel_bitmap_t kernel_enable_bitmap);
+
+/*! Get kernel enable bitmap from a buffer set object
+
+ @param	buffer_set[in]		buffer set object to get kernel enable bitmap from
+
+ @return buffer set kernel enable bitmap on success, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_buffer_set_get_kernel_enable_bitmap(
+	const ia_css_buffer_set_t *buffer_set);
+
+/*! Set terminal enable bitmap of a buffer set object within the buffer set object
+
+ @param	buffer_set[in]			buffer set object to set kernel enable bitmap in
+ @param	kernel_enable_bitmap[in]	kernel enable bitmap of the buffer set object
+
+ @return 0 on success, -1 on error
+
+ @todo New for POC
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_buffer_set_set_terminal_enable_bitmap(
+	ia_css_buffer_set_t *buffer_set,
+	const ia_css_kernel_bitmap_t terminal_enable_bitmap);
+
+/*! Get terminal enable bitmap from a buffer set object
+
+ @param	buffer_set[in]		buffer set object to get kernel enable bitmap from
+
+ @return buffer set terminal enable bitmap on success, 0 on error
+
+ @todo New for POC
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_buffer_set_get_terminal_enable_bitmap(
+	const ia_css_buffer_set_t *buffer_set);
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_buffer_set_set_routing_enable_bitmap(
+	ia_css_buffer_set_t *buffer_set,
+	const ia_css_kernel_bitmap_t terminal_enable_bitmap);
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_buffer_set_get_routing_enable_bitmap(
+	const ia_css_buffer_set_t *buffer_set);
+
+/*! Set Routing BitMap of a buffer set object within the buffer set object
+
+ @param	buffer_set[in]			buffer set object to set kernel enable bitmap in
+ @param	kernel_enable_bitmap[in]	kernel enable bitmap of the buffer set object
+
+ @return 0 on success, -1 on error
+
+ @todo New for POC
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_buffer_set_set_rbm(
+	ia_css_buffer_set_t *buffer_set,
+	const ia_css_rbm_t rbm);
+
+/*! Get Routing BitMap from a buffer set object
+
+ @param	buffer_set[in]		buffer set object to get kernel enable bitmap from
+
+ @return buffer set terminal enable bitmap on success, 0 on error
+
+ @todo New for POC
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_rbm_t ia_css_buffer_set_get_rbm(
+	const ia_css_buffer_set_t *buffer_set);
+
+/*! Set process group handle in a buffer set object
+
+ @param	buffer_set[in]			buffer set object to set handle in
+ @param	process_group_handle[in]	process group handle of the buffer set
+					object
+
+ @return 0 on success, -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_buffer_set_set_process_group_handle(
+	ia_css_buffer_set_t *buffer_set,
+	const vied_vaddress_t process_group_handle);
+
+/*! Get process group handle from a buffer set object
+
+ @param	buffer_set[in]		buffer set object to get handle from
+
+ @return virtual process group address on success, VIED_NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_vaddress_t ia_css_buffer_set_get_process_group_handle(
+	const ia_css_buffer_set_t *buffer_set);
+
+/*! Set token of a buffer set object within the buffer set object
+
+ @param	buffer_set[in]		buffer set object to set ipu address in
+ @param	token[in]		token of the buffer set object
+
+ @return 0 on success, -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_buffer_set_set_token(
+	ia_css_buffer_set_t *buffer_set,
+	const uint64_t token);
+
+/*! Get token from a buffer set object
+
+ @param	buffer_set[in]		buffer set object to get token from
+
+ @return token on success, NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint64_t ia_css_buffer_set_get_token(
+	const ia_css_buffer_set_t *buffer_set);
+
+#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
+#include "ia_css_psys_buffer_set_impl.h"
+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
+
+#endif /* __IA_CSS_PSYS_BUFFER_SET_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_storage_class.h
new file mode 100644
index 000000000000..5721d46d2cff
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_storage_class.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+#define __IA_CSS_PSYS_DATA_STORAGE_CLASS_H
+
+#include "storage_class.h"
+
+#ifndef __IA_CSS_PSYS_DATA_INLINE__
+#define IA_CSS_PSYS_DATA_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
+#define IA_CSS_PSYS_DATA_STORAGE_CLASS_C
+#else
+#define IA_CSS_PSYS_DATA_STORAGE_CLASS_H STORAGE_CLASS_INLINE
+#define IA_CSS_PSYS_DATA_STORAGE_CLASS_C STORAGE_CLASS_INLINE
+#endif
+
+#endif /* __IA_CSS_PSYS_DATA_STORAGE_CLASS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_trace.h
new file mode 100644
index 000000000000..9905be3794a2
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_trace.h
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_DATA_TRACE_H
+#define __IA_CSS_PSYS_DATA_TRACE_H
+
+#include "ia_css_psysapi_trace.h"
+
+#define PSYS_DATA_TRACE_LEVEL_CONFIG_DEFAULT	PSYSAPI_TRACE_LOG_LEVEL_OFF
+
+/* Default sub-module tracing config */
+#if (!defined(PSYSAPI_DATA_TRACING_OVERRIDE))
+     #define PSYS_DATA_TRACE_LEVEL_CONFIG PSYS_DATA_TRACE_LEVEL_CONFIG_DEFAULT
+#endif
+
+/* Module/sub-module specific trace setting will be used if
+ * the trace level is not specified from the module or
+  PSYSAPI_DATA_TRACING_OVERRIDE is defined
+ */
+#if (defined(PSYSAPI_DATA_TRACING_OVERRIDE))
+	/* Module/sub-module specific trace setting */
+	#if PSYSAPI_DATA_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
+		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
+		#define PSYSAPI_DATA_TRACE_METHOD \
+			IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_DATA_TRACE_LEVEL_INFO \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
+			IA_CSS_TRACE_LEVEL_DISABLED
+	#elif PSYSAPI_DATA_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
+		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
+		#define PSYSAPI_DATA_TRACE_METHOD \
+			IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_DATA_TRACE_LEVEL_INFO \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
+			IA_CSS_TRACE_LEVEL_DISABLED
+	#elif PSYSAPI_DATA_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
+		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
+		#define PSYSAPI_DATA_TRACE_METHOD \
+			IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_DATA_TRACE_LEVEL_INFO \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
+			IA_CSS_TRACE_LEVEL_ENABLED
+	#else
+		#error "No PSYSAPI_DATA Tracing level defined"
+	#endif
+#else
+	/* Inherit Module trace setting */
+	#define PSYSAPI_DATA_TRACE_METHOD \
+		PSYSAPI_TRACE_METHOD
+	#define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
+		PSYSAPI_TRACE_LEVEL_ASSERT
+	#define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
+		PSYSAPI_TRACE_LEVEL_ERROR
+	#define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
+		PSYSAPI_TRACE_LEVEL_WARNING
+	#define PSYSAPI_DATA_TRACE_LEVEL_INFO \
+		PSYSAPI_TRACE_LEVEL_INFO
+	#define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
+		PSYSAPI_TRACE_LEVEL_DEBUG
+	#define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
+		PSYSAPI_TRACE_LEVEL_VERBOSE
+#endif
+
+#endif /* __IA_CSS_PSYSAPI_DATA_TRACE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_storage_class.h
new file mode 100644
index 000000000000..4aab0d4b9916
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_storage_class.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+#define __IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+
+#include "storage_class.h"
+
+#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
+#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
+#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+#else
+#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H STORAGE_CLASS_INLINE
+#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C STORAGE_CLASS_INLINE
+#endif
+
+#endif /* __IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_trace.h
new file mode 100644
index 000000000000..fc31bb79adbe
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_trace.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_DYNAMIC_TRACE_H
+#define __IA_CSS_PSYS_DYNAMIC_TRACE_H
+
+#include "ia_css_psysapi_trace.h"
+
+#define PSYS_DYNAMIC_TRACE_LEVEL_CONFIG_DEFAULT	PSYSAPI_TRACE_LOG_LEVEL_OFF
+
+/* Default sub-module tracing config */
+#if (!defined(PSYSAPI_DYNAMIC_TRACING_OVERRIDE))
+     #define PSYS_DYNAMIC_TRACE_LEVEL_CONFIG \
+		PSYS_DYNAMIC_TRACE_LEVEL_CONFIG_DEFAULT
+#endif
+
+/* Module/sub-module specific trace setting will be used if
+ * the trace level is not specified from the module or
+  PSYSAPI_DYNAMIC_TRACING_OVERRIDE is defined
+ */
+#if (defined(PSYSAPI_DYNAMIC_TRACING_OVERRIDE))
+	/* Module/sub-module specific trace setting */
+	#if PSYSAPI_DYNAMIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
+		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
+		#define PSYSAPI_DYNAMIC_TRACE_METHOD \
+			IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
+			IA_CSS_TRACE_LEVEL_DISABLED
+	#elif PSYSAPI_DYNAMIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
+		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
+		#define PSYSAPI_DYNAMIC_TRACE_METHOD \
+			IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
+			IA_CSS_TRACE_LEVEL_DISABLED
+	#elif PSYSAPI_DYNAMIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
+		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
+		#define PSYSAPI_DYNAMIC_TRACE_METHOD \
+			IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
+			IA_CSS_TRACE_LEVEL_ENABLED
+	#else
+		#error "No PSYSAPI_DATA Tracing level defined"
+	#endif
+#else
+	/* Inherit Module trace setting */
+	#define PSYSAPI_DYNAMIC_TRACE_METHOD \
+		PSYSAPI_TRACE_METHOD
+	#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
+		PSYSAPI_TRACE_LEVEL_ASSERT
+	#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
+		PSYSAPI_TRACE_LEVEL_ERROR
+	#define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
+		PSYSAPI_TRACE_LEVEL_WARNING
+	#define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
+		PSYSAPI_TRACE_LEVEL_INFO
+	#define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
+		PSYSAPI_TRACE_LEVEL_DEBUG
+	#define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
+		PSYSAPI_TRACE_LEVEL_VERBOSE
+#endif
+
+#endif /* __IA_CSS_PSYSAPI_DYNAMIC_TRACE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_kernel_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_kernel_trace.h
new file mode 100644
index 000000000000..f0f23d9895dc
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_kernel_trace.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_KERNEL_TRACE_H
+#define __IA_CSS_PSYS_KERNEL_TRACE_H
+
+#include "ia_css_psysapi_trace.h"
+
+#define PSYS_KERNEL_TRACE_LEVEL_CONFIG_DEFAULT	PSYSAPI_TRACE_LOG_LEVEL_OFF
+
+/* Default sub-module tracing config */
+#if (!defined(PSYSAPI_KERNEL_TRACING_OVERRIDE))
+     #define PSYS_KERNEL_TRACE_LEVEL_CONFIG \
+		PSYS_KERNEL_TRACE_LEVEL_CONFIG_DEFAULT
+#endif
+
+/* Module/sub-module specific trace setting will be used if
+ * the trace level is not specified from the module or
+  PSYSAPI_KERNEL_TRACING_OVERRIDE is defined
+ */
+#if (defined(PSYSAPI_KERNEL_TRACING_OVERRIDE))
+	/* Module/sub-module specific trace setting */
+	#if PSYSAPI_KERNEL_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
+		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
+		#define PSYSAPI_KERNEL_TRACE_METHOD \
+			IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
+			IA_CSS_TRACE_LEVEL_DISABLED
+	#elif PSYSAPI_KERNEL_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
+		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
+		#define PSYSAPI_KERNEL_TRACE_METHOD \
+			IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
+			IA_CSS_TRACE_LEVEL_DISABLED
+	#elif PSYSAPI_KERNEL_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
+		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
+		#define PSYSAPI_KERNEL_TRACE_METHOD \
+			IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
+			IA_CSS_TRACE_LEVEL_ENABLED
+	#else
+		#error "No PSYSAPI_DATA Tracing level defined"
+	#endif
+#else
+	/* Inherit Module trace setting */
+	#define PSYSAPI_KERNEL_TRACE_METHOD \
+		PSYSAPI_TRACE_METHOD
+	#define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
+		PSYSAPI_TRACE_LEVEL_ASSERT
+	#define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
+		PSYSAPI_TRACE_LEVEL_ERROR
+	#define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
+		PSYSAPI_TRACE_LEVEL_WARNING
+	#define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
+		PSYSAPI_TRACE_LEVEL_INFO
+	#define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
+		PSYSAPI_TRACE_LEVEL_DEBUG
+	#define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
+		PSYSAPI_TRACE_LEVEL_VERBOSE
+#endif
+
+#endif /* __IA_CSS_PSYSAPI_KERNEL_TRACE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_manifest_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_manifest_types.h
new file mode 100644
index 000000000000..b4512e603a2a
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_manifest_types.h
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_MANIFEST_TYPES_H
+#define __IA_CSS_PSYS_MANIFEST_TYPES_H
+
+/*! \file */
+
+/** @file ia_css_psys_manifest_types.h
+ *
+ * The types belonging to the terminal/program/
+ * program group manifest static module
+ */
+
+#include <type_support.h>
+#include "vied_nci_psys_resource_model.h"
+
+/**
+ * @addtogroup group_psysapi
+ * @{
+ */
+
+/** This value is used in the manifest to indicate that the resource
+ * offset field must be ignored and the resource is relocatable
+ */
+#define IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE ((vied_nci_resource_size_t)(-1))
+
+#define IA_CSS_CONNECTION_BITMAP_BITS 8
+typedef uint8_t ia_css_connection_bitmap_t;
+
+#define IA_CSS_CONNECTION_TYPE_BITS 32
+
+/** Describes the tranfer method of data between terminals */
+typedef enum ia_css_connection_type {
+	/** The data buffer must be fully written to main memory by the producer
+	 *  before it can be read by the consumer */
+	IA_CSS_CONNECTION_MEMORY = 0,
+	/** The data transfer is a (watermark) queued stream over main memory.
+	 *  The consumer may begin reading data before the data
+	 *  buffer is completely written in a controlled manner. */
+	IA_CSS_CONNECTION_MEMORY_STREAM,
+	/** The data transfer is via device ports connected such that no data
+	 *  is read or written to main memory. */
+	IA_CSS_CONNECTION_STREAM,
+	IA_CSS_N_CONNECTION_TYPES
+} ia_css_connection_type_t;
+
+#define IA_CSS_PROGRAM_TYPE_BITS 8
+typedef enum ia_css_program_type {
+	IA_CSS_PROGRAM_TYPE_SINGULAR = 0,
+	IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB,
+	IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER,
+	IA_CSS_PROGRAM_TYPE_PARALLEL_SUB,
+	IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER,
+	IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB,
+	IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER,
+/*
+ * Future extension; A bitmap coding starts making more sense
+ *
+	IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB_PARALLEL_SUB,
+	IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB_PARALLEL_SUPER,
+	IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER_PARALLEL_SUB,
+	IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER_PARALLEL_SUPER,
+ */
+	IA_CSS_N_PROGRAM_TYPES
+} ia_css_program_type_t;
+
+#define IA_CSS_PROGRAM_GROUP_ID_BITS 32
+typedef uint32_t ia_css_program_group_ID_t;
+#define IA_CSS_PROGRAM_ID_BITS 8
+typedef uint8_t ia_css_program_ID_t;
+
+#define IA_CSS_PROGRAM_INVALID_ID ((uint8_t)(-1))
+#define IA_CSS_PROGRAM_GROUP_INVALID_ID ((uint32_t)(-1))
+
+typedef struct ia_css_program_group_manifest_s
+ia_css_program_group_manifest_t;
+typedef struct ia_css_program_manifest_s
+ia_css_program_manifest_t;
+typedef struct ia_css_program_manifest_ext_s
+ia_css_program_manifest_ext_t;
+typedef struct ia_css_data_terminal_manifest_s
+ia_css_data_terminal_manifest_t;
+
+/* ============ Program Control Init Terminal Manifest - START ============ */
+typedef struct ia_css_program_control_init_manifest_program_desc_s
+	ia_css_program_control_init_manifest_program_desc_t;
+
+typedef struct ia_css_program_control_init_terminal_manifest_s
+	ia_css_program_control_init_terminal_manifest_t;
+/* ============ Program Control Init Terminal Manifest - END ============ */
+
+/** @} */
+
+#endif /* __IA_CSS_PSYS_MANIFEST_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_param_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_param_trace.h
new file mode 100644
index 000000000000..834e02663334
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_param_trace.h
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PARAM_TRACE_H
+#define __IA_CSS_PSYS_PARAM_TRACE_H
+
+#include "ia_css_psysapi_trace.h"
+
+#define PSYS_PARAM_TRACE_LEVEL_CONFIG_DEFAULT	PSYSAPI_TRACE_LOG_LEVEL_OFF
+
+/* Default sub-module tracing config */
+#if (!defined(PSYSAPI_PARAM_TRACING_OVERRIDE))
+     #define PSYS_PARAM_TRACE_LEVEL_CONFIG PSYS_PARAM_TRACE_LEVEL_CONFIG_DEFAULT
+#endif
+
+/* Module/sub-module specific trace setting will be used if
+ * the trace level is not specified from the module or
+  PSYSAPI_PARAM_TRACING_OVERRIDE is defined
+ */
+#if (defined(PSYSAPI_PARAM_TRACING_OVERRIDE))
+	/* Module/sub-module specific trace setting */
+	#if PSYSAPI_PARAM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
+		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
+		#define PSYSAPI_PARAM_TRACE_METHOD \
+			IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
+			IA_CSS_TRACE_LEVEL_DISABLED
+	#elif PSYSAPI_PARAM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
+		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
+		#define PSYSAPI_PARAM_TRACE_METHOD \
+			IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
+			IA_CSS_TRACE_LEVEL_DISABLED
+	#elif PSYSAPI_PARAM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
+		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
+		#define PSYSAPI_PARAM_TRACE_METHOD \
+			IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
+			IA_CSS_TRACE_LEVEL_ENABLED
+	#else
+		#error "No PSYSAPI_DATA Tracing level defined"
+	#endif
+#else
+	/* Inherit Module trace setting */
+	#define PSYSAPI_PARAM_TRACE_METHOD \
+		PSYSAPI_TRACE_METHOD
+	#define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
+		PSYSAPI_TRACE_LEVEL_ASSERT
+	#define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
+		PSYSAPI_TRACE_LEVEL_ERROR
+	#define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
+		PSYSAPI_TRACE_LEVEL_WARNING
+	#define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
+		PSYSAPI_TRACE_LEVEL_INFO
+	#define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
+		PSYSAPI_TRACE_LEVEL_DEBUG
+	#define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
+		PSYSAPI_TRACE_LEVEL_VERBOSE
+#endif
+
+#endif /* __IA_CSS_PSYSAPI_PARAM_TRACE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_private_pg_data.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_private_pg_data.h
new file mode 100644
index 000000000000..7c2af2cfb6f8
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_private_pg_data.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PRIVATE_PG_DATA_H
+#define __IA_CSS_PSYS_PRIVATE_PG_DATA_H
+
+#include "ipu_device_acb_devices.h"
+#include "ipu_device_gp_devices.h"
+#include "type_support.h"
+
+#define PRIV_CONF_INVALID	0xFF
+#define MAX_INPUT_BUFFER	(2)
+#define MAX_OUTPUT_BUFFER	(2)
+
+struct ia_css_psys_pg_buffer_information_s {
+	unsigned int link_id; /* Terminal the buffer is connected to */
+	unsigned int buffer_base_addr;
+	unsigned int bpe;
+	unsigned int buffer_width;
+	unsigned int buffer_height;
+	unsigned int num_of_buffers;
+	unsigned int dfm_port_addr;
+};
+
+typedef struct ia_css_psys_pg_buffer_information_s ia_css_psys_pg_buffer_information_t;
+
+typedef struct {
+	uint8_t in_select; /**< corresponds to type nci_acb_port_t  0 = ISP, 1 = Acc */
+	uint8_t out_select;  /**< corresponds to type nci_acb_port_t  0 = ISP, 1 = Acc */
+} ia_css_psys_private_pg_data_acb_t;
+
+struct ia_css_psys_private_pg_data {
+	ia_css_psys_private_pg_data_acb_t acb_route[IPU_DEVICE_ACB_NUM_ACB];
+	uint8_t psa_mux_conf[IPU_DEVICE_GP_PSA_MUX_NUM_MUX];
+	uint8_t isa_mux_conf[IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX];
+	ia_css_psys_pg_buffer_information_t input_buffer_info[MAX_INPUT_BUFFER];
+	ia_css_psys_pg_buffer_information_t output_buffer_info[MAX_OUTPUT_BUFFER];
+};
+
+#endif /* __IA_CSS_PSYS_PRIVATE_PG_DATA_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.h
new file mode 100644
index 000000000000..39122a072ceb
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.h
@@ -0,0 +1,395 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_H
+#define __IA_CSS_PSYS_PROCESS_H
+
+/*! \file */
+
+/** @file ia_css_psys_process.h
+ *
+ * Define the methods on the process object that are not part of
+ * a single interface
+ */
+
+#include <ia_css_psys_process_types.h>
+#include <ia_css_psys_dynamic_storage_class.h>
+
+#include <vied_nci_psys_system_global.h>
+
+#include <type_support.h>					/* uint8_t */
+
+/*
+ * Creation
+ */
+#include <ia_css_psys_process.hsys.user.h>
+
+/*
+ * Internal resources
+ */
+#include <ia_css_psys_process.hsys.kernel.h>
+
+/*
+ * Process manager
+ */
+#include <ia_css_psys_process.psys.h>
+
+/*
+ * Command processor
+ */
+
+/*! Execute a command locally or send it to be processed remotely
+
+ @param	process[in]	process object
+ @param	cmd[in]		command
+
+ @return < 0 on invalid argument(s) or process state
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_cmd(
+	ia_css_process_t *process,
+	const ia_css_process_cmd_t cmd);
+
+/*! Get the internal memory offset of the process object
+
+ @param	process[in]	process object
+ @param	mem_id[in]	memory id
+
+ @return internal memory offset,
+	IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
+*/
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_process_get_int_mem_offset(
+	const ia_css_process_t *process,
+	const vied_nci_mem_type_ID_t mem_id);
+
+/*! Get the external memory offset of the process object
+
+ @param	process[in]	process object
+ @param	mem_id[in]	memory id
+
+ @return external memory offset,
+	IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
+*/
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_process_get_ext_mem_offset(
+	const ia_css_process_t *process,
+	const vied_nci_mem_type_ID_t mem_type_id);
+
+/*! Get the stored size of the process object
+
+ @param	process[in]	process object
+
+ @return size, 0 on invalid argument
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+size_t ia_css_process_get_size(const ia_css_process_t *process);
+
+/*! Get the (pointer to) the process group parent of the process object
+
+ @param	process[in]	process object
+
+ @return the pointer to the parent, NULL on invalid argument
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_process_group_t *ia_css_process_get_parent(
+	const ia_css_process_t *process);
+
+/*! Set the (pointer to) the process group parent of the process object
+
+ @param	process[in]	process object
+ @param	parent[in]	(pointer to the) process group parent object
+
+ @return < 0 on invalid argument(s)
+ */
+extern int ia_css_process_set_parent(
+	ia_css_process_t *process,
+	ia_css_process_group_t *parent);
+
+/*! Get the unique ID of program used by the process object
+
+ @param	process[in]	process object
+
+ @return ID, 0 on invalid argument
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_program_ID_t ia_css_process_get_program_ID(
+	const ia_css_process_t *process);
+
+/*! Get the state of the process object
+
+ @param	process[in]	process object
+
+ @return state, limit value (IA_CSS_N_PROCESS_STATES) on invalid argument
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_process_state_t ia_css_process_get_state(
+	const ia_css_process_t *process);
+
+/*! Set the state of the process object
+
+ @param	process[in]	process object
+ @param	state[in]	state of the process
+
+ @return < 0 on invalid argument
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_set_state(
+	ia_css_process_t *process,
+	ia_css_process_state_t state);
+
+/*! Get the assigned cell of the the process object
+
+ @param	process[in]	process object
+
+ @return cell ID, limit value (VIED_NCI_N_CELL_ID) on invalid argument
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_cell_ID_t ia_css_process_get_cell(
+	const ia_css_process_t *process);
+
+/*! Get the number of cells the process object depends on
+
+ @param	process[in]	process object
+
+ @return number of cells
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_process_get_cell_dependency_count(
+	const ia_css_process_t *process);
+
+/*! Get the number of terminals the process object depends on
+
+ @param	process[in]	process object
+
+ @return number of terminals
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_process_get_terminal_dependency_count(
+	const ia_css_process_t *process);
+
+/*! Set n-th cell dependency of a process object
+
+ @param	process[in]	Process object
+ @param	dep_index[in]	dep index
+ @param	id[in]		dep id
+
+ @return < 0 on invalid process argument
+ */
+extern int ia_css_process_set_cell_dependency(
+	const ia_css_process_t *process,
+	const unsigned int dep_index,
+	const vied_nci_resource_id_t id);
+
+/*! Get n-th cell dependency of a process object
+
+ @param	process[in]	Process object
+ @param	cell_num[in]	n-th cell
+
+ @return n-th cell dependency,
+	IA_CSS_PROCESS_INVALID_DEPENDENCY on invalid argument(s)
+*/
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_resource_id_t ia_css_process_get_cell_dependency(
+	const ia_css_process_t *process,
+	const unsigned int cell_num);
+
+/*! Set n-th terminal dependency of a process object
+
+ @param	process[in]	Process object
+ @param	dep_index[in]	dep index
+ @param	id[in]		dep id
+
+ @return < 0 on on invalid argument(s)
+ */
+extern int ia_css_process_set_terminal_dependency(
+	const ia_css_process_t *process,
+	const unsigned int dep_index,
+	const vied_nci_resource_id_t id);
+
+/*! Get n-th terminal dependency of a process object
+
+ @param	process[in]		Process object
+ @param	terminal_num[in]	n-th cell
+
+ @return n-th terminal dependency,
+	IA_CSS_PROCESS_INVALID_DEPENDENCY on invalid argument(s)
+*/
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_process_get_terminal_dependency(
+	const ia_css_process_t *process,
+	const unsigned int terminal_num);
+
+#if HAS_DFM
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t* ia_css_process_get_dfm_port_bitmap_ptr(
+	ia_css_process_t *process);
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t* ia_css_process_get_dfm_active_port_bitmap_ptr(
+	ia_css_process_t *process);
+#endif
+
+/*! Get the cells bitmap of the the process object
+
+ @param	process[in]	process object
+
+ @return process cells bitmap
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t ia_css_process_get_cells_bitmap(
+	const ia_css_process_t *process);
+
+/*! Sets the dfm device resource allocation bitmap of
+ * the process object
+
+ @param	process[in]	process object
+ @param	dfm_dev_id[in]	dfm device id
+ @param bitmap[in]	resource bitmap
+
+ @return < 0 on invalid argument(s) or process state
+ */
+int ia_css_process_set_dfm_port_bitmap(
+	ia_css_process_t *process,
+	const vied_nci_dev_dfm_id_t dfm_dev_id,
+	const vied_nci_resource_bitmap_t bitmap);
+
+/*! Sets the active dfm ports bitmap of
+ * the process object
+
+ @param	process[in]	process object
+ @param	dfm_dev_id[in]	dfm device id
+ @param bitmap[in]	active ports bitmap
+
+ @return < 0 on invalid argument(s) or process state
+ */
+int ia_css_process_set_dfm_active_port_bitmap(
+	ia_css_process_t *process,
+	const vied_nci_dev_dfm_id_t dfm_dev_id,
+	const vied_nci_resource_bitmap_t bitmap);
+
+#if HAS_DFM
+/*! Get the dfm port bitmap of the the process object
+
+ @param	process[in]	process object
+ @param	dfm_res_id	dfm resource id
+
+ @return bitmap of all DFM ports used by process, corresponding to the input dfm resource id
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t ia_css_process_get_dfm_port_bitmap(
+	const ia_css_process_t *process,
+	vied_nci_dev_dfm_id_t  dfm_res_id);
+#endif
+/*! Get the dfm active port bitmap of the the process object
+
+ @param	process[in]	process object
+ @param	dfm_res_id[in]	dfm resource id
+
+ @return bitmap of all active DFM ports used by the process, corresponding to the input
+ dfm resource id
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t ia_css_process_get_dfm_active_port_bitmap(
+	const ia_css_process_t *process,
+	vied_nci_dev_dfm_id_t  dfm_res_id);
+
+/*! Sets the cells bitmap of
+ * the process object
+
+ @param	process[in]	process object
+ @param bitmap[in]	bitmap
+
+ @return < 0 on invalid argument(s) or process state
+ */
+int ia_css_process_set_cells_bitmap(
+	ia_css_process_t *process,
+	const vied_nci_resource_bitmap_t bitmap);
+
+#if VIED_NCI_N_DEV_CHN_ID > 0
+/*! Get the device channel id-n resource allocation offset of the process object
+
+ @param	process[in]	process object
+ @param	dev_chn_id[in]	channel id
+
+ @return resource offset, IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_process_get_dev_chn(
+	const ia_css_process_t *process,
+	const vied_nci_dev_chn_ID_t dev_chn_id);
+#endif
+/*! Get the ext mem type-n resource id of the the process object
+
+ @param	process[in]	process object
+ @param	mem_type[in]	mem type
+
+ @return resource offset, IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_mem_ID_t ia_css_process_get_ext_mem_id(
+	const ia_css_process_t *process,
+	const vied_nci_mem_type_ID_t mem_type);
+
+/*! Sets the device channel id-n resource allocation offset of
+ * the process object
+
+ @param	process[in]	process object
+ @param	dev_chn_id[in]	channel id
+ @param offset[in]	resource offset
+
+ @return < 0 on invalid argument(s) or process state
+ */
+int ia_css_process_set_dev_chn(
+	ia_css_process_t *process,
+	const vied_nci_dev_chn_ID_t dev_chn_id,
+	const vied_nci_resource_size_t offset);
+
+/*! Boolean test if the process object type is valid
+
+ @param	process[in]	process object
+ @param	p_manifest[in]	program manifest
+
+ @return true if the process object is correct, false on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_is_process_valid(
+	const ia_css_process_t *process,
+	const ia_css_program_manifest_t *p_manifest);
+
+/*! Gets the program_idx from the process object
+
+ @param	process[in] process object
+
+ @return program index
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_process_get_program_idx(
+	const ia_css_process_t *process);
+
+/*! Returns the process extension (ONLY ALLOWED TO BE USED BY FIRMWARE).
+ * @param process[in] process object
+ * @return process entension, NULL if there is none.
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_process_ext_t *ia_css_process_get_extension(
+	const ia_css_process_t *process);
+
+#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
+#include "ia_css_psys_process_impl.h"
+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
+
+#endif /* __IA_CSS_PSYS_PROCESS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.kernel.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.kernel.h
new file mode 100644
index 000000000000..0ffff491156a
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.kernel.h
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_HSYS_KERNEL_H
+#define __IA_CSS_PSYS_PROCESS_HSYS_KERNEL_H
+
+/**
+ * @file ia_css_psys_process.hsys.kernel.h
+ *
+ * Define the methods on the process object: Hsys kernel interface
+ */
+
+#include <ia_css_psys_process_types.h>
+
+#include <vied_nci_psys_system_global.h>
+
+/*
+ * Internal resources
+ */
+
+/*!
+ * @brief Clear all resource (offset) specifications
+ *
+ * @param[in]	process				process object
+ *
+ * @return < 0 on error
+ * @ingroup group_psysapi_process_host_kernel
+ */
+extern int ia_css_process_clear_all(ia_css_process_t *process);
+
+/*!
+ * @brief Set the cell ID resource specification
+ *
+ * @param[in]	process				process object
+ * @param[in]	cell_id				cell ID
+ *
+ * @return < 0 on error
+ * @ingroup group_psysapi_process_host_kernel
+ */
+extern int ia_css_process_set_cell(
+	ia_css_process_t					*process,
+	const vied_nci_cell_ID_t				cell_id);
+
+/*!
+ * @brief Clear cell ID resource specification
+ *
+ * @param[in]	process				process object
+ * @return < 0 on error
+ * @ingroup group_psysapi_process_host_kernel
+ */
+extern int ia_css_process_clear_cell(ia_css_process_t *process);
+
+/*!
+ * @brief Set the memory resource (offset) specification for a memory
+ * that belongs to the cell that is assigned to the process.
+ *
+ * @param[in]	process				process object
+ * @param[in]	mem_type_id			mem type ID
+ * @param[in]	offset				offset
+ *
+ * @pre The cell ID must be set
+ * @return < 0 on error
+ * @ingroup group_psysapi_process_host_kernel
+ */
+extern int ia_css_process_set_int_mem(
+	ia_css_process_t		*process,
+	const	vied_nci_mem_type_ID_t	mem_type_id,
+	const vied_nci_resource_size_t	offset);
+
+/*!
+ * @brief Clear the memory resource (offset) specification for a memory
+ * type that belongs to the cell that is assigned to the process.
+ *
+ * @param[in]	process				process object
+ * @param[in]	mem_id				mem ID
+ *
+ * @pre The cell ID must be set
+ * @return < 0 on error
+ * @ingroup group_psysapi_process_host_kernel
+ */
+extern int ia_css_process_clear_int_mem(
+	ia_css_process_t		*process,
+	const vied_nci_mem_type_ID_t	mem_type_id);
+
+/*!
+ * @brief Set the memory resource (offset) specification for a memory
+ * that does not belong to the cell that is assigned to the process.
+ *
+ * @param[in]	process				process object
+ * @param[in]	mem_type_id				mem type ID
+ * @param[in]	offset				offset
+ *
+ * @pre The cell ID must be set
+ * @return < 0 on error
+ * @ingroup group_psysapi_process_host_kernel
+ */
+extern int ia_css_process_set_ext_mem(
+	ia_css_process_t		*process,
+	const vied_nci_mem_ID_t		mem_id,
+	const vied_nci_resource_size_t	offset);
+
+/*!
+ * @brief Clear the memory resource (offset) specification for a memory
+ * type that does not belong to the cell that is assigned to the process.
+ *
+ * @param[in]	process				process object
+ * @param[in]	mem_id				mem ID
+ *
+ * Precondition: The cell ID must be set
+ *
+ * @return < 0 on error
+ * @ingroup group_psysapi_process_host_kernel
+ */
+extern int ia_css_process_clear_ext_mem(
+	ia_css_process_t		*process,
+	const vied_nci_mem_type_ID_t	mem_type_id);
+
+/*!
+ * @brief Set a device channel resource (offset) specification.
+ *
+ * @param[in]	process				process object
+ * @param[in]	dev_chn_id			device channel ID
+ * @param[in]	offset				offset
+ *
+ * @return < 0 on error
+ * @ingroup group_psysapi_process_host_kernel
+ */
+extern int ia_css_process_set_dev_chn(
+	ia_css_process_t		*process,
+	const vied_nci_dev_chn_ID_t	dev_chn_id,
+	const vied_nci_resource_size_t	offset);
+
+/*!
+ * @brief Clear a device channel resource (offset) specification
+ *
+ * @param[in]	process				process object
+ * @param[in]	dev_chn_id			device channel ID
+ *
+ * @return < 0 on error
+ * @ingroup group_psysapi_process_host_kernel
+ */
+extern int ia_css_process_clear_dev_chn(
+	ia_css_process_t		*process,
+	const vied_nci_dev_chn_ID_t	dev_chn_id);
+
+#endif /* __IA_CSS_PSYS_PROCESS_HSYS_KERNEL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.user.h
new file mode 100644
index 000000000000..119ae30af523
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.user.h
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_HSYS_USER_H
+#define __IA_CSS_PSYS_PROCESS_HSYS_USER_H
+
+/**
+ *  @file ia_css_psys_process.hsys.user.h
+ *
+ *  Define the methods on the process object: Hsys user interface
+ */
+
+#include <ia_css_program_group_param.h>		/* ia_css_program_param_t */
+
+#include <ia_css_psys_process_types.h>
+#include <ia_css_psys_manifest_types.h>
+
+#include <type_support.h>					/* uint8_t */
+
+/*
+ * Creation
+ */
+
+/*!
+ * @brief Compute the size of storage required for allocating the process object.
+ *
+ * @param [in]	manifest			program manifest
+ * @param [in]	param				program parameters
+ *
+ * @return 0 on error
+ * @ingroup group_psysapi_process_host_user
+ */
+extern size_t ia_css_sizeof_process(
+	const ia_css_program_manifest_t			*manifest,
+	const ia_css_program_param_t			*param);
+
+/*!
+ * @brief Create the process object
+ *
+ * @param [in]	raw_mem				pre allocated memory
+ * @param [in]	manifest			program manifest
+ * @param [in]	param				program parameters
+ *
+ * @return NULL on error
+ * @ingroup group_psysapi_process_host_user
+ */
+extern ia_css_process_t *ia_css_process_create(
+	void				*raw_mem,
+	const ia_css_program_manifest_t	*manifest,
+	const ia_css_program_param_t	*param,
+	const uint32_t			program_idx);
+
+/*!
+ * @brief Destroy (the storage of) the process object
+ *
+ * @param [in]	process				process object
+ *
+ * @return NULL
+ * @ingroup group_psysapi_process_host_user
+ */
+extern ia_css_process_t *ia_css_process_destroy(
+	ia_css_process_t	*process);
+
+/*
+ * Access functions
+ */
+
+/*!
+ * @brief Print the process object to file/stream
+ *
+ * @param [in]	process				process object
+ * @param [out]	fid				file/stream handle
+ *
+ * @return < 0 on error
+ * @ingroup group_psysapi_process_host_user
+ */
+extern int ia_css_process_print(
+	const ia_css_process_t	*process,
+	void			*fid);
+
+#endif /* __IA_CSS_PSYS_PROCESS_HSYS_USER_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.psys.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.psys.h
new file mode 100644
index 000000000000..fd1ca0c6d288
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.psys.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_PSYS_H
+#define __IA_CSS_PSYS_PROCESS_PSYS_H
+
+/*! \file */
+
+/** @file ia_css_psys_process.psys.h
+ *
+ * Define the methods on the process object: Psys embedded interface
+ */
+
+#include <ia_css_psys_process_types.h>
+
+/*
+ * Process manager
+ */
+
+/*! Acquire the resources specificed in process object
+
+ @param	process[in]				process object
+
+ Postcondition: This is a try process if any of the
+ resources is not available, all succesfully acquired
+ ones will be release and the function will return an
+ error
+
+ @return < 0 on error
+ */
+extern int ia_css_process_acquire(ia_css_process_t *process);
+
+/*! Release the resources specificed in process object
+
+ @param	process[in]				process object
+
+ @return < 0 on error
+ */
+extern int ia_css_process_release(ia_css_process_t *process);
+
+#endif /* __IA_CSS_PSYS_PROCESS_PSYS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.h
new file mode 100644
index 000000000000..1966f6d31ebc
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.h
@@ -0,0 +1,487 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_H
+#define __IA_CSS_PSYS_PROCESS_GROUP_H
+
+/*! \file */
+
+/** @file ia_css_psys_process_group.h
+ *
+ * Define the methods on the process object that are not part of
+ * a single interface
+ */
+#include "ia_css_rbm.h"
+
+#include <ia_css_psys_process_types.h>
+#include <ia_css_psys_dynamic_storage_class.h>
+
+#include <type_support.h>					/* uint8_t */
+
+/*
+ * Creation
+ */
+#include <ia_css_psys_process_group.hsys.user.h>
+
+/*
+ * Registration of user contexts / callback info
+ * External resources
+ * Sequencing resources
+ */
+#include <ia_css_psys_process_group.hsys.kernel.h>
+
+/*
+ * Dispatcher
+ */
+#include <ia_css_psys_process_group.psys.h>
+
+/*
+ * Access to sub-structure handles / fields
+ */
+
+#include "ia_css_terminal.h"
+
+#include "ia_css_terminal_manifest_base_types.h"
+#include "ia_css_terminal_manifest_types.h"
+
+/*! Get the number of fragments on the process group
+
+ @param	process_group[in]		process group object
+
+ Note: Future change is to have a fragment count per
+ independent subgraph
+
+ @return the fragment count, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint16_t ia_css_process_group_get_fragment_count(
+	const ia_css_process_group_t		*process_group);
+
+/*! Get the fragment state on the process group
+
+ @param	 process_group[in]		process group object
+ @param	 fragment_state[in]		current fragment of processing
+
+ @return -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_get_fragment_state(
+	const ia_css_process_group_t		*process_group,
+	uint16_t				*fragment_state);
+
+/*! Set the fragment state on the process group
+
+ @param	process_group[in]		process group object
+ @param	fragment_state[in]		current fragment of processing
+
+ @return -1 on error
+  */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_set_fragment_state(
+	ia_css_process_group_t			*process_group,
+	uint16_t				fragment_state);
+
+/*! Get the number of processes on the process group
+
+ @param	process_group[in]		process group object
+
+ @return the process count, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_process_group_get_process_count(
+	const ia_css_process_group_t		*process_group);
+
+/*! Get the number of terminals on the process group
+
+ @param	process_group[in]		process group object
+
+ Note: Future change is to have a terminal count per
+ independent subgraph
+
+ @return the terminal count, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_process_group_get_terminal_count(
+	const ia_css_process_group_t		*process_group);
+
+/*! Get the PSYS server init time in cycles
+
+ @param	process_group[in]		process group object
+
+ @return PSYS server init time, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_process_group_get_psys_server_init_cycles(
+	const ia_css_process_group_t			*process_group);
+
+/*! \deprecated this is old and will get removed */
+/*! Get the PG load start timestamp
+
+ @param	process_group[in]		process group object
+
+ @return PG load start timestamp, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_process_group_get_pg_load_start_ts(
+	const ia_css_process_group_t			*process_group);
+
+/*! Get the PG load time in cycles
+
+ @param	process_group[in]		process group object
+
+ @return PG load time in cycles, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_process_group_get_pg_load_cycles(
+	const ia_css_process_group_t			*process_group);
+
+/*! Get the PG init time in cycles
+
+ @param	process_group[in]		process group object
+
+ @return PG init time in cycles, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_process_group_get_pg_init_cycles(
+	const ia_css_process_group_t			*process_group);
+
+/*! Get the PG processing time in cycles
+
+ @param	process_group[in]		process group object
+
+ @return PG processing time in cycles, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_process_group_get_pg_processing_cycles(
+	const ia_css_process_group_t			*process_group);
+
+/*! Get the PG next frame init time in cycles
+
+ @param	process_group[in]		process group object
+
+ @return PG processing time in cycles, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_process_group_get_pg_next_frame_init_cycles(
+	const ia_css_process_group_t			*process_group);
+
+/*! Get the PG complete time in cycles
+
+ @param	process_group[in]		process group object
+
+ @return PG processing time in cycles, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_process_group_get_pg_complete_cycles(
+	const ia_css_process_group_t			*process_group);
+
+/*! Get the (pointer to) the <terminal type> terminal of the process group object
+
+ @param	process_group[in]               process group object
+ @param	terminal_type[in]               terminal type of terminal
+
+ @return the pointer to the terminal, NULL on error
+ */
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_terminal_t *ia_css_process_group_get_terminal_from_type(
+		const ia_css_process_group_t *process_group,
+		const ia_css_terminal_type_t terminal_type);
+
+/*! Get the (pointer to) the <terminal type> terminal of the process group object
+ * for terminals which have only a single instance
+ * (cached in, cached out, program, program_ctrl_init)
+
+ @param	process_group[in]               process group object
+ @param	terminal_type[in]               terminal type of terminal
+
+ @return the pointer to the terminal, NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+const ia_css_terminal_t *ia_css_process_group_get_single_instance_terminal(
+	const ia_css_process_group_t 	*process_group,
+	ia_css_terminal_type_t		term_type);
+
+/*! Get the (pointer to) the manifest indexed terminal of the process group object
+
+ @param	process_group[in]		process group object
+ @param	manifest_idx[in]		index of the terminal in manifest
+
+ @return the pointer to the terminal, NULL on error
+ */
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_terminal_t *ia_css_process_group_get_manifest_idx_terminal(
+	const ia_css_process_group_t *process_grp,
+	const unsigned int manifest_idx);
+
+/*! Get the (pointer to) the indexed terminal of the process group object
+
+ @param	process_group[in]		process group object
+ @param	terminal_index[in]		index of the terminal
+
+ @return the pointer to the terminal, NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_terminal_t *ia_css_process_group_get_terminal(
+	const ia_css_process_group_t		*process_group,
+	const unsigned int			terminal_index);
+
+/*! Get the (pointer to) the indexed process of the process group object
+
+ @param	process_group[in]		process group object
+ @param	process_index[in]		index of the process
+
+ @return the pointer to the process, NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_process_t *ia_css_process_group_get_process(
+	const ia_css_process_group_t		*process_group,
+	const unsigned int			process_index);
+
+/*! Get the stored size of the process group object
+
+ @param	process_group[in]				process group object
+
+ @return size, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+size_t ia_css_process_group_get_size(
+	const ia_css_process_group_t		*process_group);
+
+/*! Get the state of the the process group object
+
+ @param	process_group[in]		process group object
+
+ @return state, limit value on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_process_group_state_t ia_css_process_group_get_state(
+	const ia_css_process_group_t		*process_group);
+
+/*! Get the unique ID of program group used by the process group object
+
+ @param	process_group[in]		process group object
+
+ @return ID, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_program_group_ID_t ia_css_process_group_get_program_group_ID(
+	const ia_css_process_group_t		*process_group);
+
+/*! Get the resource bitmap of the process group
+
+ @param	process_group[in]		process group object
+
+ @return the reource bitmap
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t ia_css_process_group_get_resource_bitmap(
+	const ia_css_process_group_t		*process_group);
+
+/*! Set the resource bitmap of the process group
+
+ @param	process_group[in]		process group object
+ @param	resource_bitmap[in]		the resource bitmap
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_set_resource_bitmap(
+	ia_css_process_group_t			*process_group,
+	const vied_nci_resource_bitmap_t	resource_bitmap);
+
+/*! Get the kernel bitmap of the the process group object
+
+ @param	process_group[in] process group object
+
+ @return process group kernel bitmap
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_process_group_get_kernel_bitmap(
+	const ia_css_process_group_t *process_group);
+
+/*! Get the routing bitmap of the process group
+
+ @param	process_group[in]   process group object
+
+ @return routing bitmap (pointer)
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+const ia_css_rbm_t *ia_css_process_group_get_routing_bitmap(
+	const ia_css_process_group_t *process_group);
+
+/*! Set the routing bitmap of the process group
+
+ @param	process_group[in]   process group object
+ @param	rbm[in]		        routing bitmap
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_set_routing_bitmap(
+	ia_css_process_group_t *process_group,
+	const ia_css_rbm_t rbm);
+
+/*! Get IPU virtual address of process group
+
+ @param	 process_group[in]		process group object
+ @param	 ipu_vaddress[in/out]	process group ipu virtual address
+
+ @return -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_get_ipu_vaddress(
+	const ia_css_process_group_t		*process_group,
+	vied_vaddress_t			*ipu_vaddress);
+
+/*! Set IPU virtual address of process group
+
+ @param	process_group[in]		process group object
+ @param	ipu_vaddress[in]		process group ipu address
+
+ @return -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_set_ipu_vaddress(
+	ia_css_process_group_t			*process_group,
+	vied_vaddress_t			ipu_vaddress);
+
+/*! Get protocol version used by a process group
+
+ @param	process_group[in]		process group object
+
+ @return invalid protocol version on error
+
+ @todo Add new protocol version for IPU7.  Defer this for now,
+ because it will create a LOT of disruption.
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_process_group_get_protocol_version(
+	const ia_css_process_group_t *process_group);
+
+/*! Get base queue id used by a process group
+
+ @param	process_group[in]		process group object
+
+ @return -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_process_group_get_base_queue_id(
+	ia_css_process_group_t *process_group);
+
+/*! Set base queue id used by a process group
+
+ @param	process_group[in]		process group object
+ @param	queue_id[in]			process group queue id
+
+ @return invalid queue id on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_set_base_queue_id(
+	ia_css_process_group_t *process_group,
+	uint8_t queue_id);
+
+/*! Get number of queues used by a process group
+
+ @param	process_group[in]		process group object
+
+ @return invalid number of queues (0) on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_process_group_get_num_queues(
+	ia_css_process_group_t *process_group);
+
+/*! Set number of queues used by a process group
+
+ @param	process_group[in]		process group object
+ @param	num_queues[in]			process group number of queues
+
+ @return -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_set_num_queues(
+	ia_css_process_group_t *process_group,
+	uint8_t num_queues);
+
+/*! Set error handling enable flag used by process group
+
+ @param	process_group[in]		process group object
+ @param	error_handling_enable[in]	flag to control error handling
+
+ @return -1 on error, 0 on success
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_set_error_handling_enable(
+	ia_css_process_group_t *process_group,
+	const bool error_handling_enable);
+
+/*! Get the error handling enable flag associated to the process group
+
+ @param	process_group[in]		process group object
+
+ @return error_handlnig_enable flag of the process group. On error UINT8_MAX
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_process_group_get_error_handling_enable(
+	const ia_css_process_group_t *process_group);
+
+/** Return true if the process group requires vector processor (i.e. DSP)
+ *  resources  */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_process_group_has_vp(const ia_css_process_group_t *process_group);
+
+/*! Check if terminal is enabled based on kernel enable bitmap
+
+ @param	terminal_manifest[in]		terminal manifest object
+ @param	enable_bitmap[in]		kernel enable bitmap
+
+ @return true if enabled, false if not enabled
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_process_group_is_terminal_enabled(
+	const ia_css_terminal_manifest_t *terminal_manifest,
+	ia_css_kernel_bitmap_t enable_bitmap);
+
+/*! Check if data terminal is enabled based on kernel enable bitmap
+
+ @param	data_term_manifest[in]		data terminal manifest object
+ @param	enable_bitmap[in]		kernel enable bitmap
+
+ @return true if enabled, false if not enabled
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_process_group_is_data_terminal_enabled(
+	const ia_css_data_terminal_manifest_t	*data_term_manifest,
+	ia_css_kernel_bitmap_t enable_bitmap);
+
+/*! Check if spatial terminal is enabled based on kernel enable bitmap
+
+ @param	spatial_term_man[in]	spatial	terminal manifest object
+ @param	enable_bitmap[in]		kernel enable bitmap
+
+ @return true if enabled, false if not enabled
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_process_group_is_spatial_terminal_enabled(
+	const ia_css_spatial_param_terminal_manifest_t *spatial_term_man,
+	ia_css_kernel_bitmap_t enable_bitmap);
+
+#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
+#include "ia_css_psys_process_group_impl.h"
+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
+
+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.kernel.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.kernel.h
new file mode 100644
index 000000000000..87f127c8ed76
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.kernel.h
@@ -0,0 +1,379 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_HSYS_KERNEL_H
+#define __IA_CSS_PSYS_PROCESS_GROUP_HSYS_KERNEL_H
+
+/*! \file */
+
+/** @file ia_css_psys_process_group.hsys.kernel.h
+ *
+ * Define the methods on the process group object: Hsys kernel interface
+ *
+ *  This file, together with the user space header, ia_css_psys_process_group.hsys.user.h,
+ *  defines the functions required to manage the lifetime of a process group.
+ *
+ * Sequence for settup up and queueing processing tasks with a persistent program group
+ * to IPU is:
+ *
+ * # Get Program Group manifest by ID
+ * # Create process group object based on that program group manifest
+ * # Configure process group
+ * ## Set kernel and terminal enables
+ * ## Set terminal attributes
+ * # Submit processs group
+ * # Start process group
+ * # Disown process group
+ * # Frame/Fragment processing loop
+ * ## Enqueue buffer sets - This sends the terminal buffers to FW
+ * ## Resume process group - This actually instructs FW to start processing with this PG.  The
+ * process group will process any available buffer sets until suspended or stopped, pending
+ * available resources.
+ * ## Suspend process group - Only required when multiple PG's are active, this suspends the
+ * processing of one group, which allows another PG to run with the same resources. Buffer
+ * sets for the suspended PG may continue to be queued, but will not be processed until
+ * the PG is resumed.  The decision when to suspend/resume is scheduling.
+ * # Stop process group - No more buffer sets or resume/suspend commands may be sent.
+ *
+ */
+
+#include <ia_css_psys_process_types.h>
+
+#include <ia_css_psys_buffer_set.h>
+#include <vied_nci_psys_system_global.h>
+
+#include <type_support.h>					/* uint8_t */
+
+/*
+ * Registration of user contexts / callback info
+ */
+
+/*! Get the user (callback) token as registered in the process group
+
+ @param	process_group[in]		process group object
+
+ @return 0 on error
+ */
+extern uint64_t ia_css_process_group_get_token(
+	ia_css_process_group_t					*process_group);
+
+/*! Set (register) a user (callback) token in the process group
+
+ The token value shall be non-zero. This token is
+ returned in each return message related to the process
+ group the token is registered with.
+
+ @param	process_group[in]		process group object
+ @param	token[in]				user token
+ @return < 0 on error
+ */
+extern int ia_css_process_group_set_token(
+	ia_css_process_group_t					*process_group,
+	const uint64_t							token);
+
+/*
+ * Passing of a (fragment) watermark
+ */
+
+/*! Get the fragment progress limit of the process group
+
+ @see ia_css_process_group_set_fragment_limit()
+
+ @param	process_group[in]		process group object
+
+ @return 0 on error
+
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint16_t ia_css_process_group_get_fragment_limit(
+	const ia_css_process_group_t				*process_group);
+
+/*! Set the new fragment progress limit of the process group
+
+ @param	process_group[in]		process group object
+ @param	fragment_limit[in]		New limit value
+
+ @note The limit value must be less or equal to the fragment
+ count value. The process group will not make progress beyond
+ the limit value. The limit value can be modified asynchronously
+ If the limit value is reached before an update happens, the
+ process group will suspend and will not automatically resume.
+
+ The limit is monotonically increasing. The default value is
+ equal to the fragment count
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_set_fragment_limit(
+	ia_css_process_group_t				*process_group,
+	const uint16_t					fragment_limit);
+
+/*! Clear the fragment progress limit of the process group
+
+ @see ia_css_process_group_set_fragment_limit()
+
+ @param	process_group[in]		process group object
+
+ @note This function sets the fragment limit to zero.
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_clear_fragment_limit(
+	ia_css_process_group_t					*process_group);
+
+/*
+ * Commands
+ */
+
+/*! Perform the start command on the process group
+
+ @param	process_group[in]		process group object
+
+ @note Start is an action of the l-Scheduler it makes the
+ process group eligible for execution.
+ For PPG's, execution will not occur until the resume
+ command is issued.  See ia_css_process_group_resume()
+
+ @par For persistent program/process groups () the start
+ command must be called once per stream instance,
+ at stream creation.
+
+ @par Precondition: The external resources that are attached to
+ the process group must be in the correct state, i.e. input
+ buffers are not-empty and output buffers not-full
+
+ @return < 0 on error
+ */
+extern int ia_css_process_group_start(
+	ia_css_process_group_t					*process_group);
+
+/*! Perform the suspend command on the process group
+
+ @param	process_group[in]		process group object
+
+ @note Suspend indicates that the process group execution
+ is halted at the next fragment boundary. The process group
+ will not automatically resume
+
+ @par Precondition: The process group must be running
+
+ @return < 0 on error
+ */
+extern int ia_css_process_group_suspend(
+	ia_css_process_group_t					*process_group);
+
+/*! Perform the resume command on the process group
+
+ @param	process_group[in]		process group object
+
+ @note Resume indicates that the process group is again
+ eligible for execution
+
+ @par Precondition: The process group must be started
+
+ @return < 0 on error
+ */
+extern int ia_css_process_group_resume(
+	ia_css_process_group_t					*process_group);
+
+/*! Perform the reset command on the process group
+
+ @param	process_group[in]		process group object
+
+ @note Return the process group to the started state
+
+ @par Precondition: The process group must be running or stopped
+
+ @return < 0 on error
+ */
+extern int ia_css_process_group_reset(
+	ia_css_process_group_t					*process_group);
+
+/*! Perform the abort command on the process group
+
+ @param	process_group[in]		process group object
+
+ @note Force the process group to the stopped state
+
+ @par Precondition: The process group must be running or started
+
+ @return < 0 on error
+ */
+extern int ia_css_process_group_abort(
+	ia_css_process_group_t					*process_group);
+
+/*! Release ownership of the process group
+
+  For PPG's, this is the last step required before buffer
+  sets can be enqueued.
+
+ @param	process_group[in]		process group object
+
+ @note Release notifies PSYS and hands over ownership of the
+ process group from SW to FW.
+
+ @par Precondition: The process group must be in the started state
+
+ @return < 0 on error
+ */
+extern int ia_css_process_group_disown(
+	ia_css_process_group_t					*process_group);
+
+/*
+ * External resources
+ */
+
+/*! Set (register) a data buffer to the indexed terminal in the process group
+
+ @param	process_group[in]		process group object
+ @param	buffer[in]			buffer handle
+ @param	buffer_state[in]		state of the buffer
+ @param	terminal_index[in]		index of the terminal
+
+ @note For legacy program groups (== non-PPG), the buffer handle
+ shall not be VIED_NULL, but the buffer state can be undefined; BUFFER_UNDEFINED
+
+ @par For PPG's, buffer is ignored as the buffers will be sent
+ later on with ia_css_enqueue_buffer_set().  Nonetheless, this function must be
+ called before ia_css_process_group_submit() as sets up some internal bookeeping.
+
+ @note The buffer can be in memory or streaming over memory
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_attach_buffer(
+	ia_css_process_group_t			*process_group,
+	vied_vaddress_t				buffer,
+	const ia_css_buffer_state_t		buffer_state,
+	const unsigned int			terminal_index);
+
+/*! Get (unregister) the data buffer on the indexed terminal of
+ * the process group
+
+ @param	process_group[in]		process group object
+ @param	terminal_index[in]		index of the terminal
+
+ @note Precondition: The process group must be stopped
+
+ @par Postcondition: The buffer handle shall be reset to VIED_NULL, the buffer
+ state to BUFFER_NULL
+
+ @par This function is meaningless for PPG's
+
+ @return VIED_NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_vaddress_t ia_css_process_group_detach_buffer(
+	ia_css_process_group_t			*process_group,
+	const unsigned int			terminal_index);
+
+/*! Set (register) a data buffer to the indexed terminal in the process group
+
+ @param	process_group[in]		process group object
+ @param	stream[in]				stream handle
+ @param	buffer_state[in]		state of the buffer
+ @param	terminal_index[in]		index of the terminal
+
+ @note The stream handle shall not be zero, the buffer
+ state can be undefined; BUFFER_UNDEFINED
+
+ @note The stream is used exclusive to a buffer; the latter can be in memory
+ or streaming over memory
+
+ @todo Unclear what this function is for.  Clarify!
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_attach_stream(
+	ia_css_process_group_t			*process_group,
+	uint32_t				stream,
+	const ia_css_buffer_state_t		buffer_state,
+	const unsigned int			terminal_index);
+
+/*! Get (unregister) the stream handle on the indexed terminal of
+ * the process group
+
+ @param	process_group[in]		process group object
+ @param	terminal_index[in]		index of the terminal
+
+ @par Precondition: The process group must be stopped
+
+ @par Postcondition: The stream handle shall be reset to zero, the buffer
+ state to BUFFER_NULL
+
+ @todo Unclear what this function is for.  Clarify!
+
+ @return 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_process_group_detach_stream(
+	ia_css_process_group_t			*process_group,
+	const unsigned int			terminal_index);
+
+/*
+ * Sequencing resources
+ */
+
+/*! Set (an artificial) blocking resource (barrier) in
+ * the process group resource map
+
+ @param	process_group[in]		process group object
+ @param	barrier_index[in]		index of the barrier
+
+ @note The barriers have to be set to force sequence between started
+ process groups
+
+ @return < 0 on error
+
+ @todo Seems this function no longer has any use.  Clarify!
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_set_barrier(
+	ia_css_process_group_t					*process_group,
+	const vied_nci_barrier_ID_t				barrier_index);
+
+/*! Clear a previously set blocking resource (barrier) in
+ * the process group resource map
+
+ @param	process_group[in]		process group object
+ @param	barrier_index[in]		index of the barrier
+
+ @par Precondition: The barriers must have been set
+
+ @return < 0 on error
+
+ @todo Seems this function no longer has any use.  Clarify!
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_clear_barrier(
+	ia_css_process_group_t					*process_group,
+	const vied_nci_barrier_ID_t				barrier_index);
+
+/*! Boolean test if the process group preconditions for start are satisfied
+
+ @param	process_group[in]		process group object
+
+ @return true if the process group can be started
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_can_process_group_start(
+	const ia_css_process_group_t			*process_group);
+
+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_HSYS_KERNEL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.user.h
new file mode 100644
index 000000000000..fcae13370148
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.user.h
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_HSYS_USER_H
+#define __IA_CSS_PSYS_PROCESS_GROUP_HSYS_USER_H
+
+/*! \file */
+
+/** @file ia_css_psys_process_group.hsys.user.h
+ *
+ * Define the methods on the process group object: Hsys user interface
+ *
+ * This file, together with the user space header, ia_css_psys_process_group.hsys.kernel.h,
+ *  defines the functions required to manage the lifetime of a process group.
+ */
+
+#include <ia_css_program_group_param.h>	/* ia_css_program_group_param_t */
+
+#include <ia_css_psys_process_types.h>
+#include <ia_css_psys_manifest_types.h>
+#include <ia_css_psys_buffer_set.h>
+
+#include "ia_css_psys_dynamic_storage_class.h"
+
+#include <type_support.h>					/* uint8_t */
+
+/*
+ * Creation
+ */
+
+/*! Compute the size of storage required for allocating the process group object
+
+ @param	manifest[in]			program group manifest
+ @param	param[in]			program group parameters
+
+ @return 0 on error
+ */
+extern size_t ia_css_sizeof_process_group(
+	const ia_css_program_group_manifest_t	*manifest,
+	const ia_css_program_group_param_t	*param);
+
+/*! Checks whether a certain program is enabled.
+ *   FUNCTION IS PRIVATE TO THIS MODULE
+
+ @param	program_manifest[in] program manifest
+ @param	enable_bitmap[in]   kernel enable bitmap corresponding to process group
+
+ @return true if program is enabled (and process will be instantiated)
+ */
+extern bool ia_css_process_group_is_program_enabled(
+	const ia_css_program_manifest_t *program_manifest,
+	ia_css_kernel_bitmap_t enable_bitmap);
+
+/*! Create (the storage for) the process group object
+
+ @param	process_grp_mem[in/out]	raw memory for process group
+ @param	manifest[in]			program group manifest
+ @param	param[in]			program group parameters
+
+ @return NULL on error
+ */
+extern ia_css_process_group_t *ia_css_process_group_create(
+	void					*process_grp_mem,
+	const ia_css_program_group_manifest_t	*manifest,
+	const ia_css_program_group_param_t	*param);
+
+/*! Destroy (the storage of) the process group object
+
+ @param	process_group[in]		process group object
+
+ @return NULL
+ */
+extern ia_css_process_group_t *ia_css_process_group_destroy(
+	ia_css_process_group_t					*process_group);
+
+/*! Print the process group object to file/stream in
+  textual format
+
+ @param	process_group[in]		process group object
+ @param	fid[out]				file/stream handle
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_print(
+	const ia_css_process_group_t		*process_group,
+	void					*fid);
+
+/*
+ * Commands
+ */
+
+/*! Perform the submit command on the process group
+
+ @param	process_group[in]		process group object
+
+ @note Submit is an action of the h-Scheduler it makes the
+ process group eligible for the l-Scheduler
+
+ @par Precondition : The external resources must be attached to
+ the process group
+
+ @return < 0 on error
+ */
+extern int ia_css_process_group_submit(
+	ia_css_process_group_t					*process_group);
+
+/*! Boolean test if the process group object type is valid
+
+ @param	process_group[in]		process group object
+ @param	manifest[in]			program group manifest
+ @param	param[in]				program group parameters
+
+ @return true if the process group is correct, false on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_is_process_group_valid(
+	const ia_css_process_group_t		*process_group,
+	const ia_css_program_group_manifest_t	*manifest,
+	const ia_css_program_group_param_t	*param);
+
+/*! Boolean test if the process group preconditions for submit are satisfied
+
+ @param	process_group[in]		process group object
+
+ @return true if the process group can be submitted
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_can_process_group_submit(
+	const ia_css_process_group_t			*process_group);
+
+/*! Boolean test if the preconditions on process group and buffer set are
+    satisfied for enqueuing buffer set
+
+ @param	process_group[in]		process group object
+ @param	buffer_set[in]			buffer set object
+
+ @return true if the buffer set can be enqueued
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_can_enqueue_buffer_set(
+	const ia_css_process_group_t			*process_group,
+	const ia_css_buffer_set_t			*buffer_set);
+
+/*! Compute the cyclecount required for executing the process group object
+
+ @param	manifest[in]			program group manifest
+ @param	param[in]				program group parameters
+
+ @return 0 on error
+
+ @note Current implementation is trivial
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_process_group_compute_cycle_count(
+	const ia_css_program_group_manifest_t	*manifest,
+	const ia_css_program_group_param_t	*param);
+
+/*! Compute the number of processes required for
+ * executing the process group object
+
+ @param	manifest[in]			program group manifest
+ @param	param[in]				program group parameters
+
+ @return 0 on error
+ */
+extern uint8_t ia_css_process_group_compute_process_count(
+	const ia_css_program_group_manifest_t	*manifest,
+	const ia_css_program_group_param_t		*param);
+
+/*! Compute the number of terminals required for
+ * executing the process group object
+
+ @param	manifest[in]			program group manifest
+ @param	param[in]				program group parameters
+
+ @return 0 on error
+ */
+extern uint8_t ia_css_process_group_compute_terminal_count(
+	const ia_css_program_group_manifest_t	*manifest,
+	const ia_css_program_group_param_t		*param);
+
+/*! Get private token as registered in the process group by the implementation
+
+ @note The token value shall be non-zero. This token is private
+ to the implementation. This is in addition to the user token.
+ See ia_css_process_group_set_token()
+
+ @param	process_group[in]		process group object
+
+ @return 0 on error
+ */
+extern uint64_t ia_css_process_group_get_private_token(
+	ia_css_process_group_t					*process_group);
+
+/*! Set private token in the process group as needed by the implementation
+
+ @param	process_group[in]		process group object
+ @param	token[in]				user token
+
+ @note The token value shall be non-zero. This token is private
+ to the implementation. This is in addition to the user token.
+ see ia_css_process_group_get_token()
+
+ @return < 0 on error, 0 on success
+ */
+extern int ia_css_process_group_set_private_token(
+	ia_css_process_group_t					*process_group,
+	const uint64_t							token);
+
+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_HSYS_USER_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.psys.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.psys.h
new file mode 100644
index 000000000000..a1c47ae83066
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.psys.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_PSYS_H
+#define __IA_CSS_PSYS_PROCESS_GROUP_PSYS_H
+
+/*! \file */
+
+/** @file ia_css_psys_process_group.psys.h
+ *
+ * Define the methods on the process group object: Psys embedded interface
+ */
+
+#include <ia_css_psys_process_types.h>
+
+/*
+ * Dispatcher
+ */
+
+/*! Perform the run command on the process group
+
+ @param	process_group[in]		process group object
+
+ Note: Run indicates that the process group will execute
+
+ Precondition: The process group must be started or
+ suspended and the processes have acquired the necessary
+ internal resources
+
+ @return < 0 on error
+ */
+extern int ia_css_process_group_run(
+	ia_css_process_group_t					*process_group);
+
+/*! Perform the stop command on the process group
+
+ @param	process_group[in]		process group object
+
+ Note: Stop indicates that the process group has completed execution
+
+ Postcondition: The external resoruces can now be detached
+
+ @return < 0 on error
+ */
+extern int ia_css_process_group_stop(
+	ia_css_process_group_t					*process_group);
+
+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_PSYS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_cmd_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_cmd_impl.h
new file mode 100644
index 000000000000..ea4464e13d9c
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_cmd_impl.h
@@ -0,0 +1,280 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_CMD_IMPL_H
+#define __IA_CSS_PSYS_PROCESS_GROUP_CMD_IMPL_H
+
+#include "type_support.h"
+#include "ia_css_psys_process_group.h"
+#include "ia_css_rbm_manifest_types.h"
+
+#define N_UINT64_IN_PROCESS_GROUP_STRUCT	2
+#define N_UINT32_IN_PROCESS_GROUP_STRUCT	8
+#define N_UINT16_IN_PROCESS_GROUP_STRUCT	5
+#define N_UINT8_IN_PROCESS_GROUP_STRUCT		8
+#define N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT	2
+
+#define SIZE_OF_PROCESS_GROUP_STRUCT_BITS \
+	(IA_CSS_RBM_BITS \
+	+ IA_CSS_KERNEL_BITMAP_BITS \
+	+ N_UINT64_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT64_T_BITS \
+	+ N_UINT32_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT32_T_BITS \
+	+ IA_CSS_PROGRAM_GROUP_ID_BITS \
+	+ IA_CSS_PROCESS_GROUP_STATE_BITS \
+	+ VIED_VADDRESS_BITS \
+	+ VIED_NCI_RESOURCE_BITMAP_BITS \
+	+ N_UINT16_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT16_T_BITS \
+	+ N_UINT8_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT8_T_BITS \
+	+ N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT8_T_BITS)
+
+/** Process group object describing an instance of a Program Group
+ *
+ *  This is the root structure passed in a number of PG commands via
+ *  the syscom queuing interface to firmware from the host.  A pointer
+ *  to this structure in main memroy is passed in the following
+ *  PG commands: start, resume, suspend, stop, abort.
+ *
+ *  A process group is created based on a program group specification
+ *  described in the program group manifest.  Briefly, a program group
+ *  contains programs which in turn contain kernels.  A program group
+ *  also has terminals, which connect it to the outside world.  Each
+ *  terminal represents either parameters or image data flowing in or
+ *  out of the group.  Terminals come in different types and may have
+ *  addtional attributes.  For example, a data termainal will have
+ *  a frame format attribute.
+ *  @see ia_css_process_group_create()
+ *  @see ia_css_program_group_manifest_t and related API and:
+ *  @see ia_css_pkg_dir_entry_get_type() and
+ *  ia_css_client_pkg_get_pg_manifest_offset_size() (and in general the
+ *  ia_css_pkg_dir* functions) for how to get the program group manifest
+ *  array from the binary release package.
+ *
+ *  @note Some of the fields within are used internally within the
+ *  firmware only, after the firmware copies the process group structure
+ *  to its internel cache.  The original in main memory is not updated.
+ *  All such fields should be initialized to zero, unless otherwise
+ *  noted.
+ *  See the individual field descriptions for which fields are "internal".
+ */
+struct ia_css_process_group_s {
+	/** User (callback) token / user context reference,
+	 * zero is an error value
+	 */
+	uint64_t token;
+	/** private token / context reference, zero is an error value */
+	uint64_t private_token;
+	/** PG routing bitmap used to set connection between program group
+	 *  components */
+	ia_css_rbm_t routing_bitmap;
+	/** PG kernel bitmap.  Marks which program kernels (i.e. kernel==device, when impelementation is fixed)
+	 *  are enabled. This bitmap covers all kernels in the group, no matter which program they belong to. */
+	ia_css_kernel_bitmap_t kernel_bitmap;
+	/** Size of this structure in bytes */
+	uint32_t size;
+	/** The timestamp when PG load starts
+	 *  @note Internal firmware use only. */
+	/**< PSYS server init time in cycless */
+	uint32_t psys_server_init_cycles;
+	/**< The timestamp when PG load starts */
+	uint32_t pg_load_start_ts;
+	/** PG load time in cycles
+	 *  @note Internal firmware use only. */
+	uint32_t pg_load_cycles;
+	/** PG init time in cycles
+	 *  @note Internal firmware use only. */
+	uint32_t pg_init_cycles;
+	/** PG processing time in cycles
+	 *  @note Internal firmware use only. */
+	uint32_t pg_processing_cycles;
+	/** Referral ID to program group FW.  This identifies the "type" of the process group
+	 *  and associcates the process group with the program group defined in the manifest. */
+	/**< PG next frame init time in cycles */
+	uint32_t pg_next_frame_init_cycles;
+	/**< PG complete time in cycles */
+	uint32_t pg_complete_cycles;
+	/**< Referral ID to program group FW */
+	ia_css_program_group_ID_t ID;
+	/** State of the process group FSM */
+	ia_css_process_group_state_t state;
+	/** Virtual address of process group in the IPU address space */
+	vied_vaddress_t ipu_virtual_address;
+	/** Bitmap of the compute resources used by the process group  */
+	vied_nci_resource_bitmap_t resource_bitmap;
+	/** Number of fragments offered on each terminal */
+	uint16_t fragment_count;
+	/** Current fragment of processing */
+	uint16_t fragment_state;
+	/** Watermark to control fragment processing.  Set to the same value as "fragment_count"
+	 *  unless you know what you are doing.
+	 *  @see  fragment_count in this structure. */
+	uint16_t fragment_limit;
+	/** Offset in bytes relative to the beginning of this structure, to process_offset_table[process_count].
+	 *  Must be aligned to a 64 bit boundary.
+	 *  process_offset_table is an array of size "process_count", containing offsets to process objects
+	 *  (each an instance of ia_css_process_t) belonging to this process group.
+	 *  @see process_count in this structure.
+	 *
+	 *  Usually follows this process group structure. */
+	uint16_t processes_offset;
+	/** Offset in bytes, relative to the beginning of this structure, to terminal_offset_table[terminal_count].
+	 *  Must be aligned to a 64 bit boundary.
+	 *  terminal_offset_table is an array of size "terminal_count", containing offsets to terminal objects
+	 *  (each an instance of ia_css_terminal_t or a derivative of it) belonging to this process group.
+	 *  @see terminal_count in this structure.
+	 *
+	 *  Usually follows process_offset_table, aligned to 64-bit boundary. */
+	uint16_t terminals_offset;
+	/** Parameter dependent number of processes in this process group, determined at process
+	 *  group creation taking into account the enabled kernels. That is, if all of a program's
+	 *  associcated kernels are disabled, then no process is instantiated for that program and
+	 *  it must not be counted in the process count.
+	 *
+	 *  @see processes_offset in this structure
+	 *  @see ia_css_program_group_manifest_get_program_count()
+	 *  @see ia_css_program_manifest_get_kernel_bitmap()
+	 *  @see ia_css_process_group_compute_process_count() */
+	uint8_t process_count;
+	/** Parameter dependent number of terminals on this process group, determined at process
+	 *  group creation.  Must not be greater than the terminal count as defined in the manifest,
+	 *  but taking into account the enabled kernels.  That is, for those terminal types that have
+	 *  kernel associations, the terminal is diabled if all of its associated kernels are disabled.
+	 *  Execptions by terminal type:
+	 *  - IA_CSS_TERMINAL_TYPE_PROGRAM - As described above, but parameter descriptors are examined to determine the
+	 *  kernel association, as the terminal type itself does not have an associated kernel field or kernel bitmap field.
+	 *  - IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT -- Always enabled
+	 *  - IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN -- Always enabled, to allow HW disabling configuration to be loaded
+	 *
+	 *  @see terminals_offset in this structure
+	 *  @see ia_css_program_group_manifest_get_terminal_count()
+	 *  @see ia_css_program_manifest_get_kernel_bitmap()
+	 *  @see ia_css_process_group_is_terminal_enabled()
+	 *  @see ia_css_process_group_compute_terminal_count() */
+	uint8_t terminal_count;
+	/** Parameter dependent number of independent subgraphs in
+	 * this process group.
+	 * @note Apparently no longer used.
+	 */
+	uint8_t subgraph_count;
+	/** Process group protocol version.  Identifies the state machine and
+	 *  message protocol for this process group. */
+	uint8_t protocol_version;
+	/** Dedicated base queue id used for enqueueing payload buffer sets.
+	 *  Each buffer set is either a frame (or fragment) processing request,
+	 *  or an opportunistic parameter update (AKA "late binding")
+	 *  This queue is enabled once the process group start command has
+	 *  been issued. */
+	uint8_t base_queue_id;
+	/** Number of dedicated queues used */
+	uint8_t num_queues;
+	/**< Mask the send_pg_done IRQ */
+	uint8_t mask_irq;
+	/** Error handling enable\disable flag */
+	uint8_t error_handling_enable;
+#if N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT > 0
+	uint8_t padding[N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT];
+#endif
+};
+
+/*! Callback after process group is created. Implementations can provide
+ * suitable actions needed when process group is created.
+
+ @param	process_group[in]			process group object
+ @param	program_group_manifest[in]		program group manifest
+ @param	program_group_param[in]			program group parameters
+
+ @return 0 on success and non-zero on failure
+ */
+extern int ia_css_process_group_on_create(
+	ia_css_process_group_t			*process_group,
+	const ia_css_program_group_manifest_t	*program_group_manifest,
+	const ia_css_program_group_param_t	*program_group_param);
+
+/*! Callback before process group is about to be destoyed. Any implementation
+ * specific cleanups can be done here.
+
+ @param	process_group[in]				process group object
+
+ @return 0 on success and non-zero on failure
+ */
+extern int ia_css_process_group_on_destroy(
+	ia_css_process_group_t					*process_group);
+
+/*
+ * Command processor
+ */
+
+/*! Execute a command locally or send it to be processed remotely
+
+ @param	process_group[in]		process group object
+ @param	cmd[in]					command
+
+ @return < 0 on error
+ */
+extern int ia_css_process_group_exec_cmd(
+	ia_css_process_group_t				*process_group,
+	const ia_css_process_group_cmd_t		cmd);
+
+/*! Enqueue a buffer set corresponding to a persistent program group by
+ * sending a command to subsystem.
+
+ @param	process_group[in]		process group object
+ @param	buffer_set[in]			buffer set
+ @param	queue_offset[in]		offset to be used from the queue id
+					specified in the process group object
+					(0 for first buffer set for frame, 1
+					for late binding)
+
+ @return < 0 on error
+ */
+extern int ia_css_enqueue_buffer_set(
+	ia_css_process_group_t				*process_group,
+	ia_css_buffer_set_t				*buffer_set,
+	unsigned int					queue_offset);
+
+/*! Enqueue a parameter buffer set corresponding to a persistent program
+ *  group by sending a command to subsystem.  This allows for
+    opportunistic late parameters update, AKA "late binding".
+
+ @param	process_group[in]		process group object
+ @param	buffer_set[in]			parameter buffer set
+
+ @return < 0 on error
+ */
+extern int ia_css_enqueue_param_buffer_set(
+	ia_css_process_group_t				*process_group,
+	ia_css_buffer_set_t				*buffer_set);
+
+/*! Need to store the 'secure' mode for each PG for FW test app only
+ *
+ * @param	process_group[in]		process group object
+ * @param	secure[in]			parameter buffer set
+ *
+ * @return < 0 on error
+ */
+extern int ia_css_process_group_store(
+	ia_css_process_group_t				*process_group,
+	bool						secure);
+
+/*! Need to get the right context for each PG for FW test app only
+ *
+ * @param	process_group[in]		process group object
+ *
+ * @return	psys_syscom context
+ */
+extern struct ia_css_syscom_context *ia_css_process_group_get_context(
+	ia_css_process_group_t *process_group);
+
+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_CMD_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_impl.h
new file mode 100644
index 000000000000..5e074b71f932
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_impl.h
@@ -0,0 +1,1846 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_IMPL_H
+#define __IA_CSS_PSYS_PROCESS_GROUP_IMPL_H
+
+#include <ia_css_psysapi_fw_version.h>
+#include <ia_css_psys_process_group.h>
+#include "ia_css_psys_process_group_cmd_impl.h"
+#include <ia_css_psys_terminal.h>
+#include <ia_css_psys_transport.h>
+#include <ia_css_psys_process.h>
+#include <ia_css_psys_terminal_manifest.h>
+#include <ia_css_psys_program_manifest.h>
+#include <ia_css_psys_program_group_manifest.h>
+#include "ia_css_terminal_manifest_types.h"
+
+#include "ia_css_rbm.h"
+
+#include <ia_css_kernel_bitmap.h>	/* ia_css_kernel_bitmap_t */
+
+#include <vied_nci_psys_system_global.h>
+#include <ia_css_program_group_data.h>
+#include "ia_css_rbm_manifest_types.h"
+#include <type_support.h>
+#include <error_support.h>
+#include <misc_support.h>
+#include <math_support.h>
+
+#include "ia_css_psys_dynamic_trace.h"
+#include "ia_css_terminal_manifest.h"
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_process_group_is_data_terminal_enabled(
+	const ia_css_data_terminal_manifest_t	*data_term_manifest,
+	ia_css_kernel_bitmap_t enable_bitmap)
+{
+	bool is_terminal_enabled = false;
+
+	ia_css_kernel_bitmap_t term_bitmap =
+		ia_css_data_terminal_manifest_get_kernel_bitmap(
+				data_term_manifest);
+	/*
+	 * Terminals depend on a kernel,
+	 * if the kernel is present the program it contains and
+	 * the terminal the program depends on are active
+	 */
+	is_terminal_enabled  = !ia_css_is_kernel_bitmap_intersection_empty(
+			enable_bitmap,
+			term_bitmap);
+	return is_terminal_enabled;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_process_group_is_spatial_terminal_enabled(
+	const ia_css_spatial_param_terminal_manifest_t *spatial_term_man,
+	ia_css_kernel_bitmap_t enable_bitmap)
+{
+	bool is_terminal_enabled = false;
+	ia_css_kernel_bitmap_t term_kernel_bitmap = ia_css_kernel_bitmap_clear();
+
+	term_kernel_bitmap =
+		ia_css_kernel_bitmap_set(
+			term_kernel_bitmap,
+			spatial_term_man->kernel_id);
+	is_terminal_enabled = !ia_css_is_kernel_bitmap_intersection_empty(
+			enable_bitmap, term_kernel_bitmap);
+	return is_terminal_enabled;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_process_group_is_terminal_enabled(
+	const ia_css_terminal_manifest_t *terminal_manifest,
+	ia_css_kernel_bitmap_t enable_bitmap)
+{
+	ia_css_terminal_type_t terminal_type;
+	bool is_terminal_enabled = false;
+
+	verifjmpexit(NULL != terminal_manifest);
+	terminal_type = ia_css_terminal_manifest_get_type(terminal_manifest);
+
+	if (ia_css_is_terminal_manifest_data_terminal(terminal_manifest)) {
+		ia_css_data_terminal_manifest_t	*data_term_manifest =
+						(ia_css_data_terminal_manifest_t *)terminal_manifest;
+		is_terminal_enabled =
+				ia_css_process_group_is_data_terminal_enabled(data_term_manifest, enable_bitmap);
+	} else if (ia_css_is_terminal_manifest_spatial_parameter_terminal(
+				terminal_manifest)) {
+		ia_css_spatial_param_terminal_manifest_t *spatial_term_man =
+			(ia_css_spatial_param_terminal_manifest_t *)
+			terminal_manifest;
+		 is_terminal_enabled = ia_css_process_group_is_spatial_terminal_enabled(spatial_term_man,
+			enable_bitmap);
+	} else if (ia_css_is_terminal_manifest_parameter_terminal(
+			terminal_manifest) && terminal_type ==
+			IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN) {
+		/*
+		 * For parameter out and program control terminals, we
+		 * disable the terminals if ALL the corresponding kernels
+		 * are disabled, for parameter in terminals we cannot do this;
+		 * even if kernels are disabled, it may be required that
+		 * (HW) parameters must be supplied via the parameter
+		 * in terminal (e.g. bypass bits).
+		 */
+		is_terminal_enabled = true;
+
+	} else if (ia_css_is_terminal_manifest_parameter_terminal(
+			terminal_manifest) && terminal_type ==
+			IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) {
+		ia_css_kernel_bitmap_t term_kernel_bitmap = ia_css_kernel_bitmap_clear();
+		ia_css_param_terminal_manifest_t *param_term_man =
+			(ia_css_param_terminal_manifest_t *)terminal_manifest;
+		ia_css_param_manifest_section_desc_t *section_desc;
+		unsigned int section = 0;
+		uint8_t kernel_id;
+
+		for (section = 0; section < param_term_man->
+				param_manifest_section_desc_count; section++) {
+			section_desc =
+		ia_css_param_terminal_manifest_get_prm_sct_desc(
+						param_term_man, section);
+			verifjmpexit(section_desc != NULL);
+			kernel_id = ia_css_param_manifest_section_desc_get_kernel_id(section_desc);
+			term_kernel_bitmap = ia_css_kernel_bitmap_set(
+					term_kernel_bitmap,
+					kernel_id);
+		}
+
+		is_terminal_enabled = !ia_css_is_kernel_bitmap_intersection_empty(
+					enable_bitmap, term_kernel_bitmap);
+	} else if (ia_css_is_terminal_manifest_program_terminal(
+				terminal_manifest)) {
+		ia_css_kernel_bitmap_t term_kernel_bitmap = ia_css_kernel_bitmap_clear();
+		ia_css_program_terminal_manifest_t *prog_term_man =
+			(ia_css_program_terminal_manifest_t *)terminal_manifest;
+		unsigned int section = 0;
+
+		for (section = 0;
+			section < prog_term_man->fragment_param_manifest_section_desc_count;
+			section++) {
+			ia_css_fragment_param_manifest_section_desc_t *desc =
+				ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
+					prog_term_man,
+					section);
+			verifjmpexit(desc != NULL);
+
+			term_kernel_bitmap = ia_css_kernel_bitmap_set(
+					term_kernel_bitmap,
+					ia_css_fragment_param_manifest_section_desc_get_kernel_id(desc));
+		}
+
+		is_terminal_enabled = !ia_css_is_kernel_bitmap_intersection_empty(
+					enable_bitmap, term_kernel_bitmap);
+	} else if (ia_css_is_terminal_manifest_program_control_init_terminal(
+				terminal_manifest)) {
+		is_terminal_enabled = true;
+	}
+	return is_terminal_enabled;
+EXIT:
+	return false;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint16_t ia_css_process_group_get_fragment_limit(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	uint16_t fragment_limit = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_fragment_limit(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	fragment_limit = process_group->fragment_limit;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_fragment_limit invalid argument\n");
+	}
+	return fragment_limit;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_set_fragment_limit(
+	ia_css_process_group_t *process_group,
+	const uint16_t fragment_limit)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+	uint16_t fragment_state;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_set_fragment_limit(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	retval = ia_css_process_group_get_fragment_state(process_group,
+		&fragment_state);
+
+	verifexitval(retval == 0, EINVAL);
+	verifexitval(fragment_limit > fragment_state, EINVAL);
+	verifexitval(fragment_limit <= ia_css_process_group_get_fragment_count(
+				process_group), EINVAL);
+
+	process_group->fragment_limit = fragment_limit;
+
+	retval = 0;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_fragment_limit invalid argument process_group\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_fragment_limit failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_clear_fragment_limit(
+	ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_clear_fragment_limit(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+	process_group->fragment_limit = 0;
+
+	retval = 0;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_clear_fragment_limit invalid argument process_group\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_clear_fragment_limit failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_attach_buffer(
+	ia_css_process_group_t *process_group,
+	vied_vaddress_t buffer,
+	const ia_css_buffer_state_t buffer_state,
+	const unsigned int terminal_index)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+	ia_css_terminal_t *terminal = NULL;
+
+	NOT_USED(buffer_state);
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_group_attach_buffer(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	terminal = ia_css_process_group_get_terminal(
+				process_group, terminal_index);
+
+	verifexitval(terminal != NULL, EINVAL);
+	verifexitval(ia_css_process_group_get_state(process_group) ==
+		IA_CSS_PROCESS_GROUP_READY, EINVAL);
+	verifexitval(process_group->protocol_version ==
+		IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY ||
+		process_group->protocol_version ==
+		IA_CSS_PROCESS_GROUP_PROTOCOL_PPG, EINVAL);
+
+	if (process_group->protocol_version ==
+		IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY) {
+		/*
+		 * Legacy flow:
+		 * Terminal address is part of the process group structure
+		 */
+		retval = ia_css_terminal_set_buffer(
+			terminal, buffer);
+	} else if (process_group->protocol_version ==
+		IA_CSS_PROCESS_GROUP_PROTOCOL_PPG) {
+		/*
+		 * PPG flow:
+		 * Terminal address is part of external buffer set structure
+		 */
+		retval = ia_css_terminal_set_terminal_index(
+			terminal, terminal_index);
+	}
+	verifexitval(retval == 0, EFAULT);
+
+	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
+		"\tTerminal 0x%lx has buffer 0x%x\n", (unsigned long int)terminal, buffer);
+
+	if (ia_css_is_terminal_data_terminal(terminal) == true) {
+		ia_css_frame_t *frame =
+			ia_css_data_terminal_get_frame(
+				(ia_css_data_terminal_t *)terminal);
+		verifexitval(frame != NULL, EINVAL);
+
+		retval = ia_css_frame_set_buffer_state(frame, buffer_state);
+		verifexitval(retval == 0, EINVAL);
+	}
+
+	retval = 0;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_attach_buffer invalid argument process_group\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_attach_buffer failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_vaddress_t ia_css_process_group_detach_buffer(
+	ia_css_process_group_t *process_group,
+	const unsigned int terminal_index)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+	vied_vaddress_t buffer = VIED_NULL;
+
+	ia_css_terminal_t *terminal = NULL;
+	ia_css_process_group_state_t state;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_group_detach_buffer(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	terminal =
+		ia_css_process_group_get_terminal(
+				process_group, terminal_index);
+	state = ia_css_process_group_get_state(process_group);
+
+	verifexitval(terminal != NULL, EINVAL);
+	verifexitval(state == IA_CSS_PROCESS_GROUP_READY, EINVAL);
+
+	buffer = ia_css_terminal_get_buffer(terminal);
+
+	if (ia_css_is_terminal_data_terminal(terminal) == true) {
+		ia_css_frame_t *frame =
+			ia_css_data_terminal_get_frame(
+					(ia_css_data_terminal_t *)terminal);
+		verifexitval(frame != NULL, EINVAL);
+
+		retval = ia_css_frame_set_buffer_state(frame, IA_CSS_BUFFER_NULL);
+		verifexitval(retval == 0, EINVAL);
+	}
+	ia_css_terminal_set_buffer(terminal, VIED_NULL);
+
+	retval = 0;
+EXIT:
+	/*
+	 * buffer pointer will appear on output,
+	 * regardless of subsequent fails to avoid memory leaks
+	 */
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_detach_buffer invalid argument process_group\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_detach_buffer failed (%i)\n",
+			retval);
+	}
+	return buffer;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_attach_stream(
+	ia_css_process_group_t *process_group,
+	uint32_t stream,
+	const ia_css_buffer_state_t buffer_state,
+	const unsigned int terminal_index)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_group_attach_stream(): enter:\n");
+
+	NOT_USED(process_group);
+	NOT_USED(stream);
+	NOT_USED(buffer_state);
+	NOT_USED(terminal_index);
+
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_attach_stream failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_process_group_detach_stream(
+	ia_css_process_group_t *process_group,
+	const unsigned int terminal_index)
+{
+	int retval = -1;
+	uint32_t stream = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_group_detach_stream(): enter:\n");
+
+	NOT_USED(process_group);
+	NOT_USED(terminal_index);
+
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_detach_stream failed (%i)\n",
+			retval);
+	}
+	return stream;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_set_barrier(
+	ia_css_process_group_t *process_group,
+	const vied_nci_barrier_ID_t barrier_index)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+	vied_nci_resource_bitmap_t bit_mask;
+	vied_nci_resource_bitmap_t resource_bitmap;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_set_barrier(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	resource_bitmap =
+		ia_css_process_group_get_resource_bitmap(process_group);
+
+	bit_mask = vied_nci_barrier_bit_mask(barrier_index);
+
+	verifexitval(bit_mask != 0, EINVAL);
+	verifexitval(vied_nci_is_bitmap_clear(bit_mask, resource_bitmap), EINVAL);
+
+	resource_bitmap = vied_nci_bitmap_set(resource_bitmap, bit_mask);
+
+	retval =
+		ia_css_process_group_set_resource_bitmap(
+			process_group, resource_bitmap);
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_set_barrier invalid argument process_group\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_set_barrier failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_clear_barrier(
+	ia_css_process_group_t *process_group,
+	const vied_nci_barrier_ID_t barrier_index)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+	vied_nci_resource_bitmap_t bit_mask, resource_bitmap;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_clear_barrier(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	resource_bitmap =
+		ia_css_process_group_get_resource_bitmap(process_group);
+
+	bit_mask = vied_nci_barrier_bit_mask(barrier_index);
+
+	verifexitval(bit_mask != 0, EINVAL);
+	verifexitval(vied_nci_is_bitmap_set(bit_mask, resource_bitmap), EINVAL);
+
+	resource_bitmap = vied_nci_bitmap_clear(resource_bitmap, bit_mask);
+
+	retval =
+		ia_css_process_group_set_resource_bitmap(
+				process_group, resource_bitmap);
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_clear_barrier invalid argument process_group\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_clear_barrier failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_print(
+	const ia_css_process_group_t *process_group,
+	void *fid)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+	int i;
+
+	uint8_t	process_count;
+	uint8_t terminal_count;
+	vied_vaddress_t ipu_vaddress = VIED_NULL;
+	ia_css_rbm_t routing_bitmap;
+
+	NOT_USED(fid);
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_print(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+	retval = ia_css_process_group_get_ipu_vaddress(process_group, &ipu_vaddress);
+	verifexitval(retval == 0, EINVAL);
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"=============== Process group print start ===============\n");
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+		"\tprocess_group cpu address = 0x%lx\n", (unsigned long int)process_group);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+		"\tipu_virtual_address = %x\n", ipu_vaddress);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+		"\tsizeof(process_group) = %d\n",
+		(int)ia_css_process_group_get_size(process_group));
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+		"\tfragment_count = %d\n",
+		(int)ia_css_process_group_get_fragment_count(process_group));
+
+	routing_bitmap = *ia_css_process_group_get_routing_bitmap(process_group);
+	for (i = 0; i < (int)IA_CSS_RBM_NOF_ELEMS; i++) {
+		IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
+			"\trouting_bitmap[index = %d] = 0x%X\n",
+			i, (int)routing_bitmap.data[i]);
+	}
+
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+		"\tprogram_group(process_group) = %d\n",
+		(int)ia_css_process_group_get_program_group_ID(process_group));
+	process_count = ia_css_process_group_get_process_count(process_group);
+	terminal_count =
+		ia_css_process_group_get_terminal_count(process_group);
+
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+		"\t%d processes\n", (int)process_count);
+	for (i = 0; i < (int)process_count; i++) {
+		ia_css_process_t *process =
+			ia_css_process_group_get_process(process_group, i);
+
+		retval = ia_css_process_print(process, fid);
+		verifjmpexit(retval == 0);
+	}
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+		"\t%d terminals\n", (int)terminal_count);
+	for (i = 0; i < (int)terminal_count; i++) {
+		ia_css_terminal_t *terminal =
+			ia_css_process_group_get_terminal(process_group, i);
+
+		retval = ia_css_terminal_print(terminal, fid);
+		verifjmpexit(retval == 0);
+	}
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+		"\terror_handling_enable = %u\n", process_group->error_handling_enable);
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"=============== Process group print end ===============\n");
+	retval = 0;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_print invalid argument\n");
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_is_process_group_valid(
+	const ia_css_process_group_t *process_group,
+	const ia_css_program_group_manifest_t *pg_manifest,
+	const ia_css_program_group_param_t *param)
+{
+	DECLARE_ERRVAL
+	bool invalid_flag = false;
+	uint8_t proc_idx;
+	uint8_t proc_term_idx;
+	uint8_t	process_count;
+	uint8_t	program_count;
+	uint8_t terminal_count;
+	uint8_t man_terminal_count;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_is_process_group_valid(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+	verifexitval(pg_manifest != NULL, EFAULT);
+	NOT_USED(param);
+
+	process_count = process_group->process_count;
+	terminal_count = process_group->terminal_count;
+	program_count = ia_css_program_group_manifest_get_program_count(pg_manifest);
+	man_terminal_count = ia_css_program_group_manifest_get_terminal_count(pg_manifest);
+
+	/* Validate process group */
+	invalid_flag = invalid_flag ||
+		!(program_count >= process_count) ||
+		!(man_terminal_count >= terminal_count) ||
+		!(process_group->size > process_group->processes_offset) ||
+		!(process_group->size > process_group->terminals_offset);
+
+	/* Validate processes */
+	for (proc_idx = 0; proc_idx < process_count; proc_idx++) {
+		const ia_css_process_t *process;
+		ia_css_program_manifest_t *p_manifest = NULL;
+		ia_css_program_ID_t prog_id;
+		bool no_match_found = true;
+
+		process = ia_css_process_group_get_process(process_group, proc_idx);
+		verifexitval(NULL != process, EFAULT);
+		prog_id = ia_css_process_get_program_ID(process);
+		p_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest,
+									   ia_css_process_get_program_idx(process));
+		verifexitval(NULL != p_manifest, EFAULT);
+
+		if (prog_id == ia_css_program_manifest_get_program_ID(p_manifest)) {
+			invalid_flag = invalid_flag || !ia_css_is_process_valid(process, p_manifest);
+			no_match_found = false;
+		}
+
+		invalid_flag = invalid_flag || no_match_found;
+	}
+
+	/* Validate terminals */
+	for (proc_term_idx = 0; proc_term_idx < terminal_count; proc_term_idx++) {
+		int man_term_idx;
+		const ia_css_terminal_t *terminal;
+		const ia_css_terminal_manifest_t *terminal_manifest;
+
+		terminal = ia_css_process_group_get_terminal(process_group, proc_term_idx);
+		verifexitval(NULL != terminal, EFAULT);
+		man_term_idx = ia_css_terminal_get_terminal_manifest_index(terminal);
+		terminal_manifest = ia_css_program_group_manifest_get_term_mnfst(pg_manifest, man_term_idx);
+
+		invalid_flag = invalid_flag || !ia_css_is_terminal_valid(terminal, terminal_manifest);
+	}
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_is_process_group_valid() invalid argument\n");
+		return false;
+	} else {
+		return (!invalid_flag);
+	}
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_can_process_group_submit(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	int i;
+	bool can_submit = false;
+	int retval = -1;
+	uint8_t	terminal_count =
+		ia_css_process_group_get_terminal_count(process_group);
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_can_process_group_submit(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	for (i = 0; i < (int)terminal_count; i++) {
+		ia_css_terminal_t *terminal =
+			ia_css_process_group_get_terminal(process_group, i);
+		vied_vaddress_t buffer;
+		ia_css_buffer_state_t buffer_state;
+
+		verifexitval(terminal != NULL, EINVAL);
+
+		if (process_group->protocol_version ==
+			IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY) {
+			/*
+			 * For legacy pg flow, buffer addresses are contained inside
+			 * the process group structure, so these need to be validated
+			 * on process group submission.
+			 */
+			buffer = ia_css_terminal_get_buffer(terminal);
+			IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
+				"\tH: Terminal number(%d) is 0x%lx having buffer 0x%x\n",
+				i, (unsigned long int)terminal, buffer);
+		}
+
+		/* buffer_state is applicable only for data terminals*/
+		if (ia_css_is_terminal_data_terminal(terminal) == true) {
+			ia_css_frame_t *frame =
+				ia_css_data_terminal_get_frame(
+					(ia_css_data_terminal_t *)terminal);
+
+			verifexitval(frame != NULL, EINVAL);
+			buffer_state = ia_css_frame_get_buffer_state(frame);
+			if ((buffer_state == IA_CSS_BUFFER_NULL) ||
+				(buffer_state == IA_CSS_N_BUFFER_STATES)) {
+				break;
+			}
+		} else if (
+			(ia_css_is_terminal_parameter_terminal(terminal)
+				!= true) &&
+			(ia_css_is_terminal_program_terminal(terminal)
+				!= true) &&
+			(ia_css_is_terminal_program_control_init_terminal(terminal)
+				!= true) &&
+			(ia_css_is_terminal_spatial_parameter_terminal(
+				terminal) != true)) {
+			/* neither data nor parameter terminal, so error.*/
+			break;
+		}
+
+	}
+	/* Only true if no check failed */
+	can_submit = (i == terminal_count);
+
+	retval = 0;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_can_process_group_submit invalid argument process_group\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_can_process_group_submit failed (%i)\n",
+			retval);
+	}
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_can_process_group_submit(): leave:\n");
+	return can_submit;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_can_enqueue_buffer_set(
+	const ia_css_process_group_t *process_group,
+	const ia_css_buffer_set_t *buffer_set)
+{
+	DECLARE_ERRVAL
+	int i;
+	bool can_enqueue = false;
+	int retval = -1;
+	uint8_t	terminal_count;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_can_enqueue_buffer_set(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+	verifexitval(buffer_set != NULL, EFAULT);
+
+	terminal_count =
+		ia_css_process_group_get_terminal_count(process_group);
+
+	/*
+	 * For ppg flow, buffer addresses are contained in the
+	 * external buffer set structure, so these need to be
+	 * validated before enqueueing.
+	 */
+	verifexitval(process_group->protocol_version ==
+		IA_CSS_PROCESS_GROUP_PROTOCOL_PPG, EFAULT);
+
+	for (i = 0; i < (int)terminal_count; i++) {
+		ia_css_terminal_t *terminal =
+			ia_css_process_group_get_terminal(process_group, i);
+		vied_vaddress_t buffer;
+		ia_css_buffer_state_t buffer_state;
+
+		verifexitval(terminal != NULL, EINVAL);
+
+		buffer = ia_css_buffer_set_get_buffer(buffer_set, terminal);
+		IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
+			"\tH: Terminal number(%d) is 0x%lx having buffer 0x%x\n",
+			i, (unsigned long int)terminal, buffer);
+
+		/* buffer_state is applicable only for data terminals*/
+		if (ia_css_is_terminal_data_terminal(terminal) == true) {
+			ia_css_frame_t *frame =
+				ia_css_data_terminal_get_frame(
+					(ia_css_data_terminal_t *)terminal);
+
+			verifexitval(frame != NULL, EINVAL);
+			buffer_state = ia_css_frame_get_buffer_state(frame);
+			if ((buffer_state == IA_CSS_BUFFER_NULL) ||
+				(buffer_state == IA_CSS_N_BUFFER_STATES)) {
+				break;
+			}
+		} else if (
+			(ia_css_is_terminal_parameter_terminal(terminal)
+				!= true) &&
+			(ia_css_is_terminal_program_terminal(terminal)
+				!= true) &&
+			(ia_css_is_terminal_program_control_init_terminal(terminal)
+				!= true) &&
+			(ia_css_is_terminal_spatial_parameter_terminal(
+				terminal) != true)) {
+			/* neither data nor parameter terminal, so error.*/
+			break;
+		}
+	}
+	/* Only true if no check failed */
+	can_enqueue = (i == terminal_count);
+
+	retval = 0;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_can_enqueue_buffer_set invalid argument\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_can_enqueue_buffer_set failed (%i)\n",
+			retval);
+	}
+	return can_enqueue;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_can_process_group_start(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	int i;
+	bool can_start = false;
+	int retval = -1;
+	uint8_t	terminal_count;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_can_process_group_start(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	terminal_count =
+		ia_css_process_group_get_terminal_count(process_group);
+	for (i = 0; i < (int)terminal_count; i++) {
+		ia_css_terminal_t *terminal =
+			ia_css_process_group_get_terminal(process_group, i);
+		ia_css_buffer_state_t buffer_state;
+		bool ok = false;
+
+		verifexitval(terminal != NULL, EINVAL);
+		if (ia_css_is_terminal_data_terminal(terminal) == true) {
+			/*
+			 * buffer_state is applicable only for data terminals
+			 */
+			ia_css_frame_t *frame =
+				ia_css_data_terminal_get_frame(
+					(ia_css_data_terminal_t *)terminal);
+			bool is_input = ia_css_is_terminal_input(terminal);
+			/*
+			 * check for NULL here.
+			 * then invoke next 2 statements
+			 */
+			verifexitval(frame != NULL, EINVAL);
+			IA_CSS_TRACE_5(PSYSAPI_DYNAMIC, VERBOSE,
+				"\tTerminal %d: buffer_state %u, access_type %u, data_bytes %u, data %u\n",
+				i, frame->buffer_state, frame->access_type,
+				frame->data_bytes, frame->data);
+			buffer_state = ia_css_frame_get_buffer_state(frame);
+
+			ok = ((is_input &&
+				(buffer_state == IA_CSS_BUFFER_FULL)) ||
+					(!is_input && (buffer_state ==
+							IA_CSS_BUFFER_EMPTY)));
+
+		} else if (ia_css_is_terminal_parameter_terminal(terminal) ==
+				true) {
+			/*
+			 * FIXME:
+			 * is there any pre-requisite for param_terminal?
+			 */
+			ok = true;
+		} else if (ia_css_is_terminal_program_terminal(terminal) ==
+				true) {
+			ok = true;
+		} else if (ia_css_is_terminal_program_control_init_terminal(terminal) ==
+				true) {
+			ok = true;
+		} else if (ia_css_is_terminal_spatial_parameter_terminal(
+					terminal) == true) {
+			ok = true;
+		} else {
+			/* neither data nor parameter terminal, so error.*/
+			break;
+		}
+
+		if (!ok)
+			break;
+	}
+	/* Only true if no check failed */
+	can_start = (i == terminal_count);
+
+	retval = 0;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_can_process_group_submit invalid argument process_group\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_can_process_group_start failed (%i)\n",
+			retval);
+	}
+	return can_start;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+size_t ia_css_process_group_get_size(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	size_t size = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_size(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	size = process_group->size;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_size invalid argument\n");
+	}
+	return size;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_process_group_state_t ia_css_process_group_get_state(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	ia_css_process_group_state_t state = IA_CSS_N_PROCESS_GROUP_STATES;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_state(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	state = process_group->state;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_state invalid argument\n");
+	}
+	return state;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_process_group_get_kernel_bitmap(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	ia_css_kernel_bitmap_t bitmap = ia_css_kernel_bitmap_clear();
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		       "ia_css_process_group_get_kernel_bitmap(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	bitmap = process_group->kernel_bitmap;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+		 "ia_css_process_group_get_kernel_bitmap invalid argument process\n");
+	}
+	return bitmap;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+const ia_css_rbm_t *ia_css_process_group_get_routing_bitmap(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	const ia_css_rbm_t *rbm = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_routing_bitmap(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	rbm = &(process_group->routing_bitmap);
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_routing_bitmap invalid argument\n");
+	}
+	return rbm;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint16_t ia_css_process_group_get_fragment_count(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	uint16_t fragment_count = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_fragment_count(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	fragment_count = process_group->fragment_count;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_fragment_count invalid argument\n");
+	}
+	return fragment_count;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_process_group_get_process_count(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	uint8_t process_count = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_process_count(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	process_count = process_group->process_count;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_process_count invalid argument\n");
+	}
+	return process_count;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_process_group_get_terminal_count(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	uint8_t terminal_count = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_terminal_count(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	terminal_count = process_group->terminal_count;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_terminal_count invalid argument\n");
+	}
+	return terminal_count;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_process_group_get_psys_server_init_cycles(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	uint32_t psys_server_init_cycles = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"uint32_t ia_css_process_group_get_psys_server_init_cycles(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	psys_server_init_cycles = process_group->psys_server_init_cycles;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"uint32_t ia_css_process_group_get_psys_server_init_cycles invalid argument\n");
+	}
+	return psys_server_init_cycles;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_process_group_get_pg_load_start_ts(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	uint32_t pg_load_start_ts = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_pg_load_start_ts(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	pg_load_start_ts = process_group->pg_load_start_ts;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_pg_load_start_ts invalid argument\n");
+	}
+	return pg_load_start_ts;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_process_group_get_pg_load_cycles(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	uint32_t pg_load_cycles = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_pg_load_cycles(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	pg_load_cycles = process_group->pg_load_cycles;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_pg_load_cycles invalid argument\n");
+	}
+	return pg_load_cycles;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_process_group_get_pg_init_cycles(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	uint32_t pg_init_cycles = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_pg_init_cycles(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	pg_init_cycles = process_group->pg_init_cycles;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_pg_init_cycles invalid argument\n");
+	}
+	return pg_init_cycles;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_process_group_get_pg_processing_cycles(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	uint32_t pg_processing_cycles = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_pg_processing_cycles(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	pg_processing_cycles = process_group->pg_processing_cycles;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_pg_processing_cycles invalid argument\n");
+	}
+	return pg_processing_cycles;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_process_group_get_pg_next_frame_init_cycles(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	uint32_t pg_next_frame_init_cycles = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_pg_next_frame_init_cycles(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	pg_next_frame_init_cycles = process_group->pg_next_frame_init_cycles;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_pg_next_frame_init_cycles invalid argument\n");
+	}
+	return pg_next_frame_init_cycles;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_process_group_get_pg_complete_cycles(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	uint32_t pg_complete_cycles = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_pg_complete_cycles(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	pg_complete_cycles = process_group->pg_complete_cycles;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_pg_complete_cycles invalid argument\n");
+	}
+	return pg_complete_cycles;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_terminal_t *ia_css_process_group_get_terminal_from_type(
+		const ia_css_process_group_t *process_group,
+		const ia_css_terminal_type_t terminal_type)
+{
+	unsigned int proc_cnt;
+	ia_css_terminal_t *terminal = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+			"ia_css_process_group_get_terminal_from_type(): enter:\n");
+
+	for (proc_cnt = 0; proc_cnt < (unsigned int)ia_css_process_group_get_terminal_count(process_group); proc_cnt++) {
+		terminal = ia_css_process_group_get_terminal(process_group, proc_cnt);
+		if (terminal == NULL) {
+			IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+					"ia_css_process_group_get_terminal_from_type() Failed to get terminal %d", proc_cnt);
+			goto EXIT;
+		}
+		if (ia_css_terminal_get_type(terminal) == terminal_type) {
+			return terminal;
+		}
+		terminal = NULL; /* If not the expected type, return NULL */
+	}
+EXIT:
+	return terminal;
+}
+
+/* Returns the terminal or NULL if it was not found
+   For some of those maybe valid to not exist at all in the process group */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+const ia_css_terminal_t *ia_css_process_group_get_single_instance_terminal(
+	const ia_css_process_group_t 	*process_group,
+	ia_css_terminal_type_t		term_type)
+{
+	int i, term_count;
+
+	assert(process_group != NULL);
+
+	/* Those below have at most one instance per process group */
+	assert(term_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
+		term_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT ||
+		term_type == IA_CSS_TERMINAL_TYPE_PROGRAM ||
+		term_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT);
+
+	term_count = ia_css_process_group_get_terminal_count(process_group);
+
+	for (i = 0; i < term_count; i++) {
+		const ia_css_terminal_t	*terminal = ia_css_process_group_get_terminal(process_group, i);
+
+		if (ia_css_terminal_get_type(terminal) == term_type) {
+			/* Only one parameter terminal per process group */
+			return terminal;
+		}
+	}
+
+	return NULL;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_terminal_t *ia_css_process_group_get_manifest_idx_terminal(
+	const ia_css_process_group_t *process_grp,
+	const unsigned int manifest_idx)
+{
+	DECLARE_ERRVAL
+	uint8_t i = 0;
+	uint8_t terminal_count;
+
+	terminal_count =
+		ia_css_process_group_get_terminal_count(process_grp);
+
+	for ( i = 0; i < terminal_count;
+			i++) {
+		unsigned int man_term_idx;
+		ia_css_terminal_t *terminal;
+
+		terminal =
+			ia_css_process_group_get_terminal(
+					process_grp, i);
+		verifexitval(NULL != terminal, EFAULT);
+		man_term_idx =
+			ia_css_terminal_get_terminal_manifest_index(terminal);
+		if (man_term_idx == manifest_idx)
+			return terminal;
+	}
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_manifest_idx_terminal Error\n");
+	}
+	return NULL;
+
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_terminal_t *ia_css_process_group_get_terminal(
+	const ia_css_process_group_t *process_grp,
+	const unsigned int terminal_num)
+{
+	DECLARE_ERRVAL
+	ia_css_terminal_t *terminal_ptr = NULL;
+	uint16_t *terminal_offset_table;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_terminal(): enter:\n");
+
+	verifexitval(process_grp != NULL, EFAULT);
+	verifexitval(terminal_num < process_grp->terminal_count, EINVAL);
+
+	terminal_offset_table =
+		(uint16_t *)((char *)process_grp +
+				process_grp->terminals_offset);
+	terminal_ptr =
+		(ia_css_terminal_t *)((char *)process_grp +
+				terminal_offset_table[terminal_num]);
+
+	verifexitval(terminal_ptr != NULL, EFAULT);
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_terminal invalid argument\n");
+	}
+	return terminal_ptr;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_process_t *ia_css_process_group_get_process(
+	const ia_css_process_group_t *process_grp,
+	const unsigned int process_num)
+{
+	DECLARE_ERRVAL
+	ia_css_process_t *process_ptr = NULL;
+	uint16_t *process_offset_table;
+
+	verifexitval(process_grp != NULL, EFAULT);
+	verifexitval(process_num < process_grp->process_count, EINVAL);
+
+	process_offset_table =
+		(uint16_t *)((char *)process_grp +
+				process_grp->processes_offset);
+	process_ptr =
+		(ia_css_process_t *)((char *)process_grp +
+				process_offset_table[process_num]);
+
+	verifexitval(process_ptr != NULL, EFAULT);
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_process invalid argument\n");
+	}
+	return process_ptr;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_program_group_ID_t ia_css_process_group_get_program_group_ID(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	ia_css_program_group_ID_t id = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_program_group_ID(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	id = process_group->ID;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_program_group_ID invalid argument\n");
+	}
+	return id;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t ia_css_process_group_get_resource_bitmap(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	vied_nci_resource_bitmap_t resource_bitmap = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_resource_bitmap(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	resource_bitmap = process_group->resource_bitmap;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_resource_bitmap invalid argument\n");
+	}
+	return resource_bitmap;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_set_resource_bitmap(
+	ia_css_process_group_t *process_group,
+	const vied_nci_resource_bitmap_t resource_bitmap)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_set_resource_bitmap(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	process_group->resource_bitmap = resource_bitmap;
+
+	retval = 0;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_set_resource_bitmap invalid argument process_group\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_set_resource_bitmap failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_set_routing_bitmap(
+	ia_css_process_group_t *process_group,
+	const ia_css_rbm_t rbm)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_set_routing_bitmap(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+	process_group->routing_bitmap = rbm;
+	retval = 0;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_set_routing_bitmap invalid argument process_group\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_set_routing_bitmap failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_process_group_compute_cycle_count(
+	const ia_css_program_group_manifest_t *manifest,
+	const ia_css_program_group_param_t *param)
+{
+	DECLARE_ERRVAL
+	uint32_t cycle_count = 0;
+
+	NOT_USED(manifest);
+	NOT_USED(param);
+
+	verifexitval(manifest != NULL, EFAULT);
+	verifexitval(param != NULL, EFAULT);
+
+	cycle_count = 1;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_compute_cycle_count invalid argument\n");
+	}
+	return cycle_count;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_set_fragment_state(
+	ia_css_process_group_t *process_group,
+	uint16_t fragment_state)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_group_set_fragment_state(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+	verifexitval(fragment_state <= ia_css_process_group_get_fragment_count(
+				process_group), EINVAL);
+
+	process_group->fragment_state = fragment_state;
+	retval = 0;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_set_fragment_state invalid argument process_group\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_set_fragment_state failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_get_fragment_state(
+	const ia_css_process_group_t *process_group,
+	uint16_t *fragment_state)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_fragment_state(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+	verifexitval(fragment_state != NULL, EFAULT);
+
+	*fragment_state = process_group->fragment_state;
+	retval = 0;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_fragment_state invalid argument\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_fragment_state failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_get_ipu_vaddress(
+	const ia_css_process_group_t *process_group,
+	vied_vaddress_t *ipu_vaddress)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_ipu_vaddress(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+	verifexitval(ipu_vaddress != NULL, EFAULT);
+
+	*ipu_vaddress = process_group->ipu_virtual_address;
+	retval = 0;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_ipu_vaddress invalid argument\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_ipu_vaddress failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_set_ipu_vaddress(
+	ia_css_process_group_t *process_group,
+	vied_vaddress_t ipu_vaddress)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_set_ipu_vaddress(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	process_group->ipu_virtual_address = ipu_vaddress;
+	retval = 0;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_set_ipu_vaddress invalid argument\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_set_ipu_vaddress failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_process_group_get_protocol_version(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	uint8_t protocol_version = IA_CSS_PROCESS_GROUP_N_PROTOCOLS;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_protocol_version(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	protocol_version = process_group->protocol_version;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_protocol_version invalid argument\n");
+	}
+	return protocol_version;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_process_group_get_base_queue_id(
+	ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	uint8_t queue_id = IA_CSS_N_PSYS_CMD_QUEUE_ID;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_base_queue_id(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	queue_id = process_group->base_queue_id;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_base_queue_id invalid argument\n");
+	}
+	return queue_id;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_set_base_queue_id(
+	ia_css_process_group_t *process_group,
+	uint8_t queue_id)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_set_base_queue_id(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	/* Make sure that Driver\host don't use the main command queue or device queue for the ppg queues*/
+	if ((queue_id > IA_CSS_PSYS_CMD_QUEUE_DEVICE_ID) && ((queue_id + process_group->num_queues - 1) < IA_CSS_N_PSYS_CMD_QUEUE_ID)) {
+		process_group->base_queue_id = queue_id;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_set_base_queue_id: queue_id %u out of range for process_group 0x%lx\n",
+					   queue_id, (unsigned long int)process_group);
+	}
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_set_base_queue_id invalid argument\n");
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_process_group_get_num_queues(
+	ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	uint8_t num_queues = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_num_queues(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	num_queues = process_group->num_queues;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_num_queues invalid argument\n");
+	}
+	return num_queues;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_group_set_num_queues(
+	ia_css_process_group_t *process_group,
+	uint8_t num_queues)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_set_num_queues(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	process_group->num_queues = num_queues;
+	retval = 0;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_set_num_queues invalid argument\n");
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_process_group_set_error_handling_enable(
+	ia_css_process_group_t *process_group,
+	const bool error_handling_enable)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_set_error_handling_enable(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	process_group->error_handling_enable = (uint8_t)((error_handling_enable == true) ? 1 : 0);
+	retval = 0;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_set_error_handling_enable invalid argument\n");
+	}
+
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_process_group_get_error_handling_enable(
+	const ia_css_process_group_t *process_group)
+{
+	DECLARE_ERRVAL
+	uint8_t error_handling_enable = UINT8_MAX;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_error_handling_enable(): enter:\n");
+
+	verifexitval(process_group != NULL, EFAULT);
+
+	/* Error handling enable flag should serve as boolean type, so it can be either 0 or 1 */
+	assert(process_group->error_handling_enable <= (uint8_t)1);
+	error_handling_enable = process_group->error_handling_enable;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_get_error_handling_enable invalid argument\n");
+	}
+
+	return error_handling_enable;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_process_group_has_vp(const ia_css_process_group_t *process_group)
+{
+#if NUM_OF_VP_CELLS > 0
+	bool has_vp = false;
+#ifdef HAS_VP
+	uint32_t i;
+
+	uint8_t process_count = ia_css_process_group_get_process_count(process_group);
+
+	for (i = 0; i < process_count; i++) {
+		ia_css_process_t *process;
+		vied_nci_cell_ID_t cell_id;
+
+		process = ia_css_process_group_get_process(process_group, i);
+		cell_id = ia_css_process_get_cell(process);
+
+		if (VIED_NCI_VP_TYPE_ID == vied_nci_cell_get_type(cell_id)) {
+			has_vp = true;
+			break;
+		}
+	}
+#else /* not HAS_VP */
+		NOT_USED(process_group);
+#endif /* HAS_VP */
+
+	return has_vp;
+#else
+	NOT_USED(process_group);
+	return false;
+#endif
+}
+
+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_impl.h
new file mode 100644
index 000000000000..feb0e166dfda
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_impl.h
@@ -0,0 +1,694 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_IMPL_H
+#define __IA_CSS_PSYS_PROCESS_IMPL_H
+
+#include <ia_css_psys_process.h>
+
+#include <ia_css_psys_process_group.h>
+#include <ia_css_psys_program_manifest.h>
+
+#include <error_support.h>
+#include <misc_support.h>
+#include <assert_support.h>
+
+#include <vied_nci_psys_system_global.h>
+
+#include "ia_css_psys_dynamic_trace.h"
+#include "ia_css_psys_process_private_types.h"
+
+/** Function only to be used in FW */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_process_ext_t *ia_css_process_get_extension(const ia_css_process_t *process)
+{
+	DECLARE_ERRVAL
+	verifexitval(process != NULL, EFAULT);
+	if (process->process_extension_offset != 0) {
+		return (ia_css_process_ext_t *)((uint8_t *)process + process->process_extension_offset);
+	}
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_get_extension invalid argument\n");
+	}
+	return NULL;
+}
+
+/** Function only to be used in ia_css_psys_process_impl.h and ia_css_psys_process.h */
+STORAGE_CLASS_INLINE vied_nci_cell_ID_t ia_css_process_cells_get_cell(const ia_css_process_t *process, int index)
+{
+	assert(index < IA_CSS_PROCESS_MAX_CELLS);
+	return process->cells[index];
+}
+
+/** Function only to be used in ia_css_psys_process_impl.h and ia_css_psys_process.h */
+STORAGE_CLASS_INLINE void ia_css_process_cells_set_cell(ia_css_process_t *process, int index, vied_nci_cell_ID_t cell_id)
+{
+	assert(index < IA_CSS_PROCESS_MAX_CELLS);
+	process->cells[index] = cell_id;
+}
+
+/** Function only to be used in ia_css_psys_process_impl.h and ia_css_psys_process */
+STORAGE_CLASS_INLINE void ia_css_process_cells_clear(ia_css_process_t *process)
+{
+	int i;
+	for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
+		ia_css_process_cells_set_cell(process, i, VIED_NCI_N_CELL_ID);
+	}
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_cell_ID_t ia_css_process_get_cell(
+	const ia_css_process_t					*process)
+{
+	DECLARE_ERRVAL
+	vied_nci_cell_ID_t	cell_id = VIED_NCI_N_CELL_ID;
+	int i = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_get_cell(): enter:\n");
+
+	verifexitval(process != NULL, EFAULT);
+
+	for (i = 1; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
+		assert(VIED_NCI_N_CELL_ID == ia_css_process_cells_get_cell(process, i));
+#ifdef __HIVECC
+#pragma hivecc unroll
+#endif
+	}
+	cell_id = ia_css_process_cells_get_cell(process, 0);
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_get_cell invalid argument\n");
+	}
+	return cell_id;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_mem_ID_t ia_css_process_get_ext_mem_id(
+	const ia_css_process_t		*process,
+	const vied_nci_mem_type_ID_t	mem_type)
+{
+	DECLARE_ERRVAL
+	ia_css_process_ext_t *process_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_get_ext_mem(): enter:\n");
+
+	verifexitval(process != NULL && mem_type < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
+	process_ext = ia_css_process_get_extension(process);
+	verifexitval(process_ext != NULL, EFAULT);
+
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_get_ext_mem invalid argument\n");
+		return IA_CSS_PROCESS_INVALID_OFFSET;
+	}
+	return process_ext->ext_mem_id[mem_type];
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_process_get_program_idx(
+	const ia_css_process_t		*process)
+{
+	DECLARE_ERRVAL
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_get_program_idx(): enter:\n");
+
+	verifexitval(process != NULL, EFAULT);
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_get_program_idx invalid argument\n");
+		return IA_CSS_PROCESS_INVALID_PROGRAM_IDX;
+	}
+	return process->program_idx;
+}
+
+#if VIED_NCI_N_DEV_CHN_ID > 0
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_resource_size_t ia_css_process_get_dev_chn(
+	const ia_css_process_t		*process,
+	const vied_nci_dev_chn_ID_t	dev_chn_id)
+{
+	DECLARE_ERRVAL
+	ia_css_process_ext_t *process_ext = NULL;
+
+	COMPILATION_ERROR_IF(VIED_NCI_N_DATA_MEM_TYPE_ID != VIED_NCI_N_MEM_TYPE_ID - 1); /* check for vied_nci_psys_resource_model.h correctness */
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_get_dev_chn(): enter:\n");
+	verifexitval(process != NULL && dev_chn_id < VIED_NCI_N_DEV_CHN_ID, EFAULT);
+	process_ext = ia_css_process_get_extension(process);
+	verifexitval(process_ext != NULL, EFAULT);
+
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_get_dev_chn(): invalid arguments\n");
+		return IA_CSS_PROCESS_INVALID_OFFSET;
+	}
+	return process_ext->dev_chn_offset[dev_chn_id];
+}
+#endif /* VIED_NCI_N_DEV_CHN_ID */
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_resource_size_t ia_css_process_get_int_mem_offset(
+	const ia_css_process_t				*process,
+	const vied_nci_mem_type_ID_t			mem_id)
+{
+	(void)process;
+	(void)mem_id;
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_get_int_mem_offset always returns 0"
+		"(internally memory feature not used).\n");
+	return 0;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_resource_size_t ia_css_process_get_ext_mem_offset(
+	const ia_css_process_t				*process,
+	const vied_nci_mem_type_ID_t			mem_type_id)
+{
+	DECLARE_ERRVAL
+	vied_nci_resource_size_t ext_mem_offset = IA_CSS_PROCESS_INVALID_OFFSET;
+	ia_css_process_ext_t *process_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_get_ext_mem_offset(): enter:\n");
+
+	verifexitval(process != NULL && mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
+	process_ext = ia_css_process_get_extension(process);
+	verifexitval(process_ext != NULL, EFAULT);
+
+EXIT:
+	if (noerror()) {
+		ext_mem_offset = process_ext->ext_mem_offset[mem_type_id];
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_get_ext_mem_offset invalid argument\n");
+	}
+
+	return ext_mem_offset;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+size_t ia_css_process_get_size(
+	const ia_css_process_t					*process)
+{
+	DECLARE_ERRVAL
+	size_t	size = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_get_size(): enter:\n");
+
+	verifexitval(process != NULL, EFAULT);
+
+EXIT:
+	if (noerror()) {
+		size = process->size;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			       "ia_css_process_get_size invalid argument\n");
+	}
+
+	return size;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_process_state_t ia_css_process_get_state(
+	const ia_css_process_t					*process)
+{
+	DECLARE_ERRVAL
+	ia_css_process_state_t	state = IA_CSS_N_PROCESS_STATES;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		       "ia_css_process_get_state(): enter:\n");
+
+	verifexitval(process != NULL, EFAULT);
+
+EXIT:
+	if (noerror()) {
+		state = (ia_css_process_state_t)process->state;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			       "ia_css_process_get_state invalid argument\n");
+	}
+
+	return state;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_set_state(
+	ia_css_process_t					*process,
+	ia_css_process_state_t				state)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		       "ia_css_process_set_state(): enter:\n");
+
+	verifexitval(process != NULL, EFAULT);
+
+	assert(state <= UINT8_MAX);
+	process->state = state;
+	retval = 0;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_set_state invalid argument\n");
+	}
+
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_process_get_cell_dependency_count(
+	const ia_css_process_t					*process)
+{
+	DECLARE_ERRVAL
+	uint8_t	cell_dependency_count = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		       "ia_css_process_get_cell_dependency_count(): enter:\n");
+
+	verifexitval(process != NULL, EFAULT);
+	cell_dependency_count = process->cell_dependency_count;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+		"ia_css_process_get_cell_dependency_count invalid argument\n");
+	}
+	return cell_dependency_count;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_process_get_terminal_dependency_count(
+	const ia_css_process_t					*process)
+{
+	DECLARE_ERRVAL
+	uint8_t	terminal_dependency_count = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_get_terminal_dependency_count(): enter:\n");
+
+	verifexitval(process != NULL, EFAULT);
+	terminal_dependency_count = process->terminal_dependency_count;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_get_terminal_dependency_count invalid argument process\n");
+	}
+	return terminal_dependency_count;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_process_group_t *ia_css_process_get_parent(
+	const ia_css_process_t					*process)
+{
+	DECLARE_ERRVAL
+	ia_css_process_group_t	*parent = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_get_parent(): enter:\n");
+
+	verifexitval(process != NULL, EFAULT);
+	if (process->parent_offset == 0) {
+		return NULL;
+	};
+	parent =
+	(ia_css_process_group_t *) ((char *)process + process->parent_offset);
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_get_parent invalid argument process\n");
+	}
+	return parent;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_program_ID_t ia_css_process_get_program_ID(
+	const ia_css_process_t					*process)
+{
+	DECLARE_ERRVAL
+	ia_css_program_ID_t		id = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		       "ia_css_process_get_program_ID(): enter:\n");
+
+	verifexitval(process != NULL, EFAULT);
+
+	id = process->ID;
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+		    "ia_css_process_get_program_ID invalid argument process\n");
+	}
+	return id;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_resource_id_t ia_css_process_get_cell_dependency(
+	const ia_css_process_t *process,
+	const unsigned int cell_num)
+{
+	DECLARE_ERRVAL
+	vied_nci_resource_id_t cell_dependency =
+		IA_CSS_PROCESS_INVALID_DEPENDENCY;
+	vied_nci_resource_id_t *cell_dep_ptr = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_get_cell_dependency(): enter:\n");
+
+	verifexitval(process != NULL, EFAULT);
+	verifexitval(cell_num < process->cell_dependency_count, EFAULT);
+
+	cell_dep_ptr =
+		(vied_nci_resource_id_t *)
+		((char *)process + process->cell_dependencies_offset);
+	cell_dependency = *(cell_dep_ptr + cell_num);
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+		       "ia_css_process_get_cell_dependency invalid argument\n");
+	}
+	return cell_dependency;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_process_get_terminal_dependency(
+	const ia_css_process_t					*process,
+	const unsigned int					terminal_num)
+{
+	DECLARE_ERRVAL
+	uint8_t *ter_dep_ptr = NULL;
+	uint8_t ter_dep = IA_CSS_PROCESS_INVALID_DEPENDENCY;
+
+	verifexitval(process != NULL, EFAULT);
+	verifexitval(terminal_num < process->terminal_dependency_count, EFAULT);
+
+	ter_dep_ptr = (uint8_t *) ((char *)process +
+				   process->terminal_dependencies_offset);
+
+	ter_dep = *(ter_dep_ptr + terminal_num);
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+		       "ia_css_process_get_terminal_dependency invalid argument\n");
+	}
+	return ter_dep;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t ia_css_process_get_cells_bitmap(
+	const ia_css_process_t *process)
+{
+	DECLARE_ERRVAL
+	vied_nci_resource_bitmap_t bitmap = 0;
+	vied_nci_cell_ID_t cell_id;
+	int i = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		       "ia_css_process_get_cell_bitmap(): enter:\n");
+
+	verifexitval(process != NULL, EFAULT);
+
+	for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
+		cell_id = ia_css_process_cells_get_cell(process, i);
+		if (VIED_NCI_N_CELL_ID != cell_id) {
+			bitmap |= (1 << cell_id);
+		}
+#ifdef __HIVECC
+#pragma hivecc unroll
+#endif
+	}
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+		 "ia_css_process_get_cells_bitmap invalid argument process\n");
+	}
+
+	return bitmap;
+}
+
+#if HAS_DFM
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t* ia_css_process_get_dfm_port_bitmap_ptr(
+	ia_css_process_t *process)
+{
+	DECLARE_ERRVAL
+	vied_nci_resource_bitmap_t *p_bitmap = NULL;
+	ia_css_process_ext_t *process_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		       "ia_css_process_get_dfm_port_bitmap(): enter:\n");
+
+	verifexitval(process != NULL, EFAULT);
+	process_ext = ia_css_process_get_extension(process);
+	if (process_ext == NULL) {
+		return NULL;
+	}
+
+	p_bitmap = &process_ext->dfm_port_bitmap[0];
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+		 "ia_css_process_get_dfm_port_bitmap invalid argument process\n");
+	}
+
+	return p_bitmap;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t* ia_css_process_get_dfm_active_port_bitmap_ptr(
+	ia_css_process_t *process)
+{
+	DECLARE_ERRVAL
+	vied_nci_resource_bitmap_t *p_bitmap = NULL;
+	ia_css_process_ext_t *process_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		       "ia_css_process_get_dfm_port_bitmap(): enter:\n");
+
+	verifexitval(process != NULL, EFAULT);
+	process_ext = ia_css_process_get_extension(process);
+	if (process_ext == NULL) {
+		return NULL;
+	}
+
+	p_bitmap = &process_ext->dfm_active_port_bitmap[0];
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+		 "ia_css_process_get_dfm_port_bitmap invalid argument process\n");
+	}
+
+	return p_bitmap;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t ia_css_process_get_dfm_port_bitmap(
+	const ia_css_process_t *process,
+	vied_nci_dev_dfm_id_t  dfm_res_id)
+{
+	DECLARE_ERRVAL
+	vied_nci_resource_bitmap_t bitmap = 0;
+	ia_css_process_ext_t *process_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		       "ia_css_process_get_dfm_port_bitmap(): enter:\n");
+
+	verifexitval(process != NULL, EFAULT);
+	process_ext = ia_css_process_get_extension(process);
+	if (process_ext == NULL) {
+		return 0;
+	}
+	verifexitval(dfm_res_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
+	bitmap = process_ext->dfm_port_bitmap[dfm_res_id];
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+		 "ia_css_process_get_dfm_port_bitmap invalid argument process\n");
+	}
+
+	return bitmap;
+}
+#endif /* HAS_DFM */
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t ia_css_process_get_dfm_active_port_bitmap(
+	const ia_css_process_t *process,
+	vied_nci_dev_dfm_id_t  dfm_res_id)
+{
+	DECLARE_ERRVAL
+	vied_nci_resource_bitmap_t bitmap = 0;
+	ia_css_process_ext_t *process_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		       "ia_css_process_get_dfm_active_port_bitmap(): enter:\n");
+
+	verifexitval(process != NULL, EFAULT);
+	process_ext = ia_css_process_get_extension(process);
+	if (process_ext == NULL) {
+		return 0;
+	}
+#if HAS_DFM
+	verifexitval(dfm_res_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
+	bitmap = process_ext->dfm_active_port_bitmap[dfm_res_id];
+#else
+	NOT_USED(dfm_res_id);
+#endif
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+		 "ia_css_process_get_dfm_active_port_bitmap invalid argument process\n");
+	}
+	return bitmap;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_is_process_valid(
+	const ia_css_process_t		*process,
+	const ia_css_program_manifest_t	*p_manifest)
+{
+	DECLARE_ERRVAL
+	bool invalid_flag = false;
+	ia_css_program_ID_t prog_id;
+
+	verifexitval(NULL != process, EFAULT);
+	verifexitval(NULL != p_manifest, EFAULT);
+
+	prog_id = ia_css_process_get_program_ID(process);
+	verifjmpexit(prog_id == ia_css_program_manifest_get_program_ID(p_manifest));
+
+	invalid_flag = (process->size <= process->cell_dependencies_offset) ||
+		   (process->size <= process->terminal_dependencies_offset);
+
+	if (ia_css_has_program_manifest_fixed_cell(p_manifest)) {
+		vied_nci_cell_ID_t cell_id;
+
+		cell_id = ia_css_program_manifest_get_cell_ID(p_manifest);
+		invalid_flag = invalid_flag ||
+			    (cell_id != (vied_nci_cell_ID_t)(ia_css_process_get_cell(process)));
+	}
+	invalid_flag = invalid_flag ||
+		((process->cell_dependency_count +
+		  process->terminal_dependency_count) == 0) ||
+		(process->cell_dependency_count !=
+	ia_css_program_manifest_get_program_dependency_count(p_manifest)) ||
+		(process->terminal_dependency_count !=
+	ia_css_program_manifest_get_terminal_dependency_count(p_manifest));
+
+	/* TODO: to be removed once all PGs pass validation */
+	if (invalid_flag == true) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+			"ia_css_is_process_valid(): false\n");
+	}
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_is_process_valid() invalid argument\n");
+		return false;
+	} else {
+		return (!invalid_flag);
+	}
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_process_cmd(
+	ia_css_process_t					*process,
+	const ia_css_process_cmd_t				cmd)
+{
+	int	retval = -1;
+	ia_css_process_state_t	state;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO, "ia_css_process_cmd(): enter:\n");
+
+	verifexit(process != NULL);
+
+	state = ia_css_process_get_state(process);
+
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO, "ia_css_process_cmd(): state: %d\n", state);
+
+	verifexit(state != IA_CSS_PROCESS_ERROR);
+	verifexit(state < IA_CSS_N_PROCESS_STATES);
+
+	switch (cmd) {
+	case IA_CSS_PROCESS_CMD_NOP:
+		break;
+	case IA_CSS_PROCESS_CMD_ACQUIRE:
+		verifexit(state == IA_CSS_PROCESS_READY);
+		break;
+	case IA_CSS_PROCESS_CMD_RELEASE:
+		verifexit(state == IA_CSS_PROCESS_READY);
+		break;
+	case IA_CSS_PROCESS_CMD_START:
+		verifexit((state == IA_CSS_PROCESS_READY)
+			  || (state == IA_CSS_PROCESS_STOPPED));
+		process->state = IA_CSS_PROCESS_STARTED;
+		break;
+	case IA_CSS_PROCESS_CMD_LOAD:
+		verifexit((state == IA_CSS_PROCESS_STARTED)
+				|| (state == IA_CSS_PROCESS_READY)
+				|| (state == IA_CSS_PROCESS_STOPPED));
+		process->state = IA_CSS_PROCESS_RUNNING;
+		break;
+	case IA_CSS_PROCESS_CMD_STOP:
+		verifexit((state == IA_CSS_PROCESS_RUNNING)
+			  || (state == IA_CSS_PROCESS_SUSPENDED));
+		process->state = IA_CSS_PROCESS_STOPPED;
+		break;
+	case IA_CSS_PROCESS_CMD_SUSPEND:
+		verifexit(state == IA_CSS_PROCESS_RUNNING);
+		process->state = IA_CSS_PROCESS_SUSPENDED;
+		break;
+	case IA_CSS_PROCESS_CMD_RESUME:
+		verifexit(state == IA_CSS_PROCESS_SUSPENDED);
+		process->state = IA_CSS_PROCESS_RUNNING;
+		break;
+	case IA_CSS_N_PROCESS_CMDS:	/* Fall through */
+	default:
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_cmd invalid cmd (0x%x)\n", cmd);
+		goto EXIT;
+	}
+	retval = 0;
+EXIT:
+	if (NULL == process) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_cmd invalid argument process\n");
+	}
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_cmd failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+#endif /* __IA_CSS_PSYS_PROCESS_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_private_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_private_types.h
new file mode 100644
index 000000000000..d8d58835c1e6
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_private_types.h
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_PRIVATE_TYPES_H
+#define __IA_CSS_PSYS_PROCESS_PRIVATE_TYPES_H
+
+#include "ia_css_psys_process_types.h"
+#include "vied_nci_psys_resource_model.h"
+
+#define	N_UINT32_IN_PROCESS_STRUCT				0
+#define	N_UINT16_IN_PROCESS_STRUCT				1
+#define	N_UINT8_IN_PROCESS_STRUCT				8
+
+#if IA_CSS_PROCESS_STATE_BITS != 8
+#error IA_CSS_PROCESS_STATE_BITS expected to be 8
+#endif
+
+#define SIZE_OF_PROCESS_EXTENSION \
+	 ((VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
+	+ (VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
+	+ (VIED_NCI_N_DATA_MEM_TYPE_ID * VIED_NCI_RESOURCE_SIZE_BITS) \
+	+ (VIED_NCI_N_DEV_CHN_ID * VIED_NCI_RESOURCE_SIZE_BITS) \
+	+ (VIED_NCI_N_DATA_MEM_TYPE_ID * VIED_NCI_RESOURCE_ID_BITS) \
+	+ (N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT * 8))
+
+/** Extended process attributes describing more resource requirements
+ *  (and some DFM handling details ) beyond those covered in
+ *  ia_css_process_s.
+ */
+struct ia_css_process_ext_s {
+#if VIED_NCI_N_DEV_DFM_ID > 0
+	/** DFM port allocated to this process */
+	vied_nci_resource_bitmap_t dfm_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
+	/** Active DFM ports which need a kick */
+	vied_nci_resource_bitmap_t dfm_active_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
+#endif
+#if VIED_NCI_N_DATA_MEM_TYPE_ID > 0
+	/** (external) Memory allocation offset given to this process */
+	vied_nci_resource_size_t ext_mem_offset[VIED_NCI_N_DATA_MEM_TYPE_ID];
+#endif
+#if VIED_NCI_N_DEV_CHN_ID > 0
+	/** Device channel allocation offset given to this process */
+	vied_nci_resource_size_t dev_chn_offset[VIED_NCI_N_DEV_CHN_ID];
+#endif
+#if VIED_NCI_N_DATA_MEM_TYPE_ID > 0
+	/** (external) Memory ID */
+	vied_nci_resource_id_t ext_mem_id[VIED_NCI_N_DATA_MEM_TYPE_ID];
+#endif
+#if N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT > 0
+	/** Number of processes (mapped on cells) this process depends on */
+	uint8_t padding[N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT];
+#endif
+};
+
+#define SIZE_OF_PROCESS_STRUCT_BITS \
+	((N_UINT32_IN_PROCESS_STRUCT * 32) \
+	+ (IA_CSS_PROGRAM_ID_BITS) \
+	+ (N_UINT16_IN_PROCESS_STRUCT * 16) \
+	+ (IA_CSS_PROCESS_MAX_CELLS * VIED_NCI_RESOURCE_ID_BITS) \
+	+ (N_UINT8_IN_PROCESS_STRUCT * 8) \
+	+ ((N_PADDING_UINT8_IN_PROCESS_STRUCT) * 8))
+
+/** Process attributes describing the instantiation of a single Program
+ *  within a Program Group.
+ */
+struct ia_css_process_s {
+	/** Reference to the containing process group */
+	int16_t parent_offset;
+	/** Size of this structure */
+	uint8_t size;
+	/** Offset in bytes to Array[dependency_count] of ID's (type vied_nci_resource_id_t)
+	 *  of the cells that provide input to this process.
+	 *  Align to 64 bit boundary.
+	 *  Set to zero if dependency_count is zero.
+	 *  @see cell_dependency_count in this structure */
+	uint8_t cell_dependencies_offset;
+	/** Offset in bytes to Array[terminal_dependency_count] of indices (type: uint8_t)
+	 *  of connected terminals (that is, the terminals that are associated with this process).
+	 *  Each index is a key into to the process group terminal list.
+	 *  Set to zero if dependency_count is zero.
+	 *  @see terminal_dependency_count in this structure
+	 *  @see ia_css_process_group_get_terminal() */
+	uint8_t terminal_dependencies_offset;
+	/** Offset in bytes to process extension structure, ia_css_process_ext_s
+	 *  Align to 32 bit boundary.
+	 *  Set to zero if extension is not used. The manifest must be queried to
+	 *  find out if the extensino is necessary.
+	 *  @see ia_css_program_manifest_process_requires_extension() */
+	uint8_t process_extension_offset;
+	/** Referal ID to a specific program.  This ID is unique across PG's and
+	 *  can be used to retreive program meta data (AKA "program descriptor")
+	 *  from the client package, including the program manifest and even
+	 *  firmware program code, if the program is to be executed on a DSP. */
+	ia_css_program_ID_t ID;
+	/** Program index into the list of programs in the containing PG */
+	uint8_t program_idx;
+	/** State of the process FSM dependent on the parent FSM.  Type is actually: ia_css_process_state_t
+	 *  Used by the PSYSAPI for its own process state machine and internally by FW.  For the purposes of
+	 *  the ABI protocol definition, host code should just set this to IA_CSS_PROCESS_READY before sending
+	 *  an IA_CSS_PROCESS_GROUP_CMD_START command to firmware.  */
+	uint8_t state;
+	/** Execution resources (e.g. DSP "cells" or fixed HW) required by the process. */
+	vied_nci_resource_id_t cells[IA_CSS_PROCESS_MAX_CELLS];
+	/** Size of the array of dependent cells pointed at by cell_dependencies_offset
+	 *  Value must be set to the corresponding value from the manifest entry for this program.
+	 *  As each program implies a cell (logically, if not physically) to execute the program,
+	 *  the dependent cell count value in the process is the same as the dependent program count.
+	 *  @see ia_css_program_manifest_get_program_dependency_count() */
+	uint8_t cell_dependency_count;
+	/** Number of terminals this process depends on.  This is the size of the array
+	 *  pointed at by terminal_dependencies_offset
+	 *  Value must be set to the corresponding value from the manifest entry for this program.
+	 *  @see ia_css_program_manifest_get_terminal_dependency_count()
+	 */
+	uint8_t terminal_dependency_count;
+#if (N_PADDING_UINT8_IN_PROCESS_STRUCT > 0)
+	/** Padding bytes for 64bit alignment*/
+	uint8_t padding[N_PADDING_UINT8_IN_PROCESS_STRUCT];
+#endif /*(N_PADDING_UINT8_IN_PROCESS_STRUCT > 0)*/
+};
+
+#endif /* __IA_CSS_PSYS_PROCESS_PRIVATE_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_types.h
new file mode 100644
index 000000000000..d8f2ac4ebafc
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_types.h
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROCESS_TYPES_H
+#define __IA_CSS_PSYS_PROCESS_TYPES_H
+
+/*! \file */
+
+/** @file ia_css_psys_process_types.h
+ *
+ * The types belonging to the terminal/process/process group dynamic module
+ */
+
+#include <type_support.h>
+#include <vied_nci_psys_system_global.h>
+
+#include <ia_css_psys_manifest_types.h>
+
+#define IA_CSS_PROCESS_INVALID_PROGRAM_IDX  ((uint32_t)-1)
+
+/* private */
+typedef enum ia_css_process_group_cmd {
+	IA_CSS_PROCESS_GROUP_CMD_NOP = 0,
+	IA_CSS_PROCESS_GROUP_CMD_SUBMIT,
+	IA_CSS_PROCESS_GROUP_CMD_ATTACH,
+	IA_CSS_PROCESS_GROUP_CMD_DETACH,
+	IA_CSS_PROCESS_GROUP_CMD_START,
+	IA_CSS_PROCESS_GROUP_CMD_DISOWN,
+	IA_CSS_PROCESS_GROUP_CMD_RUN,
+	IA_CSS_PROCESS_GROUP_CMD_STOP,
+	IA_CSS_PROCESS_GROUP_CMD_SUSPEND,
+	IA_CSS_PROCESS_GROUP_CMD_RESUME,
+	IA_CSS_PROCESS_GROUP_CMD_ABORT,
+	IA_CSS_PROCESS_GROUP_CMD_RESET,
+	IA_CSS_N_PROCESS_GROUP_CMDS
+} ia_css_process_group_cmd_t;
+
+/* private */
+#define IA_CSS_PROCESS_GROUP_STATE_BITS	32
+typedef enum ia_css_process_group_state {
+	IA_CSS_PROCESS_GROUP_ERROR = 0,
+	IA_CSS_PROCESS_GROUP_CREATED,
+	IA_CSS_PROCESS_GROUP_READY,
+	IA_CSS_PROCESS_GROUP_BLOCKED,
+	IA_CSS_PROCESS_GROUP_STARTED,
+	IA_CSS_PROCESS_GROUP_RUNNING,
+	IA_CSS_PROCESS_GROUP_STALLED,
+	IA_CSS_PROCESS_GROUP_STOPPED,
+	IA_CSS_N_PROCESS_GROUP_STATES
+} ia_css_process_group_state_t;
+
+/* private */
+typedef enum ia_css_process_cmd {
+	IA_CSS_PROCESS_CMD_NOP = 0,
+	IA_CSS_PROCESS_CMD_ACQUIRE,
+	IA_CSS_PROCESS_CMD_RELEASE,
+	IA_CSS_PROCESS_CMD_START,
+	IA_CSS_PROCESS_CMD_LOAD,
+	IA_CSS_PROCESS_CMD_STOP,
+	IA_CSS_PROCESS_CMD_SUSPEND,
+	IA_CSS_PROCESS_CMD_RESUME,
+	IA_CSS_N_PROCESS_CMDS
+} ia_css_process_cmd_t;
+
+/* private */
+#define IA_CSS_PROCESS_STATE_BITS	8
+typedef enum ia_css_process_state {
+	IA_CSS_PROCESS_ERROR = 0,
+	IA_CSS_PROCESS_CREATED,
+	IA_CSS_PROCESS_READY,
+	IA_CSS_PROCESS_STARTED,
+	IA_CSS_PROCESS_RUNNING,
+	IA_CSS_PROCESS_STOPPED,
+	IA_CSS_PROCESS_SUSPENDED,
+	IA_CSS_N_PROCESS_STATES
+} ia_css_process_state_t;
+
+/* public */
+typedef struct ia_css_process_group_s	ia_css_process_group_t;
+typedef struct ia_css_process_s		ia_css_process_t;
+typedef struct ia_css_process_ext_s	ia_css_process_ext_t;
+
+typedef struct ia_css_data_terminal_s	ia_css_data_terminal_t;
+
+#endif /* __IA_CSS_PSYS_PROCESS_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.h
new file mode 100644
index 000000000000..4657c82bba05
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.h
@@ -0,0 +1,320 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_H
+#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_H
+
+#include "ia_css_psys_static_storage_class.h"
+
+/*! \file */
+
+/** @file ia_css_psys_program_group_manifest.h
+ *
+ * Define the methods on the program group manifest object that are not part of
+ * a single interface.
+ *
+ * Set functions in this file are for not for production use by the
+ * users (testing/simulation only).
+ */
+
+#include <ia_css_psys_manifest_types.h>
+
+#include <type_support.h>			/* uint8_t */
+
+#include <ia_css_psys_program_group_manifest.sim.h>
+
+#include <ia_css_psys_program_group_manifest.hsys.user.h>
+
+#include <ia_css_kernel_bitmap.h>		/* ia_css_kernel_bitmap_t */
+#include "ia_css_terminal_manifest.h"
+#include "ia_css_rbm_manifest_types.h"
+
+#define IA_CSS_PROGRAM_GROUP_INVALID_ALIGNMENT		((uint8_t)(-1))
+
+/*! Get the stored size of the program group manifest object
+
+ @param	manifest[in]			program group manifest object
+
+ @return size, 0 on invalid argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+size_t ia_css_program_group_manifest_get_size(
+	const ia_css_program_group_manifest_t *manifest);
+
+/*! Get the program group ID of the program group manifest object
+
+ @param	manifest[in]			program group manifest object
+
+ @return program group ID, IA_CSS_PROGRAM_GROUP_INVALID_ID on invalid argument
+*/
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_program_group_ID_t
+ia_css_program_group_manifest_get_program_group_ID(
+	const ia_css_program_group_manifest_t *manifest);
+
+/*! Set the program group ID of the program group manifest object
+
+ @param	manifest[in]			program group manifest object
+
+ @param program group ID
+
+ @return 0 on success, -1 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_program_group_manifest_set_program_group_ID(
+	ia_css_program_group_manifest_t *manifest,
+	ia_css_program_group_ID_t id);
+
+/*! Get the storage alignment constraint of the program group binary data
+
+ @param	manifest[in]			program group manifest object
+
+ @return alignment, IA_CSS_PROGRAM_GROUP_INVALID_ALIGNMENT on invalid manifest
+	argument
+*/
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_group_manifest_get_alignment(
+	const ia_css_program_group_manifest_t *manifest);
+
+/*! Set the storage alignment constraint of the program group binary data
+
+ @param	manifest[in]			program group manifest object
+ @param	alignment[in]			alignment desired
+
+ @return < 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_program_group_manifest_set_alignment(
+	ia_css_program_group_manifest_t *manifest,
+	const uint8_t alignment);
+
+/*! Get the kernel enable bitmap of the program group
+
+ @param	manifest[in]			program group manifest object
+
+ @return bitmap, 0 on invalid manifest argument
+ */
+extern ia_css_kernel_bitmap_t
+ia_css_program_group_manifest_get_kernel_bitmap(
+	const ia_css_program_group_manifest_t *manifest);
+
+/*! Set the kernel enable bitmap of the program group
+
+ @param	manifest[in]			program group manifest object
+ @param	kernel bitmap[in]		kernel enable bitmap
+
+ @return < 0 on invalid manifest argument
+ */
+extern int ia_css_program_group_manifest_set_kernel_bitmap(
+	ia_css_program_group_manifest_t *manifest,
+	const ia_css_kernel_bitmap_t bitmap);
+
+/*! Get the number of programs in the program group manifest object
+
+ @param	manifest[in]			program group manifest object
+
+ @return program count, 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_group_manifest_get_program_count(
+	const ia_css_program_group_manifest_t *manifest);
+
+/*! Get the number of terminals in the program group manifest object
+
+ @param	manifest[in]			program group manifest object
+
+ @return terminal count, 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_group_manifest_get_terminal_count(
+	const ia_css_program_group_manifest_t *manifest);
+
+/*! Get the (pointer to) private data blob in the manifest
+
+  Private data is used by FW and is opauque to the SW stack
+
+ @param	manifest[in]			program group manifest object
+
+ @return private data blob, NULL on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+void *ia_css_program_group_manifest_get_private_data(
+	const ia_css_program_group_manifest_t *manifest);
+
+/*! Get the (pointer to) routing bitmap (rbm) manifest
+
+ @param	manifest[in]			program group manifest object
+
+ @return rbm manifest, NULL on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_rbm_manifest_t *
+ia_css_program_group_manifest_get_rbm_manifest(
+	const ia_css_program_group_manifest_t *manifest);
+
+/*! Get the (pointer to) indexed program manifest in the program group manifest
+ * object
+
+ @param	manifest[in]			program group manifest object
+ @param	program_index[in]		index of the program manifest object
+
+ @return program manifest, NULL on invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_program_manifest_t *
+ia_css_program_group_manifest_get_prgrm_mnfst(
+	const ia_css_program_group_manifest_t *manifest,
+	const unsigned int program_index);
+
+/*! Get the (pointer to) indexed terminal manifest in the program group
+ * manifest object
+
+ @param	manifest[in]			program group manifest object
+ @param	program_index[in]		index of the terminal manifest object
+
+ @return terminal manifest, NULL on invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_manifest_t *
+ia_css_program_group_manifest_get_term_mnfst(
+	const ia_css_program_group_manifest_t *manifest,
+	const unsigned int terminal_index);
+
+/*! Get the (pointer to) indexed data terminal manifest in the program group
+ * manifest object
+
+ @param	manifest[in]			program group manifest object
+ @param	program_index[in]		index of the terminal manifest object
+
+ @return data terminal manifest, NULL on invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_data_terminal_manifest_t *
+ia_css_program_group_manifest_get_data_terminal_manifest(
+	const ia_css_program_group_manifest_t *manifest,
+	const unsigned int terminal_index);
+
+/*! Get the (pointer to) indexed parameter terminal manifest in the program
+ * group manifest object
+
+ @param	manifest[in]			program group manifest object
+ @param	program_index[in]		index of the terminal manifest object
+
+ @return parameter terminal manifest, NULL on invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_param_terminal_manifest_t *
+ia_css_program_group_manifest_get_param_terminal_manifest(
+	const ia_css_program_group_manifest_t *manifest,
+	const unsigned int terminal_index);
+
+/*! Get the (pointer to) indexed spatial param terminal manifest in the program
+ * group manifest object
+
+ @param	manifest[in]			program group manifest object
+ @param	program_index[in]		index of the terminal manifest object
+
+ @return spatial param terminal manifest, NULL on invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_spatial_param_terminal_manifest_t *
+ia_css_program_group_manifest_get_spatial_param_terminal_manifest(
+	const ia_css_program_group_manifest_t *manifest,
+	const unsigned int terminal_index);
+
+/*! Get the (pointer to) indexed sliced param terminal manifest in the program
+ * group manifest object
+
+ @param	manifest[in]			program group manifest object
+ @param	program_index[in]		index of the terminal manifest object
+
+ @return sliced param terminal manifest, NULL on invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_sliced_param_terminal_manifest_t *
+ia_css_program_group_manifest_get_sliced_param_terminal_manifest(
+	const ia_css_program_group_manifest_t *manifest,
+	const unsigned int terminal_index);
+
+/*! Get the (pointer to) indexed program terminal manifest in the program group
+ * manifest object
+
+ @parammanifest[in]program group manifest object
+ @paramprogram_index[in]index of the terminal manifest object
+
+ @return program terminal manifest, NULL on invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_program_terminal_manifest_t *
+ia_css_program_group_manifest_get_program_terminal_manifest(
+	const ia_css_program_group_manifest_t *manifest,
+	const unsigned int terminal_index);
+
+/*!	initialize program group manifest
+
+ @param	manifest[in]		program group manifest object
+ @param	program_count[in]	number of programs.
+ @param	terminal_count[in]	number of terminals.
+ @param program_needs_extension[in] Array[program count]
+ @param	program_deps[in]	program dependencies for programs in pg.
+ @param	terminal_deps[in]	terminal dependencies for programs in pg.
+ @param	terminal_type[in]	array of terminal types, binary specific
+				static frame data
+ @param	cached_in_param_section_count[in]Number of parameter terminal sections
+ @param cached_out_param_section_count[in]	Number of parameter out terminal
+ @param	spatial_param_section_count[in]		Array[spatial_terminal_count]
+						with sections per cached out
+						terminal
+ @param sliced_in_param_section_count[in]	Array[sliced_in_terminal_count]
+						with sections per sliced in
+						terminal
+ @param sliced_out_param_section_count[in]	Array[sliced_out_terminal_count]
+						with sections per sliced out
+						terminal
+ @param	fragment_param_section_count[in]	Number of fragment parameter
+						sections of the program init
+						terminal,
+ @param	kernel_fragment_seq_count[in]		Number of kernel fragment
+						seqence info.
+ @param	progctrlinit_load_section_counts[in]	Number of progctrinit load
+						sections (size of array is program_count)
+ @param	progctrlinit_connect_section_counts[in]	Number of progctrinit connect
+						sections (size of array is program_count)
+ @return none;
+ */
+extern void ia_css_program_group_manifest_init(
+	ia_css_program_group_manifest_t *blob,
+	const uint8_t program_count,
+	const uint8_t terminal_count,
+	const uint8_t *program_needs_extension,
+	const uint8_t *program_dependencies,
+	const uint8_t *terminal_dependencies,
+	const ia_css_terminal_type_t *terminal_type,
+	const uint16_t *cached_in_param_section_count,
+	const uint16_t *cached_out_param_section_count,
+	const uint16_t *spatial_param_section_count,
+	const uint16_t *fragment_param_section_count,
+	const uint16_t *sliced_in_param_section_count,
+	const uint16_t *sliced_out_param_section_count,
+	const uint16_t *kernel_fragment_seq_count,
+	const uint16_t *progctrlinit_load_section_counts,
+	const uint16_t *progctrlinit_connect_section_counts);
+
+#ifdef __IA_CSS_PSYS_STATIC_INLINE__
+#include "ia_css_psys_program_group_manifest_impl.h"
+#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
+
+#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.hsys.user.h
new file mode 100644
index 000000000000..787a4f67f4de
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.hsys.user.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_HSYS_USER_H
+#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_HSYS_USER_H
+
+/*! \file */
+
+/** @file ia_css_psys_program_group_manifest.hsys.user.h
+ *
+ * Define the methods on the program group manifest object: Hsys user interface
+ */
+
+#include <ia_css_psys_manifest_types.h>
+
+#include <type_support.h>	/* bool */
+
+/*! Print the program group manifest object to file/stream
+    in textual format
+
+ @param	manifest[in]		program group manifest object
+ @param	fid[out]		file/stream handle
+
+ @return < 0 on error
+ */
+extern int ia_css_program_group_manifest_print(
+	const ia_css_program_group_manifest_t *manifest,
+	void *fid);
+
+/*! Read the program group manifest object from file/stream
+  in binary format.
+
+ @see ia_css_program_group_manifest_write()
+
+ @param	fid[in]			file/stream handle
+
+ @return NULL on error
+ */
+extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_read(
+	void *fid);
+
+/*! Write the program group manifest object to file/stream
+  in binary format
+
+ @see ia_css_program_group_manifest_read()
+
+ @param	manifest[in]		program group manifest object
+ @param	fid[out]		file/stream handle
+
+ @return < 0 on error
+ */
+extern int ia_css_program_group_manifest_write(
+	const ia_css_program_group_manifest_t *manifest,
+	void *fid);
+
+/*! Boolean test if the program group manifest is valid
+
+ @param	manifest[in]		program group manifest
+
+ @return true if program group manifest is correct, false on error
+ */
+extern bool ia_css_is_program_group_manifest_valid(
+	const ia_css_program_group_manifest_t *manifest);
+
+#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_HSYS_USER_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.sim.h
new file mode 100644
index 000000000000..997755e3e842
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.sim.h
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H
+#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H
+
+/*! \file */
+
+/** @file ia_css_psys_program_group_manifest.sim.h
+ *
+ * Define the methods on the program group manifest object: Simulation only
+ */
+
+#include <ia_css_psys_manifest_types.h>
+
+#include <type_support.h>	/* uint8_t */
+#include "ia_css_terminal_defs.h"
+
+/*! Create a program group manifest object from specification
+
+ @param	specification[in]		specification (index)
+
+ @return NULL on error
+ */
+extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_create(
+	const unsigned int specification);
+
+/*! Destroy the program group manifest object
+
+ @param	manifest[in]			program group manifest
+
+ @return NULL
+ */
+extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_destroy(
+	ia_css_program_group_manifest_t			*manifest);
+
+/*! Compute the size of storage required for allocating
+ * the program group (PG) manifest object
+
+ @param	program_count[in]			Number of programs in the PG
+ @param	terminal_count[in]			Number of terminals on the PG
+ @param program_needs_extension[in]		Array[program count]
+ @param	program_dependency_count[in]		Array[program_count] with the PG
+ @param	terminal_dependency_count[in]		Array[program_count] with the
+						terminal dependencies
+ @param	terminal_type[in]			Array[terminal_count] with the
+						terminal type
+ @param	cached_in_param_section_count[in]	Number of parameter
+						in terminal sections
+ @param	cached_out_param_section_count[in]	Number of parameter
+						out terminal sections
+ @param	sliced_param_section_count[in]		Array[sliced_terminal_count]
+						with sections per
+						sliced in terminal
+ @param	sliced_out_param_section_count[in]	Array[sliced_terminal_count]
+						with sections per
+						sliced out terminal
+ @param	spatial_param_section_count[in]		Array[spatial_terminal_count]
+						with sections per
+						spatial terminal
+ @param	fragment_param_section_count[in]	Number of fragment parameter
+						sections of the
+						program init terminal,
+ @param	kernel_fragment_seq_count[in]		Number of
+						kernel_fragment_seq_count.
+ @param	progctrlinit_load_section_counts[in]	Number of progctrinit load
+						sections (size of array is program_count)
+ @param	progctrlinit_connect_section_counts[in]	Number of progctrinit connect
+						sections (size of array is program_count)
+ @return 0 on error
+ */
+size_t ia_css_sizeof_program_group_manifest(
+	const uint8_t			program_count,
+	const uint8_t			terminal_count,
+	const uint8_t			*program_needs_extension,
+	const uint8_t			*program_dependency_count,
+	const uint8_t			*terminal_dependency_count,
+	const ia_css_terminal_type_t	*terminal_type,
+	const uint16_t			*cached_in_param_section_count,
+	const uint16_t			*cached_out_param_section_count,
+	const uint16_t			*spatial_param_section_count,
+	const uint16_t			*fragment_param_section_count,
+	const uint16_t			*sliced_param_section_count,
+	const uint16_t			*sliced_out_param_section_count,
+	const uint16_t			*kernel_fragment_seq_count,
+	const uint16_t			*progctrlinit_load_section_counts,
+	const uint16_t			*progctrlinit_connect_section_counts);
+
+/*! Create (the storage for) the program group manifest object
+
+ @param	program_count[in]		Number of programs in the program group
+ @param	terminal_count[in]		Number of terminals on the program group
+ @param	program_dependency_count[in]	Array[program_count] with the
+					program dependencies
+ @param	terminal_dependency_count[in]	Array[program_count] with the
+					terminal dependencies
+ @param	terminal_type[in]		Array[terminal_count] with the
+					terminal type
+
+ @return NULL on error
+ */
+extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_alloc(
+	const uint8_t			program_count,
+	const uint8_t			terminal_count,
+	const uint8_t			*program_dependency_count,
+	const uint8_t			*terminal_dependency_count,
+	const ia_css_terminal_type_t	*terminal_type);
+
+/*! Free (the storage of) the program group manifest object
+
+ @param	manifest[in]			program group manifest
+
+ @return NULL
+ */
+extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_free(
+	ia_css_program_group_manifest_t *manifest);
+
+#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest_impl.h
new file mode 100644
index 000000000000..d37e5caa2611
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest_impl.h
@@ -0,0 +1,417 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_IMPL_H
+#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_IMPL_H
+
+#include <ia_css_psys_program_group_manifest.h>
+#include <ia_css_psys_program_manifest.h>
+#include <ia_css_psys_terminal_manifest.h>
+#include <ia_css_kernel_bitmap.h>
+#include "ia_css_psys_program_group_private.h"
+#include "ia_css_terminal_manifest_types.h"
+#include "ia_css_psys_private_pg_data.h"
+#include <vied_nci_psys_system_global.h>	/* Safer bit mask functions */
+#include "ia_css_psys_static_trace.h"
+#include "ia_css_rbm_manifest_types.h"
+#include <error_support.h>
+#include <assert_support.h>
+#include <misc_support.h>
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+size_t ia_css_program_group_manifest_get_size(
+	const ia_css_program_group_manifest_t *manifest)
+{
+	size_t size = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_group_manifest_get_size(): enter:\n");
+
+	if (manifest != NULL) {
+		size = manifest->size;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_program_group_manifest_get_size invalid argument\n");
+	}
+	return size;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_program_group_ID_t
+ia_css_program_group_manifest_get_program_group_ID(
+	const ia_css_program_group_manifest_t *manifest)
+{
+	ia_css_program_group_ID_t id = IA_CSS_PROGRAM_GROUP_INVALID_ID;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_group_manifest_get_program_group_ID(): enter:\n");
+
+	if (manifest != NULL) {
+		id = manifest->ID;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_program_group_manifest_get_program_group_ID invalid argument\n");
+	}
+	return id;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+int ia_css_program_group_manifest_set_program_group_ID(
+	ia_css_program_group_manifest_t *manifest,
+	ia_css_program_group_ID_t id)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_group_manifest_set_program_group_ID(): enter:\n");
+
+	if (manifest != NULL) {
+		manifest->ID = id;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_program_group_manifest_set_program_group_ID invalid argument\n");
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+int ia_css_program_group_manifest_set_alignment(
+	ia_css_program_group_manifest_t *manifest,
+	const uint8_t alignment)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_group_manifest_set_alignment(): enter:\n");
+
+	if (manifest != NULL) {
+		manifest->alignment = alignment;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_program_group_manifest_set_alignment invalid argument\n");
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_group_manifest_get_alignment(
+	const ia_css_program_group_manifest_t *manifest)
+{
+	uint8_t alignment = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_group_manifest_get_alignment(): enter:\n");
+
+	if (manifest != NULL) {
+		alignment = manifest->alignment;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_program_group_manifest_get_alignment invalid argument\n");
+	}
+	return alignment;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+void *ia_css_program_group_manifest_get_private_data(
+	const ia_css_program_group_manifest_t *manifest)
+{
+	void *private_data = NULL;
+
+	IA_CSS_TRACE_1(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_group_manifest_get_private_data(%p): enter:\n",
+		manifest);
+
+	verifexit(manifest != NULL);
+
+	private_data = (void *)((const char *)manifest +
+				manifest->private_data_offset);
+EXIT:
+	if (NULL == manifest) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_program_group_manifest_get_private_data invalid argument\n");
+	}
+	return private_data;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_rbm_manifest_t *ia_css_program_group_manifest_get_rbm_manifest(
+	const ia_css_program_group_manifest_t *manifest)
+{
+	ia_css_rbm_manifest_t *rbm_manifest = NULL;
+
+	IA_CSS_TRACE_1(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_group_manifest_get_rbm_manifest(%p): enter:\n",
+		manifest);
+
+	verifexit(manifest != NULL);
+
+	rbm_manifest = (ia_css_rbm_manifest_t *)((const char *)manifest +
+				manifest->rbm_manifest_offset);
+
+EXIT:
+	if (NULL == manifest) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_program_group_manifest_get_rbm_manifest invalid argument\n");
+	}
+	return rbm_manifest;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_program_manifest_t *
+ia_css_program_group_manifest_get_prgrm_mnfst(
+	const ia_css_program_group_manifest_t *manifest,
+	const unsigned int program_index)
+{
+	ia_css_program_manifest_t *prg_manifest_base;
+	uint8_t *program_manifest = NULL;
+	uint8_t program_count;
+	unsigned int i;
+
+	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_group_manifest_get_prgrm_mnfst(%p,%d): enter:\n",
+		manifest, program_index);
+
+	program_count =
+		ia_css_program_group_manifest_get_program_count(manifest);
+
+	verifexit(manifest != NULL);
+	verifexit(program_index < program_count);
+
+	prg_manifest_base = (ia_css_program_manifest_t *)((char *)manifest +
+		manifest->program_manifest_offset);
+	if (program_index < program_count) {
+		program_manifest = (uint8_t *)prg_manifest_base;
+		for (i = 0; i < program_index; i++) {
+			program_manifest += ((ia_css_program_manifest_t *)
+					program_manifest)->size;
+		}
+	}
+
+EXIT:
+	if (NULL == manifest || program_index >= program_count) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_program_group_manifest_get_prgrm_mnfst invalid argument\n");
+	}
+	return (ia_css_program_manifest_t *)program_manifest;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_data_terminal_manifest_t *
+ia_css_program_group_manifest_get_data_terminal_manifest(
+	const ia_css_program_group_manifest_t *manifest,
+	const unsigned int terminal_index)
+{
+	ia_css_data_terminal_manifest_t *data_terminal_manifest = NULL;
+	ia_css_terminal_manifest_t *terminal_manifest;
+
+	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_group_manifest_get_data_terminal_manifest(%p, %d): enter:\n",
+		manifest, (int)terminal_index);
+
+	terminal_manifest =
+		ia_css_program_group_manifest_get_term_mnfst(manifest,
+			terminal_index);
+
+	verifexit(ia_css_is_terminal_manifest_data_terminal(terminal_manifest));
+
+	data_terminal_manifest =
+		(ia_css_data_terminal_manifest_t *)terminal_manifest;
+EXIT:
+	return data_terminal_manifest;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_param_terminal_manifest_t *
+ia_css_program_group_manifest_get_param_terminal_manifest(
+	const ia_css_program_group_manifest_t *manifest,
+	const unsigned int terminal_index)
+{
+	ia_css_param_terminal_manifest_t *param_terminal_manifest = NULL;
+	ia_css_terminal_manifest_t *terminal_manifest;
+
+	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_group_manifest_get_param_terminal_manifest(%p, %d): enter:\n",
+		manifest, (int)terminal_index);
+
+	terminal_manifest =
+		ia_css_program_group_manifest_get_term_mnfst(manifest,
+			terminal_index);
+
+	verifexit(ia_css_is_terminal_manifest_parameter_terminal(
+			terminal_manifest));
+	param_terminal_manifest =
+		(ia_css_param_terminal_manifest_t *)terminal_manifest;
+EXIT:
+	return param_terminal_manifest;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_spatial_param_terminal_manifest_t *
+ia_css_program_group_manifest_get_spatial_param_terminal_manifest(
+	const ia_css_program_group_manifest_t *manifest,
+	const unsigned int terminal_index)
+{
+	ia_css_spatial_param_terminal_manifest_t *
+		spatial_param_terminal_manifest = NULL;
+	ia_css_terminal_manifest_t *terminal_manifest;
+
+	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_group_manifest_get_spatial_param_terminal_manifest(%p, %d): enter:\n",
+		manifest, (int)terminal_index);
+
+	terminal_manifest =
+		ia_css_program_group_manifest_get_term_mnfst(manifest,
+			terminal_index);
+
+	verifexit(ia_css_is_terminal_manifest_spatial_parameter_terminal(
+			terminal_manifest));
+
+	spatial_param_terminal_manifest =
+		(ia_css_spatial_param_terminal_manifest_t *)terminal_manifest;
+EXIT:
+	return spatial_param_terminal_manifest;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_sliced_param_terminal_manifest_t *
+ia_css_program_group_manifest_get_sliced_param_terminal_manifest(
+	const ia_css_program_group_manifest_t *manifest,
+	const unsigned int terminal_index)
+{
+	ia_css_sliced_param_terminal_manifest_t *
+		sliced_param_terminal_manifest = NULL;
+	ia_css_terminal_manifest_t *terminal_manifest;
+
+	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_group_manifest_get_sliced_param_terminal_manifest(%p, %d): enter:\n",
+		manifest, (int)terminal_index);
+
+	terminal_manifest =
+		ia_css_program_group_manifest_get_term_mnfst(manifest,
+			terminal_index);
+
+	verifexit(ia_css_is_terminal_manifest_sliced_terminal(
+			terminal_manifest));
+
+	sliced_param_terminal_manifest =
+		(ia_css_sliced_param_terminal_manifest_t *)terminal_manifest;
+EXIT:
+	return sliced_param_terminal_manifest;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_program_terminal_manifest_t *
+ia_css_program_group_manifest_get_program_terminal_manifest(
+	const ia_css_program_group_manifest_t *manifest,
+	const unsigned int terminal_index)
+{
+	ia_css_program_terminal_manifest_t *program_terminal_manifest = NULL;
+	ia_css_terminal_manifest_t *terminal_manifest;
+
+	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_group_manifest_get_program_terminal_manifest(%p, %d): enter:\n",
+		manifest, (int)terminal_index);
+
+	terminal_manifest =
+		ia_css_program_group_manifest_get_term_mnfst(manifest,
+			terminal_index);
+
+	verifexit(ia_css_is_terminal_manifest_program_terminal(
+			terminal_manifest));
+
+	program_terminal_manifest =
+		(ia_css_program_terminal_manifest_t *)terminal_manifest;
+ EXIT:
+	return program_terminal_manifest;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_terminal_manifest_t *
+ia_css_program_group_manifest_get_term_mnfst(
+	const ia_css_program_group_manifest_t *manifest,
+	const unsigned int terminal_index)
+{
+	ia_css_terminal_manifest_t *terminal_manifest = NULL;
+	ia_css_terminal_manifest_t *terminal_manifest_base;
+	uint8_t terminal_count;
+	uint8_t i = 0;
+	uint32_t offset;
+
+	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_group_manifest_get_term_mnfst(%p,%d): enter:\n",
+		manifest, (int)terminal_index);
+
+	verifexit(manifest != NULL);
+
+	terminal_count =
+		ia_css_program_group_manifest_get_terminal_count(manifest);
+
+	verifexit(terminal_index < terminal_count);
+
+	terminal_manifest_base =
+		(ia_css_terminal_manifest_t *)((char *)manifest +
+		manifest->terminal_manifest_offset);
+	terminal_manifest = terminal_manifest_base;
+	while (i < terminal_index) {
+		offset =
+		(uint32_t)ia_css_terminal_manifest_get_size(terminal_manifest);
+		terminal_manifest = (ia_css_terminal_manifest_t *)
+				((char *)terminal_manifest + offset);
+		i++;
+	}
+EXIT:
+	return terminal_manifest;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_group_manifest_get_program_count(
+	const ia_css_program_group_manifest_t *manifest)
+{
+	uint8_t program_count = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_group_manifest_get_program_count(): enter:\n");
+
+	if (manifest != NULL) {
+		program_count = manifest->program_count;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_program_group_manifest_get_program_count invalid argument\n");
+	}
+	return program_count;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_group_manifest_get_terminal_count(
+	const ia_css_program_group_manifest_t *manifest)
+{
+	uint8_t terminal_count = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_group_manifest_get_terminal_count(): enter:\n");
+
+	if (manifest != NULL) {
+		terminal_count = manifest->terminal_count;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_program_group_manifest_get_terminal_count invalid argument\n");
+	}
+	return terminal_count;
+}
+
+#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_private.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_private.h
new file mode 100644
index 000000000000..482a5c994bd0
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_private.h
@@ -0,0 +1,278 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_PRIVATE_H
+#define __IA_CSS_PSYS_PROGRAM_GROUP_PRIVATE_H
+
+#include "ia_css_psys_manifest_types.h"
+#include "ia_css_terminal_manifest_types.h"
+#include "ia_css_kernel_bitmap.h"
+#include "ia_css_program_group_data.h"
+#include "vied_nci_psys_resource_model.h"
+#include "ia_css_rbm_manifest_types.h"
+#include <type_support.h>
+#include <math_support.h>
+#include <platform_support.h>
+
+/**
+ * @addtogroup group_psysapi
+ * @{
+ */
+
+#define SIZE_OF_PROGRAM_GROUP_MANIFEST_STRUCT_IN_BITS \
+	((IA_CSS_KERNEL_BITMAP_BITS) \
+	+ (IA_CSS_PROGRAM_GROUP_ID_BITS) \
+	+ (5 * IA_CSS_UINT16_T_BITS) \
+	+ (5 * IA_CSS_UINT8_T_BITS) \
+	+ (5 * IA_CSS_UINT8_T_BITS))
+
+/** @brief Meta-data for a program group
+ *
+ * Describes the contents and layout of the program group
+ * components in memory.
+ *
+ * Offsets are relative to the base address of the program group
+ * manifest object.
+ */
+struct ia_css_program_group_manifest_s {
+	/** Indicate kernels are present in this program group */
+	ia_css_kernel_bitmap_t kernel_bitmap;
+	/** Referral ID to program group FW */
+	ia_css_program_group_ID_t ID;
+	/** Offset to program manifest list.  One entry for each program. */
+	uint16_t program_manifest_offset;
+	/** Offset to terminal manifest list.  One entry for each terminal. */
+	uint16_t terminal_manifest_offset;
+	/** Offset to private data (not part of the official API) */
+	uint16_t private_data_offset;
+	/** Offset to RBM manifest */
+	uint16_t rbm_manifest_offset;
+	/** Size of this structure */
+	uint16_t size;
+	/** Storage alignment requirement (in uint8_t) */
+	uint8_t alignment;
+	/** Total number of kernels in this program group */
+	uint8_t kernel_count;
+	/** Total number of program in this program group */
+	uint8_t program_count;
+	/** Total number of terminals on this program group */
+	uint8_t terminal_count;
+	/** Total number of independent subgraphs in this program group */
+	uint8_t subgraph_count;
+	/** Padding; esnures that rbm_manifest starts on 64bit alignment */
+	uint8_t reserved[5];
+};
+
+#define SIZE_OF_PROGRAM_MANIFEST_EXT_STRUCT_IN_BYTES \
+	((VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
+	+ (VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
+	+ (VIED_NCI_RESOURCE_SIZE_BITS * VIED_NCI_N_DATA_MEM_TYPE_ID * 2) \
+	+ (VIED_NCI_RESOURCE_SIZE_BITS * VIED_NCI_N_DEV_CHN_ID * 2) \
+	+ (2 * IA_CSS_UINT8_T_BITS * IA_CSS_MAX_INPUT_DEC_RESOURCES) \
+	+ (2 * IA_CSS_UINT8_T_BITS * IA_CSS_MAX_OUTPUT_DEC_RESOURCES) \
+	+ (IA_CSS_UINT8_T_BITS * VIED_NCI_N_DEV_DFM_ID) + \
+	+ (N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT * IA_CSS_UINT8_T_BITS))
+
+/** "Extended" meta-data for a single program
+ *
+ * Mostly, if not completely, internal to FW and of no interest to the SW stack.
+ */
+struct ia_css_program_manifest_ext_s {
+#if VIED_NCI_N_DEV_DFM_ID > 0
+	/** DFM port allocation of this program */
+	vied_nci_resource_bitmap_t dfm_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
+	/** Active DFM ports which need a kick
+	 * If an empty port is configured to run in active mode, the empty
+	 * port and the corresponding full port(s) in the stream must be kicked.
+	 * The empty port must always be kicked after the full port.
+	 */
+	vied_nci_resource_bitmap_t dfm_active_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
+#endif
+#if VIED_NCI_N_DATA_MEM_TYPE_ID > 0
+	/** (external) Memory allocation size needs of this program */
+	vied_nci_resource_size_t ext_mem_size[VIED_NCI_N_DATA_MEM_TYPE_ID];
+	vied_nci_resource_size_t ext_mem_offset[VIED_NCI_N_DATA_MEM_TYPE_ID];
+#endif
+#if VIED_NCI_N_DEV_CHN_ID > 0
+	/** Device channel allocation size needs of this program */
+	vied_nci_resource_size_t dev_chn_size[VIED_NCI_N_DEV_CHN_ID];
+	vied_nci_resource_size_t dev_chn_offset[VIED_NCI_N_DEV_CHN_ID];
+#endif
+#if VIED_NCI_N_DEV_DFM_ID > 0
+	/** DFM ports are relocatable if value is set to 1.
+	 * The flag is per dfm port type.
+	 * This will not be supported for now.
+	 */
+	uint8_t is_dfm_relocatable[VIED_NCI_N_DEV_DFM_ID];
+#endif
+#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
+	/** DEC compression flush service entry, describing which streams
+	 *  require flush service handling for decompression (input).
+	 *  @note stream ID's are the ID's used by the MMU
+	 */
+	uint8_t dec_resources_input[IA_CSS_MAX_INPUT_DEC_RESOURCES];
+	/** Association of streams in dec_resources_input with the terminal
+	 *  they belong to.
+	 */
+	uint8_t dec_resources_input_terminal[IA_CSS_MAX_INPUT_DEC_RESOURCES];
+#endif
+#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
+	/** DEC compression flush service entry, describing which streams
+	 *  require flush service handling for compression (output).
+	 *  @note stream ID's are the ID's used by the MMU
+	 */
+	uint8_t dec_resources_output[IA_CSS_MAX_OUTPUT_DEC_RESOURCES];
+	/** Association of streams in dec_resources_output with the terminal
+	 *  they belong to.
+	 */
+	uint8_t dec_resources_output_terminal[IA_CSS_MAX_OUTPUT_DEC_RESOURCES];
+#endif
+/** Padding bytes for 32bit alignment*/
+#if N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT > 0
+	uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT];
+#endif
+};
+
+#define SIZE_OF_PROGRAM_MANIFEST_STRUCT_IN_BITS \
+	(IA_CSS_KERNEL_BITMAP_BITS \
+	+ IA_CSS_PROGRAM_ID_BITS \
+	+ IA_CSS_PROGRAM_TYPE_BITS \
+	+ (1 * IA_CSS_UINT16_T_BITS) \
+	+ (IA_CSS_PROCESS_MAX_CELLS * VIED_NCI_RESOURCE_ID_BITS) \
+	+ (VIED_NCI_RESOURCE_ID_BITS) \
+	+ (6 * IA_CSS_UINT8_T_BITS) \
+	+ (N_PADDING_UINT8_IN_PROGRAM_MANIFEST * IA_CSS_UINT8_T_BITS))
+
+/** Meta-data for a single program
+ *
+ * This structure contains only the information required for resource
+ * management and construction of the process group.
+ */
+struct ia_css_program_manifest_s {
+	/** Indicate which kernels lead to this program being used */
+	ia_css_kernel_bitmap_t kernel_bitmap;
+	/** offset to add to reach parent. This is negative value.*/
+	int16_t parent_offset;
+	uint8_t program_dependency_offset;
+	uint8_t terminal_dependency_offset;
+	/** Size of this structure */
+	uint8_t size;
+	/** offset to ia_css_program_manifest_ext_s, 0 if there is none */
+	uint8_t program_extension_offset;
+	/** Specification of for exclusive or parallel programs */
+	uint8_t program_type; /* ia_css_program_type_t */
+	/** Referral ID to a specific program FW, valid ID's != 0 */
+	ia_css_program_ID_t ID;
+	/** Array of all the cells this program needs */
+	vied_nci_resource_id_t cells[IA_CSS_PROCESS_MAX_CELLS];
+	/** (exclusive) indication of a cell type to be used by this program */
+	vied_nci_resource_id_t cell_type_id;
+	/** Number of programs this program depends on */
+	uint8_t program_dependency_count;
+	/** Number of terminals this program depends on */
+	uint8_t terminal_dependency_count;
+	/** Padding bytes for 32bit alignment*/
+#if N_PADDING_UINT8_IN_PROGRAM_MANIFEST > 0
+	uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_MANIFEST];
+#endif
+};
+
+/*
+ *Calculation for manual size check for struct ia_css_data_terminal_manifest_s
+ */
+#define SIZE_OF_DATA_TERMINAL_MANIFEST_STRUCT_IN_BITS \
+	(SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
+	+ IA_CSS_FRAME_FORMAT_BITMAP_BITS \
+	+ IA_CSS_CONNECTION_BITMAP_BITS \
+	+ IA_CSS_KERNEL_BITMAP_BITS \
+	+ (4 * (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION)) \
+	+ IA_CSS_UINT16_T_BITS \
+	+ IA_CSS_UINT8_T_BITS \
+	+ (4*IA_CSS_UINT8_T_BITS))
+
+/** Meta-data specific for a data terminal
+ *
+ * Contains mostly capability and constraints information
+ */
+struct ia_css_data_terminal_manifest_s {
+	/** Data terminal base */
+	ia_css_terminal_manifest_t base;
+	/** Supported (4CC / MIPI / parameter) formats */
+	ia_css_frame_format_bitmap_t frame_format_bitmap;
+	/** Indicate which kernels lead to this terminal being used */
+	ia_css_kernel_bitmap_t kernel_bitmap;
+	/** Minimum size of the frame */
+	uint16_t min_size[IA_CSS_N_DATA_DIMENSION];
+	/** Maximum size of the frame */
+	uint16_t max_size[IA_CSS_N_DATA_DIMENSION];
+	/** Minimum size of a fragment that the program port can accept */
+	uint16_t min_fragment_size[IA_CSS_N_DATA_DIMENSION];
+	/** Maximum size of a fragment that the program port can accept */
+	uint16_t max_fragment_size[IA_CSS_N_DATA_DIMENSION];
+	/** Indicate if this terminal is derived from a principal terminal
+	 *  @note Can't find meaningful use of this field. */
+	uint16_t terminal_dependency;
+	/** Indicate what (streaming) interface types this terminal supports */
+	ia_css_connection_bitmap_t connection_bitmap;
+	/** Indicates if compression is supported on the data associated with
+	 * this terminal. '1' indicates compression is supported,
+	 * '0' otherwise
+	 */
+	uint8_t compression_support;
+	uint8_t reserved[4];
+};
+
+/* ============  Program Control Init Terminal Manifest - START ============ */
+#define N_PADDING_UINT8_IN_PROGCTRLINIT_MANIFEST_PROGRAM_DESC_STRUCT 4
+struct ia_css_program_control_init_manifest_program_desc_s {
+	uint16_t load_section_count;
+	uint16_t connect_section_count;
+	uint8_t padding[N_PADDING_UINT8_IN_PROGCTRLINIT_MANIFEST_PROGRAM_DESC_STRUCT];
+};
+
+#define N_PADDING_UINT8_IN_PROGCTRLINIT_TERMINAL_MANIFEST_STRUCT 2
+/** Meta-data specific for a program control init terminal
+ *
+ * Program control init terminals have parameters related
+ * to system device (i.e. non-algorithmic devices, like DMA's)
+ * configuration.
+ */
+struct ia_css_program_control_init_terminal_manifest_s {
+	ia_css_terminal_manifest_t base;
+	/** Number of programs in program group.  This terminal can contain
+	 * parameters for each program.  Also size of the array at program_desc_offset.
+	*/
+	uint32_t program_count;
+	/**
+	 * Points to array of ia_css_program_control_init_manifest_program_desc_t
+	 * with size program_count.  The descriptor describes the format of the
+	 * parameter payload, which is sent separately.
+	 */
+	uint16_t program_desc_offset;
+	/** align to 64 */
+	uint8_t padding[N_PADDING_UINT8_IN_PROGCTRLINIT_TERMINAL_MANIFEST_STRUCT];
+};
+/* ============  Program Control Init Terminal Manifest - END ============ */
+
+extern void ia_css_program_manifest_init(
+	ia_css_program_manifest_t	*blob,
+	const uint8_t	program_needs_extension,
+	const uint8_t	program_dependency_count,
+	const uint8_t	terminal_dependency_count);
+
+/** @} */
+
+#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_PRIVATE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.h
new file mode 100644
index 000000000000..778e387c5b73
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.h
@@ -0,0 +1,679 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_H
+#define __IA_CSS_PSYS_PROGRAM_MANIFEST_H
+
+/*! \file */
+
+/** @file ia_css_psys_program_manifest.h
+ *
+ * Define the methods on the program manifest object that are not part of a
+ * single interface.
+ *
+ * @note The "set" functions here are for testing simulation only.
+ * Real manifests are generated in advance and must be considered read-only from
+ * the production user's perspective.
+ */
+
+#include "ia_css_psys_static_storage_class.h"
+
+#include <ia_css_psys_manifest_types.h>
+
+#include <type_support.h>			/* uint8_t */
+
+#include <ia_css_psys_program_manifest.sim.h>
+
+#include <ia_css_psys_program_manifest.hsys.user.h>
+
+#include <ia_css_kernel_bitmap.h>		/* ia_css_kernel_bitmap_t */
+
+/*
+ * Resources needs
+ */
+#include <ia_css_psys_program_manifest.hsys.kernel.h>
+
+#define IA_CSS_PROGRAM_INVALID_DEPENDENCY	((uint8_t)(-1))
+#define IA_CSS_PROGRAM_INVALID_DEC_CONFIG	((uint8_t)(-1))
+
+/** Retrieve extended manifest information generally not visible
+ *  to the SW stack
+ *
+ *  @see ia_css_program_manifest_ext_t
+ *  @note Function only to be used in FW
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_program_manifest_ext_t *ia_css_program_manifest_get_extension(const ia_css_program_manifest_t *program);
+
+/*! Check if the program manifest object specifies a fixed cell allocation
+
+ @param	manifest[in]			program manifest object
+
+ @return has_fixed_cell, false on invalid argument
+ */
+extern bool ia_css_has_program_manifest_fixed_cell(
+	const ia_css_program_manifest_t			*manifest);
+
+/*! Get the stored size of the program manifest object
+
+ @param	manifest[in]			program manifest object
+
+ @return size, 0 on invalid argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+size_t ia_css_program_manifest_get_size(
+	const ia_css_program_manifest_t			*manifest);
+
+/*! Get the program ID of the program manifest object
+
+ @param	manifest[in]			program manifest object
+
+ @return program ID, IA_CSS_PROGRAM_INVALID_ID on invalid argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_program_ID_t ia_css_program_manifest_get_program_ID(
+	const ia_css_program_manifest_t			*manifest);
+
+/*! Set the program ID of the program manifest object
+
+ @param	manifest[in]			program manifest object
+
+ @param program ID
+
+ @return 0 on success, -1 on invalid manifest argument
+ */
+extern int ia_css_program_manifest_set_program_ID(
+	ia_css_program_manifest_t			*manifest,
+	ia_css_program_ID_t id);
+
+/*! Get the (pointer to) the program *group* manifest which contains
+ * this program manifest
+
+ @param	manifest[in]			program manifest object
+
+ @return the pointer to the parent, NULL on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_program_group_manifest_t *ia_css_program_manifest_get_parent(
+	const ia_css_program_manifest_t			*manifest);
+
+/*! Set the offset to the beginning of the program *group* manifest
+ * which contains this program manifest
+
+ @param	manifest[in]			program manifest object
+ @param	program_offset[in]		this program's offset from
+					program_group_manifest's base address.
+
+ @return < 0 on invalid manifest argument
+ */
+extern int ia_css_program_manifest_set_parent_offset(
+	ia_css_program_manifest_t			*manifest,
+	int32_t program_offset);
+
+/*! Get the type of the program manifest object
+
+ @param	manifest[in]			program manifest object
+
+ @return program type, limit value (IA_CSS_N_PROGRAM_TYPES) on invalid manifest
+	argument
+*/
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_program_type_t ia_css_program_manifest_get_type(
+	const ia_css_program_manifest_t			*manifest);
+
+/*! Set the type of the program manifest object
+
+ @param	manifest[in]			program manifest object
+ @param	program_type[in]		program type
+
+ @return < 0 on invalid manifest argument
+ */
+extern int ia_css_program_manifest_set_type(
+	ia_css_program_manifest_t			*manifest,
+	const ia_css_program_type_t			program_type);
+
+/*! Set the cell id of the program manifest object
+
+ @param	manifest[in]			program manifest object
+ @param	program_cell_id[in]		program cell id
+
+ @return < 0 on invalid manifest argument
+  */
+extern int ia_css_program_manifest_set_cell_ID(
+	ia_css_program_manifest_t			*manifest,
+	const vied_nci_cell_ID_t			cell_id);
+
+/*! Set the cell type of the program manifest object
+
+ @param	manifest[in]			program manifest object
+ @param	program_cell_type[in]		program cell type
+
+ @return < 0 on invalid manifest argument
+ */
+extern int ia_css_program_manifest_set_cell_type_ID(
+	ia_css_program_manifest_t			*manifest,
+	const vied_nci_cell_type_ID_t			cell_type_id);
+
+/*!
+ * Get input terminal id [val] at [idx]
+ *
+ * @param	manifest[in]		program manifest object
+ * @param	idx[in]			index
+ *
+ * @return registered terminal_id for idx
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_manifest_get_input_terminal_id(
+	ia_css_program_manifest_t   *manifest,
+	unsigned char                   idx);
+
+/*!
+ * Get output terminal id [val] at [idx]
+ *
+ * @param	manifest[in]		program manifest object
+ * @param	idx[in]			index
+ *
+ * @return registered terminal_id for idx
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_manifest_get_output_terminal_id(
+	ia_css_program_manifest_t   *manifest,
+	unsigned char                    idx);
+
+/*!
+ * Set output terminal id [val] at [idx]
+ *
+ * @param	manifest[in]		program manifest object
+ * @param	idx[in]			index
+ * @param	val[in]			value
+ *
+ */
+extern void ia_css_program_manifest_set_output_terminal_id(
+	ia_css_program_manifest_t   *manifest,
+	uint8_t                    idx,
+	uint8_t                    val);
+
+/*!
+ * Set input terminal id [val] at [idx]
+ *
+ * @param	manifest[in]		program manifest object
+ * @param	idx[in]			index
+ * @param	val[in]			value
+ *
+ */
+extern void ia_css_program_manifest_set_input_terminal_id(
+	ia_css_program_manifest_t   *manifest,
+	uint8_t                    idx,
+	uint8_t                    val);
+
+/*!
+ * Get compression input MMU stream id [val] at [idx]
+ *
+ * @param	manifest[in]		program manifest object
+ * @param	idx[in]			index
+ *
+ * @return registered stream_id for idx
+ */
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_manifest_get_input_stream_id(
+	ia_css_program_manifest_t   *manifest,
+	unsigned char                   idx);
+
+/*!
+ * Get compression output MMU stream id [val] at [idx]
+ *
+ * @param	manifest[in]		program manifest object
+ * @param	idx[in]			index
+ *
+ * @return registered stream_id for idx
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_manifest_get_output_stream_id(
+	ia_css_program_manifest_t   *manifest,
+	unsigned char                    idx);
+
+/*!
+ * Set compression output MMU stream id [val] at [idx]
+ *
+ * @param	manifest[in]		program manifest object
+ * @param	idx[in]			index
+ * @param	val[in]			value
+ *
+ */
+extern void ia_css_program_manifest_set_output_stream_id(
+	ia_css_program_manifest_t   *manifest,
+	uint8_t                    idx,
+	uint8_t                    val);
+
+/*!
+ * Set *compression* input MMU stream id [val] at [idx]
+ *
+ * @param	manifest[in]		program manifest object
+ * @param	idx[in]			index
+ * @param	val[in]			value
+ *
+ */
+extern void ia_css_program_manifest_set_input_stream_id(
+	ia_css_program_manifest_t   *manifest,
+	uint8_t                    idx,
+	uint8_t                    val);
+
+/*! Set cells bitmap for the program
+
+ @param	manifest[in]			program manifest object
+ @param	bitmap[in]				bitmap
+
+ @return 0 when not applicable and/or invalid arguments
+ */
+extern int ia_css_program_manifest_set_cells_bitmap(
+	ia_css_program_manifest_t			*manifest,
+	const vied_nci_resource_bitmap_t	bitmap);
+
+/*! Get cells bitmap for the program
+
+ @param	manifest[in]			program manifest object
+
+ @return 0 when not applicable and/or invalid arguments
+ */
+extern vied_nci_resource_bitmap_t ia_css_program_manifest_get_cells_bitmap(
+	const ia_css_program_manifest_t			*manifest);
+
+/*! Set DFM port bitmap for the program
+
+ @param	manifest[in]			program manifest object
+ @param	dfm_type_id[in]			DFM resource type ID
+ @param	bitmap[in]				bitmap
+
+ @return 0 when not applicable and/or invalid arguments
+ */
+extern int ia_css_program_manifest_set_dfm_port_bitmap(
+	ia_css_program_manifest_t			*manifest,
+	const vied_nci_dev_dfm_id_t			dfm_type_id,
+	const vied_nci_resource_bitmap_t	bitmap);
+#if HAS_DFM
+/*! Get bitmap of DFM ports requested for the program
+
+ @param	manifest[in]			program manifest object
+ @param	dfm_type_id[in]			DFM resource type ID
+
+ @return DFM port bitmap
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_port_bitmap(
+	const ia_css_program_manifest_t			*manifest,
+	const vied_nci_dev_dfm_id_t			dfm_type_id);
+#endif
+
+/*! Set active DFM port specification bitmap for the program
+
+ @param	manifest[in]			program manifest object
+ @param	dfm_type_id[in]			DFM resource type ID
+ @param	bitmap[in]				bitmap
+
+ @return 0 when not applicable and/or invalid arguments
+ */
+extern int ia_css_program_manifest_set_dfm_active_port_bitmap(
+	ia_css_program_manifest_t			*manifest,
+	const vied_nci_dev_dfm_id_t			dfm_type_id,
+	const vied_nci_resource_bitmap_t	bitmap);
+
+#if HAS_DFM
+/*! Get active DFM port specification bitmap for the program
+
+ @param	manifest[in]			program manifest object
+ @param	dfm_type_id[in]			DFM resource type ID
+
+ @return 0 when not applicable and/or invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_active_port_bitmap(
+	const ia_css_program_manifest_t			*manifest,
+	const vied_nci_dev_dfm_id_t			dfm_type_id);
+#endif
+
+/*! Set DFM device relocatability specification for the program
+
+ @param	manifest[in]			program manifest object
+ @param	dfm_type_id[in]			DFM resource type ID
+ @param is_relocatable[in]		1 if dfm device ports are relocatable, 0 otherwise
+
+ @return 0 when not applicable and/or invalid arguments
+ */
+extern int ia_css_program_manifest_set_is_dfm_relocatable(
+	ia_css_program_manifest_t			*manifest,
+	const vied_nci_dev_dfm_id_t			dfm_type_id,
+	const uint8_t						is_relocatable);
+
+#if HAS_DFM
+/*! Get DFM device relocatability specification for the program
+
+ @param	manifest[in]			program manifest object
+ @param	dfm_type_id[in]			DFM resource type ID
+
+ @return 1 if dfm device ports are relocatable, 0 otherwise
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_manifest_get_is_dfm_relocatable(
+	const ia_css_program_manifest_t			*manifest,
+	const vied_nci_dev_dfm_id_t			dfm_type_id);
+#endif
+
+/*! Get the memory resource (size) specification for a memory
+ that belongs to the cell where the program will be mapped
+
+ @param	manifest[in]			program manifest object
+ @param	mem_type_id[in]			mem type ID
+
+ @return 0 when not applicable and/or invalid arguments
+
+ @deprecated Implementation is trival (returns 0) and
+ no known users or known intention for future use.
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_program_manifest_get_int_mem_size(
+	const ia_css_program_manifest_t			*manifest,
+	const vied_nci_mem_type_ID_t			mem_type_id);
+
+/*! Set the memory resource (size) specification for a memory
+ that belongs to the cell where the program will be mapped
+
+ @param	manifest[in]			program manifest object
+ @param	mem_type_id[in]			mem type id
+ @param	int_mem_size[in]		internal memory size
+
+ @return < 0 on invalid arguments
+ @deprecated see ia_css_program_manifest_get_int_mem_size()
+ */
+extern int ia_css_program_manifest_set_int_mem_size(
+	ia_css_program_manifest_t			*manifest,
+	const vied_nci_mem_type_ID_t			mem_type_id,
+	const vied_nci_resource_size_t			int_mem_size);
+
+/*! Get the memory resource (size) specification for a memory
+ that does not belong to the cell where the program will be mapped
+
+ @param	manifest[in]			program manifest object
+ @param	mem_type_id[in]			mem type ID
+
+ @return 0 when not applicable and/or invalid arguments
+
+ @see ia_css_program_manifest_get_ext_mem_offset()
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_size(
+	const ia_css_program_manifest_t			*manifest,
+	const vied_nci_mem_type_ID_t			mem_type_id);
+
+/*! Set the memory resource (size) specification for a memory
+ that does not belong to the cell where the program will be mapped
+
+ @param	manifest[in]			program manifest object
+ @param	mem_type_id[in]			mem type id
+ @param	ext_mem_size[in]		external memory size
+
+ @return < 0 on invalid arguments
+
+ @see ia_css_program_manifest_get_ext_mem_offset()
+ */
+extern int ia_css_program_manifest_set_ext_mem_size(
+	ia_css_program_manifest_t			*manifest,
+	const vied_nci_mem_type_ID_t			mem_type_id,
+	const vied_nci_resource_size_t			ext_mem_size);
+
+#if HAS_DFM
+/*! Get a device channel resource (size) specification
+
+ @param	manifest[in]			program manifest object
+ @param	dev_chn_id[in]			device channel ID
+
+ @return 0 when not applicable and/or invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_size(
+	const ia_css_program_manifest_t			*manifest,
+	const vied_nci_dev_chn_ID_t			dev_chn_id);
+#endif
+
+/*! Set a device channel resource (size) specification
+
+ @param	manifest[in]			program manifest object
+ @param	dev_chn_id[in]			device channel ID
+ @param	dev_chn_size[in]		device channel size
+
+ @return < 0 on invalid arguments
+ */
+extern int ia_css_program_manifest_set_dev_chn_size(
+	ia_css_program_manifest_t			*manifest,
+	const vied_nci_dev_chn_ID_t			dev_chn_id,
+	const vied_nci_resource_size_t			dev_chn_size);
+
+/*! Set a device channel resource (offset) specification
+
+ @param	manifest[in]			program manifest object
+ @param	dev_chn_id[in]			device channel ID
+ @param	dev_chn_offset[in]		device channel offset
+
+ @see ia_css_program_manifest_get_dev_chn_offset()
+
+ @return < 0 on invalid arguments
+ */
+extern int ia_css_program_manifest_set_dev_chn_offset(
+	ia_css_program_manifest_t			*manifest,
+	const vied_nci_dev_chn_ID_t			dev_chn_id,
+	const vied_nci_resource_size_t			dev_chn_offset);
+
+/*! Set the memory resource (offset) specification for a memory
+ that does not belong to the cell where the program will be mapped
+
+ @param	manifest[in]			program manifest object
+ @param	mem_type_id[in]			mem type id
+ @param	ext_mem_offset[in]		external memory offset
+
+ @see ia_css_program_manifest_get_ext_mem_offset()
+
+ @return < 0 on invalid arguments
+ */
+extern int ia_css_program_manifest_set_ext_mem_offset(
+	ia_css_program_manifest_t			*manifest,
+	const vied_nci_mem_type_ID_t			mem_type_id,
+	const vied_nci_resource_size_t			ext_mem_offset);
+
+#if HAS_DFM
+/*! Get a device channel resource (offset) specification
+
+ Used to define a resource dependency on devices that support
+ parallel users via channel multiplexing within the device.
+
+ Channel resources can be "relocatable". That is, some channel
+ is required, but the exact channel is not important and
+ can be assigned at runtime.
+
+ Other channel resources are static "fixed" in advance.  Either
+ each channel is customized for a particular need such that
+ the exact channel needs to be specified.  Alternatively, there
+ are enough channels resources available for the worst case
+ system requirement such that the channels can be statically
+ assigned in advance "fixed" channels.
+
+ Both kinds of resource dependency specification are supported here.
+
+ @param	manifest[in]			program manifest object
+ @param	dev_chn_id[in]			device channel ID
+
+ @return Valid fixed offset (if value is greater or equal to 0) or
+  IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE if offset
+  is relocatable
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_offset(
+	const ia_css_program_manifest_t			*manifest,
+	const vied_nci_dev_chn_ID_t				dev_chn_id);
+#endif
+
+/*! Get the memory resource (offset) specification for a memory
+ that does not belong to the cell where the program will be mapped.
+
+ Memory specified here is typically SRAM within IPU used for
+ intermediate storage during data transfer between processing
+ stages/main memory or as computation scratch space.
+
+ The offset specified essentially defines the location of the memory
+ within the memory device.  It can be fixed in advance (static allocation)
+ or left to the system to determine at runtime.
+
+ @param	manifest[in]			program manifest object
+ @param	mem_type_id[in]			mem type ID
+
+ @return Valid fixed offset (if value is greater or equal to 0) or
+  IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE if offset
+  is relocatable
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_offset(
+	const ia_css_program_manifest_t			*manifest,
+	const vied_nci_mem_type_ID_t			mem_type_id);
+
+/*! Get the kernel composition of the program manifest object
+
+  The collection of kernels described in the bitmap is defined
+  at the program group level. This function returns the subset
+  of kernels that are part of this program.
+ @param	manifest[in]			program manifest object
+
+ @return bitmap, 0 on invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_program_manifest_get_kernel_bitmap(
+	const ia_css_program_manifest_t			*manifest);
+
+/*! Set the kernel dependency of the program manifest object
+
+ @param	manifest[in]			program manifest object
+ @param	kernel_bitmap[in]		kernel composition bitmap
+
+ @return < 0 on invalid arguments
+ */
+extern int ia_css_program_manifest_set_kernel_bitmap(
+	ia_css_program_manifest_t			*manifest,
+	const ia_css_kernel_bitmap_t			kernel_bitmap);
+
+/*! Get the number of programs this programs depends on from the program group
+ * manifest object
+
+ @param	manifest[in]			program manifest object
+
+ @return program dependency count
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_manifest_get_program_dependency_count(
+	const ia_css_program_manifest_t			*manifest);
+
+/*! Get the index of the program which the programs at this index depends on
+    from the program manifest object
+
+ @param	manifest[in]			program manifest object
+
+ @return program dependency,
+	IA_CSS_PROGRAM_INVALID_DEPENDENCY on invalid arguments
+	*/
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_manifest_get_program_dependency(
+	const ia_css_program_manifest_t			*manifest,
+	const unsigned int				index);
+
+/*! Set the index of the program which the programs at this index depends on
+    in the program manifest object
+
+ @param	manifest[in]			program manifest object
+
+ @return program dependency
+ */
+extern int ia_css_program_manifest_set_program_dependency(
+	ia_css_program_manifest_t			*manifest,
+	const uint8_t					program_dependency,
+	const unsigned int				index);
+
+/*! Get the number of terminals this programs depends on from the program group
+ * manifest object
+
+ @param	manifest[in]			program manifest object
+
+ @return program dependency count
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_manifest_get_terminal_dependency_count(
+	const ia_css_program_manifest_t			*manifest);
+
+/*! Get the index of the terminal which the programs at this index depends on
+    from the program manifest object
+
+ @param	manifest[in]			program manifest object
+
+ @return terminal dependency, IA_CSS_PROGRAM_INVALID_DEPENDENCY on error
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+uint8_t ia_css_program_manifest_get_terminal_dependency(
+	const ia_css_program_manifest_t			*manifest,
+	const unsigned int				index);
+
+/*! Set the index of the terminal which the programs at this index depends on
+    in the program manifest object
+
+ @param	manifest[in]			program manifest object
+
+ @return < 0 on invalid arguments
+ */
+extern int ia_css_program_manifest_set_terminal_dependency(
+	ia_css_program_manifest_t			*manifest,
+	const uint8_t					terminal_dependency,
+	const unsigned int				index);
+
+/*! Check if the program manifest object specifies a subnode program
+
+ @param	manifest[in]			program manifest object
+
+ @return is_subnode, false on invalid argument
+ @deprecated for IPU7
+ */
+extern bool ia_css_is_program_manifest_subnode_program_type(
+	const ia_css_program_manifest_t			*manifest);
+
+/*! Check if the program manifest object specifies a supernode program
+
+ @param	manifest[in]			program manifest object
+
+ @return is_supernode, false on invalid argument
+ @deprecated for IPU7
+ */
+extern bool ia_css_is_program_manifest_supernode_program_type(
+	const ia_css_program_manifest_t			*manifest);
+/*! Check if the program manifest object specifies a singular program
+
+ @param	manifest[in]			program manifest object
+
+ @return is_singular, false on invalid argument
+ @deprecated for IPU7
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+bool ia_css_is_program_manifest_singular_program_type(
+	const ia_css_program_manifest_t			*manifest);
+
+#ifdef __IA_CSS_PSYS_STATIC_INLINE__
+#include "ia_css_psys_program_manifest_impl.h"
+#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
+
+#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.kernel.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.kernel.h
new file mode 100644
index 000000000000..25e7bdf40cdb
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.kernel.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_KERNEL_H
+#define __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_KERNEL_H
+
+/*! \file */
+
+/** @file ia_css_psys_program_manifest.hsys.kernel.h
+ *
+ * Define the methods on the program manifest object: Hsys kernel interface
+ */
+
+#include <ia_css_psys_manifest_types.h>
+
+#include <vied_nci_psys_system_global.h>
+
+#include <type_support.h>					/* uint8_t */
+#include "ia_css_psys_static_storage_class.h"
+
+/*
+ * Resources needs
+ */
+
+/*! Get the cell ID from the program manifest object
+
+ @param	manifest[in]			program manifest object
+
+ Note: If the cell ID is specified, the program this manifest belongs to
+ must be mapped on that instance. If the cell ID is invalid (limit value)
+ then the cell type ID must be specified instead
+
+ @return cell ID, limit value if not specified
+ */
+extern
+vied_nci_cell_ID_t ia_css_program_manifest_get_cell_ID(
+	const ia_css_program_manifest_t			*manifest);
+
+/*! Get the cell type ID from the program manifest object
+
+ @param	manifest[in]			program manifest object
+
+ Note: If the cell type ID is specified, the program this manifest belongs
+ to can be mapped on any instance of this clee type. If the cell type ID is
+ invalid (limit value) then a specific cell ID must be specified instead
+
+ @return cell ID, limit value if not specified
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_cell_type_ID_t ia_css_program_manifest_get_cell_type_ID(
+	const ia_css_program_manifest_t			*manifest);
+
+/*! Get the memory resource (size) specification for a memory
+ that belongs to the cell where the program will be mapped
+
+ @param	manifest[in]			program manifest object
+ @param	mem_type_id[in]			mem type ID
+
+ @return 0 when not applicable
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_program_manifest_get_int_mem_size(
+	const ia_css_program_manifest_t			*manifest,
+	const vied_nci_mem_type_ID_t			mem_type_id);
+
+/*! Get the memory resource (size) specification for a memory
+ that does not belong to the cell where the program will be mapped
+
+ @param	manifest[in]			program manifest object
+ @param	mem_type_id[in]			mem type ID
+
+ @return 0 when not applicable
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_size(
+	const ia_css_program_manifest_t			*manifest,
+	const vied_nci_mem_type_ID_t			mem_type_id);
+
+#if HAS_DFM
+/*! Get a device channel resource (size) specification
+
+ @param	manifest[in]			program manifest object
+ @param	dev_chn_id[in]			device channel ID
+
+ @return 0 when not applicable
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_size(
+	const ia_css_program_manifest_t			*manifest,
+	const vied_nci_dev_chn_ID_t				dev_chn_id);
+#endif
+#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_KERNEL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.user.h
new file mode 100644
index 000000000000..96a87f52fabb
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.user.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_USER_H
+#define __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_USER_H
+
+/*! \file */
+
+/** @file ia_css_psys_program_manifest.hsys.user.h
+ *
+ * Define the methods on the program manifest object: Hsys user interface
+ */
+
+#include <ia_css_psys_manifest_types.h>
+
+/*! Print the program manifest object to file/stream
+    in textual format
+
+ @param	manifest[in]			program manifest object
+ @param	fid[out]				file/stream handle
+
+ @return < 0 on error
+ */
+extern int ia_css_program_manifest_print(
+	const ia_css_program_manifest_t	*manifest,
+	void				*fid);
+
+#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_USER_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.sim.h
new file mode 100644
index 000000000000..83000ad4eb97
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.sim.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_SIM_H
+#define __IA_CSS_PSYS_PROGRAM_MANIFEST_SIM_H
+
+/*! \file */
+
+/** @file ia_css_psys_program_manifest.sim.h
+ *
+ * Define the methods on the program manifest object: Simulation only
+ */
+
+#include <ia_css_psys_manifest_types.h>
+
+#include <type_support.h>	/* uint8_t */
+
+/*! Compute the size of storage required for allocating
+ * the program manifest object
+
+ @param program_needs_extension[in]	==1 if program manifest needs an extension struct
+ @param	program_dependency_count[in]	Number of programs this one depends on
+ @param	terminal_dependency_count[in]	Number of terminals this one depends on
+
+ @return 0 on error
+ */
+extern size_t ia_css_sizeof_program_manifest(
+	const uint8_t	program_needs_extension,
+	const uint8_t	program_dependency_count,
+	const uint8_t	terminal_dependency_count);
+
+/*! Create (the storage for) the program manifest object
+
+ @param	program_dependency_count[in]	Number of programs this one depends on
+ @param	terminal_dependency_count[in]	Number of terminals this one depends on
+
+ @return NULL on error
+ */
+extern ia_css_program_manifest_t *ia_css_program_manifest_alloc(
+	const uint8_t	program_dependency_count,
+	const uint8_t	terminal_dependency_count);
+
+/*! Destroy (the storage of) the program manifest object
+
+ @param	manifest[in]			program manifest
+
+ @return NULL
+ */
+extern ia_css_program_manifest_t *ia_css_program_manifest_free(
+	ia_css_program_manifest_t *manifest);
+
+#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_SIM_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest_impl.h
new file mode 100644
index 000000000000..abbc0900d23e
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest_impl.h
@@ -0,0 +1,577 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_IMPL_H
+#define __IA_CSS_PSYS_PROGRAM_MANIFEST_IMPL_H
+
+#include <ia_css_psys_program_manifest.h>
+#include <ia_css_psys_program_group_manifest.h>
+/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_print */
+#include <ia_css_kernel_bitmap.h>
+
+#include <vied_nci_psys_system_global.h>
+#include "ia_css_psys_program_group_private.h"
+#include "ia_css_psys_static_trace.h"
+
+#include <error_support.h>
+#include <misc_support.h>
+#include <storage_class.h>
+#include <math_support.h>
+
+/** Function only to be used in FW */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_program_manifest_ext_t *ia_css_program_manifest_get_extension(const ia_css_program_manifest_t *program)
+{
+	DECLARE_ERRVAL
+	verifexitval(program != NULL, EFAULT);
+	if (program->program_extension_offset != 0) {
+		return (ia_css_program_manifest_ext_t *)((uint8_t *)program + program->program_extension_offset);
+	}
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_program_manifest_get_extension invalid argument\n");
+	}
+	return NULL;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+vied_nci_resource_size_t ia_css_program_manifest_get_int_mem_size(
+	const ia_css_program_manifest_t *manifest,
+	const vied_nci_mem_type_ID_t     mem_type_id)
+{
+	(void)manifest;
+	(void)mem_type_id;
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
+			"ia_css_program_manifest_get_int_mem_size always returns 0"
+			"(internally memory feature not used).\n");
+	return 0;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_manifest_get_input_terminal_id(
+	ia_css_program_manifest_t *manifest,
+	unsigned char              idx)
+{
+	DECLARE_ERRVAL
+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		       "ia_css_program_manifest_get_input_stream_id(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+	verifexitval(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES, EFAULT);
+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
+	if (manifest_ext == NULL) {
+		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+	}
+EXIT:
+	if (!noerror()) {
+		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+	}
+#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
+	return manifest_ext->dec_resources_input_terminal[idx];
+#else
+	(void) idx;
+	return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+#endif
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_manifest_get_output_terminal_id(
+	ia_css_program_manifest_t *manifest,
+	unsigned char              idx)
+{
+	DECLARE_ERRVAL
+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		       "ia_css_program_manifest_get_output_terminal_id(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+	verifexitval(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES, EFAULT);
+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
+	if (manifest_ext == NULL) {
+		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+	}
+EXIT:
+	if (!noerror()) {
+		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+	}
+#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
+	return manifest_ext->dec_resources_output_terminal[idx];
+#else
+	(void) idx;
+	return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+#endif
+
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_manifest_get_input_stream_id(
+	ia_css_program_manifest_t  *manifest,
+	unsigned char               idx)
+{
+	DECLARE_ERRVAL
+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		       "ia_css_program_manifest_get_input_stream_id(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+	verifexitval(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES, EFAULT);
+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
+	if (manifest_ext == NULL) {
+		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+	}
+EXIT:
+	if (!noerror()) {
+		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+	}
+#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
+	return manifest_ext->dec_resources_input[idx];
+#else
+	(void) idx;
+	return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+#endif
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_manifest_get_output_stream_id(
+	ia_css_program_manifest_t *manifest,
+	unsigned char              idx)
+{
+	DECLARE_ERRVAL
+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		       "ia_css_program_manifest_get_output_stream_id(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+	verifexitval(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES, EFAULT);
+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
+	if (manifest_ext == NULL) {
+		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+	}
+EXIT:
+	if (!noerror()) {
+		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+	}
+#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
+	return manifest_ext->dec_resources_output[idx];
+#else
+	(void) idx;
+	return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
+#endif
+}
+
+#if HAS_DFM
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_manifest_get_is_dfm_relocatable(
+	const ia_css_program_manifest_t *manifest,
+	const vied_nci_dev_dfm_id_t      dfm_type_id)
+{
+	DECLARE_ERRVAL
+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_get_is_dfm_relocatable(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+	verifexitval(dfm_type_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
+	if (manifest_ext == NULL) {
+		return 0;
+	}
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		 "ia_css_program_manifest_get_is_dfm_relocatable invalid argument\n");
+		return 0;
+	}
+	return manifest_ext->is_dfm_relocatable[dfm_type_id];
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_port_bitmap(
+	const ia_css_program_manifest_t  *manifest,
+	const vied_nci_dev_dfm_id_t       dfm_type_id)
+{
+	DECLARE_ERRVAL
+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_get_dfm_port_bitmap(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+	verifexitval(dfm_type_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
+	if (manifest_ext == NULL) {
+		return 0;
+	}
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		 "ia_css_program_manifest_get_dfm_port_bitmap invalid argument\n");
+		return 0;
+	}
+	return manifest_ext->dfm_port_bitmap[dfm_type_id];
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_active_port_bitmap(
+	const ia_css_program_manifest_t  *manifest,
+	const vied_nci_dev_dfm_id_t       dfm_type_id)
+{
+	DECLARE_ERRVAL
+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_get_dfm_active_port_bitmap(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+	verifexitval(dfm_type_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
+	if (manifest_ext == NULL) {
+		return 0;
+	}
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		 "ia_css_program_manifest_get_dfm_active_port_bitmap invalid argument\n");
+		return 0;
+	}
+	return manifest_ext->dfm_active_port_bitmap[dfm_type_id];
+}
+#endif /* HAS_DFM */
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_size(
+	const ia_css_program_manifest_t *manifest,
+	const vied_nci_mem_type_ID_t     mem_type_id)
+{
+	DECLARE_ERRVAL
+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		       "ia_css_program_manifest_get_ext_mem_size(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+	verifexitval(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
+	if (manifest_ext == NULL) {
+		return 0;
+	}
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		 "ia_css_program_manifest_get_ext_mem_size invalid argument\n");
+		return 0;
+	}
+	return manifest_ext->ext_mem_size[mem_type_id];
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_offset(
+	const ia_css_program_manifest_t *manifest,
+	const vied_nci_mem_type_ID_t     mem_type_id)
+{
+	DECLARE_ERRVAL
+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		       "ia_css_program_manifest_get_ext_mem_offset(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+	verifexitval(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
+	if (manifest_ext == NULL) {
+		return 0;
+	}
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		 "ia_css_program_manifest_get_ext_mem_offset invalid argument\n");
+		 return 0;
+	}
+	return manifest_ext->ext_mem_offset[mem_type_id];
+}
+
+#if HAS_DFM
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_size(
+	const ia_css_program_manifest_t *manifest,
+	const vied_nci_dev_chn_ID_t      dev_chn_id)
+{
+	DECLARE_ERRVAL
+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_get_dev_chn_size(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+	verifexitval(dev_chn_id < VIED_NCI_N_DEV_CHN_ID, EFAULT);
+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
+	if (manifest_ext == NULL) {
+		return 0;
+	}
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		 "ia_css_program_manifest_get_dev_chn_size invalid argument\n");
+		return 0;
+	}
+	return manifest_ext->dev_chn_size[dev_chn_id];
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_offset(
+	const ia_css_program_manifest_t *manifest,
+	const vied_nci_dev_chn_ID_t      dev_chn_id)
+{
+	DECLARE_ERRVAL
+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_get_dev_chn_offset(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+	verifexitval(dev_chn_id < VIED_NCI_N_DEV_CHN_ID, EFAULT);
+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
+	if (manifest_ext == NULL) {
+		return 0;
+	}
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		 "ia_css_program_manifest_get_dev_chn_offset invalid argument\n");
+		 return 0;
+	}
+	return manifest_ext->dev_chn_offset[dev_chn_id];
+}
+#endif /* HAS_DFM */
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+size_t ia_css_program_manifest_get_size(
+	const ia_css_program_manifest_t *manifest)
+{
+	DECLARE_ERRVAL
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_get_size(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_program_manifest_get_size invalid argument\n");
+		return 0;
+	}
+
+	return manifest->size;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_program_ID_t ia_css_program_manifest_get_program_ID(
+	const ia_css_program_manifest_t *manifest)
+{
+	DECLARE_ERRVAL
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_get_program_ID(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		  "ia_css_program_manifest_get_program_ID invalid argument\n");
+		return IA_CSS_PROGRAM_INVALID_ID;
+	}
+	return manifest->ID;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_program_group_manifest_t *ia_css_program_manifest_get_parent(
+	const ia_css_program_manifest_t *manifest)
+{
+	DECLARE_ERRVAL
+	char *base = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_get_parent(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+
+	base = (char *)((char *)manifest + manifest->parent_offset);
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		  "ia_css_program_manifest_get_parent invalid argument\n");
+		return NULL;
+	}
+	return (ia_css_program_group_manifest_t *)(base);
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+vied_nci_cell_type_ID_t ia_css_program_manifest_get_cell_type_ID(
+	const ia_css_program_manifest_t *manifest)
+{
+	DECLARE_ERRVAL
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_get_cell_type_ID(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		  "ia_css_program_manifest_get_cell_type_ID invalid argument\n");
+		return VIED_NCI_N_CELL_TYPE_ID;
+	}
+	return manifest->cell_type_id;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_program_type_t ia_css_program_manifest_get_type(
+	const ia_css_program_manifest_t *manifest)
+{
+	DECLARE_ERRVAL
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_get_type(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		  "ia_css_program_manifest_get_type invalid argument\n");
+		return IA_CSS_N_PROGRAM_TYPES;
+	}
+	return manifest->program_type;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_manifest_get_terminal_dependency_count(
+	const ia_css_program_manifest_t *manifest)
+{
+	DECLARE_ERRVAL
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_get_terminal_dependency_count(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		  "ia_css_program_manifest_get_terminal_dependency_count invalid argument\n");
+		return 0;
+	}
+	return manifest->terminal_dependency_count;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_manifest_get_terminal_dependency(
+	const ia_css_program_manifest_t *manifest,
+	const unsigned int index)
+{
+	DECLARE_ERRVAL
+	uint8_t *terminal_dep_ptr = NULL;
+	uint8_t terminal_dependency_count;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_get_terminal_dependency(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+	terminal_dependency_count =
+		ia_css_program_manifest_get_terminal_dependency_count(manifest);
+	verifexitval(index < terminal_dependency_count, EFAULT);
+
+	terminal_dep_ptr = (uint8_t *)((uint8_t *)manifest +
+			manifest->terminal_dependency_offset + index);
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_program_manifest_get_terminal_dependency invalid argument\n");
+		return IA_CSS_PROGRAM_INVALID_DEPENDENCY;
+	}
+	return *terminal_dep_ptr;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+bool ia_css_is_program_manifest_singular_program_type(
+	const ia_css_program_manifest_t *manifest)
+{
+	ia_css_program_type_t		program_type;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_is_program_manifest_singular_program_type(): enter:\n");
+
+	program_type = ia_css_program_manifest_get_type(manifest);
+
+/* The error return is the limit value, so no need to check on the manifest
+ * pointer
+ */
+	return (program_type == IA_CSS_PROGRAM_TYPE_SINGULAR);
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_manifest_get_program_dependency_count(
+	const ia_css_program_manifest_t *manifest)
+{
+	DECLARE_ERRVAL
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+	    "ia_css_program_manifest_get_program_dependency_count(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		  "ia_css_program_manifest_get_program_dependency_count invalid argument\n");
+		return 0;
+	}
+	return manifest->program_dependency_count;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+uint8_t ia_css_program_manifest_get_program_dependency(
+	const ia_css_program_manifest_t *manifest,
+	const unsigned int index)
+{
+	DECLARE_ERRVAL
+	uint8_t *program_dep_ptr = NULL;
+	uint8_t program_dependency_count;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_get_program_dependency(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+
+	program_dependency_count =
+		ia_css_program_manifest_get_program_dependency_count(manifest);
+
+	verifexitval(index < program_dependency_count, EFAULT);
+	program_dep_ptr =  (uint8_t *)((uint8_t *)manifest +
+			manifest->program_dependency_offset +
+			index * sizeof(uint8_t));
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		  "ia_css_program_manifest_get_program_dependency invalid argument\n");
+		return IA_CSS_PROGRAM_INVALID_DEPENDENCY;
+	}
+	return *program_dep_ptr;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_program_manifest_get_kernel_bitmap(
+	const ia_css_program_manifest_t *manifest)
+{
+	DECLARE_ERRVAL
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_get_kernel_bitmap(): enter:\n");
+	verifexitval(manifest != NULL, EFAULT);
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		  "ia_css_program_manifest_get_kernel_bitmap invalid argument\n");
+		return ia_css_kernel_bitmap_clear();
+	}
+	return manifest->kernel_bitmap;
+}
+
+#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_storage_class.h
new file mode 100644
index 000000000000..f1ef454e6890
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_storage_class.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+#define __IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+
+#include "storage_class.h"
+
+#ifndef __IA_CSS_PSYS_SIM_INLINE__
+#define IA_CSS_PSYS_SIM_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
+#define IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+#else
+#define IA_CSS_PSYS_SIM_STORAGE_CLASS_H STORAGE_CLASS_INLINE
+#define IA_CSS_PSYS_SIM_STORAGE_CLASS_C STORAGE_CLASS_INLINE
+#endif
+
+#endif /* __IA_CSS_PSYS_SIM_STORAGE_CLASS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_trace.h
new file mode 100644
index 000000000000..e65e354397df
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_trace.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_SIM_TRACE_H
+#define __IA_CSS_PSYS_SIM_TRACE_H
+
+#include "ia_css_psysapi_trace.h"
+
+#define PSYS_SIM_TRACE_LEVEL_CONFIG_DEFAULT	PSYSAPI_TRACE_LOG_LEVEL_OFF
+
+/* Default sub-module tracing config */
+#if (!defined(PSYSAPI_SIM_TRACING_OVERRIDE))
+     #define PSYS_SIM_TRACE_LEVEL_CONFIG PSYS_SIM_TRACE_LEVEL_CONFIG_DEFAULT
+#endif
+
+/* Module/sub-module specific trace setting will be used if
+ * the trace level is not specified from the module or
+  PSYSAPI_SIM_TRACING_OVERRIDE is defined
+ */
+#if (defined(PSYSAPI_SIM_TRACING_OVERRIDE))
+	/* Module/sub-module specific trace setting */
+	#if PSYSAPI_SIM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
+		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
+		#define PSYSAPI_SIM_TRACE_METHOD \
+			IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_SIM_TRACE_LEVEL_ASSERT \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_SIM_TRACE_LEVEL_ERROR \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_SIM_TRACE_LEVEL_WARNING \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_SIM_TRACE_LEVEL_INFO \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_SIM_TRACE_LEVEL_DEBUG \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE \
+			IA_CSS_TRACE_LEVEL_DISABLED
+	#elif PSYSAPI_SIM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
+		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
+		#define PSYSAPI_SIM_TRACE_METHOD \
+			IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_SIM_TRACE_LEVEL_ASSERT \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_SIM_TRACE_LEVEL_ERROR \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_SIM_TRACE_LEVEL_WARNING \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_SIM_TRACE_LEVEL_INFO \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_SIM_TRACE_LEVEL_DEBUG \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE \
+			IA_CSS_TRACE_LEVEL_DISABLED
+	#elif PSYSAPI_SIM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
+		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
+		#define PSYSAPI_SIM_TRACE_METHOD \
+			IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_SIM_TRACE_LEVEL_ASSERT \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_SIM_TRACE_LEVEL_ERROR \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_SIM_TRACE_LEVEL_WARNING \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_SIM_TRACE_LEVEL_INFO \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_SIM_TRACE_LEVEL_DEBUG \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE \
+			IA_CSS_TRACE_LEVEL_ENABLED
+	#else
+		#error "No PSYSAPI_DATA Tracing level defined"
+	#endif
+#else
+	/* Inherit Module trace setting */
+	#define PSYSAPI_SIM_TRACE_METHOD	PSYSAPI_TRACE_METHOD
+	#define PSYSAPI_SIM_TRACE_LEVEL_ASSERT	PSYSAPI_TRACE_LEVEL_ASSERT
+	#define PSYSAPI_SIM_TRACE_LEVEL_ERROR	PSYSAPI_TRACE_LEVEL_ERROR
+	#define PSYSAPI_SIM_TRACE_LEVEL_WARNING	PSYSAPI_TRACE_LEVEL_WARNING
+	#define PSYSAPI_SIM_TRACE_LEVEL_INFO	PSYSAPI_TRACE_LEVEL_INFO
+	#define PSYSAPI_SIM_TRACE_LEVEL_DEBUG	PSYSAPI_TRACE_LEVEL_DEBUG
+	#define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE	PSYSAPI_TRACE_LEVEL_VERBOSE
+#endif
+
+#endif /* __IA_CSS_PSYSAPI_SIM_TRACE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_storage_class.h
new file mode 100644
index 000000000000..b6a4bd600c5b
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_storage_class.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+#define __IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+
+#include "storage_class.h"
+
+#ifndef __IA_CSS_PSYS_STATIC_INLINE__
+#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
+#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+#else
+#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_H STORAGE_CLASS_INLINE
+#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_C STORAGE_CLASS_INLINE
+#endif
+
+#endif /* __IA_CSS_PSYS_STATIC_STORAGE_CLASS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_trace.h
new file mode 100644
index 000000000000..4cf50b81ed52
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_trace.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_STATIC_TRACE_H
+#define __IA_CSS_PSYS_STATIC_TRACE_H
+
+#include "ia_css_psysapi_trace.h"
+
+#define PSYS_STATIC_TRACE_LEVEL_CONFIG_DEFAULT	PSYSAPI_TRACE_LOG_LEVEL_OFF
+
+/* Default sub-module tracing config */
+#if (!defined(PSYSAPI_STATIC_TRACING_OVERRIDE))
+     #define PSYS_STATIC_TRACE_LEVEL_CONFIG \
+	PSYS_STATIC_TRACE_LEVEL_CONFIG_DEFAULT
+#endif
+
+/* Module/sub-module specific trace setting will be used if
+ * the trace level is not specified from the module or
+  PSYSAPI_STATIC_TRACING_OVERRIDE is defined
+ */
+#if (defined(PSYSAPI_STATIC_TRACING_OVERRIDE))
+	/* Module/sub-module specific trace setting */
+	#if PSYSAPI_STATIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
+		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
+		#define PSYSAPI_STATIC_TRACE_METHOD \
+			IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
+			IA_CSS_TRACE_LEVEL_DISABLED
+	#elif PSYSAPI_STATIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
+		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
+		#define PSYSAPI_STATIC_TRACE_METHOD \
+			IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
+			IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
+			IA_CSS_TRACE_LEVEL_DISABLED
+	#elif PSYSAPI_STATIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
+		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
+		#define PSYSAPI_STATIC_TRACE_METHOD \
+			IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
+			IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
+			IA_CSS_TRACE_LEVEL_ENABLED
+	#else
+		#error "No PSYSAPI_DATA Tracing level defined"
+	#endif
+#else
+	/* Inherit Module trace setting */
+	#define PSYSAPI_STATIC_TRACE_METHOD \
+		PSYSAPI_TRACE_METHOD
+	#define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
+		PSYSAPI_TRACE_LEVEL_ASSERT
+	#define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
+		PSYSAPI_TRACE_LEVEL_ERROR
+	#define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
+		PSYSAPI_TRACE_LEVEL_WARNING
+	#define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
+		PSYSAPI_TRACE_LEVEL_INFO
+	#define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
+		PSYSAPI_TRACE_LEVEL_DEBUG
+	#define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
+		PSYSAPI_TRACE_LEVEL_VERBOSE
+#endif
+
+#endif /* __IA_CSS_PSYSAPI_STATIC_TRACE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.h
new file mode 100644
index 000000000000..f6d2cc43c2b6
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.h
@@ -0,0 +1,403 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_TERMINAL_H
+#define __IA_CSS_PSYS_TERMINAL_H
+
+/*! \file */
+
+/** @file ia_css_psys_terminal.h
+ *
+ * Define the methods on the terminal object that are not part of
+ * a single interface
+ */
+
+#include <ia_css_program_group_data.h>	/* ia_css_frame_t */
+#include <ia_css_program_group_param.h>	/* ia_css_program_group_param_t */
+
+#include <ia_css_psys_process_types.h>
+#include <ia_css_psys_manifest_types.h>
+
+#include <type_support.h>		/* bool */
+#include <print_support.h>		/* FILE */
+#include "ia_css_psys_dynamic_storage_class.h"
+#include "ia_css_terminal.h"
+#include "ia_css_terminal_manifest_base_types.h"
+
+/*
+ * Creation
+ */
+#include <ia_css_psys_terminal.hsys.user.h>
+
+/*! Boolean test if the terminal object type is input
+
+ @param	terminal[in]			terminal object
+
+ @return true if the terminal is input, false otherwise or on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_input(
+	const ia_css_terminal_t					*terminal);
+
+/*! Get the stored size of the terminal object
+
+ @param	terminal[in]			terminal object
+
+ @return size, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+size_t ia_css_terminal_get_size(
+	const ia_css_terminal_t					*terminal);
+
+/*! Get the type of the terminal object
+
+ @param	terminal[in]			terminal object
+
+ @return the type of the terminal, limit value on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_terminal_type_t ia_css_terminal_get_type(
+	const ia_css_terminal_t					*terminal);
+
+/*! Set the type of the terminal object
+
+ @param	terminal[in]			terminal object
+ @param	terminal_type[in]		type of the terminal
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_terminal_set_type(
+	ia_css_terminal_t		*terminal,
+	const ia_css_terminal_type_t	terminal_type);
+
+/*! Get the index of the terminal manifest object
+
+ @param	terminal[in]			terminal object
+
+ @return the index of the terminal manifest object, limit value on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint16_t ia_css_terminal_get_terminal_manifest_index(
+	const ia_css_terminal_t					*terminal);
+
+/*! Set the index of the terminal manifest object
+
+ @param	terminal[in]			terminal object
+ @param	tm_index[in]			terminal manifest index
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_terminal_set_terminal_manifest_index(
+	ia_css_terminal_t	*terminal,
+	const uint16_t		tm_index);
+
+/*! Get the payload (buffer) size for all buffers that will be supplied for the terminal
+
+ @param	terminal[in]			terminal object
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint32_t ia_css_terminal_get_payload_size(
+	const ia_css_terminal_t *terminal);
+
+/*! Set the payload (buffer) size for all buffers that will be supplied for the terminal
+
+ @param	terminal[in]			terminal object
+ @param	payload_size[in]		Size of buffer that will be supplied to the terminal
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_terminal_set_payload_size(
+	ia_css_terminal_t *terminal,
+	uint32_t payload_size);
+
+/*! Get id of the terminal object
+
+ @param	terminal[in]			terminal object
+
+ @return id of terminal
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_terminal_ID_t ia_css_terminal_get_ID(
+	const ia_css_terminal_t			*terminal);
+
+/*! Get compressed byte of the data terminal object
+
+ @param	dterminal[in]			data terminal object
+ @param val[out]			is_compressed value
+
+ @@return < 0 on error
+ */
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_data_terminal_is_compressed(
+	const ia_css_data_terminal_t *dterminal,
+	uint8_t *val);
+
+/*! Get kernel id of the data terminal object
+
+ @param	dterminal[in]			data terminal object
+
+ @return kernel id of terminal
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_data_terminal_get_kernel_id(
+	const ia_css_data_terminal_t			*dterminal);
+
+/*! Get the connection type from the terminal object
+
+ @param	terminal[in]			terminal object
+
+ @return buffer type, limit value on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_connection_type_t ia_css_data_terminal_get_connection_type(
+	const ia_css_data_terminal_t	*dterminal);
+
+/*! Set the connection type of the terminal object
+
+ @param	terminal[in]			terminal object
+ @param	connection_type[in]		connection type
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_data_terminal_set_connection_type(
+	ia_css_data_terminal_t				*dterminal,
+	const ia_css_connection_type_t			connection_type);
+
+/*! Get link id of the data terminal object
+
+ @param	dterminal[in]			data terminal object
+
+ @return link id of terminal
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_data_terminal_get_link_id(
+	const ia_css_data_terminal_t			*dterminal);
+
+/*! Set link id of the terminal object
+
+ @param	terminal[in]			data terminal object
+ @param	link_id[in]			synchronization link id
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_data_terminal_set_link_id(
+	ia_css_data_terminal_t				*dterminal,
+	const uint8_t					link_id);
+
+/*! Set stream2gen buffer size used in stream to GEN connection
+ * This function should be called, in case we are in streaming use-case, and
+ * we need to configure the stream2gen_buffer_size to be less than full image's height.
+ * Note, that the stream2gen_buffer_size is set to a defalut value of full image's height
+ * during terminal_create function.
+
+ * @param	terminal[in]			data terminal object
+ * @param	stream2gen_buffer_size[in]		Buffer size (Size's units are lines)
+
+ * @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_data_terminal_set_stream2gen_buffer_size(
+	ia_css_data_terminal_t *dterminal,
+	const uint16_t stream2gen_buffer_size);
+
+/*! Get the (pointer to) the process group parent of the terminal object
+
+ @param	terminal[in]			terminal object
+
+ @return the pointer to the parent, NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_process_group_t *ia_css_terminal_get_parent(
+	const ia_css_terminal_t					*terminal);
+
+/*! Set the (pointer to) the process group parent of the terminal object
+
+ @param	terminal[in]	terminal object
+ @param	parent[in]	(pointer to the) process group parent object
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_terminal_set_parent(
+	ia_css_terminal_t	*terminal,
+	ia_css_process_group_t	*parent);
+
+/*! Boolean test if the terminal object type is valid
+
+ @param	terminal[in]			process terminal object
+ @param	terminal_manifest[in]		program terminal manifest
+
+ @return true if the process terminal object is correct, false on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_valid(
+	const ia_css_terminal_t		 *terminal,
+	const ia_css_terminal_manifest_t *terminal_manifest);
+
+/* ================= Program Control Init Terminal - START ================= */
+
+/*!
+ * Gets the program init terminal descripor size
+ * @param manifest[in]		program control init terminal manifest
+ * @param pg_manifest[in]	program group manifest
+ * @param kernel_bitmap[in]	kernel enable bitmap
+ * @return size, error if < 0.
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+unsigned int
+ia_css_program_control_init_terminal_get_descriptor_size(
+	const ia_css_program_control_init_terminal_manifest_t *manifest,
+	const ia_css_program_group_manifest_t *pg_manifest,
+	ia_css_kernel_bitmap_t kernel_bitmap);
+
+/*!
+ * Initialize program control init terminal
+ * @param nof_fragments[in]	Number of fragments
+ * @param terminal[in]		program control init terminal
+ * @param manifest[in]		program control init terminal manifest
+ * @param pg_manifest[in]	program group manifest
+ * @param kernel_bitmap[in]	kernel enable bitmap
+ * @return < 0 on erro
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int
+ia_css_program_control_init_terminal_init(
+	ia_css_program_control_init_terminal_t *terminal,
+	const ia_css_program_control_init_terminal_manifest_t *manifest,
+	const ia_css_program_group_manifest_t *pg_manifest,
+	ia_css_kernel_bitmap_t kernel_bitmap);
+
+/*!
+ * Get a program desc for a program control init terminal
+  * @param terminal[in]		program control init terminal
+ * @param manifest[in]		program control init terminal manifest
+ * @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_program_control_init_program_desc_t *
+ia_css_program_control_init_terminal_get_program_desc(
+	const ia_css_program_control_init_terminal_t *prog_ctrl_init_terminal,
+	const unsigned int program_index
+);
+
+/*!
+ * Pretty prints the program control init termnial
+ * @param terminal[in]		program control init terminal
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+void ia_css_program_control_init_terminal_print(
+	const ia_css_program_control_init_terminal_t *terminal);
+
+/*!
+ * Returns the number of connect sections per program
+ * @param program_desc[in] program control init terminal program desc
+ * @return number of connect sections
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+unsigned int ia_css_program_control_init_terminal_get_connect_section_count(
+	const ia_css_program_control_init_program_desc_t *program_desc);
+
+/*!
+ * Returns the number of connect sections per program
+ * @param program_desc[in] program control init terminal program desc
+ * @return number of connect sections
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+unsigned int ia_css_program_control_init_terminal_get_load_section_count(
+	const ia_css_program_control_init_program_desc_t *program_desc);
+
+/*!
+ * Returns the memory offset of the first load section in the program
+ * @param program_desc[in] program control init terminal program desc
+ * @return memory offset
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+unsigned int ia_css_program_control_init_terminal_get_load_section_mem_offset(
+	const ia_css_program_control_init_program_desc_t *program_desc);
+
+/*!
+ * Gets a load section desc for a program desc
+ * of a program control init terminal
+ * @param program_desc[in]		program control init terminal program desc
+ * @param load_section_index[in]	section index
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_program_control_init_load_section_desc_t *
+ia_css_program_control_init_terminal_get_load_section_desc(
+	const ia_css_program_control_init_program_desc_t *program_desc,
+	const unsigned int load_section_index
+);
+
+/*!
+ * Gets process_id from program desc
+ * of a program control init terminal
+ * @param program_desc[in]		program control init terminal program desc
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_process_id_t ia_css_program_control_init_terminal_get_process_id(
+	const ia_css_program_control_init_program_desc_t *program_desc);
+
+/*!
+ * Set control info of program desc
+ * of a program control init terminal
+ * @param program_desc[in]	program control init terminal program desc
+ * @param process_id 		unique process id used to identify the process
+ * among all active process
+ * @param num_done_events 	number of events required to close the process
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+void ia_css_program_control_init_terminal_set_control_info(
+	ia_css_program_control_init_program_desc_t *program_desc,
+	ia_css_process_id_t process_id,
+	uint8_t num_done_events);
+
+/*!
+ * Gets num_done_events value from program desc
+ * of a program control init terminal
+ * @param program_desc[in]		program control init terminal program desc
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_program_control_init_terminal_get_num_done_events(
+	const ia_css_program_control_init_program_desc_t *program_desc);
+
+/*!
+ * Gets a connect section desc for a program desc
+ * of a program control init terminal
+ * @param program_desc[in]		program control init terminal program desc
+ * @param connect_section_index[in]	section index
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_program_control_init_connect_section_desc_t *
+ia_css_program_control_init_terminal_get_connect_section_desc(
+	const ia_css_program_control_init_program_desc_t *program_desc,
+	const unsigned int connect_section_index
+);
+
+/* ================= Program Control Init Terminal - END ================= */
+
+#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
+#include "ia_css_psys_terminal_impl.h"
+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
+
+#endif /* __IA_CSS_PSYS_TERMINAL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.hsys.user.h
new file mode 100644
index 000000000000..11db05fb9191
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.hsys.user.h
@@ -0,0 +1,257 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_TERMINAL_HSYS_USER_H
+#define __IA_CSS_PSYS_TERMINAL_HSYS_USER_H
+
+/*! \file */
+
+/** @file ia_css_psys_terminal.hsys.user.h
+ *
+ * Define the methods on the terminal object: Hsys user interface
+ */
+
+#include <ia_css_program_group_data.h>	/* ia_css_frame_t */
+#include <ia_css_program_group_param.h>	/* ia_css_program_group_param_t */
+
+#include <ia_css_psys_process_types.h>
+#include <ia_css_psys_manifest_types.h>
+
+#include <type_support.h>					/* bool */
+#include "ia_css_psys_dynamic_storage_class.h"
+#include "ia_css_terminal.h"
+#include "ia_css_terminal_manifest.h"
+#include "ia_css_kernel_bitmap.h"
+
+/*
+ * Creation
+ */
+
+/*
+ * This source file is created with the intention of sharing and
+ * compiled for host and firmware. Since there is no native 64bit
+ * data type support for firmware this wouldn't compile for SP
+ * tile. The part of the file that is not compilable are marked
+ * with the following __VIED_CELL marker and this comment. Once we
+ * come up with a solution to address this issue this will be
+ * removed.
+ */
+#if !defined(__VIED_CELL)
+/*! Compute the size of storage required for allocating the terminal object
+
+ @param	manifest[in]			terminal manifest
+ @param	param[in]				program group parameters
+
+ @return 0 on error
+ */
+extern size_t ia_css_sizeof_terminal(
+	const ia_css_terminal_manifest_t		*manifest,
+	const ia_css_program_group_param_t		*param);
+
+/*! Create the terminal object
+
+ @param	raw_mem[in]				pre allocated memory
+ @param	manifest[in]			terminal manifest
+ @param	terminal_param[in]		terminal parameter
+ @param enable_bitmap			program group enable bitmap
+
+ @return NULL on error
+ */
+extern ia_css_terminal_t *ia_css_terminal_create(
+	void *raw_mem,
+	const ia_css_terminal_manifest_t		*manifest,
+	const ia_css_terminal_param_t			*terminal_param,
+	ia_css_kernel_bitmap_t				enable_bitmap);
+
+/*! Destroy (the storage of) the process object
+
+ @param	terminal[in]			terminal object
+
+ @return NULL
+ */
+extern ia_css_terminal_t *ia_css_terminal_destroy(
+	ia_css_terminal_t *terminal);
+#endif /* !defined(__VIED_CELL) */
+
+/*! Print the terminal object to file/stream
+
+ @param	terminal[in]			terminal object
+ @param	fid[out]				file/stream handle
+
+ @return < 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_terminal_print(
+	const ia_css_terminal_t					*terminal,
+	void *fid);
+
+/*! Get the (pointer to) the frame object in the terminal object
+
+ @param	terminal[in]			terminal object
+
+ @return the pointer to the frame, NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_frame_t *ia_css_data_terminal_get_frame(
+	const ia_css_data_terminal_t		*terminal);
+
+/*! Get the (pointer to) the frame descriptor object in the terminal object
+
+ @param	terminal[in]			terminal object
+
+ @return the pointer to the frame descriptor, NULL on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_frame_descriptor_t *ia_css_data_terminal_get_frame_descriptor(
+	const ia_css_data_terminal_t		*dterminal);
+
+/*! Get the (pointer to) the fragment descriptor object in the terminal object
+
+ @param	terminal[in]			terminal object
+
+@return the pointer to the fragment descriptor, NULL on error
+*/
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+ia_css_fragment_descriptor_t
+	*ia_css_data_terminal_get_fragment_descriptor(
+		const ia_css_data_terminal_t		*dterminal,
+		const unsigned int			fragment_index);
+
+/*! Get the number of fragments on the terminal
+
+ @param	terminal[in]			terminal object
+
+ @return the fragment count, 0 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint16_t ia_css_data_terminal_get_fragment_count(
+	const ia_css_data_terminal_t		*dterminal);
+
+/*! Get the number of section on the (param)terminal
+ @param	manifest[in]			terminal manifest
+ @param	terminal_param[in]		terminal parameter
+
+ @return the section count, 0 on error
+ */
+extern uint16_t ia_css_param_terminal_compute_section_count(
+	const ia_css_terminal_manifest_t	*manifest,
+	const ia_css_program_group_param_t	*param);
+
+/*! Get the number of planes on the (data)terminal
+ @param	manifest[in]			terminal manifest
+ @param	terminal_param[in]		terminal parameter
+
+ @return the plane count, 1(default) on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+uint8_t ia_css_data_terminal_compute_plane_count(
+	const ia_css_terminal_manifest_t		*manifest,
+	const ia_css_program_group_param_t		*param);
+
+/*! check if given terminal is parameter terminal.
+
+ @param	terminal[in]			(base)terminal object
+
+ @return true on success, false on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_parameter_terminal(
+	const ia_css_terminal_t					*terminal);
+
+/*! check if given terminal is program terminal.
+
+ @program	terminal[in]			(base)terminal object
+
+ @return true on success, false on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_program_terminal(
+	const ia_css_terminal_t					*terminal);
+
+/*! check if given terminal is program control init terminal.
+
+ @program control init	terminal[in]			(base)terminal object
+
+ @return true on success, false on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_program_control_init_terminal(
+	const ia_css_terminal_t					*terminal);
+
+/*! check if given terminal is spatial parameter terminal.
+
+ @spatial	terminal[in]			(base)terminal object
+
+ @return true on success, false on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_spatial_parameter_terminal(
+	const ia_css_terminal_t					*terminal);
+
+/*! check if given terminal is data terminal.
+
+ @param	terminal[in]			(base)terminal object
+
+ @return true on success, false on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_data_terminal(
+	const ia_css_terminal_t					*terminal);
+
+/*! obtain buffer out of terminal(both data & param terminals can call this)
+
+ @param	terminal[in]	(base)terminal object of either data or param terminal.
+
+ @return vied address of buffer stored in terminal
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+vied_vaddress_t  ia_css_terminal_get_buffer(
+		const ia_css_terminal_t *terminal);
+
+/*!store a buffer in the terminal.
+
+ @param	terminal[in]	(base)terminal object of either data or param terminal.
+ @param buffer[in]	buffer in vied (hrt address) space.
+
+ @return 0 on success
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
+int ia_css_terminal_set_buffer(ia_css_terminal_t *terminal,
+				vied_vaddress_t buffer);
+
+/*! Obtain terminal buffer index out of terminal object
+
+ @param	terminal[in]	(base)terminal object of either data or param terminal.
+
+ @return terminal buffer index stored in terminal object on success, -1 on error
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_terminal_get_terminal_index(
+	const ia_css_terminal_t *terminal);
+
+/*! Store a terminal buffer index in the terminal object
+
+ @param	terminal[in]		(base)terminal object of either data or param terminal.
+ @param terminal_index[in]	terminal buffer index
+
+ @return 0 on success
+ */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_terminal_set_terminal_index(
+	ia_css_terminal_t *terminal,
+	unsigned int terminal_index);
+
+#endif /* __IA_CSS_PSYS_TERMINAL_HSYS_USER_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_impl.h
new file mode 100644
index 000000000000..2ca5d1901b95
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_impl.h
@@ -0,0 +1,2053 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_TERMINAL_IMPL_H
+#define __IA_CSS_PSYS_TERMINAL_IMPL_H
+
+#include <ia_css_psys_terminal.h>
+
+#include <ia_css_psys_process_types.h>
+#include <ia_css_psys_terminal_manifest.h>
+
+#include <ia_css_program_group_data.h>
+#include <ia_css_program_group_param.h>
+
+#include <ia_css_psys_process_group.h>
+#include <ia_css_psys_program_group_manifest.h>
+#include <ia_css_psys_process_group.hsys.user.h>
+
+#include <type_support.h>
+#include <error_support.h>	/* for verifexit, verifjmpexit */
+#include <assert_support.h>	/* for COMPILATION_ERROR_IF */
+#include <misc_support.h>	/* for NOT_USED */
+#include "ia_css_psys_terminal_private_types.h"
+#include "ia_css_terminal_manifest_types.h"
+#include "ia_css_psys_dynamic_trace.h"
+#include "ia_css_psys_manifest_types.h"
+#include "ia_css_psys_program_group_private.h"
+#include "ia_css_terminal_types.h"
+
+STORAGE_CLASS_INLINE int ia_css_data_terminal_print(const ia_css_terminal_t *terminal,
+	void *fid) {
+
+	DECLARE_ERRVAL
+	int retval = -1;
+	int i;
+	ia_css_data_terminal_t *dterminal = (ia_css_data_terminal_t *)terminal;
+	uint16_t fragment_count =
+		ia_css_data_terminal_get_fragment_count(dterminal);
+	verifexitval(fragment_count != 0, EINVAL);
+
+	retval = ia_css_frame_descriptor_print(
+		ia_css_data_terminal_get_frame_descriptor(dterminal),
+		fid);
+	verifexitval(retval == 0, EINVAL);
+
+	retval = ia_css_frame_print(
+		ia_css_data_terminal_get_frame(dterminal), fid);
+	verifexitval(retval == 0, EINVAL);
+
+	for (i = 0; i < (int)fragment_count; i++) {
+		retval = ia_css_fragment_descriptor_print(
+			ia_css_data_terminal_get_fragment_descriptor(
+				dterminal, i), fid);
+		verifexitval(retval == 0, EINVAL);
+	}
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+			"stream2gen_buffer_size = %u\n", dterminal->stream2gen_buffer_size);
+
+	retval = 0;
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_print failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_terminal_print(
+	const ia_css_terminal_t *terminal,
+	void *fid)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+	ia_css_terminal_type_t term_type = ia_css_terminal_get_type(terminal);
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_terminal_print(): enter:\n");
+
+	verifexitval(terminal != NULL, EFAULT);
+
+	IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
+		"\tTerminal 0x%lx sizeof %d, typeof %d, parent 0x%lx\n",
+		(unsigned long int)terminal,
+		(int)ia_css_terminal_get_size(terminal),
+		(int)ia_css_terminal_get_type(terminal),
+		(unsigned long int)ia_css_terminal_get_parent(terminal));
+
+	switch (term_type) {
+	case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
+		ia_css_program_control_init_terminal_print(
+			(ia_css_program_control_init_terminal_t *)terminal);
+	break;
+	case IA_CSS_TERMINAL_TYPE_DATA_IN:
+	case IA_CSS_TERMINAL_TYPE_DATA_OUT:
+		ia_css_data_terminal_print(terminal, fid);
+	break;
+	default:
+		/* other terminal prints are currently not supported */
+	break;
+	}
+
+	retval = 0;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_print invalid argument terminal\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_print failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_input(
+	const ia_css_terminal_t *terminal)
+{
+	DECLARE_ERRVAL
+	bool is_input = false;
+	ia_css_terminal_type_t terminal_type;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_is_terminal_input(): enter:\n");
+
+	verifexitval(terminal != NULL, EFAULT);
+
+	terminal_type = ia_css_terminal_get_type(terminal);
+
+	switch (terminal_type) {
+	case IA_CSS_TERMINAL_TYPE_DATA_IN:		/* Fall through */
+	case IA_CSS_TERMINAL_TYPE_STATE_IN:		/* Fall through */
+	case IA_CSS_TERMINAL_TYPE_PARAM_STREAM:		/* Fall through */
+	case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
+	case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
+	case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
+	case IA_CSS_TERMINAL_TYPE_PROGRAM:
+	case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
+		is_input = true;
+		break;
+	case IA_CSS_TERMINAL_TYPE_DATA_OUT:		/* Fall through */
+	case IA_CSS_TERMINAL_TYPE_STATE_OUT:
+	case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
+	case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
+	case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
+		is_input = false;
+		break;
+	default:
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_is_terminal_input: Unknown terminal type (%d)\n",
+			terminal_type);
+		goto EXIT;
+	}
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_is_terminal_input invalid argument\n");
+	}
+	return is_input;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+size_t ia_css_terminal_get_size(
+	const ia_css_terminal_t	*terminal)
+{
+	DECLARE_ERRVAL
+	size_t size = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_terminal_get_size(): enter:\n");
+
+	verifexitval(terminal != NULL, EFAULT);
+
+	size = terminal->size;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_get_size invalid argument\n");
+	}
+	return size;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_terminal_type_t ia_css_terminal_get_type(
+	const ia_css_terminal_t	*terminal)
+{
+	DECLARE_ERRVAL
+	ia_css_terminal_type_t	terminal_type = IA_CSS_N_TERMINAL_TYPES;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_terminal_get_type(): enter:\n");
+
+	verifexitval(terminal != NULL, EFAULT);
+
+	terminal_type = terminal->terminal_type;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_get_type invalid argument\n");
+	}
+	return terminal_type;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_terminal_set_type(
+	ia_css_terminal_t *terminal,
+	const ia_css_terminal_type_t terminal_type)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_terminal_set_type(): enter:\n");
+
+	verifexitval(terminal != NULL, EFAULT);
+
+	terminal->terminal_type = terminal_type;
+
+	retval = 0;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_set_type invalid argument terminal\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_set_type failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint16_t ia_css_terminal_get_terminal_manifest_index(
+	const ia_css_terminal_t *terminal)
+{
+	DECLARE_ERRVAL
+	uint16_t terminal_manifest_index;
+
+	terminal_manifest_index = 0xffff;
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_terminal_get_terminal_manifest_index(): enter:\n");
+
+	verifexitval(terminal != NULL, EFAULT);
+
+	terminal_manifest_index = terminal->tm_index;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_get_terminal_manifest_index: invalid argument\n");
+	}
+	return terminal_manifest_index;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_terminal_set_terminal_manifest_index(
+	ia_css_terminal_t *terminal,
+	const uint16_t terminal_manifest_index)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_terminal_set_terminal_manifest_index(): enter:\n");
+
+	verifexitval(terminal != NULL, EFAULT);
+	terminal->tm_index = terminal_manifest_index;
+
+	retval = 0;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_set_terminal_manifest_index: invalid argument terminal\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_set_terminal_manifest_index: failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint32_t ia_css_terminal_get_payload_size(
+	const ia_css_terminal_t *terminal)
+{
+	DECLARE_ERRVAL
+	uint32_t payload_size;
+
+	payload_size = 0;
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_terminal_get_payload_size(): enter:\n");
+
+	verifexitval(terminal != NULL, EFAULT);
+
+	payload_size = terminal->payload_size;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_get_payload_size: invalid argument\n");
+	}
+	return payload_size;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_terminal_set_payload_size(
+	ia_css_terminal_t *terminal,
+	uint32_t payload_size)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_terminal_set_payload_size(): enter:\n");
+
+	verifexitval(terminal != NULL, EFAULT);
+	terminal->payload_size = payload_size;
+
+	retval = 0;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_set_payload_size: invalid argument terminal\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_set_payload_size: failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_terminal_ID_t ia_css_terminal_get_ID(
+	const ia_css_terminal_t	*terminal)
+{
+	DECLARE_ERRVAL
+	ia_css_terminal_ID_t retval = IA_CSS_TERMINAL_INVALID_ID;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_terminal_get_ID(): enter:\n");
+
+	verifexitval(terminal != NULL, EFAULT);
+
+	retval = terminal->ID;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_get_ID invalid argument\n");
+		retval = 0;
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_data_terminal_get_kernel_id(
+	const ia_css_data_terminal_t *dterminal)
+{
+	DECLARE_ERRVAL
+	uint8_t retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_data_terminal_get_kernel_id(): enter:\n");
+
+	verifexitval(dterminal != NULL, EFAULT);
+
+	retval = dterminal->kernel_id;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_data_terminal_get_kernel_id: invalid argument\n");
+		retval =  0;
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_data_terminal_is_compressed(
+	const ia_css_data_terminal_t *dterminal,
+	uint8_t *val)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+	const ia_css_frame_descriptor_t *frame_descriptor;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_data_terminal_is_compressed enter\n");
+
+	frame_descriptor =
+		ia_css_data_terminal_get_frame_descriptor(dterminal);
+
+	verifexitval(frame_descriptor != NULL, EFAULT);
+
+	*val = frame_descriptor->is_compressed;
+	retval = 0;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_data_terminal_is_compressed: Null frame descriptor\n");
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_connection_type_t ia_css_data_terminal_get_connection_type(
+	const ia_css_data_terminal_t *dterminal)
+{
+	DECLARE_ERRVAL
+	ia_css_connection_type_t connection_type = IA_CSS_N_CONNECTION_TYPES;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_data_terminal_get_connection_type(): enter:\n");
+
+	verifexitval(dterminal != NULL, EFAULT);
+
+	connection_type = dterminal->connection_type;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_data_terminal_get_connection_type: invalid argument\n");
+	}
+	return connection_type;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_data_terminal_get_link_id(
+	const ia_css_data_terminal_t *dterminal)
+{
+	DECLARE_ERRVAL
+	uint8_t link_id = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_data_terminal_get_link_id(): enter:\n");
+
+	verifexitval(dterminal != NULL, EFAULT);
+
+	link_id = dterminal->link_id;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_data_terminal_get_link_id: invalid argument\n");
+	}
+	return link_id;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_data_terminal_set_link_id(
+	ia_css_data_terminal_t *dterminal,
+	const uint8_t link_id)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_data_terminal_set_link_id(): enter:\n");
+
+	verifexitval(dterminal != NULL, EFAULT);
+	dterminal->link_id = link_id;
+
+	retval = 0;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_data_terminal_set_link_id: invalid argument terminal\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_data_terminal_set_link_id: failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_data_terminal_set_connection_type(
+	ia_css_data_terminal_t *dterminal,
+	const ia_css_connection_type_t connection_type)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_data_terminal_set_connection_type(): enter:\n");
+
+	verifexitval(dterminal != NULL, EFAULT);
+
+	dterminal->connection_type = connection_type;
+
+	retval = 0;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_data_terminal_set_connection_type: invalid argument dterminal\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_data_terminal_set_connection_type failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_data_terminal_set_stream2gen_buffer_size(
+	ia_css_data_terminal_t *dterminal,
+	const uint16_t stream2gen_buffer_size)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_data_terminal_set_stream2gen_buffer_size(): enter:\n");
+
+	verifexitval(dterminal != NULL, EFAULT);
+
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, DEBUG,
+		"ia_css_data_terminal_set_stream2gen_buffer_size(): stream2gen_buffer_size = %u\n", stream2gen_buffer_size);
+	dterminal->stream2gen_buffer_size = stream2gen_buffer_size;
+
+	retval = 0;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_data_terminal_set_stream2gen_buffer_size: invalid argument dterminal\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_data_terminal_set_stream2gen_buffer_size failed (%i)\n",
+			retval);
+	}
+
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_process_group_t *ia_css_terminal_get_parent(
+	const ia_css_terminal_t	*terminal)
+{
+	DECLARE_ERRVAL
+	ia_css_process_group_t *parent = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_terminal_get_parent(): enter:\n");
+
+	verifexitval(terminal != NULL, EFAULT);
+	if (terminal->parent_offset == 0) {
+		return NULL;
+	}
+
+	parent = (ia_css_process_group_t *) ((char *)terminal +
+					terminal->parent_offset);
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_get_parent invalid argument\n");
+	}
+	return parent;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_terminal_set_parent(
+	ia_css_terminal_t *terminal,
+	ia_css_process_group_t *parent)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_terminal_set_parent(): enter:\n");
+
+	verifexitval(terminal != NULL, EFAULT);
+	verifexitval(parent != NULL, EFAULT);
+
+	terminal->parent_offset = (uint16_t) ((char *)parent -
+						(char *)terminal);
+
+	retval = 0;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_set_parent invalid argument\n");
+	}
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_set_parent failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_frame_t *ia_css_data_terminal_get_frame(
+	const ia_css_data_terminal_t *dterminal)
+{
+	DECLARE_ERRVAL
+	ia_css_frame_t *frame = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_data_terminal_get_frame(): enter:\n");
+
+	verifexitval(dterminal != NULL, EFAULT);
+
+	frame = (ia_css_frame_t	*)(&(dterminal->frame));
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_data_terminal_get_frame invalid argument\n");
+	}
+	return frame;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_frame_descriptor_t *ia_css_data_terminal_get_frame_descriptor(
+	const ia_css_data_terminal_t *dterminal)
+{
+	DECLARE_ERRVAL
+	ia_css_frame_descriptor_t *frame_descriptor = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_data_terminal_get_frame_descriptor(): enter:\n");
+
+	verifexitval(dterminal != NULL, EFAULT);
+
+	frame_descriptor =
+		(ia_css_frame_descriptor_t *)(&(dterminal->frame_descriptor));
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_data_terminal_get_frame_descriptor: invalid argument\n");
+	}
+	return frame_descriptor;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_fragment_descriptor_t *ia_css_data_terminal_get_fragment_descriptor(
+	const ia_css_data_terminal_t *dterminal,
+	const unsigned int fragment_index)
+{
+	DECLARE_ERRVAL
+	ia_css_fragment_descriptor_t *fragment_descriptor = NULL;
+	uint16_t fragment_count = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_data_terminal_get_frame_descriptor(): enter:\n");
+
+	fragment_count = ia_css_data_terminal_get_fragment_count(dterminal);
+
+	verifexitval(dterminal != NULL, EFAULT);
+	verifexitval(fragment_count != 0, EINVAL);
+	verifexitval(fragment_index < fragment_count, EINVAL);
+
+	fragment_descriptor = (ia_css_fragment_descriptor_t *)
+		((char *)dterminal + dterminal->fragment_descriptor_offset);
+
+	fragment_descriptor += fragment_index;
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_data_terminal_get_frame_descriptor: invalid argument\n");
+	}
+	return fragment_descriptor;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint16_t ia_css_data_terminal_get_fragment_count(
+	const ia_css_data_terminal_t *dterminal)
+{
+	DECLARE_ERRVAL
+	ia_css_process_group_t *parent;
+	uint16_t fragment_count = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_data_terminal_get_fragment_count(): enter:\n");
+
+	parent = ia_css_terminal_get_parent((ia_css_terminal_t *)dterminal);
+
+	verifexitval(dterminal != NULL, EFAULT);
+	verifexitval(parent != NULL, EFAULT);
+
+	fragment_count = ia_css_process_group_get_fragment_count(parent);
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_data_terminal_get_fragment_count: invalid argument\n");
+	}
+	return fragment_count;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_parameter_terminal(
+	const ia_css_terminal_t	*terminal)
+{
+	DECLARE_ERRVAL
+	ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_is_terminal_parameter_terminal(): enter:\n");
+
+	verifexitval(terminal != NULL, EFAULT);
+
+	/* will return an error value on error */
+	terminal_type = ia_css_terminal_get_type(terminal);
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_is_terminal_parameter_terminal: invalid argument\n");
+	}
+	return (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
+		terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT);
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_data_terminal(
+	const ia_css_terminal_t *terminal)
+{
+	DECLARE_ERRVAL
+	ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_is_terminal_data_terminal(): enter:\n");
+
+	verifexitval(terminal != NULL, EFAULT);
+
+	/* will return an error value on error */
+	terminal_type = ia_css_terminal_get_type(terminal);
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_is_terminal_data_terminal invalid argument\n");
+	}
+	return (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN ||
+			terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT);
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_program_terminal(
+	const ia_css_terminal_t *terminal)
+{
+	DECLARE_ERRVAL
+	ia_css_terminal_type_t	terminal_type = IA_CSS_N_TERMINAL_TYPES;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_is_terminal_program_terminal(): enter:\n");
+
+	verifexitval(terminal != NULL, EFAULT);
+
+	/* will return an error value on error */
+	terminal_type = ia_css_terminal_get_type(terminal);
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_is_terminal_program_terminal: invalid argument\n");
+	}
+	return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM);
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_program_control_init_terminal(
+	const ia_css_terminal_t *terminal)
+{
+	DECLARE_ERRVAL
+	ia_css_terminal_type_t	terminal_type = IA_CSS_N_TERMINAL_TYPES;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_is_terminal_program_control_init_terminal(): enter:\n");
+
+	verifexitval(terminal != NULL, EFAULT);
+
+	/* will return an error value on error */
+	terminal_type = ia_css_terminal_get_type(terminal);
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_is_terminal_program_control_init_terminal: invalid argument\n");
+	}
+	return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT);
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_spatial_parameter_terminal(
+	const ia_css_terminal_t *terminal)
+{
+	DECLARE_ERRVAL
+	ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_is_terminal_spatial_parameter_terminal(): enter:\n");
+
+	verifexitval(terminal != NULL, EFAULT);
+
+	/* will return an error value on error */
+	terminal_type = ia_css_terminal_get_type(terminal);
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_is_terminal_spatial_param_terminal: invalid argument\n");
+	}
+	return (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN ||
+		terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT);
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_data_terminal_compute_plane_count(
+	const ia_css_terminal_manifest_t *manifest,
+	const ia_css_program_group_param_t *param)
+{
+	DECLARE_ERRVAL
+	uint8_t	plane_count = 1;
+
+	NOT_USED(manifest);
+	NOT_USED(param);
+
+	verifexitval(manifest != NULL, EFAULT);
+	verifexitval(param != NULL, EFAULT);
+	/* TODO: Implementation Missing*/
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_data_terminal_compute_plane_count(): enter:\n");
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_data_terminal_compute_plane_count: invalid argument\n");
+	}
+	return plane_count;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+vied_vaddress_t  ia_css_terminal_get_buffer(
+	const ia_css_terminal_t *terminal)
+{
+	DECLARE_ERRVAL
+	vied_vaddress_t buffer = VIED_NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_terminal_get_buffer(): enter:\n");
+
+	verifexitval(terminal != NULL, EFAULT);
+	if (ia_css_is_terminal_data_terminal(terminal)) {
+		ia_css_frame_t *frame = ia_css_data_terminal_get_frame(
+					(ia_css_data_terminal_t *)terminal);
+
+		verifexitval(frame != NULL, EFAULT);
+		buffer = ia_css_frame_get_buffer(frame);
+	} else if (ia_css_is_terminal_parameter_terminal(terminal)) {
+		const ia_css_param_terminal_t *param_terminal =
+			(const ia_css_param_terminal_t *)terminal;
+
+		verifexitval(param_terminal != NULL, EFAULT);
+		buffer = param_terminal->param_payload.buffer;
+	}  else if (ia_css_is_terminal_program_terminal(terminal)) {
+		const ia_css_program_terminal_t *program_terminal =
+			(const ia_css_program_terminal_t *)terminal;
+
+		verifexitval(program_terminal != NULL, EFAULT);
+		buffer = program_terminal->param_payload.buffer;
+	}  else if (ia_css_is_terminal_program_control_init_terminal(terminal)) {
+		const ia_css_program_control_init_terminal_t *program_ctrl_init_terminal =
+			(const ia_css_program_control_init_terminal_t *)terminal;
+
+		verifexitval(program_ctrl_init_terminal != NULL, EFAULT);
+		buffer = program_ctrl_init_terminal->param_payload.buffer;
+	} else if (ia_css_is_terminal_spatial_parameter_terminal(terminal)) {
+		const ia_css_spatial_param_terminal_t *spatial_terminal =
+			(const ia_css_spatial_param_terminal_t *)terminal;
+
+		verifexitval(spatial_terminal != NULL, EFAULT);
+		buffer = spatial_terminal->param_payload.buffer;
+	}
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_get_buffer: invalid argument terminal\n");
+	}
+	return buffer;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_terminal_set_buffer(
+	ia_css_terminal_t *terminal,
+	vied_vaddress_t buffer)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+	ia_css_param_terminal_t *pterminal = NULL;
+	ia_css_program_terminal_t *prog_terminal = NULL;
+	ia_css_program_control_init_terminal_t *progctrl_terminal = NULL;
+	ia_css_spatial_param_terminal_t *spatial_terminal = NULL;
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_terminal_set_buffer(): enter:\n");
+
+	if (ia_css_is_terminal_data_terminal(terminal) == true) {
+		/* Currently using Frames inside data terminal ,
+		 * TODO: start directly using data.
+		 */
+		ia_css_data_terminal_t *dterminal =
+			(ia_css_data_terminal_t *)terminal;
+		ia_css_frame_t *frame =
+			ia_css_data_terminal_get_frame(dterminal);
+
+		verifexitval(frame != NULL, EFAULT);
+		retval = ia_css_frame_set_buffer(frame, buffer);
+		verifexitval(retval == 0, EINVAL);
+	} else if (ia_css_is_terminal_parameter_terminal(terminal) == true) {
+		pterminal = (ia_css_param_terminal_t *)terminal;
+		verifexitval(pterminal != NULL, EFAULT);
+		pterminal->param_payload.buffer = buffer;
+		retval = 0;
+	} else if (ia_css_is_terminal_program_terminal(terminal) == true) {
+		prog_terminal = (ia_css_program_terminal_t *)terminal;
+		verifexitval(prog_terminal != NULL, EFAULT);
+		prog_terminal->param_payload.buffer = buffer;
+		retval = 0;
+	} else if (ia_css_is_terminal_program_control_init_terminal(terminal) == true) {
+		progctrl_terminal = (ia_css_program_control_init_terminal_t *)terminal;
+		verifexitval(progctrl_terminal != NULL, EFAULT);
+		progctrl_terminal->param_payload.buffer = buffer;
+		retval = 0;
+	} else if (ia_css_is_terminal_spatial_parameter_terminal(terminal) ==
+			true) {
+		spatial_terminal = (ia_css_spatial_param_terminal_t *)terminal;
+		verifexitval(spatial_terminal != NULL, EFAULT);
+		spatial_terminal->param_payload.buffer = buffer;
+		retval = 0;
+	} else {
+		return retval;
+	}
+
+	retval = 0;
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_set_buffer failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_terminal_get_terminal_index(
+	const ia_css_terminal_t *terminal)
+{
+	DECLARE_ERRVAL
+	int terminal_index = -1;
+	verifexitval(terminal != NULL, EFAULT);
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_terminal_get_terminal_index(): enter:\n");
+
+	if (ia_css_is_terminal_data_terminal(terminal)) {
+		ia_css_frame_t *frame = ia_css_data_terminal_get_frame(
+					(ia_css_data_terminal_t *)terminal);
+
+		verifexitval(frame != NULL, EFAULT);
+		terminal_index = ia_css_frame_get_data_index(frame);
+	} else {
+		if (ia_css_is_terminal_parameter_terminal(terminal)) {
+			const ia_css_param_terminal_t *param_terminal =
+				(const ia_css_param_terminal_t *)terminal;
+			verifexitval(param_terminal != NULL, EFAULT);
+			terminal_index = param_terminal->param_payload.terminal_index;
+		}  else if (ia_css_is_terminal_program_terminal(terminal)) {
+			const ia_css_program_terminal_t *program_terminal =
+				(const ia_css_program_terminal_t *)terminal;
+			verifexitval(program_terminal != NULL, EFAULT);
+			terminal_index = program_terminal->param_payload.terminal_index;
+		}  else if (ia_css_is_terminal_program_control_init_terminal(terminal)) {
+			const ia_css_program_control_init_terminal_t *program_ctrl_init_terminal =
+				(const ia_css_program_control_init_terminal_t *)terminal;
+			verifexitval(program_ctrl_init_terminal != NULL, EFAULT);
+			terminal_index = program_ctrl_init_terminal->param_payload.terminal_index;
+		} else if (ia_css_is_terminal_spatial_parameter_terminal(terminal)) {
+			const ia_css_spatial_param_terminal_t *spatial_terminal =
+				(const ia_css_spatial_param_terminal_t *)terminal;
+			verifexitval(spatial_terminal != NULL, EFAULT);
+			terminal_index = spatial_terminal->param_payload.terminal_index;
+		} else {
+			verifjmpexit(0);
+		}
+	}
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_get_terminal_index: invalid argument\n");
+	}
+	return terminal_index;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int ia_css_terminal_set_terminal_index(
+	ia_css_terminal_t *terminal,
+	unsigned int terminal_index)
+{
+	DECLARE_ERRVAL
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_terminal_set_terminal_index(): enter:\n");
+
+	if (ia_css_is_terminal_data_terminal(terminal) == true) {
+		/* Currently using Frames inside data terminal ,
+		 * TODO: start directly using data.
+		 */
+		ia_css_data_terminal_t *dterminal =
+			(ia_css_data_terminal_t *)terminal;
+		ia_css_frame_t *frame =
+			ia_css_data_terminal_get_frame(dterminal);
+
+		verifexitval(frame != NULL, EFAULT);
+		retval = ia_css_frame_set_data_index(frame, terminal_index);
+		verifexitval(retval == 0, EINVAL);
+	} else {
+		if (ia_css_is_terminal_parameter_terminal(terminal) == true) {
+			ia_css_param_terminal_t *pterminal =
+				(ia_css_param_terminal_t *)terminal;
+
+			pterminal->param_payload.terminal_index = terminal_index;
+			retval = 0;
+		} else if (ia_css_is_terminal_program_terminal(terminal) == true) {
+			ia_css_program_terminal_t *pterminal =
+				(ia_css_program_terminal_t *)terminal;
+
+			pterminal->param_payload.terminal_index = terminal_index;
+			retval = 0;
+		} else if (ia_css_is_terminal_program_control_init_terminal(terminal)
+				== true) {
+			ia_css_program_control_init_terminal_t *pterminal =
+				(ia_css_program_control_init_terminal_t *)terminal;
+
+			pterminal->param_payload.terminal_index = terminal_index;
+			retval = 0;
+		} else if (ia_css_is_terminal_spatial_parameter_terminal(terminal) ==
+				true) {
+			ia_css_spatial_param_terminal_t *pterminal =
+				(ia_css_spatial_param_terminal_t *)terminal;
+
+			pterminal->param_payload.terminal_index = terminal_index;
+			retval = 0;
+		} else {
+			return retval;
+		}
+	}
+
+	retval = 0;
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_set_terminal_index failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+STORAGE_CLASS_INLINE bool ia_css_is_data_terminal_valid(
+	const ia_css_terminal_t *terminal,
+	const ia_css_terminal_manifest_t *terminal_manifest,
+	const uint16_t nof_fragments)
+{
+	DECLARE_ERRVAL
+	bool invalid_flag = false;
+
+	const ia_css_data_terminal_t *dterminal =
+		(ia_css_data_terminal_t *)terminal;
+	const ia_css_data_terminal_manifest_t *dt_manifest =
+		(ia_css_data_terminal_manifest_t *)terminal_manifest;
+	const ia_css_frame_descriptor_t *frame_descriptor;
+	ia_css_frame_format_bitmap_t man_frame_format_bitmap;
+	ia_css_frame_format_bitmap_t proc_frame_format_bitmap;
+	uint16_t max_value[IA_CSS_N_DATA_DIMENSION];
+	uint16_t min_value[IA_CSS_N_DATA_DIMENSION];
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_is_data_terminal_valid enter\n");
+
+	frame_descriptor =
+		ia_css_data_terminal_get_frame_descriptor(dterminal);
+	verifexitval(frame_descriptor != NULL, EFAULT);
+	man_frame_format_bitmap =
+		ia_css_data_terminal_manifest_get_frame_format_bitmap(
+					dt_manifest);
+	proc_frame_format_bitmap =
+		ia_css_frame_format_bit_mask(
+				frame_descriptor->frame_format_type);
+	/*
+	 * TODO: Replace by 'validation of frame format type'.
+	 * Currently frame format type is not correctly set by manifest,
+	 * waiting for HSD 1804260604
+	 */
+	if (man_frame_format_bitmap > 0) {
+		if ((man_frame_format_bitmap &
+					proc_frame_format_bitmap) == 0) {
+			uint32_t *bitmap_arr =
+				(uint32_t *)&man_frame_format_bitmap;
+
+			NOT_USED(bitmap_arr);
+			IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+				"Frame format type not defined in manifest\n");
+			IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
+				" man bitmap_arr[]: %d,%d\n",
+				bitmap_arr[1], bitmap_arr[0]);
+			bitmap_arr = (uint32_t *)&proc_frame_format_bitmap;
+			IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
+				" proc bitmap_arr[]: %d,%d\n",
+				bitmap_arr[1], bitmap_arr[0]);
+		}
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"Frame format bitmap not defined in manifest\n");
+	}
+	ia_css_data_terminal_manifest_get_min_size(dt_manifest, min_value);
+	/*
+	 * TODO: Replace by validation of Minimal frame column dimensions.
+	 *  Currently not correctly set by manifest yet,
+	 *  waiting for HSD 1804260604
+	 */
+	if ((frame_descriptor->dimension[IA_CSS_COL_DIMENSION] <
+		min_value[IA_CSS_COL_DIMENSION])) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"Minimal frame column dimensions not set correctly (by manifest)\n");
+	}
+	/*
+	 * TODO: Replace by validation of Minimal frame row dimensions.
+	 * Currently not correctly set by manifest yet,
+	 * waiting for HSD 1804260604
+	 */
+	if (frame_descriptor->dimension[IA_CSS_ROW_DIMENSION] <
+		min_value[IA_CSS_ROW_DIMENSION]) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"Minimal frame row dimensions not set correctly (by manifest)\n");
+	}
+
+	ia_css_data_terminal_manifest_get_max_size(dt_manifest, max_value);
+	/*
+	 * TODO: Replace by validation of Maximal frame column dimensions.
+	 * Currently not correctly set by manifest yet,
+	 * waiting for HSD 1804260604
+	 */
+	if (frame_descriptor->dimension[IA_CSS_COL_DIMENSION] >
+		max_value[IA_CSS_COL_DIMENSION]) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"Maximal frame column dimensions not set correctly (by manifest)\n");
+	}
+	/*
+	 * TODO: Replace by validation of Maximal frame row dimensions.
+	 * Currently not correctly set by manifest yet,
+	 * waiting for HSD 1804260604
+	 */
+	if (frame_descriptor->dimension[IA_CSS_ROW_DIMENSION] >
+		max_value[IA_CSS_ROW_DIMENSION]) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"Maximal frame row dimensions not set correctly (by manifest)\n");
+	}
+	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, VERBOSE, "min_value: [%d,%d]\n",
+		min_value[IA_CSS_COL_DIMENSION],
+		min_value[IA_CSS_ROW_DIMENSION]);
+	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, VERBOSE, "max_value: [%d,%d]\n",
+		max_value[IA_CSS_COL_DIMENSION],
+		max_value[IA_CSS_ROW_DIMENSION]);
+	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, VERBOSE, "frame dim: [%d,%d]\n",
+		frame_descriptor->dimension[IA_CSS_COL_DIMENSION],
+		frame_descriptor->dimension[IA_CSS_ROW_DIMENSION]);
+	/*
+	 * TODO: Add validation of fragment dimensions.
+	 * Currently not set by manifest yet, waiting for HSD 1804260604
+	 */
+	NOT_USED(nof_fragments);
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_is_data_terminal_valid() invalid argument\n");
+		return false;
+	} else {
+		return (!invalid_flag);
+	}
+}
+
+STORAGE_CLASS_INLINE void ia_css_program_terminal_seq_info_print(
+	const ia_css_kernel_fragment_sequencer_info_manifest_desc_t
+		*man_seq_info_desc,
+	const ia_css_kernel_fragment_sequencer_info_desc_t
+		*term_seq_info_desc)
+{
+	NOT_USED(man_seq_info_desc);
+	NOT_USED(term_seq_info_desc);
+
+	/* slice dimension column */
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"fragment_grid_slice_dimension: %d\n",
+		term_seq_info_desc->
+		fragment_grid_slice_dimension[IA_CSS_COL_DIMENSION]);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"max_fragment_grid_slice_dimension: %d\n",
+		man_seq_info_desc->
+		max_fragment_grid_slice_dimension[IA_CSS_COL_DIMENSION]);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"min_fragment_grid_slice_dimension: %d\n",
+		man_seq_info_desc->
+		min_fragment_grid_slice_dimension[IA_CSS_COL_DIMENSION]);
+
+	/* slice dimension row */
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"fragment_grid_slice_dimension: %d\n",
+		term_seq_info_desc->
+		fragment_grid_slice_dimension[IA_CSS_ROW_DIMENSION]);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"max_fragment_grid_slice_dimension: %d\n",
+		man_seq_info_desc->
+		max_fragment_grid_slice_dimension[IA_CSS_ROW_DIMENSION]);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"min_fragment_grid_slice_dimension: %d\n",
+		man_seq_info_desc->
+		min_fragment_grid_slice_dimension[IA_CSS_ROW_DIMENSION]);
+
+	/* slice count column */
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"fragment_grid_slice_count: %d\n",
+		term_seq_info_desc->
+		fragment_grid_slice_count[IA_CSS_COL_DIMENSION]);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"max_fragment_grid_slice_count: %d\n",
+		man_seq_info_desc->
+		max_fragment_grid_slice_count[IA_CSS_COL_DIMENSION]);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"min_fragment_grid_slice_count: %d\n",
+		man_seq_info_desc->
+		min_fragment_grid_slice_count[IA_CSS_COL_DIMENSION]);
+
+	/* slice count row */
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"fragment_grid_slice_count: %d\n",
+		term_seq_info_desc->
+		fragment_grid_slice_count[IA_CSS_ROW_DIMENSION]);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"max_fragment_grid_slice_count: %d\n",
+		man_seq_info_desc->
+		max_fragment_grid_slice_count[IA_CSS_ROW_DIMENSION]);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"min_fragment_grid_slice_count: %d\n",
+		man_seq_info_desc->
+		min_fragment_grid_slice_count[IA_CSS_ROW_DIMENSION]);
+
+	/* decimation factor column */
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"fragment_grid_point_decimation_factor: %d\n",
+		term_seq_info_desc->
+		fragment_grid_point_decimation_factor[IA_CSS_COL_DIMENSION]);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"max_fragment_grid_point_decimation_factor: %d\n",
+		man_seq_info_desc->
+		max_fragment_grid_point_decimation_factor[IA_CSS_COL_DIMENSION]
+		);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"min_fragment_grid_point_decimation_factor: %d\n",
+		man_seq_info_desc->
+		min_fragment_grid_point_decimation_factor[IA_CSS_COL_DIMENSION]
+		);
+
+	/* decimation factor row */
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"fragment_grid_point_decimation_factor: %d\n",
+		term_seq_info_desc->
+		fragment_grid_point_decimation_factor[IA_CSS_ROW_DIMENSION]);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"max_fragment_grid_point_decimation_factor: %d\n",
+		man_seq_info_desc->
+		max_fragment_grid_point_decimation_factor[
+					IA_CSS_ROW_DIMENSION]);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"min_fragment_grid_point_decimation_factor: %d\n",
+		man_seq_info_desc->
+		min_fragment_grid_point_decimation_factor[
+					IA_CSS_ROW_DIMENSION]);
+
+	/* index column */
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"fragment_grid_overlay_pixel_topleft_index: %d\n",
+		term_seq_info_desc->
+		fragment_grid_overlay_pixel_topleft_index[
+						IA_CSS_COL_DIMENSION]);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"max_fragment_grid_overlay_pixel_topleft_index: %d\n",
+		man_seq_info_desc->
+		max_fragment_grid_overlay_pixel_topleft_index[
+						IA_CSS_COL_DIMENSION]);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"min_fragment_grid_overlay_pixel_topleft_index: %d\n",
+		man_seq_info_desc->
+		min_fragment_grid_overlay_pixel_topleft_index[
+						IA_CSS_COL_DIMENSION]);
+
+	/* index row */
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"fragment_grid_overlay_pixel_topleft_index: %d\n",
+		term_seq_info_desc->
+		fragment_grid_overlay_pixel_topleft_index[
+						IA_CSS_ROW_DIMENSION]);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"max_fragment_grid_overlay_pixel_topleft_index: %d\n",
+		man_seq_info_desc->
+		max_fragment_grid_overlay_pixel_topleft_index[
+						IA_CSS_ROW_DIMENSION]);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"min_fragment_grid_overlay_pixel_topleft_index: %d\n",
+		man_seq_info_desc->
+		min_fragment_grid_overlay_pixel_topleft_index[
+						IA_CSS_ROW_DIMENSION]);
+
+	/* dimension column */
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"fragment_grid_overlay_pixel_dimension: %d\n",
+		term_seq_info_desc->
+		fragment_grid_overlay_pixel_dimension[
+						IA_CSS_COL_DIMENSION]);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"max_fragment_grid_overlay_pixel_dimension: %d\n",
+		man_seq_info_desc->
+		max_fragment_grid_overlay_pixel_dimension[
+						IA_CSS_COL_DIMENSION]);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"min_fragment_grid_overlay_pixel_dimension: %d\n",
+		man_seq_info_desc->
+		min_fragment_grid_overlay_pixel_dimension[
+						IA_CSS_COL_DIMENSION]);
+
+	/* dimension column */
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"fragment_grid_overlay_pixel_dimension: %d\n",
+		term_seq_info_desc->
+		fragment_grid_overlay_pixel_dimension[
+						IA_CSS_ROW_DIMENSION]);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"max_fragment_grid_overlay_pixel_dimension: %d\n",
+		man_seq_info_desc->
+		max_fragment_grid_overlay_pixel_dimension[
+						IA_CSS_ROW_DIMENSION]);
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
+		"min_fragment_grid_overlay_pixel_dimension: %d\n",
+		man_seq_info_desc->
+		min_fragment_grid_overlay_pixel_dimension[
+						IA_CSS_ROW_DIMENSION]);
+}
+
+STORAGE_CLASS_INLINE bool ia_css_is_program_terminal_valid(
+	const ia_css_terminal_t	*terminal,
+	const ia_css_terminal_manifest_t *terminal_manifest,
+	const uint16_t nof_fragments)
+{
+	DECLARE_ERRVAL
+	bool invalid_flag = false;
+	uint16_t frag_idx;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_is_program_terminal_valid enter\n");
+
+	for (frag_idx = 0; frag_idx < nof_fragments; frag_idx++) {
+		uint16_t frag_seq_info_count, seq_idx;
+		const ia_css_program_terminal_t *prog_term;
+		const ia_css_program_terminal_manifest_t *prog_term_man;
+
+		prog_term = (const ia_css_program_terminal_t *)terminal;
+		prog_term_man =
+			(const ia_css_program_terminal_manifest_t *)
+			terminal_manifest;
+		frag_seq_info_count =
+			prog_term_man->
+			kernel_fragment_sequencer_info_manifest_info_count;
+
+		for (seq_idx = 0; seq_idx < frag_seq_info_count; seq_idx++) {
+			const ia_css_kernel_fragment_sequencer_info_desc_t
+			*term_seq_info_desc;
+			const
+			ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
+			man_seq_info_desc;
+
+			term_seq_info_desc =
+		ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
+					prog_term, frag_idx, seq_idx,
+					frag_seq_info_count);
+			verifexitval(term_seq_info_desc != NULL, EFAULT);
+			man_seq_info_desc =
+		ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc
+					(prog_term_man, seq_idx);
+			verifexitval(man_seq_info_desc != NULL, EFAULT);
+
+			ia_css_program_terminal_seq_info_print(
+				man_seq_info_desc, term_seq_info_desc);
+			/* slice dimension column */
+			invalid_flag = invalid_flag ||
+				(term_seq_info_desc->
+				fragment_grid_slice_dimension[
+						IA_CSS_COL_DIMENSION] >
+				man_seq_info_desc->
+				max_fragment_grid_slice_dimension[
+						IA_CSS_COL_DIMENSION]);
+			invalid_flag = invalid_flag ||
+				(term_seq_info_desc->
+				fragment_grid_slice_dimension[
+						IA_CSS_COL_DIMENSION] <
+				man_seq_info_desc->
+				min_fragment_grid_slice_dimension[
+						IA_CSS_COL_DIMENSION]);
+
+			/* slice dimension row */
+			invalid_flag = invalid_flag ||
+				(term_seq_info_desc->
+				fragment_grid_slice_dimension[
+						IA_CSS_ROW_DIMENSION] >
+				man_seq_info_desc->
+				max_fragment_grid_slice_dimension[
+						IA_CSS_ROW_DIMENSION]);
+			invalid_flag = invalid_flag ||
+				(term_seq_info_desc->
+				fragment_grid_slice_dimension[
+						IA_CSS_ROW_DIMENSION] <
+				man_seq_info_desc->
+				min_fragment_grid_slice_dimension[
+						IA_CSS_ROW_DIMENSION]);
+
+			/* slice count column */
+			invalid_flag = invalid_flag ||
+				(term_seq_info_desc->
+				fragment_grid_slice_count[
+						IA_CSS_COL_DIMENSION] >
+				man_seq_info_desc->
+				max_fragment_grid_slice_count[
+						IA_CSS_COL_DIMENSION]);
+			invalid_flag = invalid_flag ||
+				(term_seq_info_desc->
+				fragment_grid_slice_count[
+						IA_CSS_COL_DIMENSION] <
+				man_seq_info_desc->
+				min_fragment_grid_slice_count[
+						IA_CSS_COL_DIMENSION]);
+
+			/* slice count row */
+			invalid_flag = invalid_flag ||
+				(term_seq_info_desc->
+				fragment_grid_slice_count[
+						IA_CSS_ROW_DIMENSION] >
+				man_seq_info_desc->
+				max_fragment_grid_slice_count[
+						IA_CSS_ROW_DIMENSION]);
+			invalid_flag = invalid_flag ||
+				(term_seq_info_desc->
+				fragment_grid_slice_count[
+						IA_CSS_ROW_DIMENSION] <
+				man_seq_info_desc->
+				min_fragment_grid_slice_count[
+						IA_CSS_ROW_DIMENSION]);
+
+			/* decimation factor column */
+			invalid_flag = invalid_flag ||
+				(term_seq_info_desc->
+				fragment_grid_point_decimation_factor[
+						IA_CSS_COL_DIMENSION] >
+				man_seq_info_desc->
+				max_fragment_grid_point_decimation_factor[
+						IA_CSS_COL_DIMENSION]);
+			invalid_flag = invalid_flag ||
+				(term_seq_info_desc->
+				fragment_grid_point_decimation_factor[
+						IA_CSS_COL_DIMENSION] <
+				man_seq_info_desc->
+				min_fragment_grid_point_decimation_factor[
+						IA_CSS_COL_DIMENSION]);
+
+			/* decimation factor row */
+			invalid_flag = invalid_flag ||
+				(term_seq_info_desc->
+				fragment_grid_point_decimation_factor[
+						IA_CSS_ROW_DIMENSION] >
+				man_seq_info_desc->
+				max_fragment_grid_point_decimation_factor[
+						IA_CSS_ROW_DIMENSION]);
+			invalid_flag = invalid_flag ||
+				(term_seq_info_desc->
+				fragment_grid_point_decimation_factor[
+						IA_CSS_ROW_DIMENSION] <
+				man_seq_info_desc->
+				min_fragment_grid_point_decimation_factor[
+						IA_CSS_ROW_DIMENSION]);
+
+			/* index column */
+			invalid_flag = invalid_flag ||
+				(term_seq_info_desc->
+				fragment_grid_overlay_pixel_topleft_index[
+						IA_CSS_COL_DIMENSION] >
+				man_seq_info_desc->
+				max_fragment_grid_overlay_pixel_topleft_index[
+						IA_CSS_COL_DIMENSION]);
+			invalid_flag = invalid_flag ||
+				(term_seq_info_desc->
+				fragment_grid_overlay_pixel_topleft_index[
+						IA_CSS_COL_DIMENSION] <
+				man_seq_info_desc->
+				min_fragment_grid_overlay_pixel_topleft_index[
+						IA_CSS_COL_DIMENSION]);
+
+			/* index row */
+			invalid_flag = invalid_flag ||
+				(term_seq_info_desc->
+				fragment_grid_overlay_pixel_topleft_index[
+						IA_CSS_ROW_DIMENSION] >
+				man_seq_info_desc->
+				max_fragment_grid_overlay_pixel_topleft_index[
+						IA_CSS_ROW_DIMENSION]);
+			invalid_flag = invalid_flag ||
+				(term_seq_info_desc->
+				fragment_grid_overlay_pixel_topleft_index[
+						IA_CSS_ROW_DIMENSION] <
+				man_seq_info_desc->
+				min_fragment_grid_overlay_pixel_topleft_index[
+						IA_CSS_ROW_DIMENSION]);
+
+			/* dimension column */
+			invalid_flag = invalid_flag ||
+				(term_seq_info_desc->
+				fragment_grid_overlay_pixel_dimension[
+						IA_CSS_COL_DIMENSION] >
+				man_seq_info_desc->
+				max_fragment_grid_overlay_pixel_dimension[
+						IA_CSS_COL_DIMENSION]);
+			invalid_flag = invalid_flag ||
+				(term_seq_info_desc->
+				fragment_grid_overlay_pixel_dimension[
+						IA_CSS_COL_DIMENSION] <
+				man_seq_info_desc->
+				min_fragment_grid_overlay_pixel_dimension[
+						IA_CSS_COL_DIMENSION]);
+
+			/* dimension column */
+			invalid_flag = invalid_flag ||
+				(term_seq_info_desc->
+				fragment_grid_overlay_pixel_dimension[
+						IA_CSS_ROW_DIMENSION] >
+				man_seq_info_desc->
+				max_fragment_grid_overlay_pixel_dimension[
+						IA_CSS_ROW_DIMENSION]);
+			invalid_flag = invalid_flag ||
+				(term_seq_info_desc->
+				fragment_grid_overlay_pixel_dimension[
+						IA_CSS_ROW_DIMENSION] <
+				man_seq_info_desc->
+				min_fragment_grid_overlay_pixel_dimension[
+						IA_CSS_ROW_DIMENSION]);
+		}
+	}
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_is_program_terminal_valid() invalid argument\n");
+		return false;
+	}
+	if (invalid_flag == true) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_is_program_terminal_valid(): validation failed\n");
+		/* TODO: program terminal parameters not correctly defined,
+		 * disable validation result until issues has been solved
+		 */
+		return true;
+	}
+	return (!invalid_flag);
+}
+
+STORAGE_CLASS_INLINE bool ia_css_is_sliced_terminal_valid(
+	const ia_css_terminal_t *terminal,
+	const ia_css_terminal_manifest_t *terminal_manifest,
+	const uint16_t nof_fragments)
+{
+	DECLARE_ERRVAL
+	bool invalid_flag = false;
+	uint16_t frag_idx;
+
+	uint16_t slice_idx, section_idx;
+
+	const ia_css_sliced_param_terminal_t *sliced_term =
+		(const ia_css_sliced_param_terminal_t *)terminal;
+	verifexitval(sliced_term != NULL, EFAULT);
+	const ia_css_sliced_param_terminal_manifest_t *sliced_term_man =
+		(const ia_css_sliced_param_terminal_manifest_t *)
+		terminal_manifest;
+	verifexitval(sliced_term_man != NULL, EFAULT);
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_is_sliced_terminal_valid enter\n");
+
+	for (frag_idx = 0; frag_idx < nof_fragments; frag_idx++) {
+		const ia_css_fragment_slice_desc_t *fragment_slice_desc =
+			ia_css_sliced_param_terminal_get_fragment_slice_desc(
+				sliced_term, frag_idx);
+
+		verifexitval(fragment_slice_desc != NULL, EFAULT);
+
+		for (slice_idx = 0;
+			slice_idx < fragment_slice_desc->slice_count;
+			slice_idx++) {
+			for (section_idx = 0;
+				section_idx <
+				sliced_term_man->sliced_param_section_count;
+				section_idx++) {
+				const
+				ia_css_sliced_param_manifest_section_desc_t *
+					slice_man_section_desc;
+				const ia_css_slice_param_section_desc_t *
+					slice_section_desc;
+
+				slice_man_section_desc =
+		ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
+						sliced_term_man, section_idx);
+				slice_section_desc =
+		ia_css_sliced_param_terminal_get_slice_param_section_desc(
+						sliced_term, frag_idx,
+						slice_idx, section_idx,
+						sliced_term_man->
+						sliced_param_section_count);
+				verifexitval(slice_man_section_desc != NULL, EFAULT);
+				verifexitval(slice_section_desc != NULL, EFAULT);
+
+				invalid_flag = invalid_flag ||
+					(slice_section_desc->mem_size >
+					slice_man_section_desc->max_mem_size);
+			}
+		}
+	}
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+				"ia_css_is_sliced_terminal_valid() invalid argument\n");
+		return false;
+	} else {
+		return (!invalid_flag);
+	}
+
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_valid(
+	const ia_css_terminal_t	*terminal,
+	const ia_css_terminal_manifest_t *terminal_manifest)
+{
+	DECLARE_ERRVAL
+	bool is_valid = false;
+	uint16_t nof_fragments;
+	ia_css_terminal_type_t terminal_type = IA_CSS_TERMINAL_INVALID_ID;
+
+	verifexitval(NULL != terminal, EFAULT);
+	verifexitval(NULL != terminal_manifest, EFAULT);
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_is_terminal_valid enter\n");
+
+	nof_fragments = ia_css_data_terminal_get_fragment_count(
+				(const ia_css_data_terminal_t *)terminal);
+	terminal_type = ia_css_terminal_get_type(terminal);
+
+	switch (terminal_type) {
+	case IA_CSS_TERMINAL_TYPE_DATA_IN:
+	case IA_CSS_TERMINAL_TYPE_DATA_OUT:
+		is_valid = ia_css_is_data_terminal_valid(terminal,
+				terminal_manifest, nof_fragments);
+		break;
+	case IA_CSS_TERMINAL_TYPE_PROGRAM:
+		is_valid = ia_css_is_program_terminal_valid(terminal,
+				terminal_manifest, nof_fragments);
+		break;
+	case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
+	case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
+	case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
+	case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
+	case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
+		/* Nothing to be validated for cached and spatial
+		*  parameters, return valid
+		*/
+		is_valid = true;
+		break;
+	case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
+	case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
+		is_valid = ia_css_is_sliced_terminal_valid(terminal,
+				terminal_manifest, nof_fragments);
+		break;
+	default:
+		/* Terminal type unknown, return invalid */
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_is_terminal_valid() Terminal type %x unknown\n",
+			(int)terminal_type);
+		is_valid = false;
+		break;
+	}
+
+EXIT:
+	if (haserror(EFAULT)) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_is_terminal_valid() invalid argument\n");
+		return false;
+	}
+	/* TODO: to be removed once all PGs pass validation */
+	if (is_valid == false) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+			"ia_css_is_terminal_valid(): type: %d validation failed\n",
+			terminal_type);
+	}
+	return is_valid;
+}
+
+/* ================= Program Control Init Terminal - START ================= */
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+int
+ia_css_program_control_init_terminal_init(
+	ia_css_program_control_init_terminal_t *terminal,
+	const ia_css_program_control_init_terminal_manifest_t *manifest,
+	const ia_css_program_group_manifest_t *pg_manifest,
+	ia_css_kernel_bitmap_t kernel_bitmap)
+{
+	int retval = -1;
+	unsigned int i;
+	unsigned int base_load_sec;
+	unsigned int base_connect_sec;
+	unsigned int load_index = 0;
+	unsigned int connect_index = 0;
+	unsigned int load_section_count = 0;
+	unsigned int connect_section_count = 0;
+
+	ia_css_program_control_init_manifest_program_desc_t *man_progs;
+	ia_css_program_manifest_t *prog_manifest;
+
+	verifjmpexit(terminal != NULL);
+
+	man_progs =
+	ia_css_program_control_init_terminal_manifest_get_program_desc(manifest, 0);
+	verifjmpexit(man_progs != NULL);
+
+	for (i = 0; i < manifest->program_count; i++) {
+		prog_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest, i);
+		verifjmpexit(prog_manifest != NULL);
+		if (!ia_css_process_group_is_program_enabled(prog_manifest, kernel_bitmap)) {
+			continue;
+		}
+		load_section_count += man_progs[i].load_section_count;
+		connect_section_count += man_progs[i].connect_section_count;
+	}
+
+	terminal->program_count = manifest->program_count;
+	terminal->program_section_desc_offset =
+		sizeof(ia_css_program_control_init_terminal_t);
+
+	base_load_sec = /* base_load_sec relative to first program */
+		terminal->program_count *
+		sizeof(ia_css_program_control_init_program_desc_t);
+
+	base_connect_sec = base_load_sec +
+		load_section_count *
+		sizeof(ia_css_program_control_init_load_section_desc_t);
+
+	for (i = 0; i < terminal->program_count; i++) {
+		ia_css_program_control_init_program_desc_t *prog;
+
+		prog = ia_css_program_control_init_terminal_get_program_desc(
+				terminal, i);
+		verifjmpexit(prog != NULL);
+
+		prog_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest, i);
+		verifjmpexit(prog_manifest != NULL);
+		if (!ia_css_process_group_is_program_enabled(prog_manifest, kernel_bitmap)) {
+			prog->load_section_count = 0;
+			prog->connect_section_count = 0;
+			prog->load_section_desc_offset = 0;
+			prog->connect_section_desc_offset  = 0;
+			continue;
+		}
+
+		prog->load_section_count = man_progs[i].load_section_count;
+		prog->connect_section_count = man_progs[i].connect_section_count;
+
+		prog->load_section_desc_offset =
+			base_load_sec +
+			load_index *
+			sizeof(ia_css_program_control_init_load_section_desc_t) -
+			i * sizeof(ia_css_program_control_init_program_desc_t);
+		prog->connect_section_desc_offset =
+			base_connect_sec +
+			connect_index *
+			sizeof(ia_css_program_control_init_connect_section_desc_t) -
+			i * sizeof(ia_css_program_control_init_program_desc_t);
+
+		load_index += man_progs[i].load_section_count;
+		connect_index += man_progs[i].connect_section_count;
+	}
+	retval = 0;
+EXIT:
+	return retval;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+unsigned int
+ia_css_program_control_init_terminal_get_descriptor_size(
+		const ia_css_program_control_init_terminal_manifest_t *manifest,
+		const ia_css_program_group_manifest_t *pg_manifest,
+		ia_css_kernel_bitmap_t kernel_bitmap)
+{
+	unsigned int i;
+	unsigned size = 0;
+	unsigned load_section_count = 0;
+	unsigned connect_section_count = 0;
+	ia_css_program_control_init_manifest_program_desc_t *man_progs;
+	ia_css_program_manifest_t *prog_manifest;
+	verifjmpexit(manifest != NULL);
+
+	man_progs =
+		ia_css_program_control_init_terminal_manifest_get_program_desc(
+			manifest, 0);
+	verifjmpexit(man_progs != NULL);
+
+	for (i = 0; i < manifest->program_count; i++) {
+		prog_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest, i);
+		verifjmpexit(prog_manifest != NULL);
+		if (!ia_css_process_group_is_program_enabled(prog_manifest, kernel_bitmap)) {
+			continue;
+		}
+		load_section_count += man_progs[i].load_section_count;
+		connect_section_count += man_progs[i].connect_section_count;
+	}
+
+	size = sizeof(ia_css_program_control_init_terminal_t) +
+		manifest->program_count *
+		sizeof(struct ia_css_program_control_init_program_desc_s) +
+		load_section_count *
+		sizeof(struct ia_css_program_control_init_load_section_desc_s) +
+		connect_section_count  *
+		sizeof(struct ia_css_program_control_init_connect_section_desc_s);
+EXIT:
+	return size;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+void ia_css_program_control_init_terminal_print(
+	const ia_css_program_control_init_terminal_t *terminal)
+{
+	unsigned int prog_idx, sec_idx;
+	ia_css_program_control_init_program_desc_t *prog;
+	ia_css_program_control_init_load_section_desc_t *load_sec;
+	ia_css_program_control_init_connect_section_desc_t *connect_sec;
+	unsigned mem_offset;
+	verifjmpexit(terminal != NULL);
+
+	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
+		"program_count: %d, payload_fragment_stride: %d\n",
+		terminal->program_count,
+		terminal->payload_fragment_stride);
+
+	for (prog_idx = 0; prog_idx < terminal->program_count; prog_idx++) {
+		prog = ia_css_program_control_init_terminal_get_program_desc(
+			terminal, prog_idx);
+		verifjmpexit(prog != NULL);
+		mem_offset = ia_css_program_control_init_terminal_get_load_section_mem_offset(prog);
+
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO, "program_idx: %d\n", prog_idx);
+		IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO, "\tprocess_id: %d, num_done_events: %d\n",
+			prog->control_info.process_id,
+			prog->control_info.num_done_events);
+
+		if (prog->load_section_count > 0) {
+			IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO, "\tload_sections:\n");
+		}
+		for (sec_idx = 0; sec_idx < prog->load_section_count; sec_idx++) {
+			load_sec =
+				ia_css_program_control_init_terminal_get_load_section_desc(
+					prog, sec_idx);
+			verifjmpexit(load_sec != NULL);
+			IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
+				"\t\tdevice_descriptor_id: 0x%08x, mem_offset: %d, "
+				"mem_size: %d, mode_bitmask: %x\n",
+				load_sec->device_descriptor_id.data,
+				mem_offset,
+				load_sec->mem_size,
+				load_sec->mode_bitmask);
+			mem_offset += load_sec->mem_size;
+		}
+		if (prog->connect_section_count > 0) {
+			IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO, "\tconnect_sections:\n");
+		}
+		for (sec_idx = 0; sec_idx < prog->connect_section_count; sec_idx++) {
+			connect_sec =
+				ia_css_program_control_init_terminal_get_connect_section_desc(
+					prog, sec_idx);
+			verifjmpexit(connect_sec != NULL);
+			IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
+				"\t\tdevice_descriptor_id: 0x%08x, "
+				"connect_terminal_ID: %d, connect_section_idx: %d, "
+				"mode_bitmask: %x\n",
+				connect_sec->device_descriptor_id.data,
+				connect_sec->connect_terminal_ID,
+				connect_sec->connect_section_idx,
+				connect_sec->mode_bitmask);
+		}
+	}
+EXIT:
+	return;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_program_control_init_program_desc_t *
+ia_css_program_control_init_terminal_get_program_desc(
+	const ia_css_program_control_init_terminal_t *prog_ctrl_init_terminal,
+	const unsigned int program_index)
+{
+	ia_css_program_control_init_program_desc_t *program_desc_base;
+	ia_css_program_control_init_program_desc_t *program_desc = NULL;
+
+	verifjmpexit(prog_ctrl_init_terminal != NULL);
+	verifjmpexit(program_index < prog_ctrl_init_terminal->program_count);
+
+	program_desc_base = (ia_css_program_control_init_program_desc_t *)
+		(((const char *)prog_ctrl_init_terminal) +
+		 prog_ctrl_init_terminal->program_section_desc_offset);
+	program_desc = &(program_desc_base[program_index]);
+
+EXIT:
+	return program_desc;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_process_id_t ia_css_program_control_init_terminal_get_process_id(
+	const ia_css_program_control_init_program_desc_t *program_desc)
+{
+	ia_css_process_id_t process_id = 0;
+
+	verifjmpexit(program_desc != NULL);
+
+	process_id = program_desc->control_info.process_id;
+
+EXIT:
+	return process_id;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+uint8_t ia_css_program_control_init_terminal_get_num_done_events(
+	const ia_css_program_control_init_program_desc_t *program_desc)
+{
+	uint8_t num_done_events = 0;
+
+	verifjmpexit(program_desc != NULL);
+
+	num_done_events = program_desc->control_info.num_done_events;
+
+EXIT:
+	return num_done_events;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+void ia_css_program_control_init_terminal_set_control_info(
+	ia_css_program_control_init_program_desc_t *program_desc,
+	ia_css_process_id_t process_id,
+	uint8_t num_done_events)
+{
+	verifjmpexit(program_desc != NULL);
+
+	program_desc->control_info.process_id = process_id;
+	program_desc->control_info.num_done_events = num_done_events;
+
+EXIT:
+	return;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+unsigned int ia_css_program_control_init_terminal_get_connect_section_count(
+	const ia_css_program_control_init_program_desc_t *program_desc)
+{
+	assert(program_desc != NULL);
+	return program_desc->connect_section_count;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+unsigned int ia_css_program_control_init_terminal_get_load_section_count(
+	const ia_css_program_control_init_program_desc_t *program_desc)
+{
+	assert(program_desc != NULL);
+	return program_desc->load_section_count;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+unsigned int ia_css_program_control_init_terminal_get_load_section_mem_offset(
+	const ia_css_program_control_init_program_desc_t *program_desc)
+{
+	assert(program_desc != NULL);
+	return program_desc->load_section_mem_offset;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_program_control_init_load_section_desc_t *
+ia_css_program_control_init_terminal_get_load_section_desc(
+	const ia_css_program_control_init_program_desc_t *program_desc,
+	const unsigned int load_section_index)
+{
+	ia_css_program_control_init_load_section_desc_t *load_section_desc_base;
+	ia_css_program_control_init_load_section_desc_t *load_section_desc = NULL;
+
+	verifjmpexit(program_desc != NULL);
+	verifjmpexit(load_section_index < program_desc->load_section_count);
+
+	load_section_desc_base = (ia_css_program_control_init_load_section_desc_t *)
+		(((const char *)program_desc) +
+		 program_desc->load_section_desc_offset);
+	load_section_desc = &(load_section_desc_base[load_section_index]);
+
+EXIT:
+	return load_section_desc;
+}
+
+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
+ia_css_program_control_init_connect_section_desc_t *
+ia_css_program_control_init_terminal_get_connect_section_desc(
+	const ia_css_program_control_init_program_desc_t *program_desc,
+	const unsigned int connect_section_index)
+{
+	ia_css_program_control_init_connect_section_desc_t *connect_sec_desc_base;
+	ia_css_program_control_init_connect_section_desc_t *connect_sec_desc = NULL;
+
+	verifjmpexit(program_desc != NULL);
+	verifjmpexit(connect_section_index < program_desc->connect_section_count);
+
+	connect_sec_desc_base =
+		(ia_css_program_control_init_connect_section_desc_t *)
+		(((const char *)program_desc) +
+		 program_desc->connect_section_desc_offset);
+	connect_sec_desc = &(connect_sec_desc_base[connect_section_index]);
+
+EXIT:
+	return connect_sec_desc;
+}
+
+/* ================= Program Control Init Terminal - END ================= */
+
+#endif /* __IA_CSS_PSYS_TERMINAL_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.h
new file mode 100644
index 000000000000..7eb387fb5066
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.h
@@ -0,0 +1,621 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_H
+#define __IA_CSS_PSYS_TERMINAL_MANIFEST_H
+
+/*! \file */
+
+/** @file ia_css_psys_terminal_manifest.h
+ *
+ * Define the methods on the terminal manifest object that are not part of a
+ * single interface
+ */
+
+#include <ia_css_psys_manifest_types.h>
+
+#include <ia_css_psys_terminal_manifest.sim.h>
+
+#include <ia_css_psys_terminal_manifest.hsys.user.h>
+
+#include <ia_css_program_group_data.h>	/* ia_css_frame_format_bitmap_t */
+#include <ia_css_kernel_bitmap.h>	/* ia_css_kernel_bitmap_t */
+
+#include <type_support.h>		/* size_t */
+#include "ia_css_terminal_manifest.h"
+#include "ia_css_terminal_manifest_base_types.h"
+#include "ia_css_psys_static_storage_class.h"
+
+/*!
+ * @addtogroup group_psysapi
+ * @{
+ */
+
+/*! Check if the terminal manifest object specifies a spatial param terminal
+ * type
+
+ @param [in]	manifest			terminal manifest object
+
+ @return is_parameter_terminal, false on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_manifest_spatial_parameter_terminal(
+	const ia_css_terminal_manifest_t		*manifest);
+
+/*! Check if the terminal manifest object specifies a program terminal type
+
+ @param [in]	manifest			terminal manifest object
+
+ @return is_parameter_terminal, false on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_manifest_program_terminal(
+	const ia_css_terminal_manifest_t		*manifest);
+
+/*! Check if the terminal manifest object specifies a program control init terminal type
+ *
+ * @param [in]	manifest			terminal manifest object
+ *
+ * @return is_parameter_terminal, false on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_manifest_program_control_init_terminal(
+	const ia_css_terminal_manifest_t		*manifest);
+
+/*! Check if the terminal manifest object specifies a (cached) parameter
+ * terminal type
+
+ @param [in]	manifest			terminal manifest object
+
+ @return is_parameter_terminal, false on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_manifest_parameter_terminal(
+	const ia_css_terminal_manifest_t		*manifest);
+
+/*! Check if the terminal manifest object specifies a (sliced) parameter
+ * terminal type
+
+ @param [in]	manifest			terminal manifest object
+
+ @return is_parameter_terminal, false on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_manifest_sliced_terminal(
+	const ia_css_terminal_manifest_t		*manifest);
+
+/*! Check if the terminal manifest object specifies a data terminal type
+
+ @param [in]	manifest			terminal manifest object
+
+ @return is_data_terminal, false on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+bool ia_css_is_terminal_manifest_data_terminal(
+	const ia_css_terminal_manifest_t		*manifest);
+
+/*! Get the broad terminal category
+
+ @param	manifest[in]			terminal manifest object
+
+ @return Terminal category enum
+
+  @note New for IPU7 POC
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_cat_t ia_css_terminal_manifest_get_category(
+	const ia_css_terminal_manifest_t		*manifest);
+
+/*! Set the broad terminal category
+
+ @param	manifest[in]			terminal manifest object
+ @param	category[in]			terminal category
+
+ @return < 0 on invalid arguments
+
+  @note New for IPU7 POC
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_category(
+	ia_css_terminal_manifest_t		*manifest,
+	ia_css_terminal_cat_t category);
+
+/*! Get the direction of data flow for the terminal payload
+
+ @param	manifest[in]			terminal manifest object
+
+ @return Terminal direction enum
+
+  @note New for IPU7 POC
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_dir_t ia_css_terminal_manifest_get_direction(
+	const ia_css_terminal_manifest_t		*manifest);
+
+/*! Set the direction of data flow for the terminal payload
+
+ @param	manifest[in]			terminal manifest object
+ @param	direction[in]			terminal direction
+
+ @return < 0 on invalid arguments
+
+  @note New for IPU7 POC
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_direction(
+	ia_css_terminal_manifest_t		*manifest,
+	ia_css_terminal_dir_t direction);
+
+/*! Get the Rate Of Update (ROU) for the terminal payload
+
+ @param	manifest[in]			terminal manifest object
+
+ @return Terminal rate-of-update enum
+
+  @note New for IPU7 POC
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_rou_t ia_css_terminal_manifest_get_rate_of_update(
+	const ia_css_terminal_manifest_t		*manifest);
+
+/*! Set the Rate Of Update (ROU) for the terminal payload
+
+ @param	manifest[in]			terminal manifest object
+ @param	rate_of_update[in]		terminal rate of update
+
+ @return < 0 on invalid arguments
+
+  @note New for IPU7 POC
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_rate_of_update(
+	ia_css_terminal_manifest_t		*manifest,
+	ia_css_terminal_rou_t rate_of_update);
+
+/*! Get the buffer type for the connect terminal pointer
+
+ This function is intended for connect terminals only.  If called
+ on a load terminal, it will return IA_CSS_CONNECT_BUF_TYPE_UNKNOWN
+
+ @param	manifest[in]			terminal manifest object
+
+ @return Connect terminal buffer type enum
+
+  @note New for IPU7 POC
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_connect_buf_type_t ia_css_terminal_manifest_get_connect_buffer_type(
+	const ia_css_terminal_manifest_t		*manifest);
+
+/*! Set the buffer type for the connect terminal pointer
+
+  Load terminals must be set only to IA_CSS_CONNECT_BUF_TYPE_UNKNOWN
+
+ @param	manifest[in]			terminal manifest object
+
+ @return < 0 on invalid arguments
+
+  @note New for IPU7 POC
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_connect_buffer_type(
+	ia_css_terminal_manifest_t		*manifest,
+	ia_css_connect_buf_type_t connect_buf_type);
+
+/*! Get the stored size of the terminal manifest object
+
+ @param [in]	manifest			terminal manifest object
+
+ @return size, 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+size_t ia_css_terminal_manifest_get_size(
+	const ia_css_terminal_manifest_t		*manifest);
+
+/*! Get the (pointer to) the program group manifest parent of the terminal
+ * manifest object
+
+ @param [in]	manifest			terminal manifest object
+
+ @return the pointer to the parent, NULL on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_program_group_manifest_t *ia_css_terminal_manifest_get_parent(
+	const ia_css_terminal_manifest_t		*manifest);
+
+/*! Set the (pointer to) the program group manifest parent of the terminal
+ * manifest object
+
+ @param [in]	manifest			terminal manifest object
+ @param	[in]	terminal_offset		this terminal's offset from
+					program_group_manifest base address.
+
+ @return < 0 on invalid arguments
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_parent_offset(
+	ia_css_terminal_manifest_t			*manifest,
+	int32_t						terminal_offset);
+
+/*! Get the type of the terminal manifest object
+
+ @param [in]	manifest			terminal manifest object
+
+ @return terminal type, limit value (IA_CSS_N_TERMINAL_TYPES) on invalid
+	manifest argument
+*/
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_type_t ia_css_terminal_manifest_get_type(
+	const ia_css_terminal_manifest_t		*manifest);
+
+/*! Set the type of the terminal manifest object
+
+ @param [in]	manifest			terminal manifest object
+ @param	[in]	terminal_type		terminal type
+
+ @return < 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_type(
+	ia_css_terminal_manifest_t			*manifest,
+	const ia_css_terminal_type_t			terminal_type);
+
+/*! Set the ID of the terminal manifest object
+
+ @param [in]	manifest			terminal manifest object
+ @param	[in]	ID				terminal ID
+
+ @return < 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_ID(
+	ia_css_terminal_manifest_t			*manifest,
+	const ia_css_terminal_ID_t			ID);
+
+/*! Get the type of the terminal manifest object
+
+ @param [in]	manifest			terminal manifest object
+
+ @return  terminal id, IA_CSS_TERMINAL_INVALID_ID on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_ID_t ia_css_terminal_manifest_get_ID(
+	const ia_css_terminal_manifest_t		*manifest);
+
+/*! Get the ID of the associated connection terminal
+
+  Only valid for load terminals.
+
+  @param	manifest[in]			terminal manifest object
+
+  @return  terminal id, IA_CSS_TERMINAL_INVALID_ID on invalid manifest argument
+  OR if there is no associated connect terminal
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_ID_t ia_css_terminal_manifest_get_connect_ID(
+	const ia_css_terminal_manifest_t		*manifest);
+
+/*! Set the ID of the associated connection terminal
+
+  Only valid for load terminals.
+
+  @param	manifest[in]			terminal manifest object
+  @param	ID[in]				terminal ID
+
+  @return < 0 on invalid manifest argument (including when
+  manifest describes a connect terminal, unless ID is
+  IA_CSS_TERMINAL_INVALID_ID)
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_connect_ID(
+	ia_css_terminal_manifest_t			*manifest,
+	const ia_css_terminal_ID_t			ID);
+
+/*! Returns the maximum payload size for an instance of the terminal
+   described in a manifest entry.
+
+   The payload size is the sum of the sizes of all
+   parameter sections for load terminals, or the maximum buffer size
+   for connect terminals.
+
+   @param manifest[in] Terminal manifest handle
+
+   @return Maximum size in bytes of the terminal payload
+ */
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_terminal_manifest_get_max_payload_size(
+	const ia_css_terminal_manifest_t *manifest);
+
+/*! Returns the maximum payload size for an instance of the terminal
+   described in a manifest entry.
+
+   The payload size is the sum of the sizes of all
+   parameter sections for load terminals, or the maximum buffer size
+   for connect terminals.
+
+   @param manifest[in] Terminal manifest handle
+   @param max_payload_size[in] Maximum payload size
+
+  @return < 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_max_payload_size(
+	ia_css_terminal_manifest_t			*manifest,
+	uint32_t 							max_payload_size);
+
+/*! Get the supported frame types of the (data) terminal manifest object
+
+ @param [in]	manifest			(data) terminal manifest object
+
+ @return frame format bitmap, 0 on invalid manifest argument
+*/
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_frame_format_bitmap_t
+	ia_css_data_terminal_manifest_get_frame_format_bitmap(
+		const ia_css_data_terminal_manifest_t		*manifest);
+
+/*! Set the chosen frame type for the (data) terminal manifest object
+
+ @param [in]	manifest			(data) terminal manifest object
+ @param	[in]	bitmap			frame format bitmap
+
+ @return < 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_data_terminal_manifest_set_frame_format_bitmap(
+	ia_css_data_terminal_manifest_t			*manifest,
+	ia_css_frame_format_bitmap_t			bitmap);
+
+/*! Check if the (data) terminal manifest object supports compression
+
+ @param [in]	manifest			(data) terminal manifest object
+
+ @return compression_support, true if compression is supported
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+bool ia_css_data_terminal_manifest_can_support_compression(
+	const ia_css_data_terminal_manifest_t		*manifest);
+
+/*! Set the compression support feature of the (data) terminal manifest object
+
+ @param [in]	manifest			(data) terminal manifest object
+ @param	[in]	compression_support		set true to support compression
+
+ @return < 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_data_terminal_manifest_set_compression_support(
+	ia_css_data_terminal_manifest_t			*manifest,
+	bool						compression_support);
+
+/*! Set the supported connection types of the terminal manifest object
+
+ @param [in]	manifest			(data) terminal manifest object
+ @param	[in]	bitmap			connection bitmap
+
+ @return < 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_data_terminal_manifest_set_connection_bitmap(
+	ia_css_data_terminal_manifest_t *manifest, ia_css_connection_bitmap_t bitmap);
+
+/*! Get the connection bitmap of the (data) terminal manifest object
+
+ @param [in]	manifest			(data) terminal manifest object
+
+ @return connection bitmap, 0 on invalid manifest argument
+*/
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_connection_bitmap_t ia_css_data_terminal_manifest_get_connection_bitmap(
+		const ia_css_data_terminal_manifest_t		*manifest);
+
+/*! Get the kernel dependency of the (data) terminal manifest object
+
+ @param [in]	manifest			(data) terminal manifest object
+
+ @return kernel bitmap, 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_kernel_bitmap_t ia_css_data_terminal_manifest_get_kernel_bitmap(
+	const ia_css_data_terminal_manifest_t		*manifest);
+
+/*! Set the kernel dependency of the (data) terminal manifest object
+
+ @param [in]	manifest			(data) terminal manifest object
+ @param	[in]	kernel_bitmap		kernel dependency bitmap
+
+ @return < 0 on invalid manifest argument
+ */
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_data_terminal_manifest_set_kernel_bitmap(
+	ia_css_data_terminal_manifest_t			*manifest,
+	const ia_css_kernel_bitmap_t			kernel_bitmap);
+
+/*! Set the unique kernel dependency of the (data) terminal manifest object
+
+ @param [in]	manifest			(data) terminal manifest object
+ @param	[in]	index			kernel dependency bitmap index
+
+ @return < 0 on invalid argument(s)
+ */
+extern int ia_css_data_terminal_manifest_set_kernel_bitmap_unique(
+	ia_css_data_terminal_manifest_t			*manifest,
+	const unsigned int				index);
+
+/*! Set the min size of the (data) terminal manifest object
+
+ @param [in]	manifest			(data) terminal manifest object
+ @param	[in]	min_size			Minimum size of the frame array
+
+ @return < 0 on invalid manifest argument
+ */
+extern int ia_css_data_terminal_manifest_set_min_size(
+	ia_css_data_terminal_manifest_t *manifest,
+	const uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
+
+/*! Set the max size of the (data) terminal manifest object
+
+ @param [in]	manifest			(data) terminal manifest object
+ @param	[in]	max_size			Maximum size of the frame array
+
+  @return < 0 on invalid manifest argument
+  */
+extern int ia_css_data_terminal_manifest_set_max_size(
+	ia_css_data_terminal_manifest_t *manifest,
+	const uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
+
+/*! Get the min size of the (data) terminal manifest object
+
+ @param [in]	manifest			(data) terminal manifest object
+ @param	[in]	min_size			Minimum size of the frame array
+
+ @return < 0 on invalid manifest argument
+ */
+extern int ia_css_data_terminal_manifest_get_min_size(
+	const ia_css_data_terminal_manifest_t *manifest,
+	uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
+
+/*! Get the max size of the (data) terminal manifest object
+
+ @param [in]	manifest			(data) terminal manifest object
+ @param	[in]	max_size			Maximum size of the frame array
+
+ @return < 0 on invalid manifest argument
+ */
+extern int ia_css_data_terminal_manifest_get_max_size(
+	const ia_css_data_terminal_manifest_t *manifest,
+	uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
+
+/*! Set the min fragment size of the (data) terminal manifest object
+
+ @param [in]	manifest			(data) terminal manifest object
+ @param	[in]	min_size			Minimum size of the fragment array
+
+ @return < 0 on invalid manifest argument
+ */
+extern int ia_css_data_terminal_manifest_set_min_fragment_size(
+	ia_css_data_terminal_manifest_t *manifest,
+	const uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
+
+/*! Set the max fragment size of the (data) terminal manifest object
+
+ @param [in]	manifest			(data) terminal manifest object
+ @param	[in]	max_size			Maximum size of the fragment array
+
+  @return < 0 on invalid manifest argument
+  */
+extern int ia_css_data_terminal_manifest_set_max_fragment_size(
+	ia_css_data_terminal_manifest_t *manifest,
+	const uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
+
+/*! Get the min fragment size of the (data) terminal manifest object
+
+ @param [in]	manifest			(data) terminal manifest object
+ @param	[in]	min_size			Minimum size of the fragment array
+
+ @return < 0 on invalid manifest argument
+ */
+extern int ia_css_data_terminal_manifest_get_min_fragment_size(
+	const ia_css_data_terminal_manifest_t *manifest,
+	uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
+
+/*! Get the max fragment size of the (data) terminal manifest object
+
+ @param [in]	manifest			(data) terminal manifest object
+ @param	[in]	max_size			Maximum size of the fragment array
+
+ @return < 0 on invalid manifest argument
+ */
+extern int ia_css_data_terminal_manifest_get_max_fragment_size(
+	const ia_css_data_terminal_manifest_t *manifest,
+	uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
+
+/*!
+ * Get the program control init connect section count for program prog.
+ * @param [in] prog program control init terminal program desc
+ * @return number of connect section for program prog.
+ */
+
+extern
+unsigned int ia_css_program_control_init_terminal_manifest_get_connect_section_count(
+	const ia_css_program_control_init_manifest_program_desc_t *prog);
+
+/*!
+ * Get the program control init load section count for program prog.
+ * @param [in] prog program control init terminal program desc
+ * @return number of load section for program prog.
+ */
+
+extern
+unsigned int ia_css_program_control_init_terminal_manifest_get_load_section_count(
+	const ia_css_program_control_init_manifest_program_desc_t *prog);
+
+/*!
+ * Get the program control init terminal manifest size.
+ * @param [in] nof_programs		Number of programs.
+ * @param [in] nof_load_sections		Array of size nof_programs,
+ *					encoding the number of load sections.
+ * @param [in] nof_connect_sections	Array of size nof_programs,
+ *					encoding the number of connect sections.
+ * @return < 0 on invalid manifest argument
+ */
+extern
+unsigned int ia_css_program_control_init_terminal_manifest_get_size(
+	const uint16_t nof_programs,
+	const uint16_t *nof_load_sections,
+	const uint16_t *nof_connect_sections);
+
+/*!
+ * Get the program control init terminal manifest program desc.
+ * @param [in] terminal		Program control init terminal.
+ * @param [in] program		Number of programs.
+ * @return program control init terminal program desc (or NULL if error).
+ */
+extern
+ia_css_program_control_init_manifest_program_desc_t *
+ia_css_program_control_init_terminal_manifest_get_program_desc(
+	const ia_css_program_control_init_terminal_manifest_t *terminal,
+	unsigned int program);
+
+/*!
+ * Initialize the program control init terminal manifest.
+ * @param [in] nof_programs		Number of programs
+ * @param [in] nof_load_sections		Array of size nof_programs,
+ *					encoding the number of load sections.
+ * @param [in] nof_connect_sections	Array of size nof_programs,
+ *					encoding the number of connect sections.
+ * @return < 0 on invalid manifest argument
+ */
+extern
+int ia_css_program_control_init_terminal_manifest_init(
+	ia_css_program_control_init_terminal_manifest_t *terminal,
+	const uint16_t nof_programs,
+	const uint16_t *nof_load_sections,
+	const uint16_t *nof_connect_sections);
+
+/*!
+ * Pretty prints the program control init terminal manifest.
+ * @param [in] terminal		Program control init terminal.
+ */
+extern
+void ia_css_program_control_init_terminal_manifest_print(
+	ia_css_program_control_init_terminal_manifest_t *terminal);
+
+#ifdef __IA_CSS_PSYS_STATIC_INLINE__
+#include "ia_css_psys_terminal_manifest_impl.h"
+#endif
+
+#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.hsys.user.h
new file mode 100644
index 000000000000..9994318d4e33
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.hsys.user.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_HSYS_USER_H
+#define __IA_CSS_PSYS_TERMINAL_MANIFEST_HSYS_USER_H
+
+/*! \file */
+
+/** @file ia_css_psys_terminal.hsys.user.h
+ *
+ * Define the methods on the termianl manifest object: Hsys user interface
+ */
+
+#include <ia_css_psys_manifest_types.h>
+
+/*! Print the terminal manifest object to file/stream
+
+ @param	manifest[in]			terminal manifest object
+ @param	fid[out]				file/stream handle
+
+ @return < 0 on error
+ */
+extern int ia_css_terminal_manifest_print(
+	const ia_css_terminal_manifest_t	*manifest,
+	void					*fid);
+
+#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_HSYS_USER_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.sim.h
new file mode 100644
index 000000000000..7c1c6849b1c9
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.sim.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_SIM_H
+#define __IA_CSS_PSYS_TERMINAL_MANIFEST_SIM_H
+
+/*! \file */
+
+/** @file ia_css_psys_terminal_manifest.sim.h
+ *
+ * Define the methods on the terminal manifest object: Simulation only
+ */
+
+#include <type_support.h>					/* size_t */
+#include "ia_css_terminal.h"
+#include "ia_css_terminal_manifest.h"
+#include "ia_css_terminal_defs.h"
+
+/*! Create (the storage for) the terminal manifest object
+
+ @param	terminal_type[in]	type of the terminal manifest {parameter, data}
+
+ @return NULL on error
+ */
+extern ia_css_terminal_manifest_t *ia_css_terminal_manifest_alloc(
+	const ia_css_terminal_type_t			terminal_type);
+
+/*! Destroy (the storage of) the terminal manifest object
+
+ @param	manifest[in]			terminal manifest
+
+ @return NULL
+ */
+extern ia_css_terminal_manifest_t *ia_css_terminal_manifest_free(
+	ia_css_terminal_manifest_t				*manifest);
+
+#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_SIM_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest_impl.h
new file mode 100644
index 000000000000..eb30acd7045d
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest_impl.h
@@ -0,0 +1,745 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_IMPL_H
+#define __IA_CSS_PSYS_TERMINAL_MANIFEST_IMPL_H
+
+#include <ia_css_psys_terminal_manifest.h>
+
+/* Data object types on the terminals */
+#include <ia_css_program_group_data.h>
+/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_clear, ia_css_... */
+#include <ia_css_kernel_bitmap.h>
+
+#include "ia_css_psys_program_group_private.h"
+#include "ia_css_terminal_manifest.h"
+#include "ia_css_terminal_manifest_types.h"
+
+#include <error_support.h>
+#include <print_support.h>
+#include <misc_support.h>
+#include "ia_css_psys_static_trace.h"
+#include "ia_css_psys_static_storage_class.h"
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_manifest_spatial_parameter_terminal(
+	const ia_css_terminal_manifest_t *manifest)
+{
+	ia_css_terminal_type_t terminal_type;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_is_terminal_manifest_parameter_terminal(): enter:\n");
+
+	terminal_type = ia_css_terminal_manifest_get_type(manifest);
+
+	return ((terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ||
+		(terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT));
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_manifest_program_terminal(
+	const ia_css_terminal_manifest_t *manifest)
+{
+	ia_css_terminal_type_t terminal_type;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_is_terminal_manifest_parameter_terminal(): enter:\n");
+
+	terminal_type = ia_css_terminal_manifest_get_type(manifest);
+
+	return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM);
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_manifest_program_control_init_terminal(
+	const ia_css_terminal_manifest_t *manifest)
+{
+	ia_css_terminal_type_t terminal_type;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_is_terminal_manifest_program_control_init_terminal(): enter:\n");
+
+	terminal_type = ia_css_terminal_manifest_get_type(manifest);
+
+	return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT);
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_manifest_parameter_terminal(
+	const ia_css_terminal_manifest_t *manifest)
+{
+	/* will return an error value on error */
+	ia_css_terminal_type_t terminal_type;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_is_terminal_manifest_parameter_terminal(): enter:\n");
+
+	terminal_type = ia_css_terminal_manifest_get_type(manifest);
+
+	return (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
+		terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT);
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_manifest_data_terminal(
+	const ia_css_terminal_manifest_t *manifest)
+{
+	/* will return an error value on error */
+	ia_css_terminal_type_t terminal_type;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_is_terminal_manifest_data_terminal(): enter:\n");
+
+	terminal_type = ia_css_terminal_manifest_get_type(manifest);
+
+	return ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
+		(terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT));
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+bool ia_css_is_terminal_manifest_sliced_terminal(
+	const ia_css_terminal_manifest_t *manifest)
+{
+	ia_css_terminal_type_t terminal_type;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_is_terminal_manifest_sliced_terminal(): enter:\n");
+
+	terminal_type = ia_css_terminal_manifest_get_type(manifest);
+
+	return ((terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN) ||
+		(terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT));
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+size_t ia_css_terminal_manifest_get_size(
+	const ia_css_terminal_manifest_t *manifest)
+{
+	size_t size = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_terminal_manifest_get_size(): enter:\n");
+
+	if (manifest != NULL) {
+		size = manifest->size;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_terminal_manifest_get_size: invalid argument\n");
+	}
+	return size;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_terminal_type_t ia_css_terminal_manifest_get_type(
+	const ia_css_terminal_manifest_t *manifest)
+{
+	ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_terminal_manifest_get_type(): enter:\n");
+
+	if (manifest != NULL) {
+		terminal_type = manifest->terminal_type;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_terminal_manifest_get_type: invalid argument\n");
+	}
+	return terminal_type;
+}
+
+/** Temporary implementation of attributes based on terminal type ID
+ *
+ *  A later implementation in the PG manifest generator tool will
+ *  replace this and thus remove the dependency on the legacy
+ *  terminal type.
+ */
+static void ia_css_terminal_manifest_set_attributes_by_type(
+	ia_css_terminal_manifest_t *manifest,
+	const ia_css_terminal_type_t terminal_type)
+{
+	/* Set defaults for most cases, and change in the later code for the rest. */
+	ia_css_terminal_cat_t category = IA_CSS_TERMINAL_CAT_LOAD;
+	ia_css_terminal_dir_t direction = IA_CSS_TERMINAL_DIR_IN;
+	ia_css_terminal_rou_t rou = IA_CSS_TERMINAL_ROU_FRAME;
+	ia_css_connect_buf_type_t connect_buf_type = IA_CSS_CONNECT_BUF_TYPE_UNKNOWN;
+
+	if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
+		 (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) ||
+		 (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ||
+		 (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT)) {
+		category = IA_CSS_TERMINAL_CAT_CONNECT;
+	}
+	ia_css_terminal_manifest_set_category(manifest, category);
+
+	if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) ||
+		 (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) ||
+		 (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT) ||
+		 (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT) ||
+		 (terminal_type == IA_CSS_TERMINAL_TYPE_STATE_OUT)) {
+		direction = IA_CSS_TERMINAL_DIR_OUT;
+	}
+	ia_css_terminal_manifest_set_direction(manifest, direction);
+
+	if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
+		 (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT)) {
+		rou = IA_CSS_TERMINAL_ROU_FRAG;
+	} else if (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) {
+			rou = IA_CSS_TERMINAL_ROU_STREAM;
+	}
+	ia_css_terminal_manifest_set_rate_of_update(manifest, rou);
+
+	if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
+		 (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT)) {
+		connect_buf_type = IA_CSS_CONNECT_BUF_TYPE_DATA;
+	} else if ((terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ||
+			 (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT)) {
+			connect_buf_type = IA_CSS_CONNECT_BUF_TYPE_META;
+	}
+	ia_css_terminal_manifest_set_connect_buffer_type(manifest, connect_buf_type);
+}
+
+/** Temporary implementation for new fields until the manfifest generator
+ *  tool will be enhance to set values directly.
+ *
+ *  - Attibutes are set to meaningful values by mapping terminal type to
+ *  attributes
+ *  - connect_ID is set to the invalid terminal ID value: IA_CSS_TERMINAL_INVALID_ID
+ *  - max_payload_size is set to UINT32_MAX
+ */
+static void ia_css_terminal_manifest_set_new_fields(
+	ia_css_terminal_manifest_t *manifest,
+	const ia_css_terminal_type_t terminal_type)
+{
+	ia_css_terminal_manifest_set_attributes_by_type(manifest, terminal_type);
+	assert(ia_css_terminal_manifest_set_connect_ID(manifest, IA_CSS_TERMINAL_INVALID_ID));
+	assert(ia_css_terminal_manifest_set_max_payload_size(manifest, UINT32_MAX));
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+int ia_css_terminal_manifest_set_type(
+	ia_css_terminal_manifest_t *manifest,
+	const ia_css_terminal_type_t terminal_type)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_terminal_manifest_set_type(): enter:\n");
+
+	if (manifest != NULL) {
+		manifest->terminal_type = terminal_type;
+		ia_css_terminal_manifest_set_new_fields(manifest, terminal_type);
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+			"ia_css_terminal_manifest_set_type failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+int ia_css_terminal_manifest_set_ID(
+	ia_css_terminal_manifest_t *manifest,
+	const ia_css_terminal_ID_t ID)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_terminal_manifest_set_ID(): enter:\n");
+
+	if (manifest != NULL) {
+		manifest->ID = ID;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+			"ia_css_terminal_manifest_set_ID failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_terminal_ID_t ia_css_terminal_manifest_get_ID(
+	const ia_css_terminal_manifest_t *manifest)
+{
+	ia_css_terminal_ID_t retval;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_terminal_manifest_get_ID(): enter:\n");
+
+	if (manifest != NULL) {
+		retval = manifest->ID;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+			"ia_css_terminal_manifest_get_ID failed\n");
+		retval = IA_CSS_TERMINAL_INVALID_ID;
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_ID_t ia_css_terminal_manifest_get_connect_ID(
+	const ia_css_terminal_manifest_t		*manifest)
+{
+	ia_css_terminal_ID_t retval;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_terminal_manifest_get_connect_ID(): enter:\n");
+
+	if (manifest != NULL) {
+		retval = manifest->assoc_ID;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+			"ia_css_terminal_manifest_get_connect_ID failed\n");
+		retval = IA_CSS_TERMINAL_INVALID_ID;
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_cat_t ia_css_terminal_manifest_get_category(
+	const ia_css_terminal_manifest_t		*manifest)
+{
+	ia_css_terminal_cat_t retval;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_terminal_manifest_get_category(): enter:\n");
+
+	if (manifest != NULL) {
+		retval = (ia_css_terminal_cat_t)manifest->attributes.category;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+			"ia_css_terminal_manifest_get_category failed\n");
+		retval = IA_CSS_TERMINAL_CAT_INVALID;
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_category(
+	ia_css_terminal_manifest_t		*manifest,
+	ia_css_terminal_cat_t category)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_terminal_manifest_set_category(): enter:\n");
+
+	if (manifest != NULL) {
+		manifest->attributes.category = category;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+			"ia_css_terminal_manifest_set_category failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_dir_t ia_css_terminal_manifest_get_direction(
+	const ia_css_terminal_manifest_t		*manifest)
+{
+	ia_css_terminal_dir_t retval;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_terminal_manifest_get_direction(): enter:\n");
+
+	if (manifest != NULL) {
+		retval = (ia_css_terminal_dir_t)manifest->attributes.direction;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+			"ia_css_terminal_manifest_get_direction failed\n");
+		retval = IA_CSS_TERMINAL_DIR_INVALID;
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_direction(
+	ia_css_terminal_manifest_t		*manifest,
+	ia_css_terminal_dir_t direction)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_terminal_manifest_set_direction(): enter:\n");
+
+	if (manifest != NULL) {
+		manifest->attributes.direction = direction;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+			"ia_css_terminal_manifest_set_direction failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_terminal_rou_t ia_css_terminal_manifest_get_rate_of_update(
+	const ia_css_terminal_manifest_t		*manifest)
+{
+	ia_css_terminal_rou_t retval;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_terminal_manifest_get_rate_of_update(): enter:\n");
+
+	if (manifest != NULL) {
+		retval = (ia_css_terminal_rou_t)manifest->attributes.rou;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+			"ia_css_terminal_manifest_get_rate_of_update failed\n");
+		retval = IA_CSS_TERMINAL_ROU_INVALID;
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_rate_of_update(
+	ia_css_terminal_manifest_t		*manifest,
+	ia_css_terminal_rou_t rate_of_update)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_terminal_manifest_set_rate_of_update(): enter:\n");
+
+	if (manifest != NULL) {
+		manifest->attributes.rou = rate_of_update;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+			"ia_css_terminal_manifest_set_rate_of_update failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+ia_css_connect_buf_type_t ia_css_terminal_manifest_get_connect_buffer_type(
+	const ia_css_terminal_manifest_t		*manifest)
+{
+	ia_css_connect_buf_type_t retval;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_terminal_manifest_get_connect_buffer_type(): enter:\n");
+
+	if (manifest != NULL) {
+		retval = (ia_css_connect_buf_type_t)manifest->attributes.connect_buf_type;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+			"ia_css_terminal_manifest_get_connect_buffer_type failed\n");
+		retval = IA_CSS_CONNECT_BUF_TYPE_INVALID;
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_connect_buffer_type(
+	ia_css_terminal_manifest_t		*manifest,
+	ia_css_connect_buf_type_t connect_buf_type)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_terminal_manifest_set_connect_buffer_type(): enter:\n");
+
+	if (manifest != NULL) {
+		manifest->attributes.connect_buf_type = connect_buf_type;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+			"ia_css_terminal_manifest_set_connect_buffer_type failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_connect_ID(
+	ia_css_terminal_manifest_t			*manifest,
+	const ia_css_terminal_ID_t			ID)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_terminal_manifest_set_connect_ID(): enter:\n");
+
+	if (manifest != NULL &&
+		((IA_CSS_TERMINAL_CAT_LOAD == ia_css_terminal_manifest_get_category(manifest)) ||
+		(IA_CSS_TERMINAL_INVALID_ID == ID))) {
+		manifest->assoc_ID = ID;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+			"ia_css_terminal_manifest_set_connect_ID failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_terminal_manifest_get_max_payload_size(
+	const ia_css_terminal_manifest_t *manifest)
+{
+	ia_css_terminal_ID_t retval;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_terminal_manifest_get_max_payload_size(): enter:\n");
+
+	if (manifest != NULL) {
+		retval = manifest->max_payload_size;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+			"ia_css_terminal_manifest_get_max_payload_size failed\n");
+		retval = IA_CSS_TERMINAL_INVALID_ID;
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
+int ia_css_terminal_manifest_set_max_payload_size(
+	ia_css_terminal_manifest_t			*manifest,
+	uint32_t 							max_payload_size)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_terminal_manifest_set_max_payload_size(): enter:\n");
+
+	if (manifest != NULL) {
+		manifest->max_payload_size = max_payload_size;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+			"ia_css_terminal_manifest_set_max_payload_size failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_program_group_manifest_t *ia_css_terminal_manifest_get_parent(
+	const ia_css_terminal_manifest_t *manifest)
+{
+	ia_css_program_group_manifest_t	*parent = NULL;
+	char *base;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_terminal_manifest_get_parent(): enter:\n");
+
+	verifexit(manifest != NULL);
+
+	base = (char *)((char *)manifest + manifest->parent_offset);
+
+	parent = (ia_css_program_group_manifest_t *)(base);
+EXIT:
+	return parent;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+int ia_css_terminal_manifest_set_parent_offset(
+	ia_css_terminal_manifest_t *manifest,
+	int32_t terminal_offset)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_terminal_manifest_set_parent_offset(): enter:\n");
+
+	verifexit(manifest != NULL);
+
+	/* parent is at negative offset away from current terminal offset*/
+	manifest->parent_offset = -terminal_offset;
+
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+			"ia_css_terminal_manifest_set_parent_offset failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C ia_css_frame_format_bitmap_t
+ia_css_data_terminal_manifest_get_frame_format_bitmap(
+	const ia_css_data_terminal_manifest_t *manifest)
+{
+	ia_css_frame_format_bitmap_t bitmap = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_data_terminal_manifest_get_frame_format_bitmap(): enter:\n");
+
+	if (manifest != NULL) {
+		bitmap = manifest->frame_format_bitmap;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_data_terminal_manifest_get_frame_format_bitmap invalid argument\n");
+	}
+	return bitmap;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+int ia_css_data_terminal_manifest_set_frame_format_bitmap(
+	ia_css_data_terminal_manifest_t *manifest,
+	ia_css_frame_format_bitmap_t bitmap)
+{
+	int ret = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_data_terminal_manifest_set_frame_format_bitmap(): enter:\n");
+
+	if (manifest != NULL) {
+		manifest->frame_format_bitmap = bitmap;
+		ret = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+			"ia_css_data_terminal_manifest_set_frame_format_bitmap failed (%i)\n",
+			ret);
+	}
+
+	return ret;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+bool ia_css_data_terminal_manifest_can_support_compression(
+	const ia_css_data_terminal_manifest_t *manifest)
+{
+	bool compression_support = false;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_data_terminal_manifest_get_compression_support(): enter:\n");
+
+	if (manifest != NULL) {
+		/* compression_support is used boolean encoded in uint8_t.
+		 * So we only need to check
+		 * if this is non-zero
+		 */
+		compression_support = (manifest->compression_support != 0);
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+			"ia_css_data_terminal_manifest_can_support_compression invalid argument\n");
+	}
+
+	return compression_support;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+int ia_css_data_terminal_manifest_set_compression_support(
+	ia_css_data_terminal_manifest_t *manifest,
+	bool compression_support)
+{
+	int ret = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_data_terminal_manifest_set_compression_support(): enter:\n");
+
+	if (manifest != NULL) {
+		manifest->compression_support =
+			(compression_support == true) ? 1 : 0;
+		ret = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+			"ia_css_data_terminal_manifest_set_compression_support failed (%i)\n",
+			ret);
+	}
+
+	return ret;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_connection_bitmap_t ia_css_data_terminal_manifest_get_connection_bitmap(
+	const ia_css_data_terminal_manifest_t *manifest)
+{
+	ia_css_connection_bitmap_t connection_bitmap = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_data_terminal_manifest_get_connection_bitmap(): enter:\n");
+
+	if (manifest != NULL) {
+		connection_bitmap = manifest->connection_bitmap;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_data_terminal_manifest_get_connection_bitmap invalid argument\n");
+	}
+	return connection_bitmap;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+int ia_css_data_terminal_manifest_set_connection_bitmap(
+	ia_css_data_terminal_manifest_t *manifest, ia_css_connection_bitmap_t bitmap)
+{
+	int ret = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_data_terminal_manifest_set_connection_bitmap(): enter:\n");
+
+	if (manifest != NULL) {
+		assert(bitmap != 0); /* zero means there is no connection, this is invalid. */
+		assert((bitmap >> IA_CSS_N_CONNECTION_TYPES) == 0);
+
+		manifest->connection_bitmap = bitmap;
+		ret = 0;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_data_terminal_manifest_set_connection_bitmap invalid argument\n");
+	}
+	return ret;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+ia_css_kernel_bitmap_t ia_css_data_terminal_manifest_get_kernel_bitmap(
+	const ia_css_data_terminal_manifest_t *manifest)
+{
+	ia_css_kernel_bitmap_t kernel_bitmap = ia_css_kernel_bitmap_clear();
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_data_terminal_manifest_get_kernel_bitmap(): enter:\n");
+
+	if (manifest != NULL) {
+		kernel_bitmap = manifest->kernel_bitmap;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_data_terminal_manifest_get_kernel_bitmap: invalid argument\n");
+	}
+	return kernel_bitmap;
+}
+
+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
+int ia_css_data_terminal_manifest_set_kernel_bitmap(
+	ia_css_data_terminal_manifest_t	*manifest,
+	const ia_css_kernel_bitmap_t kernel_bitmap)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_data_terminal_manifest_set_kernel_bitmap(): enter:\n");
+
+	if (manifest != NULL) {
+		manifest->kernel_bitmap = kernel_bitmap;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+			"ia_css_data_terminal_manifest_set_kernel_bitmap: failed (%i)\n",
+			retval);
+	}
+
+	return retval;
+}
+
+#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_private_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_private_types.h
new file mode 100644
index 000000000000..366623cdd72d
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_private_types.h
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_TERMINAL_PRIVATE_TYPES_H
+#define __IA_CSS_PSYS_TERMINAL_PRIVATE_TYPES_H
+
+#include "ia_css_terminal_types.h"
+#include "ia_css_program_group_data.h"
+#include "ia_css_psys_manifest_types.h"
+
+#define	N_UINT16_IN_DATA_TERMINAL_STRUCT	2
+#define	N_UINT8_IN_DATA_TERMINAL_STRUCT		3
+#define	N_PADDING_UINT8_IN_DATA_TERMINAL_STRUCT	1
+
+/* ========================= Data terminal - START ========================= */
+
+#define SIZE_OF_DATA_TERMINAL_STRUCT_BITS \
+	(SIZE_OF_TERMINAL_STRUCT_BITS \
+	+ IA_CSS_FRAME_DESCRIPTOR_STRUCT_BITS \
+	+ IA_CSS_FRAME_STRUCT_BITS \
+	+ IA_CSS_STREAM_STRUCT_BITS \
+	+ IA_CSS_UINT32_T_BITS \
+	+ IA_CSS_CONNECTION_TYPE_BITS \
+	+ (N_UINT16_IN_DATA_TERMINAL_STRUCT * 16) \
+	+ (N_UINT8_IN_DATA_TERMINAL_STRUCT * 8)	\
+	+ (N_PADDING_UINT8_IN_DATA_TERMINAL_STRUCT * 8))
+
+/**
+ * The (data) terminal can be attached to a buffer or a stream.
+ * The stream interface is not necessarily limited to strict in-order access.
+ * For a stream the restriction is that contrary to a buffer it cannot be
+ * addressed directly, i.e. it behaves as a port,
+ * but it may support stream_pos() and/or seek() operations
+ */
+struct ia_css_data_terminal_s {
+	/** Data terminal base class */
+	ia_css_terminal_t base;
+	/** Properties of the image data attached to the terminal */
+	ia_css_frame_descriptor_t frame_descriptor;
+	/** Data buffer handle attached to the terminal */
+	ia_css_frame_t frame;
+	/** (exclusive) Data stream handle attached to the terminal
+	 * if the data is sourced over a device port
+	 *
+	 * @note No known use of the field.
+	 */
+	ia_css_stream_t stream;
+	/** Reserved
+	* @note No known intent for this reservation field. */
+	uint32_t reserved;
+	/** Tranfer method for send/receving data to/from this terminal. */
+	ia_css_connection_type_t connection_type;
+	/** Offset in bytes from the start of this structure to a Array[fragment_count] of
+	 *  type "ia_css_fragment_descriptor_t", aligned to a 64 bit boundary.
+	 *  (fragment_count being equal for all terminals in a subgraph) of fragment descriptors
+	 */
+	uint16_t fragment_descriptor_offset;
+	/** Size of streaming to GEN buffer in lines. This field will be used only
+	 *  at streaming use-case (connection type != IA_CSS_CONNECTION_MEMORY)
+	 */
+	uint16_t stream2gen_buffer_size;
+	/** Kernel id that this terminal is associated with.  If that kernel
+	 *  is disabled, this terminal is considered disabled as well.
+	 *  Must be set the single kernel defined in the manifest for this terminal's
+	 *  ID (ia_css_terminal_s::ID). */
+	uint8_t kernel_id;
+	/** Indicate to which subgraph this terminal belongs
+	 * for common constraints
+	 *
+	 * @note No known use.
+	 */
+	uint8_t subgraph_id;
+	/** Link ID of the data terminal.  Two terminals can optionally be
+	 *  marked as linked to each other by setting the same link ID.
+	 *  Hardware topology or logical or algorithmic constraints may restrict the
+	 *  terminal that can be so linked.
+	 *  In current practice, link ID's have special meaning related to
+	 *  the connection type (see "connection_type" field in this structure) or
+	 *  synchronization of program groups.
+	 *  @see ia_css_isys_link_id_t
+	 *  @see ia_css_data_barrier_link_id_t
+	 *  @see ia_css_stream2gen_link_id_t */
+	uint8_t link_id;
+	/** Padding for 64bit alignment */
+	uint8_t padding[N_PADDING_UINT8_IN_DATA_TERMINAL_STRUCT];
+};
+/* ========================== Data terminal - END ========================== */
+
+#endif /* __IA_CSS_PSYS_TERMINAL_PRIVATE_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport.h
new file mode 100644
index 000000000000..da96da317016
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport.h
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_TRANSPORT_H
+#define __IA_CSS_PSYS_TRANSPORT_H
+
+#include <ia_css_psys_transport_dep.h>		/* ia_css_psys_cmd_queues */
+#include <vied_nci_psys_system_global.h>	/* vied_vaddress_t */
+
+#include <type_support.h>
+
+typedef enum ia_css_psys_event_queues {
+	/** The in-order queue for event returns */
+	IA_CSS_PSYS_EVENT_QUEUE_MAIN_ID,
+	IA_CSS_N_PSYS_EVENT_QUEUE_ID
+} ia_css_psys_event_queue_ID_t;
+
+typedef enum ia_css_psys_event_types {
+	/** No error to report. */
+	IA_CSS_PSYS_EVENT_TYPE_SUCCESS = 0,
+	/** Unknown unhandled error */
+	IA_CSS_PSYS_EVENT_TYPE_UNKNOWN_ERROR = 1,
+	/* Retrieving remote object: */
+	/** Object ID not found */
+	IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_NOT_FOUND = 2,
+	/** Objects too big, or size is zero. */
+	IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_TOO_BIG = 3,
+	/** Failed to load whole process group from tproxy/dma  */
+	IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_DDR_TRANS_ERR = 4,
+	/** The proper package could not be found */
+	IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_NULL_PKG_DIR_ADDR = 5,
+	/* Process group: */
+	/** Failed to run, error while loading frame */
+	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_LOAD_FRAME_ERR = 6,
+	/** Failed to run, error while loading fragment */
+	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_LOAD_FRAGMENT_ERR = 7,
+	/** The process count of the process group is zero */
+	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_PROCESS_COUNT_ZERO = 8,
+	/** Process(es) initialization */
+	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_PROCESS_INIT_ERR = 9,
+	/** Aborted (after host request) */
+	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_ABORT = 10,
+	/** NULL pointer in the process group */
+	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_NULL = 11,
+	/** Process group validation failed */
+	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_VALIDATION_ERR = 12,
+	/** Error handling- invalid frame detected by CSI (ISYS) */
+	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_INVALID_FRAME = 13
+} ia_css_psys_event_type_t;
+
+#define IA_CSS_PSYS_CMD_BITS	64
+struct ia_css_psys_cmd_s {
+	/** The command issued to the process group */
+	uint16_t	command;
+	/** Message field of the command */
+	uint16_t	msg;
+	/** The context reference (process group/buffer set/...) */
+	uint32_t	context_handle;
+};
+
+#define IA_CSS_PSYS_EVENT_BITS	128
+typedef struct ia_css_psys_event_s {
+	/** The (return) status of the command issued to
+	 * the process group this event refers to
+	 */
+	uint16_t	status;
+	/** The command issued to the process group this event refers to */
+	uint16_t	command;
+	/** The context reference (process group/buffer set/...) */
+	uint32_t	context_handle;
+	/** This token (size) must match the token registered
+	 * in a process group
+	 */
+	uint64_t	token;
+} ia_css_psys_event_s_t;
+
+struct ia_css_psys_buffer_s {
+	/** The in-order queue for scheduled process groups */
+	void		*host_buffer;
+	vied_vaddress_t	*isp_buffer;
+};
+
+#endif /* __IA_CSS_PSYS_TRANSPORT_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport_dep.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport_dep.h
new file mode 100644
index 000000000000..3c8e1abe41e1
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport_dep.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYS_TRANSPORT_DEP_H
+#define __IA_CSS_PSYS_TRANSPORT_DEP_H
+
+/*
+ * The ID's of the Psys specific queues.
+ */
+typedef enum ia_css_psys_cmd_queues {
+	/**< The in-order queue for scheduled process groups */
+	IA_CSS_PSYS_CMD_QUEUE_COMMAND_ID = 0,
+	/**< The in-order queue for commands changing psys or
+	 * process group state
+	 */
+	IA_CSS_PSYS_CMD_QUEUE_DEVICE_ID,
+	/**< An in-order queue for dedicated PPG commands */
+	IA_CSS_PSYS_CMD_QUEUE_PPG0_COMMAND_ID,
+	/**< An in-order queue for dedicated PPG commands */
+	IA_CSS_PSYS_CMD_QUEUE_PPG1_COMMAND_ID,
+	/**< An in-order queue for dedicated PPG commands */
+	IA_CSS_PSYS_CMD_QUEUE_PPG2_COMMAND_ID,
+	/**< An in-order queue for dedicated PPG commands */
+	IA_CSS_PSYS_CMD_QUEUE_PPG3_COMMAND_ID,
+	/**< An in-order queue for dedicated PPG commands */
+	IA_CSS_PSYS_CMD_QUEUE_PPG4_COMMAND_ID,
+	/**< An in-order queue for dedicated PPG commands */
+	IA_CSS_PSYS_CMD_QUEUE_PPG5_COMMAND_ID,
+	IA_CSS_N_PSYS_CMD_QUEUE_ID
+} ia_css_psys_cmd_queue_ID_t;
+
+#define IA_CSS_PSYS_LATE_BINDING_QUEUE_OFFSET 1
+
+#endif /* __IA_CSS_PSYS_TRANSPORT_DEP_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi.h
new file mode 100644
index 000000000000..9033b8d1a19a
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYSAPI_H
+#define __IA_CSS_PSYSAPI_H
+
+#include <ia_css_psys_process.hsys.user.h>
+#include <ia_css_psys_process.hsys.kernel.h>
+#include <ia_css_psys_process_group.hsys.user.h>
+#include <ia_css_psys_process_group.hsys.kernel.h>
+
+#endif /* __IA_CSS_PSYSAPI_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_fw_version.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_fw_version.h
new file mode 100644
index 000000000000..f9c30a40a5dc
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_fw_version.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYSAPI_FW_VERSION_H
+#define __IA_CSS_PSYSAPI_FW_VERSION_H
+
+/* PSYSAPI FW VERSION is taken from Makefile for FW tests */
+#define BXT_FW_RELEASE_VERSION PSYS_FIRMWARE_VERSION
+
+enum ia_css_process_group_protocol_version {
+	/**
+	 * Legacy protocol
+	 */
+	IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY = 0,
+	/**
+	 * Persistent process group support protocol
+	 */
+	IA_CSS_PROCESS_GROUP_PROTOCOL_PPG,
+	IA_CSS_PROCESS_GROUP_N_PROTOCOLS
+};
+
+#endif /* __IA_CSS_PSYSAPI_FW_VERSION_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_trace.h
new file mode 100644
index 000000000000..0369bcfe9388
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_trace.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_PSYSAPI_TRACE_H
+#define __IA_CSS_PSYSAPI_TRACE_H
+
+#include "ia_css_trace.h"
+
+#define PSYSAPI_TRACE_LOG_LEVEL_OFF 0
+#define PSYSAPI_TRACE_LOG_LEVEL_NORMAL 1
+#define PSYSAPI_TRACE_LOG_LEVEL_DEBUG 2
+
+/* PSYSAPI and all the submodules in PSYSAPI will have the default tracing
+ * level set to the PSYSAPI_TRACE_CONFIG level. If not defined in the
+ * psysapi.mk fill it will be set by default to no trace
+ * (PSYSAPI_TRACE_LOG_LEVEL_OFF)
+ */
+#define PSYSAPI_TRACE_CONFIG_DEFAULT PSYSAPI_TRACE_LOG_LEVEL_OFF
+
+#if !defined(PSYSAPI_TRACE_CONFIG)
+	#define PSYSAPI_TRACE_CONFIG PSYSAPI_TRACE_CONFIG_DEFAULT
+#endif
+
+/* Module specific trace setting will be used if
+ * the trace level is not specified from the module or
+  PSYSAPI_TRACING_OVERRIDE is defined
+ */
+#if (defined(PSYSAPI_TRACE_CONFIG))
+	/* Module specific trace setting */
+	#if PSYSAPI_TRACE_CONFIG == PSYSAPI_TRACE_LOG_LEVEL_OFF
+		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
+		#define PSYSAPI_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_TRACE_LEVEL_ERROR IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_TRACE_LEVEL_WARNING IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_TRACE_LEVEL_INFO IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_TRACE_LEVEL_DEBUG IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_TRACE_LEVEL_VERBOSE IA_CSS_TRACE_LEVEL_DISABLED
+	#elif PSYSAPI_TRACE_CONFIG == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
+		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
+		#define PSYSAPI_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_TRACE_LEVEL_ERROR IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_TRACE_LEVEL_WARNING IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_TRACE_LEVEL_INFO IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_TRACE_LEVEL_DEBUG IA_CSS_TRACE_LEVEL_DISABLED
+		#define PSYSAPI_TRACE_LEVEL_VERBOSE IA_CSS_TRACE_LEVEL_DISABLED
+	#elif PSYSAPI_TRACE_CONFIG == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
+		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
+		#define PSYSAPI_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
+		#define PSYSAPI_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_TRACE_LEVEL_ERROR IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_TRACE_LEVEL_WARNING IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_TRACE_LEVEL_INFO IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_TRACE_LEVEL_DEBUG IA_CSS_TRACE_LEVEL_ENABLED
+		#define PSYSAPI_TRACE_LEVEL_VERBOSE IA_CSS_TRACE_LEVEL_ENABLED
+	#else
+		#error "No PSYSAPI_TRACE_CONFIG Tracing level defined"
+	#endif
+#else
+	#error "PSYSAPI_TRACE_CONFIG not defined"
+#endif
+
+/* Overriding submodules in PSYSAPI with a specific tracing level */
+/* #define PSYSAPI_DYNAMIC_TRACING_OVERRIDE TRACE_LOG_LEVEL_VERBOSE */
+
+#endif /* __IA_CSS_PSYSAPI_TRACE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm.h
new file mode 100644
index 000000000000..06ccb0738415
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm.h
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_RBM_H
+#define __IA_CSS_RBM_H
+
+#include "ia_css_rbm_storage_class.h"
+#include <type_support.h>
+
+/*
+ * IPU6 adds a lot of mux/demux/blk,
+ * 96 bits is not enough
+ * need 160 bits (has to multiply of 32 bits)
+ * after X2B / DOL / PAF enabled in isa_lb PG
+ */
+#define IA_CSS_RBM_BITS 160
+/** An element is a 32 bit unsigned integer. 64 bit integers might cause
+ * problems in the compiler.
+ */
+#define IA_CSS_RBM_ELEM_TYPE uint32_t
+#define IA_CSS_RBM_ELEM_BITS \
+	(sizeof(IA_CSS_RBM_ELEM_TYPE)*8)
+#define IA_CSS_RBM_NOF_ELEMS \
+	((IA_CSS_RBM_BITS) / (IA_CSS_RBM_ELEM_BITS))
+
+/** Users should make no assumption about the actual type of
+ * ia_css_rbm_t.
+ */
+typedef struct {
+	IA_CSS_RBM_ELEM_TYPE data[IA_CSS_RBM_NOF_ELEMS];
+} ia_css_rbm_elems_t;
+typedef ia_css_rbm_elems_t ia_css_rbm_t;
+
+/** Print the bits of a routing bitmap
+ * @return < 0 on error
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+int ia_css_rbm_print(
+	const ia_css_rbm_t	bitmap,
+	void *fid);
+
+/** Create an empty routing bitmap
+ * @return bitmap = 0
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+ia_css_rbm_t ia_css_rbm_clear(void);
+
+/** Creates the complement of a routing bitmap
+ * @param	bitmap[in] routing bitmap
+ * @return ~bitmap
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+ia_css_rbm_t ia_css_rbm_complement(
+	const ia_css_rbm_t bitmap);
+
+/** Create the union of two routing bitmaps
+ * @param	bitmap0[in]	routing bitmap 0
+ * @param	bitmap1[in]	routing bitmap 1
+ * @return bitmap0 | bitmap1
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+ia_css_rbm_t ia_css_rbm_union(
+	const ia_css_rbm_t bitmap0,
+	const ia_css_rbm_t bitmap1);
+
+/** Create the intersection of two routing bitmaps
+ * @param	bitmap0[in]	routing bitmap 0
+ * @param	bitmap1[in] routing bitmap 1
+ * @return bitmap0 & bitmap1
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+ia_css_rbm_t ia_css_rbm_intersection(
+	const ia_css_rbm_t			bitmap0,
+	const ia_css_rbm_t			bitmap1);
+
+/** Check if the routing bitmaps is empty
+ * @param bitmap[in] routing bitmap
+ * @return bitmap == 0
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+bool ia_css_is_rbm_empty(
+	const ia_css_rbm_t bitmap);
+
+/** Check if the intersection of two routing bitmaps is empty
+ * @param bitmap0[in] routing bitmap 0
+ * @param bitmap1[in] routing bitmap 1
+ * @return (bitmap0 & bitmap1) == 0
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+bool ia_css_is_rbm_intersection_empty(
+	const ia_css_rbm_t bitmap0,
+	const ia_css_rbm_t bitmap1);
+
+/** Check if the second routing bitmap is a subset of the first (or equal)
+ * @param bitmap0[in] routing bitmap 0
+ * @param bitmap1[in routing bitmap 1
+ * Note: An empty set is always a subset, this function
+ * returns true if bitmap 1 is empty
+ * @return (bitmap0 & bitmap1) == bitmap1
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+bool ia_css_is_rbm_subset(
+	const ia_css_rbm_t bitmap0,
+	const ia_css_rbm_t bitmap1);
+
+/** Check if the routing bitmaps are equal
+ * @param bitmap0[in] routing bitmap 0
+ * @param bitmap1[in] routing bitmap 1
+ * @return bitmap0 == bitmap1
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+bool ia_css_is_rbm_equal(
+	const ia_css_rbm_t bitmap0,
+	const ia_css_rbm_t bitmap1);
+
+/** Checks whether a specific kernel bit is set
+ * @return bitmap[index] == 1
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+int ia_css_is_rbm_set(
+	const ia_css_rbm_t bitmap,
+	const unsigned int index);
+
+/** Returns range of bits as integer
+ * @return bitmap[index, index+size]
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+int ia_css_rbm_range_val(
+	const ia_css_rbm_t bitmap,
+	const unsigned int index,
+	const unsigned int size);
+
+/** Create the union of a routing bitmap with a onehot bitmap
+ * with a bit set at index
+ * @return bitmap[index] |= 1
+*/
+IA_CSS_RBM_STORAGE_CLASS_H
+ia_css_rbm_t ia_css_rbm_set(
+	const ia_css_rbm_t bitmap,
+	const unsigned int index);
+
+/*! Set elem_index-th 32-bit element of the bitmap to elem_value
+ * @return updated bitmap
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+ia_css_rbm_t ia_css_rbm_set_element_from_uint32(
+	const ia_css_rbm_t bitmap,
+	const unsigned int elem_index,
+	const uint32_t     elem_value);
+
+/** Creates routing bitmap using a uint64 value.
+ * @return bitmap with the same bits set as in value (provided that width of bitmap is sufficient).
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+ia_css_rbm_t ia_css_rbm_create_from_uint64(
+	const uint64_t	value);
+
+/** Converts an ia_css_rbm_t type to uint64_t. Note that if
+ *  ia_css_rbm_t contains more then 64 bits, only the lowest 64 bits
+ *  are returned.
+ *  @return uint64_t representation of value
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+uint64_t ia_css_rbm_to_uint64(
+	const ia_css_rbm_t value);
+
+/** Creates a routing bitmap with the bit at index 'index' removed.
+ * @return ~(1 << index) & bitmap
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+ia_css_rbm_t ia_css_rbm_unset(
+	const ia_css_rbm_t bitmap,
+	const unsigned int index);
+
+/** Create a onehot routing bitmap with a bit set at index
+ * @return bitmap[index] = 1
+ */
+IA_CSS_RBM_STORAGE_CLASS_H
+ia_css_rbm_t ia_css_rbm_bit_mask(
+	const unsigned int index);
+
+#ifdef __IA_CSS_RBM_INLINE__
+#include "ia_css_rbm_impl.h"
+#endif /* __IA_CSS_RBM_INLINE__ */
+
+#endif /* __IA_CSS_RBM_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_impl.h
new file mode 100644
index 000000000000..26bf5bad63e4
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_impl.h
@@ -0,0 +1,410 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ia_css_rbm.h"
+#include "type_support.h"
+#include "misc_support.h"
+#include "assert_support.h"
+#include "math_support.h"
+#include "ia_css_rbm_trace.h"
+
+STORAGE_CLASS_INLINE int ia_css_rbm_compute_weight(
+	const ia_css_rbm_t bitmap);
+
+STORAGE_CLASS_INLINE ia_css_rbm_t ia_css_rbm_shift(
+	const ia_css_rbm_t bitmap);
+
+IA_CSS_RBM_STORAGE_CLASS_C
+bool ia_css_is_rbm_intersection_empty(
+	const ia_css_rbm_t bitmap0,
+	const ia_css_rbm_t bitmap1)
+{
+	ia_css_rbm_t intersection;
+
+	IA_CSS_TRACE_0(RBM, VERBOSE,
+		"ia_css_is_rbm_intersection_empty(): enter:\n");
+
+	intersection = ia_css_rbm_intersection(bitmap0, bitmap1);
+	return ia_css_is_rbm_empty(intersection);
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+bool ia_css_is_rbm_empty(
+	const ia_css_rbm_t bitmap)
+{
+	unsigned int i;
+	bool is_empty = true;
+
+	IA_CSS_TRACE_0(RBM, VERBOSE,
+		"ia_css_is_rbm_empty(): enter:\n");
+	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
+		is_empty &= bitmap.data[i] == 0;
+	}
+	return is_empty;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+bool ia_css_is_rbm_equal(
+	const ia_css_rbm_t bitmap0,
+	const ia_css_rbm_t bitmap1)
+{
+	unsigned int i;
+	bool is_equal = true;
+
+	IA_CSS_TRACE_0(RBM, VERBOSE,
+		"ia_css_is_rbm_equal(): enter:\n");
+	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
+		is_equal = is_equal && (bitmap0.data[i] == bitmap1.data[i]);
+	}
+	return is_equal;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+bool ia_css_is_rbm_subset(
+	const ia_css_rbm_t bitmap0,
+	const ia_css_rbm_t bitmap1)
+{
+	unsigned int i;
+	bool is_subset = true;
+
+	/* checks if bitmap1 is subset of bitmap 0 */
+	IA_CSS_TRACE_0(RBM, VERBOSE,
+		"ia_css_is_rbm_subset(): enter:\n");
+
+	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
+		is_subset &= ((bitmap0.data[i] & bitmap1.data[i]) == bitmap1.data[i]);
+	}
+
+	return is_subset;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+ia_css_rbm_t ia_css_rbm_clear(void)
+{
+	unsigned int i;
+	ia_css_rbm_t bitmap = {{0} };
+
+	IA_CSS_TRACE_0(RBM, VERBOSE,
+		"ia_css_rbm_clear(): enter:\n");
+	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
+		bitmap.data[i] = 0;
+	}
+	return bitmap;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+ia_css_rbm_t ia_css_rbm_complement(
+	const ia_css_rbm_t bitmap)
+{
+	unsigned int i;
+	ia_css_rbm_t result = {{0} };
+
+	IA_CSS_TRACE_0(RBM, VERBOSE,
+		"ia_css_rbm_complement(): enter:\n");
+	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
+		result.data[i] = ~bitmap.data[i];
+	}
+	return result;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+ia_css_rbm_t ia_css_rbm_union(
+	const ia_css_rbm_t bitmap0,
+	const ia_css_rbm_t bitmap1)
+{
+	unsigned int i;
+	ia_css_rbm_t result = {{0} };
+
+	IA_CSS_TRACE_0(RBM, VERBOSE,
+		"ia_css_rbm_union(): enter:\n");
+	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
+		result.data[i] = (bitmap0.data[i] | bitmap1.data[i]);
+	}
+	return result;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+ia_css_rbm_t ia_css_rbm_intersection(
+	const ia_css_rbm_t bitmap0,
+	const ia_css_rbm_t bitmap1)
+{
+	unsigned int i;
+	ia_css_rbm_t result = {{0} };
+
+	IA_CSS_TRACE_0(RBM, VERBOSE,
+		"ia_css_rbm_intersection(): enter:\n");
+	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
+		result.data[i] = (bitmap0.data[i] & bitmap1.data[i]);
+	}
+	return result;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+ia_css_rbm_t ia_css_rbm_set(
+	const ia_css_rbm_t bitmap,
+	const unsigned int index)
+{
+	ia_css_rbm_t bit_mask;
+
+	IA_CSS_TRACE_0(RBM, VERBOSE,
+		"ia_css_rbm_set(): enter:\n");
+
+	bit_mask = ia_css_rbm_bit_mask(index);
+	return ia_css_rbm_union(bitmap, bit_mask);
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+ia_css_rbm_t ia_css_rbm_set_element_from_uint32(
+	const ia_css_rbm_t bitmap,
+	const unsigned int elem_index,
+	const uint32_t     elem_value)
+{
+	ia_css_rbm_t result = bitmap;
+
+	IA_CSS_TRACE_0(RBM, VERBOSE,
+		"ia_css_rbm_set_element_from_uint32(): enter:\n");
+
+	COMPILATION_ERROR_IF(sizeof(bitmap.data[elem_index]) != sizeof(elem_value));
+
+	if (elem_index < IA_CSS_RBM_NOF_ELEMS) {
+		result.data[elem_index] = elem_value;
+	} else {
+		assert(0);
+	}
+
+	return result;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+ia_css_rbm_t ia_css_rbm_create_from_uint64(
+	const uint64_t value)
+{
+	unsigned int i;
+	ia_css_rbm_t result;
+	const unsigned int bits64 = sizeof(uint64_t) * 8;
+	const unsigned int nof_elems_bits64 = bits64 / IA_CSS_RBM_ELEM_BITS;
+
+	IA_CSS_TRACE_0(RBM, VERBOSE,
+		"ia_css_rbm_create_from_uint64(): enter:\n");
+
+	result = ia_css_rbm_clear();
+	for (i = 0; i < MIN(nof_elems_bits64, IA_CSS_RBM_NOF_ELEMS); i++) {
+		/* masking is done implictly, the MSB bits of casting will be chopped off */
+		result.data[i] = (IA_CSS_RBM_ELEM_TYPE)
+			(value >> (i * IA_CSS_RBM_ELEM_BITS));
+	}
+
+	return result;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+uint64_t ia_css_rbm_to_uint64(
+	const ia_css_rbm_t value)
+{
+	const unsigned int bits64 = sizeof(uint64_t) * 8;
+	const unsigned int nof_elems_bits64 = bits64 / IA_CSS_RBM_ELEM_BITS;
+	unsigned int i;
+	uint64_t res = 0;
+
+	IA_CSS_TRACE_0(RBM, VERBOSE,
+		"ia_css_rbm_to_uint64(): enter:\n");
+
+	assert((bits64 % IA_CSS_RBM_ELEM_BITS) == 0);
+	assert(nof_elems_bits64 > 0);
+
+	for (i = 0; i < MIN(IA_CSS_RBM_NOF_ELEMS, nof_elems_bits64); i++) {
+		res |= ((uint64_t)(value.data[i]) << (i * IA_CSS_RBM_ELEM_BITS));
+	}
+	for (; i < IA_CSS_RBM_NOF_ELEMS; i++) {
+		assert(value.data[i] == 0);
+	}
+	return res;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+ia_css_rbm_t ia_css_rbm_unset(
+	const ia_css_rbm_t bitmap,
+	const unsigned int index)
+{
+	ia_css_rbm_t result;
+
+	IA_CSS_TRACE_0(RBM, VERBOSE,
+		"ia_css_rbm_unset(): enter:\n");
+
+	result = ia_css_rbm_bit_mask(index);
+	result = ia_css_rbm_complement(result);
+	return ia_css_rbm_intersection(bitmap, result);
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+ia_css_rbm_t ia_css_rbm_bit_mask(
+	const unsigned int index)
+{
+	unsigned int elem_index;
+	unsigned int elem_bit_index;
+	ia_css_rbm_t bit_mask = ia_css_rbm_clear();
+
+	assert(index < IA_CSS_RBM_BITS);
+
+	IA_CSS_TRACE_0(RBM, VERBOSE,
+		"ia_css_rbm_bit_mask(): enter:\n");
+	if (index < IA_CSS_RBM_BITS) {
+		elem_index = index / IA_CSS_RBM_ELEM_BITS;
+		elem_bit_index = index % IA_CSS_RBM_ELEM_BITS;
+		assert(elem_index < IA_CSS_RBM_NOF_ELEMS);
+
+		bit_mask.data[elem_index] = 1 << elem_bit_index;
+	}
+	return bit_mask;
+}
+
+STORAGE_CLASS_INLINE
+int ia_css_rbm_compute_weight(
+	const ia_css_rbm_t bitmap)
+{
+	ia_css_rbm_t loc_bitmap;
+	int weight = 0;
+	int i;
+
+	IA_CSS_TRACE_0(RBM, VERBOSE,
+		"ia_css_rbm_compute_weight(): enter:\n");
+
+	loc_bitmap = bitmap;
+
+	/* In fact; do not need the iterator "i" */
+	for (i = 0; (i < IA_CSS_RBM_BITS) &&
+		!ia_css_is_rbm_empty(loc_bitmap); i++) {
+		weight += ia_css_is_rbm_set(loc_bitmap, 0);
+		loc_bitmap = ia_css_rbm_shift(loc_bitmap);
+	}
+
+	return weight;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+int ia_css_rbm_range_val(
+	const ia_css_rbm_t bitmap,
+	const unsigned int index,
+	const unsigned int size)
+{
+	unsigned int elem_index;
+	unsigned int elem_bit_index;
+	unsigned int res;
+	unsigned int elem_index_end;
+	unsigned int mask;
+
+	IA_CSS_TRACE_0(RBM, VERBOSE, "ia_css_rbm_range_val(): enter:\n");
+	assert(index < IA_CSS_RBM_BITS);
+	/* Extract the bit range from the data array relevane entry */
+	elem_index = index / IA_CSS_RBM_ELEM_BITS;
+	elem_index_end = (index + size - 1) / IA_CSS_RBM_ELEM_BITS;
+	elem_bit_index = index % IA_CSS_RBM_ELEM_BITS;
+	assert(elem_index < IA_CSS_RBM_NOF_ELEMS);
+	mask =  (1 << size) - 1;
+	res = (bitmap.data[elem_index] >> elem_bit_index) & mask;
+	/* In case that the bit range is divided between 2 different data array entries */
+	if (elem_index != elem_index_end) {
+		unsigned int first_elem_size = IA_CSS_RBM_ELEM_BITS - index;
+		unsigned int second_elem_size = size - first_elem_size;
+
+		mask = (1 << second_elem_size) - 1;
+		res |= ((bitmap.data[elem_index_end] & mask) << first_elem_size);
+	}
+	return res;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+int ia_css_is_rbm_set(
+	const ia_css_rbm_t bitmap,
+	const unsigned int index)
+{
+	unsigned int elem_index;
+	unsigned int elem_bit_index;
+
+	IA_CSS_TRACE_0(RBM, VERBOSE,
+		"ia_css_is_rbm_set(): enter:\n");
+
+	assert(index < IA_CSS_RBM_BITS);
+
+	elem_index = index / IA_CSS_RBM_ELEM_BITS;
+	elem_bit_index = index % IA_CSS_RBM_ELEM_BITS;
+	assert(elem_index < IA_CSS_RBM_NOF_ELEMS);
+	return (((bitmap.data[elem_index] >> elem_bit_index) & 0x1) == 1);
+}
+
+STORAGE_CLASS_INLINE
+ia_css_rbm_t ia_css_rbm_shift(
+	const ia_css_rbm_t bitmap)
+{
+	int i;
+	unsigned int lsb_current_elem = 0;
+	unsigned int lsb_previous_elem = 0;
+	ia_css_rbm_t loc_bitmap;
+
+	IA_CSS_TRACE_0(RBM, VERBOSE,
+		"ia_css_rbm_shift(): enter:\n");
+
+	loc_bitmap = bitmap;
+
+	for (i = IA_CSS_RBM_NOF_ELEMS - 1; i >= 0; i--) {
+		lsb_current_elem = bitmap.data[i] & 0x01;
+		loc_bitmap.data[i] >>= 1;
+		loc_bitmap.data[i] |= (lsb_previous_elem << (IA_CSS_RBM_ELEM_BITS - 1));
+		lsb_previous_elem = lsb_current_elem;
+	}
+	return loc_bitmap;
+}
+
+IA_CSS_RBM_STORAGE_CLASS_C
+int ia_css_rbm_print(
+	const ia_css_rbm_t bitmap,
+	void               *fid)
+{
+	int i;
+	const IA_CSS_RBM_ELEM_TYPE *data = &bitmap.data[0];
+
+	NOT_USED(fid);
+
+	CT_ASSERT(IA_CSS_RBM_NOF_ELEMS > 0);
+	CT_ASSERT(IA_CSS_RBM_ELEM_BITS <= 32); /* because we print 32 bit integers */
+
+	if (IA_CSS_RBM_NOF_ELEMS == 1) {
+		IA_CSS_TRACE_1(RBM, INFO, "ia_css_rbm_print(): rbm: %08x\n",
+			data[0]);
+
+	} else if (IA_CSS_RBM_NOF_ELEMS == 2) {
+		IA_CSS_TRACE_2(RBM, INFO, "ia_css_rbm_print(): rbm: %08x %08x\n",
+			data[1], data[0]);
+
+	} else if (IA_CSS_RBM_NOF_ELEMS == 3) {
+		IA_CSS_TRACE_3(RBM, INFO, "ia_css_rbm_print(): rbm: %08x %08x %08x\n",
+			data[2], data[1], data[0]);
+
+	} else if (IA_CSS_RBM_NOF_ELEMS == 4) {
+		IA_CSS_TRACE_4(RBM, INFO, "ia_css_rbm_print(): rbm: %08x %08x %08x %08x\n",
+			data[3], data[2], data[1], data[0]);
+
+	} else {
+		IA_CSS_TRACE_0(RBM, INFO, "ia_css_rbm_print(): rbm: {\n");
+
+		for (i = IA_CSS_RBM_NOF_ELEMS - 1; i >= 0 ; i--) {
+			IA_CSS_TRACE_1(RBM, INFO, "\t%08x\n", data[i]);
+		}
+		IA_CSS_TRACE_0(RBM, INFO, "}\n");
+	}
+
+	return 0;
+}
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest.h
new file mode 100644
index 000000000000..d3c2423e7d02
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest.h
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_RBM_MANIFEST_H
+#define __IA_CSS_RBM_MANIFEST_H
+
+#include "type_support.h"
+#include "ia_css_rbm_manifest_types.h"
+
+/** Returns the descriptor size of the RBM manifest.
+ */
+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
+unsigned int
+ia_css_rbm_manifest_get_size(void);
+
+/** Initializes the RBM manifest.
+ * @param rbm[in] Routing bitmap.
+ */
+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
+void
+ia_css_rbm_manifest_init(struct ia_css_rbm_manifest_s *rbm);
+
+/** Returns a pointer to the array of mux descriptors.
+ * @param manifest[in] Routing bitmap manifest.
+ * @return NULL on error
+ */
+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
+ia_css_rbm_mux_desc_t *
+ia_css_rbm_manifest_get_muxes(const ia_css_rbm_manifest_t *manifest);
+
+/** Returns the size of mux descriptors array.
+ * @param manifest[in] Routing bitmap manifest.
+ * @return size
+ */
+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
+unsigned int
+ia_css_rbm_manifest_get_mux_count(const ia_css_rbm_manifest_t *manifest);
+
+/** Returns a pointer to the array of validation descriptors.
+ * @param manifest[in] Routing bitmap manifest.
+ * @return NULL on error
+ */
+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
+ia_css_rbm_validation_rule_t *
+ia_css_rbm_manifest_get_validation_rules(const ia_css_rbm_manifest_t *manifest);
+
+/** Returns the size of the validation descriptor array.
+ * @param manifest[in] Routing bitmap manifest.
+ * @return size
+ */
+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
+unsigned int
+ia_css_rbm_manifest_get_validation_rule_count(const ia_css_rbm_manifest_t *manifest);
+
+/** Returns a pointer to the array of terminal routing descriptors.
+ * @param manifest[in] Routing bitmap manifest.
+ * @return NULL on error
+ */
+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
+ia_css_rbm_terminal_routing_desc_t *
+ia_css_rbm_manifest_get_terminal_routing_desc(const ia_css_rbm_manifest_t *manifest);
+
+/** \brief Returns the size of the terminal routing descriptor array.
+ * Note: pretty printing differs from on host and on IPU.
+ * @param manifest[in] Routing bitmap manifest.
+ * @return size
+ */
+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
+unsigned int
+ia_css_rbm_manifest_get_terminal_routing_desc_count(const ia_css_rbm_manifest_t *manifest);
+
+/** Pretty prints the routing bitmap manifest.
+ * @param manifest[in] Routing bitmap manifest.
+ */
+void
+ia_css_rbm_manifest_print(const ia_css_rbm_manifest_t *manifest);
+
+/** \brief Pretty prints a RBM (routing bitmap).
+ * Note: pretty printing differs from on host and on IPU.
+ * @param rbm[in]             Routing bitmap.
+ * @param mux[in]             List of mux descriptors corresponding to rbm.
+ * @param mux_desc_count[in]  Number of muxes in list mux.
+ */
+void
+ia_css_rbm_pretty_print(
+	const ia_css_rbm_t *rbm,
+	const ia_css_rbm_mux_desc_t *mux,
+	unsigned int mux_desc_count);
+
+/** \brief check for the validity of a routing bitmap.
+ * @param manifest[in] Routing bitmap manifest.
+ * @param rbm[in]      Routing bitmap
+ * @return true on match.
+ */
+bool
+ia_css_rbm_manifest_check_rbm_validity(
+	const ia_css_rbm_manifest_t *manifest,
+	const ia_css_rbm_t *rbm);
+
+/** \brief sets, using manifest info, the value of a mux in the routing bitmap.
+ * @param rbm[in]             Routing bitmap.
+ * @param mux[in]             List of mux descriptors corresponding to rbm.
+ * @param mux_count[in]       Number of muxes in list mux.
+ * @param gp_dev_id[in]       ID of sub system (PSA/ISA) where the mux is located.
+ * @param mux_id[in]          ID of mux to set configuration for.
+ * @param value[in]           Value of the mux.
+ * @return routing bitmap.
+ */
+ia_css_rbm_t
+ia_css_rbm_set_mux(
+	ia_css_rbm_t rbm,
+	ia_css_rbm_mux_desc_t *mux,
+	unsigned int mux_count,
+	unsigned int gp_dev_id,
+	unsigned int mux_id,
+	unsigned int value);
+
+/** \brief Gets the value of a mux.
+ * @param rbm      routing bitmap
+ * @param mux_desc mux descriptor
+ * @return Mux value corresponding to mux_desc, -1 on error.
+ */
+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
+int
+ia_css_rbm_get_mux_value(
+	const ia_css_rbm_t *rbm,
+	const ia_css_rbm_mux_desc_t *mux_desc);
+
+#ifdef __IA_CSS_RBM_MANIFEST_INLINE__
+#include "ia_css_rbm_manifest_impl.h"
+#endif /* __IA_CSS_RBM_MANIFEST_INLINE__ */
+
+#endif /* __IA_CSS_RBM_MANIFEST_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest_types.h
new file mode 100644
index 000000000000..45f77dbb89dc
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest_types.h
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_RBM_MANIFEST_TYPES_H
+#define __IA_CSS_RBM_MANIFEST_TYPES_H
+
+#include "ia_css_rbm.h"
+#include "vied_nci_psys_resource_model.h"
+
+#ifndef VIED_NCI_RBM_MAX_MUX_COUNT
+#error Please define VIED_NCI_RBM_MAX_MUX_COUNT
+#endif
+#ifndef VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT
+#error Please define VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT
+#endif
+#ifndef VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT
+#error Please define VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT
+#endif
+#ifndef N_PADDING_UINT8_IN_RBM_MANIFEST
+#error Please define N_PADDING_UINT8_IN_RBM_MANIFEST
+#endif
+
+#define SIZE_OF_RBM_MUX_DESC_S ( \
+	(4 * IA_CSS_UINT8_T_BITS))
+
+typedef struct ia_css_rbm_mux_desc_s {
+	uint8_t gp_dev_id;
+	uint8_t mux_id;
+	uint8_t offset;
+	uint8_t size_bits;
+} ia_css_rbm_mux_desc_t;
+
+#define SIZE_OF_RBM_VALIDATION_RULE_DESC_S ( \
+	  (1 * IA_CSS_RBM_BITS) \
+	+ (1 * IA_CSS_UINT32_T_BITS))
+
+typedef struct ia_css_rbm_validation_rule_s {
+	ia_css_rbm_t match; /* RBM is an array of 32 bit elements */
+	uint32_t expected_value;
+} ia_css_rbm_validation_rule_t;
+
+#define SIZE_OF_RBM_TERMINAL_ROUTING_DESC_S ( \
+	(4 * IA_CSS_UINT8_T_BITS))
+
+typedef struct ia_css_rbm_terminal_routing_desc_s {
+	uint8_t terminal_id;
+	uint8_t connection_state;
+	uint8_t mux_id;
+	uint8_t state;
+} ia_css_rbm_terminal_routing_desc_t;
+
+#define SIZE_OF_RBM_MANIFEST_S ( \
+	  (VIED_NCI_RBM_MAX_MUX_COUNT * SIZE_OF_RBM_MUX_DESC_S) \
+	+ (VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT * SIZE_OF_RBM_VALIDATION_RULE_DESC_S) \
+	+ (VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT * SIZE_OF_RBM_TERMINAL_ROUTING_DESC_S) \
+	+ (3 * IA_CSS_UINT16_T_BITS) \
+	+ (N_PADDING_UINT8_IN_RBM_MANIFEST * IA_CSS_UINT8_T_BITS))
+
+typedef struct ia_css_rbm_manifest_s {
+#if VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT > 0
+	ia_css_rbm_validation_rule_t
+		validation_rules[VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT];
+#endif
+	uint16_t mux_desc_count;
+	uint16_t validation_rule_count;
+	uint16_t terminal_routing_desc_count;
+
+#if VIED_NCI_RBM_MAX_MUX_COUNT > 0
+	ia_css_rbm_mux_desc_t
+		mux_desc[VIED_NCI_RBM_MAX_MUX_COUNT];
+#endif
+
+#if VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT > 0
+	ia_css_rbm_terminal_routing_desc_t
+		terminal_routing_desc[VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT];
+#endif
+
+#if N_PADDING_UINT8_IN_RBM_MANIFEST > 0
+	uint8_t padding[N_PADDING_UINT8_IN_RBM_MANIFEST];
+#endif
+} ia_css_rbm_manifest_t;
+
+#endif /* __IA_CSS_RBM_MANIFEST_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_storage_class.h
new file mode 100644
index 000000000000..5f72bd1736f5
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_storage_class.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_RBM_STORAGE_CLASS_H
+#define __IA_CSS_RBM_STORAGE_CLASS_H
+
+#include "storage_class.h"
+
+#ifndef __IA_CSS_RBM_INLINE__
+#define IA_CSS_RBM_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
+#define IA_CSS_RBM_STORAGE_CLASS_C
+#else
+#define IA_CSS_RBM_STORAGE_CLASS_H STORAGE_CLASS_INLINE
+#define IA_CSS_RBM_STORAGE_CLASS_C STORAGE_CLASS_INLINE
+#endif
+
+#ifndef __IA_CSS_RBM_MANIFEST_INLINE__
+#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
+#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_C
+#else
+#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H STORAGE_CLASS_INLINE
+#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_C STORAGE_CLASS_INLINE
+#endif
+
+#endif /* __IA_CSS_RBM_STORAGE_CLASS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_trace.h
new file mode 100644
index 000000000000..bcffc10c6e32
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_trace.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_RBM_TRACE_H
+#define __IA_CSS_RBM_TRACE_H
+
+#include "ia_css_trace.h"
+
+/* Not using 0 to identify wrong configuration being passed from the .mk file outside.
+* Log levels not in the range below will cause a "No RBM_TRACE_CONFIG Tracing level defined"
+*/
+#define RBM_TRACE_LOG_LEVEL_OFF 1
+#define RBM_TRACE_LOG_LEVEL_NORMAL 2
+#define RBM_TRACE_LOG_LEVEL_DEBUG 3
+
+#define RBM_TRACE_CONFIG_DEFAULT RBM_TRACE_LOG_LEVEL_NORMAL
+
+#if !defined(RBM_TRACE_CONFIG)
+#	define RBM_TRACE_CONFIG RBM_TRACE_CONFIG_DEFAULT
+#endif
+
+/* IPU_RESOURCE Module tracing backend is mapped to TUNIT tracing for target platforms */
+#ifdef __HIVECC
+#	ifndef HRT_CSIM
+#		define RBM_TRACE_METHOD IA_CSS_TRACE_METHOD_TRACE
+#	else
+#		define RBM_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
+#	endif
+#else
+#	define RBM_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
+#endif
+
+#if (defined(RBM_TRACE_CONFIG))
+/* Module specific trace setting */
+#	if RBM_TRACE_CONFIG == RBM_TRACE_LOG_LEVEL_OFF
+/* RBM_TRACE_LOG_LEVEL_OFF */
+#		define RBM_TRACE_LEVEL_ASSERT	IA_CSS_TRACE_LEVEL_DISABLED
+#		define RBM_TRACE_LEVEL_ERROR	IA_CSS_TRACE_LEVEL_DISABLED
+#		define RBM_TRACE_LEVEL_WARNING	IA_CSS_TRACE_LEVEL_DISABLED
+#		define RBM_TRACE_LEVEL_INFO	IA_CSS_TRACE_LEVEL_DISABLED
+#		define RBM_TRACE_LEVEL_DEBUG	IA_CSS_TRACE_LEVEL_DISABLED
+#		define RBM_TRACE_LEVEL_VERBOSE	IA_CSS_TRACE_LEVEL_DISABLED
+#	elif RBM_TRACE_CONFIG == RBM_TRACE_LOG_LEVEL_NORMAL
+/* RBM_TRACE_LOG_LEVEL_NORMAL */
+#		define RBM_TRACE_LEVEL_ASSERT	IA_CSS_TRACE_LEVEL_DISABLED
+#		define RBM_TRACE_LEVEL_ERROR	IA_CSS_TRACE_LEVEL_ENABLED
+#		define RBM_TRACE_LEVEL_WARNING	IA_CSS_TRACE_LEVEL_DISABLED
+#		define RBM_TRACE_LEVEL_INFO	IA_CSS_TRACE_LEVEL_ENABLED
+#		define RBM_TRACE_LEVEL_DEBUG	IA_CSS_TRACE_LEVEL_DISABLED
+#		define RBM_TRACE_LEVEL_VERBOSE	IA_CSS_TRACE_LEVEL_DISABLED
+#	elif RBM_TRACE_CONFIG == RBM_TRACE_LOG_LEVEL_DEBUG
+/* RBM_TRACE_LOG_LEVEL_DEBUG */
+#		define RBM_TRACE_LEVEL_ASSERT	IA_CSS_TRACE_LEVEL_ENABLED
+#		define RBM_TRACE_LEVEL_ERROR	IA_CSS_TRACE_LEVEL_ENABLED
+#		define RBM_TRACE_LEVEL_WARNING	IA_CSS_TRACE_LEVEL_ENABLED
+#		define RBM_TRACE_LEVEL_INFO	IA_CSS_TRACE_LEVEL_ENABLED
+#		define RBM_TRACE_LEVEL_DEBUG	IA_CSS_TRACE_LEVEL_ENABLED
+#		define RBM_TRACE_LEVEL_VERBOSE	IA_CSS_TRACE_LEVEL_ENABLED
+#	else
+#		error "No RBM_TRACE_CONFIG Tracing level defined"
+#	endif
+#else
+#	error "RBM_TRACE_CONFIG not defined"
+#endif
+
+#endif /* __RBM_TRACE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal.h
new file mode 100644
index 000000000000..4c0af262a13b
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal.h
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_TERMINAL_H
+#define __IA_CSS_TERMINAL_H
+
+#include "type_support.h"
+#include "ia_css_terminal_types.h"
+#include "ia_css_param_storage_class.h"
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_param_in_terminal_get_descriptor_size(
+	const unsigned int nof_sections
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_param_section_desc_t *
+ia_css_param_in_terminal_get_param_section_desc(
+	const ia_css_param_terminal_t *param_terminal,
+	const unsigned int section_index
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_param_out_terminal_get_descriptor_size(
+	const unsigned int nof_sections,
+	const unsigned int nof_fragments
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_param_section_desc_t *
+ia_css_param_out_terminal_get_param_section_desc(
+	const ia_css_param_terminal_t *param_terminal,
+	const unsigned int section_index,
+	const unsigned int nof_sections,
+	const unsigned int fragment_index
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+int ia_css_param_terminal_create(
+	ia_css_param_terminal_t *param_terminal,
+	const uint16_t terminal_offset,
+	const uint16_t terminal_size,
+	const uint16_t is_input_terminal
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_spatial_param_terminal_get_descriptor_size(
+	const unsigned int nof_frame_param_sections,
+	const unsigned int nof_fragments
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_fragment_grid_desc_t *
+ia_css_spatial_param_terminal_get_fragment_grid_desc(
+	const ia_css_spatial_param_terminal_t *spatial_param_terminal,
+	const unsigned int fragment_index
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_frame_grid_param_section_desc_t *
+ia_css_spatial_param_terminal_get_frame_grid_param_section_desc(
+	const ia_css_spatial_param_terminal_t *spatial_param_terminal,
+	const unsigned int section_index
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+int ia_css_spatial_param_terminal_create(
+	ia_css_spatial_param_terminal_t *spatial_param_terminal,
+	const uint16_t terminal_offset,
+	const uint16_t terminal_size,
+	const uint16_t is_input_terminal,
+	const unsigned int nof_fragments,
+	const uint32_t kernel_id
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_sliced_param_terminal_get_descriptor_size(
+	const unsigned int nof_slice_param_sections,
+	const unsigned int nof_slices[],
+	const unsigned int nof_fragments
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_fragment_slice_desc_t *
+ia_css_sliced_param_terminal_get_fragment_slice_desc(
+	const ia_css_sliced_param_terminal_t *sliced_param_terminal,
+	const unsigned int fragment_index
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_slice_param_section_desc_t *
+ia_css_sliced_param_terminal_get_slice_param_section_desc(
+	const ia_css_sliced_param_terminal_t *sliced_param_terminal,
+	const unsigned int fragment_index,
+	const unsigned int slice_index,
+	const unsigned int section_index,
+	const unsigned int nof_slice_param_sections
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+int ia_css_sliced_param_terminal_create(
+	ia_css_sliced_param_terminal_t *sliced_param_terminal,
+	const uint16_t terminal_offset,
+	const uint16_t terminal_size,
+	const uint16_t is_input_terminal,
+	const unsigned int nof_slice_param_sections,
+	const unsigned int nof_slices[],
+	const unsigned int nof_fragments,
+	const uint32_t kernel_id
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_program_terminal_get_descriptor_size(
+	const unsigned int nof_fragments,
+	const unsigned int nof_fragment_param_sections,
+	const unsigned int nof_kernel_fragment_sequencer_infos,
+	const unsigned int nof_command_objs
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_fragment_param_section_desc_t *
+ia_css_program_terminal_get_frgmnt_prm_sct_desc(
+	const ia_css_program_terminal_t *program_terminal,
+	const unsigned int fragment_index,
+	const unsigned int section_index,
+	const unsigned int nof_fragment_param_sections
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_kernel_fragment_sequencer_info_desc_t *
+ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
+	const ia_css_program_terminal_t *program_terminal,
+	const unsigned int fragment_index,
+	const unsigned int info_index,
+	const unsigned int nof_kernel_fragment_sequencer_infos
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+int ia_css_program_terminal_create(
+	ia_css_program_terminal_t *program_terminal,
+	const uint16_t terminal_offset,
+	const uint16_t terminal_size,
+	const unsigned int nof_fragments,
+	const unsigned int nof_kernel_fragment_sequencer_infos,
+	const unsigned int nof_command_objs
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+int ia_css_program_terminal_get_command_base_offset(
+	const ia_css_program_terminal_t *program_terminal,
+	const unsigned int nof_fragments,
+	const unsigned int nof_kernel_fragment_sequencer_infos,
+	const unsigned int commands_slots_used,
+	uint16_t *command_desc_offset
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+uint16_t *ia_css_program_terminal_get_line_count(
+	const ia_css_kernel_fragment_sequencer_command_desc_t
+	*kernel_fragment_sequencer_command_desc_base,
+	const unsigned int set_count
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_spatial_param_terminal_get_descriptor_size(
+	const unsigned int nof_frame_param_sections,
+	const unsigned int nof_fragments
+);
+
+#ifdef __INLINE_PARAMETERS__
+#include "ia_css_terminal_impl.h"
+#endif /* __INLINE_PARAMETERS__ */
+
+#endif /* __IA_CSS_TERMINAL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_base_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_base_types.h
new file mode 100644
index 000000000000..9a78969c4fcc
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_base_types.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_TERMINAL_BASE_TYPES_H
+#define __IA_CSS_TERMINAL_BASE_TYPES_H
+
+#include "type_support.h"
+#include "ia_css_terminal_defs.h"
+
+#define N_UINT16_IN_TERMINAL_STRUCT		3
+#define N_UINT32_IN_TERMINAL_STRUCT		1
+#define N_PADDING_UINT8_IN_TERMINAL_STRUCT	1
+
+#define SIZE_OF_TERMINAL_STRUCT_BITS \
+	(IA_CSS_TERMINAL_TYPE_BITS \
+	+ N_UINT32_IN_TERMINAL_STRUCT * IA_CSS_UINT32_T_BITS \
+	+ IA_CSS_TERMINAL_ID_BITS  \
+	+ N_UINT16_IN_TERMINAL_STRUCT * IA_CSS_UINT16_T_BITS \
+	+ N_PADDING_UINT8_IN_TERMINAL_STRUCT * IA_CSS_UINT8_T_BITS)
+
+/* ==================== Base Terminal - START ==================== */
+/** Base structure for all terminal types.
+ *
+ *  Terminals describe an opening between a program group and the outside world.
+ *  They come in various types (data, statisitics, parameters, etc.) which may have
+ *  extensions specific to those types.  This structure is the base for all of those and
+ *  must be the first field in any  subclassed terminal structure type.
+ */
+struct ia_css_terminal_s {						/**< Base terminal */
+	ia_css_terminal_type_t			terminal_type;		/**< Type ID of the terminal.  This type enum defines the purpose of the terminal and its structure. */
+	uint32_t				payload_size;	/**< Size of buffer passed in buffer set for this terminal */
+	int16_t					parent_offset;		/**< Offset to the containing process group */
+	uint16_t				size;			/**< Size of this whole terminal layout-structure, including subclassed extensions. */
+	uint16_t				tm_index;		/**< Index of the terminal manifest object in the program group manifest. */
+	ia_css_terminal_ID_t			ID;			/**< Absolute referal ID for this terminal, valid ID's != 0 */
+	uint8_t					padding[N_PADDING_UINT8_IN_TERMINAL_STRUCT];
+};
+/* ==================== Base Terminal - END ==================== */
+
+#endif /* __IA_CSS_TERMINAL_BASE_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_defs.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_defs.h
new file mode 100644
index 000000000000..3ce4184e9c78
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_defs.h
@@ -0,0 +1,209 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_TERMINAL_DEFS_H
+#define __IA_CSS_TERMINAL_DEFS_H
+
+#include "type_support.h"
+
+/**
+ * @addtogroup group_psysapi
+ * @{
+ */
+
+#define IA_CSS_TERMINAL_ID_BITS		8
+typedef uint8_t				ia_css_terminal_ID_t;
+#define IA_CSS_TERMINAL_INVALID_ID	((ia_css_terminal_ID_t)(-1))
+
+/**
+ * Terminal category
+ *
+ * @todo New for IPU7 POC
+ */
+typedef enum ia_css_terminal_cat {
+	IA_CSS_TERMINAL_CAT_LOAD = 0, /**< Load terminal.  Payload is made of up segmented value blobs for register load. */
+	IA_CSS_TERMINAL_CAT_CONNECT, /**< Connect terminal.  Payload is a memory pointer. */
+	IA_CSS_TERMINAL_CAT_COUNT /**< Number of entries in this enumeration */
+} ia_css_terminal_cat_t;
+#define IA_CSS_TERMINAL_CAT_INVALID IA_CSS_TERMINAL_CAT_COUNT
+
+/**
+ * Terminal direction
+ *
+ * Direction is from the IPU perspective.  That is, "IN" is input consumed by IPU and "OUT" is
+ * output generated by IPU.
+ *
+ * @todo New for IPU7 POC
+ */
+typedef enum ia_css_terminal_dir {
+	IA_CSS_TERMINAL_DIR_IN = 0, /**< Input terminal. Input is consumed by IPU*/
+	IA_CSS_TERMINAL_DIR_OUT, /**< Output terminal. Output is generated by IPU */
+	IA_CSS_TERMINAL_DIR_COUNT /**< Number of entries in this enumeration */
+} ia_css_terminal_dir_t;
+#define IA_CSS_TERMINAL_DIR_INVALID IA_CSS_TERMINAL_DIR_COUNT
+
+/**
+ * Terminal Rate Of Update (ROU)
+ *
+ * Direction is from the IPU perspective.  That is, "IN" is input consumed by IPU and "OUT" is
+ * output generated by IPU.
+ *
+ * @todo New for IPU7 POC
+ */
+typedef enum ia_css_terminal_rou {
+	IA_CSS_TERMINAL_ROU_STREAM = 0, /**< Constant for all frames in a stream */
+	IA_CSS_TERMINAL_ROU_FRAME, /**< Constant for all fragments in a frame */
+	IA_CSS_TERMINAL_ROU_FRAG, /**< Requires update (i.e. not constant) for all fragments */
+	IA_CSS_TERMINAL_ROU_COUNT /**< Number of entries in this enumeration */
+} ia_css_terminal_rou_t;
+#define IA_CSS_TERMINAL_ROU_INVALID IA_CSS_TERMINAL_ROU_COUNT
+
+/**
+ * Connect terminal payload content type
+ *
+ * Defines the broad usage of the buffers defined in connect terminals
+ */
+typedef enum ia_css_connect_buf_type {
+	IA_CSS_CONNECT_BUF_TYPE_DATA = 0, /**< Image data */
+	IA_CSS_CONNECT_BUF_TYPE_META, /**< Meta data */
+	IA_CSS_CONNECT_BUF_TYPE_UNKNOWN, /**< Unknown or irrelevant (e.g. load terminal) */
+	IA_CSS_CONNECT_BUF_TYPE_COUNT /**< Number of entries in this enumeration */
+} ia_css_connect_buf_type_t;
+
+/** Unknown or irrelevant buffer type */
+#define IA_CSS_CONNECT_BUF_TYPE_INVALID IA_CSS_CONNECT_BUF_TYPE_COUNT
+
+/**
+ * Terminal type identifier
+ *
+ * @note  Will be superseded by  ia_css_terminal_cat_t, ia_css_terminal_dir_t, ia_css_terminal_rou_t,
+ * and ia_css_connect_buf_type_t
+ * To stage the changes, this type will remain - for now...
+ *
+ * Inital type to attribute mapping table for staging:
+ * ia_css_terminal_type_t                    | ia_css_terminal_cat_t | ia_css_terminal_dir_t | ia_css_terminal_rou_t | ia_css_connect_buf_type_t    | notes
+ * ----------------------------------------- | --------------------- | --------------------- | --------------------- | ---------------------------- | -----
+ * IA_CSS_TERMINAL_TYPE_DATA_IN              | CAT_CONNECT           | DIR_IN                | ROU_FRAG?             | BUF_TYPE_DATA                | Fragment handling unclear
+ * IA_CSS_TERMINAL_TYPE_DATA_OUT             | CAT_CONNECT           | DIR_OUT               | ROU_FRAG?             | BUF_TYPE_DATA                | Fragment handling unclear
+ * IA_CSS_TERMINAL_TYPE_PARAM_STREAM         | OBSOLETE              | OBSOLETE              | OBSOLETE              | OBSOLETE                     | *No meaningful use found in FW*
+ * IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN      | CAT_LOAD              | DIR_IN                | ROU_FRAME             | BUF_TYPE_UNKNOWN (load term) |
+ * IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT     | CAT_LOAD              | DIR_OUT               | ROU_FRAME             | BUF_TYPE_UNKNOWN (load term) |
+ * IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN     | CAT_CONNECT           | DIR_IN                | ROU_FRAME             | BUF_TYPE_META                |
+ * IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT    | CAT_CONNECT           | DIR_OUT               | ROU_FRAME             | BUF_TYPE_META                |
+ * IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN      | CAT_LOAD              | DIR_IN                | ROU_FRAME?            | BUF_TYPE_UNKNOWN (load term) | Usage unclear
+ * IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT     | CAT_LOAD              | DIR_OUT               | ROU_FRAME?            | BUF_TYPE_UNKNOWN (load term) | Usage unclear
+ * IA_CSS_TERMINAL_TYPE_STATE_IN             | OBSOLETE              | OBSOLETE              | OBSOLETE              | OBSOLETE                     | *No meaningful use found in FW*
+ * IA_CSS_TERMINAL_TYPE_STATE_OUT            | OBSOLETE              | OBSOLETE              | OBSOLETE              | OBSOLETE                     | *No meaningful use found in FW*
+ * IA_CSS_TERMINAL_TYPE_PROGRAM              | CAT_LOAD              | DIR_IN                | ROU_FRAG              | BUF_TYPE_UNKNOWN (load term) |
+ * IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT | CAT_LOAD - see note   | DIR_IN                | ROU_STREAM - see note | BUF_TYPE_UNKNOWN (load term) | Belongs to FW team.  Used to have both load and connect sections.  Currently calculated based on PPG terminal information, and not buffer set.
+ */
+typedef enum ia_css_terminal_type {
+	/** Data input */
+	IA_CSS_TERMINAL_TYPE_DATA_IN = 0,
+	/** Data output */
+	IA_CSS_TERMINAL_TYPE_DATA_OUT,
+	/** Type 6 parameter input */
+	IA_CSS_TERMINAL_TYPE_PARAM_STREAM,
+	/** Type 1-5 parameter input.  Constant for all fragments in a frame. */
+	IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN,
+	/** Type 1-5 parameter output */
+	IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT,
+	/** Represent the new type of terminal for the
+	 * "spatial dependent parameters", when params go in
+	 */
+	IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN,
+	/** Represent the new type of terminal for the
+	 * "spatial dependent parameters", when params go out
+	 */
+	IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT,
+	/** Represent the new type of terminal for the
+	 * explicit slicing, when params go in
+	 */
+	IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN,
+	/** Represent the new type of terminal for the
+	 * explicit slicing, when params go out
+	 */
+	IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT,
+	/** State (private data) input */
+	IA_CSS_TERMINAL_TYPE_STATE_IN,
+	/** State (private data) output */
+	IA_CSS_TERMINAL_TYPE_STATE_OUT,
+	/** Program parameters, may change per fragment */
+	IA_CSS_TERMINAL_TYPE_PROGRAM,
+	/** Program control parameters.  Non-alogrithmic parameters for system devices. */
+	IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT,
+	IA_CSS_N_TERMINAL_TYPES
+} ia_css_terminal_type_t;
+
+#define IA_CSS_TERMINAL_TYPE_BITS				32
+
+/* Temporary redirection needed to facilicate merging with the drivers
+   in a backwards compatible manner */
+#define IA_CSS_TERMINAL_TYPE_PARAM_CACHED IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN
+
+/**
+ * Dimensions of the data objects. Note that a C-style
+ * data order is assumed. Data stored by row.
+ */
+typedef enum ia_css_dimension {
+	/** The number of columns, i.e. the size of the row */
+	IA_CSS_COL_DIMENSION = 0,
+	/** The number of rows, i.e. the size of the column */
+	IA_CSS_ROW_DIMENSION = 1,
+	IA_CSS_N_DATA_DIMENSION = 2
+} ia_css_dimension_t;
+
+#define IA_CSS_N_COMMAND_COUNT (4)
+
+#ifndef PIPE_GENERATION
+/* Don't include these complex enum structures in Genpipe, it can't handle and it does not need them */
+/**
+ * enum ia_css_isys_link_id. Lists the link IDs used by the FW for On The Fly feature
+ */
+typedef enum ia_css_isys_link_id {
+	IA_CSS_ISYS_LINK_OFFLINE = 0,
+	IA_CSS_ISYS_LINK_MAIN_OUTPUT = 1,
+	IA_CSS_ISYS_LINK_PDAF_OUTPUT = 2
+} ia_css_isys_link_id_t;
+#define N_IA_CSS_ISYS_LINK_ID	(IA_CSS_ISYS_LINK_PDAF_OUTPUT + 1)
+
+/**
+ * enum ia_css_data_barrier_link_id. Lists the link IDs used by the FW for data barrier feature
+ */
+typedef enum ia_css_data_barrier_link_id {
+	IA_CSS_DATA_BARRIER_LINK_MEMORY_0 = N_IA_CSS_ISYS_LINK_ID,
+	IA_CSS_DATA_BARRIER_LINK_MEMORY_1,
+	IA_CSS_DATA_BARRIER_LINK_MEMORY_2,
+	IA_CSS_DATA_BARRIER_LINK_MEMORY_3,
+	IA_CSS_DATA_BARRIER_LINK_MEMORY_4,
+	N_IA_CSS_DATA_BARRIER_LINK_ID
+} ia_css_data_barrier_link_id_t;
+
+/**
+ * enum ia_css_stream2gen_link_id. Lists the link IDs used by the FW for streaming to GEN
+ * support.
+ */
+typedef enum ia_css_stream2gen_link_id {
+	IA_CSS_STREAM2GEN_LINK_ID_0 = N_IA_CSS_DATA_BARRIER_LINK_ID,
+	IA_CSS_STREAM2GEN_LINK_ID_1,
+	IA_CSS_STREAM2GEN_LINK_ID_2,
+	IA_CSS_STREAM2GEN_LINK_ID_3,
+	N_IA_CSS_STREAM2GEN_LINK_ID
+} ia_css_stream2gen_link_id_t;
+
+#endif /* #ifndef PIPE_GENERATION */
+/** @} */
+#endif /* __IA_CSS_TERMINAL_DEFS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_impl.h
new file mode 100644
index 000000000000..94b535735836
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_impl.h
@@ -0,0 +1,497 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_TERMINAL_IMPL_H
+#define __IA_CSS_TERMINAL_IMPL_H
+
+#include "ia_css_terminal.h"
+#include "ia_css_terminal_types.h"
+#include "error_support.h"
+#include "assert_support.h"
+#include "storage_class.h"
+#include "misc_support.h" /* for NOT_USED */
+
+/* Param Terminal */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+unsigned int ia_css_param_in_terminal_get_descriptor_size(
+	const unsigned int nof_sections)
+{
+	return sizeof(ia_css_param_terminal_t) +
+		nof_sections*sizeof(ia_css_param_section_desc_t);
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_param_section_desc_t *ia_css_param_in_terminal_get_param_section_desc(
+	const ia_css_param_terminal_t *param_terminal,
+	const unsigned int section_index)
+{
+	ia_css_param_section_desc_t *param_section_base;
+	ia_css_param_section_desc_t *param_section_desc = NULL;
+
+	verifjmpexit(param_terminal != NULL);
+
+	param_section_base =
+		(ia_css_param_section_desc_t *)
+		(((const char *)param_terminal) +
+				param_terminal->param_section_desc_offset);
+	param_section_desc = &(param_section_base[section_index]);
+
+EXIT:
+	return param_section_desc;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+unsigned int ia_css_param_out_terminal_get_descriptor_size(
+	const unsigned int nof_sections,
+	const unsigned int nof_fragments)
+{
+	return sizeof(ia_css_param_terminal_t) +
+		nof_fragments*nof_sections*sizeof(ia_css_param_section_desc_t);
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_param_section_desc_t *ia_css_param_out_terminal_get_param_section_desc(
+	const ia_css_param_terminal_t *param_terminal,
+	const unsigned int section_index,
+	const unsigned int nof_sections,
+	const unsigned int fragment_index)
+{
+	ia_css_param_section_desc_t *param_section_base;
+	ia_css_param_section_desc_t *param_section_desc = NULL;
+
+	verifjmpexit(param_terminal != NULL);
+
+	param_section_base =
+		(ia_css_param_section_desc_t *)
+			(((const char *)param_terminal) +
+				param_terminal->param_section_desc_offset);
+	param_section_desc =
+		&(param_section_base[(nof_sections * fragment_index) +
+				section_index]);
+
+EXIT:
+	return param_section_desc;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+int ia_css_param_terminal_create(
+	ia_css_param_terminal_t *param_terminal,
+	const uint16_t terminal_offset,
+	const uint16_t terminal_size,
+	const uint16_t is_input_terminal)
+{
+	if (param_terminal == NULL) {
+		return -EFAULT;
+	}
+
+	if (terminal_offset > (1<<15)) {
+		return -EINVAL;
+	}
+
+	param_terminal->base.terminal_type =
+		is_input_terminal ?
+		IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN :
+		IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT;
+	param_terminal->base.parent_offset =
+		0 - ((int16_t)terminal_offset);
+	param_terminal->base.size = terminal_size;
+	param_terminal->param_section_desc_offset =
+		sizeof(ia_css_param_terminal_t);
+
+	return 0;
+}
+
+/* Spatial Param Terminal */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+unsigned int ia_css_spatial_param_terminal_get_descriptor_size(
+	const unsigned int nof_frame_param_sections,
+	const unsigned int nof_fragments)
+{
+	return sizeof(ia_css_spatial_param_terminal_t) +
+		nof_frame_param_sections * sizeof(
+				ia_css_frame_grid_param_section_desc_t) +
+		nof_fragments * sizeof(ia_css_fragment_grid_desc_t);
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_fragment_grid_desc_t *
+ia_css_spatial_param_terminal_get_fragment_grid_desc(
+	const ia_css_spatial_param_terminal_t *spatial_param_terminal,
+	const unsigned int fragment_index)
+{
+	ia_css_fragment_grid_desc_t *fragment_grid_desc_base;
+	ia_css_fragment_grid_desc_t *fragment_grid_desc = NULL;
+
+	verifjmpexit(spatial_param_terminal != NULL);
+
+	fragment_grid_desc_base =
+		(ia_css_fragment_grid_desc_t *)
+			(((const char *)spatial_param_terminal) +
+			spatial_param_terminal->fragment_grid_desc_offset);
+	fragment_grid_desc = &(fragment_grid_desc_base[fragment_index]);
+
+EXIT:
+	return fragment_grid_desc;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_frame_grid_param_section_desc_t *
+ia_css_spatial_param_terminal_get_frame_grid_param_section_desc(
+	const ia_css_spatial_param_terminal_t *spatial_param_terminal,
+	const unsigned int section_index)
+{
+	ia_css_frame_grid_param_section_desc_t *
+		frame_grid_param_section_base;
+	ia_css_frame_grid_param_section_desc_t *
+		frame_grid_param_section_desc = NULL;
+
+	verifjmpexit(spatial_param_terminal != NULL);
+
+	frame_grid_param_section_base =
+		(ia_css_frame_grid_param_section_desc_t *)
+			(((const char *)spatial_param_terminal) +
+		spatial_param_terminal->frame_grid_param_section_desc_offset);
+	frame_grid_param_section_desc =
+		&(frame_grid_param_section_base[section_index]);
+
+EXIT:
+	return frame_grid_param_section_desc;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+int ia_css_spatial_param_terminal_create(
+	ia_css_spatial_param_terminal_t *spatial_param_terminal,
+	const uint16_t terminal_offset,
+	const uint16_t terminal_size,
+	const uint16_t is_input_terminal,
+	const unsigned int nof_fragments,
+	const uint32_t kernel_id)
+{
+	if (spatial_param_terminal == NULL) {
+		return -EFAULT;
+	}
+
+	if (terminal_offset > (1<<15)) {
+		return -EINVAL;
+	}
+
+	spatial_param_terminal->base.terminal_type =
+		is_input_terminal ?
+		IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN :
+		IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT;
+	spatial_param_terminal->base.parent_offset =
+		0 - ((int16_t)terminal_offset);
+	spatial_param_terminal->base.size = terminal_size;
+	spatial_param_terminal->kernel_id = kernel_id;
+	spatial_param_terminal->fragment_grid_desc_offset =
+		sizeof(ia_css_spatial_param_terminal_t);
+	spatial_param_terminal->frame_grid_param_section_desc_offset =
+		spatial_param_terminal->fragment_grid_desc_offset +
+		(nof_fragments * sizeof(ia_css_fragment_grid_desc_t));
+
+	return 0;
+}
+
+/* Sliced terminal */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+unsigned int ia_css_sliced_param_terminal_get_descriptor_size(
+	const unsigned int nof_slice_param_sections,
+	const unsigned int nof_slices[],
+	const unsigned int nof_fragments)
+{
+	unsigned int descriptor_size = 0;
+	unsigned int fragment_index;
+	unsigned int nof_slices_total = 0;
+
+	verifjmpexit(nof_slices != NULL);
+
+	for (fragment_index = 0;
+			fragment_index < nof_fragments; fragment_index++) {
+		nof_slices_total += nof_slices[fragment_index];
+	}
+
+	descriptor_size =
+		sizeof(ia_css_sliced_param_terminal_t) +
+		nof_fragments*sizeof(ia_css_fragment_slice_desc_t) +
+		nof_slices_total*nof_slice_param_sections*sizeof(
+			ia_css_fragment_param_section_desc_t);
+
+EXIT:
+	return descriptor_size;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_fragment_slice_desc_t *
+ia_css_sliced_param_terminal_get_fragment_slice_desc(
+	const ia_css_sliced_param_terminal_t *sliced_param_terminal,
+	const unsigned int fragment_index
+)
+{
+	ia_css_fragment_slice_desc_t *fragment_slice_desc_base;
+	ia_css_fragment_slice_desc_t *fragment_slice_desc = NULL;
+
+	verifjmpexit(sliced_param_terminal != NULL);
+
+	fragment_slice_desc_base =
+		(ia_css_fragment_slice_desc_t *)
+			(((const char *)sliced_param_terminal) +
+			sliced_param_terminal->fragment_slice_desc_offset);
+	fragment_slice_desc = &(fragment_slice_desc_base[fragment_index]);
+
+EXIT:
+	return fragment_slice_desc;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_slice_param_section_desc_t *
+ia_css_sliced_param_terminal_get_slice_param_section_desc(
+	const ia_css_sliced_param_terminal_t *sliced_param_terminal,
+	const unsigned int fragment_index,
+	const unsigned int slice_index,
+	const unsigned int section_index,
+	const unsigned int nof_slice_param_sections)
+{
+	ia_css_fragment_slice_desc_t *fragment_slice_desc;
+	ia_css_slice_param_section_desc_t *slice_param_section_desc_base;
+	ia_css_slice_param_section_desc_t *slice_param_section_desc = NULL;
+
+	fragment_slice_desc =
+		ia_css_sliced_param_terminal_get_fragment_slice_desc(
+			sliced_param_terminal,
+			fragment_index
+			);
+	verifjmpexit(fragment_slice_desc != NULL);
+
+	slice_param_section_desc_base =
+		(ia_css_slice_param_section_desc_t *)
+		(((const char *)sliced_param_terminal) +
+		fragment_slice_desc->slice_section_desc_offset);
+	slice_param_section_desc =
+		&(slice_param_section_desc_base[(
+			slice_index * nof_slice_param_sections) +
+				section_index]);
+
+EXIT:
+	return slice_param_section_desc;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+int ia_css_sliced_param_terminal_create(
+	ia_css_sliced_param_terminal_t *sliced_param_terminal,
+	const uint16_t terminal_offset,
+	const uint16_t terminal_size,
+	const uint16_t is_input_terminal,
+	const unsigned int nof_slice_param_sections,
+	const unsigned int nof_slices[],
+	const unsigned int nof_fragments,
+	const uint32_t kernel_id)
+{
+	unsigned int fragment_index;
+	unsigned int nof_slices_total = 0;
+
+	if (sliced_param_terminal == NULL) {
+		return -EFAULT;
+	}
+
+	if (terminal_offset > (1<<15)) {
+		return -EINVAL;
+	}
+
+	sliced_param_terminal->base.terminal_type =
+		is_input_terminal ?
+		IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN :
+		IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT;
+	sliced_param_terminal->base.parent_offset =
+		0 - ((int16_t)terminal_offset);
+	sliced_param_terminal->base.size = terminal_size;
+	sliced_param_terminal->kernel_id = kernel_id;
+	/* set here to use below to find the pointer */
+	sliced_param_terminal->fragment_slice_desc_offset =
+		sizeof(ia_css_sliced_param_terminal_t);
+	for (fragment_index = 0;
+			fragment_index < nof_fragments; fragment_index++) {
+		ia_css_fragment_slice_desc_t *fragment_slice_desc =
+			ia_css_sliced_param_terminal_get_fragment_slice_desc(
+				sliced_param_terminal,
+				fragment_index);
+		/*
+		 * Error handling not required at this point
+		 * since everything has been constructed/validated just above
+		 */
+		fragment_slice_desc->slice_count = nof_slices[fragment_index];
+		fragment_slice_desc->slice_section_desc_offset =
+			sliced_param_terminal->fragment_slice_desc_offset +
+			(nof_fragments * sizeof(
+					ia_css_fragment_slice_desc_t)) +
+			(nof_slices_total * nof_slice_param_sections * sizeof(
+					ia_css_slice_param_section_desc_t));
+		nof_slices_total += nof_slices[fragment_index];
+	}
+
+	return 0;
+}
+
+/* Program terminal */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+unsigned int ia_css_program_terminal_get_descriptor_size(
+	const unsigned int nof_fragments,
+	const unsigned int nof_fragment_param_sections,
+	const unsigned int nof_kernel_fragment_sequencer_infos,
+	const unsigned int nof_command_objs)
+{
+	/*only one fragment used*/
+	return sizeof(ia_css_program_terminal_t) +
+		nof_fragment_param_sections *
+		sizeof(ia_css_fragment_param_section_desc_t) +
+		nof_fragments * nof_kernel_fragment_sequencer_infos *
+		sizeof(ia_css_kernel_fragment_sequencer_info_desc_t) +
+		nof_command_objs * sizeof(
+			ia_css_kernel_fragment_sequencer_command_desc_t);
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_fragment_param_section_desc_t *
+ia_css_program_terminal_get_frgmnt_prm_sct_desc(
+	const ia_css_program_terminal_t *program_terminal,
+	const unsigned int fragment_index,
+	const unsigned int section_index,
+	const unsigned int nof_fragment_param_sections)
+{
+	ia_css_fragment_param_section_desc_t *
+		fragment_param_section_desc_base;
+	ia_css_fragment_param_section_desc_t *
+		fragment_param_section_desc = NULL;
+	NOT_USED(fragment_index);
+
+	verifjmpexit(program_terminal != NULL);
+	verifjmpexit(section_index < nof_fragment_param_sections);
+
+	fragment_param_section_desc_base =
+		(ia_css_fragment_param_section_desc_t *)
+			(((const char *)program_terminal) +
+			program_terminal->fragment_param_section_desc_offset);
+	fragment_param_section_desc = &(fragment_param_section_desc_base[section_index]);
+EXIT:
+	return fragment_param_section_desc;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_kernel_fragment_sequencer_info_desc_t *
+ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
+	const ia_css_program_terminal_t *program_terminal,
+	const unsigned int fragment_index,
+	const unsigned int info_index,
+	const unsigned int nof_kernel_fragment_sequencer_infos)
+{
+	ia_css_kernel_fragment_sequencer_info_desc_t *
+		kernel_fragment_sequencer_info_desc_base;
+	ia_css_kernel_fragment_sequencer_info_desc_t *
+		kernel_fragment_sequencer_info_desc = NULL;
+
+	verifjmpexit(program_terminal != NULL);
+	if (nof_kernel_fragment_sequencer_infos > 0) {
+		verifjmpexit(info_index < nof_kernel_fragment_sequencer_infos);
+	}
+
+	kernel_fragment_sequencer_info_desc_base =
+		(ia_css_kernel_fragment_sequencer_info_desc_t *)
+		(((const char *)program_terminal) +
+		program_terminal->kernel_fragment_sequencer_info_desc_offset);
+	kernel_fragment_sequencer_info_desc =
+		&(kernel_fragment_sequencer_info_desc_base[(fragment_index *
+			nof_kernel_fragment_sequencer_infos) + info_index]);
+
+EXIT:
+	return kernel_fragment_sequencer_info_desc;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+int ia_css_program_terminal_create(
+	ia_css_program_terminal_t *program_terminal,
+	const uint16_t terminal_offset,
+	const uint16_t terminal_size,
+	const unsigned int nof_fragments,
+	const unsigned int nof_kernel_fragment_sequencer_infos,
+	const unsigned int nof_command_objs)
+{
+	if (program_terminal == NULL) {
+		return -EFAULT;
+	}
+
+	if (terminal_offset > (1<<15)) {
+		return -EINVAL;
+	}
+
+	program_terminal->base.terminal_type = IA_CSS_TERMINAL_TYPE_PROGRAM;
+	program_terminal->base.parent_offset = 0-((int16_t)terminal_offset);
+	program_terminal->base.size = terminal_size;
+	program_terminal->kernel_fragment_sequencer_info_desc_offset =
+		sizeof(ia_css_program_terminal_t);
+	program_terminal->fragment_param_section_desc_offset =
+		program_terminal->kernel_fragment_sequencer_info_desc_offset +
+		(nof_fragments * nof_kernel_fragment_sequencer_infos *
+		sizeof(ia_css_kernel_fragment_sequencer_info_desc_t)) +
+		(nof_command_objs * sizeof(
+			ia_css_kernel_fragment_sequencer_command_desc_t));
+
+	return 0;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+int ia_css_program_terminal_get_command_base_offset(
+	const ia_css_program_terminal_t *program_terminal,
+	const unsigned int nof_fragments,
+	const unsigned int nof_kernel_fragment_sequencer_infos,
+	const unsigned int commands_slots_used,
+	uint16_t *command_desc_offset)
+{
+	if (command_desc_offset == NULL) {
+		return -EFAULT;
+	}
+
+	*command_desc_offset = 0;
+
+	if (program_terminal == NULL) {
+		return -EFAULT;
+	}
+
+	*command_desc_offset =
+		program_terminal->kernel_fragment_sequencer_info_desc_offset +
+		(nof_fragments * nof_kernel_fragment_sequencer_infos *
+		sizeof(ia_css_kernel_fragment_sequencer_info_desc_t)) +
+		(commands_slots_used * sizeof(
+			ia_css_kernel_fragment_sequencer_command_desc_t));
+
+	return 0;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint16_t *ia_css_program_terminal_get_line_count(
+	const ia_css_kernel_fragment_sequencer_command_desc_t
+	*kernel_fragment_sequencer_command_desc_base,
+	const unsigned int set_count)
+{
+	uint16_t *line_count = NULL;
+
+	verifjmpexit(kernel_fragment_sequencer_command_desc_base != NULL);
+	line_count =
+		(uint16_t *)&(kernel_fragment_sequencer_command_desc_base[
+			set_count >> 2].line_count[set_count & 0x00000003]);
+EXIT:
+	return line_count;
+}
+
+#endif /* __IA_CSS_TERMINAL_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest.h
new file mode 100644
index 000000000000..0000610e945c
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest.h
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_TERMINAL_MANIFEST_H
+#define __IA_CSS_TERMINAL_MANIFEST_H
+
+#include "type_support.h"
+#include "ia_css_param_storage_class.h"
+#include "ia_css_terminal_manifest_types.h"
+
+#define MANIFEST_SECTION_DESC_KERNEL_ID_MASK     0xFF
+#define MANIFEST_SECTION_DESC_KERNEL_ID_OFFSET   0
+#define MANIFEST_SECTION_DESC_REGION_ID_MASK     0xF
+#define MANIFEST_SECTION_DESC_REGION_ID_OFFSET   8
+#define MANIFEST_SECTION_DESC_MEM_TYPE_ID_MASK   0xF
+#define MANIFEST_SECTION_DESC_MEM_TYPE_ID_OFFSET 12
+
+/** Returns the size in bytes required to store this
+ *  terminal's manifest entry.
+ *
+ *  Used as part of binary manifest generation. It helps
+ *  to determine the amount of memory required
+ *  to store a parameter terminal manifest entry for
+ *  allocation before initialization
+ *
+ *  @param [in] nof_sections Number of sections (==
+ *  number of descriptors)
+ *
+ *  @return Size in bytes required for an entry.
+ */
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_param_terminal_manifest_get_size(
+	const unsigned int nof_sections
+);
+
+/** Initialize a parameter terminal manifest entry.
+ *
+ *  Used as part of binary manifest generation.
+ *
+ *  @param param_terminal Terminal entry to initialize.  Must
+ *  have been allocated with the size determined by
+ *  ia_css_param_terminal_manifest_get_size().
+ *
+ *  @return 0 on success, -EFAULT if param_terminal is NULL.
+ */
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+int ia_css_param_terminal_manifest_init(
+	ia_css_param_terminal_manifest_t *param_terminal,
+	const uint16_t section_count
+);
+
+/** Returns a section descriptor for a parameter terminal.
+ *
+ *  @param param_terminal_manifest Parameter terminal manifest handle
+ *  @param section_index Index of descriptor.  Must be smaller than the
+ *  value returned by ia_css_param_terminal_manifest_get_prm_sct_desc_count()
+ *
+ *  @return Pointer to a descriptor structure
+ */
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_param_manifest_section_desc_t *
+ia_css_param_terminal_manifest_get_prm_sct_desc(
+	const ia_css_param_terminal_manifest_t *param_terminal_manifest,
+	const unsigned int section_index
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_spatial_param_terminal_manifest_get_size(
+	const unsigned int nof_frame_param_sections
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+int ia_css_spatial_param_terminal_manifest_init(
+	ia_css_spatial_param_terminal_manifest_t *spatial_param_terminal,
+	const uint16_t section_count
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_frame_grid_param_manifest_section_desc_t *
+ia_css_spatial_param_terminal_manifest_get_frm_grid_prm_sct_desc(
+	const ia_css_spatial_param_terminal_manifest_t *
+		spatial_param_terminal_manifest,
+	const unsigned int section_index
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_sliced_param_terminal_manifest_get_size(
+	const unsigned int nof_slice_param_sections
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+int ia_css_sliced_param_terminal_manifest_init(
+	ia_css_sliced_param_terminal_manifest_t *sliced_param_terminal,
+	const uint16_t section_count
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_sliced_param_manifest_section_desc_t *
+ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
+	const ia_css_sliced_param_terminal_manifest_t *
+		sliced_param_terminal_manifest,
+	const unsigned int section_index
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+unsigned int ia_css_program_terminal_manifest_get_size(
+	const unsigned int nof_fragment_param_sections,
+	const unsigned int nof_kernel_fragment_sequencer_infos
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+int ia_css_program_terminal_manifest_init(
+	ia_css_program_terminal_manifest_t *program_terminal,
+	const uint16_t fragment_param_section_count,
+	const uint16_t kernel_fragment_seq_info_section_count
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_fragment_param_manifest_section_desc_t *
+ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
+	const ia_css_program_terminal_manifest_t *program_terminal_manifest,
+	const unsigned int section_index
+);
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_H
+ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
+ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc(
+	const ia_css_program_terminal_manifest_t *program_terminal_manifest,
+	const unsigned int info_index
+);
+
+/*! Getter for kernel id
+
+  The function return the kernel id
+  field from the section
+  This field shouldn't accessed directly
+  only with the getter function
+ @param	[in] param manifest section desc
+
+ @return kernel_id
+ */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C uint8_t
+ia_css_param_manifest_section_desc_get_kernel_id(
+	const ia_css_param_manifest_section_desc_t *section);
+
+/*! Getter for  region_id
+
+  The function return the region_id
+  field from the section
+  This field shouldn't accessed directly
+  only with the getter function
+ @param	[in] param manifest section desc
+
+ @return region_id
+ */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_param_manifest_section_desc_get_region_id(
+	const ia_css_param_manifest_section_desc_t *section);
+
+/*! Getter for mem_type_id
+
+  The function return the mem_type_id
+  field from the section
+  This field shouldn't accessed directly
+  only with the getter function
+ @param	[in] param manifest section desc
+
+ @return mem_type_id
+ */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_param_manifest_section_desc_get_mem_type_id(
+	const ia_css_param_manifest_section_desc_t *section);
+
+/*! Getter for kernel id
+
+  The function return the kernel id
+  field from the section
+  This field shouldn't accessed directly
+  only with the getter function
+ @param	[in] fragment manifest section desc
+
+ @return kernel_id
+ */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_fragment_param_manifest_section_desc_get_kernel_id(
+	const ia_css_fragment_param_manifest_section_desc_t *section);
+
+/*! Getter for  region_id
+
+  The function return the region_id
+  field from the section
+  This field shouldn't accessed directly
+  only with the getter function
+ @param	[in] fragment manifest section desc
+
+ @return region_id
+ */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_fragment_param_manifest_section_desc_get_region_id(
+	const ia_css_fragment_param_manifest_section_desc_t *section);
+
+/*! Getter for mem_type_id
+
+  The function return the mem_type_id
+  field from the section
+  This field shouldn't accessed directly
+  only with the getter function
+ @param	[in] fragment manifest section desc
+
+ @return mem_type_id
+ */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_fragment_param_manifest_section_desc_get_mem_type_id(
+	const ia_css_fragment_param_manifest_section_desc_t *section);
+
+#ifdef __INLINE_PARAMETERS__
+#include "ia_css_terminal_manifest_impl.h"
+#endif /* __INLINE_PARAMETERS__ */
+
+#endif /* __IA_CSS_TERMINAL_MANIFEST_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_base_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_base_types.h
new file mode 100644
index 000000000000..5b3226bbf9b0
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_base_types.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_TERMINAL_MANIFEST_BASE_TYPES_H
+#define __IA_CSS_TERMINAL_MANIFEST_BASE_TYPES_H
+
+#include "ia_css_terminal_defs.h"
+
+/**
+ * @addtogroup group_psysapi
+ * @{
+ */
+
+typedef struct ia_css_terminal_manifest_attributes_t {
+	uint16_t category:1; /**< load vs. connect.  @see ia_css_terminal_cat_t */
+	uint16_t direction:1; /**< input vs. output. @see ia_css_terminal_dir_t */
+	uint16_t rou:2; /**< Rate Of Update.  @see ia_css_terminal_rou_t */
+	uint16_t connect_buf_type:2; /**< image data vs. meta-data. @see ia_css_connect_buf_type_t */
+	uint16_t reserved:10;
+	} ia_css_terminal_manifest_attributes_t;
+#define IA_CSS_TERMINAL_ATTRIBUTE_BITS IA_CSS_UINT16_T_BITS
+
+#define N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT	0
+#define SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
+	(IA_CSS_TERMINAL_TYPE_BITS \
+	+ IA_CSS_UINT32_T_BITS \
+	+ IA_CSS_UINT16_T_BITS \
+	+ IA_CSS_UINT16_T_BITS \
+	+ IA_CSS_TERMINAL_ATTRIBUTE_BITS \
+	+ IA_CSS_TERMINAL_ID_BITS \
+	+ IA_CSS_TERMINAL_ID_BITS \
+	+ (N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT*IA_CSS_UINT8_T_BITS))
+
+/* ==================== Base Terminal Manifest - START ==================== */
+struct ia_css_terminal_manifest_s {
+	ia_css_terminal_type_t				terminal_type;		/**< Type ia_css_terminal_type_t */
+	/**  Max size of payload buffer for instances of this terminal
+	 *
+	 *   For load terminals, this is the size of all sections, as defined in the manifest
+	 *   descriptors.  For connect terminals, this is the max buffer size.
+	 */
+	uint32_t					max_payload_size;
+	int16_t						parent_offset;		/**< Offset to the program group manifest */
+	uint16_t					size;			/**< Size of this whole terminal-manifest layout-structure */
+	ia_css_terminal_manifest_attributes_t	attributes; /**< Bit fields describing the terminal attributes */
+	ia_css_terminal_ID_t				ID; /**< The unique identifier of this terminal in the PG */
+	/** The unique identifier of another terminal in the PG, associated with this one.
+	 *  Set to IA_CSS_TERMINAL_INVALID_ID by default (--> no associated terminal) */
+	ia_css_terminal_ID_t				assoc_ID;
+#if N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT > 0
+	uint8_t						padding[N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT];
+#endif
+};
+
+typedef struct ia_css_terminal_manifest_s
+	ia_css_terminal_manifest_t;
+
+/* ==================== Base Terminal Manifest - END ==================== */
+
+/** @} */
+
+#endif /* __IA_CSS_TERMINAL_MANIFEST_BASE_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_impl.h
new file mode 100644
index 000000000000..207bb7502208
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_impl.h
@@ -0,0 +1,391 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_TERMINAL_MANIFEST_IMPL_H
+#define __IA_CSS_TERMINAL_MANIFEST_IMPL_H
+
+#include "ia_css_terminal_manifest.h"
+#include "error_support.h"
+#include "assert_support.h"
+#include "storage_class.h"
+
+STORAGE_CLASS_INLINE void __terminal_manifest_dummy_check_alignment(void)
+{
+	COMPILATION_ERROR_IF(
+		SIZE_OF_PARAM_TERMINAL_MANIFEST_STRUCT_IN_BITS !=
+			(CHAR_BIT * sizeof(ia_css_param_terminal_manifest_t)));
+
+	COMPILATION_ERROR_IF(0 !=
+		sizeof(ia_css_param_terminal_manifest_t) % sizeof(uint64_t));
+
+	COMPILATION_ERROR_IF(
+		SIZE_OF_PARAM_TERMINAL_MANIFEST_SEC_STRUCT_IN_BITS !=
+		(CHAR_BIT * sizeof(ia_css_param_manifest_section_desc_t)));
+
+	COMPILATION_ERROR_IF(0 !=
+		sizeof(ia_css_param_manifest_section_desc_t) %
+			sizeof(uint32_t));
+
+	COMPILATION_ERROR_IF(
+		SIZE_OF_SPATIAL_PARAM_TERM_MAN_STRUCT_IN_BITS !=
+		(CHAR_BIT * sizeof(ia_css_spatial_param_terminal_manifest_t)));
+
+	COMPILATION_ERROR_IF(0 !=
+		sizeof(ia_css_spatial_param_terminal_manifest_t) %
+			sizeof(uint64_t));
+
+	COMPILATION_ERROR_IF(
+		SIZE_OF_FRAME_GRID_PARAM_MAN_SEC_STRUCT_IN_BITS !=
+		(CHAR_BIT * sizeof(
+			ia_css_frame_grid_param_manifest_section_desc_t)));
+
+	COMPILATION_ERROR_IF(0 !=
+		sizeof(ia_css_frame_grid_param_manifest_section_desc_t) %
+			sizeof(uint64_t));
+
+	COMPILATION_ERROR_IF(
+		SIZE_OF_PROG_TERM_MAN_STRUCT_IN_BITS !=
+		(CHAR_BIT * sizeof(ia_css_program_terminal_manifest_t)));
+
+	COMPILATION_ERROR_IF(0 !=
+		sizeof(ia_css_program_terminal_manifest_t)%sizeof(uint64_t));
+
+	COMPILATION_ERROR_IF(
+		SIZE_OF_FRAG_PARAM_MAN_SEC_STRUCT_IN_BITS !=
+		(CHAR_BIT * sizeof(
+			ia_css_fragment_param_manifest_section_desc_t)));
+
+	COMPILATION_ERROR_IF(0 !=
+		sizeof(ia_css_fragment_param_manifest_section_desc_t) %
+			sizeof(uint32_t));
+
+	COMPILATION_ERROR_IF(
+		SIZE_OF_KERNEL_FRAG_SEQ_INFO_MAN_STRUCT_IN_BITS !=
+		(CHAR_BIT * sizeof(
+			ia_css_kernel_fragment_sequencer_info_manifest_desc_t))
+		);
+
+	COMPILATION_ERROR_IF(0 != sizeof(
+		ia_css_kernel_fragment_sequencer_info_manifest_desc_t) %
+			sizeof(uint64_t));
+
+	COMPILATION_ERROR_IF(
+		SIZE_OF_PARAM_TERMINAL_MANIFEST_STRUCT_IN_BITS !=
+		(CHAR_BIT * sizeof(ia_css_sliced_param_terminal_manifest_t)));
+
+	COMPILATION_ERROR_IF(0 !=
+		sizeof(ia_css_sliced_param_terminal_manifest_t) %
+			sizeof(uint64_t));
+
+	COMPILATION_ERROR_IF(
+		SIZE_OF_SLICED_PARAM_MAN_SEC_STRUCT_IN_BITS !=
+		(CHAR_BIT * sizeof
+			(ia_css_sliced_param_manifest_section_desc_t)));
+
+	COMPILATION_ERROR_IF(0 !=
+		sizeof(ia_css_sliced_param_manifest_section_desc_t) %
+			sizeof(uint64_t));
+}
+
+/* Parameter Terminal */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+unsigned int ia_css_param_terminal_manifest_get_size(
+	const unsigned int nof_sections)
+{
+
+	return sizeof(ia_css_param_terminal_manifest_t) +
+		nof_sections*sizeof(ia_css_param_manifest_section_desc_t);
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+int ia_css_param_terminal_manifest_init(
+	ia_css_param_terminal_manifest_t *param_terminal,
+	const uint16_t section_count)
+{
+	if (param_terminal == NULL) {
+		return -EFAULT;
+	}
+
+	param_terminal->param_manifest_section_desc_count = section_count;
+	param_terminal->param_manifest_section_desc_offset = sizeof(
+				ia_css_param_terminal_manifest_t);
+
+	return 0;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_param_manifest_section_desc_t *
+ia_css_param_terminal_manifest_get_prm_sct_desc(
+	const ia_css_param_terminal_manifest_t *param_terminal_manifest,
+	const unsigned int section_index)
+{
+	ia_css_param_manifest_section_desc_t *param_manifest_section_base;
+	ia_css_param_manifest_section_desc_t *
+		param_manifest_section_desc = NULL;
+
+	verifjmpexit(param_terminal_manifest != NULL);
+
+	param_manifest_section_base =
+		(ia_css_param_manifest_section_desc_t *)
+		(((const char *)param_terminal_manifest)
+		+ param_terminal_manifest->param_manifest_section_desc_offset);
+
+	param_manifest_section_desc =
+		&(param_manifest_section_base[section_index]);
+
+EXIT:
+	return param_manifest_section_desc;
+}
+
+/* Spatial Parameter Terminal */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+unsigned int ia_css_spatial_param_terminal_manifest_get_size(
+	const unsigned int nof_frame_param_sections)
+{
+	return sizeof(ia_css_spatial_param_terminal_manifest_t) +
+		nof_frame_param_sections * sizeof(
+			ia_css_frame_grid_param_manifest_section_desc_t);
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+int ia_css_spatial_param_terminal_manifest_init(
+	ia_css_spatial_param_terminal_manifest_t *spatial_param_terminal,
+	const uint16_t section_count)
+{
+	if (spatial_param_terminal == NULL) {
+		return -EFAULT;
+	}
+
+	spatial_param_terminal->
+		frame_grid_param_manifest_section_desc_count = section_count;
+	spatial_param_terminal->
+		frame_grid_param_manifest_section_desc_offset =
+		sizeof(ia_css_spatial_param_terminal_manifest_t);
+
+	return 0;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_frame_grid_param_manifest_section_desc_t *
+ia_css_spatial_param_terminal_manifest_get_frm_grid_prm_sct_desc(
+	const ia_css_spatial_param_terminal_manifest_t *
+		spatial_param_terminal_manifest,
+	const unsigned int section_index)
+{
+	ia_css_frame_grid_param_manifest_section_desc_t *
+		frame_param_manifest_section_base;
+	ia_css_frame_grid_param_manifest_section_desc_t *
+		frame_param_manifest_section_desc = NULL;
+
+	verifjmpexit(spatial_param_terminal_manifest != NULL);
+
+	frame_param_manifest_section_base =
+		(ia_css_frame_grid_param_manifest_section_desc_t *)
+		(((const char *)spatial_param_terminal_manifest) +
+			spatial_param_terminal_manifest->
+			frame_grid_param_manifest_section_desc_offset);
+	frame_param_manifest_section_desc =
+		&(frame_param_manifest_section_base[section_index]);
+
+EXIT:
+	return frame_param_manifest_section_desc;
+}
+
+/* Sliced Terminal */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+unsigned int ia_css_sliced_param_terminal_manifest_get_size(
+	const unsigned int nof_slice_param_sections)
+{
+	return sizeof(ia_css_spatial_param_terminal_manifest_t) +
+		nof_slice_param_sections *
+		sizeof(ia_css_sliced_param_manifest_section_desc_t);
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+int ia_css_sliced_param_terminal_manifest_init(
+	ia_css_sliced_param_terminal_manifest_t *sliced_param_terminal,
+	const uint16_t section_count)
+{
+	if (sliced_param_terminal == NULL) {
+		return -EFAULT;
+	}
+
+	sliced_param_terminal->sliced_param_section_count = section_count;
+	sliced_param_terminal->sliced_param_section_offset =
+		sizeof(ia_css_sliced_param_terminal_manifest_t);
+
+	return 0;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_sliced_param_manifest_section_desc_t *
+ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
+	const ia_css_sliced_param_terminal_manifest_t *
+		sliced_param_terminal_manifest,
+	const unsigned int section_index)
+{
+	ia_css_sliced_param_manifest_section_desc_t *
+		sliced_param_manifest_section_base;
+	ia_css_sliced_param_manifest_section_desc_t *
+		sliced_param_manifest_section_desc = NULL;
+
+	verifjmpexit(sliced_param_terminal_manifest != NULL);
+
+	sliced_param_manifest_section_base =
+		(ia_css_sliced_param_manifest_section_desc_t *)
+		(((const char *)sliced_param_terminal_manifest) +
+			sliced_param_terminal_manifest->
+			sliced_param_section_offset);
+	sliced_param_manifest_section_desc =
+		&(sliced_param_manifest_section_base[section_index]);
+
+EXIT:
+	return sliced_param_manifest_section_desc;
+}
+
+/* Program Terminal */
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+unsigned int ia_css_program_terminal_manifest_get_size(
+	const unsigned int nof_fragment_param_sections,
+	const unsigned int nof_kernel_fragment_sequencer_infos)
+{
+	return sizeof(ia_css_program_terminal_manifest_t) +
+		nof_fragment_param_sections *
+		sizeof(ia_css_fragment_param_manifest_section_desc_t) +
+		nof_kernel_fragment_sequencer_infos *
+		sizeof(ia_css_kernel_fragment_sequencer_info_manifest_desc_t);
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+int ia_css_program_terminal_manifest_init(
+	ia_css_program_terminal_manifest_t *program_terminal,
+	const uint16_t fragment_param_section_count,
+	const uint16_t kernel_fragment_seq_info_section_count)
+{
+	if (program_terminal == NULL) {
+		return -EFAULT;
+	}
+
+	program_terminal->fragment_param_manifest_section_desc_count =
+		fragment_param_section_count;
+	program_terminal->fragment_param_manifest_section_desc_offset =
+		sizeof(ia_css_program_terminal_manifest_t);
+
+	program_terminal->kernel_fragment_sequencer_info_manifest_info_count =
+		kernel_fragment_seq_info_section_count;
+	program_terminal->kernel_fragment_sequencer_info_manifest_info_offset =
+		sizeof(ia_css_program_terminal_manifest_t) +
+		fragment_param_section_count*sizeof(
+			ia_css_fragment_param_manifest_section_desc_t);
+
+	return 0;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_fragment_param_manifest_section_desc_t *
+ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
+	const ia_css_program_terminal_manifest_t *program_terminal_manifest,
+	const unsigned int section_index)
+{
+	ia_css_fragment_param_manifest_section_desc_t *
+		fragment_param_manifest_section_base;
+	ia_css_fragment_param_manifest_section_desc_t *
+		fragment_param_manifest_section = NULL;
+
+	verifjmpexit(program_terminal_manifest != NULL);
+
+	fragment_param_manifest_section_base =
+		(ia_css_fragment_param_manifest_section_desc_t *)
+		(((const char *)program_terminal_manifest) +
+		program_terminal_manifest->
+		fragment_param_manifest_section_desc_offset);
+	fragment_param_manifest_section =
+		&(fragment_param_manifest_section_base[section_index]);
+
+EXIT:
+	return fragment_param_manifest_section;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
+ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc(
+	const ia_css_program_terminal_manifest_t *program_terminal_manifest,
+	const unsigned int info_index)
+{
+	ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
+		kernel_manifest_fragment_sequencer_info_manifest_desc_base;
+	ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
+		kernel_manifest_fragment_sequencer_info_manifest_desc = NULL;
+
+	verifjmpexit(program_terminal_manifest != NULL);
+
+	kernel_manifest_fragment_sequencer_info_manifest_desc_base =
+		(ia_css_kernel_fragment_sequencer_info_manifest_desc_t *)
+		(((const char *)program_terminal_manifest) +
+		program_terminal_manifest->
+		kernel_fragment_sequencer_info_manifest_info_offset);
+
+	kernel_manifest_fragment_sequencer_info_manifest_desc =
+		&(kernel_manifest_fragment_sequencer_info_manifest_desc_base[
+				info_index]);
+
+EXIT:
+	return kernel_manifest_fragment_sequencer_info_manifest_desc;
+}
+
+/* Start ...*/
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_param_manifest_section_desc_get_kernel_id(
+	const ia_css_param_manifest_section_desc_t *section)
+{
+	return (section->info >> MANIFEST_SECTION_DESC_KERNEL_ID_OFFSET) & MANIFEST_SECTION_DESC_KERNEL_ID_MASK;
+}
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_param_manifest_section_desc_get_region_id(
+	const ia_css_param_manifest_section_desc_t *section)
+{
+	return (section->info >> MANIFEST_SECTION_DESC_REGION_ID_OFFSET) & MANIFEST_SECTION_DESC_REGION_ID_MASK;
+}
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_param_manifest_section_desc_get_mem_type_id(
+	const ia_css_param_manifest_section_desc_t *section)
+{
+	return (section->info >> MANIFEST_SECTION_DESC_MEM_TYPE_ID_OFFSET) & MANIFEST_SECTION_DESC_MEM_TYPE_ID_MASK;
+}
+
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_fragment_param_manifest_section_desc_get_kernel_id(
+	const ia_css_fragment_param_manifest_section_desc_t *section)
+{
+	return (section->info >> MANIFEST_SECTION_DESC_KERNEL_ID_OFFSET) & MANIFEST_SECTION_DESC_KERNEL_ID_MASK;
+}
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_fragment_param_manifest_section_desc_get_region_id(
+	const ia_css_fragment_param_manifest_section_desc_t *section)
+{
+	return (section->info >> MANIFEST_SECTION_DESC_REGION_ID_OFFSET) & MANIFEST_SECTION_DESC_REGION_ID_MASK;
+}
+IA_CSS_PARAMETERS_STORAGE_CLASS_C
+uint8_t ia_css_fragment_param_manifest_section_desc_get_mem_type_id(
+	const ia_css_fragment_param_manifest_section_desc_t *section)
+{
+	return (section->info >> MANIFEST_SECTION_DESC_MEM_TYPE_ID_OFFSET) & MANIFEST_SECTION_DESC_MEM_TYPE_ID_MASK;
+}
+
+/* End ...*/
+
+#endif /* __IA_CSS_TERMINAL_MANIFEST_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_types.h
new file mode 100644
index 000000000000..41ec4ccf3ee9
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_types.h
@@ -0,0 +1,349 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_TERMINAL_MANIFEST_TYPES_H
+#define __IA_CSS_TERMINAL_MANIFEST_TYPES_H
+
+#include "ia_css_terminal_defs.h"
+#include "type_support.h"
+#include "ia_css_base_types.h"
+#include "ia_css_terminal_manifest_base_types.h"
+
+/**
+ * @addtogroup group_psysapi
+ * @{
+ */
+
+#define SIZE_OF_PARAM_TERMINAL_MANIFEST_SEC_STRUCT_IN_BITS \
+	(2 * IA_CSS_UINT16_T_BITS)
+
+/* =============== Cached Param Terminal Manifest - START ============== */
+/** Descriptor for a single manifest parameter section.
+ *
+ * Each descriptor describes a single contiguous parameter payload that will
+ * be written to hardware registers or other memory.  It defines the maximum
+ * size of the section payload (critical for allocation and security), the device the
+ * section belongs to, and the target memory type (usually device registers).
+ *
+ * A region ID allows specifying multiple sections for a single device when a
+ * device's configuration registers are not all contigous.
+ */
+struct ia_css_param_manifest_section_desc_s {
+	/** Maximum size of the related parameter region */
+	uint16_t max_mem_size;
+	/** mem_type, region and kernel_id
+	  * - mem_type - Memory targeted by this section
+	  * (Register MMIO Interface/DMEM/VMEM/GMEM etc)
+	  * - Region - subsection id within the specified memory
+	  * - kernel_id - Indication of the kernel/device this parameter belongs to */
+	uint16_t info;
+};
+
+typedef struct ia_css_param_manifest_section_desc_s
+	ia_css_param_manifest_section_desc_t;
+
+#define N_PADDING_UINT8_IN_PARAM_TERMINAL_MAN_STRUCT 4
+#define SIZE_OF_PARAM_TERMINAL_MANIFEST_STRUCT_IN_BITS \
+	(SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
+	+ (2*IA_CSS_UINT16_T_BITS) \
+	+ (N_PADDING_UINT8_IN_PARAM_TERMINAL_MAN_STRUCT * IA_CSS_UINT8_T_BITS))
+
+/** Frame constant parameters terminal manifest
+ *
+ * This is the "header" for a list of parameter sections described by
+ * ia_css_param_manifest_section_desc_s.
+ */
+struct ia_css_param_terminal_manifest_s {
+	/** Parameter terminal manifest base */
+	ia_css_terminal_manifest_t base;
+	/**
+	 * Number of cached parameter sections, coming from manifest
+	 * but also shared by the terminal
+	 */
+	uint16_t param_manifest_section_desc_count;
+	/**
+	 * Points to the variable array of
+	 * struct ia_css_param_section_desc_s
+	 */
+	uint16_t param_manifest_section_desc_offset;
+	/** align to 64 */
+	uint8_t padding[N_PADDING_UINT8_IN_PARAM_TERMINAL_MAN_STRUCT];
+};
+
+typedef struct ia_css_param_terminal_manifest_s
+	ia_css_param_terminal_manifest_t;
+/* ================= Cached Param Terminal Manifest - End ================ */
+
+/* ================= Spatial Param Terminal Manifest - START ============= */
+
+#define SIZE_OF_FRAG_GRID_MAN_STRUCT_IN_BITS \
+	((IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS) \
+	+ (IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS))
+
+struct ia_css_fragment_grid_manifest_desc_s {
+	/* Min resolution width/height of the spatial parameters
+	 * for the fragment measured in compute units
+	 */
+	uint16_t min_fragment_grid_dimension[IA_CSS_N_DATA_DIMENSION];
+	/* Max resolution width/height of the spatial parameters
+	 * for the fragment measured in compute units
+	 */
+	uint16_t max_fragment_grid_dimension[IA_CSS_N_DATA_DIMENSION];
+};
+
+typedef struct ia_css_fragment_grid_manifest_desc_s
+	ia_css_fragment_grid_manifest_desc_t;
+
+#define N_PADDING_UINT8_IN_FRAME_GRID_PARAM_MAN_SEC_STRUCT 1
+#define SIZE_OF_FRAME_GRID_PARAM_MAN_SEC_STRUCT_IN_BITS \
+	(1 * IA_CSS_UINT32_T_BITS \
+	+ 3 * IA_CSS_UINT8_T_BITS \
+	+ N_PADDING_UINT8_IN_FRAME_GRID_PARAM_MAN_SEC_STRUCT * IA_CSS_UINT8_T_BITS)
+
+struct ia_css_frame_grid_param_manifest_section_desc_s {
+	/* Maximum buffer total size allowed for
+	 * this frame of parameters
+	 */
+	uint32_t max_mem_size;
+	/* Memory space targeted by this section
+	 * (Register MMIO Interface/DMEM/VMEM/GMEM etc)
+	 */
+	uint8_t mem_type_id;
+	/* Region id within the specified memory space */
+	uint8_t region_id;
+	/* size in bytes of each compute unit for
+	 * the specified memory space and region
+	 */
+	uint8_t elem_size;
+	/* align to 64 */
+	uint8_t padding[N_PADDING_UINT8_IN_FRAME_GRID_PARAM_MAN_SEC_STRUCT];
+};
+
+typedef struct ia_css_frame_grid_param_manifest_section_desc_s
+	ia_css_frame_grid_param_manifest_section_desc_t;
+
+#define SIZE_OF_FRAME_GRID_MAN_STRUCT_IN_BITS \
+	((IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS) \
+	+ (IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS))
+
+struct ia_css_frame_grid_manifest_desc_s {
+	/* Min resolution width/height of the spatial parameters for
+	 * the frame measured in compute units
+	 */
+	uint16_t min_frame_grid_dimension[IA_CSS_N_DATA_DIMENSION];
+	/* Max resolution width/height of the spatial parameters for
+	 * the frame measured in compute units
+	 */
+	uint16_t max_frame_grid_dimension[IA_CSS_N_DATA_DIMENSION];
+};
+
+typedef struct ia_css_frame_grid_manifest_desc_s
+	ia_css_frame_grid_manifest_desc_t;
+
+#define N_PADDING_UINT8_IN_SPATIAL_PARAM_TERM_MAN_STRUCT 2
+#define SIZE_OF_SPATIAL_PARAM_TERM_MAN_STRUCT_IN_BITS \
+	((SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS) \
+	+ (SIZE_OF_FRAME_GRID_MAN_STRUCT_IN_BITS) \
+	+ (SIZE_OF_FRAG_GRID_MAN_STRUCT_IN_BITS) \
+	+ (2 * IA_CSS_UINT16_T_BITS) \
+	+ (2 * IA_CSS_UINT8_T_BITS) \
+	+ (N_PADDING_UINT8_IN_SPATIAL_PARAM_TERM_MAN_STRUCT * \
+	IA_CSS_UINT8_T_BITS))
+
+/** Spatial parameters terminal manifest */
+struct ia_css_spatial_param_terminal_manifest_s {
+	/** terminal manifest base object */
+	ia_css_terminal_manifest_t base;
+	/** Contains limits for the frame spatial parameters */
+	ia_css_frame_grid_manifest_desc_t frame_grid_desc;
+	/**
+	 * Constains limits for the fragment spatial parameters
+	 * - COMMON AMONG FRAGMENTS
+	 */
+	ia_css_fragment_grid_manifest_desc_t common_fragment_grid_desc;
+	/**
+	 * Number of frame spatial parameter sections, they are set
+	 * in slice-steps through frame processing
+	 */
+	uint16_t frame_grid_param_manifest_section_desc_count;
+	/**
+	 * Points to the variable array of
+	 * ia_css_frame_spatial_param_manifest_section_desc_t
+	 */
+	uint16_t frame_grid_param_manifest_section_desc_offset;
+	/**
+	 * Indication of the kernel this spatial parameter terminal belongs to
+	 * SHOULD MATCH TO INDEX AND BE USED ONLY FOR CHECK
+	 */
+	uint8_t kernel_id;
+	/**
+	 * Groups together compute units in order to achieve alignment
+	 * requirements for transfes and to achieve canonical frame
+	 * representation
+	 */
+	uint8_t compute_units_p_elem;
+	/** align to 64 */
+	uint8_t padding[N_PADDING_UINT8_IN_SPATIAL_PARAM_TERM_MAN_STRUCT];
+};
+
+typedef struct ia_css_spatial_param_terminal_manifest_s
+	ia_css_spatial_param_terminal_manifest_t;
+
+/* ================= Spatial Param Terminal Manifest - END ================ */
+
+/* ================= Sliced Param Terminal Manifest - START =============== */
+
+#define N_PADDING_UINT8_IN_SLICED_TERMINAL_MAN_SECTION_STRUCT (2)
+#define SIZE_OF_SLICED_PARAM_MAN_SEC_STRUCT_IN_BITS \
+	(1 * IA_CSS_UINT32_T_BITS \
+	+ 2 * IA_CSS_UINT8_T_BITS \
+	+ N_PADDING_UINT8_IN_SLICED_TERMINAL_MAN_SECTION_STRUCT * IA_CSS_UINT8_T_BITS)
+
+struct ia_css_sliced_param_manifest_section_desc_s {
+	/** Maximum size of the related parameter region */
+	uint32_t max_mem_size;
+	/**
+	 * Memory targeted by this section
+	 * (Register MMIO Interface/DMEM/VMEM/GMEM etc)
+	 */
+	uint8_t mem_type_id;
+	/** Region id within the specified memory */
+	uint8_t region_id;
+	/** align to 64 */
+	uint8_t padding[N_PADDING_UINT8_IN_SLICED_TERMINAL_MAN_SECTION_STRUCT];
+};
+
+typedef struct ia_css_sliced_param_manifest_section_desc_s
+	ia_css_sliced_param_manifest_section_desc_t;
+
+#define N_PADDING_UINT8_IN_SLICED_TERMINAL_MANIFEST_STRUCT 3
+#define SIZE_OF_SLICED_TERMINAL_MANIFEST_STRUCT_IN_BITS \
+	(SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
+	+ 2 * IA_CSS_UINT16_T_BITS \
+	+ 1 * IA_CSS_UINT8_T_BITS \
+	+ N_PADDING_UINT8_IN_SLICED_TERMINAL_MANIFEST_STRUCT * IA_CSS_UINT8_T_BITS)
+
+/* Frame constant parameters terminal manifest */
+struct ia_css_sliced_param_terminal_manifest_s {
+	/** terminal manifest base object */
+	ia_css_terminal_manifest_t base;
+	/**
+	 * Number of the array elements
+	 * sliced_param_section_offset points to
+	 */
+	uint16_t sliced_param_section_count;
+	/**
+	 * Points to array of ia_css_sliced_param_manifest_section_desc_s
+	 * which constain info for the slicing of the parameters
+	 */
+	uint16_t sliced_param_section_offset;
+	/** Kernel identifier */
+	uint8_t kernel_id;
+	/** align to 64 */
+	uint8_t padding[N_PADDING_UINT8_IN_SLICED_TERMINAL_MANIFEST_STRUCT];
+};
+
+typedef struct ia_css_sliced_param_terminal_manifest_s
+	ia_css_sliced_param_terminal_manifest_t;
+
+/* ================= Slice Param Terminal Manifest - End =============== */
+
+/* ================= Program Terminal Manifest - START ================= */
+
+#define SIZE_OF_FRAG_PARAM_MAN_SEC_STRUCT_IN_BITS \
+	(2 * IA_CSS_UINT16_T_BITS)
+
+/** Fragment constant parameters manifest */
+struct ia_css_fragment_param_manifest_section_desc_s {
+	/** Maximum size of the related parameter region */
+	uint16_t max_mem_size;
+	/** (mem_type, region and kernel_id) */
+	uint16_t info;
+};
+
+typedef struct ia_css_fragment_param_manifest_section_desc_s
+	ia_css_fragment_param_manifest_section_desc_t;
+
+#define SIZE_OF_KERNEL_FRAG_SEQ_INFO_MAN_STRUCT_IN_BITS \
+	(10*IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS)
+
+struct ia_css_kernel_fragment_sequencer_info_manifest_desc_s {
+	/* Slice dimensions */
+	uint16_t min_fragment_grid_slice_dimension[IA_CSS_N_DATA_DIMENSION];
+	/* Slice dimensions */
+	uint16_t max_fragment_grid_slice_dimension[IA_CSS_N_DATA_DIMENSION];
+	/* Nof slices */
+	uint16_t min_fragment_grid_slice_count[IA_CSS_N_DATA_DIMENSION];
+	/* Nof slices */
+	uint16_t max_fragment_grid_slice_count[IA_CSS_N_DATA_DIMENSION];
+	/* Grid point decimation factor */
+	uint16_t
+	min_fragment_grid_point_decimation_factor[IA_CSS_N_DATA_DIMENSION];
+	/* Grid point decimation factor */
+	uint16_t
+	max_fragment_grid_point_decimation_factor[IA_CSS_N_DATA_DIMENSION];
+	/* Relative position of grid origin to pixel origin */
+	int16_t
+	min_fragment_grid_overlay_pixel_topleft_index[IA_CSS_N_DATA_DIMENSION];
+	/* Relative position of grid origin to pixel origin */
+	int16_t
+	max_fragment_grid_overlay_pixel_topleft_index[IA_CSS_N_DATA_DIMENSION];
+	/* Dimension of grid */
+	int16_t
+	min_fragment_grid_overlay_pixel_dimension[IA_CSS_N_DATA_DIMENSION];
+	/* Dimension of grid */
+	int16_t
+	max_fragment_grid_overlay_pixel_dimension[IA_CSS_N_DATA_DIMENSION];
+};
+
+typedef struct ia_css_kernel_fragment_sequencer_info_manifest_desc_s
+	ia_css_kernel_fragment_sequencer_info_manifest_desc_t;
+
+#define N_PADDING_UINT8_IN_PROGRAM_TERM_MAN_STRUCT 2
+#define SIZE_OF_PROG_TERM_MAN_STRUCT_IN_BITS \
+	((SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS) \
+	+ (IA_CSS_UINT32_T_BITS) \
+	+ (5*IA_CSS_UINT16_T_BITS) \
+	+ (N_PADDING_UINT8_IN_PROGRAM_TERM_MAN_STRUCT * IA_CSS_UINT8_T_BITS))
+
+/** Program parameters terminal */
+struct ia_css_program_terminal_manifest_s {
+	/** terminal manifest base object */
+	ia_css_terminal_manifest_t base;
+	/** Connection manager passes seq info as single blob at the moment */
+	uint32_t sequencer_info_kernel_id;
+	/** Maximum number of command secriptors supported
+	 * by the program group
+	 */
+	uint16_t max_kernel_fragment_sequencer_command_desc;
+	/** The total count of prog-init parameter descriptors */
+	uint16_t fragment_param_manifest_section_desc_count;
+	/** The offset of the manifest section descriptor from the base of this structure */
+	uint16_t fragment_param_manifest_section_desc_offset;
+	uint16_t kernel_fragment_sequencer_info_manifest_info_count;
+	uint16_t kernel_fragment_sequencer_info_manifest_info_offset;
+	/** align to 64 */
+	uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_TERM_MAN_STRUCT];
+};
+
+typedef struct ia_css_program_terminal_manifest_s
+	ia_css_program_terminal_manifest_t;
+
+/* ==================== Program Terminal Manifest - END ==================== */
+
+/** @} */
+
+#endif /* __IA_CSS_TERMINAL_MANIFEST_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_types.h
new file mode 100644
index 000000000000..2eb9c88468dc
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_types.h
@@ -0,0 +1,477 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_TERMINAL_TYPES_H
+#define __IA_CSS_TERMINAL_TYPES_H
+
+#include "type_support.h"
+#include "ia_css_base_types.h"
+#include "ia_css_terminal_base_types.h"
+
+typedef struct ia_css_program_control_init_load_section_desc_s
+	ia_css_program_control_init_load_section_desc_t;
+typedef struct ia_css_program_control_init_connect_section_desc_s
+	ia_css_program_control_init_connect_section_desc_t;
+typedef struct ia_css_program_control_init_program_desc_s
+	ia_css_program_control_init_program_desc_t;
+typedef struct ia_css_program_control_init_terminal_s
+	ia_css_program_control_init_terminal_t;
+
+typedef struct ia_css_program_terminal_s ia_css_program_terminal_t;
+typedef struct ia_css_fragment_param_section_desc_s
+	ia_css_fragment_param_section_desc_t;
+typedef struct ia_css_kernel_fragment_sequencer_info_desc_s
+	ia_css_kernel_fragment_sequencer_info_desc_t;
+typedef struct ia_css_kernel_fragment_sequencer_command_desc_s
+	ia_css_kernel_fragment_sequencer_command_desc_t;
+
+typedef struct ia_css_sliced_param_terminal_s ia_css_sliced_param_terminal_t;
+typedef struct ia_css_fragment_slice_desc_s ia_css_fragment_slice_desc_t;
+typedef struct ia_css_slice_param_section_desc_s
+	ia_css_slice_param_section_desc_t;
+
+typedef struct ia_css_spatial_param_terminal_s ia_css_spatial_param_terminal_t;
+typedef struct ia_css_frame_grid_desc_s ia_css_frame_grid_desc_t;
+typedef struct ia_css_frame_grid_param_section_desc_s
+	ia_css_frame_grid_param_section_desc_t;
+typedef struct ia_css_fragment_grid_desc_s ia_css_fragment_grid_desc_t;
+
+typedef struct ia_css_param_terminal_s ia_css_param_terminal_t;
+typedef struct ia_css_param_section_desc_s ia_css_param_section_desc_t;
+
+typedef struct ia_css_param_payload_s ia_css_param_payload_t;
+typedef struct ia_css_terminal_s ia_css_terminal_t;
+
+/* =================== Generic Parameter Payload - START =================== */
+#define N_UINT64_IN_PARAM_PAYLOAD_STRUCT	1
+#define N_UINT32_IN_PARAM_PAYLOAD_STRUCT	1
+
+#define IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
+	(N_UINT64_IN_PARAM_PAYLOAD_STRUCT * IA_CSS_UINT64_T_BITS \
+	+ VIED_VADDRESS_BITS \
+	+ N_UINT32_IN_PARAM_PAYLOAD_STRUCT * IA_CSS_UINT32_T_BITS)
+
+struct ia_css_param_payload_s {
+	/**
+	 * Temporary variable holding the host address of the parameter buffer
+	 * as PSYS is handling the parameters on the host side for the moment
+	 */
+	uint64_t host_buffer;
+	/**
+	 * Base virtual addresses to parameters in subsystem virtual
+	 * memory space
+	 * NOTE: Used in legacy pg flow
+	 */
+	vied_vaddress_t buffer;
+	/**
+	 * Offset to buffer address within external buffer set structure
+	 * NOTE: Used in ppg flow
+	 */
+	uint32_t terminal_index;
+};
+/* =================== Generic Parameter Payload - End ==================== */
+
+/* ==================== Cached Param Terminal - START ==================== */
+#define N_UINT32_IN_PARAM_SEC_STRUCT 2
+
+#define SIZE_OF_PARAM_SEC_STRUCT_BITS \
+	(N_UINT32_IN_PARAM_SEC_STRUCT * IA_CSS_UINT32_T_BITS)
+
+/** Parameters section */
+struct ia_css_param_section_desc_s {
+	/** Offset of the parameter allocation in memory */
+	uint32_t mem_offset;
+	/** Memory allocation size needs of this parameter */
+	uint32_t mem_size;
+};
+
+#define N_UINT16_IN_PARAM_TERMINAL_STRUCT		1
+#define N_PADDING_UINT8_IN_PARAM_TERMINAL_STRUCT	6
+
+#define SIZE_OF_PARAM_TERMINAL_STRUCT_BITS \
+	(SIZE_OF_TERMINAL_STRUCT_BITS \
+	+ IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
+	+ N_UINT16_IN_PARAM_TERMINAL_STRUCT * IA_CSS_UINT16_T_BITS \
+	+ N_PADDING_UINT8_IN_PARAM_TERMINAL_STRUCT * IA_CSS_UINT8_T_BITS)
+
+/** "Cached" parameters terminal for parameter that do not change
+ * at frame scope.
+ */
+struct ia_css_param_terminal_s {
+	/** Parameter terminal base */
+	ia_css_terminal_t base;
+	/** Helps to identify the parameter buffer when sent later on with the buffer set  */
+	ia_css_param_payload_t param_payload;
+	/** Points to the variable array of ia_css_param_section_desc_t */
+	uint16_t param_section_desc_offset;
+	uint8_t padding[N_PADDING_UINT8_IN_PARAM_TERMINAL_STRUCT];
+};
+/* ==================== Cached Param Terminal - End ==================== */
+
+/* ==================== Spatial Param Terminal - START ==================== */
+#define N_UINT16_IN_FRAG_GRID_STRUCT (2 * IA_CSS_N_DATA_DIMENSION)
+
+#define SIZE_OF_FRAG_GRID_STRUCT_BITS \
+	(N_UINT16_IN_FRAG_GRID_STRUCT * IA_CSS_UINT16_T_BITS)
+
+struct ia_css_fragment_grid_desc_s {
+	/**
+	 * Offset width/height of the top-left compute unit of the
+	 * fragment compared to the frame
+	 */
+	uint16_t fragment_grid_index[IA_CSS_N_DATA_DIMENSION];
+	/**
+	 * Resolution width/height of the spatial parameters that
+	 * correspond to the fragment measured in compute units
+	 */
+	uint16_t fragment_grid_dimension[IA_CSS_N_DATA_DIMENSION];
+};
+
+#define N_UINT32_IN_FRAME_GRID_PARAM_SEC_STRUCT		3
+#define N_PADDING_UINT8_IN_FRAME_GRID_PARAM_SEC_STRUCT	4
+
+#define SIZE_OF_FRAME_GRID_PARAM_SEC_STRUCT_BITS \
+	(N_UINT32_IN_FRAME_GRID_PARAM_SEC_STRUCT * IA_CSS_UINT32_T_BITS \
+	+ N_PADDING_UINT8_IN_FRAME_GRID_PARAM_SEC_STRUCT * IA_CSS_UINT8_T_BITS)
+
+/**
+ * A plane of parameters with spatial aspect
+ * (compute units correlated to pixel data)
+ */
+struct ia_css_frame_grid_param_section_desc_s {
+	/** Offset of the parameter allocation in memory */
+	uint32_t mem_offset;
+	/** Memory allocation size needs of this parameter */
+	uint32_t mem_size;
+	/**
+	 * stride in bytes of each line of compute units for
+	 * the specified memory space and region
+	 */
+	uint32_t stride;
+	uint8_t  padding[N_PADDING_UINT8_IN_FRAME_GRID_PARAM_SEC_STRUCT];
+};
+
+#define N_UINT16_IN_FRAME_GRID_STRUCT_STRUCT IA_CSS_N_DATA_DIMENSION
+#define N_PADDING_UINT8_IN_FRAME_GRID_STRUCT 4
+
+#define SIZE_OF_FRAME_GRID_STRUCT_BITS \
+	(N_UINT16_IN_FRAME_GRID_STRUCT_STRUCT * IA_CSS_UINT16_T_BITS \
+	+ N_PADDING_UINT8_IN_FRAME_GRID_STRUCT * IA_CSS_UINT8_T_BITS)
+
+struct ia_css_frame_grid_desc_s {
+	/** Resolution width/height of the frame of
+	 * spatial parameters measured in compute units
+	 */
+	uint16_t frame_grid_dimension[IA_CSS_N_DATA_DIMENSION];
+	uint8_t padding[N_PADDING_UINT8_IN_FRAME_GRID_STRUCT];
+};
+
+#define N_UINT32_IN_SPATIAL_PARAM_TERM_STRUCT 1
+#define N_UINT16_IN_SPATIAL_PARAM_TERM_STRUCT 2
+
+#define SIZE_OF_SPATIAL_PARAM_TERM_STRUCT_BITS \
+	(SIZE_OF_TERMINAL_STRUCT_BITS \
+	+ IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
+	+ SIZE_OF_FRAME_GRID_STRUCT_BITS \
+	+ N_UINT32_IN_SPATIAL_PARAM_TERM_STRUCT * IA_CSS_UINT32_T_BITS \
+	+ N_UINT16_IN_SPATIAL_PARAM_TERM_STRUCT * IA_CSS_UINT16_T_BITS)
+
+struct ia_css_spatial_param_terminal_s {
+	/** Spatial Parameter terminal base */
+	ia_css_terminal_t base;
+	/** Spatial Parameter buffer handle attached to the terminal */
+	ia_css_param_payload_t param_payload;
+	/** Contains info for the frame of spatial parameters */
+	ia_css_frame_grid_desc_t frame_grid_desc;
+	/** Kernel identifier */
+	uint32_t kernel_id;
+	/**
+	 * Points to the variable array of
+	 * ia_css_frame_grid_param_section_desc_t
+	 */
+	uint16_t frame_grid_param_section_desc_offset;
+	/**
+	 * Points to array of ia_css_fragment_spatial_desc_t
+	 * which constain info for the fragments of spatial parameters
+	 */
+	uint16_t fragment_grid_desc_offset;
+};
+/* ==================== Spatial Param Terminal - END ==================== */
+
+/* ==================== Sliced Param Terminal - START ==================== */
+#define N_UINT32_IN_SLICE_PARAM_SECTION_DESC_STRUCT 2
+
+#define SIZE_OF_SLICE_PARAM_SECTION_DESC_STRUCT_BITS \
+	(N_UINT32_IN_SLICE_PARAM_SECTION_DESC_STRUCT * IA_CSS_UINT32_T_BITS)
+
+/** A Slice of parameters ready to be trasferred from/to registers */
+struct ia_css_slice_param_section_desc_s {
+	/** Offset of the parameter allocation in memory */
+	uint32_t mem_offset;
+	/** Memory allocation size needs of this parameter */
+	uint32_t mem_size;
+};
+
+#define N_UINT16_IN_FRAGMENT_SLICE_DESC_STRUCT		2
+#define N_PADDING_UINT8_FRAGMENT_SLICE_DESC_STRUCT	4
+
+#define SIZE_OF_FRAGMENT_SLICE_DESC_STRUCT_BITS \
+	(N_UINT16_IN_FRAGMENT_SLICE_DESC_STRUCT * IA_CSS_UINT16_T_BITS \
+	+ N_PADDING_UINT8_FRAGMENT_SLICE_DESC_STRUCT * IA_CSS_UINT8_T_BITS)
+
+struct ia_css_fragment_slice_desc_s {
+	/**
+	 * Points to array of ia_css_slice_param_section_desc_t
+	 * which constain info for each prameter slice
+	 */
+	uint16_t slice_section_desc_offset;
+	/** Number of slices for the parameters for this fragment */
+	uint16_t slice_count;
+	uint8_t padding[N_PADDING_UINT8_FRAGMENT_SLICE_DESC_STRUCT];
+};
+
+#define N_UINT32_IN_SLICED_PARAM_TERMINAL_STRUCT	1
+#define N_UINT16_IN_SLICED_PARAM_TERMINAL_STRUCT	1
+#define N_PADDING_UINT8_SLICED_PARAM_TERMINAL_STRUCT	2
+
+#define SIZE_OF_SLICED_PARAM_TERM_STRUCT_BITS \
+	(SIZE_OF_TERMINAL_STRUCT_BITS \
+	+ IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
+	+ N_UINT32_IN_SLICED_PARAM_TERMINAL_STRUCT * IA_CSS_UINT32_T_BITS \
+	+ N_UINT16_IN_SLICED_PARAM_TERMINAL_STRUCT * IA_CSS_UINT16_T_BITS \
+	+ N_PADDING_UINT8_SLICED_PARAM_TERMINAL_STRUCT * IA_CSS_UINT8_T_BITS)
+
+struct ia_css_sliced_param_terminal_s {
+	/** Spatial Parameter terminal base */
+	ia_css_terminal_t base;
+	/** Spatial Parameter buffer handle attached to the terminal */
+	ia_css_param_payload_t param_payload;
+	/** Kernel identifier */
+	uint32_t kernel_id;
+	/**
+	 * Points to array of ia_css_fragment_slice_desc_t
+	 * which constain info for the slicing of the parameters
+	 */
+	uint16_t fragment_slice_desc_offset;
+	uint8_t padding[N_PADDING_UINT8_SLICED_PARAM_TERMINAL_STRUCT];
+};
+/* ==================== Sliced Param Terminal - END ==================== */
+
+/* ================= Program Control Init Terminal - START ================= */
+#define SIZE_OF_PROG_CONTROL_INIT_LOAD_SECTION_DESC_STRUCT_BITS	\
+	(DEVICE_DESCRIPTOR_ID_BITS	\
+	+ (2 * IA_CSS_UINT16_T_BITS)	\
+	)
+struct ia_css_program_control_init_load_section_desc_s {
+	/** Device descriptor */
+	device_descriptor_id_t device_descriptor_id;	/* 32 bits */
+	/** Memory allocation size needs of this parameter */
+	uint16_t mem_size;
+	/** (Applicable to) mode bitmask */
+	uint16_t mode_bitmask;
+};
+
+#define MODE_BITMASK_MEMORY          (1u << IA_CSS_CONNECTION_MEMORY)
+#define MODE_BITMASK_MEMORY_STREAM   (1u << IA_CSS_CONNECTION_MEMORY_STREAM)
+#define MODE_BITMASK_STREAM          (1u << IA_CSS_CONNECTION_STREAM)
+#define MODE_BITMASK_DONT_CARE       (MODE_BITMASK_MEMORY | MODE_BITMASK_MEMORY_STREAM | MODE_BITMASK_STREAM)
+#define MODE_BITMASK_TOP             (1u << (IA_CSS_CONNECTION_STREAM + 1))
+#define MODE_BITMASK_MIDDLE          (1u << (IA_CSS_CONNECTION_STREAM + 2))
+#define MODE_BITMASK_BOTTOM          (1u << (IA_CSS_CONNECTION_STREAM + 3))
+
+struct connect_section_idx_bitfields_s {
+	uint16_t plane_id : 4;
+	uint16_t bottom_lines : 6;
+	uint16_t top_lines : 6;
+};
+
+union connect_section_idx_t {
+	struct connect_section_idx_bitfields_s as_bitfield;
+	uint16_t as_uint_16;
+};
+
+#define SIZE_OF_PROG_CONTROL_INIT_CONNECT_SECTION_DESC_STRUCT_BITS	\
+	(DEVICE_DESCRIPTOR_ID_BITS	\
+	+ (1 * IA_CSS_UINT16_T_BITS)	\
+	+ (1 * IA_CSS_UINT8_T_BITS)	\
+	+ IA_CSS_TERMINAL_ID_BITS	\
+	)
+struct ia_css_program_control_init_connect_section_desc_s {
+	/** Device descriptor */
+	device_descriptor_id_t device_descriptor_id;	/* 32 bits */
+	/** Connected terminal section (plane) index */
+	uint16_t connect_section_idx;
+	/** (Applicable to) mode bitmask */
+	uint8_t mode_bitmask;
+	/** Absolute referral ID for the connected terminal */
+	ia_css_terminal_ID_t connect_terminal_ID;
+};
+
+#define N_PADDING_UINT8_IN_PROG_DESC_CONTROL_INFO	(1)
+#define N_PADDING_UINT8_IN_PROG_CTRL_INIT_PROGRAM_DESC_STRUCT (0)
+#define SIZE_OF_PROGRAM_DESC_CONTROL_INFO_STRUCT_BITS \
+	(1 * IA_CSS_UINT16_T_BITS)	\
+	+ (1 * IA_CSS_UINT8_T_BITS)	\
+	+ (N_PADDING_UINT8_IN_PROG_DESC_CONTROL_INFO * IA_CSS_UINT8_T_BITS)
+
+#define SIZE_OF_PROG_CONTROL_INIT_PROG_DESC_STRUCT_BITS	\
+	(4 * IA_CSS_UINT16_T_BITS)	\
+	+ (SIZE_OF_PROGRAM_DESC_CONTROL_INFO_STRUCT_BITS) \
+	+ (2 * IA_CSS_UINT8_T_BITS) \
+	+ (1 * IA_CSS_UINT16_T_BITS) \
+	+ (N_PADDING_UINT8_IN_PROG_CTRL_INIT_PROGRAM_DESC_STRUCT * \
+		IA_CSS_UINT8_T_BITS)
+
+struct ia_css_program_desc_control_info_s {
+	/** 12-bit process identifier */
+	ia_css_process_id_t process_id;
+	/** number of done acks required to close the process */
+	uint8_t num_done_events;
+	uint8_t padding[N_PADDING_UINT8_IN_PROG_DESC_CONTROL_INFO];
+};
+
+struct ia_css_program_control_init_program_desc_s {
+	/** Number of load sections in this program */
+	uint16_t load_section_count;
+	/** Points to variable size array of
+	 * ia_css_program_control_init_load_section_desc_s
+	 * in relation to its program_desc
+	 */
+	uint16_t load_section_desc_offset;
+	/** Number of connect sections in this program */
+	uint16_t connect_section_count;
+	/** Points to variable size array of
+	 * ia_css_program_control_init_connect_section_desc_s
+	 * in relation to its program_desc
+	 */
+	uint16_t connect_section_desc_offset;
+	struct ia_css_program_desc_control_info_s control_info;
+	/** number of load sections that are filled */
+	uint8_t filled_load_sections;
+	/** number of connect sections that are filled */
+	uint8_t filled_connect_sections;
+	/** mem_offset for the first load section */
+	uint16_t load_section_mem_offset;
+	/* align to 64 bits */
+	/* uint8_t padding[N_PADDING_UINT8_IN_PROG_CTRL_INIT_PROGRAM_DESC_STRUCT];*/
+};
+
+#define SIZE_OF_PROG_CONTROL_INIT_TERM_STRUCT_BITS \
+	(SIZE_OF_TERMINAL_STRUCT_BITS \
+	+ IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
+	+ (1 * IA_CSS_UINT32_T_BITS) \
+	+ (2 * IA_CSS_UINT16_T_BITS) \
+	)
+struct ia_css_program_control_init_terminal_s {
+	/** Parameter terminal base */
+	ia_css_terminal_t base;
+	/** Parameter buffer handle attached to the terminal */
+	ia_css_param_payload_t param_payload;
+	/** Fragment stride for the payload, used to find the base
+	 * of the payload for a given fragment
+	 */
+	uint32_t payload_fragment_stride;
+	/** Points to the variable array of
+	 * ia_css_program_control_init_program_desc_s
+	 */
+	uint16_t program_section_desc_offset;
+	/** Number of instantiated programs in program group (processes) */
+	uint16_t program_count;
+};
+/* ================= Program Control Init Terminal - END ================= */
+
+/* ==================== Program Terminal - START ==================== */
+
+#define N_UINT32_IN_FRAG_PARAM_SEC_STRUCT 2
+
+#define SIZE_OF_FRAG_PARAM_SEC_STRUCT_BITS \
+	(N_UINT32_IN_FRAG_PARAM_SEC_STRUCT * IA_CSS_UINT32_T_BITS)
+
+/** Fragment constant parameters section */
+struct ia_css_fragment_param_section_desc_s {
+	/** Offset of the parameter allocation in memory */
+	uint32_t mem_offset;
+	/** Memory allocation size needs of this parameter */
+	uint32_t mem_size;
+};
+
+#define N_UINT16_IN_FRAG_SEQ_COMMAND_STRUCT IA_CSS_N_COMMAND_COUNT
+
+#define SIZE_OF_FRAG_SEQ_COMMANDS_STRUCT_BITS \
+	(N_UINT16_IN_FRAG_SEQ_COMMAND_STRUCT * IA_CSS_UINT16_T_BITS)
+
+/** 4 commands packe together to save memory space */
+struct ia_css_kernel_fragment_sequencer_command_desc_s {
+	/** Contains the "(command_index%4) == index" command desc */
+	uint16_t line_count[IA_CSS_N_COMMAND_COUNT];
+};
+
+#define N_UINT16_IN_FRAG_SEQ_INFO_STRUCT (5 * IA_CSS_N_DATA_DIMENSION + 2)
+
+#define SIZE_OF_FRAG_SEQ_INFO_STRUCT_BITS \
+	(N_UINT16_IN_FRAG_SEQ_INFO_STRUCT * IA_CSS_UINT16_T_BITS)
+
+struct ia_css_kernel_fragment_sequencer_info_desc_s {
+	/** Slice dimensions */
+	uint16_t fragment_grid_slice_dimension[IA_CSS_N_DATA_DIMENSION];
+	/** Nof slices */
+	uint16_t fragment_grid_slice_count[IA_CSS_N_DATA_DIMENSION];
+	/** Grid point decimation factor */
+	uint16_t
+	fragment_grid_point_decimation_factor[IA_CSS_N_DATA_DIMENSION];
+	/** Relative position of grid origin to pixel origin */
+	int16_t
+	fragment_grid_overlay_pixel_topleft_index[IA_CSS_N_DATA_DIMENSION];
+	/** Size of active fragment region */
+	int16_t
+	fragment_grid_overlay_pixel_dimension[IA_CSS_N_DATA_DIMENSION];
+	/** If >0 it overrides the standard fragment sequencer info */
+	uint16_t command_count;
+	/**
+	 * To be used only if command_count>0, points to the descriptors
+	 * for the commands (ia_css_kernel_fragment_sequencer_command_desc_s)
+	 */
+	uint16_t command_desc_offset;
+};
+
+#define N_UINT16_IN_PROG_TERM_STRUCT		2
+#define N_PADDING_UINT8_IN_PROG_TERM_STRUCT	0
+#define N_UINT8_PROG_TERM_STRIDE_SIZE       4
+#define UNIFIED_PROG_TERM_FRAG_DESC
+
+#define SIZE_OF_PROG_TERM_STRUCT_BITS \
+	(SIZE_OF_TERMINAL_STRUCT_BITS \
+	+ IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
+	+ N_UINT16_IN_PROG_TERM_STRUCT * IA_CSS_UINT16_T_BITS \
+	+ N_UINT8_PROG_TERM_STRIDE_SIZE * IA_CSS_UINT8_T_BITS)
+
+struct ia_css_program_terminal_s {
+	/** Program terminal base */
+	ia_css_terminal_t base;
+	/** Program terminal buffer handle attached to the terminal */
+	ia_css_param_payload_t param_payload;
+	/** Points to array of ia_css_fragment_param_desc_s */
+	uint16_t fragment_param_section_desc_offset;
+	/** Points to array of ia_css_kernel_fragment_sequencer_info_s */
+	uint16_t kernel_fragment_sequencer_info_desc_offset;
+	/* stride to next fragment*/
+	uint32_t payload_fragment_stride;
+	/** align to 64 */
+	/*uint8_t padding[N_PADDING_UINT8_IN_PROG_TERM_STRUCT];*/
+};
+/* ==================== Program Terminal - END ==================== */
+
+#endif /* __IA_CSS_TERMINAL_TYPES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_trace.h
new file mode 100644
index 000000000000..1fe223af1bd7
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_trace.h
@@ -0,0 +1,1002 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*! \file */
+
+#ifndef __IA_CSS_TRACE_H
+#define __IA_CSS_TRACE_H
+
+/*
+** Configurations
+*/
+
+/**
+ * STEP 1: Define {Module Name}_TRACE_METHOD to one of the following.
+ *         Where:
+ *             {Module Name} is the name of the targeted module.
+ *
+ *         Example:
+ *             #define NCI_DMA_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
+ */
+
+/**< Use whatever method of tracing that best suits the platform
+ * this code is compiled for.
+ */
+#define IA_CSS_TRACE_METHOD_NATIVE  1
+/**< Use the Tracing NCI. */
+#define IA_CSS_TRACE_METHOD_TRACE   2
+
+/**
+ * STEP 2: Define {Module Name}_TRACE_LEVEL_{Level} to one of the following.
+ *         Where:
+ *             {Module Name} is the name of the targeted module.
+ *             {Level}, in decreasing order of severity, is one of the
+ *     following values: {ASSERT, ERROR, WARNING, INFO, DEBUG,
+ *                       VERBOSE, FATAL}.
+ *         Example:
+ *             #define NCI_DMA_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_DISABLED
+ *             #define NCI_DMA_TRACE_LEVEL_ERROR  IA_CSS_TRACE_LEVEL_ENABLED
+ */
+/**< Disables the corresponding trace level. */
+#define IA_CSS_TRACE_LEVEL_DISABLED 0
+/**< Enables the corresponding trace level. */
+#define IA_CSS_TRACE_LEVEL_ENABLED  1
+
+/*
+ * Used in macro definition with do-while loop
+ * for removing checkpatch warnings
+ */
+#define IA_CSS_TRACE_FILE_DUMMY_DEFINE
+
+/**
+ * STEP 3: Define IA_CSS_TRACE_PRINT_FILE_LINE to have file name and
+ * line printed with every log message.
+ *
+ *	   Example:
+ *	       #define IA_CSS_TRACE_PRINT_FILE_LINE
+ */
+
+/*
+** Interface
+*/
+
+/*
+** Static
+*/
+
+/**
+ * Logs a message with zero arguments if the targeted severity level is enabled
+ * at compile-time.
+ * @param module The targeted module.
+ * @param severity The severity level of the trace message. In decreasing order:
+ *                 {ASSERT, ERROR, WARNING, INFO, DEBUG, VERBOSE}.
+ * @param format The message to be traced.
+ */
+#define IA_CSS_TRACE_0(module, severity, format) \
+	IA_CSS_TRACE_IMPL(module, 0, severity, format)
+
+/**
+ * Logs a message with one argument if the targeted severity level is enabled
+ * at compile-time.
+ * @see IA_CSS_TRACE_0
+ */
+#define IA_CSS_TRACE_1(module, severity, format, a1) \
+	IA_CSS_TRACE_IMPL(module, 1, severity, format, a1)
+
+/**
+ * Logs a message with two arguments if the targeted severity level is enabled
+ * at compile-time.
+ * @see IA_CSS_TRACE_0
+ */
+#define IA_CSS_TRACE_2(module, severity, format, a1, a2) \
+	IA_CSS_TRACE_IMPL(module, 2, severity, format, a1, a2)
+
+/**
+ * Logs a message with three arguments if the targeted severity level
+ * is enabled at compile-time.
+ * @see IA_CSS_TRACE_0
+ */
+#define IA_CSS_TRACE_3(module, severity, format, a1, a2, a3) \
+	IA_CSS_TRACE_IMPL(module, 3, severity, format, a1, a2, a3)
+
+/**
+ * Logs a message with four arguments if the targeted severity level is enabled
+ * at compile-time.
+ * @see IA_CSS_TRACE_0
+ */
+#define IA_CSS_TRACE_4(module, severity, format, a1, a2, a3, a4) \
+	IA_CSS_TRACE_IMPL(module, 4, severity, format, a1, a2, a3, a4)
+
+/**
+ * Logs a message with five arguments if the targeted severity level is enabled
+ * at compile-time.
+ * @see IA_CSS_TRACE_0
+ */
+#define IA_CSS_TRACE_5(module, severity, format, a1, a2, a3, a4, a5) \
+	IA_CSS_TRACE_IMPL(module, 5, severity, format, a1, a2, a3, a4, a5)
+
+/**
+ * Logs a message with six arguments if the targeted severity level is enabled
+ * at compile-time.
+ * @see IA_CSS_TRACE_0
+ */
+#define IA_CSS_TRACE_6(module, severity, format, a1, a2, a3, a4, a5, a6) \
+	IA_CSS_TRACE_IMPL(module, 6, severity, format, a1, a2, a3, a4, a5, a6)
+
+/**
+ * Logs a message with seven arguments if the targeted severity level
+ * is enabled at compile-time.
+ * @see IA_CSS_TRACE_0
+ */
+#define IA_CSS_TRACE_7(module, severity, format, a1, a2, a3, a4, a5, a6, a7) \
+	IA_CSS_TRACE_IMPL(module, 7, severity, format, \
+					a1, a2, a3, a4, a5, a6, a7)
+
+/*
+** Dynamic
+*/
+
+/**
+* Declares, but does not define, dynamic tracing functions and variables
+* for module \p module.  For each module, place an instance of this macro
+* in the compilation unit in which you want to use dynamic tracing facility
+* so as to inform the compiler of the declaration of the available functions.
+* An invocation of this function does not enable any of the available tracing
+* levels.  Do not place a semicolon after a call to this macro.
+* @see IA_CSS_TRACE_DYNAMIC_DEFINE
+*/
+#define IA_CSS_TRACE_DYNAMIC_DECLARE(module) \
+	IA_CSS_TRACE_DYNAMIC_DECLARE_IMPL(module)
+/**
+* Declares the configuration function for the dynamic api seperatly, if one
+* wants to use it.
+*/
+#define IA_CSS_TRACE_DYNAMIC_DECLARE_CONFIG_FUNC(module) \
+	IA_CSS_TRACE_DYNAMIC_DECLARE_CONFIG_FUNC_IMPL(module)
+
+/**
+* Defines dynamic tracing functions and variables for module \p module.
+* For each module, place an instance of this macro in one, and only one,
+* of your SOURCE files so as to allow the linker resolve the related symbols.
+* An invocation of this macro does not enable any of the available tracing
+* levels.  Do not place a semicolon after a call to this macro.
+* @see IA_CSS_TRACE_DYNAMIC_DECLARE
+*/
+#define IA_CSS_TRACE_DYNAMIC_DEFINE(module) \
+	IA_CSS_TRACE_DYNAMIC_DEFINE_IMPL(module)
+/**
+* Defines the configuration function for the dynamic api seperatly, if one
+* wants to use it.
+*/
+#define IA_CSS_TRACE_DYNAMIC_DEFINE_CONFIG_FUNC(module) \
+	IA_CSS_TRACE_DYNAMIC_DEFINE_CONFIG_FUNC_IMPL(module)
+
+/**
+ * Logs a message with zero arguments if the targeted severity level is enabled
+ * both at compile-time, and run-time.
+ * @param module The targeted module.
+ * @param severity The severity level of the trace message. In decreasing order:
+ *                 {ASSERT, ERROR, WARNING, INFO, DEBUG, VERBOSE}.
+ * @param format The message to be traced.
+ */
+#define IA_CSS_TRACE_DYNAMIC_0(module, severity, format) \
+	IA_CSS_TRACE_DYNAMIC_IMPL(module, 0, severity, format)
+
+/**
+ * Logs a message with one argument if the targeted severity level is enabled
+ * both at compile-time, and run-time.
+ * @see IA_CSS_TRACE_DYNAMIC_0
+ */
+#define IA_CSS_TRACE_DYNAMIC_1(module, severity, format, a1) \
+	IA_CSS_TRACE_DYNAMIC_IMPL(module, 1, severity, format, a1)
+
+/**
+ * Logs a message with two arguments if the targeted severity level is enabled
+ * both at compile-time, and run-time.
+ * @see IA_CSS_TRACE_DYNAMIC_0
+ */
+#define IA_CSS_TRACE_DYNAMIC_2(module, severity, format, a1, a2) \
+	IA_CSS_TRACE_DYNAMIC_IMPL(module, 2, severity, format, a1, a2)
+
+/**
+ * Logs a message with three arguments if the targeted severity level
+ * is enabled both at compile-time, and run-time.
+ * @see IA_CSS_TRACE_DYNAMIC_0
+ */
+#define IA_CSS_TRACE_DYNAMIC_3(module, severity, format, a1, a2, a3) \
+	IA_CSS_TRACE_DYNAMIC_IMPL(module, 3, severity, format, a1, a2, a3)
+
+/**
+ * Logs a message with four arguments if the targeted severity level is enabled
+ * both at compile-time, and run-time.
+ * @see IA_CSS_TRACE_DYNAMIC_0
+ */
+#define IA_CSS_TRACE_DYNAMIC_4(module, severity, format, a1, a2, a3, a4) \
+	IA_CSS_TRACE_DYNAMIC_IMPL(module, 4, severity, format, a1, a2, a3, a4)
+
+/**
+ * Logs a message with five arguments if the targeted severity level is enabled
+ * both at compile-time, and run-time.
+ * @see IA_CSS_TRACE_DYNAMIC_0
+ */
+#define IA_CSS_TRACE_DYNAMIC_5(module, severity, format, a1, a2, a3, a4, a5) \
+	IA_CSS_TRACE_DYNAMIC_IMPL(module, 5, severity, format, \
+						a1, a2, a3, a4, a5)
+
+/**
+ * Logs a message with six arguments if the targeted severity level is enabled
+ * both at compile-time, and run-time.
+ * @see IA_CSS_TRACE_DYNAMIC_0
+ */
+#define IA_CSS_TRACE_DYNAMIC_6(module, severity, format, \
+						a1, a2, a3, a4, a5, a6) \
+	IA_CSS_TRACE_DYNAMIC_IMPL(module, 6, severity, format, \
+						a1, a2, a3, a4, a5, a6)
+
+/**
+ * Logs a message with seven arguments if the targeted severity level
+ * is enabled both at compile-time, and run-time.
+ * @see IA_CSS_TRACE_DYNAMIC_0
+ */
+#define IA_CSS_TRACE_DYNAMIC_7(module, severity, format, \
+						a1, a2, a3, a4, a5, a6, a7) \
+	IA_CSS_TRACE_DYNAMIC_IMPL(module, 7, severity, format, \
+						a1, a2, a3, a4, a5, a6, a7)
+
+/*
+** Implementation
+*/
+
+/* CAT */
+#define IA_CSS_TRACE_CAT_IMPL(a, b) a ## b
+#define IA_CSS_TRACE_CAT(a, b) IA_CSS_TRACE_CAT_IMPL(a, b)
+
+/* Bridge */
+#if defined(__HIVECC) || defined(__GNUC__)
+#define IA_CSS_TRACE_IMPL(module, argument_count, severity, arguments ...) \
+	IA_CSS_TRACE_CAT( \
+		IA_CSS_TRACE_CAT( \
+			IA_CSS_TRACE_CAT( \
+				IA_CSS_TRACE_CAT( \
+					IA_CSS_TRACE_CAT( \
+						IA_CSS_TRACE_, \
+						argument_count \
+					), \
+					_ \
+				), \
+				IA_CSS_TRACE_CAT( \
+					module, \
+					_TRACE_METHOD \
+				) \
+			), \
+			_ \
+		), \
+		IA_CSS_TRACE_CAT( \
+			IA_CSS_TRACE_CAT( \
+				module, \
+				_TRACE_LEVEL_ \
+			), \
+			severity \
+		) \
+		( \
+			IA_CSS_TRACE_CAT( \
+				IA_CSS_TRACE_CAT( \
+					IA_CSS_TRACE_CAT( \
+						IA_CSS_TRACE_SEVERITY_, \
+						severity \
+					), \
+					_ \
+				), \
+				IA_CSS_TRACE_CAT( \
+					module, \
+					_TRACE_METHOD \
+				) \
+			), \
+			#module, \
+			## arguments \
+		) \
+	)
+
+/* Bridge */
+#define IA_CSS_TRACE_DYNAMIC_IMPL(module, argument_count, severity, \
+							arguments ...) \
+	do { \
+		if (IA_CSS_TRACE_CAT(IA_CSS_TRACE_CAT(module, _trace_level_), \
+							severity)) { \
+			IA_CSS_TRACE_IMPL(module, argument_count, severity, \
+							## arguments); \
+		} \
+	} while (0)
+#elif defined(_MSC_VER)
+#define IA_CSS_TRACE_IMPL(module, argument_count, severity, ...) \
+	IA_CSS_TRACE_CAT( \
+		IA_CSS_TRACE_CAT( \
+			IA_CSS_TRACE_CAT( \
+				IA_CSS_TRACE_CAT( \
+					IA_CSS_TRACE_CAT( \
+						IA_CSS_TRACE_, \
+						argument_count \
+					), \
+					_ \
+				), \
+				IA_CSS_TRACE_CAT( \
+					module, \
+					_TRACE_METHOD \
+				) \
+			), \
+			_ \
+		), \
+		IA_CSS_TRACE_CAT( \
+			IA_CSS_TRACE_CAT( \
+				module, \
+				_TRACE_LEVEL_ \
+			), \
+			severity \
+		) \
+		( \
+			IA_CSS_TRACE_CAT( \
+				IA_CSS_TRACE_CAT( \
+					IA_CSS_TRACE_CAT( \
+						IA_CSS_TRACE_SEVERITY_, \
+						severity \
+					), \
+					_ \
+				), \
+				IA_CSS_TRACE_CAT( \
+					module, \
+					_TRACE_METHOD \
+				) \
+			), \
+			#module, \
+			__VA_ARGS__  \
+		) \
+	)
+
+/* Bridge */
+#define IA_CSS_TRACE_DYNAMIC_IMPL(module, argument_count, severity, ...) \
+	do { \
+		if (IA_CSS_TRACE_CAT(IA_CSS_TRACE_CAT(module, _trace_level_), \
+							severity)) { \
+			IA_CSS_TRACE_IMPL(module, argument_count, severity, \
+							__VA_ARGS__); \
+		} \
+	} while (0)
+#endif
+
+/*
+** Native Backend
+*/
+
+#if defined(__HIVECC)
+	#define IA_CSS_TRACE_PLATFORM_CELL
+#elif defined(__XTENSA__)
+	#define IA_CSS_TRACE_PLATFORM_XTENSA
+#elif defined(XTENSA_HOST)
+	#define IA_CSS_TRACE_PLATFORM_XTENSA
+#elif defined(__GNUC__)
+	#define IA_CSS_TRACE_PLATFORM_HOST
+
+	#define IA_CSS_TRACE_NATIVE(severity, module, format, arguments ...) \
+	do { \
+		IA_CSS_TRACE_FILE_PRINT_COMMAND; \
+		PRINT(IA_CSS_TRACE_FORMAT_AUG_NATIVE(severity, module, \
+						format),  ## arguments); \
+	} while (0)
+	/* TODO: In case Host Side tracing is needed to be mapped to the
+	 * Tunit, the following "IA_CSS_TRACE_TRACE" needs to be modified from
+	 * PRINT to vied_nci_tunit_print function calls
+	*/
+	#define IA_CSS_TRACE_TRACE(severity, module, format, arguments ...) \
+	do { \
+		IA_CSS_TRACE_FILE_PRINT_COMMAND; \
+		PRINT(IA_CSS_TRACE_FORMAT_AUG_TRACE(severity, module, \
+						format),  ## arguments); \
+	} while (0)
+
+#elif defined(_MSC_VER)
+	#define IA_CSS_TRACE_PLATFORM_HOST
+
+#ifdef _KERNEL_MODE
+	#define IA_CSS_TRACE_NATIVE(severity, module, format, ...) \
+		do { \
+			IA_CSS_TRACE_FILE_PRINT_COMMAND; \
+			P##severity(IA_CSS_TRACE_FORMAT_AUG_NATIVE(#severity, \
+					module, format),  __VA_ARGS__); \
+		} while (0)
+	/* TODO: In case Host Side tracing is needed to be mapped to the
+	 * Tunit, the following "IA_CSS_TRACE_TRACE" needs to be modified from
+	 * PRINT to vied_nci_tunit_print function calls
+	*/
+	#define IA_CSS_TRACE_TRACE(severity, module, format, ...) \
+		do { \
+			IA_CSS_TRACE_FILE_PRINT_COMMAND; \
+			P##severity(IA_CSS_TRACE_FORMAT_AUG_TRACE(#severity, \
+					module, format),  __VA_ARGS__); \
+		} while (0)
+#else
+	#define IA_CSS_TRACE_NATIVE(severity, module, format, ...) \
+		do { \
+			IA_CSS_TRACE_FILE_PRINT_COMMAND; \
+			PRINT(IA_CSS_TRACE_FORMAT_AUG_NATIVE(severity, \
+					module, format),  __VA_ARGS__); \
+		} while (0)
+	/* TODO: In case Host Side tracing is needed to be mapped to the
+	 * Tunit, the following "IA_CSS_TRACE_TRACE" needs to be modified from
+	 * PRINT to vied_nci_tunit_print function calls
+	*/
+	#define IA_CSS_TRACE_TRACE(severity, module, format, ...) \
+		do { \
+			IA_CSS_TRACE_FILE_PRINT_COMMAND; \
+			PRINT(IA_CSS_TRACE_FORMAT_AUG_TRACE(severity, \
+					module, format),  __VA_ARGS__); \
+		} while (0)
+#endif
+#else
+	#error Unsupported platform!
+#endif /* Platform */
+
+#if defined(IA_CSS_TRACE_PLATFORM_CELL)
+	#include <hive/attributes.h> /* VOLATILE */
+
+	#ifdef IA_CSS_TRACE_PRINT_FILE_LINE
+		#define IA_CSS_TRACE_FILE_PRINT_COMMAND \
+			do { \
+				OP___printstring(__FILE__":") VOLATILE; \
+				OP___printdec(__LINE__) VOLATILE; \
+				OP___printstring("\n") VOLATILE; \
+			} while (0)
+	#else
+		#define IA_CSS_TRACE_FILE_PRINT_COMMAND
+	#endif
+
+	#define IA_CSS_TRACE_MODULE_SEVERITY_PRINT(module, severity) \
+		do { \
+			IA_CSS_TRACE_FILE_DUMMY_DEFINE; \
+			OP___printstring("["module"]:["severity"]:") \
+			VOLATILE; \
+		} while (0)
+
+	#define IA_CSS_TRACE_MSG_NATIVE(severity, module, format) \
+		do { \
+			IA_CSS_TRACE_FILE_PRINT_COMMAND; \
+			OP___printstring("["module"]:["severity"]: "format) \
+			VOLATILE; \
+		} while (0)
+
+	#define IA_CSS_TRACE_ARG_NATIVE(module, severity, i, value) \
+		do { \
+			IA_CSS_TRACE_MODULE_SEVERITY_PRINT(module, severity); \
+			OP___dump(i, value) VOLATILE; \
+		} while (0)
+
+	#define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
+		IA_CSS_TRACE_MSG_NATIVE(severity, module, format)
+
+	#define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
+		do { \
+			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
+		} while (0)
+
+	#define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
+		do { \
+			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
+		} while (0)
+
+	#define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
+		do { \
+			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
+		} while (0)
+
+	#define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
+						a1, a2, a3, a4) \
+		do { \
+			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
+		} while (0)
+
+	#define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
+						a1, a2, a3, a4, a5) \
+		do { \
+			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 5, a5); \
+		} while (0)
+
+	#define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
+						a1, a2, a3, a4, a5, a6) \
+		do { \
+			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 5, a5); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 6, a6); \
+		} while (0)
+
+	#define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
+						a1, a2, a3, a4, a5, a6, a7) \
+		do { \
+			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 5, a5); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 6, a6); \
+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 7, a7); \
+		} while (0)
+	/*
+	** Tracing Backend
+	*/
+#if !defined(HRT_CSIM) && !defined(NO_TUNIT)
+	#include "vied_nci_tunit.h"
+#endif
+	#define IA_CSS_TRACE_AUG_FORMAT_TRACE(format, module) \
+		"[" module "]" format " : PID = %x : Timestamp = %d : PC = %x"
+
+	#define IA_CSS_TRACE_TRACE_0(severity, module, format) \
+		vied_nci_tunit_print(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
+								module), \
+			severity)
+
+	#define IA_CSS_TRACE_TRACE_1(severity, module, format, a1) \
+		vied_nci_tunit_print1i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
+								module), \
+			severity, a1)
+
+	#define IA_CSS_TRACE_TRACE_2(severity, module, format, a1, a2) \
+		vied_nci_tunit_print2i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
+								module), \
+			severity, a1, a2)
+
+	#define IA_CSS_TRACE_TRACE_3(severity, module, format, a1, a2, a3) \
+		vied_nci_tunit_print3i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
+								module), \
+			severity, a1, a2, a3)
+
+	#define IA_CSS_TRACE_TRACE_4(severity, module, format, a1, a2, a3, a4) \
+		vied_nci_tunit_print4i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
+								module), \
+			severity, a1, a2, a3, a4)
+
+	#define IA_CSS_TRACE_TRACE_5(severity, module, format, \
+						a1, a2, a3, a4, a5) \
+		vied_nci_tunit_print5i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
+								module), \
+			severity, a1, a2, a3, a4, a5)
+
+	#define IA_CSS_TRACE_TRACE_6(severity, module, format, \
+						a1, a2, a3, a4, a5, a6) \
+		vied_nci_tunit_print6i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
+								module), \
+			severity, a1, a2, a3, a4, a5, a6)
+
+	#define IA_CSS_TRACE_TRACE_7(severity, module, format, \
+						a1, a2, a3, a4, a5, a6, a7) \
+		vied_nci_tunit_print7i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
+								module), \
+			severity, a1, a2, a3, a4, a5, a6, a7)
+
+#elif defined(IA_CSS_TRACE_PLATFORM_XTENSA)
+	#include "print_support_xtensa.h"
+
+	/* TODO: Tunit tracing is not yet supported on Xtensa platforms,
+	 * proper Trace functions will be created once supported.
+	 */
+
+	#define IA_CSS_TRACE_TRACE_0(severity, module, format)
+	#define IA_CSS_TRACE_TRACE_1(severity, module, format, a1)
+	#define IA_CSS_TRACE_TRACE_2(severity, module, format, a1, a2)
+	#define IA_CSS_TRACE_TRACE_3(severity, module, format, a1, a2, a3)
+	#define IA_CSS_TRACE_TRACE_4(severity, module, format, a1, a2, a3, a4)
+	#define IA_CSS_TRACE_TRACE_5(severity, module, format, a1, a2, a3, a4, a5)
+	#define IA_CSS_TRACE_TRACE_6(severity, module, format, a1, a2, a3, a4, a5, a6)
+	#define IA_CSS_TRACE_TRACE_7(severity, module, format, a1, a2, a3, a4, a5, a6, a7)
+
+#ifdef __XTENSA_FW__
+	#define SOURCE "FW"
+#else
+	#define SOURCE "HOST"
+#endif
+
+#if defined(XTENSA_PRINT_USE_SIMCALL)
+
+	#define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
+	simcall_log_msg_0("[" SOURCE "]:[" module "]:[" severity "]: " format)
+
+	#define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
+	simcall_log_msg_1("[" SOURCE "]:[" module "]:[" severity "]: " format, a1)
+
+	#define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
+	simcall_log_msg_2("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2)
+
+	#define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
+	simcall_log_msg_3("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3)
+
+	#define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
+						a1, a2, a3, a4) \
+	simcall_log_msg_4("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4)
+
+	#define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
+						a1, a2, a3, a4, a5) \
+	simcall_log_msg_5("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5)
+
+	#define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
+						a1, a2, a3, a4, a5, a6) \
+	simcall_log_msg_6("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6)
+
+	#define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
+						a1, a2, a3, a4, a5, a6, a7) \
+	simcall_log_msg_7("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6, a7)
+
+#elif defined(XTENSA_PRINT_USE_PRINTF)
+
+	#define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
+	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format)
+
+	#define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
+	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1)
+
+	#define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
+	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2)
+
+	#define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
+	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3)
+
+	#define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
+						a1, a2, a3, a4) \
+	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4)
+
+	#define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
+						a1, a2, a3, a4, a5) \
+	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5)
+
+	#define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
+						a1, a2, a3, a4, a5, a6) \
+	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6)
+
+	#define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
+						a1, a2, a3, a4, a5, a6, a7) \
+	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6, a7)
+
+#endif
+#elif defined(IA_CSS_TRACE_PLATFORM_HOST)
+	#include "print_support.h"
+
+	#ifdef IA_CSS_TRACE_PRINT_FILE_LINE
+		#define IA_CSS_TRACE_FILE_PRINT_COMMAND \
+				PRINT("%s:%d:\n", __FILE__, __LINE__)
+	#else
+		#define IA_CSS_TRACE_FILE_PRINT_COMMAND
+	#endif
+
+	#define IA_CSS_TRACE_FORMAT_AUG_NATIVE(severity, module, format) \
+			"[" module "]:[" severity "]: " format
+
+	#define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
+		IA_CSS_TRACE_NATIVE(severity, module, format)
+
+	#define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
+		IA_CSS_TRACE_NATIVE(severity, module, format, a1)
+
+	#define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
+		IA_CSS_TRACE_NATIVE(severity, module, format, a1, a2)
+
+	#define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
+		IA_CSS_TRACE_NATIVE(severity, module, format, a1, a2, a3)
+
+	#define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
+						a1, a2, a3, a4) \
+		IA_CSS_TRACE_NATIVE(severity, module, format, a1, a2, a3, a4)
+
+	#define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
+						a1, a2, a3, a4, a5) \
+		IA_CSS_TRACE_NATIVE(severity, module, format, \
+						a1, a2, a3, a4, a5)
+
+	#define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
+						a1, a2, a3, a4, a5, a6) \
+		IA_CSS_TRACE_NATIVE(severity, module, format, \
+						a1, a2, a3, a4, a5, a6)
+
+	#define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
+						a1, a2, a3, a4, a5, a6, a7) \
+		IA_CSS_TRACE_NATIVE(severity, module, format, \
+						a1, a2, a3, a4, a5, a6, a7)
+
+	#define IA_CSS_TRACE_FORMAT_AUG_TRACE(severity, module, format) \
+			"["module"]:["severity"]: "format
+
+	#define IA_CSS_TRACE_TRACE_0(severity, module, format) \
+		IA_CSS_TRACE_TRACE(severity, module, format)
+
+	#define IA_CSS_TRACE_TRACE_1(severity, module, format, a1) \
+		IA_CSS_TRACE_TRACE(severity, module, format, a1)
+
+	#define IA_CSS_TRACE_TRACE_2(severity, module, format, a1, a2) \
+		IA_CSS_TRACE_TRACE(severity, module, format, a1, a2)
+
+	#define IA_CSS_TRACE_TRACE_3(severity, module, format, a1, a2, a3) \
+		IA_CSS_TRACE_TRACE(severity, module, format, a1, a2, a3)
+
+	#define IA_CSS_TRACE_TRACE_4(severity, module, format, \
+						a1, a2, a3, a4) \
+		IA_CSS_TRACE_TRACE(severity, module, format, a1, a2, a3, a4)
+
+	#define IA_CSS_TRACE_TRACE_5(severity, module, format, \
+						a1, a2, a3, a4, a5) \
+		IA_CSS_TRACE_TRACE(severity, module, format, \
+						a1, a2, a3, a4, a5)
+
+	#define IA_CSS_TRACE_TRACE_6(severity, module, format, \
+						a1, a2, a3, a4, a5, a6) \
+		IA_CSS_TRACE_TRACE(severity, module, format, \
+						a1, a2, a3, a4, a5, a6)
+
+	#define IA_CSS_TRACE_TRACE_7(severity, module, format, \
+						a1, a2, a3, a4, a5, a6, a7) \
+		IA_CSS_TRACE_TRACE(severity, module, format, \
+						a1, a2, a3, a4, a5, a6, a7)
+#endif
+
+/* Disabled */
+/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
+#define IA_CSS_TRACE_0_1_0(severity, module, format)
+#define IA_CSS_TRACE_1_1_0(severity, module, format, arg1)
+#define IA_CSS_TRACE_2_1_0(severity, module, format, arg1, arg2)
+#define IA_CSS_TRACE_3_1_0(severity, module, format, arg1, arg2, arg3)
+#define IA_CSS_TRACE_4_1_0(severity, module, format, arg1, arg2, arg3, arg4)
+#define IA_CSS_TRACE_5_1_0(severity, module, format, arg1, arg2, arg3, arg4, \
+							arg5)
+#define IA_CSS_TRACE_6_1_0(severity, module, format, arg1, arg2, arg3, arg4, \
+							arg5, arg6)
+#define IA_CSS_TRACE_7_1_0(severity, module, format, arg1, arg2, arg3, arg4, \
+							arg5, arg6, arg7)
+
+/* Enabled */
+/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
+#define IA_CSS_TRACE_0_1_1 IA_CSS_TRACE_NATIVE_0
+#define IA_CSS_TRACE_1_1_1 IA_CSS_TRACE_NATIVE_1
+#define IA_CSS_TRACE_2_1_1 IA_CSS_TRACE_NATIVE_2
+#define IA_CSS_TRACE_3_1_1 IA_CSS_TRACE_NATIVE_3
+#define IA_CSS_TRACE_4_1_1 IA_CSS_TRACE_NATIVE_4
+#define IA_CSS_TRACE_5_1_1 IA_CSS_TRACE_NATIVE_5
+#define IA_CSS_TRACE_6_1_1 IA_CSS_TRACE_NATIVE_6
+#define IA_CSS_TRACE_7_1_1 IA_CSS_TRACE_NATIVE_7
+
+#if defined(_MSC_VER) && defined(_KERNEL_MODE)
+/* Enabled */
+/* Legend: IA_CSS_TRACE_SEVERITY_{Severity Level}_{Backend ID} */
+#define IA_CSS_TRACE_SEVERITY_ASSERT_1  ASSERT
+#define IA_CSS_TRACE_SEVERITY_ERROR_1   ERROR
+#define IA_CSS_TRACE_SEVERITY_WARNING_1 WARNING
+#define IA_CSS_TRACE_SEVERITY_INFO_1    INFO
+#define IA_CSS_TRACE_SEVERITY_DEBUG_1   DEBUG
+#define IA_CSS_TRACE_SEVERITY_VERBOSE_1 VERBOSE
+#define IA_CSS_TRACE_SEVERITY_FATAL_1   FATAL
+#else
+/* Enabled */
+/* Legend: IA_CSS_TRACE_SEVERITY_{Severity Level}_{Backend ID} */
+#define IA_CSS_TRACE_SEVERITY_ASSERT_1  "Assert"
+#define IA_CSS_TRACE_SEVERITY_ERROR_1   "Error"
+#define IA_CSS_TRACE_SEVERITY_WARNING_1 "Warning"
+#define IA_CSS_TRACE_SEVERITY_INFO_1    "Info"
+#define IA_CSS_TRACE_SEVERITY_DEBUG_1   "Debug"
+#define IA_CSS_TRACE_SEVERITY_VERBOSE_1 "Verbose"
+#define IA_CSS_TRACE_SEVERITY_FATAL_1   "Fatal"
+#endif
+/* Disabled */
+/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
+#define IA_CSS_TRACE_0_2_0(severity, module, format)
+#define IA_CSS_TRACE_1_2_0(severity, module, format, arg1)
+#define IA_CSS_TRACE_2_2_0(severity, module, format, arg1, arg2)
+#define IA_CSS_TRACE_3_2_0(severity, module, format, arg1, arg2, arg3)
+#define IA_CSS_TRACE_4_2_0(severity, module, format, arg1, arg2, arg3, arg4)
+#define IA_CSS_TRACE_5_2_0(severity, module, format, arg1, arg2, arg3, arg4, \
+							arg5)
+#define IA_CSS_TRACE_6_2_0(severity, module, format, arg1, arg2, arg3, arg4, \
+							arg5, arg6)
+#define IA_CSS_TRACE_7_2_0(severity, module, format, arg1, arg2, arg3, arg4, \
+							arg5, arg6, arg7)
+
+/* Enabled */
+/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
+#define IA_CSS_TRACE_0_2_1 IA_CSS_TRACE_TRACE_0
+#define IA_CSS_TRACE_1_2_1 IA_CSS_TRACE_TRACE_1
+#define IA_CSS_TRACE_2_2_1 IA_CSS_TRACE_TRACE_2
+#define IA_CSS_TRACE_3_2_1 IA_CSS_TRACE_TRACE_3
+#define IA_CSS_TRACE_4_2_1 IA_CSS_TRACE_TRACE_4
+#define IA_CSS_TRACE_5_2_1 IA_CSS_TRACE_TRACE_5
+#define IA_CSS_TRACE_6_2_1 IA_CSS_TRACE_TRACE_6
+#define IA_CSS_TRACE_7_2_1 IA_CSS_TRACE_TRACE_7
+
+/* Enabled */
+/* Legend: IA_CSS_TRACE_SEVERITY_{Severity Level}_{Backend ID} */
+#define IA_CSS_TRACE_SEVERITY_ASSERT_2  VIED_NCI_TUNIT_MSG_SEVERITY_FATAL
+#define IA_CSS_TRACE_SEVERITY_ERROR_2   VIED_NCI_TUNIT_MSG_SEVERITY_ERROR
+#define IA_CSS_TRACE_SEVERITY_WARNING_2 VIED_NCI_TUNIT_MSG_SEVERITY_WARNING
+#define IA_CSS_TRACE_SEVERITY_INFO_2    VIED_NCI_TUNIT_MSG_SEVERITY_NORMAL
+#define IA_CSS_TRACE_SEVERITY_DEBUG_2   VIED_NCI_TUNIT_MSG_SEVERITY_USER1
+#define IA_CSS_TRACE_SEVERITY_VERBOSE_2 VIED_NCI_TUNIT_MSG_SEVERITY_USER2
+
+/*
+** Dynamicism
+*/
+
+#define IA_CSS_TRACE_DYNAMIC_DECLARE_IMPL(module) \
+	do { \
+		void IA_CSS_TRACE_CAT(module, _trace_assert_enable)(void); \
+		void IA_CSS_TRACE_CAT(module, _trace_assert_disable)(void); \
+		void IA_CSS_TRACE_CAT(module, _trace_error_enable)(void); \
+		void IA_CSS_TRACE_CAT(module, _trace_error_disable)(void); \
+		void IA_CSS_TRACE_CAT(module, _trace_warning_enable)(void); \
+		void IA_CSS_TRACE_CAT(module, _trace_warning_disable)(void); \
+		void IA_CSS_TRACE_CAT(module, _trace_info_enable)(void); \
+		void IA_CSS_TRACE_CAT(module, _trace_info_disable)(void); \
+		void IA_CSS_TRACE_CAT(module, _trace_debug_enable)(void); \
+		void IA_CSS_TRACE_CAT(module, _trace_debug_disable)(void); \
+		void IA_CSS_TRACE_CAT(module, _trace_verbose_enable)(void); \
+		void IA_CSS_TRACE_CAT(module, _trace_verbose_disable)(void); \
+	} while (0)
+
+#define IA_CSS_TRACE_DYNAMIC_DECLARE_CONFIG_FUNC_IMPL(module) \
+	do { \
+		IA_CSS_TRACE_FILE_DUMMY_DEFINE; \
+		void IA_CSS_TRACE_CAT(module, _trace_configure)\
+			(int argc, const char *const *argv); \
+	} while (0)
+
+#include "platform_support.h"
+#include "type_support.h"
+
+#define IA_CSS_TRACE_DYNAMIC_DEFINE_IMPL(module) \
+	static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_assert); \
+	static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_error); \
+	static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_warning); \
+	static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_info); \
+	static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_debug); \
+	static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_verbose); \
+	\
+	void IA_CSS_TRACE_CAT(module, _trace_assert_enable)(void) \
+	{ \
+		IA_CSS_TRACE_CAT(module, _trace_level_assert) = 1; \
+	} \
+	\
+	void IA_CSS_TRACE_CAT(module, _trace_assert_disable)(void) \
+	{ \
+		IA_CSS_TRACE_CAT(module, _trace_level_assert) = 0; \
+	} \
+	\
+	void IA_CSS_TRACE_CAT(module, _trace_error_enable)(void) \
+	{ \
+		IA_CSS_TRACE_CAT(module, _trace_level_error) = 1; \
+	} \
+	\
+	void IA_CSS_TRACE_CAT(module, _trace_error_disable)(void) \
+	{ \
+		IA_CSS_TRACE_CAT(module, _trace_level_error) = 0; \
+	} \
+	\
+	void IA_CSS_TRACE_CAT(module, _trace_warning_enable)(void) \
+	{ \
+		IA_CSS_TRACE_CAT(module, _trace_level_warning) = 1; \
+	} \
+	\
+	void IA_CSS_TRACE_CAT(module, _trace_warning_disable)(void) \
+	{ \
+		IA_CSS_TRACE_CAT(module, _trace_level_warning) = 0; \
+	} \
+	\
+	void IA_CSS_TRACE_CAT(module, _trace_info_enable)(void) \
+	{ \
+		IA_CSS_TRACE_CAT(module, _trace_level_info) = 1; \
+	} \
+	\
+	void IA_CSS_TRACE_CAT(module, _trace_info_disable)(void) \
+	{ \
+		IA_CSS_TRACE_CAT(module, _trace_level_info) = 0; \
+	} \
+	\
+	void IA_CSS_TRACE_CAT(module, _trace_debug_enable)(void) \
+	{ \
+		IA_CSS_TRACE_CAT(module, _trace_level_debug) = 1; \
+	} \
+	\
+	void IA_CSS_TRACE_CAT(module, _trace_debug_disable)(void) \
+	{ \
+		IA_CSS_TRACE_CAT(module, _trace_level_debug) = 0; \
+	} \
+	\
+	void IA_CSS_TRACE_CAT(module, _trace_verbose_enable)(void) \
+	{ \
+		IA_CSS_TRACE_CAT(module, _trace_level_verbose) = 1; \
+	} \
+	\
+	void IA_CSS_TRACE_CAT(module, _trace_verbose_disable)(void) \
+	{ \
+		IA_CSS_TRACE_CAT(module, _trace_level_verbose) = 0; \
+	}
+
+#define IA_CSS_TRACE_DYNAMIC_DEFINE_CONFIG_FUNC_IMPL(module) \
+void IA_CSS_TRACE_CAT(module, _trace_configure)(const int argc, \
+				const char *const *const argv) \
+{ \
+	int i = 1; \
+	const char *levels = 0; \
+	\
+	while (i < argc) { \
+		if (!strcmp(argv[i], "-" #module "_trace")) { \
+			++i; \
+			\
+			if (i < argc) { \
+				levels = argv[i]; \
+				\
+				while (*levels) { \
+					switch (*levels++) { \
+					case 'a': \
+						IA_CSS_TRACE_CAT \
+					(module, _trace_assert_enable)(); \
+						break; \
+						\
+					case 'e': \
+						IA_CSS_TRACE_CAT \
+					(module, _trace_error_enable)(); \
+						break; \
+						\
+					case 'w': \
+						IA_CSS_TRACE_CAT \
+					(module, _trace_warning_enable)(); \
+						break; \
+						\
+					case 'i': \
+						IA_CSS_TRACE_CAT \
+					(module, _trace_info_enable)(); \
+						break; \
+						\
+					case 'd': \
+						IA_CSS_TRACE_CAT \
+					(module, _trace_debug_enable)(); \
+						break; \
+						\
+					case 'v': \
+						IA_CSS_TRACE_CAT \
+					(module, _trace_verbose_enable)(); \
+						break; \
+						\
+					default: \
+					} \
+				} \
+			} \
+		} \
+		\
+	++i; \
+	} \
+}
+
+#endif /* __IA_CSS_TRACE_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_acb_devices.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_acb_devices.h
new file mode 100644
index 000000000000..d8bff58ee178
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_acb_devices.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IPU_DEVICE_ACB_DEVICES_H
+#define __IPU_DEVICE_ACB_DEVICES_H
+
+enum ipu_device_acb_id {
+	IPU_DEVICE_ACB_B2B_ID,
+	IPU_DEVICE_ACB_RYNR_ID,
+	IPU_DEVICE_ACB_DEMOSAIC_ID,
+	IPU_DEVICE_ACB_ICA_ID,
+	IPU_DEVICE_ACB_LSC_ID,
+	IPU_DEVICE_ACB_DPC_ID,
+	IPU_DEVICE_ACB_R2I_SIE_ID,
+	IPU_DEVICE_ACB_R2I_DS_A_ID,
+	IPU_DEVICE_ACB_R2I_DS_B_ID,
+	IPU_DEVICE_ACB_AWB_ID,
+	IPU_DEVICE_ACB_AF_ID,
+	IPU_DEVICE_ACB_PAF_ID,
+	IPU_DEVICE_ACB_AE_ID,
+	IPU_DEVICE_ACB_NUM_ACB
+};
+
+#define IPU_DEVICE_ACB_NUM_ISA_ACB (IPU_DEVICE_ACB_NUM_ACB)
+
+#endif /* __IPU_DEVICE_ACB_DEVICES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_gp_devices.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_gp_devices.h
new file mode 100644
index 000000000000..df91edd7a91f
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_gp_devices.h
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IPU_DEVICE_GP_DEVICES_H
+#define __IPU_DEVICE_GP_DEVICES_H
+#include "math_support.h"
+#include "type_support.h"
+
+enum ipu_device_gp_id {
+	IPU_DEVICE_GP_PSA = 0,
+	IPU_DEVICE_GP_ISA_STATIC,
+	IPU_DEVICE_GP_ISA_RUNTIME,
+	IPU_DEVICE_GP_NUM_GP
+};
+
+/* The PSA_* naming in the enum members refers to the internal separation of
+ * the PSA. Using it this way should make this change transparent
+ * to higher layers.
+ *
+ * For details on the values and usage of the muxes see Figures 3-1
+ * in section 2.1.3 and Figure 3-3 in section 2.2.2 of the IPU-5 General
+ * Fixed Function MAS. Additionally, refer to the respective description
+ * fields in the RDL files on the SDK (either psa_ip_top_system.rdl
+ * or isa_ps_system.rdl).
+ */
+enum ipu_device_gp_psa_mux_id {
+	/* Mux/demuxes */
+	/* 0 - BNLM output pixel stream; 1 - BNLM output delta stream */
+	IPU_DEVICE_GP_PSA_1_NOISE_MUX = 0,
+	/* 0 - To XNR; 1 - WB/DM */
+	IPU_DEVICE_GP_PSA_2_STILLS_MODE_MUX,
+	/* 0 - To Gamma_Star; 1 - To VCA; 2 - To VCSC */
+	IPU_DEVICE_GP_PSA_2_V2S_RGB_4_DEMUX,
+	/* 0 - input from Gamma_star; 1 - input from VCA; 2 input from DMSC */
+	IPU_DEVICE_GP_PSA_2_S2V_F_INPUT_MUX,
+	/* 0 - To IEFD. 1 - To GLTM; 2 - To DM */
+	IPU_DEVICE_GP_PSA_2_V2S_5_DEMUX,
+	/* 0 - VCSC output is chosen; 1 - BNLM output is chosen */
+	IPU_DEVICE_GP_PSA_3_VCSC_BP_MUX,
+	/* 0 - v2s_1 output; 1 - ISA downscaled stream; 2 - ISA original sized stream */
+	IPU_DEVICE_GP_LBFF_V2S_1_OUTPUT_MUX,
+	/* Device blockers */
+	/* BNLM pixel output block enable */
+	IPU_DEVICE_GP_PSA_1_BNLM_PIXEL_YUV_STRM_BLK,
+	/* BNLM pixel output block enable */
+	IPU_DEVICE_GP_PSA_1_BNLM_PIXEL_BAYER_STRM_BLK,
+	/* BNLM delta output block enable */
+	IPU_DEVICE_GP_PSA_1_BNLM_DELTA_STRM_BLK,
+	/* Block pixel stream to gltm from vcsc */
+	IPU_DEVICE_GP_PSA_3_VCSC_TO_GLTM_BLK,
+	/* Block pixel stream to gltm from bnlm */
+	IPU_DEVICE_GP_PSA_3_BNLM_TO_GLTM_BLK,
+	/* Frame size reg for strmCrop H */
+	IPU_DEVICE_GP_LBFF_S2V_H_FRAME_SIZE,
+	IPU_DEVICE_GP_PSA_MUX_NUM_MUX
+};
+
+enum ipu_device_gp_isa_static_mux_id {
+	/* Muxes/demuxes */
+	/* 0 - to ISL.S2V; 1 - to PSA */
+	IPU_DEVICE_GP_ISA_STATIC_ISA_ORIG_OUT_DEMUX_SEL = 0,
+	/* 0 - to ISL.S2V; 1 - to PSA */
+	IPU_DEVICE_GP_ISA_STATIC_ISA_SCALED_A_OUT_DEMUX_SEL,
+	/* 0 - Input Correction; 1 - B2B mux */
+	IPU_DEVICE_GP_ISA_STATIC_AWB_MUX_SEL,
+	/* 0 - Input Correction; 1 - B2B mux */
+	IPU_DEVICE_GP_ISA_STATIC_AE_MUX_SEL,
+	/* 0 - Input Correction; 1 - B2B mux */
+	IPU_DEVICE_GP_ISA_STATIC_AF_MUX_SEL,
+	/* 0 - to Lsc; 1 - to Dpc; 2 - to X2b */
+	IPU_DEVICE_GP_ISA_STATIC_ISA_INPUT_CORR_DEMUX_SEL,
+	/* 0 - Input correction; 1 - Dpc; 2 - X2b */
+	IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_SEL,
+	/* 0 - to B2b; 1 - to Dpc; 2 - X2b*/
+	IPU_DEVICE_GP_ISA_STATIC_LSC_DEMUX_SEL,
+	/* 0 - to Lsc; 1 - to B2b; 2 - to X2b */
+	IPU_DEVICE_GP_ISA_STATIC_DPC_DEMUX_SEL,
+	/* 0 - Lsc; 1 - Input correction; 2 - X2b */
+	IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_SEL,
+	/* 0 - Lsc; 1 - X2b; 2 - Input correction */
+	IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_SEL,
+	/* 0 - to Lsc; 1 - to Dpc; 2 - to B2b */
+	IPU_DEVICE_GP_ISA_STATIC_X2B_DEMUX_SEL,
+	/* 0 - Lsc; 1 - Dpc; 2 - X2b */
+	IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_SEL,
+	/* 0 - External PAF CH0/1; 1 - DPC extracted PAF CH0/1; 2 - X2B extracted PAF CH0/1 */
+	IPU_DEVICE_GP_ISA_STATIC_PAF_SRC_SEL,
+	/* 0 - to Dol mux; 1 - to Dol */
+	IPU_DEVICE_GP_ISA_STATIC_MAIN_INPUT_DOL_DEMUX_SEL,
+	/* 0 - Main input; 1 - Dol */
+	IPU_DEVICE_GP_ISA_STATIC_DOL_MUX_SEL,
+	/* Blockers */
+	/* ISA input correction Port block */
+	IPU_DEVICE_GP_ISA_STATIC_ISA_INPUT_CORR_PORT_BLK,
+	/* AWB Mux input correction Port block */
+	IPU_DEVICE_GP_ISA_STATIC_AWBMUX_INPUT_CORR_PORT_BLK,
+	/* AE Mux input correction Port block */
+	IPU_DEVICE_GP_ISA_STATIC_AEMUX_INPUT_CORR_PORT_BLK,
+	/* AF Mux input correction Port block */
+	IPU_DEVICE_GP_ISA_STATIC_AFMUX_INPUT_CORR_PORT_BLK,
+	/* AWB Mux B2B Mux Port block */
+	IPU_DEVICE_GP_ISA_STATIC_AWBMUX_B2B_MUX_PORT_BLK,
+	/* AE Mux B2B Mux Port block */
+	IPU_DEVICE_GP_ISA_STATIC_AEMUX_B2B_MUX_PORT_BLK,
+	/* AF Mux B2B Mux Port block */
+	IPU_DEVICE_GP_ISA_STATIC_AFMUX_B2B_MUX_PORT_BLK,
+	/* PAF stream sync configuration */
+	IPU_DEVICE_GP_ISA_STATIC_PAF_STREAM_SYNC_CFG,
+	/* Paf Mux gddpc Port block */
+	IPU_DEVICE_GP_ISA_STATIC_PAF_GDDPC_PORT_BLK,
+	/* Paf Mux input isa Port block */
+	IPU_DEVICE_GP_ISA_STATIC_PAF_ISA_STREAM_PORT_BLK,
+	/* Paf Mux X2B Port block */
+	IPU_DEVICE_GP_ISA_STATIC_PAF_X2B_PORT_BLK,
+	/* SIS A port block */
+	IPU_DEVICE_GP_ISA_STATIC_SIS_A_PORT_BLK,
+	/* SIS B port block */
+	IPU_DEVICE_GP_ISA_STATIC_SIS_B_PORT_BLK,
+	/* Lsc mux Input Corr demux port block */
+	IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_INPUT_CORR_DEMUX_PORT_BLK,
+	/* Dpc mux Lsc demux port block */
+	IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_INPUT_CORR_DEMUX_PORT_BLK,
+	/* Dpc mux Lsc demux port block */
+	IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_LSC_DEMUX_PORT_BLK,
+	/* Dpc mux X2b demux port block */
+	IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_X2B_DEMUX_PORT_BLK,
+	/* Dpc mux Lsc demux port block */
+	IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_DPC_DEMUX_PORT_BLK,
+	/* Lsc mux X2b demux port block */
+	IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_X2B_DEMUX_PORT_BLK,
+	/* X2b mux Lsc demux port block */
+	IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_LSC_DEMUX_PORT_BLK,
+	/* X2b mux Dpc demux port block */
+	IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_DPC_DEMUX_PORT_BLK,
+	/* X2b mux Input Corr demux port block */
+	IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_INPUT_CORR_DEMUX_PORT_BLK,
+	/* B2b mux Lsc demux port block */
+	IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_LSC_DEMUX_PORT_BLK,
+	/* B2b mux X2b demux port block */
+	IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_X2B_DEMUX_PORT_BLK,
+	/* B2b mux Dpc demux port block */
+	IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_DPC_DEMUX_PORT_BLK,
+	/* B2b B2b mux port block */
+	IPU_DEVICE_GP_ISA_STATIC_B2B_B2B_MUX_PORT_BLK,
+	/* Stat B2b mux port block */
+	IPU_DEVICE_GP_ISA_STATIC_3A_STAT_B2B_MUX_PORT_BLK,
+	/* Stat Input correction mux port block */
+	IPU_DEVICE_GP_ISA_STATIC_3A_STAT_INPUT_CORR_MUX_PORT_BLK,
+	/* ISA Orig B2b port block */
+	IPU_DEVICE_GP_ISA_STATIC_ISA_ORIG_B2B_PORT_BLK,
+	/* B2r B2b port block */
+	IPU_DEVICE_GP_ISA_STATIC_B2R_B2B_PORT_BLK,
+	/* ISA Scaled A Out R2i port block */
+	IPU_DEVICE_GP_ISA_STATIC_ISA_SCALED_A_OUT_R2I_PORT_BLK,
+	/* ISA Scaled B Out R2i port block */
+	IPU_DEVICE_GP_ISA_STATIC_ISA_SCALED_B_OUT_R2I_PORT_BLK,
+	/* ISA Full Out R2i port block */
+	IPU_DEVICE_GP_ISA_STATIC_ISA_FULL_OUT_R2I_PORT_BLK,
+	/* Main input Dol demux port block */
+	IPU_DEVICE_GP_ISA_STATIC_MAIN_INPUT_DOL_DEMUX_PORT_BLK,
+	/* 0 - pif_yuv_mode disabled; 1 - pif_yuv_mode enabled */
+	IPU_DEVICE_GP_ISA_PIF_YUV_MODE_EN,
+	IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX
+};
+
+enum ipu_device_gp_isa_runtime_mux_id {
+	/* frame dim */
+	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_ORIG_OUT,
+	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_FULL_OUT,
+	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SCALED_A,
+	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SCALED_B,
+	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SIS_A,
+	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SIS_B,
+	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_STRMCROP_A,
+	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_STRMCROP_B,
+	IPU_DEVICE_GP_ISA_RUNTIME_MUX_NUM_MUX
+};
+
+/* The value below is the largest *MUX_NUM_MUX of the mux enums. */
+#define IPU_DEVICE_GP_MAX_NUM ((uint32_t)(IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX))
+
+#endif /* __IPU_DEVICE_GP_DEVICES_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/math_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/math_support.h
new file mode 100644
index 000000000000..4c756f1ffb24
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/math_support.h
@@ -0,0 +1,328 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __MATH_SUPPORT_H
+#define __MATH_SUPPORT_H
+
+#include "storage_class.h" /* for STORAGE_CLASS_INLINE */
+#include "type_support.h"
+#include "assert_support.h"
+
+/* in case we have min/max/MIN/MAX macro's undefine them */
+#ifdef min
+#undef min
+#endif
+#ifdef max
+#undef max
+#endif
+#ifdef MIN /* also defined in include/hrt/numeric.h from SDK */
+#undef MIN
+#endif
+#ifdef MAX
+#undef MAX
+#endif
+
+#ifndef INT8_MIN
+#define INT8_MIN        (-127 - 1)
+#endif
+
+#ifndef INT8_MAX
+#define INT8_MAX        (127)
+#endif
+
+#ifndef UINT8_MAX
+#define UINT8_MAX       (0xffUL)
+#endif
+
+#ifndef UINT16_MAX
+#define UINT16_MAX       (0xffffUL)
+#endif
+
+#ifndef UINT32_MAX
+#define UINT32_MAX       (0xffffffffUL)
+#endif
+
+#define IS_ODD(a) ((a) & 0x1)
+#define IS_EVEN(a) (!IS_ODD(a))
+#define IS_POWER2(a) (!((a)&((a)-1)))
+#define IS_MULTIPLE_OF(a, b) ((a % b) == 0)
+#define IS_MASK_BITS_SET(a, b)	((a & b) != 0)
+
+/*To Find next power of 2 number from x */
+#define bit2(x)            ((x)      | ((x) >> 1))
+#define bit4(x)            (bit2(x)  | (bit2(x) >> 2))
+#define bit8(x)            (bit4(x)  | (bit4(x) >> 4))
+#define bit16(x)           (bit8(x)  | (bit8(x) >> 8))
+#define bit32(x)           (bit16(x) | (bit16(x) >> 16))
+#define NEXT_POWER_OF_2(x) (bit32(x-1) + 1)
+
+/* force a value to a lower even value */
+#define EVEN_FLOOR(x)	((x) & ~1UL)
+
+/* A => B */
+#define IMPLIES(a, b) (!(a) || (b))
+
+/* The ORIG_BITS th bit is the sign bit */
+/* Sign extends a ORIG_BITS bits long signed number to a 64-bit signed number */
+/* By type casting it can relimited to any valid type-size
+ * (32-bit signed or 16-bit or 8-bit)
+ */
+/* By masking it can be transformed to any arbitrary bit size */
+#define SIGN_EXTEND(VAL, ORIG_BITS) \
+((~(((VAL)&(1ULL<<((ORIG_BITS)-1)))-1))|(VAL))
+
+#define EXTRACT_BIT(a, b)	((a >> b) & 1)
+
+/* for preprocessor and array sizing use MIN and MAX
+   otherwise use min and max */
+#define MAX(a, b)		(((a) > (b)) ? (a) : (b))
+#define MIN(a, b)		(((a) < (b)) ? (a) : (b))
+#define CLIP(a, b, c)		MIN((MAX((a), (b))), (c))
+/* Integer round-down division of a with b */
+#define FLOOR_DIV(a, b)		((b) ? ((a) / (b)) : 0)
+/* Align a to the lower multiple of b */
+#define FLOOR_MUL(a, b)		(FLOOR_DIV(a, b) * (b))
+/* Integer round-up division of a with b */
+#define CEIL_DIV(a, b)		((b) ? (((a) + (b) - 1) / (b)) : 0)
+/* Align a to the upper multiple of b */
+#define CEIL_MUL(a, b)		(CEIL_DIV(a, b) * (b))
+/* Align a to the upper multiple of b - fast implementation
+ * for cases when b=pow(2,n)
+ */
+#define CEIL_MUL2(a, b)		(((a) + (b) - 1) & ~((b) - 1))
+/* integer round-up division of a with pow(2,b) */
+#define CEIL_SHIFT(a, b)	(((a) + (1UL << (b)) - 1) >> (b))
+/* Align a to the upper multiple of pow(2,b) */
+#define CEIL_SHIFT_MUL(a, b)	(CEIL_SHIFT(a, b) << (b))
+/* Absolute difference of a and b */
+#define ABS_DIF(a, b)		(((a) > (b)) ? ((a) - (b)) : ((b) - (a)))
+#define ABS(a) ABS_DIF(a, 0)
+/* Square of x */
+#define SQR(x)			((x)*(x))
+/* Integer round-half-down division of a nad b */
+#define ROUND_HALF_DOWN_DIV(a, b)	((b) ? ((a) + (b / 2) - 1) / (b) : 0)
+/* Align a to the round-half-down multiple of b */
+#define ROUND_HALF_DOWN_MUL(a, b)	(ROUND_HALF_DOWN_DIV(a, b) * (b))
+
+#define MAX3(a, b, c)		MAX((a), MAX((b), (c)))
+#define MIN3(a, b, c)		MIN((a), MIN((b), (c)))
+#define MAX4(a, b, c, d)	MAX((MAX((a), (b))), (MAX((c), (d))))
+#define MIN4(a, b, c, d)	MIN((MIN((a), (b))), (MIN((c), (d))))
+
+/* min and max should not be macros as they will evaluate their arguments twice.
+   if you really need a macro (e.g. for CPP or for initializing an array)
+   use MIN() and MAX(), otherwise use min() and max() */
+
+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(a) ((sizeof(a) / sizeof(*(a))))
+#endif
+
+#ifndef BYTES
+#define BYTES(bit) (((bit)+7)/8)
+#endif
+
+#if !defined(PIPE_GENERATION)
+STORAGE_CLASS_INLINE unsigned int max_value_bits(unsigned int bits)
+{
+	return (bits == 0) ? 0 : ((2 * ((1 << ((bits) - 1)) - 1)) + 1);
+}
+STORAGE_CLASS_INLINE unsigned int max_value_bytes(unsigned int bytes)
+{
+	return max_value_bits(IA_CSS_UINT8_T_BITS * bytes);
+}
+STORAGE_CLASS_INLINE int max(int a, int b)
+{
+	return MAX(a, b);
+}
+
+STORAGE_CLASS_INLINE int min(int a, int b)
+{
+	return MIN(a, b);
+}
+
+STORAGE_CLASS_INLINE int clip(int a, int b, int c)
+{
+	return min(max(a, b), c);
+}
+
+STORAGE_CLASS_INLINE unsigned int umax(unsigned int a, unsigned int b)
+{
+	return MAX(a, b);
+}
+
+STORAGE_CLASS_INLINE unsigned int umin(unsigned int a, unsigned int b)
+{
+	return MIN(a, b);
+}
+
+STORAGE_CLASS_INLINE unsigned int uclip(unsigned int a, unsigned int b,
+					unsigned int c)
+{
+	return umin(umax(a, b), c);
+}
+
+STORAGE_CLASS_INLINE unsigned int ceil_div(unsigned int a, unsigned int b)
+{
+	return CEIL_DIV(a, b);
+}
+
+STORAGE_CLASS_INLINE unsigned int ceil_mul(unsigned int a, unsigned int b)
+{
+	return CEIL_MUL(a, b);
+}
+
+STORAGE_CLASS_INLINE unsigned int ceil_mul2(unsigned int a, unsigned int b)
+{
+	return CEIL_MUL2(a, b);
+}
+
+STORAGE_CLASS_INLINE unsigned int ceil_shift(unsigned int a, unsigned int b)
+{
+	return CEIL_SHIFT(a, b);
+}
+
+STORAGE_CLASS_INLINE unsigned int ceil_shift_mul(unsigned int a, unsigned int b)
+{
+	return CEIL_SHIFT_MUL(a, b);
+}
+
+STORAGE_CLASS_INLINE int abs_dif(int a, int b)
+{
+	return ABS_DIF(a, b);
+}
+
+STORAGE_CLASS_INLINE unsigned int uabs_dif(unsigned int a, unsigned int b)
+{
+	return ABS_DIF(a, b);
+}
+
+STORAGE_CLASS_INLINE unsigned int round_half_down_div(unsigned int a,
+		unsigned int b)
+{
+	return ROUND_HALF_DOWN_DIV(a, b);
+}
+
+STORAGE_CLASS_INLINE unsigned int round_half_down_mul(unsigned int a,
+		unsigned int b)
+{
+	return ROUND_HALF_DOWN_MUL(a, b);
+}
+
+STORAGE_CLASS_INLINE unsigned int ceil_pow2(uint32_t a)
+{
+	unsigned int retval = 0;
+
+	if (IS_POWER2(a)) {
+		retval =  (unsigned int)a;
+	} else {
+		unsigned int v = a;
+
+		v |= v>>1;
+		v |= v>>2;
+		v |= v>>4;
+		v |= v>>8;
+		v |= v>>16;
+		retval =  (unsigned int)(v+1);
+	}
+	return retval;
+}
+
+STORAGE_CLASS_INLINE unsigned int floor_log2(uint32_t a)
+{
+	static const uint8_t de_bruijn[] = {
+		0,  9,  1, 10, 13, 21,  2, 29, 11, 14, 16, 18, 22, 25,  3, 30,
+		8, 12, 20, 28, 15, 17, 24,  7, 19, 27, 23,  6, 26,  5,  4, 31
+	};
+	uint32_t v = a;
+
+	v |= v>>1;
+	v |= v>>2;
+	v |= v>>4;
+	v |= v>>8;
+	v |= v>>16;
+	return (unsigned int)de_bruijn[(v*0x07C4ACDDU)>>27];
+}
+
+/* Divide by small power of two */
+STORAGE_CLASS_INLINE unsigned int
+udiv2_small_i(uint32_t a, uint32_t b)
+{
+	assert(b <= 2);
+	return a >> (b-1);
+}
+
+/* optimized divide for small results
+ * a will be divided by b
+ * outbits is the number of bits needed for the result
+ * the smaller the cheaper the function will be.
+ * if the result doesn't fit in the number of output bits
+ * the result is incorrect and the function will assert
+ */
+STORAGE_CLASS_INLINE unsigned int
+udiv_medium(uint32_t a, uint32_t b, unsigned outbits)
+{
+	int bit;
+	unsigned res = 0;
+	unsigned mask;
+
+#ifdef VOLCANO
+#pragma ipu unroll
+#endif
+	for (bit = outbits-1 ; bit >= 0; bit--) {
+		mask = 1<<bit;
+		if (a >= (b<<bit)) {
+			res |= mask; /* set the bit */
+			a = a - (b<<bit);
+		}
+#ifdef __HIVECC
+#pragma hivecc unroll
+#endif
+	}
+	/* check if the remainder is smaller than the divisor.
+	 * if not we didn't produce enough output bits
+	 */
+	assert(a < b);
+	return res;
+}
+
+#if !defined(__VIED_CELL)
+/*
+ * For SP and ISP, SDK provides the definition of OP_std_modadd.
+ * We need it only for host
+ */
+STORAGE_CLASS_INLINE unsigned int OP_std_modadd(int a, int b, int c)
+{
+	return (a+b < 0 ? a+b+c : a+b >= c ? a+b-c : a+b);
+}
+
+/*
+ * For SP and ISP, SDK provides the definition of OP_asp_slor.
+ * We need it only for host
+ */
+STORAGE_CLASS_INLINE unsigned int OP_asp_slor(int a, int b, int c)
+{
+	return ((a << c) | b);
+}
+#else
+#include "hive/customops.h"
+#endif /* !defined(__VIED_CELL) */
+
+#endif /* !defined(PIPE_GENERATION) */
+#if !defined(__KERNEL__)
+#define clamp(a, min_val, max_val) MIN(MAX((a), (min_val)), (max_val))
+#endif /* !defined(__KERNEL__) */
+
+#endif /* __MATH_SUPPORT_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/misc_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/misc_support.h
new file mode 100644
index 000000000000..1d6c2c6e765e
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/misc_support.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __MISC_SUPPORT_H
+#define __MISC_SUPPORT_H
+
+/* suppress compiler warnings on unused variables */
+#ifndef NOT_USED
+#define NOT_USED(a) ((void)(a))
+#endif
+
+/* Calculate the  total bytes for pow(2) byte alignment */
+#define tot_bytes_for_pow2_align(pow2, cur_bytes) \
+	((cur_bytes + (pow2 - 1)) & ~(pow2 - 1))
+
+/* Display the macro value given a string */
+#define _STR(x) #x
+#define STR(x) _STR(x)
+
+/* Concatenate */
+#ifndef CAT /* also defined in <hive/attributes.h> */
+#define _CAT(a, b)	a ## b
+#define CAT(a, b)	_CAT(a, b)
+#endif
+
+#define _CAT3(a, b, c)	a ## b ## c
+#define CAT3(a, b, c)	_CAT3(a, b, c)
+
+/* NO_HOIST, NO_CSE, NO_ALIAS attributes must be ignored for host code */
+#ifndef __HIVECC
+#ifndef NO_HOIST
+#define NO_HOIST
+#endif
+#ifndef NO_CSE
+#define NO_CSE
+#endif
+#ifndef NO_ALIAS
+#define NO_ALIAS
+#endif
+#endif
+
+enum hive_method_id {
+	HIVE_METHOD_ID_CRUN,
+	HIVE_METHOD_ID_UNSCHED,
+	HIVE_METHOD_ID_SCHED,
+	HIVE_METHOD_ID_TARGET
+};
+
+/* Derive METHOD */
+#if defined(C_RUN)
+	#define HIVE_METHOD "crun"
+	#define HIVE_METHOD_ID HIVE_METHOD_ID_CRUN
+#elif defined(HRT_UNSCHED)
+	#define HIVE_METHOD "unsched"
+	#define HIVE_METHOD_ID HIVE_METHOD_ID_UNSCHED
+#elif defined(HRT_SCHED)
+	#define HIVE_METHOD "sched"
+	#define HIVE_METHOD_ID HIVE_METHOD_ID_SCHED
+#else
+	#define HIVE_METHOD "target"
+	#define HIVE_METHOD_ID HIVE_METHOD_ID_TARGET
+	#define HRT_TARGET 1
+#endif
+
+#endif /* __MISC_SUPPORT_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/pg_control_init_framework.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/pg_control_init_framework.h
new file mode 100644
index 000000000000..4f3b03093984
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/pg_control_init_framework.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __PG_CONTROL_INIT_FRAMEWORK_H
+#define __PG_CONTROL_INIT_FRAMEWORK_H
+
+#include <type_support.h>
+#include <ia_css_psys_process_types.h>
+#include <ia_css_terminal_types.h>
+#include <ia_css_kernel_user_param_types.h>
+
+#pragma GCC visibility push(default)
+
+enum pg_control_init_ret_type {
+	PG_CONTROL_INIT_SUCCESS  = 0,
+	PG_CONTROL_INIT_FAILURE = (1 << 0)
+};
+
+/*
+ * @brief  Fill the program control init desc.
+ *
+ * @param[in]  process_group Process group.
+ * @param[out] terminal      Program control init terminal.
+ *
+ * @retval  0  Successful.
+ * @retval  1  Error.
+ */
+
+int pg_control_init_terminal_init(
+		ia_css_process_group_t *process_group,
+		ia_css_program_control_init_terminal_t *terminal);
+
+/**
+ * @brief  Fill the program control init payload.
+ *
+ * @param[in]  process_group    Process group.
+ * @param[in]  params           Kernel user parameters object.
+ * @param[in]  payload_address  Host address in payload.
+ *
+ * @retval 0   Successful.
+ * @retval 1  Error.
+ */
+
+int pg_control_init_fill_payload(
+	const ia_css_process_group_t *process_group,
+	const ia_css_kernel_user_param_t *params,
+	void *payload_address);
+
+/**
+ * @brief  Get the payload size
+ *
+ * @param[in]   process_group Process group
+ * @param[out]  payload_size  Payload size to be allocated for the process.
+ *
+ * @retval 0   Successful.
+ * @retval 1  Error.
+ */
+
+int pg_control_init_get_payload_size(
+	const ia_css_process_group_t *process_group,
+	unsigned int *payload_size);
+
+#pragma GCC visibility pop
+
+#endif /*__PG_CONTROL_INIT_FRAMEWORK_H*/
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/platform_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/platform_support.h
new file mode 100644
index 000000000000..e8146f385362
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/platform_support.h
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __PLATFORM_SUPPORT_H
+#define __PLATFORM_SUPPORT_H
+
+#include "storage_class.h"
+
+#define MSEC_IN_SEC 1000
+#define NSEC_IN_MSEC 1000000
+
+#define NUM_SLEEP_MSEC_WA_XTENSA 1
+
+#if defined(_MSC_VER)
+#include <string.h>
+
+#define IA_CSS_EXTERN
+#define SYNC_WITH(x)
+#define CSS_ALIGN(d, a) _declspec(align(a)) d
+
+STORAGE_CLASS_INLINE void ia_css_sleep(void)
+{
+	/* Placeholder for driver team*/
+}
+
+STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
+{
+	/* Placeholder for driver team*/
+	(void)delay_time_ms;
+}
+
+#elif defined(__HIVECC)
+#include <string.h>
+#include <hive/support.h>
+#include <hive/attributes.h>
+
+#define IA_CSS_EXTERN extern
+#define CSS_ALIGN(d, a) d __attribute__((aligned(a)))
+STORAGE_CLASS_INLINE void ia_css_sleep(void)
+{
+	OP___schedule();
+}
+
+#elif defined(__KERNEL__)
+#include <linux/string.h>
+#include <linux/delay.h>
+
+#define IA_CSS_EXTERN
+#define CSS_ALIGN(d, a) d __aligned(a)
+
+STORAGE_CLASS_INLINE void ia_css_sleep(void)
+{
+	usleep_range(1, 50);
+}
+#elif defined(__XTENSA_FW__)
+
+#include <hive/support.h>
+
+#define ALIAS_ATTR(target) __attribute__((alias(#target)))
+#define WEAK_ALIAS_ATTR(target) __attribute__((weak, alias(#target)))
+
+#elif defined(__GNUC__)
+#include <string.h>
+
+#define IA_CSS_EXTERN
+#define CSS_ALIGN(d, a) d __attribute__((aligned(a)))
+
+/* Define some __HIVECC specific macros to nothing to allow host code compilation */
+#ifndef NO_ALIAS
+#define NO_ALIAS
+#endif
+
+#ifndef SYNC_WITH
+#define SYNC_WITH(x)
+#endif
+
+#if defined(HRT_CSIM)
+#include "hrt/host.h" /* Using hrt_sleep from hrt/host.h */
+STORAGE_CLASS_INLINE void ia_css_sleep(void)
+{
+	/* For the SDK still using hrt_sleep */
+	hrt_sleep();
+}
+STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
+{
+	/* For the SDK still using hrt_sleep */
+	unsigned int long i = 0;
+
+	for (i = 0; i < delay_time_ms; i++) {
+		hrt_sleep();
+	}
+}
+#elif defined(__XTENSA_FW__) /* XTENSA FW */
+STORAGE_CLASS_INLINE void ia_css_sleep(void)
+{
+	/* do nothing */
+}
+#elif defined(IPUSIM_SLEEP)
+#include "hrt/host.h"
+#include "misc_support.h" /* for NOT_USED macro */
+STORAGE_CLASS_INLINE void ia_css_sleep(void)
+{
+	hrt_sleep();
+}
+STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
+{
+	/* if hrt_sleep_ns(delay_time_ms) is used here, it slows tests dramatically.
+	 * hrt_sleep_ns(delay_time_ms * 1000000) causes an effective hang.
+	 * This is because ia_css_sleep_msec is used thousands of times (BUG).
+	 * hrt_sleep_ns(1) is fine (NUM_SLEEP_MSEC_WA_XTENSA = 1).
+	 */
+	NOT_USED(delay_time_ms);
+	hrt_sleep_ns(NUM_SLEEP_MSEC_WA_XTENSA);
+}
+#else
+#include <time.h>
+STORAGE_CLASS_INLINE void ia_css_sleep(void)
+{
+	struct timespec delay_time;
+
+	delay_time.tv_sec = 0;
+	delay_time.tv_nsec = 10;
+	nanosleep(&delay_time, NULL);
+}
+STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
+{
+	struct timespec delay_time;
+
+	if (delay_time_ms >= MSEC_IN_SEC) {
+		delay_time.tv_sec = delay_time_ms / MSEC_IN_SEC;
+		delay_time.tv_nsec = (delay_time_ms % MSEC_IN_SEC) * NSEC_IN_MSEC;
+	} else {
+		delay_time.tv_sec = 0;
+		delay_time.tv_nsec = delay_time_ms * NSEC_IN_MSEC;
+	}
+	nanosleep(&delay_time, NULL);
+}
+#endif
+
+#else
+
+#if defined(__XTENSA_FW__)
+
+#define CSS_ALIGN(d, a) d
+
+#define ia_css_sleep()
+
+#if defined(__XTENSA_EL__)
+#define __IEEE_LITTLE_ENDIAN
+#else
+#define __IEEE_BIG_ENDIAN
+#endif
+
+#endif
+#include <string.h>
+#endif
+
+/*needed for the include in stdint.h for various environments */
+#include "type_support.h"
+#include "storage_class.h"
+
+#define MAX_ALIGNMENT			8
+#define aligned_uint8(type, obj)	CSS_ALIGN(uint8_t obj, 1)
+#define aligned_int8(type, obj)		CSS_ALIGN(int8_t obj, 1)
+#define aligned_uint16(type, obj)	CSS_ALIGN(uint16_t obj, 2)
+#define aligned_int16(type, obj)	CSS_ALIGN(int16_t obj, 2)
+#define aligned_uint32(type, obj)	CSS_ALIGN(uint32_t obj, 4)
+#define aligned_int32(type, obj)	CSS_ALIGN(int32_t obj, 4)
+
+/* needed as long as hivecc does not define the type (u)int64_t */
+#if defined(__HIVECC)
+#define aligned_uint64(type, obj)	CSS_ALIGN(unsigned long long obj, 8)
+#define aligned_int64(type, obj)	CSS_ALIGN(signed long long obj, 8)
+#else
+#define aligned_uint64(type, obj)	CSS_ALIGN(uint64_t obj, 8)
+#define aligned_int64(type, obj)	CSS_ALIGN(int64_t obj, 8)
+#endif
+#define aligned_enum(enum_type, obj)	CSS_ALIGN(uint32_t obj, 4)
+#define aligned_struct(struct_type, obj)	struct_type obj
+
+#endif /* __PLATFORM_SUPPORT_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/print_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/print_support.h
new file mode 100644
index 000000000000..b36b67e5030a
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/print_support.h
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __PRINT_SUPPORT_H
+#define __PRINT_SUPPORT_H
+
+#if defined(_MSC_VER)
+#ifdef _KERNEL_MODE
+
+/* TODO: Windows driver team to provide tracing mechanism for kernel mode
+ * e.g. DbgPrint and DbgPrintEx
+ */
+extern void FwTracePrintPWARN(const char *fmt, ...);
+extern void FwTracePrintPRINT(const char *fmt, ...);
+extern void FwTracePrintPERROR(const char *fmt, ...);
+extern void FwTracePrintPDEBUG(const char *fmt, ...);
+extern void FwTracePrintPFATAL(const char *fmt, ...);
+
+#define PWARN(format, ...)	FwTracePrintPWARN(format, __VA_ARGS__)
+#define PWARNING(format, ...)	FwTracePrintPWARN(format, __VA_ARGS__)
+#define PRINT(format, ...)	FwTracePrintPRINT(format, __VA_ARGS__)
+#define PINFO(format, ...)	FwTracePrintPRINT(format, __VA_ARGS__)
+#define PERROR(format, ...)	FwTracePrintPERROR(format, __VA_ARGS__)
+#define PDEBUG(format, ...)	FwTracePrintPDEBUG(format, __VA_ARGS__)
+#define PVERBOSE(format, ...)	FwTracePrintPRINT(format, __VA_ARGS__)
+#define PFATAL(format, ...)	FwTracePrintPFATAL(format, __VA_ARGS__)
+
+#else
+/* Windows usermode compilation */
+#include <stdio.h>
+
+/* To change the defines below, communicate with Windows team first
+ * to ensure they will not get flooded with prints
+ */
+/* This is temporary workaround to avoid flooding userspace
+ * Windows driver with prints
+ */
+
+#define PWARN(format, ...)
+#define PWARNING(format, ...)
+#define PRINT(format, ...)
+#define PINFO(format, ...)
+#define PERROR(format, ...)	printf("error: " format, __VA_ARGS__)
+#define PDEBUG(format, ...)
+#define PVERBOSE(format, ...)
+#define PFATAL(format, ...)
+
+#endif /* _KERNEL_MODE */
+#elif defined(__HIVECC)
+#include <hive/support.h>
+/* To be revised
+
+#define PWARN(format)
+#define PRINT(format)				OP___printstring(format)
+#define PERROR(variable)			OP___dump(9999, arguments)
+#define PDEBUG(variable)			OP___dump(__LINE__, arguments)
+
+*/
+
+#define PRINTSTRING(str) OP___printstring(str)
+
+#elif defined(__KERNEL__)
+#include <linux/kernel.h>
+#include <linux/printk.h>
+
+#define PWARN(format, arguments...)	pr_debug(format, ##arguments)
+#define PRINT(format, arguments...)	pr_debug(format, ##arguments)
+#define PERROR(format, arguments...)	pr_debug(format, ##arguments)
+#define PDEBUG(format, arguments...)	pr_debug(format, ##arguments)
+
+#elif defined(__XTENSA_FW__)
+
+#include "print_support_xtensa.h"
+
+#elif defined(XTENSA_HOST)
+
+#include "print_support_xtensa.h"
+
+#else
+
+#include <stdio.h>
+
+#define PRINT_HELPER(prefix, format, ...) printf(prefix format "%s", __VA_ARGS__)
+
+/** WA_1507432540 - Limit prints to PERROR only
+ * Workaround to avoid flooding host with prints.
+ */
+#ifdef HOST_LOGLEVEL_ERROR_ONLY
+
+/* The trailing "" allows the edge case of printing single string */
+#define PWARN(...)
+#define PRINT(...)
+#define PERROR(...) PRINT_HELPER("error: ", __VA_ARGS__, "")
+#define PDEBUG(...)
+
+#else
+
+/* The trailing "" allows the edge case of printing single string */
+#define PWARN(...)  PRINT_HELPER("warning: ", __VA_ARGS__, "")
+#define PRINT(...)  PRINT_HELPER("", __VA_ARGS__, "")
+#define PERROR(...) PRINT_HELPER("error: ", __VA_ARGS__, "")
+#define PDEBUG(...) PRINT_HELPER("debug: ", __VA_ARGS__, "")
+
+#endif
+#define PRINTSTRING(str) PRINT(str)
+
+#endif
+#endif /* __PRINT_SUPPORT_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/psys_system_global_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/psys_system_global_impl.h
new file mode 100644
index 000000000000..7c1279347537
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/psys_system_global_impl.h
@@ -0,0 +1,504 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __PSYS_SYSTEM_GLOBAL_IMPL_H
+#define __PSYS_SYSTEM_GLOBAL_IMPL_H
+
+#include <vied_nci_psys_system_global.h>
+
+#include "ia_css_psys_sim_trace.h"
+#include <assert_support.h>
+
+/* Use vied_bits instead, however for test purposes we uses explicit type
+ * checking
+ */
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_bit_mask(
+	const unsigned int						index)
+{
+	vied_nci_resource_bitmap_t	bit_mask = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "vied_nci_bit_mask(): enter:\n");
+
+	if (index < VIED_NCI_RESOURCE_BITMAP_BITS)
+		bit_mask = (vied_nci_resource_bitmap_t)1 << index;
+
+	return bit_mask;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_bitmap_set(
+	const vied_nci_resource_bitmap_t		bitmap,
+	const vied_nci_resource_bitmap_t		bit_mask)
+{
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "vied_nci_bitmap_set(): enter:\n");
+
+/*
+	assert(vied_nci_is_bitmap_one_hot(bit_mask));
+*/
+	return bitmap | bit_mask;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_bitmap_clear(
+	const vied_nci_resource_bitmap_t		bitmap,
+	const vied_nci_resource_bitmap_t		bit_mask)
+{
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_bitmap_clear(): enter:\n");
+
+/*
+	assert(vied_nci_is_bitmap_one_hot(bit_mask));
+*/
+	return bitmap & (~bit_mask);
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_bitfield_mask(
+		const unsigned int position,
+		const unsigned int size)
+{
+	vied_nci_resource_bitmap_t	bit_mask = 0;
+	vied_nci_resource_bitmap_t ones = (vied_nci_resource_bitmap_t)-1;
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		       "vied_nci_bitfield_mask(): enter:\n");
+
+	if (position < VIED_NCI_RESOURCE_BITMAP_BITS)
+		bit_mask = (ones >> (sizeof(vied_nci_resource_bitmap_t) - size)) << position;
+
+	return bit_mask;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_bitmap_set_bitfield(
+	const vied_nci_resource_bitmap_t		bitmap,
+	const unsigned int						index,
+	const unsigned int						size)
+{
+	vied_nci_resource_bitmap_t	ret = 0;
+	vied_nci_resource_bitmap_t	bit_mask = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		       "vied_nci_bit_mask_set_bitfield(): enter:\n");
+
+	bit_mask = vied_nci_bitfield_mask(index, size);
+	ret = vied_nci_bitmap_set(bitmap, bit_mask);
+
+	return ret;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_bitmap_set_unique(
+	const vied_nci_resource_bitmap_t		bitmap,
+	const vied_nci_resource_bitmap_t		bit_mask)
+{
+	vied_nci_resource_bitmap_t	ret = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_bitmap_set_unique(): enter:\n");
+
+	if ((bitmap & bit_mask) == 0)
+		ret = bitmap | bit_mask;
+
+	return ret;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_bit_mask_set_unique(
+	const vied_nci_resource_bitmap_t		bitmap,
+	const unsigned int						index)
+{
+	vied_nci_resource_bitmap_t	ret = 0;
+	vied_nci_resource_bitmap_t	bit_mask;
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		       "vied_nci_bit_mask_set_unique(): enter:\n");
+
+	bit_mask = vied_nci_bit_mask(index);
+
+	if (((bitmap & bit_mask) == 0) && (bit_mask != 0))
+		ret = bitmap | bit_mask;
+
+	return ret;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+bool vied_nci_is_bitmap_empty(
+	const vied_nci_resource_bitmap_t		bitmap)
+{
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_is_bitmap_empty(): enter:\n");
+
+	return (bitmap == 0);
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+bool vied_nci_is_bitmap_set(
+	const vied_nci_resource_bitmap_t		bitmap,
+	const vied_nci_resource_bitmap_t		bit_mask)
+{
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_is_bitmap_set(): enter:\n");
+
+/*
+	assert(vied_nci_is_bitmap_one_hot(bit_mask));
+*/
+	return !vied_nci_is_bitmap_clear(bitmap, bit_mask);
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+bool vied_nci_is_bit_set_in_bitmap(
+	const vied_nci_resource_bitmap_t		bitmap,
+	const unsigned int		index)
+{
+
+	vied_nci_resource_bitmap_t bitmask;
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_is_bit_set_in_bitmap(): enter:\n");
+	bitmask = vied_nci_bit_mask(index);
+	return vied_nci_is_bitmap_set(bitmap, bitmask);
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+bool vied_nci_is_bitmap_clear(
+	const vied_nci_resource_bitmap_t		bitmap,
+	const vied_nci_resource_bitmap_t		bit_mask)
+{
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_is_bitmap_clear(): enter:\n");
+
+/*
+	assert(vied_nci_is_bitmap_one_hot(bit_mask));
+*/
+	return ((bitmap & bit_mask) == 0);
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+int vied_nci_bitmap_compute_weight(
+	const vied_nci_resource_bitmap_t		bitmap)
+{
+	vied_nci_resource_bitmap_t	loc_bitmap = bitmap;
+	int	weight = 0;
+	int	i;
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_bitmap_compute_weight(): enter:\n");
+
+	/* Do not need the iterator "i" */
+	for (i = 0; (i < VIED_NCI_RESOURCE_BITMAP_BITS) &&
+		    (loc_bitmap != 0); i++) {
+		weight += loc_bitmap & 0x01;
+		loc_bitmap >>= 1;
+	}
+
+	return weight;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_bitmap_union(
+	const vied_nci_resource_bitmap_t	bitmap0,
+	const vied_nci_resource_bitmap_t	bitmap1)
+{
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_bitmap_union(): enter:\n");
+	return (bitmap0 | bitmap1);
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_bitmap_intersection(
+	const vied_nci_resource_bitmap_t		bitmap0,
+	const vied_nci_resource_bitmap_t		bitmap1)
+{
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"ia_css_kernel_bitmap_intersection(): enter:\n");
+	return (bitmap0 & bitmap1);
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_bitmap_xor(
+	const vied_nci_resource_bitmap_t		bitmap0,
+	const vied_nci_resource_bitmap_t		bitmap1)
+{
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "vied_nci_bitmap_xor(): enter:\n");
+	return (bitmap0 ^ bitmap1);
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_cell_bit_mask(
+	const vied_nci_cell_ID_t		cell_id)
+{
+	vied_nci_resource_bitmap_t	bit_mask = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_cell_bit_mask(): enter:\n");
+
+	if (cell_id < VIED_NCI_N_CELL_ID) {
+		bit_mask = (vied_nci_resource_bitmap_t)1 << cell_id;
+	}
+	return bit_mask;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_resource_bitmap_t vied_nci_barrier_bit_mask(
+	const vied_nci_barrier_ID_t		barrier_id)
+{
+	vied_nci_resource_bitmap_t	bit_mask = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_barrier_bit_mask(): enter:\n");
+
+	if (((barrier_id + VIED_NCI_N_CELL_ID) < VIED_NCI_RESOURCE_BITMAP_BITS)) {
+		bit_mask = (vied_nci_resource_bitmap_t)1 <<
+				(barrier_id + VIED_NCI_N_CELL_ID);
+	}
+	return bit_mask;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_cell_type_ID_t vied_nci_cell_get_type(
+	const vied_nci_cell_ID_t		cell_id)
+{
+	vied_nci_cell_type_ID_t	cell_type = VIED_NCI_N_CELL_TYPE_ID;
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_cell_get_type(): enter:\n");
+
+	if (cell_id < VIED_NCI_N_CELL_ID) {
+		cell_type = (vied_nci_cell_type_ID_t)vied_nci_cell_type[cell_id];
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
+			"vied_nci_cell_get_type(): invalid argument\n");
+	}
+
+	return cell_type;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_mem_ID_t vied_nci_ext_mem_get_id_from_type(
+	const vied_nci_mem_type_ID_t		mem_type)
+{
+	vied_nci_mem_ID_t	mem_id = VIED_NCI_N_MEM_ID;
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_ext_mem_get_id_from_type(): enter:\n");
+
+	if (mem_type < (unsigned)VIED_NCI_N_MEM_ID && vied_nci_mem_is_ext_type(mem_type)) {
+		mem_id = (vied_nci_mem_ID_t)vied_nci_ext_mem[mem_type];
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
+			"vied_nci_ext_mem_get_id_from_type(): invalid argument\n");
+	}
+
+	return mem_id;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_mem_type_ID_t vied_nci_mem_get_type(
+	const vied_nci_mem_ID_t			mem_id)
+{
+	vied_nci_mem_type_ID_t	mem_type = VIED_NCI_N_MEM_TYPE_ID;
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_mem_get_type(): enter:\n");
+
+	if (mem_id < VIED_NCI_N_MEM_ID) {
+		mem_type = (vied_nci_mem_type_ID_t)vied_nci_mem_type[mem_id];
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
+			"vied_nci_mem_get_type(): invalid argument\n");
+	}
+
+	return mem_type;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+uint16_t vied_nci_mem_get_size(
+	const vied_nci_mem_ID_t			mem_id)
+{
+	uint16_t	mem_size = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_mem_get_size(): enter:\n");
+
+	if (mem_id < VIED_NCI_N_MEM_ID) {
+		mem_size = vied_nci_mem_size[mem_id];
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
+			"vied_nci_mem_get_size(): invalid argument\n");
+	}
+
+	return mem_size;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+uint16_t vied_nci_dev_chn_get_size(
+	const vied_nci_dev_chn_ID_t		dev_chn_id)
+{
+	uint16_t	dev_chn_size = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_dev_chn_get_size(): enter:\n");
+#ifndef IPU_SYSVER_ipu7v1
+	if (dev_chn_id < VIED_NCI_N_DEV_CHN_ID) {
+		dev_chn_size = vied_nci_dev_chn_size[dev_chn_id];
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
+			"vied_nci_dev_chn_get_size(): invalid argument\n");
+	}
+#else
+	((void)(dev_chn_id)); /* not used in ipu7 */
+#endif
+	return dev_chn_size;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+bool vied_nci_is_cell_of_type(
+	const vied_nci_cell_ID_t		cell_id,
+	const vied_nci_cell_type_ID_t	cell_type_id)
+{
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_is_cell_of_type(): enter:\n");
+
+	return ((vied_nci_cell_get_type(cell_id) ==
+		 cell_type_id) && (cell_type_id !=
+		 VIED_NCI_N_CELL_TYPE_ID));
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+bool vied_nci_is_mem_of_type(
+	const vied_nci_mem_ID_t			mem_id,
+	const vied_nci_mem_type_ID_t	mem_type_id)
+{
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_is_mem_of_type(): enter:\n");
+
+	return ((vied_nci_mem_get_type(mem_id) == mem_type_id) &&
+		(mem_type_id != VIED_NCI_N_MEM_TYPE_ID));
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+bool vied_nci_is_cell_mem_of_type(
+	const vied_nci_cell_ID_t		cell_id,
+	const uint16_t					mem_index,
+	const vied_nci_mem_type_ID_t	mem_type_id)
+{
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_is_cell_mem_of_type(): enter:\n");
+
+	return ((vied_nci_cell_get_mem_type(cell_id, mem_index) == mem_type_id)
+		&& (mem_type_id != VIED_NCI_N_MEM_TYPE_ID));
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+bool vied_nci_has_cell_mem_of_id(
+	const vied_nci_cell_ID_t		cell_id,
+	const vied_nci_mem_ID_t			mem_id)
+{
+	uint16_t		mem_index;
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_has_cell_mem_of_id(): enter:\n");
+
+	for (mem_index = 0; mem_index < VIED_NCI_N_MEM_TYPE_ID; mem_index++) {
+		if ((vied_nci_cell_get_mem(cell_id, mem_index) == mem_id) &&
+		    (mem_id != VIED_NCI_N_MEM_ID)) {
+			break;
+		}
+	}
+
+	return (mem_index < VIED_NCI_N_MEM_TYPE_ID);
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+uint16_t vied_nci_cell_get_mem_count(
+	const vied_nci_cell_ID_t		cell_id)
+{
+	uint16_t	mem_count = 0;
+	vied_nci_cell_type_ID_t	cell_type;
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_cell_get_mem_count(): enter:\n");
+
+	cell_type = vied_nci_cell_get_type(cell_id);
+
+	if (cell_type < VIED_NCI_N_CELL_TYPE_ID)
+		mem_count = vied_nci_N_cell_mem[cell_type];
+
+	return mem_count;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_mem_type_ID_t vied_nci_cell_get_mem_type(
+	const vied_nci_cell_ID_t		cell_id,
+	const uint16_t					mem_index)
+{
+	vied_nci_mem_type_ID_t	mem_type = VIED_NCI_N_MEM_TYPE_ID;
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_cell_get_mem_type(): enter:\n");
+
+	if ((cell_id < VIED_NCI_N_CELL_ID) &&
+	    (mem_index < VIED_NCI_N_MEM_TYPE_ID)) {
+		mem_type = (vied_nci_mem_type_ID_t)(vied_nci_cell_mem_type[
+				vied_nci_cell_get_type(cell_id)][mem_index]);
+	}
+
+	return mem_type;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_mem_ID_t vied_nci_cell_get_mem(
+	const vied_nci_cell_ID_t		cell_id,
+	const uint16_t					mem_index)
+{
+	vied_nci_mem_ID_t	mem_id = VIED_NCI_N_MEM_ID;
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		"vied_nci_cell_get_mem(): enter:\n");
+
+	if ((cell_id < VIED_NCI_N_CELL_ID) &&
+	    (mem_index < VIED_NCI_N_MEM_TYPE_ID)) {
+		mem_id = (vied_nci_mem_ID_t)(vied_nci_cell_mem[cell_id][mem_index]);
+	}
+
+	return mem_id;
+}
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
+vied_nci_mem_type_ID_t vied_nci_cell_type_get_mem_type(
+	const vied_nci_cell_type_ID_t	cell_type_id,
+	const uint16_t					mem_index)
+{
+	vied_nci_mem_type_ID_t	mem_type = VIED_NCI_N_MEM_TYPE_ID;
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
+		       "vied_nci_cell_type_get_mem_type(): enter:\n");
+
+	if ((cell_type_id < VIED_NCI_N_CELL_TYPE_ID)
+			&& (mem_index < VIED_NCI_N_MEM_TYPE_ID)) {
+		mem_type = (vied_nci_mem_type_ID_t)(vied_nci_cell_mem_type[cell_type_id][mem_index]);
+	}
+
+	return mem_type;
+}
+
+#endif /* __PSYS_SYSTEM_GLOBAL_IMPL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/storage_class.h
new file mode 100644
index 000000000000..aeb9ffb3b367
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/storage_class.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __STORAGE_CLASS_H
+#define __STORAGE_CLASS_H
+
+#define STORAGE_CLASS_EXTERN \
+extern
+
+#if defined(_MSC_VER)
+#define STORAGE_CLASS_INLINE \
+static __inline
+#elif defined(__HIVECC)
+#define STORAGE_CLASS_INLINE \
+static inline
+#elif defined(__XTENSA_FW__)
+#include "storage_class_xtensa.h"
+#else
+#define STORAGE_CLASS_INLINE \
+static inline
+#endif
+
+/* Register struct */
+#ifndef __register
+#if defined(__HIVECC) && !defined(PIPE_GENERATION)
+#define __register register
+#else
+#define __register
+#endif
+#endif
+
+/* Memory attribute */
+#ifndef MEM
+#ifdef PIPE_GENERATION
+#elif defined(__HIVECC)
+#include <hive/attributes.h>
+#else
+#define MEM(any_mem)
+#endif
+#endif
+
+#endif /* __STORAGE_CLASS_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/type_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/type_support.h
new file mode 100644
index 000000000000..4078711380ec
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/type_support.h
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __TYPE_SUPPORT_H
+#define __TYPE_SUPPORT_H
+
+/* Per the DLI spec, types are in "type_support.h" and
+ * "platform_support.h" is for unclassified/to be refactored
+ * platform specific definitions.
+ */
+#define IA_CSS_UINT8_T_BITS	8
+#define IA_CSS_UINT16_T_BITS	16
+#define IA_CSS_UINT32_T_BITS	32
+#define IA_CSS_INT32_T_BITS	32
+#define IA_CSS_UINT64_T_BITS	64
+
+#if defined(_MSC_VER)
+#include <stdint.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <limits.h>
+#if defined(_M_X64)
+#define HOST_ADDRESS(x) (unsigned long long)(x)
+#else
+#define HOST_ADDRESS(x) (unsigned long)(x)
+#endif
+
+#elif defined(PARAM_GENERATION)
+/* Nothing */
+#elif defined(__HIVECC)
+#include <stdint.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <limits.h>
+#define HOST_ADDRESS(x) (unsigned long)(x)
+
+typedef long long int64_t;
+typedef unsigned long long uint64_t;
+
+#elif defined(__XTENSA_FW__)
+#include "type_support_xtensa.h"
+#elif defined(__KERNEL__)
+#include <linux/types.h>
+#include <linux/limits.h>
+
+#define CHAR_BIT (8)
+#define HOST_ADDRESS(x) (unsigned long)(x)
+
+#elif defined(__GNUC__)
+#include <stdint.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <limits.h>
+#define HOST_ADDRESS(x) (unsigned long)(x)
+
+#else /* default is for the FIST environment */
+#include <stdint.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <limits.h>
+#define HOST_ADDRESS(x) (unsigned long)(x)
+
+#endif
+#if !defined(PIPE_GENERATION) && !defined(IO_GENERATION)
+/* genpipe cannot handle the void* syntax */
+typedef void *HANDLE;
+#endif
+
+#endif /* __TYPE_SUPPORT_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_acb_route_type.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_acb_route_type.h
new file mode 100644
index 000000000000..da5866cca46b
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_acb_route_type.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef VIED_NCI_ACB_ROUTE_TYPE_H_
+#define VIED_NCI_ACB_ROUTE_TYPE_H_
+
+#include "type_support.h"
+
+typedef enum {
+	NCI_ACB_PORT_ISP = 0,
+	NCI_ACB_PORT_ACC = 1,
+	NCI_ACB_PORT_INVALID = 0xFF
+} nci_acb_port_t;
+
+typedef struct {
+	/* 0 = ISP, 1 = Acc */
+	nci_acb_port_t in_select;
+	/* 0 = ISP, 1 = Acc */
+	nci_acb_port_t out_select;
+	/* When set, Ack will be sent only when Eof arrives */
+	uint32_t ignore_line_num;
+	/* Fork adapter to enable streaming to both output
+	 * (next acb out and isp out)
+	 */
+	uint32_t fork_acb_output;
+} nci_acb_route_t;
+
+#endif /* VIED_NCI_ACB_ROUTE_TYPE_H_ */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_resource_model.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_resource_model.h
new file mode 100644
index 000000000000..0aaa15614421
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_resource_model.h
@@ -0,0 +1,342 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __VIED_NCI_PSYS_RESOURCE_MODEL_H
+#define __VIED_NCI_PSYS_RESOURCE_MODEL_H
+
+#include "type_support.h"
+#include "storage_class.h"
+
+#define HAS_DFM					1
+#define HAS_DMA_INTERNAL		0
+#define NON_RELOC_RESOURCE_SUPPORT	1
+#define IA_CSS_KERNEL_BITMAP_BITS 	128
+
+/* Defines for the routing bitmap in the program group manifest.
+ */
+#define VIED_NCI_RBM_MAX_MUX_COUNT			60
+#define VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT		27
+#define VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT		4
+#define N_PADDING_UINT8_IN_RBM_MANIFEST			2
+
+/* The amount of padding bytes needed to make
+ * ia_css_process_s/ia_css_process_ext_s/
+ * ia_css_program_manifest_s/ia_css_program_manifest_ext_s
+ * structures 32 bit aligned (source files have check on this)
+ */
+#define	N_PADDING_UINT8_IN_PROCESS_STRUCT		0
+#define N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT	1
+#define	N_PADDING_UINT8_IN_PROGRAM_MANIFEST		0
+#define	N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT	2
+
+/*
+ * Cell IDs
+ */
+typedef enum {
+	VIED_NCI_SP0_ID = 0,
+	VIED_NCI_ISA_ICA_ID,
+	VIED_NCI_ISA_LSC_ID,
+	VIED_NCI_ISA_DPC_ID,
+	VIED_NCI_ISA_B2B_ID,
+#if defined(IPU_SYSVER_ipu6v2)
+	VIED_NCI_ISA_B2R_R2I_SIE_ID,
+#elif defined(IPU_SYSVER_ipu6v3) || defined(IPU_SYSVER_ipu6v4)
+	VIED_NCI_ISA_BNLM_ID,
+	VIED_NCI_ISA_DM_ID,
+	VIED_NCI_ISA_R2I_SIE_ID,
+#else
+	#error assert 0
+#endif
+	VIED_NCI_ISA_R2I_DS_A_ID,
+	VIED_NCI_ISA_R2I_DS_B_ID,
+	VIED_NCI_ISA_AWB_ID,
+	VIED_NCI_ISA_AE_ID,
+	VIED_NCI_ISA_AF_ID,
+	VIED_NCI_ISA_PAF_ID,
+} vied_nci_cell_ID_t;
+
+#define VIED_NCI_N_CELL_ID (VIED_NCI_ISA_PAF_ID + 1)
+
+/*
+ * In several places we don't need to size the look up tables for the full amount of cells
+ * because they are only used for the VP and SP cells and not for the accelerator cells.
+ * It is important that these cells are in the beginning of the LUT
+ */
+#define VIED_NCI_N_PROG_CELLS (VIED_NCI_SP0_ID + 1)
+
+/*
+ * Barrier bits (to model process group dependencies)
+ * todo verify that this is valid for ipu6
+ */
+typedef enum {
+	VIED_NCI_BARRIER0_ID,
+	VIED_NCI_BARRIER1_ID,
+	VIED_NCI_BARRIER2_ID,
+	VIED_NCI_BARRIER3_ID,
+	VIED_NCI_BARRIER4_ID,
+	VIED_NCI_BARRIER5_ID,
+	VIED_NCI_BARRIER6_ID,
+	VIED_NCI_BARRIER7_ID
+} vied_nci_barrier_ID_t;
+
+#define VIED_NCI_N_BARRIER_ID (VIED_NCI_BARRIER7_ID + 1)
+/*
+ * Cell types
+ */
+typedef enum {
+	VIED_NCI_SP_CTRL_TYPE_ID = 0,
+	VIED_NCI_SP_SERVER_TYPE_ID,
+	VIED_NCI_ACC_ISA_TYPE_ID,
+	VIED_NCI_N_CELL_TYPE_ID
+} vied_nci_cell_type_ID_t;
+
+/* Not used cell types */
+#define VIED_NCI_ACC_PSA_TYPE_ID (VIED_NCI_N_CELL_TYPE_ID)
+#define VIED_NCI_ACC_OSA_TYPE_ID (VIED_NCI_N_CELL_TYPE_ID)
+#define VIED_NCI_GDC_TYPE_ID (VIED_NCI_N_CELL_TYPE_ID)
+
+/*
+ * Memory IDs
+ */
+typedef enum {
+	VIED_NCI_TRANSFER_VMEM0_ID = 0, /* TRANSFER VMEM 0 */
+	VIED_NCI_LB_VMEM_ID, /* LB VMEM */
+	VIED_NCI_DMEM0_ID, /* SPC0 Dmem */
+	VIED_NCI_DMEM1_ID /* SPP0 Dmem */
+} vied_nci_mem_ID_t;
+
+#define VIED_NCI_N_MEM_ID (VIED_NCI_DMEM1_ID + 1)
+/*
+ * Memory types
+ */
+typedef enum {
+	VIED_NCI_TRANSFER_VMEM0_TYPE_ID = 0,
+	VIED_NCI_LB_VMEM_TYPE_ID,
+	VIED_NCI_DMEM_TYPE_ID,
+	VIED_NCI_VMEM_TYPE_ID,
+	VIED_NCI_BAMEM_TYPE_ID,
+	VIED_NCI_PMEM_TYPE_ID
+} vied_nci_mem_type_ID_t;
+
+#define VIED_NCI_N_MEM_TYPE_ID (VIED_NCI_PMEM_TYPE_ID + 1)
+/******************************************************/
+
+/* Excluding PMEM */
+#define VIED_NCI_N_DATA_MEM_TYPE_ID	 5 /* = MAX(vied_nci_mem_type_ID_t) */
+
+#define VIED_NCI_N_SP_CTRL_MEM		2
+#define VIED_NCI_N_SP_SERVER_MEM	2
+#define VIED_NCI_N_VP_MEM			0
+#define VIED_NCI_N_ACC_PSA_MEM		0
+#define VIED_NCI_N_ACC_ISA_MEM		0
+#define VIED_NCI_N_ACC_OSA_MEM		0
+#define VIED_NCI_N_GDC_MEM			0
+#define VIED_NCI_N_TNR_MEM			0
+
+#define VIED_NCI_N_VP_CELL		0
+#define VIED_NCI_N_ACC_CELL		13
+/******************************************************/
+/*
+ * Device IDs
+ */
+typedef enum {
+	VIED_NCI_DEV_CHN_DMA_EXT0_ID = 0, /*DMA lb*/
+	VIED_NCI_DEV_CHN_DMA_EXT1_READ_ID, /*DMA hbfx*/
+	VIED_NCI_DEV_CHN_DMA_EXT1_WRITE_ID, /*DMA hbtx*/
+	VIED_NCI_DEV_CHN_DMA_ISA_ID,
+} vied_nci_dev_chn_ID_t;
+
+#define VIED_NCI_N_DEV_CHN_ID (VIED_NCI_DEV_CHN_DMA_ISA_ID + 1)
+
+/*
+ * DFM devices
+ */
+typedef enum {
+	VIED_NCI_DEV_DFM_ISL_FULL_PORT_ID = 0,
+	VIED_NCI_DEV_DFM_ISL_EMPTY_PORT_ID
+} vied_nci_dev_dfm_id_t;
+
+#define VIED_NCI_N_DEV_DFM_ID (VIED_NCI_DEV_DFM_ISL_EMPTY_PORT_ID + 1)
+
+/*
+ * Link IDs
+ */
+typedef enum {
+	VIED_NCI_LINK_OTF_OFFLINE = 0,
+	VIED_NCI_LINK_OTF_MAIN_OUTPUT,
+	VIED_NCI_LINK_OTF_PDAF_OUTPUT,
+	VIED_NCI_LINK_DATA_BARRIER_0,
+	VIED_NCI_LINK_DATA_BARRIER_1,
+	VIED_NCI_LINK_DATA_BARRIER_2,
+	VIED_NCI_LINK_DATA_BARRIER_3,
+	VIED_NCI_LINK_DATA_BARRIER_4,
+	VIED_NCI_N_LINK_ID
+} vied_nci_link_ID_t;
+
+/*
+ * Psys server local object caches space
+ */
+typedef enum {
+	VIED_NCI_PSYS_SERVER_LOCAL_OBJECT_CACHE_0 = 0,
+	VIED_NCI_PSYS_SERVER_LOCAL_OBJECT_CACHE_1,
+	VIED_NCI_N_PSYS_SERVER_LOCAL_OBJECT_CACHES
+} vied_nci_psys_server_local_object_cache_t;
+
+/******************************************************/
+/*todo verify  for ipu6*/
+/*
+ * Memory size (previously in vied_nci_psys_system.c)
+ * VMEM: in words, 64 Byte per word.
+ * TRANSFER VMEM0: in words, 64 Byte per word
+ * LB VMEM: in words, 64 Byte per word.
+ * DMEM: in words, 4 Byte per word.
+ */
+#define VIED_NCI_TRANSFER_VMEM0_WORD_SIZE     64
+#define VIED_NCI_LB_VMEM_WORD_SIZE     64
+#define VIED_NCI_DMEM_WORD_SIZE      4
+#define VIED_NCI_VMEM_WORD_SIZE     64
+
+/* ISP VMEM  words $HIVECORES/idsp/include/hive/cell_params.h*/
+#define VIED_NCI_TRANSFER_VMEM0_MAX_SIZE	(0x0800) /* Transfer VMEM0 words, ref HAS Transfer*/
+#define VIED_NCI_TRANSFER_VMEM1_MAX_SIZE	(0x0800) /* Transfer VMEM1 words, ref HAS Transfer*/
+#define VIED_NCI_LB_VMEM_MAX_SIZE		(0x0400) /* LB VMEM words */
+#define VIED_NCI_DMEM0_MAX_SIZE			(0x4000)
+#define VIED_NCI_DMEM1_MAX_SIZE			(0x1000)
+
+/*
+ * Number of channels per device
+ */
+/*
+ * NOTE: once FW code will support DMA with one unit
+ * descriptor #channels will be cut but half (36->18).
+*/
+
+/* 3 defines below are inferred from pg/ipu6s_isa/src/ipu6s_isa.manifest.cpp */
+/* plus some orbitrary number - a safety margin */
+
+#define VIED_NCI_DEV_CHN_DMA_EXT0_MAX_SIZE			(22)
+#define VIED_NCI_DEV_CHN_DMA_EXT1_READ_MAX_SIZE		(22)
+#define VIED_NCI_DEV_CHN_DMA_EXT1_WRITE_MAX_SIZE	(22)
+
+#define VIED_NCI_DEV_CHN_DMA_IPFD_MAX_SIZE		(0)
+#define VIED_NCI_DEV_CHN_DMA_ISA_MAX_SIZE		(2)
+
+/*
+ * Number of ports per DFM device
+ */
+#define VIED_NCI_DEV_DFM_ISL_FULL_PORT_ID_MAX_SIZE		(32)
+#define VIED_NCI_DEV_DFM_LB_FULL_PORT_ID_MAX_SIZE		(32)
+#define VIED_NCI_DEV_DFM_ISL_EMPTY_PORT_ID_MAX_SIZE		(32)
+#define VIED_NCI_DEV_DFM_LB_EMPTY_PORT_ID_MAX_SIZE		(32)
+/******************************************************/
+
+/*
+ * Storage of the resource and resource type enumerators
+ */
+#define VIED_NCI_RESOURCE_ID_BITS	8
+typedef uint8_t				vied_nci_resource_id_t;
+
+#define VIED_NCI_RESOURCE_SIZE_BITS	16
+typedef uint16_t			vied_nci_resource_size_t;
+
+#define VIED_NCI_RESOURCE_BITMAP_BITS	32
+typedef uint32_t			vied_nci_resource_bitmap_t;
+
+#define IA_CSS_PROCESS_INVALID_DEPENDENCY	((vied_nci_resource_id_t)(-1))
+#define IA_CSS_PROCESS_INVALID_OFFSET		((vied_nci_resource_size_t)(-1))
+#define IA_CSS_PROCESS_MAX_CELLS		1
+
+#define IA_CSS_MAX_INPUT_DEC_RESOURCES		4
+#define IA_CSS_MAX_OUTPUT_DEC_RESOURCES		4
+/*
+ * Resource specifications
+ * Note that the FAS uses the terminology local/remote memory. In the PSYS API,
+ * these are called internal/external memory.
+ */
+
+/* resource spec for internal (local) memory */
+struct vied_nci_resource_spec_int_mem_s {
+	vied_nci_resource_id_t		type_id;
+	vied_nci_resource_size_t	size;
+	vied_nci_resource_size_t	offset;
+};
+
+typedef struct vied_nci_resource_spec_int_mem_s
+	vied_nci_resource_spec_int_mem_t;
+
+/* resource spec for external (remote) memory */
+struct vied_nci_resource_spec_ext_mem_s {
+	vied_nci_resource_id_t		type_id;
+	vied_nci_resource_size_t	size;
+	vied_nci_resource_size_t	offset;
+};
+
+typedef struct vied_nci_resource_spec_ext_mem_s
+	vied_nci_resource_spec_ext_mem_t;
+
+/* resource spec for device channel */
+struct vied_nci_resource_spec_dev_chn_s {
+	vied_nci_resource_id_t		type_id;
+	vied_nci_resource_size_t	size;
+	vied_nci_resource_size_t	offset;
+};
+
+typedef struct vied_nci_resource_spec_dev_chn_s
+	vied_nci_resource_spec_dev_chn_t;
+
+/* resource spec for DFM port */
+struct vied_nci_resource_spec_dfm_port_s {
+	vied_nci_resource_id_t		type_id;
+	vied_nci_resource_bitmap_t	bitmask;
+};
+
+typedef struct vied_nci_resource_spec_dfm_port_s
+	vied_nci_resource_spec_dfm_port_t;
+
+/* resource spec for all contiguous resources */
+struct vied_nci_resource_spec_s {
+	vied_nci_resource_spec_int_mem_t int_mem[VIED_NCI_N_MEM_TYPE_ID];
+	vied_nci_resource_spec_ext_mem_t ext_mem[VIED_NCI_N_DATA_MEM_TYPE_ID];
+	vied_nci_resource_spec_dev_chn_t dev_chn[VIED_NCI_N_DEV_CHN_ID];
+};
+
+typedef struct vied_nci_resource_spec_s vied_nci_resource_spec_t;
+
+#ifndef PIPE_GENERATION
+
+extern const uint8_t /* vied_nci_cell_type_ID_t */ vied_nci_cell_type[VIED_NCI_N_CELL_ID];
+extern const uint8_t /* vied_nci_mem_type_ID_t */ vied_nci_mem_type[VIED_NCI_N_MEM_ID];
+extern const uint16_t vied_nci_N_cell_mem[VIED_NCI_N_CELL_TYPE_ID];
+extern const uint8_t /* vied_nci_mem_type_ID_t */
+	vied_nci_cell_mem_type[VIED_NCI_N_CELL_TYPE_ID][VIED_NCI_N_MEM_TYPE_ID];
+extern const uint8_t /* vied_nci_mem_ID_t */
+	vied_nci_ext_mem[VIED_NCI_N_MEM_TYPE_ID];
+extern const uint8_t /* vied_nci_mem_ID_t */
+	vied_nci_cell_mem[VIED_NCI_N_CELL_ID][VIED_NCI_N_MEM_TYPE_ID];
+extern const uint16_t vied_nci_mem_size[VIED_NCI_N_MEM_ID];
+extern const uint16_t vied_nci_mem_word_size[VIED_NCI_N_DATA_MEM_TYPE_ID];
+extern const uint16_t vied_nci_dev_chn_size[VIED_NCI_N_DEV_CHN_ID];
+extern const uint16_t vied_nci_dfm_port_size[VIED_NCI_N_DEV_DFM_ID];
+
+STORAGE_CLASS_INLINE
+uint32_t vied_nci_mem_is_ext_type(const vied_nci_mem_type_ID_t mem_type_id)
+{
+	return((mem_type_id == VIED_NCI_TRANSFER_VMEM0_TYPE_ID) ||
+		(mem_type_id == VIED_NCI_LB_VMEM_TYPE_ID));
+}
+
+#endif /* PIPE_GENERATION */
+#endif /* __VIED_NCI_PSYS_RESOURCE_MODEL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_system_global.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_system_global.h
new file mode 100644
index 000000000000..d96f3605cb07
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_system_global.h
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __VIED_NCI_PSYS_SYSTEM_GLOBAL_H
+#define __VIED_NCI_PSYS_SYSTEM_GLOBAL_H
+
+#include <type_support.h>
+#include "ia_css_base_types.h"
+#include "ia_css_psys_sim_storage_class.h"
+#include "vied_nci_psys_resource_model.h"
+
+/*
+ * Key system types
+ */
+/* Subsystem internal physical address */
+#define VIED_ADDRESS_BITS 32
+
+/* typedef uint32_t vied_address_t; */
+
+/* Subsystem internal virtual address */
+
+/* Subsystem internal data bus */
+#define VIED_DATA_BITS 32
+typedef uint32_t vied_data_t;
+
+#define VIED_NULL ((vied_vaddress_t)0)
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_bit_mask(
+	const unsigned					index);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_bitmap_set(
+	const vied_nci_resource_bitmap_t		bitmap,
+	const vied_nci_resource_bitmap_t		bit_mask);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_bitmap_clear(
+	const vied_nci_resource_bitmap_t		bitmap,
+	const vied_nci_resource_bitmap_t		bit_mask);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+bool vied_nci_is_bitmap_empty(
+	const vied_nci_resource_bitmap_t		bitmap);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+bool vied_nci_is_bitmap_set(
+	const vied_nci_resource_bitmap_t		bitmap,
+	const vied_nci_resource_bitmap_t		bit_mask);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+bool vied_nci_is_bit_set_in_bitmap(
+	const vied_nci_resource_bitmap_t		bitmap,
+	const unsigned int		index);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+bool vied_nci_is_bitmap_clear(
+	const vied_nci_resource_bitmap_t		bitmap,
+	const vied_nci_resource_bitmap_t		bit_mask);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+int vied_nci_bitmap_compute_weight(
+	const vied_nci_resource_bitmap_t		bitmap);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_bitmap_union(
+	const vied_nci_resource_bitmap_t		bitmap0,
+	const vied_nci_resource_bitmap_t		bitmap1);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_bitmap_intersection(
+	const vied_nci_resource_bitmap_t		bitmap0,
+	const vied_nci_resource_bitmap_t		bitmap1);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_bitmap_xor(
+	const vied_nci_resource_bitmap_t		bitmap0,
+	const vied_nci_resource_bitmap_t		bitmap1);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_bitmap_set_unique(
+	const vied_nci_resource_bitmap_t		bitmap,
+	const vied_nci_resource_bitmap_t		bit_mask);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_bitfield_mask(
+		const unsigned int position,
+		const unsigned int size);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_bitmap_set_bitfield(
+const vied_nci_resource_bitmap_t		bitmap,
+const unsigned int						index,
+const unsigned int						size);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_bit_mask_set_unique(
+	const vied_nci_resource_bitmap_t		bitmap,
+	const unsigned					index);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_cell_bit_mask(
+	const vied_nci_cell_ID_t		cell_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_resource_bitmap_t vied_nci_barrier_bit_mask(
+	const vied_nci_barrier_ID_t		barrier_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_cell_type_ID_t vied_nci_cell_get_type(
+	const vied_nci_cell_ID_t		cell_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_mem_ID_t vied_nci_ext_mem_get_id_from_type(
+	const vied_nci_mem_type_ID_t		mem_type);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_mem_type_ID_t vied_nci_mem_get_type(
+	const vied_nci_mem_ID_t			mem_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+uint16_t vied_nci_mem_get_size(
+	const vied_nci_mem_ID_t			mem_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+uint16_t vied_nci_dev_chn_get_size(
+	const vied_nci_dev_chn_ID_t		dev_chn_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+bool vied_nci_is_cell_of_type(
+	const vied_nci_cell_ID_t		cell_id,
+	const vied_nci_cell_type_ID_t	cell_type_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+bool vied_nci_is_mem_of_type(
+	const vied_nci_mem_ID_t			mem_id,
+	const vied_nci_mem_type_ID_t	mem_type_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+bool vied_nci_is_cell_mem_of_type(
+	const vied_nci_cell_ID_t		cell_id,
+	const uint16_t					mem_index,
+	const vied_nci_mem_type_ID_t	mem_type_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+bool vied_nci_has_cell_mem_of_id(
+	const vied_nci_cell_ID_t		cell_id,
+	const vied_nci_mem_ID_t			mem_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+uint16_t vied_nci_cell_get_mem_count(
+	const vied_nci_cell_ID_t		cell_id);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_mem_type_ID_t vied_nci_cell_get_mem_type(
+	const vied_nci_cell_ID_t		cell_id,
+	const uint16_t					mem_index);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_mem_ID_t vied_nci_cell_get_mem(
+	const vied_nci_cell_ID_t		cell_id,
+	const uint16_t					mem_index);
+
+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
+vied_nci_mem_type_ID_t vied_nci_cell_type_get_mem_type(
+	const vied_nci_cell_type_ID_t	cell_type_id,
+	const uint16_t					mem_index);
+
+#ifdef __IA_CSS_PSYS_SIM_INLINE__
+#include "psys_system_global_impl.h"
+#endif /* __IA_CSS_PSYS_SIM_INLINE__ */
+
+#endif /* __VIED_NCI_PSYS_SYSTEM_GLOBAL_H */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_kernel_bitmap.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_kernel_bitmap.c
new file mode 100644
index 000000000000..191f13d8e75e
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_kernel_bitmap.c
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <ia_css_kernel_bitmap.h>
+#include <type_support.h>
+#include <misc_support.h>
+#include <assert_support.h>
+#include "math_support.h"
+#include "ia_css_psys_kernel_trace.h"
+
+#ifndef __IA_CSS_KERNEL_BITMAP_INLINE__
+#include "ia_css_kernel_bitmap_impl.h"
+#endif /* __IA_CSS_KERNEL_BITMAP_INLINE__ */
+
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_element_from_uint32(
+	ia_css_kernel_bitmap_t				bitmap,
+	const unsigned int				elem_index,
+	const uint32_t					elem_value)
+{
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+		"ia_css_kernel_bitmap_set_element_from_uint32(): enter:\n");
+
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+	COMPILATION_ERROR_IF(sizeof(bitmap.data[elem_index]) != sizeof(elem_value));
+
+	if (elem_index < IA_CSS_KERNEL_BITMAP_NOF_ELEMS) {
+		bitmap.data[elem_index] = elem_value;
+	} else {
+		assert(0);
+	}
+#else
+	COMPILATION_ERROR_IF(IA_CSS_KERNEL_BITMAP_BITS != 64);
+
+	bitmap &= ~((((ia_css_kernel_bitmap_t) 1 << IA_CSS_KERNEL_BITMAP_ELEM_BITS) - 1) <<
+							(elem_index * IA_CSS_KERNEL_BITMAP_ELEM_BITS));
+	bitmap |= (ia_css_kernel_bitmap_t) elem_value << (elem_index * IA_CSS_KERNEL_BITMAP_ELEM_BITS);
+#endif
+
+	return bitmap;
+}
+
+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_create_from_uint64(
+	const uint64_t value)
+{
+	const unsigned int bits64 = sizeof(uint64_t) * 8;
+	const unsigned int nof_elems_bits64 = bits64 / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
+	unsigned int i;
+	ia_css_kernel_bitmap_t result;
+
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+		"ia_css_kernel_bitmap_create_from_uint64(): enter:\n");
+
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+	result = ia_css_kernel_bitmap_clear();
+	for (i = 0; i < MIN(nof_elems_bits64, IA_CSS_KERNEL_BITMAP_NOF_ELEMS); i++) {
+		/* masking is done implictly, the MSB bits of casting will bel chopped off */
+		result.data[i] = (IA_CSS_KERNEL_BITMAP_ELEM_TYPE)
+			(value >> (i * IA_CSS_KERNEL_BITMAP_ELEM_BITS));
+	}
+
+#if IA_CSS_KERNEL_BITMAP_BITS < 64
+	if ((value >> IA_CSS_KERNEL_BITMAP_BITS) != 0) {
+		IA_CSS_TRACE_0(PSYSAPI_KERNEL, ERROR,
+			"ia_css_kernel_bitmap_create_from_uint64(): "
+			"kernel bitmap is not wide enough to encode value\n");
+		assert(0);
+	}
+#endif
+#else
+	NOT_USED(i);
+	NOT_USED(nof_elems_bits64);
+	result = value;
+#endif /* IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS */
+	return result;
+}
+
+uint64_t ia_css_kernel_bitmap_to_uint64(
+	const ia_css_kernel_bitmap_t value)
+{
+	const unsigned int bits64 = sizeof(uint64_t) * 8;
+	const unsigned int nof_elems_bits64 = bits64 / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
+	unsigned int i;
+	uint64_t res = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
+		"ia_css_kernel_bitmap_to_uint64(): enter:\n");
+
+	assert((bits64 % IA_CSS_KERNEL_BITMAP_ELEM_BITS) == 0);
+	assert(nof_elems_bits64 > 0);
+
+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
+	for (i = 0; i < MIN(IA_CSS_KERNEL_BITMAP_ELEM_BITS, nof_elems_bits64); i++) {
+		res |= ((uint64_t)(value.data[i]) << (i * IA_CSS_KERNEL_BITMAP_ELEM_BITS));
+	}
+	for (; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
+		assert(value.data[i] == 0);
+	}
+	return res;
+#else
+	(void)i;
+	(void)res;
+	(void)nof_elems_bits64;
+	return (uint64_t)value;
+#endif /* IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS */
+}
+
+int ia_css_kernel_bitmap_print(
+	const ia_css_kernel_bitmap_t			bitmap,
+	void						*fid)
+{
+	int retval = -1;
+	int bit;
+	unsigned int bit_index = 0;
+	ia_css_kernel_bitmap_t loc_bitmap;
+
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, INFO,
+		"ia_css_kernel_bitmap_print(): enter:\n");
+
+	NOT_USED(fid);
+	NOT_USED(bit);
+
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, INFO, "kernel bitmap {\n");
+
+	loc_bitmap = bitmap;
+
+	for (bit_index = 0; (bit_index < IA_CSS_KERNEL_BITMAP_BITS) &&
+		!ia_css_is_kernel_bitmap_empty(loc_bitmap); bit_index++) {
+
+		bit = ia_css_is_kernel_bitmap_set(loc_bitmap, 0);
+		loc_bitmap = ia_css_kernel_bitmap_shift(loc_bitmap);
+		IA_CSS_TRACE_2(PSYSAPI_KERNEL, INFO, "\t%d\t = %d\n", bit_index, bit);
+	}
+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, INFO, "}\n");
+
+	retval = 0;
+	return retval;
+}
+
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_data.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_data.c
new file mode 100644
index 000000000000..62369e7d8308
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_data.c
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ia_css_psys_data_storage_class.h"
+
+/*
+ * Functions to possibly inline
+ */
+
+#ifdef __IA_CSS_PSYS_DATA_INLINE__
+STORAGE_CLASS_INLINE int
+__ia_css_program_group_data_avoid_warning_on_empty_file(void) { return 0; }
+#else /* __IA_CSS_PSYS_DATA_INLINE__ */
+#include "ia_css_program_group_data_impl.h"
+#endif /* __IA_CSS_PSYS_DATA_INLINE__ */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_param.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_param.c
new file mode 100644
index 000000000000..24802a648bb8
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_param.c
@@ -0,0 +1,769 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <ia_css_program_group_param.h>
+#include <ia_css_program_group_param_private.h>
+#include <ia_css_psys_manifest_types.h>
+#include <ia_css_psys_program_group_manifest.h>
+#include <ia_css_psysapi_fw_version.h>
+#include <error_support.h>
+#include <misc_support.h>
+#include <assert_support.h>
+#include <type_support.h>
+#include <print_support.h>
+
+#include "ia_css_psys_param_trace.h"
+
+static int
+ia_css_terminal_param_init(ia_css_terminal_param_t *terminal_param,
+			   uint32_t offset,
+			   enum ia_css_frame_format_type frame_format_type);
+
+static int
+ia_css_program_param_init(ia_css_program_param_t *program_param,
+				int32_t offset);
+
+size_t ia_css_sizeof_program_group_param(
+	const uint8_t program_count,
+	const uint8_t terminal_count,
+	const uint16_t fragment_count)
+{
+	size_t	size = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+		"ia_css_sizeof_program_group_param(): enter:\n");
+
+	verifexit(program_count != 0);
+	verifexit(terminal_count != 0);
+	verifexit(fragment_count != 0);
+
+	size += sizeof(ia_css_program_group_param_t);
+	size += program_count * fragment_count * sizeof(ia_css_program_param_t);
+	size += terminal_count * sizeof(ia_css_terminal_param_t);
+EXIT:
+	if (0 == program_count || 0 == terminal_count || 0 == fragment_count) {
+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+			"ia_css_sizeof_program_group_param invalid argument\n");
+	}
+	return size;
+}
+
+size_t ia_css_program_group_param_get_size(
+	const ia_css_program_group_param_t		*program_group_param)
+{
+	size_t	size = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+		       "ia_css_program_group_param_get_size(): enter:\n");
+
+	if (program_group_param != NULL) {
+		size = program_group_param->size;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+		      "ia_css_program_group_param_get_size invalid argument\n");
+	}
+	return size;
+}
+
+size_t ia_css_program_param_get_size(
+	const ia_css_program_param_t			*param)
+{
+	size_t	size = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+		       "ia_css_program_param_get_size(): enter:\n");
+
+	if (param != NULL) {
+		size = param->size;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+			"ia_css_program_param_get_size invalid argument\n");
+	}
+	return size;
+}
+
+ia_css_program_param_t *ia_css_program_group_param_get_program_param(
+	const ia_css_program_group_param_t *param,
+	const int i)
+{
+	ia_css_program_param_t	*program_param = NULL;
+	ia_css_program_param_t	*program_param_base;
+	int program_count = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+		"ia_css_program_group_param_get_program_param(): enter:\n");
+
+	verifexit(param != NULL);
+
+	program_count =
+		(int)ia_css_program_group_param_get_program_count(param);
+
+	verifexit(i < program_count);
+
+	program_param_base = (ia_css_program_param_t *)
+			(((char *)param) + param->program_param_offset);
+
+	program_param = &program_param_base[i];
+
+EXIT:
+	if (NULL == param || i >= program_count) {
+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+			"ia_css_program_group_param_get_program_param invalid argument\n");
+	}
+	return program_param;
+}
+
+size_t ia_css_terminal_param_get_size(
+	const ia_css_terminal_param_t			*param)
+{
+	size_t	size = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+		"ia_css_terminal_param_get_size(): enter:\n");
+
+	if (param != NULL) {
+		size = param->size;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+			"ia_css_terminal_param_get_size invalid argument\n");
+	}
+
+	return size;
+}
+
+ia_css_terminal_param_t *ia_css_program_group_param_get_terminal_param(
+	const ia_css_program_group_param_t		*param,
+	const int		i)
+{
+	ia_css_terminal_param_t	*terminal_param = NULL;
+	ia_css_terminal_param_t	*terminal_param_base;
+	int program_count = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+		"ia_css_program_group_param_get_terminal_param(): enter:\n");
+
+	verifexit(param != NULL);
+
+	program_count =
+		(int)ia_css_program_group_param_get_terminal_count(param);
+
+	verifexit(i < program_count);
+
+	terminal_param_base = (ia_css_terminal_param_t *)
+			(((char *)param) + param->terminal_param_offset);
+	terminal_param = &terminal_param_base[i];
+EXIT:
+	if (NULL == param || i >= program_count) {
+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+			"ia_css_program_group_param_get_terminal_param invalid argument\n");
+	}
+	return terminal_param;
+}
+
+uint8_t ia_css_program_group_param_get_program_count(
+	const ia_css_program_group_param_t		*param)
+{
+	uint8_t	program_count = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+		"ia_css_program_group_param_get_program_count(): enter:\n");
+
+	if (param != NULL) {
+		program_count = param->program_count;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+			"ia_css_program_group_param_get_program_count invalid argument\n");
+	}
+	return program_count;
+}
+
+uint8_t ia_css_program_group_param_get_terminal_count(
+	const ia_css_program_group_param_t		*param)
+{
+	uint8_t	terminal_count = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+		"ia_css_program_group_param_get_terminal_count(): enter:\n");
+
+	if (param != NULL) {
+		terminal_count = param->terminal_count;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+			"ia_css_program_group_param_get_terminal_count invalid argument\n");
+	}
+	return terminal_count;
+}
+
+uint16_t ia_css_program_group_param_get_fragment_count(
+	const ia_css_program_group_param_t		*param)
+{
+	uint8_t	fragment_count = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+		"ia_css_program_group_param_get_fragment_count(): enter:\n");
+
+	if (param != NULL) {
+		fragment_count = (uint8_t)param->fragment_count;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+			"ia_css_program_group_param_get_fragment_count invalid argument\n");
+	}
+	return fragment_count;
+}
+
+int ia_css_program_group_param_set_protocol_version(
+	ia_css_program_group_param_t *param,
+	uint8_t protocol_version)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+	     "ia_css_program_group_param_set_protocol_version(): enter:\n");
+
+	if (param != NULL) {
+		param->protocol_version = protocol_version;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+			"ia_css_program_group_param_set_protocol_version failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+uint8_t ia_css_program_group_param_get_protocol_version(
+	const ia_css_program_group_param_t *param)
+{
+	uint8_t protocol_version = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+	     "ia_css_program_group_param_get_protocol_version(): enter:\n");
+
+	if (param != NULL) {
+		protocol_version = param->protocol_version;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+			"ia_css_program_group_param_get_protocol_version invalid argument\n");
+	}
+	return protocol_version;
+}
+
+int ia_css_program_group_param_set_kernel_enable_bitmap(
+	ia_css_program_group_param_t	*param,
+	const ia_css_kernel_bitmap_t	bitmap)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+	     "ia_css_program_group_param_set_kernel_enable_bitmap(): enter:\n");
+
+	if (param != NULL) {
+		param->kernel_enable_bitmap = bitmap;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+			"ia_css_program_group_param_set_kernel_enable_bitmap failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+ia_css_kernel_bitmap_t ia_css_program_group_param_get_kernel_enable_bitmap(
+	const ia_css_program_group_param_t		*param)
+{
+	ia_css_kernel_bitmap_t	bitmap = ia_css_kernel_bitmap_clear();
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+	     "ia_css_program_group_param_get_kernel_enable_bitmap(): enter:\n");
+
+	if (param != NULL) {
+		bitmap = param->kernel_enable_bitmap;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+			"ia_css_program_group_param_get_kernel_enable_bitmap invalid argument\n");
+	}
+	return bitmap;
+}
+
+int ia_css_program_param_set_kernel_enable_bitmap(
+	ia_css_program_param_t		*program_param,
+	const ia_css_kernel_bitmap_t	bitmap)
+{
+	assert(0);
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, ERROR,
+		"ia_css_program_param_set_kernel_enable_bitmap(): deprecated API function:\n");
+
+	if (program_param != NULL) {
+		program_param->kernel_enable_bitmap = bitmap;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_PARAM, ERROR,
+			"ia_css_program_param_set_kernel_enable_bitmap failed\n");
+	}
+	return -1;
+}
+
+ia_css_kernel_bitmap_t ia_css_program_param_get_kernel_enable_bitmap(
+	const ia_css_program_param_t	*program_param)
+{
+	ia_css_kernel_bitmap_t	bitmap = ia_css_kernel_bitmap_clear();
+	char *base;
+
+	assert(0);
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, ERROR,
+		"ia_css_program_param_get_kernel_enable_bitmap():  deprecated API function:\n");
+
+	verifexit(program_param != NULL);
+	verifexit(program_param->parent_offset != 0);
+
+	base = (char *)((char *)program_param + program_param->parent_offset);
+	bitmap = ((ia_css_program_group_param_t *)base)->kernel_enable_bitmap;
+EXIT:
+	if (NULL == program_param || 0 == program_param->parent_offset)	{
+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+			"ia_css_program_param_get_kernel_enable_bitmap invalid argument\n");
+	}
+	return bitmap;
+}
+
+ia_css_kernel_bitmap_t ia_css_terminal_param_get_kernel_enable_bitmap(
+	const ia_css_terminal_param_t			*param)
+{
+	ia_css_kernel_bitmap_t	bitmap = ia_css_kernel_bitmap_clear();
+	char *base;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+		"ia_css_terminal_param_get_kernel_enable_bitmap(): enter:\n");
+
+	verifexit(param != NULL);
+	verifexit(param->parent_offset != 0);
+
+	base = (char *)((char *)param + param->parent_offset);
+	bitmap = ((ia_css_program_group_param_t *)base)->kernel_enable_bitmap;
+EXIT:
+	if (NULL == param || 0 == param->parent_offset) {
+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+			"ia_css_terminal_param_get_kernel_enable_bitmap invalid argument\n");
+	}
+	return bitmap;
+}
+
+ia_css_frame_format_type_t ia_css_terminal_param_get_frame_format_type(
+	const ia_css_terminal_param_t	*param)
+{
+	ia_css_frame_format_type_t ft = IA_CSS_N_FRAME_FORMAT_TYPES;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+		"ia_css_terminal_param_get_frame_format_type(): enter:\n");
+
+	verifexit(param != NULL);
+
+	ft = param->frame_format_type;
+EXIT:
+	if (NULL == param) {
+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+			"ia_css_terminal_param_get_frame_format_type invalid argument\n");
+	}
+	return ft;
+}
+
+int ia_css_terminal_param_set_frame_format_type(
+	ia_css_terminal_param_t		*param,
+	const ia_css_frame_format_type_t	data_format_type)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+		"ia_css_terminal_param_set_frame_format_type(): enter:\n");
+
+	if (param != NULL) {
+		param->frame_format_type = data_format_type;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+			"ia_css_terminal_param_set_frame_format_type failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+uint8_t ia_css_terminal_param_get_bpp(
+	const ia_css_terminal_param_t	*param)
+{
+	uint8_t bpp = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+		       "ia_css_terminal_param_get_bpp(): enter:\n");
+
+	verifexit(param != NULL);
+
+	bpp = param->bpp;
+
+EXIT:
+	if (NULL == param) {
+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+			"ia_css_terminal_param_get_bpp invalid argument\n");
+	}
+	return bpp;
+}
+
+int ia_css_terminal_param_set_bpp(
+	ia_css_terminal_param_t	*param,
+	const uint8_t bpp)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+		       "ia_css_terminal_param_set_bpp(): enter:\n");
+
+	if (param != NULL) {
+		param->bpp = bpp;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+			"ia_css_terminal_param_set_bpp failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+int ia_css_terminal_param_get_dimensions(
+	const ia_css_terminal_param_t	*param,
+	uint16_t dimensions[IA_CSS_N_DATA_DIMENSION])
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+		"ia_css_terminal_param_get_dimensions(): enter:\n");
+
+	if (param != NULL) {
+		dimensions[IA_CSS_COL_DIMENSION] =
+			param->dimensions[IA_CSS_COL_DIMENSION];
+		dimensions[IA_CSS_ROW_DIMENSION] =
+			param->dimensions[IA_CSS_ROW_DIMENSION];
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+		  "ia_css_terminal_param_get_dimensions failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+int ia_css_terminal_param_set_dimensions(
+	ia_css_terminal_param_t	*param,
+	const uint16_t dimensions[IA_CSS_N_DATA_DIMENSION])
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+		"ia_css_terminal_param_set_dimensions(): enter:\n");
+
+	if (param != NULL) {
+		param->dimensions[IA_CSS_COL_DIMENSION] =
+				dimensions[IA_CSS_COL_DIMENSION];
+		param->dimensions[IA_CSS_ROW_DIMENSION] =
+				dimensions[IA_CSS_ROW_DIMENSION];
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+		  "ia_css_terminal_param_set_dimensions failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+int ia_css_terminal_param_set_stride(
+	ia_css_terminal_param_t		*param,
+	const uint32_t stride)
+{
+	int retval = -1;
+
+	verifexit(param != NULL);
+	param->stride = stride;
+	retval = 0;
+
+EXIT:
+	return retval;
+}
+
+uint32_t ia_css_terminal_param_get_stride(
+	const ia_css_terminal_param_t	*param)
+{
+	uint32_t stride = 0;
+
+	verifexit(param != NULL);
+	stride = param->stride;
+
+EXIT:
+	return stride;
+}
+
+static int ia_css_program_param_init(
+		ia_css_program_param_t *program_param,
+		int32_t offset)
+{
+	int retval = -1;
+
+	COMPILATION_ERROR_IF(
+		SIZE_OF_PROGRAM_PARAM_STRUCT_IN_BITS !=
+				(CHAR_BIT * sizeof(ia_css_program_param_t)));
+	verifexit(program_param != NULL);
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
+		"ia_css_program_param_init(): enter:\n");
+
+	program_param->size = sizeof(ia_css_program_param_t);
+	/* parent is at negative offset from current program.*/
+	program_param->parent_offset = -offset;
+	/*TODO: Kernel_bitmap setting. ?*/
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+			"ia_css_program_param_init failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+static int
+ia_css_terminal_param_init(ia_css_terminal_param_t *terminal_param,
+			uint32_t offset,
+			enum ia_css_frame_format_type frame_format_type)
+{
+	int retval = -1;
+
+	COMPILATION_ERROR_IF(
+		SIZE_OF_TERMINAL_PARAM_STRUCT_IN_BITS !=
+			(CHAR_BIT * sizeof(ia_css_terminal_param_t)));
+	verifexit(terminal_param != NULL);
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
+		"ia_css_terminal_param_init(): enter:\n");
+
+	terminal_param->size = sizeof(ia_css_terminal_param_t);
+	/* parent is at negative offset from current program.*/
+	terminal_param->parent_offset = -((int32_t)offset);
+	/*TODO: Kernel_bitmap setting. ?*/
+	terminal_param->frame_format_type = frame_format_type;
+
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+			"ia_css_terminal_param_init failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+ia_css_program_group_param_t *
+ia_css_terminal_param_get_parent(
+	const ia_css_terminal_param_t			*param)
+{
+	ia_css_program_group_param_t *parent = NULL;
+	char *base;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
+		       "ia_css_terminal_param_get_parent(): enter:\n");
+
+	verifexit(NULL != param);
+
+	base = (char *)((char *)param + param->parent_offset);
+
+	parent = (ia_css_program_group_param_t *)(base);
+EXIT:
+	if (NULL == param) {
+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
+			"ia_css_terminal_param_get_parent invalid argument\n");
+	}
+	return parent;
+}
+
+int ia_css_program_group_param_init(
+	ia_css_program_group_param_t *blob,
+	const uint8_t	program_count,
+	const uint8_t	terminal_count,
+	const uint16_t	fragment_count,
+	const enum ia_css_frame_format_type *frame_format_types)
+{
+	int i = 0;
+	char *param_base;
+	uint32_t offset;
+	int  retval = -1;
+
+	COMPILATION_ERROR_IF(
+		SIZE_OF_PROGRAM_GROUP_PARAM_STRUCT_IN_BITS !=
+			(CHAR_BIT * sizeof(ia_css_program_group_param_t)));
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
+		"ia_css_program_group_param_init(): enter:\n");
+
+	assert(blob != 0);
+
+	verifexit(blob != NULL);
+	verifexit(frame_format_types != NULL);
+
+	blob->program_count = program_count;
+	blob->fragment_count = fragment_count;
+	blob->terminal_count = terminal_count;
+	blob->program_param_offset = sizeof(ia_css_program_group_param_t);
+	blob->terminal_param_offset = blob->program_param_offset +
+				sizeof(ia_css_program_param_t) * program_count;
+
+	param_base = (char *)((char *)blob + blob->program_param_offset);
+	offset = blob->program_param_offset;
+
+	for (i = 0; i < program_count; i++) {
+		ia_css_program_param_init(
+			(ia_css_program_param_t *)param_base, offset);
+		offset += sizeof(ia_css_program_param_t);
+		param_base += sizeof(ia_css_program_param_t);
+	}
+
+	param_base = (char *)((char *)blob + blob->terminal_param_offset);
+	offset = blob->terminal_param_offset;
+
+	for (i = 0; i < terminal_count; i++) {
+		ia_css_terminal_param_init(
+			(ia_css_terminal_param_t *)param_base,
+			offset,
+			frame_format_types[i]);
+
+		offset += sizeof(ia_css_terminal_param_t);
+		param_base += sizeof(ia_css_terminal_param_t);
+	}
+
+	/*
+	 * For now, set legacy flow by default. This can be removed as soon
+	 * as all hosts/drivers explicitly set the protocol version.
+	 */
+	blob->protocol_version = IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY;
+
+	blob->size = (uint32_t)ia_css_sizeof_program_group_param(program_count,
+								terminal_count,
+								fragment_count);
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+		       "ia_css_program_group_param_init failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+int ia_css_program_group_param_print(
+	const ia_css_program_group_param_t		*param,
+	void						*fid)
+{
+	int	retval = -1;
+	int		i;
+	uint8_t	program_count, terminal_count;
+	ia_css_kernel_bitmap_t	bitmap;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
+		       "ia_css_program_group_param_print(): enter:\n");
+
+	verifexit(param != NULL);
+	NOT_USED(fid);
+
+	IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
+		"sizeof(program_group_param) = %d\n",
+		(int)ia_css_program_group_param_get_size(param));
+
+	program_count = ia_css_program_group_param_get_program_count(param);
+	terminal_count = ia_css_program_group_param_get_terminal_count(param);
+
+	bitmap = ia_css_program_group_param_get_kernel_enable_bitmap(param);
+	verifexit(ia_css_kernel_bitmap_print(bitmap, fid) == 0);
+
+	IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
+		"%d program params\n", (int)program_count);
+	for (i = 0; i < (int)program_count; i++) {
+		ia_css_program_param_t *program_param =
+			ia_css_program_group_param_get_program_param(param, i);
+
+		retval = ia_css_program_param_print(program_param, fid);
+		verifjmpexit(retval == 0);
+	}
+	IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO, "%d terminal params\n",
+		       (int)terminal_count);
+	for (i = 0; i < (int)terminal_count; i++) {
+		ia_css_terminal_param_t	*terminal_param =
+			ia_css_program_group_param_get_terminal_param(param, i);
+
+		retval = ia_css_terminal_param_print(terminal_param, fid);
+		verifjmpexit(retval == 0);
+	}
+
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+		      "ia_css_program_group_param_print failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+int ia_css_terminal_param_print(
+	const ia_css_terminal_param_t			*param,
+	void						*fid)
+{
+	int	retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
+		"ia_css_terminal_param_print(): enter:\n");
+
+	verifexit(param != NULL);
+	NOT_USED(fid);
+
+	IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
+		"sizeof(terminal_param) = %d\n",
+		(int)ia_css_terminal_param_get_size(param));
+
+	IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
+		"\tframe_format_type = %d\n", param->frame_format_type);
+
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+			"ia_css_terminal_param_print failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+int ia_css_program_param_print(
+	const ia_css_program_param_t			*param,
+	void						*fid)
+{
+	int	retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
+		"ia_css_program_param_print(): enter:\n");
+
+	verifexit(param != NULL);
+	NOT_USED(fid);
+
+	IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO, "sizeof(program_param) = %d\n",
+		       (int)ia_css_program_param_get_size(param));
+
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
+			"ia_css_program_param_print failed (%i)\n", retval);
+	}
+	return retval;
+}
+
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process.c
new file mode 100644
index 000000000000..6ec87f336b86
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process.c
@@ -0,0 +1,1038 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ia_css_psys_process.h"
+#include "ia_css_psys_dynamic_storage_class.h"
+#include "ia_css_psys_process_private_types.h"
+#include "ia_css_program_group_param_private.h"
+#include "math_support.h"
+
+/* *****************************************************
+ * Functions to possibly inline
+ * ******************************************************/
+#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
+#include "ia_css_psys_process_impl.h"
+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
+
+/* *****************************************************
+ * Functions not to inline and not available to firmware
+ * ******************************************************/
+#if !defined(__HIVECC)
+STORAGE_CLASS_INLINE bool  ia_css_program_manifest_process_requires_extension(
+	const ia_css_program_manifest_t			*manifest)
+{
+	int i;
+	bool requires_extension = false;
+
+	verifexit(manifest != NULL);
+
+	for (i = 0; i < VIED_NCI_N_DATA_MEM_TYPE_ID; i++) {
+		requires_extension |=
+			(ia_css_program_manifest_get_ext_mem_size(manifest, i) != 0);
+	}
+
+#if HAS_DFM
+	for (i = 0; i < VIED_NCI_N_DEV_CHN_ID; i++) {
+		requires_extension |=
+			(ia_css_program_manifest_get_dev_chn_size(manifest, i) != 0);
+	}
+	for (i = 0; i < VIED_NCI_N_DEV_DFM_ID; i++) {
+		requires_extension |=
+			(ia_css_program_manifest_get_dfm_port_bitmap(manifest, i) != 0);
+		requires_extension |=
+			(ia_css_program_manifest_get_dfm_active_port_bitmap(manifest, i) != 0);
+	}
+#endif /* HAS_DFM */
+EXIT:
+	return requires_extension;
+}
+
+size_t ia_css_sizeof_process(
+	const ia_css_program_manifest_t			*manifest,
+	const ia_css_program_param_t			*param)
+{
+	size_t	size = 0;
+
+	uint8_t	program_dependency_count;
+	uint8_t terminal_dependency_count;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_sizeof_process(): enter:\n");
+
+	verifexit(manifest != NULL);
+	verifexit(param != NULL);
+
+	size += sizeof(ia_css_process_t);
+
+	if (ia_css_program_manifest_process_requires_extension(manifest)) {
+		/* align start of extension to 32 bit */
+		size = CEIL_MUL(size, sizeof(uint32_t));
+		size += sizeof(ia_css_process_ext_t);
+	}
+
+	program_dependency_count =
+		ia_css_program_manifest_get_program_dependency_count(manifest);
+	terminal_dependency_count =
+		ia_css_program_manifest_get_terminal_dependency_count(manifest);
+
+	size += program_dependency_count*sizeof(vied_nci_resource_id_t);
+	size += terminal_dependency_count*sizeof(vied_nci_resource_id_t);
+
+	/* align whole structure to 32 bit */
+	size = CEIL_MUL(size, sizeof(uint32_t));
+EXIT:
+	if (NULL == manifest || NULL == param) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_sizeof_process invalid argument\n");
+	}
+	return size;
+}
+
+ia_css_process_t *ia_css_process_create(
+	void					*raw_mem,
+	const ia_css_program_manifest_t		*manifest,
+	const ia_css_program_param_t		*param,
+	const uint32_t				program_idx)
+{
+	int retval = -1, size = 0;
+	ia_css_process_t *process = NULL;
+	bool create_extension;
+
+	uint8_t	program_dependency_count;
+	uint8_t	terminal_dependency_count;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_create(): enter:\n");
+
+	verifexit(manifest != NULL);
+	verifexit(param != NULL);
+	verifexit(raw_mem != NULL);
+
+	process = (ia_css_process_t *)raw_mem;;
+	verifexit(process != NULL);
+	create_extension = ia_css_program_manifest_process_requires_extension(manifest);
+
+	process->state = IA_CSS_PROCESS_CREATED;
+
+	program_dependency_count =
+		ia_css_program_manifest_get_program_dependency_count(manifest);
+	terminal_dependency_count =
+		ia_css_program_manifest_get_terminal_dependency_count(manifest);
+
+	/* A process requires at least one input or output */
+	verifexit((program_dependency_count +
+		   terminal_dependency_count) != 0);
+
+	size += sizeof(ia_css_process_t);
+
+	if (create_extension == true) {
+		/* align start of extension to 32 bit */
+		size = CEIL_MUL(size, sizeof(uint32_t));
+		process->process_extension_offset = (uint8_t)size;
+		size += sizeof(ia_css_process_ext_t);
+	} else {
+		process->process_extension_offset = 0;
+	}
+	if (program_dependency_count != 0) {
+		process->cell_dependencies_offset = (uint8_t)size;
+		size += program_dependency_count * sizeof(vied_nci_resource_id_t);
+	} else {
+		process->cell_dependencies_offset = 0;
+	}
+	if (terminal_dependency_count != 0) {
+		process->terminal_dependencies_offset = (uint8_t)size;;
+		size += terminal_dependency_count * sizeof(uint8_t);
+	} else {
+		process->terminal_dependencies_offset = 0;
+	}
+
+	/* align whole structure to 32 bit */
+	size = CEIL_MUL(size, sizeof(uint32_t));
+
+	process->size = (uint8_t)ia_css_sizeof_process(manifest, param);
+	assert((size_t)size == process->size);
+	/* The following assert also implies that:
+	 * process->terminal_dependencies_offset,
+	 * process->cell_dependencies_offset,
+	 * process->process_extension_offset,
+	 * are <= UINT8_MAX
+	 */
+	assert(size <= UINT8_MAX);
+
+	process->ID = ia_css_program_manifest_get_program_ID(manifest);
+	verifexit(process->ID != 0);
+	assert(program_idx <= UINT8_MAX);
+	process->program_idx = program_idx;
+
+	process->cell_dependency_count = program_dependency_count;
+	process->terminal_dependency_count = terminal_dependency_count;
+
+	process->parent_offset = 0;
+	verifexit(ia_css_process_clear_all(process) == 0);
+
+	process->state = IA_CSS_PROCESS_READY;
+	retval = 0;
+
+	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_create(): Created successfully process 0x%lx ID 0x%x\n",
+		(unsigned long int)process, process->ID);
+
+EXIT:
+	if (NULL == manifest || NULL == param) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_create invalid argument\n");
+	}
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_create failed (%i)\n", retval);
+		process = ia_css_process_destroy(process);
+	}
+	return process;
+}
+
+ia_css_process_t *ia_css_process_destroy(
+	ia_css_process_t *process)
+{
+
+	return process;
+}
+
+int ia_css_process_set_cell(
+	ia_css_process_t					*process,
+	const vied_nci_cell_ID_t				cell_id)
+{
+	int	retval = -1;
+	vied_nci_resource_bitmap_t		bit_mask;
+	vied_nci_resource_bitmap_t		resource_bitmap;
+	ia_css_process_group_t			*parent;
+	ia_css_process_group_state_t	parent_state;
+	ia_css_process_state_t			state;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_set_cell(): enter:\n");
+
+	verifexit(process != NULL);
+
+	parent = ia_css_process_get_parent(process);
+	verifexit(parent != NULL);
+
+	parent_state = ia_css_process_group_get_state(parent);
+	state = ia_css_process_get_state(process);
+
+/* Some programs are mapped on a fixed cell,
+ * when the process group is created
+ */
+	verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
+		(parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
+		(parent_state == IA_CSS_PROCESS_GROUP_CREATED) ||
+		/* If the process group has already been created, but no VP cell
+		 * has been assigned to this process (i.e. not fixed in
+		 * manifest), then we need to set the cell of this process
+		 * while its parent state is READY (the ready state is set at
+		 * the end of ia_css_process_group_create)
+		 */
+		(parent_state == IA_CSS_PROCESS_GROUP_READY)));
+	verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
+
+/* Some programs are mapped on a fixed cell, thus check is not secure,
+ * but it will detect a preset, the process manager will do the secure check
+ */
+	verifexit(ia_css_process_get_cell(process) ==
+		  VIED_NCI_N_CELL_ID);
+
+	bit_mask = vied_nci_cell_bit_mask(cell_id);
+	resource_bitmap = ia_css_process_group_get_resource_bitmap(parent);
+
+	verifexit(bit_mask != 0);
+	verifexit(vied_nci_is_bitmap_clear(bit_mask, resource_bitmap));
+
+	ia_css_process_cells_clear(process);
+	ia_css_process_cells_set_cell(process, 0, cell_id);
+
+	resource_bitmap = vied_nci_bitmap_set(resource_bitmap, bit_mask);
+
+	retval = ia_css_process_group_set_resource_bitmap(
+			parent, resource_bitmap);
+EXIT:
+	if (NULL == process) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_set_cell invalid argument process\n");
+	}
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_set_cell failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+int ia_css_process_clear_cell(
+	ia_css_process_t *process)
+{
+	int	retval = -1;
+	vied_nci_cell_ID_t				cell_id;
+	ia_css_process_group_t			*parent;
+	vied_nci_resource_bitmap_t		resource_bitmap;
+	vied_nci_resource_bitmap_t		bit_mask;
+	ia_css_process_group_state_t	parent_state;
+	ia_css_process_state_t			state;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		       "ia_css_process_clear_cell(): enter:\n");
+	verifexit(process != NULL);
+
+	cell_id = ia_css_process_get_cell(process);
+	parent = ia_css_process_get_parent(process);
+	verifexit(parent != NULL);
+
+	parent_state = ia_css_process_group_get_state(parent);
+	state = ia_css_process_get_state(process);
+
+	verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED)
+		   || (parent_state == IA_CSS_PROCESS_GROUP_STARTED)));
+	verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
+
+	bit_mask = vied_nci_cell_bit_mask(cell_id);
+	resource_bitmap = ia_css_process_group_get_resource_bitmap(parent);
+
+	verifexit(bit_mask != 0);
+	verifexit(vied_nci_is_bitmap_set(bit_mask, resource_bitmap));
+
+	ia_css_process_cells_clear(process);
+
+	resource_bitmap = vied_nci_bitmap_clear(resource_bitmap, bit_mask);
+
+	retval = ia_css_process_group_set_resource_bitmap(
+			parent, resource_bitmap);
+EXIT:
+	if (NULL == process) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_clear_cell invalid argument process\n");
+	}
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_clear_cell failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+int ia_css_process_set_int_mem(
+	ia_css_process_t				*process,
+	const vied_nci_mem_type_ID_t			mem_type_id,
+	const vied_nci_resource_size_t			offset)
+{
+	(void)process;
+	(void)mem_type_id;
+	(void)offset;
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+		"ia_css_process_set_int_mem should not be called"
+		"(internally memory feature not used).\n");
+	return 0;
+}
+
+int ia_css_process_clear_int_mem(
+	ia_css_process_t *process,
+	const vied_nci_mem_type_ID_t mem_type_id)
+{
+	(void)process;
+	(void)mem_type_id;
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+		"ia_css_process_clear_int_mem should not be called"
+		"(internally memory feature not used).\n");
+	return 0;
+}
+
+int ia_css_process_set_ext_mem(
+	ia_css_process_t *process,
+	const vied_nci_mem_ID_t mem_id,
+	const vied_nci_resource_size_t offset)
+{
+	int	retval = -1;
+	ia_css_process_group_t	*parent;
+	vied_nci_cell_ID_t	cell_id;
+	ia_css_process_group_state_t	parent_state;
+	ia_css_process_state_t	state;
+	vied_nci_mem_type_ID_t mem_type_id;
+	ia_css_process_ext_t *process_ext;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		       "ia_css_process_set_ext_mem(): enter:\n");
+
+	verifexit(process != NULL);
+	process_ext = ia_css_process_get_extension(process);
+	verifexit(process_ext != NULL);
+
+	parent = ia_css_process_get_parent(process);
+	verifexit(parent != NULL);
+	cell_id = ia_css_process_get_cell(process);
+
+	parent_state = ia_css_process_group_get_state(parent);
+	state = ia_css_process_get_state(process);
+
+	/* TODO : separate process group start and run from
+	*	  process_group_exec_cmd()
+	*/
+	verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
+		   (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
+		   (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
+	verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
+
+	/* Check that the memory actually exists, "vied_nci_has_cell_mem_of_id()"
+	* will return false on error
+	*/
+
+	mem_type_id = vied_nci_mem_get_type(mem_id);
+#ifdef HAS_PMEM
+	if (((!vied_nci_has_cell_mem_of_id(cell_id, mem_id) &&
+		(mem_type_id != VIED_NCI_PMEM_TYPE_ID))
+		|| vied_nci_mem_is_ext_type(mem_type_id)) &&
+		(mem_id < VIED_NCI_N_MEM_ID)) {
+
+		verifexit(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID);
+		process_ext->ext_mem_id[mem_type_id] = mem_id;
+		process_ext->ext_mem_offset[mem_type_id] = offset;
+		retval = 0;
+	}
+#else /* not HAS_PMEM */
+	if (((!vied_nci_has_cell_mem_of_id(cell_id, mem_id))
+			|| vied_nci_mem_is_ext_type(mem_type_id)) &&
+			(mem_id < VIED_NCI_N_MEM_ID)) {
+
+		verifexit(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID);
+		process_ext->ext_mem_id[mem_type_id] = mem_id;
+		process_ext->ext_mem_offset[mem_type_id] = offset;
+		retval = 0;
+	}
+#endif /* HAS_PMEM */
+
+EXIT:
+	if (NULL == process) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_set_ext_mem invalid argument process\n");
+	}
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_set_ext_mem failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+int ia_css_process_clear_ext_mem(
+	ia_css_process_t *process,
+	const vied_nci_mem_type_ID_t mem_type_id)
+{
+	int	retval = -1;
+	ia_css_process_group_t			*parent;
+	ia_css_process_group_state_t	parent_state;
+	ia_css_process_state_t			state;
+	ia_css_process_ext_t *process_ext;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		       "ia_css_process_clear_ext_mem(): enter:\n");
+
+	verifexit(process != NULL);
+	verifexit(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID);
+	process_ext = ia_css_process_get_extension(process);
+	if (process_ext == NULL) {
+		return 0;
+	}
+
+	parent = ia_css_process_get_parent(process);
+	verifexit(parent != NULL);
+	state = ia_css_process_get_state(process);
+
+	verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
+
+	parent_state = ia_css_process_group_get_state(parent);
+
+	verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
+		   (parent_state == IA_CSS_PROCESS_GROUP_STARTED)));
+
+	process_ext->ext_mem_id[mem_type_id] = VIED_NCI_N_MEM_ID;
+	process_ext->ext_mem_offset[mem_type_id] = IA_CSS_PROCESS_INVALID_OFFSET;
+
+	retval = 0;
+EXIT:
+	if (NULL == process || mem_type_id >= VIED_NCI_N_DATA_MEM_TYPE_ID) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_clear_ext_mem invalid argument\n");
+	}
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_clear_ext_mem failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+int ia_css_process_set_cells_bitmap(
+	ia_css_process_t *process,
+	const vied_nci_resource_bitmap_t bitmap)
+{
+	int	retval = -1;
+	ia_css_process_group_t			*parent;
+	ia_css_process_group_state_t	parent_state;
+	ia_css_process_state_t			state;
+	int array_index = 0;
+	int bit_index;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		       "ia_css_process_set_cells_bitmap(): enter:\n");
+
+	verifexit(process != NULL);
+	parent = ia_css_process_get_parent(process);
+	verifexit(parent != NULL);
+	state = ia_css_process_get_state(process);
+
+	parent_state = ia_css_process_group_get_state(parent);
+
+	verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
+		(parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
+		(parent_state == IA_CSS_PROCESS_GROUP_CREATED) ||
+		(parent_state == IA_CSS_PROCESS_GROUP_READY)));
+	verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
+
+	for (bit_index = 0; bit_index < VIED_NCI_N_CELL_ID; bit_index++) {
+		if (vied_nci_is_bit_set_in_bitmap(bitmap, bit_index)) {
+			verifexit(array_index < IA_CSS_PROCESS_MAX_CELLS);
+			ia_css_process_cells_set_cell(process,
+				array_index, (vied_nci_cell_ID_t)bit_index);
+			array_index++;
+		}
+	}
+	for (; array_index < IA_CSS_PROCESS_MAX_CELLS; array_index++) {
+		ia_css_process_cells_set_cell(process,
+			array_index, VIED_NCI_N_CELL_ID);
+	}
+
+	retval = 0;
+EXIT:
+	if (NULL == process) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_set_cells_bitmap invalid argument\n");
+	}
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_set_cells_bitmap failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+#if VIED_NCI_N_DEV_CHN_ID > 0
+int ia_css_process_set_dev_chn(
+	ia_css_process_t *process,
+	const vied_nci_dev_chn_ID_t dev_chn_id,
+	const vied_nci_resource_size_t offset)
+{
+	int	retval = -1;
+	ia_css_process_group_t			*parent;
+	ia_css_process_group_state_t	parent_state;
+	ia_css_process_state_t			state;
+	ia_css_process_ext_t *process_ext;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		       "ia_css_process_set_dev_chn(): enter:\n");
+
+	verifexit(process != NULL);
+	verifexit(dev_chn_id <= VIED_NCI_N_DEV_CHN_ID);
+	process_ext = ia_css_process_get_extension(process);
+	verifexit(process_ext != NULL);
+
+	parent = ia_css_process_get_parent(process);
+	verifexit(parent != NULL);
+	state = ia_css_process_get_state(process);
+
+	parent_state = ia_css_process_group_get_state(parent);
+
+	/* TODO : separate process group start and run from
+	*	  process_group_exec_cmd()
+	*/
+	verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
+		   (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
+		   (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
+	verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
+
+	process_ext->dev_chn_offset[dev_chn_id] = offset;
+
+	retval = 0;
+EXIT:
+	if (NULL == process || dev_chn_id >= VIED_NCI_N_DEV_CHN_ID) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_set_dev_chn invalid argument\n");
+	}
+	if (retval != 0) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+					"ia_css_process_set_dev_chn invalid argument\n");
+	}
+	return retval;
+}
+
+int ia_css_process_clear_dev_chn(
+	ia_css_process_t *process,
+	const vied_nci_dev_chn_ID_t dev_chn_id)
+{
+	int	retval = -1;
+	ia_css_process_group_t			*parent;
+	ia_css_process_group_state_t	parent_state;
+	ia_css_process_state_t			state;
+	ia_css_process_ext_t *process_ext;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		       "ia_css_process_clear_dev_chn(): enter:\n");
+
+	verifexit(process != NULL);
+	process_ext = ia_css_process_get_extension(process);
+	if (process_ext == NULL) {
+		return 0;
+	}
+
+	parent = ia_css_process_get_parent(process);
+	verifexit(parent != NULL);
+
+	parent_state = ia_css_process_group_get_state(parent);
+	state = ia_css_process_get_state(process);
+
+	verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED)
+		   || (parent_state == IA_CSS_PROCESS_GROUP_STARTED)));
+	verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
+
+	verifexit(dev_chn_id <= VIED_NCI_N_DEV_CHN_ID);
+
+	process_ext->dev_chn_offset[dev_chn_id] = IA_CSS_PROCESS_INVALID_OFFSET;
+
+	retval = 0;
+EXIT:
+	if (NULL == process) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+		     "ia_css_process_clear_dev_chn invalid argument process\n");
+	}
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_clear_dev_chn failed (%i)\n", retval);
+	}
+	return retval;
+}
+#endif /* VIED_NCI_N_DEV_CHN_ID */
+
+#if HAS_DFM
+int ia_css_process_set_dfm_port_bitmap(
+	ia_css_process_t                 *process,
+	const vied_nci_dev_dfm_id_t      dfm_dev_id,
+	const vied_nci_resource_bitmap_t bitmap)
+{
+	int	retval = -1;
+	ia_css_process_group_t			*parent;
+	ia_css_process_group_state_t	parent_state;
+	ia_css_process_state_t			state;
+	ia_css_process_ext_t *process_ext;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		       "ia_css_process_set_dfm_port(): enter:\n");
+
+	verifexit(process != NULL);
+	process_ext = ia_css_process_get_extension(process);
+	if (process_ext == NULL && bitmap == 0) {
+		return 0;
+	}
+	verifexit(process_ext != NULL);
+
+	parent = ia_css_process_get_parent(process);
+	verifexit(parent != NULL);
+	state = ia_css_process_get_state(process);
+
+	parent_state = ia_css_process_group_get_state(parent);
+
+	/* TODO : separate process group start and run from
+	*	  process_group_exec_cmd()
+	*/
+	verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
+		   (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
+		   (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
+	verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
+
+	verifexit(dfm_dev_id <= VIED_NCI_N_DEV_DFM_ID);
+	process_ext->dfm_port_bitmap[dfm_dev_id] = bitmap;
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_set_dfm_port invalid argument\n");
+	}
+	return retval;
+}
+
+int ia_css_process_set_dfm_active_port_bitmap(
+	ia_css_process_t                 *process,
+	const vied_nci_dev_dfm_id_t      dfm_dev_id,
+	const vied_nci_resource_bitmap_t bitmap)
+{
+	int	retval = -1;
+	ia_css_process_group_t			*parent;
+	ia_css_process_group_state_t	parent_state;
+	ia_css_process_state_t			state;
+	ia_css_process_ext_t *process_ext;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		       "ia_css_process_set_dfm_active_port_bitmap(): enter:\n");
+
+	verifexit(process != NULL);
+	process_ext = ia_css_process_get_extension(process);
+	if (process_ext == NULL && bitmap == 0) {
+		return 0;
+	}
+	verifexit(process_ext != NULL);
+
+	parent = ia_css_process_get_parent(process);
+	verifexit(parent != NULL);
+	state = ia_css_process_get_state(process);
+
+	parent_state = ia_css_process_group_get_state(parent);
+
+	/* TODO : separate process group start and run from
+	*	  process_group_exec_cmd()
+	*/
+	verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
+		   (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
+		   (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
+	verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
+	verifexit(dfm_dev_id <= VIED_NCI_N_DEV_DFM_ID);
+	process_ext->dfm_active_port_bitmap[dfm_dev_id] = bitmap;
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_set_dfm_active_port_bitmap invalid argument\n");
+	}
+	return retval;
+}
+#endif /* HAS_DFM */
+
+int ia_css_process_clear_all(
+	ia_css_process_t *process)
+{
+	int	retval = -1;
+	ia_css_process_group_t			*parent;
+	ia_css_process_group_state_t	parent_state;
+	ia_css_process_state_t			state;
+	ia_css_process_ext_t *process_ext;
+	int	mem_index;
+	int	dev_chn_index;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		       "ia_css_process_clear_all(): enter:\n");
+
+	verifexit(process != NULL);
+	process_ext = ia_css_process_get_extension(process);
+
+	state = ia_css_process_get_state(process);
+
+	parent = ia_css_process_get_parent(process);
+	if (parent != NULL) {
+		parent_state = ia_css_process_group_get_state(parent);
+	} else {
+		parent_state = IA_CSS_N_PROCESS_GROUP_STATES;
+	}
+
+/* Resource clear can only be called in excluded states contrary to set */
+	verifexit((parent_state != IA_CSS_PROCESS_GROUP_RUNNING) ||
+		   (parent_state == IA_CSS_N_PROCESS_GROUP_STATES));
+	verifexit((state == IA_CSS_PROCESS_CREATED) ||
+		  (state == IA_CSS_PROCESS_READY));
+
+#if VIED_NCI_N_DEV_CHN_ID > 0
+	if (process_ext != NULL) {
+		for (dev_chn_index = 0; dev_chn_index < VIED_NCI_N_DEV_CHN_ID;
+			dev_chn_index++) {
+			process_ext->dev_chn_offset[dev_chn_index] =
+				IA_CSS_PROCESS_INVALID_OFFSET;
+		}
+	}
+#else
+	NOT_USED(dev_chn_index);
+#endif /* VIED_NCI_N_DEV_CHN_ID */
+	if (process_ext != NULL) {
+		/* No difference whether a cell_id has been set or not, clear all */
+		for (mem_index = 0; mem_index < VIED_NCI_N_DATA_MEM_TYPE_ID;
+			mem_index++) {
+			process_ext->ext_mem_id[mem_index] = VIED_NCI_N_MEM_ID;
+			process_ext->ext_mem_offset[mem_index] =
+				IA_CSS_PROCESS_INVALID_OFFSET;
+		}
+	}
+
+	ia_css_process_cells_clear(process);
+
+	retval = 0;
+EXIT:
+	if (NULL == process) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_clear_all invalid argument process\n");
+	}
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_clear_all failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+int ia_css_process_acquire(
+	ia_css_process_t *process)
+{
+	int	retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_acquire(): enter:\n");
+
+	verifexit(process != NULL);
+
+	retval = 0;
+EXIT:
+	if (NULL == process) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_acquire invalid argument process\n");
+	}
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_acquire failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+int ia_css_process_release(
+	ia_css_process_t *process)
+{
+	int	retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_release(): enter:\n");
+
+	verifexit(process != NULL);
+
+	retval = 0;
+EXIT:
+	if (NULL == process) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_t invalid argument process\n");
+	}
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_release failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+int ia_css_process_print(const ia_css_process_t *process, void *fid)
+{
+	int		retval = -1;
+	int		i, dev_chn_index;
+	uint16_t mem_index;
+	uint8_t	cell_dependency_count, terminal_dependency_count;
+	ia_css_process_ext_t *process_ext;
+	NOT_USED(fid);
+
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_print(process 0x%lx): enter:\n", (unsigned long int)process);
+
+	verifexit(process != NULL);
+	process_ext = ia_css_process_get_extension(process);
+
+	IA_CSS_TRACE_7(PSYSAPI_DYNAMIC, INFO,
+	"\tprocess 0x%lx, sizeof %d, program_idx %d, programID %d, state %d, parent 0x%lx, cell %d\n",
+		(unsigned long int)process,
+		(int)ia_css_process_get_size(process),
+		(int)ia_css_process_get_program_idx(process),
+		(int)ia_css_process_get_program_ID(process),
+		(int)ia_css_process_get_state(process),
+		(unsigned long int)ia_css_process_get_parent(process),
+		(int)ia_css_process_get_cell(process));
+
+	if (process_ext != NULL) {
+		for (mem_index = 0; mem_index < (int)VIED_NCI_N_DATA_MEM_TYPE_ID;
+			mem_index++) {
+			/* TODO: in case of an cells_bitmap = [],
+			* vied_nci_cell_get_mem_type will return a wrong result.
+			*/
+			IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
+				"\texternal index %d, type %d, id %d offset 0x%x\n",
+				mem_index,
+				(int)vied_nci_cell_get_mem_type(ia_css_process_get_cell(process),
+								mem_index),
+				(int)(process_ext->ext_mem_id[mem_index]),
+				process_ext->ext_mem_offset[mem_index]);
+		}
+#if VIED_NCI_N_DEV_CHN_ID > 0
+		for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_CHN_ID;
+			dev_chn_index++) {
+			IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
+				"\tdevice channel index %d, type %d, offset 0x%x\n",
+				dev_chn_index,
+				(int)dev_chn_index,
+				process_ext->dev_chn_offset[dev_chn_index]);
+		}
+#else
+		NOT_USED(dev_chn_index);
+#endif /* VIED_NCI_N_DEV_CHN_ID */
+#if HAS_DFM
+		for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_DFM_ID;
+			dev_chn_index++) {
+			IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
+				"\tdfm device index %d, type %d, bitmap 0x%x active_ports_bitmap 0x%x\n",
+				dev_chn_index, dev_chn_index,
+				process_ext->dfm_port_bitmap[dev_chn_index],
+				process_ext->dfm_active_port_bitmap[dev_chn_index]);
+		}
+#endif
+	}
+
+	for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
+		IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
+			"\tcells[%d] = 0x%x\n",
+			i, ia_css_process_cells_get_cell(process, i));
+	}
+
+	cell_dependency_count =
+		ia_css_process_get_cell_dependency_count(process);
+	if (cell_dependency_count == 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+			"\tcell_dependencies[%d] {};\n", cell_dependency_count);
+	} else {
+		vied_nci_resource_id_t cell_dependency;
+
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+			"\tcell_dependencies[%d] {", cell_dependency_count);
+		for (i = 0; i < (int)cell_dependency_count - 1; i++) {
+			cell_dependency =
+				ia_css_process_get_cell_dependency(process, i);
+			IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+				"%4d, ", cell_dependency);
+		}
+		cell_dependency =
+			ia_css_process_get_cell_dependency(process, i);
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+			"%4d}\n", cell_dependency);
+		(void)cell_dependency;
+	}
+
+	terminal_dependency_count =
+		ia_css_process_get_terminal_dependency_count(process);
+	if (terminal_dependency_count == 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+			"\tterminal_dependencies[%d] {};\n",
+			terminal_dependency_count);
+	} else {
+		uint8_t terminal_dependency;
+
+		terminal_dependency_count =
+			ia_css_process_get_terminal_dependency_count(process);
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+			"\tterminal_dependencies[%d] {",
+			terminal_dependency_count);
+		for (i = 0; i < (int)terminal_dependency_count - 1; i++) {
+			terminal_dependency =
+			     ia_css_process_get_terminal_dependency(process, i);
+			IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+				"%4d, ", terminal_dependency);
+		}
+		terminal_dependency =
+			ia_css_process_get_terminal_dependency(process, i);
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+			"%4d}\n", terminal_dependency);
+		(void)terminal_dependency;
+	}
+
+	retval = 0;
+EXIT:
+	if (NULL == process) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_print invalid argument process\n");
+	}
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_print failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+int ia_css_process_set_parent(
+	ia_css_process_t					*process,
+	ia_css_process_group_t					*parent)
+{
+	int	retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		       "ia_css_process_set_parent(): enter:\n");
+
+	verifexit(process != NULL);
+	verifexit(parent != NULL);
+
+	process->parent_offset = (uint16_t) ((char *)parent - (char *)process);
+	retval = 0;
+EXIT:
+	if (NULL == process || NULL == parent) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_set_parent invalid argument\n");
+	}
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_set_parent failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+int ia_css_process_set_cell_dependency(
+	const ia_css_process_t					*process,
+	const unsigned int					dep_index,
+	const vied_nci_resource_id_t				id)
+{
+	int retval = -1;
+	uint8_t *process_dep_ptr;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_set_cell_dependency(): enter:\n");
+	verifexit(process != NULL);
+
+	process_dep_ptr =
+		(uint8_t *)process + process->cell_dependencies_offset +
+			   dep_index*sizeof(vied_nci_resource_id_t);
+
+	*process_dep_ptr = id;
+	retval = 0;
+EXIT:
+	return retval;
+}
+
+int ia_css_process_set_terminal_dependency(
+	const ia_css_process_t				*process,
+	const unsigned int				dep_index,
+	const vied_nci_resource_id_t		id)
+{
+	int retval = -1;
+	uint8_t *terminal_dep_ptr;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_set_terminal_dependency(): enter:\n");
+	verifexit(process != NULL);
+	verifexit(ia_css_process_get_terminal_dependency_count(process) > dep_index);
+
+	terminal_dep_ptr =
+		(uint8_t *)process + process->terminal_dependencies_offset +
+			   dep_index*sizeof(uint8_t);
+
+	*terminal_dep_ptr = id;
+	retval = 0;
+EXIT:
+	return retval;
+}
+
+#endif /* !defined(__HIVECC) */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group.c
new file mode 100644
index 000000000000..f03eb53bc12f
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group.c
@@ -0,0 +1,826 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ia_css_psys_process_group.h"
+#include "ia_css_psys_dynamic_storage_class.h"
+#include "ia_css_psys_dynamic_trace.h"
+#include "ia_css_program_group_param_private.h"
+
+/*
+ * Functions to possibly inline
+ */
+
+#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
+#include "ia_css_psys_process_group_impl.h"
+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
+
+/*
+ * Functions not to inline
+ */
+
+/* This header is need for cpu memset to 0
+* and process groups are not created in SP
+*/
+#if !defined(__VIED_CELL)
+#include "cpu_mem_support.h"
+#endif
+
+/* This source file is created with the intention of sharing and
+* compiled for host and firmware. Since there is no native 64bit
+* data type support for firmware this wouldn't compile for SP
+* tile. The part of the file that is not compilable are marked
+* with the following __VIED_CELL marker and this comment. Once we
+* come up with a solution to address this issue this will be
+* removed.
+*/
+#if !defined(__VIED_CELL)
+
+/*  FUNCTION IS PRIVATE TO THIS MODULE; other C files in this module need it */
+bool ia_css_process_group_is_program_enabled(
+	const ia_css_program_manifest_t *program_manifest,
+	ia_css_kernel_bitmap_t enable_bitmap)
+{
+	ia_css_kernel_bitmap_t program_bitmap =
+		ia_css_program_manifest_get_kernel_bitmap(program_manifest);
+	ia_css_program_type_t program_type =
+		ia_css_program_manifest_get_type(program_manifest);
+	ia_css_kernel_bitmap_t program_enable_bitmap;
+
+	if (!ia_css_is_kernel_bitmap_intersection_empty(enable_bitmap,
+				program_bitmap)) {
+
+		if (program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB ||
+			program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER ||
+			program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) {
+			/*
+			 * EXCLUSIVE_SUB programs are subsets of
+			 * EXCLUSIVE_SUPER so the bits of the enable_bitmap
+			 * that refer to those are those of their
+			 * EXCLUSIVE_SUPER program (on which the depend) and
+			 * not the subset that their own program_bitmap has
+			 */
+			if (program_type ==
+					IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB ||
+					program_type ==
+					IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) {
+				ia_css_kernel_bitmap_t super_program_bitmap;
+
+				const ia_css_program_group_manifest_t *
+					prog_group_manifest =
+			ia_css_program_manifest_get_parent(program_manifest);
+				uint8_t super_prog_idx =
+				ia_css_program_manifest_get_program_dependency(
+						program_manifest, 0);
+				const ia_css_program_manifest_t	*
+					super_program_manifest =
+			ia_css_program_group_manifest_get_prgrm_mnfst(
+					prog_group_manifest, super_prog_idx);
+
+				verifexit(super_program_manifest != NULL);
+				if (((program_type ==
+					IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
+					(ia_css_program_manifest_get_type(
+					super_program_manifest) !=
+					IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER))
+					|| ((program_type ==
+					IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) &&
+					(ia_css_program_manifest_get_type(
+					super_program_manifest) !=
+					IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER))) {
+					IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+						"ia_css_process_group_is_program_enabled(): Error\n");
+					verifexit(0);
+				}
+
+				super_program_bitmap =
+				ia_css_program_manifest_get_kernel_bitmap(
+						super_program_manifest);
+				program_enable_bitmap =
+					ia_css_kernel_bitmap_intersection(
+						enable_bitmap,
+						super_program_bitmap);
+			} else {
+				program_enable_bitmap =
+					ia_css_kernel_bitmap_intersection(
+						enable_bitmap, program_bitmap);
+			}
+
+			if (ia_css_is_kernel_bitmap_equal(
+				program_enable_bitmap, program_bitmap)) {
+				return true;
+			}
+		} else if (program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER) {
+			/*
+			 * Virtual super programs are not selectable
+			 * only the virtual sub programs
+			 */
+			return false;
+		} else {
+			return true;
+		}
+	}
+
+EXIT:
+	return false;
+}
+
+size_t ia_css_sizeof_process_group(
+	const ia_css_program_group_manifest_t *manifest,
+	const ia_css_program_group_param_t *param)
+{
+	size_t size = 0, tmp_size;
+	int i, error_val = -1;
+	uint8_t	process_count, process_num;
+	uint8_t terminal_count;
+	ia_css_kernel_bitmap_t enable_bitmap;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_sizeof_process_group(): enter:\n");
+
+	verifexit(manifest != NULL);
+	verifexit(param != NULL);
+
+	COMPILATION_ERROR_IF(
+		SIZE_OF_PROCESS_GROUP_STRUCT_BITS !=
+			(CHAR_BIT * sizeof(ia_css_process_group_t)));
+
+	COMPILATION_ERROR_IF(0 !=
+			sizeof(ia_css_process_group_t) % sizeof(uint64_t));
+
+	process_count =
+		ia_css_process_group_compute_process_count(manifest, param);
+	terminal_count =
+		ia_css_process_group_compute_terminal_count(manifest, param);
+
+	verifexit(process_count != 0);
+	verifexit(terminal_count != 0);
+
+	size += sizeof(ia_css_process_group_t);
+
+	tmp_size = process_count * sizeof(uint16_t);
+	size += tot_bytes_for_pow2_align(sizeof(uint64_t), tmp_size);
+
+	tmp_size = terminal_count * sizeof(uint16_t);
+	size += tot_bytes_for_pow2_align(sizeof(uint64_t), tmp_size);
+
+	enable_bitmap =
+		ia_css_program_group_param_get_kernel_enable_bitmap(param);
+	process_num = 0;
+	for (i = 0; i < (int)ia_css_program_group_manifest_get_program_count(
+				manifest); i++) {
+		ia_css_program_manifest_t *program_manifest =
+		ia_css_program_group_manifest_get_prgrm_mnfst(manifest, i);
+		ia_css_program_param_t *program_param =
+			ia_css_program_group_param_get_program_param(param, i);
+
+		if (ia_css_process_group_is_program_enabled(
+					program_manifest, enable_bitmap)) {
+			verifexit(process_num < process_count);
+			size += ia_css_sizeof_process(
+					program_manifest, program_param);
+			process_num++;
+		}
+	}
+
+	verifexit(process_num == process_count);
+
+	for (i = 0; i < (int)ia_css_program_group_manifest_get_terminal_count(
+				manifest); i++) {
+		ia_css_terminal_manifest_t *terminal_manifest =
+			ia_css_program_group_manifest_get_term_mnfst(
+					manifest, i);
+
+		if (ia_css_process_group_is_terminal_enabled(
+					terminal_manifest, enable_bitmap)) {
+			size += ia_css_sizeof_terminal(
+					terminal_manifest, param);
+		}
+	}
+
+	error_val = 0;
+
+EXIT:
+	if (NULL == manifest || NULL == param) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_sizeof_process_group invalid argument\n");
+	}
+	if (error_val != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_sizeof_process_group ERROR(%d)\n", error_val);
+	}
+	return error_val ? 0 : size;
+}
+
+ia_css_process_group_t *ia_css_process_group_create(
+	void *process_grp_mem,
+	const ia_css_program_group_manifest_t *manifest,
+	const ia_css_program_group_param_t *param)
+{
+	size_t size = ia_css_sizeof_process_group(manifest, param);
+	int retval = -1;
+	int ret;
+	int i;
+	ia_css_process_group_t *process_group = NULL;
+	uint8_t process_count, process_num;
+	uint8_t	terminal_count, terminal_num;
+	uint16_t fragment_count;
+	char *process_grp_raw_ptr;
+	uint16_t *process_tab_ptr, *terminal_tab_ptr;
+	ia_css_kernel_bitmap_t enable_bitmap;
+	uint8_t manifest_terminal_count;
+
+	IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_group_create(process_grp_mem %p, manifest %p, group_param %p): enter:\n",
+		process_grp_mem, manifest, param);
+
+	verifexit(process_grp_mem != NULL);
+	verifexit(manifest != NULL);
+	verifexit(param != NULL);
+	verifexit(ia_css_is_program_group_manifest_valid(manifest));
+	verifexit(size != 0);
+
+	process_group = (ia_css_process_group_t	*)process_grp_mem;
+	ia_css_cpu_mem_set_zero(process_group, size);
+	process_grp_raw_ptr = (char *) process_group;
+
+	process_group->state = IA_CSS_PROCESS_GROUP_CREATED;
+
+	process_group->protocol_version =
+		ia_css_program_group_param_get_protocol_version(param);
+
+	fragment_count = ia_css_program_group_param_get_fragment_count(param);
+	process_count =
+		ia_css_process_group_compute_process_count(manifest, param);
+	terminal_count =
+		ia_css_process_group_compute_terminal_count(manifest, param);
+	enable_bitmap =
+		ia_css_program_group_param_get_kernel_enable_bitmap(param);
+
+	process_group->fragment_count = fragment_count;
+	process_group->process_count = process_count;
+	process_group->terminal_count = terminal_count;
+	process_group->kernel_bitmap = enable_bitmap;
+
+	process_grp_raw_ptr += sizeof(ia_css_process_group_t);
+	process_tab_ptr = (uint16_t *) process_grp_raw_ptr;
+	process_group->processes_offset =
+		(uint16_t)(process_grp_raw_ptr - (char *)process_group);
+
+	process_grp_raw_ptr += tot_bytes_for_pow2_align(
+			sizeof(uint64_t), process_count * sizeof(uint16_t));
+	terminal_tab_ptr = (uint16_t *) process_grp_raw_ptr;
+	process_group->terminals_offset =
+		(uint16_t)(process_grp_raw_ptr - (char *)process_group);
+
+	/* Move raw pointer to the first process */
+	process_grp_raw_ptr += tot_bytes_for_pow2_align(
+			sizeof(uint64_t), terminal_count * sizeof(uint16_t));
+
+	/* Set default */
+	verifexit(ia_css_process_group_set_fragment_limit(
+				process_group, fragment_count) == 0);
+
+	/* Set process group terminal dependency list */
+	/* This list is used during creating the process dependency list */
+	manifest_terminal_count =
+		ia_css_program_group_manifest_get_terminal_count(manifest);
+
+	terminal_num = 0;
+	for (i = 0; i < (int)manifest_terminal_count; i++) {
+		ia_css_terminal_manifest_t *t_manifest =
+			ia_css_program_group_manifest_get_term_mnfst(
+					manifest, i);
+
+		verifexit(NULL != t_manifest);
+
+		if (ia_css_process_group_is_terminal_enabled(
+					t_manifest, enable_bitmap)) {
+			ia_css_terminal_t *terminal = NULL;
+			ia_css_terminal_param_t *terminal_param =
+				ia_css_program_group_param_get_terminal_param(
+						param, i);
+
+			verifexit(NULL != terminal_param);
+			terminal_tab_ptr[terminal_num] =
+				(uint16_t)(process_grp_raw_ptr -
+						(char *)process_group);
+			terminal = ia_css_terminal_create(
+					process_grp_raw_ptr, t_manifest,
+					terminal_param, enable_bitmap);
+			verifexit(terminal != NULL);
+			verifexit((ia_css_terminal_set_parent(
+					terminal, process_group) == 0));
+			verifexit((ia_css_terminal_set_terminal_manifest_index(
+					terminal, i) == 0));
+			IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+				"ia_css_process_group_create: terminal_manifest_index %d\n",
+				i);
+
+			process_grp_raw_ptr += ia_css_terminal_get_size(
+							terminal);
+			terminal_num++;
+		} else {
+			IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO, "Skip terminal %d\n", i);
+		}
+	}
+	verifexit(terminal_num == terminal_count);
+
+	process_num = 0;
+	for (i = 0; i < (int)ia_css_program_group_manifest_get_program_count(
+				manifest); i++) {
+		ia_css_process_t *process = NULL;
+		ia_css_program_manifest_t *program_manifest =
+			ia_css_program_group_manifest_get_prgrm_mnfst(
+					manifest, i);
+		ia_css_program_param_t *program_param =
+			ia_css_program_group_param_get_program_param(param, i);
+		unsigned int prog_dep_index, proc_dep_index;
+		unsigned int term_dep_index, term_index;
+
+		verifexit(program_manifest != 0);
+		verifexit(program_param    != NULL);
+
+		if (ia_css_process_group_is_program_enabled(
+					program_manifest, enable_bitmap)) {
+
+			verifexit(process_num < process_count);
+
+			process_tab_ptr[process_num] =
+				(uint16_t)(process_grp_raw_ptr -
+						(char *)process_group);
+
+			/* instead of using program_param,
+			 * we can provide this directly to ia_css_process_create.
+			 * The corresponding public setter function is deprecated and will assert
+			 * upon use. */
+			program_param->kernel_enable_bitmap =
+				ia_css_kernel_bitmap_intersection(
+						ia_css_program_manifest_get_kernel_bitmap(program_manifest),
+						/*pg*/enable_bitmap);
+
+			process = ia_css_process_create(
+					process_grp_raw_ptr,
+					program_manifest,
+					program_param,
+					i);
+			verifexit(process != NULL);
+
+			ia_css_process_set_parent(process, process_group);
+			if (ia_css_has_program_manifest_fixed_cell(
+						program_manifest)) {
+				vied_nci_cell_ID_t cell_id =
+					ia_css_program_manifest_get_cell_ID(
+							program_manifest);
+
+				IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+					"ia_css_process_group_create: cell_id %d\n",
+					cell_id);
+				ia_css_process_set_cell(process, cell_id);
+			}
+
+			process_grp_raw_ptr += ia_css_process_get_size(
+					process);
+			/*
+			 * Set process dependencies of process derived
+			 * from program manifest
+			 */
+			for (prog_dep_index = 0; prog_dep_index <
+			ia_css_program_manifest_get_program_dependency_count(
+				program_manifest); prog_dep_index++) {
+				uint8_t dep_prog_idx =
+				ia_css_program_manifest_get_program_dependency(
+					program_manifest, prog_dep_index);
+				const ia_css_program_manifest_t *
+				dep_prg_manifest =
+			ia_css_program_group_manifest_get_prgrm_mnfst(
+					manifest, dep_prog_idx);
+				ia_css_program_ID_t id =
+				ia_css_program_manifest_get_program_ID(
+						dep_prg_manifest);
+
+				verifexit(id != 0);
+				for (proc_dep_index = 0;
+						proc_dep_index < process_num;
+						proc_dep_index++) {
+					ia_css_process_t *dep_process =
+					ia_css_process_group_get_process(
+							process_group,
+							proc_dep_index);
+
+					ia_css_process_set_cell_dependency(
+							process,
+							prog_dep_index, 0);
+
+				if (ia_css_process_get_program_ID(
+						dep_process) == id) {
+					ia_css_process_set_cell_dependency(
+							process,
+							prog_dep_index,
+							proc_dep_index);
+						break;
+					}
+				}
+			}
+			process_num++;
+
+			/*
+			 * Set terminal dependencies of process derived
+			 * from program manifest
+			 */
+			for (term_dep_index = 0; term_dep_index <
+			ia_css_program_manifest_get_terminal_dependency_count(
+				program_manifest); term_dep_index++) {
+				uint8_t pm_term_index =
+				ia_css_program_manifest_get_terminal_dependency
+					(program_manifest, term_dep_index);
+
+				verifexit(pm_term_index < manifest_terminal_count);
+				IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
+					"ia_css_process_group_create(): term_dep_index: %d, pm_term_index: %d\n",
+					term_dep_index, pm_term_index);
+				for (term_index = 0;
+					term_index < terminal_count;
+					term_index++) {
+					ia_css_terminal_t *terminal =
+					ia_css_process_group_get_terminal(
+							process_group,
+							term_index);
+
+				if (ia_css_terminal_get_terminal_manifest_index
+						(terminal) == pm_term_index) {
+					ia_css_process_set_terminal_dependency(
+							process,
+							term_dep_index,
+							term_index);
+					IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
+						"ia_css_process_group_create() set_terminal_dependency(process: %d, dep_idx: %d, term_idx: %d)\n",
+						i, term_dep_index, term_index);
+
+						break;
+					}
+				}
+			}
+		}
+	}
+	verifexit(process_num == process_count);
+
+	process_group->size =
+		(uint32_t)ia_css_sizeof_process_group(manifest, param);
+	process_group->ID =
+		ia_css_program_group_manifest_get_program_group_ID(manifest);
+
+	/* Initialize performance measurement fields to zero */
+	process_group->pg_load_start_ts		= 0;
+	process_group->pg_load_cycles		= 0;
+	process_group->pg_init_cycles		= 0;
+	process_group->pg_processing_cycles	= 0;
+	process_group->pg_complete_cycles	= 0;
+
+	process_group->error_handling_enable = 0;
+
+	verifexit(process_group->size != 0);
+	verifexit(process_group->ID != 0);
+
+	ret = ia_css_process_group_on_create(process_group, manifest, param);
+	verifexit(ret == 0);
+
+	process_group->state = IA_CSS_PROCESS_GROUP_READY;
+	retval = 0;
+
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_group_create(): Created successfully process group ID 0x%x\n",
+		process_group->ID);
+
+EXIT:
+	if (NULL == process_grp_mem || NULL == manifest || NULL == param) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_group_create invalid argument\n");
+	}
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_create failed (%i)\n", retval);
+		process_group = ia_css_process_group_destroy(process_group);
+	}
+	return process_group;
+}
+
+ia_css_process_group_t *ia_css_process_group_destroy(
+	ia_css_process_group_t *process_group)
+{
+	if (process_group != NULL) {
+		ia_css_process_group_on_destroy(process_group);
+		process_group = NULL;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_group_destroy invalid argument\n");
+	}
+	return process_group;
+}
+
+int ia_css_process_group_submit(
+	ia_css_process_group_t *process_group)
+{
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_group_submit(): enter:\n");
+
+	return ia_css_process_group_exec_cmd(process_group,
+		IA_CSS_PROCESS_GROUP_CMD_SUBMIT);
+}
+
+int ia_css_process_group_start(
+	ia_css_process_group_t *process_group)
+{
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_group_start(): enter:\n");
+
+	return ia_css_process_group_exec_cmd(process_group,
+		IA_CSS_PROCESS_GROUP_CMD_START);
+}
+
+int ia_css_process_group_stop(
+	ia_css_process_group_t *process_group)
+{
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_group_stop(): enter:\n");
+
+	return ia_css_process_group_exec_cmd(process_group,
+		IA_CSS_PROCESS_GROUP_CMD_STOP);
+}
+
+int ia_css_process_group_run(
+	ia_css_process_group_t *process_group)
+{
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_group_run(): enter:\n");
+
+	return ia_css_process_group_exec_cmd(process_group,
+		IA_CSS_PROCESS_GROUP_CMD_RUN);
+}
+
+int ia_css_process_group_suspend(
+	ia_css_process_group_t *process_group)
+{
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_group_suspend(): enter:\n");
+
+	return ia_css_process_group_exec_cmd(process_group,
+		IA_CSS_PROCESS_GROUP_CMD_SUSPEND);
+}
+
+int ia_css_process_group_resume(
+	ia_css_process_group_t *process_group)
+{
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_group_resume(): enter:\n");
+
+	return ia_css_process_group_exec_cmd(process_group,
+		IA_CSS_PROCESS_GROUP_CMD_RESUME);
+}
+
+int ia_css_process_group_reset(
+	ia_css_process_group_t *process_group)
+{
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_group_reset(): enter:\n");
+
+	return ia_css_process_group_exec_cmd(process_group,
+		IA_CSS_PROCESS_GROUP_CMD_RESET);
+}
+
+int ia_css_process_group_abort(
+	ia_css_process_group_t *process_group)
+{
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_group_abort(): enter:\n");
+
+	return ia_css_process_group_exec_cmd(process_group,
+		IA_CSS_PROCESS_GROUP_CMD_ABORT);
+}
+
+int ia_css_process_group_disown(
+	ia_css_process_group_t *process_group)
+{
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_process_group_disown(): enter:\n");
+
+	return ia_css_process_group_exec_cmd(process_group,
+		IA_CSS_PROCESS_GROUP_CMD_DISOWN);
+}
+
+uint64_t ia_css_process_group_get_token(
+	ia_css_process_group_t *process_group)
+{
+	uint64_t token = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_token(): enter:\n");
+
+	verifexit(process_group != NULL);
+
+	token = process_group->token;
+
+EXIT:
+	if (NULL == process_group) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_group_get_token invalid argument\n");
+	}
+	return token;
+}
+
+int ia_css_process_group_set_token(
+	ia_css_process_group_t *process_group,
+	const uint64_t token)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_set_token(): enter:\n");
+
+	verifexit(process_group != NULL);
+	verifexit(token != 0);
+
+	process_group->token = token;
+
+	retval = 0;
+EXIT:
+	if (NULL == process_group || 0 == token) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_group_set_token invalid argument\n");
+	}
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_set_token failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+uint64_t ia_css_process_group_get_private_token(
+	ia_css_process_group_t *process_group)
+{
+	uint64_t token = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_get_private_token(): enter:\n");
+
+	verifexit(process_group != NULL);
+
+	token = process_group->private_token;
+
+EXIT:
+	if (NULL == process_group) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_group_get_private_token invalid argument\n");
+	}
+	return token;
+}
+
+int ia_css_process_group_set_private_token(
+	ia_css_process_group_t *process_group,
+	const uint64_t token)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_set_private_token(): enter:\n");
+
+	verifexit(process_group != NULL);
+	verifexit(token != 0);
+
+	process_group->private_token = token;
+
+	retval = 0;
+EXIT:
+	if (NULL == process_group || 0 == token) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_group_set_private_token invalid argument\n");
+	}
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_process_group_set_private_token failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+uint8_t ia_css_process_group_compute_process_count(
+	const ia_css_program_group_manifest_t *manifest,
+	const ia_css_program_group_param_t *param)
+{
+	uint8_t process_count = 0;
+	ia_css_kernel_bitmap_t total_bitmap;
+	ia_css_kernel_bitmap_t enable_bitmap;
+	int i;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_compute_process_count(): enter:\n");
+
+	verifexit(manifest != NULL);
+	verifexit(param != NULL);
+
+	total_bitmap =
+		ia_css_program_group_manifest_get_kernel_bitmap(manifest);
+	enable_bitmap =
+		ia_css_program_group_param_get_kernel_enable_bitmap(param);
+
+	verifexit(ia_css_is_program_group_manifest_valid(manifest));
+	verifexit(ia_css_is_kernel_bitmap_subset(total_bitmap, enable_bitmap));
+	verifexit(!ia_css_is_kernel_bitmap_empty(enable_bitmap));
+
+	for (i = 0; i <
+		(int)ia_css_program_group_manifest_get_program_count(manifest);
+			i++) {
+		ia_css_program_manifest_t *program_manifest =
+			ia_css_program_group_manifest_get_prgrm_mnfst(
+					manifest, i);
+		ia_css_kernel_bitmap_t program_bitmap =
+			ia_css_program_manifest_get_kernel_bitmap(
+					program_manifest);
+		/*
+		 * Programs can be orthogonal,
+		 * a mutually exclusive subset,
+		 * or a concurrent subset
+		 */
+		if (!ia_css_is_kernel_bitmap_intersection_empty(enable_bitmap,
+					program_bitmap)) {
+			ia_css_program_type_t program_type =
+				ia_css_program_manifest_get_type(
+						program_manifest);
+			/*
+			 * An exclusive subnode < exclusive supernode,
+			 * so simply don't count it
+			 */
+			if (program_type !=
+				IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB &&
+				program_type !=
+				IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) {
+				process_count++;
+			}
+		}
+	}
+
+EXIT:
+	if (NULL == manifest || NULL == param) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_group_compute_process_count invalid argument\n");
+	}
+	return process_count;
+}
+
+uint8_t ia_css_process_group_compute_terminal_count(
+	const ia_css_program_group_manifest_t *manifest,
+	const ia_css_program_group_param_t *param)
+{
+	uint8_t terminal_count = 0;
+	ia_css_kernel_bitmap_t total_bitmap, enable_bitmap;
+	int i;
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_process_group_compute_terminal_count(): enter:\n");
+
+	verifexit(manifest != NULL);
+	verifexit(param != NULL);
+
+	total_bitmap =
+		ia_css_program_group_manifest_get_kernel_bitmap(manifest);
+	enable_bitmap =
+		ia_css_program_group_param_get_kernel_enable_bitmap(param);
+
+	verifexit(ia_css_is_program_group_manifest_valid(manifest));
+	verifexit(ia_css_is_kernel_bitmap_subset(total_bitmap, enable_bitmap));
+	verifexit(!ia_css_is_kernel_bitmap_empty(enable_bitmap));
+
+	for (i = 0; i <
+		(int)ia_css_program_group_manifest_get_terminal_count(
+			manifest); i++) {
+		ia_css_terminal_manifest_t *tmanifest =
+			ia_css_program_group_manifest_get_term_mnfst(
+					manifest, i);
+
+		if (ia_css_process_group_is_terminal_enabled(
+					tmanifest, enable_bitmap)) {
+			terminal_count++;
+		}
+	}
+
+EXIT:
+	if (NULL == manifest || NULL == param) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_process_group_compute_terminal_count invalid argument\n");
+	}
+	return terminal_count;
+}
+#endif /* !defined(__VIED_CELL) */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group_cmd_impl.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group_cmd_impl.c
new file mode 100644
index 000000000000..7ee4448a894d
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group_cmd_impl.c
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ia_css_psys_process_group_cmd_impl.h"
+#include "ia_css_psysapi.h"
+#include "ia_css_psys_process.h"
+#include "ia_css_psys_process.psys.h"
+#include "ia_css_psys_process_group.h"
+#include "ia_css_psys_process_group.psys.h"
+#include "error_support.h"
+#include "vied_nci_psys_system_global.h"
+#include "misc_support.h"
+
+#include "ia_css_psys_sim_trace.h"
+
+/* Dummy implementation for sim */
+int ia_css_process_group_on_create(
+	ia_css_process_group_t					*process_group,
+	const ia_css_program_group_manifest_t	*program_group_manifest,
+	const ia_css_program_group_param_t		*program_group_param)
+{
+	NOT_USED(process_group);
+	NOT_USED(program_group_manifest);
+	NOT_USED(program_group_param);
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, INFO, "ia_css_process_group_on_create(): enter: \n");
+
+	return 0;
+}
+
+/* Dummy implementation for sim */
+int ia_css_process_group_on_destroy(
+	ia_css_process_group_t					*process_group)
+{
+	NOT_USED(process_group);
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, INFO, "ia_css_process_group_on_destroy(): enter: \n");
+
+	return 0;
+}
+
+int ia_css_process_group_exec_cmd(
+	ia_css_process_group_t					*process_group,
+	const ia_css_process_group_cmd_t		cmd)
+{
+	int	retval = -1;
+	ia_css_process_group_state_t	state;
+
+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "ia_css_process_group_exec_cmd(): enter: \n");
+
+	state = ia_css_process_group_get_state(process_group);
+
+	verifexit(process_group != NULL);
+	verifexit(state != IA_CSS_PROCESS_GROUP_ERROR);
+	verifexit(state < IA_CSS_N_PROCESS_GROUP_STATES);
+
+	switch (cmd) {
+	case IA_CSS_PROCESS_GROUP_CMD_NOP:
+		break;
+	case IA_CSS_PROCESS_GROUP_CMD_SUBMIT:
+		verifexit(state == IA_CSS_PROCESS_GROUP_READY);
+
+/* External resource availability checks */
+		verifexit(ia_css_can_process_group_submit(process_group));
+
+		process_group->state = IA_CSS_PROCESS_GROUP_BLOCKED;
+		break;
+	case IA_CSS_PROCESS_GROUP_CMD_ATTACH:
+		verifexit(state == IA_CSS_PROCESS_GROUP_READY);
+		break;
+	case IA_CSS_PROCESS_GROUP_CMD_DETACH:
+		verifexit(state == IA_CSS_PROCESS_GROUP_READY);
+		break;
+	case IA_CSS_PROCESS_GROUP_CMD_START:
+		verifexit(state == IA_CSS_PROCESS_GROUP_BLOCKED);
+
+/* External resource state checks */
+		verifexit(ia_css_can_process_group_start(process_group));
+
+		process_group->state = IA_CSS_PROCESS_GROUP_STARTED;
+		break;
+	case IA_CSS_PROCESS_GROUP_CMD_DISOWN:
+
+		/* empty call to match API ownership change between host and firmware */
+
+		break;
+	case IA_CSS_PROCESS_GROUP_CMD_RUN:
+		verifexit(state == IA_CSS_PROCESS_GROUP_STARTED);
+		process_group->state = IA_CSS_PROCESS_GROUP_RUNNING;
+		break;
+	case IA_CSS_PROCESS_GROUP_CMD_STOP:
+		verifexit(state == IA_CSS_PROCESS_GROUP_RUNNING);
+		process_group->state = IA_CSS_PROCESS_GROUP_STOPPED;
+		break;
+	case IA_CSS_PROCESS_GROUP_CMD_SUSPEND:
+		verifexit(state == IA_CSS_PROCESS_GROUP_RUNNING);
+		process_group->state = IA_CSS_PROCESS_GROUP_STARTED;
+		break;
+	case IA_CSS_PROCESS_GROUP_CMD_RESUME:
+		verifexit(state == IA_CSS_PROCESS_GROUP_STARTED);
+		process_group->state = IA_CSS_PROCESS_GROUP_RUNNING;
+		break;
+	case IA_CSS_PROCESS_GROUP_CMD_ABORT:
+		verifexit(((state == IA_CSS_PROCESS_GROUP_RUNNING) || (state == IA_CSS_PROCESS_GROUP_STARTED)));
+		process_group->state = IA_CSS_PROCESS_GROUP_STOPPED;
+		break;
+	case IA_CSS_PROCESS_GROUP_CMD_RESET:
+/* We accept a reset command in the stopped state, mostly for simplifying the statemachine test */
+		verifexit(((state == IA_CSS_PROCESS_GROUP_RUNNING) || (state == IA_CSS_PROCESS_GROUP_STARTED) || (state == IA_CSS_PROCESS_GROUP_STOPPED)));
+		process_group->state = IA_CSS_PROCESS_GROUP_BLOCKED;
+		break;
+	case IA_CSS_N_PROCESS_GROUP_CMDS:	/* Fall through */
+	default:
+		verifexit(false);
+		break;
+	}
+
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_SIM, ERROR, "ia_css_process_group_exec_cmd failed (%i)\n", retval);
+	}
+	return retval;
+}
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_group_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_group_manifest.c
new file mode 100644
index 000000000000..d67493b83832
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_group_manifest.c
@@ -0,0 +1,1081 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ia_css_psys_static_storage_class.h"
+#include "ia_css_psys_program_group_manifest.h"
+#include "ia_css_rbm_manifest.h"
+
+#ifndef IPU7_ERROR_MISSING_DISABLE_SECTION
+#include "vied_nci_acb_route_type.h" /* only used for printing. */
+#endif /* IPU7_ERROR_MISSING_DISABLE_SECTION */
+
+/*
+ * Functions to possibly inline
+ */
+
+#ifndef __IA_CSS_PSYS_STATIC_INLINE__
+#include "ia_css_psys_program_group_manifest_impl.h"
+#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
+
+/*
+ * Functions not to inline
+ */
+
+/*
+ * We need to refactor those files in order to
+ * build in the firmware only what is needed,
+ * switches are put current to workaround compilation problems
+ * in the firmware (for example lack of uint64_t support)
+ * supported in the firmware
+ */
+#if !defined(__HIVECC)
+size_t ia_css_sizeof_program_group_manifest(
+	const uint8_t program_count,
+	const uint8_t terminal_count,
+	const uint8_t *program_needs_extension,
+	const uint8_t *program_dependency_count,
+	const uint8_t *terminal_dependency_count,
+	const ia_css_terminal_type_t *terminal_type,
+	const uint16_t *cached_in_param_section_count,
+	const uint16_t *cached_out_param_section_count,
+	const uint16_t *spatial_param_section_count,
+	const uint16_t *fragment_param_section_count,
+	const uint16_t *sliced_param_section_count,
+	const uint16_t *sliced_out_param_section_count,
+	const uint16_t *kernel_fragment_seq_count,
+	const uint16_t *progctrlinit_load_section_counts,
+	const uint16_t *progctrlinit_connect_section_counts)
+{
+	size_t size = 0;
+	int i = 0;
+	int j = 0;
+	int k = 0;
+	int l = 0;
+	int m = 0;
+	int n = 0;
+	int o = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_sizeof_program_group_manifest(): enter:\n");
+
+	verifexit(program_count != 0);
+	verifexit(program_dependency_count != NULL);
+	verifexit(terminal_dependency_count != NULL);
+
+	size += sizeof(ia_css_program_group_manifest_t);
+
+	/* Private payload in the program group manifest */
+	size += ceil_mul(sizeof(struct ia_css_psys_private_pg_data),
+				sizeof(uint64_t));
+	/* RBM manifest in the program group manifest */
+	size += ceil_mul(sizeof(ia_css_rbm_manifest_t),
+				sizeof(uint64_t));
+
+	for (i = 0; i < (int)program_count; i++) {
+		size += ia_css_sizeof_program_manifest(
+				program_needs_extension[i],
+				program_dependency_count[i],
+				terminal_dependency_count[i]);
+	}
+
+	for (i = 0; i < (int)terminal_count; i++) {
+		switch (terminal_type[i]) {
+		case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
+			size += ia_css_param_terminal_manifest_get_size(
+					cached_in_param_section_count[j]);
+			j++;
+			break;
+		case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
+			size += ia_css_param_terminal_manifest_get_size(
+					cached_out_param_section_count[k]);
+			k++;
+			break;
+		case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
+		case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
+			size += ia_css_spatial_param_terminal_manifest_get_size(
+					spatial_param_section_count[l]);
+			l++;
+			break;
+		case IA_CSS_TERMINAL_TYPE_PROGRAM:
+			size += ia_css_program_terminal_manifest_get_size(
+					fragment_param_section_count[m],
+					kernel_fragment_seq_count[m]);
+			m++;
+			break;
+		case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
+			size += ia_css_program_control_init_terminal_manifest_get_size(
+				program_count,
+				progctrlinit_load_section_counts,
+				progctrlinit_connect_section_counts);
+			break;
+		case IA_CSS_TERMINAL_TYPE_DATA_IN:
+		case IA_CSS_TERMINAL_TYPE_DATA_OUT:
+			size += sizeof(ia_css_data_terminal_manifest_t);
+			break;
+		case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
+			size += ia_css_sliced_param_terminal_manifest_get_size(
+					sliced_param_section_count[n]);
+			n++;
+			break;
+		case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
+			size += ia_css_sliced_param_terminal_manifest_get_size(
+				sliced_out_param_section_count[o]);
+			o++;
+			break;
+		default:
+			IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+				"ia_css_sizeof_program_group_manifest invalid argument\n");
+		}
+	}
+
+EXIT:
+	if (0 == program_count || 0 == terminal_count ||
+		NULL == program_dependency_count ||
+		NULL == terminal_dependency_count) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_sizeof_program_group_manifest invalid argument\n");
+	}
+	return size;
+}
+
+/*
+ * Currently, the design of XNR kernel inside the *_pregdc program group,
+ * does not fit the exact model as is being asserted on in
+ * ia_css_is_program_group_manifest_valid. We therefore disable some checks.
+ * Further investigation is needed to determine whether *_pregdc program group
+ * can be canged or that the model must be changed.
+ * #define USE_SIMPLIFIED_GRAPH_MODEL 1 allows multiple programs to be
+ * connected to the same terminal, and it allows a kernel be mapped over
+ * multiple programs.
+ */
+#define USE_SIMPLIFIED_GRAPH_MODEL 1
+
+/*
+ * Model and/or check refinements
+ * - Parallel programs do not yet have mutual exclusive alternatives
+ * - The pgram dependencies do not need to be acyclic
+ * - Parallel programs need to have an equal kernel requirement
+ */
+bool ia_css_is_program_group_manifest_valid(
+	const ia_css_program_group_manifest_t *manifest)
+{
+	int i;
+	bool is_valid = false;
+	uint8_t terminal_count;
+	uint8_t program_count;
+	ia_css_kernel_bitmap_t total_bitmap;
+	ia_css_kernel_bitmap_t check_bitmap;
+	ia_css_kernel_bitmap_t terminal_bitmap;
+	/*
+	 * Use a standard bitmap type for the minimum logic to check the DAG,
+	 * generic functions can be used for the kernel enable bitmaps; Later
+	 */
+	vied_nci_resource_bitmap_t resource_bitmap;
+	int terminal_bitmap_weight;
+	int num_parameter_terminal_in = 0;
+	int num_parameter_terminal_out = 0;
+	int num_program_terminal = 0;
+	int num_program_terminal_sequencer_info = 0;
+	bool has_program_control_init_terminal = false;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_is_program_group_manifest_valid(): enter:\n");
+
+	verifexit(manifest != NULL);
+	verifexit(ia_css_program_group_manifest_get_size(manifest) != 0);
+	verifexit(ia_css_program_group_manifest_get_alignment(manifest) != 0);
+	verifexit(ia_css_program_group_manifest_get_program_group_ID(manifest) != 0);
+
+	terminal_count =
+		ia_css_program_group_manifest_get_terminal_count(manifest);
+	program_count =
+		ia_css_program_group_manifest_get_program_count(manifest);
+	total_bitmap =
+		ia_css_program_group_manifest_get_kernel_bitmap(manifest);
+	check_bitmap = ia_css_kernel_bitmap_clear();
+	resource_bitmap = vied_nci_bit_mask(VIED_NCI_RESOURCE_BITMAP_BITS);
+	terminal_bitmap = ia_css_kernel_bitmap_clear();
+
+	verifexit(program_count != 0);
+	verifexit(terminal_count != 0);
+	verifexit(!ia_css_is_kernel_bitmap_empty(total_bitmap));
+	verifexit(vied_nci_is_bitmap_empty(resource_bitmap));
+
+	/* Check the kernel bitmaps for terminals */
+	for (i = 0; i < (int)terminal_count; i++) {
+		ia_css_terminal_manifest_t *terminal_manifest_i =
+			ia_css_program_group_manifest_get_term_mnfst(
+				manifest, i);
+		bool is_parameter_in =
+			(IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ==
+			ia_css_terminal_manifest_get_type(
+				terminal_manifest_i));
+		bool is_parameter_out =
+			(IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT ==
+			ia_css_terminal_manifest_get_type(
+				terminal_manifest_i));
+		bool is_data =
+			ia_css_is_terminal_manifest_data_terminal(
+				terminal_manifest_i);
+		bool is_program =
+			ia_css_is_terminal_manifest_program_terminal(
+				terminal_manifest_i);
+		bool is_spatial_param =
+			ia_css_is_terminal_manifest_spatial_parameter_terminal(
+				terminal_manifest_i);
+		bool is_program_control_init =
+			ia_css_is_terminal_manifest_program_control_init_terminal(
+				terminal_manifest_i);
+
+		if (is_parameter_in) {
+			num_parameter_terminal_in = is_parameter_in;
+		} else if (is_parameter_out) {
+			num_parameter_terminal_out = is_parameter_out;
+		} else if (is_data) {
+			ia_css_data_terminal_manifest_t *dterminal_manifest_i =
+				(ia_css_data_terminal_manifest_t *)
+				terminal_manifest_i;
+			ia_css_kernel_bitmap_t terminal_bitmap_i =
+				ia_css_data_terminal_manifest_get_kernel_bitmap(
+					dterminal_manifest_i);
+			/*
+			 * A terminal must depend on kernels that are a subset
+			 * of the total, correction, it can only depend on one
+			 * kernel
+			 */
+			verifexit(!ia_css_is_kernel_bitmap_empty(
+					terminal_bitmap_i));
+			verifexit(ia_css_is_kernel_bitmap_subset(
+					total_bitmap, terminal_bitmap_i));
+			verifexit(ia_css_is_kernel_bitmap_onehot(
+					terminal_bitmap_i));
+		} else if (is_program) {
+			verifexit(terminal_manifest_i);
+			num_program_terminal += is_program;
+			num_program_terminal_sequencer_info +=
+				((ia_css_program_terminal_manifest_t *)
+				terminal_manifest_i)->
+			kernel_fragment_sequencer_info_manifest_info_count;
+		} else if (is_program_control_init) {
+			has_program_control_init_terminal = is_program_control_init;
+		} else {
+			const ia_css_spatial_param_terminal_manifest_t
+				*spatial_param_man =
+			(const ia_css_spatial_param_terminal_manifest_t *)
+				terminal_manifest_i;
+			verifexit(spatial_param_man);
+			verifexit(is_spatial_param);
+
+			terminal_bitmap =
+				ia_css_kernel_bitmap_set(terminal_bitmap,
+				spatial_param_man->kernel_id);
+			verifexit(!ia_css_is_kernel_bitmap_empty(terminal_bitmap));
+			verifexit(ia_css_is_kernel_bitmap_subset(
+					total_bitmap, terminal_bitmap));
+		}
+	}
+
+	/* Check the kernel bitmaps for programs */
+	for (i = 0; i < (int)program_count; i++) {
+		int j;
+		ia_css_program_manifest_t *program_manifest_i =
+			ia_css_program_group_manifest_get_prgrm_mnfst(
+				manifest, i);
+		ia_css_program_type_t program_type_i =
+			ia_css_program_manifest_get_type(program_manifest_i);
+		ia_css_kernel_bitmap_t program_bitmap_i =
+			ia_css_program_manifest_get_kernel_bitmap(
+				program_manifest_i);
+		uint8_t program_dependency_count_i =
+			ia_css_program_manifest_get_program_dependency_count(
+				program_manifest_i);
+		uint8_t terminal_dependency_count_i =
+			ia_css_program_manifest_get_terminal_dependency_count(
+				program_manifest_i);
+		uint8_t program_dependency_i0 =
+			ia_css_program_manifest_get_program_dependency(
+				program_manifest_i, 0);
+		bool is_sub_i =
+			ia_css_is_program_manifest_subnode_program_type(
+				program_manifest_i);
+		bool is_exclusive_sub_i =
+			(program_type_i == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB);
+		bool is_virtual_sub_i =
+			(program_type_i == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB);
+		bool is_super_i =
+			ia_css_is_program_manifest_supernode_program_type(
+				program_manifest_i);
+
+		/*
+		 * A program must have kernels that
+		 * are a subset of the total
+		 */
+		verifexit(!ia_css_is_kernel_bitmap_empty(
+				program_bitmap_i));
+		verifexit(ia_css_is_kernel_bitmap_subset(
+				total_bitmap, program_bitmap_i));
+		verifexit((program_type_i != IA_CSS_N_PROGRAM_TYPES));
+		verifexit((program_dependency_count_i + terminal_dependency_count_i) != 0);
+		/*
+		 * Checks for subnodes
+		 * - Parallel subnodes cannot depend on terminals
+		 * - Exclusive subnodes must depend on
+		 *   fewer terminals than the supernode
+		 * - Subnodes only depend on a supernode of the same type
+		 * - Must have a subset of the supernode's kernels
+		 *   (but not equal)
+		 * - This tests only positive cases
+		 * Checks for singular or supernodes
+		 * - Cannot depend on exclusive subnodes
+		 * - No intersection between kernels
+		 *   (too strict for multiple instances ?)
+		 */
+		if (is_sub_i) {
+			/* Subnode */
+			ia_css_program_manifest_t *program_manifest_k =
+			ia_css_program_group_manifest_get_prgrm_mnfst(
+				manifest, program_dependency_i0);
+			ia_css_program_type_t program_type_k =
+				ia_css_program_manifest_get_type(
+					program_manifest_k);
+			ia_css_kernel_bitmap_t program_bitmap_k =
+				ia_css_program_manifest_get_kernel_bitmap(
+					program_manifest_k);
+
+			verifexit(program_dependency_count_i == 1);
+			if (is_exclusive_sub_i || is_virtual_sub_i) {
+				verifexit(terminal_dependency_count_i <=
+					ia_css_program_manifest_get_terminal_dependency_count(
+						program_manifest_k));
+			} else{
+				verifexit(terminal_dependency_count_i == 0);
+			}
+			verifexit(program_type_k ==
+				(is_exclusive_sub_i ?
+					IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER :
+				is_virtual_sub_i ?
+					IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER :
+					IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER));
+			verifexit(!ia_css_is_kernel_bitmap_equal(
+					program_bitmap_k, program_bitmap_i));
+			verifexit(ia_css_is_kernel_bitmap_subset(
+					program_bitmap_k, program_bitmap_i));
+		} else {
+			/* Singular or Supernode */
+			int k;
+			ia_css_kernel_bitmap_t program_bitmap_k;
+
+			for (k = 0; k < program_dependency_count_i; k++) {
+				uint8_t program_dependency_k =
+				ia_css_program_manifest_get_program_dependency(
+					program_manifest_i, k);
+				ia_css_program_manifest_t *program_manifest_k =
+				ia_css_program_group_manifest_get_prgrm_mnfst(
+				manifest, (int)program_dependency_k);
+				ia_css_program_type_t program_type_k =
+				ia_css_program_manifest_get_type(
+					program_manifest_k);
+				program_bitmap_k =
+				ia_css_program_manifest_get_kernel_bitmap(
+					program_manifest_k);
+
+				verifexit(program_dependency_k <
+					program_count);
+				verifexit((program_type_k !=
+					IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
+					(program_type_k !=
+					IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB));
+				verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
+				ia_css_is_kernel_bitmap_intersection_empty(
+					program_bitmap_i, program_bitmap_k));
+			}
+		}
+
+		/* Check for relations */
+		for (j = 0; j < (int)program_count; j++) {
+			int k;
+			ia_css_program_manifest_t *program_manifest_j =
+			ia_css_program_group_manifest_get_prgrm_mnfst(
+				manifest, j);
+			ia_css_program_type_t program_type_j =
+			ia_css_program_manifest_get_type(program_manifest_j);
+			ia_css_kernel_bitmap_t program_bitmap_j =
+			ia_css_program_manifest_get_kernel_bitmap(
+				program_manifest_j);
+			uint8_t program_dependency_count_j =
+			ia_css_program_manifest_get_program_dependency_count(
+				program_manifest_j);
+			uint8_t program_dependency_j0 =
+			ia_css_program_manifest_get_program_dependency(
+				program_manifest_j, 0);
+			bool is_sub_j =
+			ia_css_is_program_manifest_subnode_program_type(
+				program_manifest_j);
+			bool is_super_j =
+			ia_css_is_program_manifest_supernode_program_type(
+				program_manifest_j);
+			bool is_virtual_sub_j =
+			(program_type_j == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB);
+			bool is_j_subset_i =
+			ia_css_is_kernel_bitmap_subset(
+				program_bitmap_i, program_bitmap_j);
+			bool is_i_subset_j =
+			ia_css_is_kernel_bitmap_subset(
+				program_bitmap_j, program_bitmap_i);
+
+			/* Test below would fail for i==j */
+			if (i == j)
+				continue;
+
+			/* Empty sets are always subsets, but meaningless */
+			verifexit(!ia_css_is_kernel_bitmap_empty(
+					program_bitmap_j));
+
+			/*
+			 * Checks for mutual subnodes
+			 * - Parallel subnodes must have an equal
+			 *   set of kernels
+			 * - Exclusive and virtual subnodes must
+			 *   have an unequal set of kernels
+			 * Checks for subnodes
+			 * - Subnodes must have a subset of kernels
+			 */
+			if (((program_type_i ==
+				IA_CSS_PROGRAM_TYPE_PARALLEL_SUB) &&
+				(program_type_j ==
+				IA_CSS_PROGRAM_TYPE_PARALLEL_SUB)) ||
+				((program_type_i ==
+				IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
+				(program_type_j ==
+				IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB)) ||
+				((program_type_i ==
+				IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) &&
+				(program_type_j ==
+				IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB))) {
+
+				verifexit(program_dependency_count_j == 1);
+				verifexit(program_dependency_i0 != i);
+				verifexit(program_dependency_j0 != i);
+
+				if (program_dependency_i0 ==
+					program_dependency_j0) {
+					verifexit(is_sub_i);
+					/*
+					 * Subnodes are subsets,
+					 * not for virtual nodes
+					 */
+					if (!is_virtual_sub_i)
+						verifexit(
+							((is_j_subset_i ||
+							is_i_subset_j)));
+					/*
+					 * That must be equal for
+					 * parallel subnodes,
+					 * must be unequal for
+					 * exlusive and virtual subnodes
+					 */
+					verifexit(
+					((is_j_subset_i && is_i_subset_j) ^
+					(is_exclusive_sub_i |
+					is_virtual_sub_i)));
+
+				}
+				if (is_j_subset_i || is_i_subset_j) {
+					/* One being subset of the other does not necessarily mean that they are part
+					 * of the same "cluster" (i.e. having same super dependency).
+					 */
+					/* verifexit(program_dependency_i0 ==
+					 *	program_dependency_j0);
+					 */
+				}
+				/* If subnodes are the same, they need different program dependency. */
+				if (ia_css_is_kernel_bitmap_equal(program_bitmap_i, program_bitmap_j)) {
+					verifexit(program_dependency_i0 != program_dependency_j0);
+				}
+			}
+
+			if (((program_type_i ==
+				IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER) &&
+				(program_type_j ==
+				IA_CSS_PROGRAM_TYPE_PARALLEL_SUB)) ||
+				((program_type_i ==
+				IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER) &&
+				(program_type_j ==
+				IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB)) ||
+				((program_type_i ==
+				IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER) &&
+				(program_type_j ==
+				IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB))) {
+
+				verifexit(program_dependency_count_j == 1);
+				verifexit(!is_i_subset_j);
+
+				if (program_dependency_j0 == i) {
+					verifexit(program_dependency_i0 !=
+						program_dependency_j0);
+					verifexit(is_super_i);
+					verifexit(is_j_subset_i);
+
+				}
+				if (is_j_subset_i) {
+					/* verifexit(program_dependency_j0 == i); */
+					/* A sub that is subset of a super, is not necessarily dependent to it. */
+				}
+			}
+
+			/*
+			 * Checks for dependent nodes
+			 * - Cannot depend on exclusive subnodes
+			 * - No intersection between kernels
+			 *   (too strict for multiple instances ?)
+			 *   unless a subnode
+			 */
+			for (k = 0; k < (int)program_dependency_count_j; k++) {
+				uint8_t program_dependency_k =
+				ia_css_program_manifest_get_program_dependency(
+					program_manifest_j, k);
+
+				verifexit((program_dependency_k <
+					program_count));
+				if (program_dependency_k == i) {
+					/* program[j] depends on program[i] */
+					verifexit((i != j));
+					verifexit((program_type_i !=
+					IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
+					(program_type_i !=
+					IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB));
+					verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
+				(ia_css_is_kernel_bitmap_intersection_empty(
+				program_bitmap_i, program_bitmap_j) ^ is_sub_j));
+				}
+			}
+
+			/*
+			 * Checks for supernodes and subnodes
+			 * - Detect nodes that kernel-wise are subsets,
+			 *   but not connected to the correct supernode
+			 * - We do not (yet) detect if programs properly
+			 *   depend on all parallel nodes
+			 */
+			if (!ia_css_is_kernel_bitmap_intersection_empty(
+				program_bitmap_i, program_bitmap_j)) {
+				/*
+				 * This test will pass if
+				 * the program manifest is NULL,
+				 * but that's no concern here
+				 */
+				verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
+			!ia_css_is_program_manifest_singular_program_type(
+				program_manifest_i));
+				verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
+			!ia_css_is_program_manifest_singular_program_type(
+				program_manifest_j));
+				if (!is_virtual_sub_j)
+					verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
+					(is_j_subset_i || is_i_subset_j));
+				if (is_super_i) {
+					/* verifexit(is_sub_j); */
+					/* verifexit(program_dependency_j0 == i); */
+				}
+				if (is_super_j) {
+					/* verifexit(is_sub_i); */
+					/* verifexit(program_dependency_i0 == j); */
+				}
+				if (is_super_i && is_super_j) {
+					/* Allow two supernodes to intersect as long as they are different */
+					verifexit(!ia_css_is_kernel_bitmap_equal(program_bitmap_i, program_bitmap_j));
+				}
+				/* A bitmap intersect does not necessarily need to mean super and sub. */
+				/* A sub that intersects with a super, is not necessarily dependent to it. */
+			}
+		}
+		check_bitmap = ia_css_kernel_bitmap_union(
+					check_bitmap, program_bitmap_i);
+		/*
+		 * A terminal can be bound to only a single
+		 * (of multiple concurrent) program(s),
+		 * i.e. the one that holds the iterator to control it
+		 * Only singular and super nodes can depend on a terminal.
+		 * This loop accumulates all terminal
+		 * dependencies over all programs
+		 */
+		for (j = 0; j < (int)terminal_dependency_count_i; j++) {
+			uint8_t terminal_dependency =
+			ia_css_program_manifest_get_terminal_dependency(
+					program_manifest_i, j);
+
+			verifexit(terminal_dependency < terminal_count);
+			if ((program_type_i !=
+				IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
+				(program_type_i !=
+				IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB)) {
+				/* If the subnode always came after the */
+				/* supernode we could check for presence */
+				resource_bitmap =
+					vied_nci_bit_mask_set_unique(
+						resource_bitmap,
+						terminal_dependency);
+				verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
+					!vied_nci_is_bitmap_empty(
+						resource_bitmap));
+			}
+		}
+	}
+	verifexit(ia_css_is_kernel_bitmap_equal(
+			total_bitmap, check_bitmap));
+
+	terminal_bitmap_weight =
+		vied_nci_bitmap_compute_weight(resource_bitmap);
+	verifexit(terminal_bitmap_weight >= 0);
+	if (num_parameter_terminal_in ||
+		num_parameter_terminal_out ||
+		num_program_terminal ||
+		has_program_control_init_terminal) {
+		int skip_terminal_count = 0;
+
+		skip_terminal_count += num_parameter_terminal_in;
+		skip_terminal_count += num_parameter_terminal_out;
+		skip_terminal_count += num_program_terminal;
+		skip_terminal_count -= num_program_terminal_sequencer_info;
+		if (has_program_control_init_terminal) {
+			skip_terminal_count++;
+		}
+		verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
+			(terminal_bitmap_weight ==
+			(terminal_count - skip_terminal_count)));
+	} else
+		verifexit((terminal_bitmap_weight == terminal_count));
+
+	is_valid = true;
+EXIT:
+	if (is_valid == false) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+			"ia_css_is_program_group_manifest_valid: failed\n");
+	}
+	return is_valid;
+}
+
+#if !defined(__HIVECC)
+int ia_css_program_group_manifest_set_kernel_bitmap(
+	ia_css_program_group_manifest_t *manifest,
+	const ia_css_kernel_bitmap_t bitmap)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_group_manifest_set_kernel_bitmap(): enter:\n");
+
+	if (manifest != NULL) {
+		manifest->kernel_bitmap = bitmap;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_program_group_manifest_set_kernel_bitmap invalid argument\n");
+	}
+	return retval;
+}
+#endif
+
+ia_css_kernel_bitmap_t ia_css_program_group_manifest_get_kernel_bitmap(
+	const ia_css_program_group_manifest_t *manifest)
+{
+	ia_css_kernel_bitmap_t bitmap = ia_css_kernel_bitmap_clear();
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_group_manifest_get_kernel_bitmap(): enter:\n");
+
+	if (manifest != NULL) {
+		bitmap = manifest->kernel_bitmap;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"ia_css_program_group_manifest_get_kernel_bitmap invalid argument\n");
+	}
+	return bitmap;
+}
+
+#if !defined(__HIVECC)
+void ia_css_program_group_manifest_init(
+	ia_css_program_group_manifest_t *blob,
+	const uint8_t program_count,
+	const uint8_t terminal_count,
+	const uint8_t *program_needs_extension,
+	const uint8_t *program_dependencies,
+	const uint8_t *terminal_dependencies,
+	const ia_css_terminal_type_t *terminal_type,
+	const uint16_t *cached_in_param_section_count,
+	const uint16_t *cached_out_param_section_count,
+	const uint16_t *spatial_param_section_count,
+	const uint16_t *fragment_param_section_count,
+	const uint16_t *sliced_in_param_section_count,
+	const uint16_t *sliced_out_param_section_count,
+	const uint16_t *kernel_fragment_seq_count,
+	const uint16_t *progctrlinit_load_section_counts,
+	const uint16_t *progctrlinit_connect_section_counts)
+{
+	int i = 0;
+	int j = 0;
+	int k = 0;
+	int l = 0;
+	int m = 0;
+	int n = 0;
+	int o = 0;
+	int result;
+	uint32_t offset = 0;
+	char *prg_manifest_base, *terminal_manifest_base;
+	size_t program_size = 0;
+
+	/*
+	 * assert(blob != NULL);
+	 */
+	COMPILATION_ERROR_IF(
+		SIZE_OF_DATA_TERMINAL_MANIFEST_STRUCT_IN_BITS !=
+			(CHAR_BIT * sizeof(ia_css_data_terminal_manifest_t)));
+	COMPILATION_ERROR_IF(
+		SIZE_OF_PROGRAM_GROUP_MANIFEST_STRUCT_IN_BITS !=
+			(CHAR_BIT * sizeof(ia_css_program_group_manifest_t)));
+	COMPILATION_ERROR_IF(
+		SIZE_OF_PROGRAM_MANIFEST_STRUCT_IN_BITS !=
+			(CHAR_BIT * sizeof(ia_css_program_manifest_t)));
+	COMPILATION_ERROR_IF(
+		SIZE_OF_PROGRAM_MANIFEST_EXT_STRUCT_IN_BYTES !=
+			(CHAR_BIT * sizeof(ia_css_program_manifest_ext_t)));
+
+	COMPILATION_ERROR_IF(0 != sizeof(ia_css_program_manifest_t)%sizeof(uint32_t));
+	COMPILATION_ERROR_IF(0 != sizeof(ia_css_program_manifest_ext_t)%sizeof(uint32_t));
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
+		"ia_css_program_group_manifest_init(): enter:\n");
+
+	for (i = 0; i < (int)program_count; i++) {
+		program_size +=
+			ia_css_sizeof_program_manifest(
+				program_needs_extension[i],
+				program_dependencies[i],
+				terminal_dependencies[i]);
+	}
+
+	/* A program group ID cannot be zero */
+	blob->ID = 1;
+	blob->program_count = program_count;
+	blob->terminal_count = terminal_count;
+	blob->program_manifest_offset = sizeof(ia_css_program_group_manifest_t);
+	blob->terminal_manifest_offset =
+		(uint32_t)blob->program_manifest_offset + program_size;
+
+	prg_manifest_base = (char *)
+		(((char *)blob) + blob->program_manifest_offset);
+	offset = blob->program_manifest_offset;
+	for (i = 0; i < (int)program_count; i++) {
+		ia_css_program_manifest_init(
+			(ia_css_program_manifest_t *)prg_manifest_base,
+			program_needs_extension[i],
+			program_dependencies[i], terminal_dependencies[i]);
+		ia_css_program_manifest_set_parent_offset(
+			(ia_css_program_manifest_t *)prg_manifest_base, offset);
+		program_size =
+			ia_css_sizeof_program_manifest(
+				program_needs_extension[i],
+				program_dependencies[i],
+				terminal_dependencies[i]);
+		prg_manifest_base += program_size;
+		offset += (uint32_t)program_size;
+	}
+
+	offset = blob->terminal_manifest_offset;
+	terminal_manifest_base = (char *) (((char *)blob) + offset);
+	for (i = 0; i < (int)terminal_count; i++) {
+		size_t terminal_size = 0;
+		ia_css_terminal_manifest_t *term_manifest =
+			(ia_css_terminal_manifest_t *)terminal_manifest_base;
+
+		ia_css_terminal_manifest_set_parent_offset(
+				(ia_css_terminal_manifest_t *)
+				terminal_manifest_base,
+				offset);
+		switch (terminal_type[i]) {
+		case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
+			result = ia_css_param_terminal_manifest_init(
+				(ia_css_param_terminal_manifest_t *)
+				term_manifest,
+				cached_in_param_section_count[j]);
+			if (0 == result) {
+				terminal_size =
+				ia_css_param_terminal_manifest_get_size(
+					cached_in_param_section_count[j]);
+				j++;
+			} else {
+				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+					"ia_css_param_terminal_manifest_init failed in cached in terminal\n");
+			}
+			break;
+		case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
+			result = ia_css_param_terminal_manifest_init(
+				(ia_css_param_terminal_manifest_t *)
+				term_manifest,
+				cached_out_param_section_count[k]);
+			if (0 == result) {
+				terminal_size =
+				ia_css_param_terminal_manifest_get_size(
+					cached_out_param_section_count[k]);
+				k++;
+			} else {
+				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+					"ia_css_param_terminal_manifest_init failed\n");
+			}
+			break;
+		case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
+		case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
+			result = ia_css_spatial_param_terminal_manifest_init(
+				(ia_css_spatial_param_terminal_manifest_t *)
+				term_manifest,
+				spatial_param_section_count[l]);
+			if (0 == result) {
+				terminal_size =
+			ia_css_spatial_param_terminal_manifest_get_size(
+				spatial_param_section_count[l]);
+				l++;
+			} else {
+				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+					"ia_css_spatial_param_terminal_manifest_init failed in spatial terminal\n");
+			}
+			break;
+		case IA_CSS_TERMINAL_TYPE_PROGRAM:
+			result = ia_css_program_terminal_manifest_init(
+				(ia_css_program_terminal_manifest_t *)
+				term_manifest,
+				fragment_param_section_count[m],
+				kernel_fragment_seq_count[m]);
+			if (0 == result) {
+				terminal_size =
+				ia_css_program_terminal_manifest_get_size(
+					fragment_param_section_count[m],
+					kernel_fragment_seq_count[m]);
+				m++;
+			} else {
+				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+					"ia_css_program_terminal_manifest_init failed in program terminal\n");
+			}
+			break;
+		case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
+			result = ia_css_program_control_init_terminal_manifest_init(
+				(ia_css_program_control_init_terminal_manifest_t *)
+				term_manifest,
+				program_count,
+				progctrlinit_load_section_counts,
+				progctrlinit_connect_section_counts);
+			if (0 == result) {
+				terminal_size =
+				ia_css_program_control_init_terminal_manifest_get_size(
+					program_count,
+					NULL,
+					NULL);
+			} else {
+				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+					"ia_css_program_control_init_terminal_manifest_init failed\n");
+			}
+			break;
+		case IA_CSS_TERMINAL_TYPE_DATA_IN:
+		case IA_CSS_TERMINAL_TYPE_DATA_OUT:
+			terminal_size = sizeof(ia_css_data_terminal_manifest_t);
+			break;
+		case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
+			result = ia_css_sliced_param_terminal_manifest_init(
+				(ia_css_sliced_param_terminal_manifest_t *)
+				term_manifest,
+				sliced_in_param_section_count[n]);
+			if (0 == result) {
+				terminal_size =
+			ia_css_sliced_param_terminal_manifest_get_size(
+				sliced_in_param_section_count[n]);
+				n++;
+			} else {
+				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+					"ia_css_param_terminal_manifest_init in sliced terminal failed\n");
+			}
+			break;
+		case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
+			result = ia_css_sliced_param_terminal_manifest_init(
+				(ia_css_sliced_param_terminal_manifest_t *)
+				term_manifest,
+				sliced_out_param_section_count[o]);
+			if (0 == result) {
+				terminal_size =
+				ia_css_sliced_param_terminal_manifest_get_size(
+					sliced_out_param_section_count[o]);
+				n++;
+			} else {
+				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+					"ia_css_param_terminal_manifest_init in sliced out terminal failed\n");
+			}
+			break;
+		default:
+			IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+				"ia_css_program_group_manifest_init invalid argument\n");
+		}
+		term_manifest->size = (uint16_t)terminal_size;
+		/* index: i equal to terminal ID due to sorted of the terminals array */
+		term_manifest->ID = i;
+		term_manifest->terminal_type = terminal_type[i];
+		terminal_manifest_base += terminal_size;
+		offset += (uint32_t)terminal_size;
+	}
+
+	/* Set the private program group manifest blob offset */
+	blob->private_data_offset = offset;
+	offset += ceil_mul(sizeof(struct ia_css_psys_private_pg_data),
+				sizeof(uint64_t));
+
+	/* Set the RBM manifest blob offset */
+	blob->rbm_manifest_offset = offset;
+	offset += ceil_mul(sizeof(ia_css_rbm_manifest_t),
+				sizeof(uint64_t));
+
+	assert(offset <= UINT16_MAX);
+	blob->size = (uint16_t)offset;
+}
+#endif
+
+int ia_css_program_group_manifest_print(
+	const ia_css_program_group_manifest_t *manifest,
+	void *fid)
+{
+	int retval = -1;
+	int i;
+	uint8_t program_count, terminal_count;
+	ia_css_kernel_bitmap_t bitmap;
+	struct ia_css_psys_private_pg_data *priv_data;
+	ia_css_rbm_manifest_t *rbm_manifest;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
+		"ia_css_program_group_manifest_print(): enter:\n");
+
+	NOT_USED(fid);
+
+	verifexit(manifest != NULL);
+
+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+		"sizeof(manifest) = %d\n",
+		(int)ia_css_program_group_manifest_get_size(manifest));
+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+		"alignment(manifest) = %d\n",
+		(int)ia_css_program_group_manifest_get_alignment(manifest));
+
+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+		"program group ID = %d\n",
+		(int)ia_css_program_group_manifest_get_program_group_ID(
+			manifest));
+
+	program_count =
+		ia_css_program_group_manifest_get_program_count(manifest);
+	terminal_count =
+		ia_css_program_group_manifest_get_terminal_count(manifest);
+
+	bitmap = ia_css_program_group_manifest_get_kernel_bitmap(manifest);
+	verifexit(ia_css_kernel_bitmap_print(bitmap, fid) == 0);
+
+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+		"%d program manifests\n", (int)program_count);
+	for (i = 0; i < (int)program_count; i++) {
+		ia_css_program_manifest_t *program_manifest =
+			ia_css_program_group_manifest_get_prgrm_mnfst(
+				manifest, i);
+
+		retval = ia_css_program_manifest_print(program_manifest, fid);
+		verifjmpexit(retval == 0);
+	}
+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+		"%d terminal manifests\n", (int)terminal_count);
+	for (i = 0; i < (int)terminal_count; i++) {
+		ia_css_terminal_manifest_t *terminal_manifest =
+			ia_css_program_group_manifest_get_term_mnfst(
+				manifest, i);
+
+		retval = ia_css_terminal_manifest_print(
+				terminal_manifest, fid);
+		verifjmpexit(retval == 0);
+	}
+
+	priv_data =
+		(struct ia_css_psys_private_pg_data *)
+		ia_css_program_group_manifest_get_private_data(manifest);
+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+		"private_data_offset %d\n", manifest->private_data_offset);
+
+	for (i = 0; i < IPU_DEVICE_GP_PSA_MUX_NUM_MUX; i++) {
+		IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+			"PSA MUX id %d mux val %d\n", i,
+			priv_data->psa_mux_conf[i]);
+
+	}
+
+	for (i = 0; i < IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX; i++) {
+		IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+			"ISA MUX id %d mux val %d\n", i,
+			priv_data->isa_mux_conf[i]);
+
+	}
+
+#ifndef IPU7_ERROR_MISSING_DISABLE_SECTION
+	for (i = 0; i < IPU_DEVICE_ACB_NUM_ACB; i++) {
+
+		if (priv_data->acb_route[i].in_select !=
+			NCI_ACB_PORT_INVALID) {
+
+			assert(priv_data->acb_route[i].in_select !=
+				NCI_ACB_PORT_INVALID &&
+				priv_data->acb_route[i].out_select !=
+				NCI_ACB_PORT_INVALID);
+
+			IA_CSS_TRACE_3(PSYSAPI_STATIC, INFO,
+				"Route Cell id %d In %d Out %d\n", i,
+				priv_data->acb_route[i].in_select,
+				priv_data->acb_route[i].out_select);
+		}
+
+	}
+#endif /* IPU7_ERROR_MISSING_DISABLE_SECTION */
+
+	for (i = 0; i < MAX_INPUT_BUFFER; i++) {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: link_id = %d\n",
+				priv_data->input_buffer_info[i].link_id);
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: buffer_base_addr 0x%x\n",
+				priv_data->input_buffer_info[i].buffer_base_addr);
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: bpe = %d\n",
+				priv_data->input_buffer_info[i].bpe);
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: buffer_width = %d\n",
+				priv_data->input_buffer_info[i].buffer_width);
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: buffer_height = %d\n",
+				priv_data->input_buffer_info[i].buffer_height);
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: num_of_buffers = %d\n",
+				priv_data->input_buffer_info[i].num_of_buffers);
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: dfm_port_addr = 0x%x\n",
+				priv_data->input_buffer_info[i].dfm_port_addr);
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO, "======== Input Buffer: end ===========\n");
+	}
+
+	rbm_manifest = ia_css_program_group_manifest_get_rbm_manifest((ia_css_program_group_manifest_t *)manifest);
+	ia_css_rbm_manifest_print(rbm_manifest);
+
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+			"ia_css_program_group_manifest_print failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+#endif /* !defined(__HIVECC) */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_manifest.c
new file mode 100644
index 000000000000..9a279b28c019
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_manifest.c
@@ -0,0 +1,972 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <ia_css_psys_program_manifest.h>
+#include <ia_css_psys_program_group_manifest.h>
+/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_print */
+#include <ia_css_kernel_bitmap.h>
+
+#include <vied_nci_psys_system_global.h>
+#include "ia_css_psys_program_group_private.h"
+#include "ia_css_psys_static_trace.h"
+
+#include <error_support.h>
+#include <misc_support.h>
+#include <storage_class.h>
+#include <math_support.h>
+
+/* *****************************************************
+ * Functions to possibly inline
+ * ******************************************************/
+#ifndef __IA_CSS_PSYS_STATIC_INLINE__
+#include "ia_css_psys_program_manifest_impl.h"
+#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
+
+/* *****************************************************
+ * Functions not to inline and available to firmware
+ * ******************************************************/
+bool ia_css_has_program_manifest_fixed_cell(
+	const ia_css_program_manifest_t *manifest)
+{
+	DECLARE_ERRVAL
+	bool has_fixed_cell = false;
+	vied_nci_cell_ID_t cell_id;
+	vied_nci_cell_type_ID_t	cell_type_id;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_has_program_manifest_fixed_cell(): enter:\n");
+
+	verifexitval(manifest != NULL, EFAULT);
+
+	cell_id      = ia_css_program_manifest_get_cell_ID(manifest);
+	cell_type_id = ia_css_program_manifest_get_cell_type_ID(manifest);
+
+	has_fixed_cell = ((cell_id != VIED_NCI_N_CELL_ID) &&
+			  (cell_type_id == VIED_NCI_N_CELL_TYPE_ID));
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		   "ia_css_has_program_manifest_fixed_cell invalid argument\n");
+		return false;
+	}
+	return has_fixed_cell;
+}
+
+vied_nci_resource_bitmap_t ia_css_program_manifest_get_cells_bitmap(
+	const ia_css_program_manifest_t			*manifest)
+{
+	DECLARE_ERRVAL
+	vied_nci_resource_bitmap_t	bitmap = 0;
+	int i = 0;
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_get_cells_bitmap(): enter:\n");
+
+	verifexitval(manifest != NULL, EFAULT);
+
+	for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
+		if (VIED_NCI_N_CELL_ID != manifest->cells[i]) {
+			bitmap |= (1 << manifest->cells[i]);
+		}
+#ifdef __HIVECC
+#pragma hivecc unroll
+#endif
+	}
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		 "ia_css_program_manifest_get_cells_bitmap invalid argument\n");
+	}
+	return bitmap;
+}
+
+bool ia_css_is_program_manifest_subnode_program_type(
+	const ia_css_program_manifest_t *manifest)
+{
+	ia_css_program_type_t		program_type;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_is_program_manifest_subnode_program_type(): enter:\n");
+
+	program_type = ia_css_program_manifest_get_type(manifest);
+/* The error return is the limit value, so no need to check on the manifest
+ * pointer
+ */
+	return (program_type == IA_CSS_PROGRAM_TYPE_PARALLEL_SUB) ||
+			(program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) ||
+			(program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB);
+}
+
+bool ia_css_is_program_manifest_supernode_program_type(
+	const ia_css_program_manifest_t *manifest)
+{
+	ia_css_program_type_t program_type;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+	       "ia_css_is_program_manifest_supernode_program_type(): enter:\n");
+
+	program_type = ia_css_program_manifest_get_type(manifest);
+
+/* The error return is the limit value, so no need to check on the manifest
+ * pointer
+ */
+	return (program_type == IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER) ||
+			(program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER) ||
+			(program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER);
+}
+
+vied_nci_cell_ID_t ia_css_program_manifest_get_cell_ID(
+	const ia_css_program_manifest_t *manifest)
+{
+	DECLARE_ERRVAL
+
+	vied_nci_cell_ID_t cell_id = VIED_NCI_N_CELL_ID;
+	int i = 0;
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_get_cell_ID(): enter:\n");
+
+	verifexitval(manifest != NULL, EFAULT);
+
+	for (i = 1; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
+		assert(VIED_NCI_N_CELL_ID == manifest->cells[i]);
+#ifdef __HIVECC
+#pragma hivecc unroll
+#endif
+	}
+	cell_id = manifest->cells[0];
+EXIT:
+	if (!noerror()) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		  "ia_css_program_manifest_get_cell_ID invalid argument\n");
+		return VIED_NCI_N_CELL_ID;
+	}
+	return cell_id;
+}
+
+/* *****************************************************
+ * Functions not to inline and not available to firmware
+ * ******************************************************/
+#if !defined(__HIVECC)
+size_t ia_css_sizeof_program_manifest(
+	const uint8_t program_needs_extension,
+	const uint8_t program_dependency_count,
+	const uint8_t terminal_dependency_count)
+{
+	size_t	size = 0;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_sizeof_program_manifest(): enter:\n");
+
+	size += sizeof(ia_css_program_manifest_t);
+	if (program_needs_extension == 1) {
+		/* align manifest extension to 32 bit */
+		size = CEIL_MUL(size, sizeof(uint32_t));
+		size += sizeof(ia_css_program_manifest_ext_t);
+	}
+	size += program_dependency_count * sizeof(uint8_t);
+	size += terminal_dependency_count * sizeof(uint8_t);
+	/* align whole structure to 32 bit */
+	size = ceil_mul(size, sizeof(uint32_t));
+
+	return size;
+}
+
+int ia_css_program_manifest_set_program_ID(
+	ia_css_program_manifest_t			*manifest,
+	ia_css_program_ID_t id)
+{
+	int ret = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_set_program_ID(): enter:\n");
+
+	if (manifest != NULL) {
+		assert(id < UINT8_MAX && IA_CSS_PROGRAM_ID_BITS == 8);
+		manifest->ID = id;
+		ret = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+		   "ia_css_program_manifest_set_program_ID failed (%i)\n", ret);
+	}
+	return ret;
+}
+
+int ia_css_program_manifest_set_parent_offset(
+	ia_css_program_manifest_t	*manifest,
+	int32_t program_offset)
+{
+	int	retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_set_parent_offset(): enter:\n");
+
+	verifexit(manifest != NULL);
+
+	/* parent is at negative offset away from current program offset*/
+	assert((int16_t)(-program_offset) == -program_offset);
+	manifest->parent_offset = (int16_t)(-program_offset);
+
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+			"ia_css_program_manifest_set_parent_offset failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+int ia_css_program_manifest_set_type(
+	ia_css_program_manifest_t				*manifest,
+	const ia_css_program_type_t				program_type)
+{
+	int	retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_set_type(): enter:\n");
+
+	if (manifest != NULL) {
+		assert(program_type < UINT8_MAX && IA_CSS_PROGRAM_TYPE_BITS == 8);
+		manifest->program_type = (ia_css_program_type_t)program_type;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+		      "ia_css_program_manifest_set_type failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+int ia_css_program_manifest_set_kernel_bitmap(
+	ia_css_program_manifest_t			*manifest,
+	const ia_css_kernel_bitmap_t			kernel_bitmap)
+{
+	int	retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_set_kernel_bitmap(): enter:\n");
+
+	if (manifest != NULL) {
+		manifest->kernel_bitmap = kernel_bitmap;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+			"ia_css_program_manifest_set_kernel_bitmap failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+int ia_css_program_manifest_set_cell_ID(
+	ia_css_program_manifest_t			*manifest,
+	const vied_nci_cell_ID_t			cell_id)
+{
+	int	retval = -1;
+	int i = 0;
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_set_cell_ID(): enter:\n");
+	if (manifest != NULL) {
+		manifest->cells[0] = cell_id;
+		for (i = 1; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
+			manifest->cells[i] = VIED_NCI_N_CELL_ID;
+		}
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+		   "ia_css_program_manifest_set_cell_ID failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+int ia_css_program_manifest_set_cell_type_ID(
+	ia_css_program_manifest_t			*manifest,
+	const vied_nci_cell_type_ID_t			cell_type_id)
+{
+	int	retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_set_cell_type_ID(): enter:\n");
+	if (manifest != NULL) {
+		manifest->cell_type_id = cell_type_id;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+			"ia_css_program_manifest_set_cell_type_ID failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+void ia_css_program_manifest_set_input_terminal_id(
+	ia_css_program_manifest_t   *manifest,
+	unsigned char                   idx,
+	unsigned char                   val)
+{
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		       "ia_css_program_manifest_set_input_terminal_id(): enter:\n");
+	if (manifest != NULL) {
+#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
+		ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+		manifest_ext = ia_css_program_manifest_get_extension(manifest);
+		if (manifest_ext == NULL) {
+			return;
+		}
+		assert(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES);
+		manifest_ext->dec_resources_input_terminal[idx] = val;
+#else
+		(void) idx;
+		(void) val;
+#endif
+	}
+}
+
+void ia_css_program_manifest_set_output_terminal_id(
+	ia_css_program_manifest_t   *manifest,
+	unsigned char                    idx,
+	unsigned char                    val)
+{
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		       "ia_css_program_manifest_set_output_terminal_id(): enter:\n");
+	if (manifest != NULL) {
+#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
+		ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+		manifest_ext = ia_css_program_manifest_get_extension(manifest);
+		if (manifest_ext == NULL) {
+			return;
+		}
+		assert(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES);
+		manifest_ext->dec_resources_output_terminal[idx] = val;
+#else
+		(void) idx;
+		(void) val;
+		(void) manifest_ext;
+#endif
+	}
+}
+
+void ia_css_program_manifest_set_input_stream_id(
+	ia_css_program_manifest_t   *manifest,
+	unsigned char                   idx,
+	unsigned char                   val)
+{
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		       "ia_css_program_manifest_set_input_stream_id(): enter:\n");
+	if (manifest != NULL) {
+#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
+		ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+		manifest_ext = ia_css_program_manifest_get_extension(manifest);
+		if (manifest_ext == NULL) {
+			return;
+		}
+		assert(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES);
+		manifest_ext->dec_resources_input[idx] = val;
+#else
+		(void) idx;
+		(void) val;
+#endif
+	}
+}
+
+void ia_css_program_manifest_set_output_stream_id(
+	ia_css_program_manifest_t   *manifest,
+	unsigned char                    idx,
+	unsigned char                    val)
+{
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		       "ia_css_program_manifest_set_output_stream_id(): enter:\n");
+	if (manifest != NULL) {
+#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
+		ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+		manifest_ext = ia_css_program_manifest_get_extension(manifest);
+		if (manifest_ext == NULL) {
+			return;
+		}
+		assert(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES);
+		manifest_ext->dec_resources_output[idx] = val;
+#else
+		(void) idx;
+		(void) val;
+#endif
+	}
+}
+
+int ia_css_program_manifest_set_cells_bitmap(
+	ia_css_program_manifest_t			*manifest,
+	const vied_nci_resource_bitmap_t	bitmap)
+{
+	int retval = -1;
+	int array_index = 0;
+	int bit_index;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		       "ia_css_program_manifest_set_cells_bitmap(): enter:\n");
+
+	if (manifest != NULL) {
+		for (bit_index = 0; bit_index < VIED_NCI_N_CELL_ID; bit_index++) {
+			if (vied_nci_is_bit_set_in_bitmap(bitmap, bit_index)) {
+				verifexit(array_index < IA_CSS_PROCESS_MAX_CELLS);
+				manifest->cells[array_index] = (vied_nci_cell_ID_t)bit_index;
+				array_index++;
+			}
+		}
+		for (; array_index < IA_CSS_PROCESS_MAX_CELLS; array_index++) {
+			manifest->cells[array_index] = VIED_NCI_N_CELL_ID;
+		}
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		 "ia_css_program_manifest_set_cells_bitmap invalid argument\n");
+	}
+EXIT:
+	return retval;
+}
+
+#if HAS_DFM
+int ia_css_program_manifest_set_dfm_port_bitmap(
+	ia_css_program_manifest_t            *manifest,
+	const vied_nci_dev_dfm_id_t          dfm_type_id,
+	const vied_nci_resource_bitmap_t     bitmap)
+{
+	int retval = -1;
+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		       "ia_css_program_manifest_set_dfm_port_bitmap(): enter:\n");
+
+	verifexit(manifest != NULL);
+	verifexit(dfm_type_id < VIED_NCI_N_DEV_DFM_ID);
+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
+	if (manifest_ext == NULL && bitmap == 0) {
+		return 0;
+	}
+	verifexit(manifest_ext != NULL);
+	manifest_ext->dfm_port_bitmap[dfm_type_id] = bitmap;
+	retval = 0;
+
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+				"ia_css_program_manifest_set_dfm_port_bitmap invalid argument\n");
+	}
+	return retval;
+}
+
+int ia_css_program_manifest_set_dfm_active_port_bitmap(
+	ia_css_program_manifest_t           *manifest,
+	const vied_nci_dev_dfm_id_t          dfm_type_id,
+	const vied_nci_resource_bitmap_t     bitmap)
+{
+	int retval = -1;
+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+			"ia_css_program_manifest_set_dfm_active_port_bitmap(): enter:\n");
+
+	verifexit(manifest != NULL);
+	verifexit(dfm_type_id < VIED_NCI_N_DEV_DFM_ID);
+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
+	if (manifest_ext == NULL && bitmap == 0) {
+		return 0;
+	}
+	verifexit(manifest_ext != NULL);
+	manifest_ext->dfm_active_port_bitmap[dfm_type_id] = bitmap;
+	retval = 0;
+
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+				"ia_css_program_manifest_set_dfm_active_port_bitmap invalid argument\n");
+	}
+	return retval;
+}
+
+int ia_css_program_manifest_set_is_dfm_relocatable(
+	ia_css_program_manifest_t       *manifest,
+	const vied_nci_dev_dfm_id_t      dfm_type_id,
+	const uint8_t                    is_relocatable)
+{
+	int retval = -1;
+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+			"ia_css_program_manifest_set_is_dfm_relocatable(): enter:\n");
+
+	verifexit(manifest != NULL);
+	verifexit(dfm_type_id < VIED_NCI_N_DEV_DFM_ID);
+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
+	if (manifest_ext == NULL) {
+		return 0;
+	}
+	manifest_ext->is_dfm_relocatable[dfm_type_id] = is_relocatable;
+	retval = 0;
+
+	EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+				"ia_css_program_manifest_set_is_dfm_relocatable invalid argument\n");
+	}
+
+	return retval;
+}
+#endif /* HAS_DFM */
+
+int ia_css_program_manifest_set_int_mem_size(
+	ia_css_program_manifest_t			*manifest,
+	const vied_nci_mem_type_ID_t			mem_type_id,
+	const vied_nci_resource_size_t			int_mem_size)
+{
+	(void)manifest;
+	(void)mem_type_id;
+	if (int_mem_size != 0) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+			"ia_css_program_manifest_set_int_mem_size should not be called"
+			"(internally memory feature not used).\n");
+		return -1;
+	}
+	return 0;
+}
+
+int ia_css_program_manifest_set_ext_mem_size(
+	ia_css_program_manifest_t			*manifest,
+	const vied_nci_mem_type_ID_t			mem_type_id,
+	const vied_nci_resource_size_t			ext_mem_size)
+{
+	int retval = -1;
+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+	if (manifest == NULL) {
+		return retval;
+	}
+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
+	if (manifest_ext == NULL && ext_mem_size == 0) {
+		return 0;
+	} else if (manifest_ext == NULL) {
+		return retval;
+	}
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		       "ia_css_program_manifest_set_ext_mem_size(): enter:\n");
+
+	if (manifest != NULL && mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID) {
+		manifest_ext->ext_mem_size[mem_type_id] = ext_mem_size;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		 "ia_css_program_manifest_set_ext_mem_size invalid argument\n");
+	}
+
+	return retval;
+}
+
+int ia_css_program_manifest_set_ext_mem_offset(
+	ia_css_program_manifest_t			*manifest,
+	const vied_nci_mem_type_ID_t			mem_type_id,
+	const vied_nci_resource_size_t			ext_mem_offset)
+{
+	int retval = -1;
+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+	if (manifest == NULL) {
+		return retval;
+	}
+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
+	if (manifest_ext == NULL && ext_mem_offset ==
+		(vied_nci_resource_size_t)IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE) {
+		return 0;
+	} else if (manifest_ext == NULL) {
+		return retval;
+	}
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		       "ia_css_program_manifest_set_ext_mem_offset(): enter:\n");
+
+	if (manifest != NULL && mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID) {
+		manifest_ext->ext_mem_offset[mem_type_id] = ext_mem_offset;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		 "ia_css_program_manifest_set_ext_mem_offset invalid argument\n");
+	}
+
+	return retval;
+}
+
+int ia_css_program_manifest_set_dev_chn_size(
+	ia_css_program_manifest_t			*manifest,
+	const vied_nci_dev_chn_ID_t			dev_chn_id,
+	const vied_nci_resource_size_t			dev_chn_size)
+{
+	int retval = -1;
+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+	if (manifest == NULL) {
+		return retval;
+	}
+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
+	if (manifest_ext == NULL && dev_chn_size == 0) {
+		return 0;
+	} else if (manifest_ext == NULL) {
+		return retval;
+	}
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		       "ia_css_program_manifest_set_dev_chn_size(): enter:\n");
+#ifndef IPU_SYSVER_ipu7v1
+	if (manifest != NULL && dev_chn_id < VIED_NCI_N_DEV_CHN_ID) {
+		manifest_ext->dev_chn_size[dev_chn_id] = dev_chn_size;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		 "ia_css_program_manifest_set_dev_chn_size invalid argument\n");
+	}
+#else
+	NOT_USED(dev_chn_id);
+#endif
+	return retval;
+}
+
+int ia_css_program_manifest_set_dev_chn_offset(
+	ia_css_program_manifest_t			*manifest,
+	const vied_nci_dev_chn_ID_t			dev_chn_id,
+	const vied_nci_resource_size_t			dev_chn_offset)
+{
+	int retval = -1;
+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+	if (manifest == NULL) {
+		return retval;
+	}
+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
+	if (manifest_ext == NULL && dev_chn_offset ==
+		(vied_nci_resource_size_t)IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE) {
+		return 0;
+	} else if (manifest_ext == NULL) {
+		return retval;
+	}
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		       "ia_css_program_manifest_set_dev_chn_offset(): enter:\n");
+#ifndef IPU_SYSVER_ipu7v1
+	if (manifest != NULL && dev_chn_id < VIED_NCI_N_DEV_CHN_ID) {
+		manifest_ext->dev_chn_offset[dev_chn_id] = dev_chn_offset;
+		retval = 0;
+	} else {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+		 "ia_css_program_manifest_set_dev_chn_offset invalid argument\n");
+	}
+#else
+	NOT_USED(dev_chn_id);
+#endif
+	return retval;
+}
+
+int ia_css_program_manifest_set_program_dependency(
+	ia_css_program_manifest_t	*manifest,
+	const uint8_t			program_dependency,
+	const unsigned int		index)
+{
+	int	retval = -1;
+	uint8_t *program_dep_ptr;
+	uint8_t	program_dependency_count;
+	uint8_t	program_count;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_set_program_dependency(): enter:\n");
+
+	program_dependency_count =
+		ia_css_program_manifest_get_program_dependency_count(manifest);
+	program_count =
+		ia_css_program_group_manifest_get_program_count(
+			ia_css_program_manifest_get_parent(manifest));
+
+	if ((index < program_dependency_count) &&
+	    (program_dependency < program_count)) {
+		program_dep_ptr = (uint8_t *)((uint8_t *)manifest +
+				  manifest->program_dependency_offset +
+				  index*sizeof(uint8_t));
+		 *program_dep_ptr = program_dependency;
+		retval = 0;
+	}
+
+	if (retval != 0) {
+		IA_CSS_TRACE_3(PSYSAPI_STATIC, ERROR,
+			"ia_css_program_manifest_set_program_dependency(m, %d, %d) failed (%i)\n",
+			program_dependency, index, retval);
+	}
+	return retval;
+}
+
+int ia_css_program_manifest_set_terminal_dependency(
+	ia_css_program_manifest_t			*manifest,
+	const uint8_t					terminal_dependency,
+	const unsigned int				index)
+{
+	int	retval = -1;
+	uint8_t *terminal_dep_ptr;
+	uint8_t terminal_dependency_count =
+		ia_css_program_manifest_get_terminal_dependency_count(manifest);
+	uint8_t terminal_count =
+		ia_css_program_group_manifest_get_terminal_count(
+			ia_css_program_manifest_get_parent(manifest));
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_program_manifest_set_terminal_dependency(): enter:\n");
+
+	if ((index < terminal_dependency_count) &&
+			(terminal_dependency < terminal_count)) {
+		terminal_dep_ptr = (uint8_t *)((uint8_t *)manifest +
+				  manifest->terminal_dependency_offset + index);
+		 *terminal_dep_ptr = terminal_dependency;
+		retval = 0;
+	}
+
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+			"ia_css_program_manifest_set_terminal_dependency failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+void ia_css_program_manifest_init(
+	ia_css_program_manifest_t	*blob,
+	const uint8_t	program_needs_extension,
+	const uint8_t	program_dependency_count,
+	const uint8_t	terminal_dependency_count)
+{
+	size_t size = 0;
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
+		"ia_css_program_manifest_init(): enter:\n");
+
+	/*TODO: add assert*/
+	if (!blob)
+		return;
+
+	blob->ID = 1;
+	blob->program_dependency_count = program_dependency_count;
+	blob->terminal_dependency_count = terminal_dependency_count;
+
+	size += sizeof(ia_css_program_manifest_t);
+	if (program_needs_extension == 1) {
+		/* align start of extension to 32 bit */
+		size = CEIL_MUL(size, sizeof(uint32_t));
+		blob->program_extension_offset = size;
+		size += sizeof(ia_css_program_manifest_ext_t);
+	} else {
+		blob->program_extension_offset = 0;
+	}
+	blob->program_dependency_offset = size;
+	size += sizeof(uint8_t) * program_dependency_count;
+	blob->terminal_dependency_offset = size;
+	size += sizeof(uint8_t) * terminal_dependency_count;
+	/* align whole structure to 32 bit */
+	size = CEIL_MUL(size, sizeof(uint32_t));
+
+	blob->size = (uint8_t)ia_css_sizeof_program_manifest(
+		program_needs_extension,
+		program_dependency_count,
+		terminal_dependency_count);
+
+	assert(blob->size == size);
+	/* The following assert also implies that:
+	 * blob->program_extension_offset,
+	 * blob->program_dependency_offset,
+	 * blob->terminal_dependency_offset,
+	 * are <= UINT8_MAX
+	 */
+	assert(size <= UINT8_MAX);
+}
+
+int ia_css_program_manifest_print(
+	const ia_css_program_manifest_t *manifest,
+	void *fid)
+{
+	int			retval = -1;
+	int			i, mem_index, dev_chn_index;
+
+	vied_nci_cell_type_ID_t	cell_type_id;
+	uint8_t					program_dependency_count;
+	uint8_t					terminal_dependency_count;
+	ia_css_kernel_bitmap_t	bitmap;
+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
+		       "ia_css_program_manifest_print(): enter:\n");
+
+	verifexit(manifest != NULL);
+	NOT_USED(fid);
+
+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "sizeof(manifest) = %d\n",
+		(int)ia_css_program_manifest_get_size(manifest));
+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "program ID = %d\n",
+		(int)ia_css_program_manifest_get_program_ID(manifest));
+
+	bitmap = ia_css_program_manifest_get_kernel_bitmap(manifest);
+	verifexit(ia_css_kernel_bitmap_print(bitmap, fid) == 0);
+
+	if (ia_css_has_program_manifest_fixed_cell(manifest)) {
+		vied_nci_cell_ID_t cell_id =
+				  ia_css_program_manifest_get_cell_ID(manifest);
+
+		cell_type_id = vied_nci_cell_get_type(cell_id);
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "cell(program) = %d\n",
+			(int)cell_id);
+	} else {
+		cell_type_id =
+			ia_css_program_manifest_get_cell_type_ID(manifest);
+	}
+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "cell type(program) = %d\n",
+		(int)cell_type_id);
+
+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
+	if (manifest_ext != NULL) {
+	for (mem_index = 0; mem_index < (int)VIED_NCI_N_MEM_TYPE_ID;
+	     mem_index++) {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\ttype(internal mem) type = %d\n",
+		(int)vied_nci_cell_type_get_mem_type(cell_type_id, mem_index));
+	}
+
+	for (mem_index = 0; mem_index < (int)VIED_NCI_N_DATA_MEM_TYPE_ID;
+	     mem_index++) {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\ttype(external mem) type = %d\n",
+			(int)(vied_nci_mem_type_ID_t)mem_index);
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\ttype(external mem) size = %d\n",
+			manifest_ext->ext_mem_size[mem_index]);
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\ttype(external mem) offset = %d\n",
+			manifest_ext->ext_mem_offset[mem_index]);
+	}
+#if HAS_DFM
+	for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_CHN_ID;
+	     dev_chn_index++) {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\ttype(device channel) type = %d\n",
+			(int)dev_chn_index);
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\ttype(device channel) size = %d\n",
+			manifest_ext->dev_chn_size[dev_chn_index]);
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\ttype(device channel) offset = %d\n",
+			manifest_ext->dev_chn_offset[dev_chn_index]);
+	}
+	for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_DFM_ID;
+		dev_chn_index++) {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\ttype(dfm port) type = %d\n",
+			(int)dev_chn_index);
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\ttype(dfm port) port_bitmap = %x\n",
+			manifest_ext->dfm_port_bitmap[dev_chn_index]);
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\ttype(dfm port) active_port_bitmap = %x\n",
+			manifest_ext->dfm_active_port_bitmap[dev_chn_index]);
+
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\ttype(dfm port) is_dfm_relocatable = %d\n",
+			manifest_ext->is_dfm_relocatable[dev_chn_index]);
+	}
+#else
+	NOT_USED(dev_chn_index);
+#endif /* HAS_DFM */
+#ifdef USE_DEC400
+	for (i = 0; i < IA_CSS_MAX_INPUT_DEC_RESOURCES; i++) {
+		IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+			"\tEncoder stream id for idx = %d is: %d \n",
+			i,
+			manifest_ext->dec_resources_input[i]);
+
+	}
+	for (i = 0; i < IA_CSS_MAX_OUTPUT_DEC_RESOURCES; i++) {
+		IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+			"\tDecoder stream id for idx: = %d is: %d\n",
+			i,
+			manifest_ext->dec_resources_output[i]);
+
+	}
+#endif
+	}
+
+	for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\ttype(cells) bitmap = %d\n",
+			manifest->cells[i]);
+	}
+	program_dependency_count =
+		ia_css_program_manifest_get_program_dependency_count(manifest);
+	if (program_dependency_count == 0) {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"program_dependencies[%d] {};\n",
+			program_dependency_count);
+	} else {
+		uint8_t prog_dep;
+
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"program_dependencies[%d] {\n",
+			program_dependency_count);
+		for (i = 0; i < (int)program_dependency_count - 1; i++) {
+			prog_dep =
+			ia_css_program_manifest_get_program_dependency(
+				manifest, i);
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+				"\t %4d,\n", prog_dep);
+		}
+		prog_dep =
+		ia_css_program_manifest_get_program_dependency(manifest, i);
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\t %4d }\n", prog_dep);
+		(void)prog_dep;
+	}
+
+	terminal_dependency_count =
+		ia_css_program_manifest_get_terminal_dependency_count(manifest);
+	if (terminal_dependency_count == 0) {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"terminal_dependencies[%d] {};\n",
+			terminal_dependency_count);
+	} else {
+		uint8_t term_dep;
+
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"terminal_dependencies[%d] {\n",
+			terminal_dependency_count);
+		for (i = 0; i < (int)terminal_dependency_count - 1; i++) {
+			term_dep =
+			ia_css_program_manifest_get_terminal_dependency(
+				manifest, i);
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+				"\t %4d,\n", term_dep);
+		}
+		term_dep =
+		   ia_css_program_manifest_get_terminal_dependency(manifest, i);
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\t %4d }\n", term_dep);
+		(void)term_dep;
+	}
+	(void)cell_type_id;
+
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+			"ia_css_program_manifest_print failed (%i)\n", retval);
+	}
+	return retval;
+}
+
+#endif /* !defined(__HIVECC) */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal.c
new file mode 100644
index 000000000000..27f0cbfd3100
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal.c
@@ -0,0 +1,534 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ia_css_psys_dynamic_storage_class.h"
+#include "ia_css_psys_terminal_private_types.h"
+#include "ia_css_terminal_types.h"
+
+/*
+ * Functions to possibly inline
+ */
+
+#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
+#include "ia_css_psys_terminal_impl.h"
+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
+
+/*
+ * Functions not to inline
+ */
+
+/*
+ * This source file is created with the intention of sharing and
+ * compiled for host and firmware. Since there is no native 64bit
+ * data type support for firmware this wouldn't compile for SP
+ * tile. The part of the file that is not compilable are marked
+ * with the following __VIED_CELL marker and this comment. Once we
+ * come up with a solution to address this issue this will be
+ * removed.
+ */
+#if !defined(__VIED_CELL)
+size_t ia_css_sizeof_terminal(
+	const ia_css_terminal_manifest_t *manifest,
+	const ia_css_program_group_param_t *param)
+{
+	size_t size = 0;
+	uint16_t fragment_count =
+		ia_css_program_group_param_get_fragment_count(param);
+
+	COMPILATION_ERROR_IF(
+		SIZE_OF_DATA_TERMINAL_STRUCT_BITS !=
+		(CHAR_BIT * sizeof(ia_css_data_terminal_t)));
+
+	COMPILATION_ERROR_IF(
+		0 != sizeof(ia_css_data_terminal_t)%sizeof(uint64_t));
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_sizeof_terminal(): enter:\n");
+
+	verifexit(manifest != NULL);
+	verifexit(param != NULL);
+
+	if (ia_css_is_terminal_manifest_parameter_terminal(manifest)) {
+		const ia_css_param_terminal_manifest_t *param_term_man =
+			(const ia_css_param_terminal_manifest_t *)manifest;
+		verifexit(param_term_man != NULL);
+		if (ia_css_terminal_manifest_get_type(manifest) ==
+				IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN) {
+			size = ia_css_param_in_terminal_get_descriptor_size(
+			param_term_man->param_manifest_section_desc_count);
+		} else if (ia_css_terminal_manifest_get_type(manifest) ==
+				IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) {
+			size = ia_css_param_out_terminal_get_descriptor_size(
+			param_term_man->param_manifest_section_desc_count,
+			fragment_count);
+		} else {
+			assert(NULL == "Invalid parameter terminal type");
+			IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
+				"ia_css_sizeof_terminal(): Invalid parameter terminal type:\n");
+			verifjmpexit(0);
+		}
+	} else if (ia_css_is_terminal_manifest_data_terminal(manifest)) {
+		size += sizeof(ia_css_data_terminal_t);
+		size += fragment_count * sizeof(ia_css_fragment_descriptor_t);
+	} else if (ia_css_is_terminal_manifest_program_terminal(manifest)) {
+		ia_css_program_terminal_manifest_t *prog_term_man =
+			(ia_css_program_terminal_manifest_t *)manifest;
+
+		size = ia_css_program_terminal_get_descriptor_size(
+			fragment_count,
+			prog_term_man->
+			fragment_param_manifest_section_desc_count,
+			prog_term_man->
+			kernel_fragment_sequencer_info_manifest_info_count,
+			(fragment_count * prog_term_man->
+			max_kernel_fragment_sequencer_command_desc));
+	} else if (ia_css_is_terminal_manifest_spatial_parameter_terminal(
+				manifest)) {
+		ia_css_spatial_param_terminal_manifest_t *spatial_param_term =
+			(ia_css_spatial_param_terminal_manifest_t *)manifest;
+		size = ia_css_spatial_param_terminal_get_descriptor_size(
+		spatial_param_term->
+		frame_grid_param_manifest_section_desc_count,
+			fragment_count);
+	} else if (ia_css_is_terminal_manifest_program_control_init_terminal(
+				manifest)) {
+		ia_css_program_control_init_terminal_manifest_t *progctrlinit_term_man =
+			(ia_css_program_control_init_terminal_manifest_t *)manifest;
+		ia_css_program_group_manifest_t *pg_manifest =
+			ia_css_terminal_manifest_get_parent(manifest);
+		ia_css_kernel_bitmap_t kernel_bitmap =
+			ia_css_program_group_param_get_kernel_enable_bitmap(param);
+
+		verifjmpexit(pg_manifest != NULL);
+		size = ia_css_program_control_init_terminal_get_descriptor_size(
+			progctrlinit_term_man, pg_manifest, kernel_bitmap);
+	}
+EXIT:
+	if (NULL == manifest || NULL == param) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_sizeof_terminal invalid argument\n");
+	}
+	return size;
+}
+
+ia_css_terminal_t *ia_css_terminal_create(
+	void *raw_mem,
+	const ia_css_terminal_manifest_t *manifest,
+	const ia_css_terminal_param_t *terminal_param,
+	ia_css_kernel_bitmap_t enable_bitmap)
+{
+	char *terminal_raw_ptr;
+	ia_css_terminal_t *terminal = NULL;
+	uint16_t fragment_count;
+	int i, j;
+	int retval = -1;
+	ia_css_program_group_param_t *param;
+
+	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_terminal_create(manifest %p, terminal_param %p): enter:\n",
+		manifest, terminal_param);
+
+	param = ia_css_terminal_param_get_parent(terminal_param);
+	fragment_count = ia_css_program_group_param_get_fragment_count(param);
+
+	verifexit(manifest != NULL);
+	verifexit(param != NULL);
+
+	terminal_raw_ptr = (char *) raw_mem;
+
+	terminal = (ia_css_terminal_t *) terminal_raw_ptr;
+	verifexit(terminal != NULL);
+
+	terminal->size = (uint16_t)ia_css_sizeof_terminal(manifest, param);
+	verifexit(ia_css_terminal_set_type(
+		terminal, ia_css_terminal_manifest_get_type(manifest)) == 0);
+
+	terminal->ID = ia_css_terminal_manifest_get_ID(manifest);
+
+	verifexit(ia_css_terminal_set_buffer(terminal,
+				VIED_NULL) == 0);
+
+	if (ia_css_is_terminal_manifest_data_terminal(manifest) == true) {
+		ia_css_data_terminal_t *dterminal =
+			(ia_css_data_terminal_t *)terminal;
+		ia_css_frame_t *frame =
+			ia_css_data_terminal_get_frame(dterminal);
+		ia_css_kernel_bitmap_t intersection =
+			ia_css_kernel_bitmap_intersection(enable_bitmap,
+			ia_css_data_terminal_manifest_get_kernel_bitmap(
+			(const ia_css_data_terminal_manifest_t *)manifest));
+
+		verifexit(frame != NULL);
+		verifexit(ia_css_frame_set_buffer_state(
+				frame, IA_CSS_BUFFER_NULL) == 0);
+		verifexit(ia_css_is_kernel_bitmap_onehot(intersection) ==
+					true);
+
+		terminal_raw_ptr += sizeof(ia_css_data_terminal_t);
+		dterminal->fragment_descriptor_offset =
+			(uint16_t) (terminal_raw_ptr - (char *)terminal);
+
+		dterminal->kernel_id = 0;
+		while (!ia_css_is_kernel_bitmap_empty(intersection)) {
+			intersection = ia_css_kernel_bitmap_shift(
+					intersection);
+			dterminal->kernel_id++;
+		}
+		assert(dterminal->kernel_id > 0);
+		dterminal->kernel_id -= 1;
+
+		/* some terminal and fragment initialization */
+		dterminal->frame_descriptor.frame_format_type =
+			terminal_param->frame_format_type;
+		for (i = 0; i < IA_CSS_N_DATA_DIMENSION; i++) {
+			dterminal->frame_descriptor.dimension[i] =
+				terminal_param->dimensions[i];
+		}
+		dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] =
+			terminal_param->stride;
+		dterminal->frame_descriptor.bpp = terminal_param->bpp;
+		dterminal->frame_descriptor.bpe = terminal_param->bpe;
+		switch (dterminal->frame_descriptor.frame_format_type) {
+		case IA_CSS_DATA_FORMAT_UYVY:
+		case IA_CSS_DATA_FORMAT_YUYV:
+		case IA_CSS_DATA_FORMAT_YUV420_LINE:
+		case IA_CSS_DATA_FORMAT_Y800:
+		case IA_CSS_DATA_FORMAT_RGB565:
+		case IA_CSS_DATA_FORMAT_RGBA888:
+		case IA_CSS_DATA_FORMAT_BAYER_GRBG:
+		case IA_CSS_DATA_FORMAT_BAYER_RGGB:
+		case IA_CSS_DATA_FORMAT_BAYER_BGGR:
+		case IA_CSS_DATA_FORMAT_BAYER_GBRG:
+		case IA_CSS_DATA_FORMAT_RAW:
+		case IA_CSS_DATA_FORMAT_RAW_PACKED:
+		case IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED:
+		case IA_CSS_DATA_FORMAT_PAF_NON_INTERLEAVED:
+		case IA_CSS_DATA_FORMAT_PAF_INTERLEAVED:
+		case IA_CSS_DATA_FORMAT_IR:
+			dterminal->frame_descriptor.plane_count = 1;
+			dterminal->frame_descriptor.plane_offsets[0] = 0;
+			break;
+		case IA_CSS_DATA_FORMAT_NV12:
+		case IA_CSS_DATA_FORMAT_NV21:
+		case IA_CSS_DATA_FORMAT_NV16:
+		case IA_CSS_DATA_FORMAT_NV61:
+		case IA_CSS_DATA_FORMAT_P010:
+		case IA_CSS_DATA_FORMAT_P010_MSB:
+		case IA_CSS_DATA_FORMAT_P016:
+		case IA_CSS_DATA_FORMAT_P016_MSB:
+		case IA_CSS_DATA_FORMAT_P012_MSB:
+			dterminal->frame_descriptor.plane_count = 2;
+			dterminal->frame_descriptor.plane_offsets[0] = 0;
+			dterminal->frame_descriptor.plane_offsets[1] =
+				dterminal->frame_descriptor.plane_offsets[0] +
+				dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
+				dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
+			break;
+		case IA_CSS_DATA_FORMAT_P010_TILEY:
+		case IA_CSS_DATA_FORMAT_P016_TILEY:
+		case IA_CSS_DATA_FORMAT_P016_MSB_TILEY:
+		case IA_CSS_DATA_FORMAT_P010_MSB_TILEY:
+		case IA_CSS_DATA_FORMAT_NV12_TILEY:
+			dterminal->frame_descriptor.plane_count = 2;
+			dterminal->frame_descriptor.plane_offsets[0] = 0;
+			dterminal->frame_descriptor.plane_offsets[1] =
+				dterminal->frame_descriptor.plane_offsets[0] +
+				dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
+				CEIL_MUL(dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION], 32);
+			break;
+		case IA_CSS_DATA_FORMAT_YUV444:
+		case IA_CSS_DATA_FORMAT_RGB888:
+		case IA_CSS_DATA_FORMAT_YUV420_VECTORIZED:
+			dterminal->frame_descriptor.plane_count = 3;
+			dterminal->frame_descriptor.plane_offsets[0] = 0;
+			dterminal->frame_descriptor.plane_offsets[1] =
+				dterminal->frame_descriptor.plane_offsets[0] +
+				dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
+				dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
+			dterminal->frame_descriptor.plane_offsets[2] =
+				dterminal->frame_descriptor.plane_offsets[1] +
+				dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
+				dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
+			break;
+		case IA_CSS_DATA_FORMAT_YUV420:
+		case IA_CSS_DATA_FORMAT_YV12:
+			dterminal->frame_descriptor.plane_count = 3;
+			dterminal->frame_descriptor.plane_offsets[0] = 0;
+			dterminal->frame_descriptor.plane_offsets[1] =
+				dterminal->frame_descriptor.plane_offsets[0] +
+				dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
+				dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
+			dterminal->frame_descriptor.plane_offsets[2] =
+				dterminal->frame_descriptor.plane_offsets[1] +
+				dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
+				dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/2;
+			break;
+		case IA_CSS_DATA_FORMAT_BAYER_PLANAR:
+			dterminal->frame_descriptor.plane_count = 4;
+			dterminal->frame_descriptor.plane_offsets[0] = 0;
+			dterminal->frame_descriptor.plane_offsets[1] =
+				dterminal->frame_descriptor.plane_offsets[0] +
+				dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
+				dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/2;
+			dterminal->frame_descriptor.plane_offsets[2] =
+				dterminal->frame_descriptor.plane_offsets[1] +
+				dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
+				dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/ 2;
+			dterminal->frame_descriptor.plane_offsets[3] =
+				dterminal->frame_descriptor.plane_offsets[2] +
+				dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
+				dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/2;
+			break;
+		default:
+			/* Unset, resulting in potential terminal connect issues */
+			dterminal->frame_descriptor.plane_count = 1;
+			dterminal->frame_descriptor.plane_offsets[0] = 0;
+			break;
+		}
+		/*
+		 * Initial solution for single fragment initialization
+		 * TODO:
+		 * where to get the fragment description params from???
+		 */
+		if (fragment_count > 0) {
+			ia_css_fragment_descriptor_t *fragment_descriptor =
+				(ia_css_fragment_descriptor_t *)
+				terminal_raw_ptr;
+
+			fragment_descriptor->index[IA_CSS_COL_DIMENSION] =
+				terminal_param->index[IA_CSS_COL_DIMENSION];
+			fragment_descriptor->index[IA_CSS_ROW_DIMENSION] =
+				terminal_param->index[IA_CSS_ROW_DIMENSION];
+			fragment_descriptor->offset[0] =
+				terminal_param->offset;
+			for (i = 0; i < IA_CSS_N_DATA_DIMENSION; i++) {
+				fragment_descriptor->dimension[i] =
+					terminal_param->fragment_dimensions[i];
+			}
+		}
+		/* end fragment stuff */
+
+		/* Set the stream2gen_buffer_size to the full frame height. Driver should override it using dynamic API if smaller buffer size is required */
+		dterminal->stream2gen_buffer_size = dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
+	} else if (ia_css_is_terminal_manifest_parameter_terminal(manifest) ==
+			true) {
+		ia_css_param_terminal_t *pterminal =
+			(ia_css_param_terminal_t *)terminal;
+		uint16_t section_count =
+			((const ia_css_param_terminal_manifest_t *)manifest)->
+			param_manifest_section_desc_count;
+		size_t curr_offset = 0;
+
+		pterminal->param_section_desc_offset =
+			sizeof(ia_css_param_terminal_t);
+
+		for (i = 0; i < section_count; i++) {
+			ia_css_param_section_desc_t *section =
+			ia_css_param_in_terminal_get_param_section_desc(
+					pterminal, i);
+			const ia_css_param_manifest_section_desc_t *
+				man_section =
+		ia_css_param_terminal_manifest_get_prm_sct_desc(
+			(const ia_css_param_terminal_manifest_t *)manifest, i);
+
+			verifjmpexit(man_section != NULL);
+			verifjmpexit(section != NULL);
+
+			section->mem_size = man_section->max_mem_size;
+			section->mem_offset = curr_offset;
+			curr_offset += man_section->max_mem_size;
+		}
+	} else if (ia_css_is_terminal_manifest_program_terminal(manifest) ==
+			true &&
+		ia_css_terminal_manifest_get_type(manifest) ==
+		IA_CSS_TERMINAL_TYPE_PROGRAM) { /* for program terminal */
+		ia_css_program_terminal_t *prog_terminal =
+			(ia_css_program_terminal_t *)terminal;
+		const ia_css_program_terminal_manifest_t *prog_terminal_man =
+			(const ia_css_program_terminal_manifest_t *)manifest;
+		verifjmpexit(prog_terminal_man != NULL);
+
+		ia_css_kernel_fragment_sequencer_info_desc_t
+		*sequencer_info_desc_base = NULL;
+		uint16_t section_count = prog_terminal_man->
+		fragment_param_manifest_section_desc_count;
+		uint16_t manifest_info_count =
+			prog_terminal_man->
+			kernel_fragment_sequencer_info_manifest_info_count;
+		/* information needs to come from user or manifest once
+		 * the size sizeof function is updated.
+		 */
+		uint16_t nof_command_objs = 0;
+		size_t curr_offset = 0;
+
+		prog_terminal->kernel_fragment_sequencer_info_desc_offset =
+			sizeof(ia_css_program_terminal_t);
+		prog_terminal->fragment_param_section_desc_offset =
+			prog_terminal->
+			kernel_fragment_sequencer_info_desc_offset +
+			(fragment_count * manifest_info_count *
+			sizeof(ia_css_kernel_fragment_sequencer_info_desc_t)) +
+			(nof_command_objs *
+			sizeof(
+			ia_css_kernel_fragment_sequencer_command_desc_t));
+
+		NOT_USED(sequencer_info_desc_base);
+		/*Save fragments set fragment_count to 1*/
+		fragment_count = 1;
+		for (i = 0; i < fragment_count; i++) {
+			for (j = 0; j < section_count; j++) {
+				ia_css_fragment_param_section_desc_t *section =
+			ia_css_program_terminal_get_frgmnt_prm_sct_desc(
+					prog_terminal, i, j, section_count);
+			const ia_css_fragment_param_manifest_section_desc_t *
+			man_section =
+ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc
+				(prog_terminal_man, j);
+
+				verifjmpexit(man_section != NULL);
+				verifjmpexit(section != NULL);
+
+				section->mem_size = man_section->max_mem_size;
+				section->mem_offset = curr_offset;
+				curr_offset += man_section->max_mem_size;
+			}
+
+			sequencer_info_desc_base =
+		ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
+					prog_terminal, i, 0,
+					manifest_info_count);
+		prog_terminal->payload_fragment_stride = curr_offset;
+
+			/*
+			 * This offset cannot be initialized properly
+			 * since the number of commands in every sequencer
+			 * is not known at this point
+			 */
+			/*for (j = 0; j < manifest_info_count; j++) {
+				sequencer_info_desc_base[j].
+					command_desc_offset =
+				prog_terminal->
+				kernel_fragment_sequencer_info_desc_offset +
+				(manifest_info_count *
+				sizeof(
+				ia_css_kernel_fragment_sequencer_info_desc_t) +
+				(nof_command_objs *
+				sizeof(
+				ia_css_kernel_fragment_sequencer_command_desc_t
+				));
+			}*/
+		}
+	} else if (ia_css_is_terminal_manifest_spatial_parameter_terminal(
+				manifest) == true) {
+		ia_css_spatial_param_terminal_t *spatial_param_terminal =
+			(ia_css_spatial_param_terminal_t *)terminal;
+		ia_css_spatial_param_terminal_manifest_t *
+			spatia_param_terminal_man =
+			(ia_css_spatial_param_terminal_manifest_t *)manifest;
+
+		/* Initialize the spatial terminal structure */
+		spatial_param_terminal->fragment_grid_desc_offset =
+			sizeof(ia_css_spatial_param_terminal_t);
+		spatial_param_terminal->frame_grid_param_section_desc_offset =
+			spatial_param_terminal->fragment_grid_desc_offset +
+			(fragment_count * sizeof(ia_css_fragment_grid_desc_t));
+		spatial_param_terminal->kernel_id =
+			spatia_param_terminal_man->kernel_id;
+	} else if (ia_css_is_terminal_manifest_sliced_terminal(manifest) ==
+			true) {
+		ia_css_sliced_param_terminal_t *sliced_param_terminal =
+			(ia_css_sliced_param_terminal_t *)terminal;
+		ia_css_sliced_param_terminal_manifest_t
+		*sliced_param_terminal_man =
+			(ia_css_sliced_param_terminal_manifest_t *)manifest;
+
+		/* Initialize the sliced terminal structure */
+		sliced_param_terminal->fragment_slice_desc_offset =
+			sizeof(ia_css_sliced_param_terminal_t);
+		sliced_param_terminal->kernel_id =
+			sliced_param_terminal_man->kernel_id;
+	} else if (ia_css_is_terminal_manifest_program_control_init_terminal(
+			manifest) == true) {
+		ia_css_program_group_manifest_t *pg_manifest =
+			ia_css_terminal_manifest_get_parent(manifest);
+		ia_css_program_group_param_t *pg_param =
+			ia_css_terminal_param_get_parent(terminal_param);
+		ia_css_kernel_bitmap_t kernel_bitmap;
+
+		verifjmpexit(pg_manifest != NULL && pg_param != NULL);
+		kernel_bitmap =
+			ia_css_program_group_param_get_kernel_enable_bitmap(pg_param);
+
+		verifjmpexit(ia_css_program_control_init_terminal_init(
+			(ia_css_program_control_init_terminal_t *)
+			terminal,
+			(const ia_css_program_control_init_terminal_manifest_t *)
+			manifest, pg_manifest, kernel_bitmap) == 0);
+	} else {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_create failed, not a data or param terminal. Returning (%i)\n",
+			EFAULT);
+		goto EXIT;
+	}
+
+	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
+				   "ia_css_terminal_create(): Created successfully terminal %p, terminal ID = %d\n", terminal,
+				   terminal->ID);
+
+	retval = 0;
+EXIT:
+	if (NULL == manifest) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_terminal_create invalid argument\n");
+	}
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
+			"ia_css_terminal_create failed (%i)\n", retval);
+		terminal = ia_css_terminal_destroy(terminal);
+	}
+	return terminal;
+}
+
+ia_css_terminal_t *ia_css_terminal_destroy(
+	ia_css_terminal_t *terminal)
+{
+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
+		"ia_css_terminal_destroy(terminal %p): enter:\n", terminal);
+	return terminal;
+}
+
+uint16_t ia_css_param_terminal_compute_section_count(
+	const ia_css_terminal_manifest_t *manifest,
+	const ia_css_program_group_param_t *param) /* Delete 2nd argument*/
+{
+	uint16_t section_count = 0;
+
+	NOT_USED(param);
+
+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
+		"ia_css_param_terminal_compute_section_count(): enter:\n");
+
+	verifexit(manifest != NULL);
+	section_count = ((const ia_css_param_terminal_manifest_t *)manifest)->
+				param_manifest_section_desc_count;
+EXIT:
+	if (NULL == manifest || NULL == param) {
+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
+			"ia_css_param_terminal_compute_section_count: invalid argument\n");
+	}
+	return section_count;
+}
+#endif /* !defined(__VIED_CELL) */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal_manifest.c
new file mode 100644
index 000000000000..f0eb795707e7
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal_manifest.c
@@ -0,0 +1,776 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <ia_css_psys_terminal_manifest.h>
+
+/* Data object types on the terminals */
+#include <ia_css_program_group_data.h>
+/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_clear, ia_css_... */
+#include <ia_css_kernel_bitmap.h>
+
+#include "ia_css_psys_program_group_private.h"
+#include "ia_css_terminal_manifest.h"
+#include "ia_css_terminal_manifest_types.h"
+
+#include <error_support.h>
+#include <print_support.h>
+#include <misc_support.h>
+#include "ia_css_psys_static_trace.h"
+
+#ifndef __IA_CSS_PSYS_STATIC_INLINE__
+#include "ia_css_psys_terminal_manifest_impl.h"
+#endif
+#include "ia_css_terminal_manifest.h"
+
+/* We need to refactor those files in order to build in the firmware only
+   what is needed, switches are put current to workaround compilation problems
+   in the firmware (for example lack of uint64_t support)
+   supported in the firmware
+  */
+#if !defined(__HIVECC)
+static const char *terminal_type_strings[IA_CSS_N_TERMINAL_TYPES + 1] = {
+	"IA_CSS_TERMINAL_TYPE_DATA_IN",
+	"IA_CSS_TERMINAL_TYPE_DATA_OUT",
+	"IA_CSS_TERMINAL_TYPE_PARAM_STREAM",
+	/**< Type 1-5 parameter input */
+	"IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN",
+	/**< Type 1-5 parameter output */
+	"IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT",
+	/**< Represent the new type of terminal for
+	 * the "spatial dependent parameters", when params go in
+	 */
+	"IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN",
+	/**< Represent the new type of terminal for
+	 * the "spatial dependent parameters", when params go out
+	 */
+	"IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT",
+	/**< Represent the new type of terminal for
+	 * the explicit slicing, when params go in
+	 */
+	"IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN",
+	/**< Represent the new type of terminal for
+	 * the explicit slicing, when params go out
+	 */
+	"IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT",
+	/**< State (private data) input */
+	"IA_CSS_TERMINAL_TYPE_STATE_IN",
+	/**< State (private data) output */
+	"IA_CSS_TERMINAL_TYPE_STATE_OUT",
+	"IA_CSS_TERMINAL_TYPE_PROGRAM",
+	"IA_CSS_TERMINAL_TYPR_PROGRAM_CONTROL_INIT",
+	"UNDEFINED_TERMINAL_TYPE"};
+
+int ia_css_data_terminal_manifest_set_kernel_bitmap_unique(
+	ia_css_data_terminal_manifest_t *manifest,
+	const unsigned int index)
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_data_terminal_manifest_set_kernel_bitmap_unique(): enter:\n");
+
+	if (manifest != NULL) {
+		ia_css_kernel_bitmap_t kernel_bitmap =
+					ia_css_kernel_bitmap_clear();
+
+		kernel_bitmap = ia_css_kernel_bitmap_set(kernel_bitmap, index);
+		verifexit(!ia_css_is_kernel_bitmap_empty(kernel_bitmap));
+		verifexit(ia_css_data_terminal_manifest_set_kernel_bitmap(
+				manifest, kernel_bitmap) == 0);
+		retval = 0;
+	}
+
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+			"ia_css_data_terminal_manifest_set_kernel_bitmap_unique failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+int ia_css_data_terminal_manifest_set_min_size(
+	ia_css_data_terminal_manifest_t	*manifest,
+	const uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_data_terminal_manifest_set_min_size(): enter:\n");
+
+	verifexit(manifest != NULL);
+
+	manifest->min_size[IA_CSS_COL_DIMENSION] =
+		min_size[IA_CSS_COL_DIMENSION];
+	manifest->min_size[IA_CSS_ROW_DIMENSION] =
+		min_size[IA_CSS_ROW_DIMENSION];
+	retval = 0;
+
+EXIT:
+	if (NULL == manifest) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+			"ia_css_data_terminal_manifest_set_min_size: invalid argument\n");
+	}
+	return retval;
+}
+
+int ia_css_data_terminal_manifest_set_max_size(
+	ia_css_data_terminal_manifest_t	*manifest,
+	const uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_data_terminal_manifest_set_max_size(): enter:\n");
+
+	verifexit(manifest != NULL);
+
+	manifest->max_size[IA_CSS_COL_DIMENSION] =
+		max_size[IA_CSS_COL_DIMENSION];
+	manifest->max_size[IA_CSS_ROW_DIMENSION] =
+		max_size[IA_CSS_ROW_DIMENSION];
+	retval = 0;
+
+EXIT:
+	if (NULL == manifest) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+			"ia_css_data_terminal_manifest_set_max_size: invalid argument\n");
+	}
+	return retval;
+}
+#endif
+
+int ia_css_data_terminal_manifest_get_min_size(
+	const ia_css_data_terminal_manifest_t *manifest,
+	uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_data_terminal_manifest_get_min_size(): enter:\n");
+
+	verifexit(manifest != NULL);
+
+	min_size[IA_CSS_COL_DIMENSION] =
+		manifest->min_size[IA_CSS_COL_DIMENSION];
+	min_size[IA_CSS_ROW_DIMENSION] =
+		manifest->min_size[IA_CSS_ROW_DIMENSION];
+	retval = 0;
+
+EXIT:
+	if (NULL == manifest) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+			"ia_css_data_terminal_manifest_get_min_size: invalid argument\n");
+	}
+	return retval;
+}
+
+int ia_css_data_terminal_manifest_get_max_size(
+	const ia_css_data_terminal_manifest_t *manifest,
+	uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_data_terminal_manifest_get_max_size(): enter:\n");
+
+	verifexit(manifest != NULL);
+
+	max_size[IA_CSS_COL_DIMENSION] =
+		manifest->max_size[IA_CSS_COL_DIMENSION];
+	max_size[IA_CSS_ROW_DIMENSION] =
+		manifest->max_size[IA_CSS_ROW_DIMENSION];
+	retval = 0;
+
+EXIT:
+	if (NULL == manifest) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+			"ia_css_data_terminal_manifest_get_max_size: invalid argument\n");
+	}
+	return retval;
+}
+
+#if !defined(__HIVECC)
+int ia_css_data_terminal_manifest_set_min_fragment_size(
+	ia_css_data_terminal_manifest_t	*manifest,
+	const uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_data_terminal_manifest_set_min_fragment_size(): enter:\n");
+
+	verifexit(manifest != NULL);
+
+	manifest->min_fragment_size[IA_CSS_COL_DIMENSION] =
+		min_size[IA_CSS_COL_DIMENSION];
+	manifest->min_fragment_size[IA_CSS_ROW_DIMENSION] =
+		min_size[IA_CSS_ROW_DIMENSION];
+	retval = 0;
+
+EXIT:
+	if (NULL == manifest) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+			"ia_css_data_terminal_manifest_set_min_fragment_size invalid argument\n");
+	}
+	return retval;
+}
+
+int ia_css_data_terminal_manifest_set_max_fragment_size(
+	ia_css_data_terminal_manifest_t	*manifest,
+	const uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_data_terminal_manifest_set_max_fragment_size(): enter:\n");
+
+	verifexit(manifest != NULL);
+
+	manifest->max_fragment_size[IA_CSS_COL_DIMENSION] =
+		max_size[IA_CSS_COL_DIMENSION];
+	manifest->max_fragment_size[IA_CSS_ROW_DIMENSION] =
+		max_size[IA_CSS_ROW_DIMENSION];
+	retval = 0;
+
+EXIT:
+	if (NULL == manifest) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+			"ia_css_data_terminal_manifest_set_max_fragment_size invalid argument\n");
+	}
+	return retval;
+}
+#endif
+
+int ia_css_data_terminal_manifest_get_min_fragment_size(
+	const ia_css_data_terminal_manifest_t *manifest,
+	uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_data_terminal_manifest_get_min_fragment_size(): enter:\n");
+
+	verifexit(manifest != NULL);
+
+	min_size[IA_CSS_COL_DIMENSION] =
+		manifest->min_fragment_size[IA_CSS_COL_DIMENSION];
+	min_size[IA_CSS_ROW_DIMENSION] =
+		manifest->min_fragment_size[IA_CSS_ROW_DIMENSION];
+	retval = 0;
+
+EXIT:
+	if (NULL == manifest) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+			"ia_css_data_terminal_manifest_get_min_fragment_size invalid argument\n");
+	}
+	return retval;
+}
+
+int ia_css_data_terminal_manifest_get_max_fragment_size(
+	const ia_css_data_terminal_manifest_t *manifest,
+	uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
+{
+	int retval = -1;
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
+		"ia_css_data_terminal_manifest_get_max_fragment_size(): enter:\n");
+
+	verifexit(manifest != NULL);
+
+	max_size[IA_CSS_COL_DIMENSION] =
+		manifest->max_fragment_size[IA_CSS_COL_DIMENSION];
+	max_size[IA_CSS_ROW_DIMENSION] =
+		manifest->max_fragment_size[IA_CSS_ROW_DIMENSION];
+	retval = 0;
+
+EXIT:
+	if (NULL == manifest) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
+			"ia_css_data_terminal_manifest_get_max_fragment_size invalid argument\n");
+	}
+	return retval;
+}
+
+/* We need to refactor those files in order to build in the firmware only
+   what is needed, switches are put current to workaround compilation problems
+   in the firmware (for example lack of uint64_t support)
+   supported in the firmware
+  */
+#if !defined(__HIVECC)
+
+#define PRINT_DIMENSION(name, var) IA_CSS_TRACE_3(PSYSAPI_STATIC, \
+	INFO, "%s:\t%d %d\n", \
+	(name), \
+	(var)[IA_CSS_COL_DIMENSION], \
+	(var)[IA_CSS_ROW_DIMENSION])
+
+int ia_css_terminal_manifest_print(
+	const ia_css_terminal_manifest_t *manifest,
+	void *fid)
+{
+	int retval = -1;
+	ia_css_terminal_type_t terminal_type =
+		ia_css_terminal_manifest_get_type(manifest);
+
+	IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
+		"ia_css_terminal_manifest_print(): enter:\n");
+
+	verifexit(manifest != NULL);
+	NOT_USED(fid);
+	NOT_USED(terminal_type_strings);
+
+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "sizeof(manifest) = %d\n",
+		(int)ia_css_terminal_manifest_get_size(manifest));
+#ifndef __XTENSA_FW__
+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "typeof(manifest) = %s\n",
+			terminal_type_strings[terminal_type]);
+#endif
+	if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
+		terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) {
+		ia_css_param_terminal_manifest_t *pterminal_manifest =
+			(ia_css_param_terminal_manifest_t *)manifest;
+		uint16_t section_count =
+			pterminal_manifest->param_manifest_section_desc_count;
+		int	i;
+
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"sections(manifest) = %d\n", (int)section_count);
+		for (i = 0; i < section_count; i++) {
+			const ia_css_param_manifest_section_desc_t *manifest =
+		ia_css_param_terminal_manifest_get_prm_sct_desc(
+			pterminal_manifest, i);
+			verifjmpexit(manifest != NULL);
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+				"kernel_id = %d\n", (int)ia_css_param_manifest_section_desc_get_kernel_id(manifest));
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+				"mem_type_id = %d\n",
+				(int)ia_css_param_manifest_section_desc_get_mem_type_id(manifest));
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+				"max_mem_size = %d\n",
+				(int)manifest->max_mem_size);
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+				"region_id = %d\n",
+				(int)ia_css_param_manifest_section_desc_get_region_id(manifest));
+		}
+	} else if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN ||
+		terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT) {
+		ia_css_sliced_param_terminal_manifest_t
+		*sliced_terminal_manifest =
+			(ia_css_sliced_param_terminal_manifest_t *)manifest;
+		uint32_t kernel_id;
+		uint16_t section_count;
+		uint16_t section_idx;
+
+		kernel_id = sliced_terminal_manifest->kernel_id;
+		section_count =
+			sliced_terminal_manifest->sliced_param_section_count;
+
+		NOT_USED(kernel_id);
+
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"kernel_id = %d\n", (int)kernel_id);
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"section_count = %d\n", (int)section_count);
+
+		for (section_idx = 0; section_idx < section_count;
+			section_idx++) {
+			ia_css_sliced_param_manifest_section_desc_t
+				*sliced_param_manifest_section_desc;
+
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+				"section %d\n", (int)section_idx);
+			sliced_param_manifest_section_desc =
+		ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
+				sliced_terminal_manifest, section_idx);
+			verifjmpexit(sliced_param_manifest_section_desc !=
+				NULL);
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+				"mem_type_id = %d\n",
+			(int)sliced_param_manifest_section_desc->mem_type_id);
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+				"region_id = %d\n",
+			(int)sliced_param_manifest_section_desc->region_id);
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+				"max_mem_size = %d\n",
+			(int)sliced_param_manifest_section_desc->max_mem_size);
+		}
+	} else if (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM) {
+		ia_css_program_terminal_manifest_t *program_terminal_manifest =
+			(ia_css_program_terminal_manifest_t *)manifest;
+		uint32_t sequencer_info_kernel_id;
+		uint16_t max_kernel_fragment_sequencer_command_desc;
+		uint16_t kernel_fragment_sequencer_info_manifest_info_count;
+		uint16_t seq_info_idx;
+		uint16_t section_count =
+			program_terminal_manifest->fragment_param_manifest_section_desc_count;
+		uint16_t sec_idx;
+
+		sequencer_info_kernel_id =
+			program_terminal_manifest->sequencer_info_kernel_id;
+		max_kernel_fragment_sequencer_command_desc =
+			program_terminal_manifest->
+			max_kernel_fragment_sequencer_command_desc;
+		kernel_fragment_sequencer_info_manifest_info_count =
+			program_terminal_manifest->
+			kernel_fragment_sequencer_info_manifest_info_count;
+
+		NOT_USED(sequencer_info_kernel_id);
+		NOT_USED(max_kernel_fragment_sequencer_command_desc);
+
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"sequencer_info_kernel_id = %d\n",
+			(int)sequencer_info_kernel_id);
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"max_kernel_fragment_sequencer_command_desc = %d\n",
+			(int)max_kernel_fragment_sequencer_command_desc);
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"kernel_fragment_sequencer_info_manifest_info_count = %d\n",
+			(int)
+			kernel_fragment_sequencer_info_manifest_info_count);
+
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"fragment_param_manifest_section_desc_count = %d\n", (int)section_count);
+		for (sec_idx = 0; sec_idx < section_count; sec_idx++) {
+			const ia_css_fragment_param_manifest_section_desc_t *ptmanifest =
+		ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
+			program_terminal_manifest, sec_idx);
+			NOT_USED(ptmanifest);
+			verifjmpexit(manifest != NULL);
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+				"kernel_id = %d\n", (int)ia_css_fragment_param_manifest_section_desc_get_kernel_id(ptmanifest));
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+				"mem_type_id = %d\n",
+				(int)ia_css_fragment_param_manifest_section_desc_get_mem_type_id(ptmanifest));
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+				"max_mem_size = %d\n",
+				(int)ptmanifest->max_mem_size);
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+				"region_id = %d\n",
+				(int)ia_css_fragment_param_manifest_section_desc_get_region_id(ptmanifest));
+		}
+		for (seq_info_idx = 0; seq_info_idx <
+			kernel_fragment_sequencer_info_manifest_info_count;
+				seq_info_idx++) {
+			ia_css_kernel_fragment_sequencer_info_manifest_desc_t
+				*sequencer_info_manifest_desc;
+
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+				"sequencer info %d\n", (int)seq_info_idx);
+			sequencer_info_manifest_desc =
+		ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc
+				(program_terminal_manifest, seq_info_idx);
+			verifjmpexit(sequencer_info_manifest_desc != NULL);
+			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+				"min_fragment_grid_slice_dimension[] = {%d, %d}\n",
+				(int)sequencer_info_manifest_desc->
+				min_fragment_grid_slice_dimension[
+						IA_CSS_COL_DIMENSION],
+				(int)sequencer_info_manifest_desc->
+				min_fragment_grid_slice_dimension[
+						IA_CSS_ROW_DIMENSION]);
+			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+				"max_fragment_grid_slice_dimension[] = {%d, %d}\n",
+				(int)sequencer_info_manifest_desc->
+				max_fragment_grid_slice_dimension[
+						IA_CSS_COL_DIMENSION],
+				(int)sequencer_info_manifest_desc->
+				max_fragment_grid_slice_dimension[
+						IA_CSS_ROW_DIMENSION]);
+			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+				"min_fragment_grid_slice_count[] = {%d, %d}\n",
+				(int)sequencer_info_manifest_desc->
+				min_fragment_grid_slice_count[
+						IA_CSS_COL_DIMENSION],
+				(int)sequencer_info_manifest_desc->
+				min_fragment_grid_slice_count[
+						IA_CSS_ROW_DIMENSION]);
+			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+				"max_fragment_grid_slice_count[] = {%d, %d}\n",
+				(int)sequencer_info_manifest_desc->
+				max_fragment_grid_slice_count[
+						IA_CSS_COL_DIMENSION],
+				(int)sequencer_info_manifest_desc->
+				max_fragment_grid_slice_count[
+						IA_CSS_ROW_DIMENSION]);
+			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+				"min_fragment_grid_point_decimation_factor[] = {%d, %d}\n",
+				(int)sequencer_info_manifest_desc->
+				min_fragment_grid_point_decimation_factor[
+						IA_CSS_COL_DIMENSION],
+				(int)sequencer_info_manifest_desc->
+				min_fragment_grid_point_decimation_factor[
+						IA_CSS_ROW_DIMENSION]);
+			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+				"max_fragment_grid_point_decimation_factor[] = {%d, %d}\n",
+				(int)sequencer_info_manifest_desc->
+				max_fragment_grid_point_decimation_factor[
+						IA_CSS_COL_DIMENSION],
+				(int)sequencer_info_manifest_desc->
+				max_fragment_grid_point_decimation_factor[
+						IA_CSS_ROW_DIMENSION]);
+			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+				"min_fragment_grid_overlay_on_pixel_topleft_index[] = {%d, %d}\n",
+				(int)sequencer_info_manifest_desc->
+			min_fragment_grid_overlay_pixel_topleft_index[
+						IA_CSS_COL_DIMENSION],
+				(int)sequencer_info_manifest_desc->
+			min_fragment_grid_overlay_pixel_topleft_index[
+						IA_CSS_ROW_DIMENSION]);
+			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+				"max_fragment_grid_overlay_on_pixel_topleft_index[] = {%d, %d}\n",
+				(int)sequencer_info_manifest_desc->
+			max_fragment_grid_overlay_pixel_topleft_index[
+						IA_CSS_COL_DIMENSION],
+				(int)sequencer_info_manifest_desc->
+			max_fragment_grid_overlay_pixel_topleft_index[
+						IA_CSS_ROW_DIMENSION]);
+			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+				"min_fragment_grid_overlay_on_pixel_dimension[] = {%d, %d}\n",
+				(int)sequencer_info_manifest_desc->
+				min_fragment_grid_overlay_pixel_dimension[
+						IA_CSS_COL_DIMENSION],
+				(int)sequencer_info_manifest_desc->
+				min_fragment_grid_overlay_pixel_dimension[
+						IA_CSS_ROW_DIMENSION]);
+			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
+				"max_fragment_grid_overlay_on_pixel_dimension[] = {%d, %d}\n",
+				(int)sequencer_info_manifest_desc->
+				max_fragment_grid_overlay_pixel_dimension[
+						IA_CSS_COL_DIMENSION],
+				(int)sequencer_info_manifest_desc->
+				max_fragment_grid_overlay_pixel_dimension[
+						IA_CSS_ROW_DIMENSION]);
+		}
+	} else if (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) {
+		ia_css_program_control_init_terminal_manifest_t *progctrlinit_man =
+			(ia_css_program_control_init_terminal_manifest_t *)manifest;
+		ia_css_program_control_init_terminal_manifest_print(progctrlinit_man);
+	} else if (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN ||
+		terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) {
+
+		ia_css_data_terminal_manifest_t *dterminal_manifest =
+			(ia_css_data_terminal_manifest_t *)manifest;
+		int i;
+
+		NOT_USED(dterminal_manifest);
+
+		verifexit(ia_css_kernel_bitmap_print(
+			ia_css_data_terminal_manifest_get_kernel_bitmap(
+				dterminal_manifest), fid) == 0);
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"formats(manifest) = %04x\n",
+		(int)ia_css_data_terminal_manifest_get_frame_format_bitmap(
+			dterminal_manifest));
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"connection(manifest) = %04x\n",
+		(int)ia_css_data_terminal_manifest_get_connection_bitmap(
+			dterminal_manifest));
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"dependent(manifest) = %d\n",
+			(int)dterminal_manifest->terminal_dependency);
+
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\tmin_size[%d]   = {\n",
+			IA_CSS_N_DATA_DIMENSION);
+		for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+				"\t\t%4d,\n", dterminal_manifest->min_size[i]);
+		}
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\t\t%4d }\n", dterminal_manifest->min_size[i]);
+
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\tmax_size[%d]   = {\n", IA_CSS_N_DATA_DIMENSION);
+		for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\t\t%4d,\n", dterminal_manifest->max_size[i]);
+		}
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\t\t%4d }\n", dterminal_manifest->max_size[i]);
+
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\tmin_fragment_size[%d]   = {\n",
+			IA_CSS_N_DATA_DIMENSION);
+		for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+				"\t\t%4d,\n",
+				dterminal_manifest->min_fragment_size[i]);
+		}
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\t\t%4d }\n",
+			dterminal_manifest->min_fragment_size[i]);
+
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\tmax_fragment_size[%d]   = {\n",
+			IA_CSS_N_DATA_DIMENSION);
+		for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+				"\t\t%4d,\n",
+				dterminal_manifest->max_fragment_size[i]);
+		}
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
+			"\t\t%4d }\n",
+			dterminal_manifest->max_fragment_size[i]);
+
+	} else if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN ||
+		terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT) {
+
+		ia_css_spatial_param_terminal_manifest_t *stm =
+			(ia_css_spatial_param_terminal_manifest_t *)manifest;
+		ia_css_frame_grid_param_manifest_section_desc_t *sec;
+		int sec_count =
+			stm->frame_grid_param_manifest_section_desc_count;
+		int sec_index;
+
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "kernel_id:\t\t%d\n",
+			stm->kernel_id);
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "compute_units_p_elem:\t%d\n",
+			stm->compute_units_p_elem);
+#ifndef __XTENSA_FW__
+		PRINT_DIMENSION("min_fragment_grid_dimension",
+			stm->common_fragment_grid_desc.min_fragment_grid_dimension);
+		PRINT_DIMENSION("max_fragment_grid_dimension",
+			stm->common_fragment_grid_desc.max_fragment_grid_dimension);
+		PRINT_DIMENSION("min_frame_grid_dimension",
+			stm->frame_grid_desc.min_frame_grid_dimension);
+		PRINT_DIMENSION("max_frame_grid_dimension",
+			stm->frame_grid_desc.max_frame_grid_dimension);
+#endif
+		for (sec_index = 0; sec_index < sec_count; sec_index++) {
+			sec = ia_css_spatial_param_terminal_manifest_get_frm_grid_prm_sct_desc(
+				stm, sec_index);
+			verifjmpexit(sec != NULL);
+
+			IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO, "--------------------------\n");
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tmem_type_id:\t%d\n",
+				sec->mem_type_id);
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tregion_id:\t%d\n",
+				sec->region_id);
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\telem_size:\t%d\n",
+				sec->elem_size);
+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tmax_mem_size:\t%d\n",
+				sec->max_mem_size);
+		}
+	} else if (terminal_type < IA_CSS_N_TERMINAL_TYPES) {
+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
+			"terminal type can not be pretty printed, not supported\n");
+	}
+
+	retval = 0;
+EXIT:
+	if (retval != 0) {
+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
+			"ia_css_terminal_manifest_print failed (%i)\n",
+			retval);
+	}
+	return retval;
+}
+
+/* Program control init Terminal */
+unsigned int ia_css_program_control_init_terminal_manifest_get_connect_section_count(
+	const ia_css_program_control_init_manifest_program_desc_t *prog)
+{
+	assert(prog);
+	return prog->connect_section_count;
+}
+
+unsigned int ia_css_program_control_init_terminal_manifest_get_load_section_count(
+	const ia_css_program_control_init_manifest_program_desc_t *prog)
+{
+	assert(prog);
+	return prog->load_section_count;
+}
+
+unsigned int ia_css_program_control_init_terminal_manifest_get_size(
+	const uint16_t nof_programs,
+	const uint16_t *nof_load_sections,
+	const uint16_t *nof_connect_sections)
+{
+	(void)nof_load_sections; /* might be needed in future */
+	(void)nof_connect_sections; /* might be needed in future */
+
+	return sizeof(ia_css_program_control_init_terminal_manifest_t) +
+		nof_programs *
+		sizeof(ia_css_program_control_init_manifest_program_desc_t);
+}
+
+ia_css_program_control_init_manifest_program_desc_t *
+ia_css_program_control_init_terminal_manifest_get_program_desc(
+	const ia_css_program_control_init_terminal_manifest_t *terminal,
+	unsigned int program)
+{
+	ia_css_program_control_init_manifest_program_desc_t *progs;
+
+	assert(terminal != NULL);
+	assert(program < terminal->program_count);
+
+	progs = (ia_css_program_control_init_manifest_program_desc_t *)
+		((const char *)terminal + terminal->program_desc_offset);
+
+	return &progs[program];
+}
+
+int ia_css_program_control_init_terminal_manifest_init(
+	ia_css_program_control_init_terminal_manifest_t *terminal,
+	const uint16_t nof_programs,
+	const uint16_t *nof_load_sections,
+	const uint16_t *nof_connect_sections)
+{
+	unsigned int i;
+	ia_css_program_control_init_manifest_program_desc_t *progs;
+
+	if (terminal == NULL) {
+		return -EFAULT;
+	}
+
+	terminal->program_count = nof_programs;
+	terminal->program_desc_offset =
+		sizeof(ia_css_program_control_init_terminal_manifest_t);
+
+	progs = ia_css_program_control_init_terminal_manifest_get_program_desc(
+		terminal, 0);
+
+	for (i = 0; i < nof_programs; i++) {
+		progs[i].load_section_count = nof_load_sections[i];
+		progs[i].connect_section_count = nof_connect_sections[i];
+	}
+	return 0;
+}
+
+void ia_css_program_control_init_terminal_manifest_print(
+	ia_css_program_control_init_terminal_manifest_t *terminal)
+{
+	unsigned int i;
+
+	ia_css_program_control_init_manifest_program_desc_t *progs;
+
+	progs = ia_css_program_control_init_terminal_manifest_get_program_desc(
+		terminal, 0);
+
+	assert(progs);
+	(void)progs;
+
+	for (i = 0; i < terminal->program_count; i++) {
+		IA_CSS_TRACE_3(PSYSAPI_STATIC, INFO,
+			"program index: %d, load sec: %d, connect sec: %d\n",
+			i,
+			progs[i].load_section_count,
+			progs[i].connect_section_count);
+	}
+}
+
+#endif
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_rbm.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_rbm.c
new file mode 100644
index 000000000000..85982fb184a4
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_rbm.c
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IA_CSS_RBM_INLINE__
+#include "ia_css_rbm_impl.h"
+#endif /* __IA_CSS_RBM_INLINE__ */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal.c
new file mode 100644
index 000000000000..4a124962fefb
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal.c
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifdef __INLINE_PARAMETERS__
+#include "storage_class.h"
+STORAGE_CLASS_INLINE int __ia_css_param_avoid_warning_on_empty_file(void) { return 0; }
+#else /* __INLINE_PARAMETERS__ */
+#include "ia_css_terminal_impl.h"
+#endif /* __INLINE_PARAMETERS__ */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal_manifest.c
new file mode 100644
index 000000000000..d051f1d38657
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal_manifest.c
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifdef __INLINE_PARAMETERS__
+#include "storage_class.h"
+STORAGE_CLASS_INLINE int __ia_css_param_avoid_warning_on_empty_file(void) { return 0; }
+#else /* __INLINE_PARAMETERS__ */
+#include "ia_css_terminal_manifest_impl.h"
+#endif /* __INLINE_PARAMETERS__ */
diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/vied_nci_psys_system.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/vied_nci_psys_system.c
new file mode 100644
index 000000000000..8d69d999c9ba
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/vied_nci_psys_system.c
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ia_css_psys_sim_storage_class.h"
+
+/*
+ * Functions to possibly inline
+ */
+
+#ifdef __IA_CSS_PSYS_SIM_INLINE__
+STORAGE_CLASS_INLINE int
+__ia_css_psys_system_global_avoid_warning_on_empty_file(void) { return 0; }
+#else /* __IA_CSS_PSYS_SIM_INLINE__ */
+#include "psys_system_global_impl.h"
+#endif /* __IA_CSS_PSYS_SIM_INLINE__ */
diff --git a/camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.cpp b/camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.cpp
new file mode 100644
index 000000000000..b3227fb3ddd6
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.cpp
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "Camera3BufferPool"
+
+#include "HALv3Utils.h"
+#include "iutils/Utils.h"
+#include "Camera3BufferPool.h"
+
+namespace camera3 {
+
+Camera3BufferPool::Camera3BufferPool()
+{
+    LOG1("@%s", __func__);
+}
+
+Camera3BufferPool::~Camera3BufferPool()
+{
+    LOG1("@%s", __func__);
+    destroyBufferPool();
+}
+
+// Create the buffer pool with HEAP buffer
+icamera::status_t Camera3BufferPool::createBufferPool(int cameraId, uint32_t numBufs, const icamera::stream_t &stream)
+{
+    LOG1("@%s number of buffers:%d", __func__, numBufs);
+    std::lock_guard<std::mutex> l(mLock);
+    mBuffers.clear();
+
+    for (uint32_t i = 0; i < numBufs; i++) {
+        std::shared_ptr<Camera3Buffer> buffer = MemoryUtils::allocateHeapBuffer(stream.width, stream.height, stream.stride,
+                                                                           stream.format, cameraId, stream.size);
+        if (!buffer) {
+            mBuffers.clear();
+            LOGE("failed to alloc %d internal buffers", i);
+            return icamera::NO_MEMORY;
+        }
+
+        // Initialize the buffer status to free
+        mBuffers[buffer] = false;
+    }
+
+    return icamera::OK;
+}
+
+// Create the buffer pool with GFX handle buffer
+icamera::status_t Camera3BufferPool::createBufferPool(int cameraId, uint32_t numBufs, int width,
+                                                      int height, int gfxFmt, int usage)
+{
+    LOG1("@%s number of buffers:%d", __func__, numBufs);
+    std::lock_guard<std::mutex> l(mLock);
+    mBuffers.clear();
+
+    for (uint32_t i = 0; i < numBufs; i++) {
+        std::shared_ptr<Camera3Buffer> buffer = MemoryUtils::allocateHandleBuffer(width, height, gfxFmt,
+                                                                             usage, cameraId);
+        if (!buffer || buffer->lock() != icamera::OK) {
+            mBuffers.clear();
+            LOGE("failed to alloc %d internal buffers", i);
+            return icamera::NO_MEMORY;
+        }
+
+        // Initialize the buffer status to free
+        mBuffers[buffer] = false;
+    }
+
+    return icamera::OK;
+}
+
+void Camera3BufferPool::destroyBufferPool()
+{
+    LOG1("@%s Internal buffers size:%zu", __func__, mBuffers.size());
+
+    std::lock_guard<std::mutex> l(mLock);
+    mBuffers.clear();
+}
+
+std::shared_ptr<Camera3Buffer> Camera3BufferPool::acquireBuffer()
+{
+    std::lock_guard<std::mutex> l(mLock);
+    for (auto &buf : mBuffers) {
+        if (!buf.second) {
+            buf.second = true;
+            LOG2("%s addr:%p", __func__, buf.first->data());
+            return buf.first;
+        }
+    }
+
+    LOGE("%s all the internal buffers are busy", __func__);
+    return nullptr;
+}
+
+void Camera3BufferPool::returnBuffer(std::shared_ptr<Camera3Buffer> buffer)
+{
+    std::lock_guard<std::mutex> l(mLock);
+    for (auto &buf : mBuffers) {
+        if (buf.second && buf.first == buffer) {
+            LOG2("%s addr:%p", __func__, buffer->data());
+            buf.second = false;
+            return;
+        }
+    }
+
+    LOGE("%s, the internal buffer addr:%p not found", __func__, buffer->data());
+}
+
+std::shared_ptr<Camera3Buffer> Camera3BufferPool::findBuffer(void *memAddr)
+{
+    std::lock_guard<std::mutex> l(mLock);
+    for (auto &buf : mBuffers) {
+        if (buf.second && buf.first->data() == memAddr) {
+            LOG2("%s addr:%p", __func__, memAddr);
+            return buf.first;
+        }
+    }
+
+    LOGE("%s, Failed to find the internal buffer addr: %p", __func__, memAddr);
+    return nullptr;
+}
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.h b/camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.h
new file mode 100644
index 000000000000..8a986b449c6d
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <mutex>
+#include <unordered_map>
+#include "Camera3Buffer.h"
+
+namespace camera3 {
+
+/**
+ * \class Camera3BufferPool
+ *
+ * This class is used to manage a memory pool based on Camera3Buffer
+ * It needs to follow the calling sequence:
+ * createBufferPool -> acquireBuffer -> findBuffer -> returnBuffer
+ */
+class Camera3BufferPool {
+
+public:
+    Camera3BufferPool();
+    ~Camera3BufferPool();
+
+    icamera::status_t createBufferPool(int cameraId, uint32_t numBufs, const icamera::stream_t &stream);
+    icamera::status_t createBufferPool(int cameraId, uint32_t numBufs, int width, int height, int gfxFmt, int usage);
+
+    void destroyBufferPool();
+    std::shared_ptr<Camera3Buffer> acquireBuffer();
+    void returnBuffer(std::shared_ptr<Camera3Buffer> buffer);
+    std::shared_ptr<Camera3Buffer> findBuffer(void *memAddr);
+
+private:
+    std::unordered_map<std::shared_ptr<Camera3Buffer>, bool> mBuffers;
+                      // first: camera3Buffer, second: true as buffer in used
+    std::mutex mLock; // lock the mBuffers
+};
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.cpp b/camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.cpp
new file mode 100644
index 000000000000..580387eddcc3
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.cpp
@@ -0,0 +1,555 @@
+/*
+ * Copyright (C) 2013-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "Camera3Buffer"
+
+#include <sys/mman.h>
+#include <unistd.h>
+#include <sync/sync.h>
+
+#include "iutils/Errors.h"
+#include "iutils/CameraDump.h"
+#include "iutils/Utils.h"
+#include "HALv3Utils.h"
+#include "Camera3Buffer.h"
+#include "Camera3Stream.h"
+
+using namespace icamera;
+
+namespace camera3 {
+////////////////////////////////////////////////////////////////////
+// PUBLIC METHODS
+////////////////////////////////////////////////////////////////////
+
+/**
+ * Camera3Buffer
+ *
+ * Default constructor
+ * This constructor is used when we pre-allocate the Camera3Buffer object
+ * The initialization will be done as a second stage wit the method
+ * init(), where we initialize the wrapper with the gralloc buffer provided by
+ * the framework
+ */
+Camera3Buffer::Camera3Buffer() :
+    mFormat(0),
+    mInit(false),
+    mLocked(false),
+    mType(BUF_TYPE_HANDLE),
+    mHandlePtr(nullptr),
+    mCameraId(0),
+    mRegistered(false),
+    mGbmBufferManager(nullptr)
+{
+    CLEAR(mHalBuffer);
+    LOG1("%s default constructor for buf %p", __func__, this);
+}
+
+/**
+ * Camera3Buffer
+ *
+ * Constructor for buffers allocated using MemoryUtils::allocateHeapBuffer
+ *
+ * \param w [IN] width
+ * \param h [IN] height
+ * \param s [IN] stride
+ * \param v4l2fmt [IN] V4l2 format
+ * \param usrPtr [IN] Data pointer
+ * \param cameraId [IN] id of camera being used
+ * \param dataSizeOverride [IN] buffer size input. Default is 0 and frameSize()
+                                is used in that case.
+ */
+Camera3Buffer::Camera3Buffer(int w, int h, int stride, int v4l2fmt,
+                             void* usrPtr, int cameraId, int dataSizeOverride):
+    mFormat(0),
+    mInit(false),
+    mLocked(true),
+    mType(BUF_TYPE_MALLOC),
+    mHandlePtr(nullptr),
+    mCameraId(cameraId)
+
+{
+    LOG1("%s create malloc camera buffer %p", __func__, this);
+
+    CLEAR(mHalBuffer);
+    mHalBuffer.s.format = v4l2fmt;
+    mHalBuffer.s.width = w;
+    mHalBuffer.s.height = h;
+    mHalBuffer.s.stride = stride;
+    mHalBuffer.s.memType = V4L2_MEMORY_USERPTR;
+    mHalBuffer.flags = camera_buffer_flags_t::BUFFER_FLAG_SW_WRITE;
+
+    if (usrPtr != nullptr) {
+        mHalBuffer.addr = usrPtr;
+        mInit = true;
+        mHalBuffer.s.size = dataSizeOverride ? dataSizeOverride :
+                            CameraUtils::getFrameSize(v4l2fmt, stride, h);
+    } else {
+        LOGE("Tried to initialize a buffer with nullptr ptr!!");
+    }
+}
+
+Camera3Buffer::~Camera3Buffer()
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
+
+    if (mInit) {
+        switch(mType) {
+        case BUF_TYPE_MALLOC:
+            free(mHalBuffer.addr);
+            mHalBuffer.addr = nullptr;
+            break;
+        case BUF_TYPE_MMAP:
+            if (mHalBuffer.addr != nullptr)
+                munmap(mHalBuffer.addr, mHalBuffer.s.size);
+            mHalBuffer.addr = nullptr;
+            mHalBuffer.s.size = 0;
+            close(mHalBuffer.dmafd);
+            break;
+        case BUF_TYPE_HANDLE:
+            // Allocated by the HAL
+            if (!(mUserBuffer.stream)) {
+                LOG1("release internal buffer");
+                // For HAL buffer, need to unlock before free it
+                unlock();
+                mGbmBufferManager->Free(mHandle);
+            }
+            break;
+        default:
+            break;
+        }
+    }
+    LOG1("%s destroying buf %p", __func__, this);
+}
+
+/**
+ * init
+ *
+ * Construct to wrap a camera3_stream_buffer
+ *
+ * \param aBuffer [IN] camera3_stream_buffer buffer
+ */
+icamera::status_t Camera3Buffer::init(const camera3_stream_buffer *aBuffer, int cameraId)
+{
+    mType = BUF_TYPE_HANDLE;
+    mGbmBufferManager = cros::CameraBufferManager::GetInstance();
+    mHandle = *aBuffer->buffer;
+    mHandlePtr = aBuffer->buffer;
+    mHalBuffer.s.width = aBuffer->stream->width;
+    mHalBuffer.s.height = aBuffer->stream->height;
+    mFormat = aBuffer->stream->format;
+    mHalBuffer.s.memType = mFormat == HAL_PIXEL_FORMAT_RAW_OPAQUE ?
+        V4L2_MEMORY_USERPTR : V4L2_MEMORY_DMABUF;
+    mHalBuffer.s.format = mGbmBufferManager->GetV4L2PixelFormat(mHandle);
+    // Use actual width from platform native handle for stride
+    mHalBuffer.s.stride = mGbmBufferManager->GetPlaneStride(*aBuffer->buffer, 0);
+    mHalBuffer.s.size = CameraUtils::getFrameSize(mHalBuffer.s.format,
+                                                  mHalBuffer.s.stride, mHalBuffer.s.height);
+    mHalBuffer.flags = camera_buffer_flags_t::BUFFER_FLAG_SW_WRITE;
+    mLocked = false;
+    mInit = true;
+    mHalBuffer.addr = nullptr;
+    mUserBuffer = *aBuffer;
+    mUserBuffer.release_fence = -1;
+    mCameraId = cameraId;
+    LOG2("@%s, mHandle:%p, mFormat:%d, width:%d, height:%d, stride:%d, size: %d",
+         __func__, mHandle, mFormat, mHalBuffer.s.width, mHalBuffer.s.height,
+         mHalBuffer.s.stride, mHalBuffer.s.size);
+
+    if (mHandle == nullptr) {
+        LOGE("@%s: invalid buffer handle", __func__);
+        mUserBuffer.status = CAMERA3_BUFFER_STATUS_ERROR;
+        return BAD_VALUE;
+    }
+
+    mHalBuffer.dmafd = mHandle->data[0];
+    int ret = registerBuffer();
+    if (ret) {
+        mUserBuffer.status = CAMERA3_BUFFER_STATUS_ERROR;
+        return UNKNOWN_ERROR;
+    }
+
+    /* TODO: add some consistency checks here and return an error */
+    return icamera::OK;
+}
+
+icamera::status_t Camera3Buffer::init(const camera3_stream_t* stream,
+                                      buffer_handle_t handle, int cameraId)
+{
+    mType = BUF_TYPE_HANDLE;
+    mGbmBufferManager = cros::CameraBufferManager::GetInstance();
+    mHandle = handle;
+    mHalBuffer.s.width = stream->width;
+    mHalBuffer.s.height = stream->height;
+    mFormat = stream->format;
+    mHalBuffer.s.memType = V4L2_MEMORY_USERPTR;
+    mHalBuffer.s.format = mGbmBufferManager->GetV4L2PixelFormat(mHandle);
+    // Use actual width from platform native handle for stride
+    mHalBuffer.s.stride = mGbmBufferManager->GetPlaneStride(handle, 0);
+    mHalBuffer.s.size = 0;
+    mHalBuffer.flags = camera_buffer_flags_t::BUFFER_FLAG_SW_WRITE;
+    mLocked = false;
+    mInit = true;
+    mHalBuffer.addr = nullptr;
+    mCameraId = cameraId;
+    LOG2("@%s, mHandle:%p, mFormat:%d, width:%d, height:%d, stride:%d",
+         __func__, mHandle, mFormat, mHalBuffer.s.width, mHalBuffer.s.height, mHalBuffer.s.stride);
+
+    return icamera::OK;
+}
+
+icamera::status_t Camera3Buffer::deinit()
+{
+    return deregisterBuffer();
+}
+
+icamera::status_t Camera3Buffer::waitOnAcquireFence()
+{
+    const int BUFFER_READY = -1;
+    if (mUserBuffer.acquire_fence != BUFFER_READY) {
+        LOG2("%s: Fence in HAL is %d", __func__, mUserBuffer.acquire_fence);
+        const int WAIT_TIME_OUT_MS = 300;
+        int ret = sync_wait(mUserBuffer.acquire_fence, WAIT_TIME_OUT_MS);
+        if (ret) {
+            mUserBuffer.release_fence = mUserBuffer.acquire_fence;
+            mUserBuffer.acquire_fence = -1;
+            mUserBuffer.status = CAMERA3_BUFFER_STATUS_ERROR;
+            LOGE("Buffer sync_wait fail!");
+            return TIMED_OUT;
+        } else {
+            close(mUserBuffer.acquire_fence);
+        }
+        mUserBuffer.acquire_fence = BUFFER_READY;
+    }
+
+    return icamera::OK;
+}
+
+/**
+ * getFence
+ *
+ * return the fecne to request result
+ */
+icamera::status_t Camera3Buffer::getFence(camera3_stream_buffer* buf)
+{
+    if (!buf)
+        return BAD_VALUE;
+
+    buf->acquire_fence = mUserBuffer.acquire_fence;
+    buf->release_fence = mUserBuffer.release_fence;
+
+    return icamera::OK;
+}
+
+icamera::status_t Camera3Buffer::registerBuffer()
+{
+    int ret = mGbmBufferManager->Register(mHandle);
+    if (ret) {
+        LOGE("@%s: call Register fail, mHandle:%p, ret:%d", __func__, mHandle, ret);
+        return UNKNOWN_ERROR;
+    }
+
+    mRegistered = true;
+    return icamera::OK;
+}
+
+icamera::status_t Camera3Buffer::deregisterBuffer()
+{
+    if (mRegistered) {
+        int ret = mGbmBufferManager->Deregister(mHandle);
+        if (ret) {
+            LOGE("@%s: call Deregister fail, mHandle:%p, ret:%d", __func__, mHandle, ret);
+            return UNKNOWN_ERROR;
+        }
+        mRegistered = false;
+    }
+
+    return icamera::OK;
+}
+
+/**
+ * lock
+ *
+ * lock the gralloc buffer with specified flags
+ *
+ * \param aBuffer [IN] int flags
+ */
+icamera::status_t Camera3Buffer::lock(int flags)
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
+    mHalBuffer.addr = nullptr;
+    mHalBuffer.s.size = 0;
+    int ret = 0;
+    uint32_t planeNum = mGbmBufferManager->GetNumPlanes(mHandle);
+    LOG2("@%s, planeNum:%d, mHandle:%p, mFormat:%d", __func__, planeNum, mHandle, mFormat);
+
+    if (planeNum == 1) {
+        void* data = nullptr;
+        ret = (mFormat == HAL_PIXEL_FORMAT_BLOB)
+              ? mGbmBufferManager->Lock(mHandle, 0, 0, 0, mHalBuffer.s.stride, 1, &data)
+              : mGbmBufferManager->Lock(mHandle, 0, 0, 0,
+                                        mHalBuffer.s.width, mHalBuffer.s.height, &data);
+        mHalBuffer.addr = data;
+    } else if (planeNum > 1) {
+        struct android_ycbcr ycbrData;
+        ret = mGbmBufferManager->LockYCbCr(mHandle, 0, 0, 0,
+                                           mHalBuffer.s.width, mHalBuffer.s.height, &ycbrData);
+        mHalBuffer.addr = ycbrData.y;
+    } else {
+        LOGE("ERROR @%s: planeNum is 0", __func__);
+        return UNKNOWN_ERROR;
+    }
+
+    CheckError(ret, UNKNOWN_ERROR,
+               "@%s: Failed to lock buffer, mHandle:%p planeNum: %d", __func__, mHandle, planeNum);
+
+    for (uint32_t i = 0; i < planeNum; i++) {
+        mHalBuffer.s.size += mGbmBufferManager->GetPlaneSize(mHandle, i);
+    }
+
+    LOG2("@%s, addr:%p, size:%d", __func__, mHalBuffer.addr, mHalBuffer.s.size);
+    CheckError(!mHalBuffer.s.size, UNKNOWN_ERROR,
+               "ERROR @%s: Failed to GetPlaneSize, it's 0", __func__);
+
+    mLocked = true;
+
+    return icamera::OK;
+}
+
+icamera::status_t Camera3Buffer::lock()
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
+    icamera::status_t status;
+    int lockMode;
+
+    if (!mInit) {
+        LOGE("@%s: Error: Cannot lock now this buffer, not initialized", __func__);
+        return INVALID_OPERATION;
+    }
+
+    if (mType != BUF_TYPE_HANDLE) {
+         mLocked = true;
+         return icamera::OK;
+    }
+
+    if (mLocked) {
+        LOGE("@%s: Error: Cannot lock buffer, already locked", __func__);
+        return INVALID_OPERATION;
+    }
+
+    int usage = 0x20003;  // TODO: hard code the usage, fix to get the usage from stream later
+    lockMode = usage & (GRALLOC_USAGE_SW_READ_MASK | GRALLOC_USAGE_SW_WRITE_MASK |
+               GRALLOC_USAGE_HW_CAMERA_MASK);
+    if (!lockMode) {
+        LOGW("@%s:trying to lock a buffer with no flags", __func__);
+        return INVALID_OPERATION;
+    }
+
+    status = lock(lockMode);
+    if (status != icamera::OK) {
+        mUserBuffer.status = CAMERA3_BUFFER_STATUS_ERROR;
+    }
+
+    return status;
+}
+
+icamera::status_t Camera3Buffer::unlock()
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
+    if (mLocked && mType != BUF_TYPE_HANDLE) {
+         mLocked = false;
+         return icamera::OK;
+    }
+
+    if (mLocked) {
+        LOG2("@%s, mHandle:%p, mFormat:%d", __func__, mHandle, mFormat);
+        int ret = mGbmBufferManager->Unlock(mHandle);
+        if (ret) {
+            LOGE("@%s: call Unlock fail, mHandle:%p, ret:%d", __func__, mHandle, ret);
+            return UNKNOWN_ERROR;
+        }
+
+        mLocked = false;
+        return icamera::OK;
+    }
+    LOG1("@%s:trying to unlock a buffer that is not locked", __func__);
+    return INVALID_OPERATION;
+}
+
+void Camera3Buffer::dump()
+{
+    if (mInit) {
+        LOG1("Buffer dump: handle %p: locked :%d: dataPtr:%p",
+             static_cast<void*>(&mHandle), mLocked, mHalBuffer.addr);
+    } else {
+        LOG1("Buffer dump: Buffer not initialized");
+    }
+}
+
+void Camera3Buffer::dumpImage(int frameNumber, const int type, int format)
+{
+    if (!CameraDump::isDumpTypeEnable(type)) {
+        return;
+    }
+
+    dumpImage(mHalBuffer.addr, frameNumber, mHalBuffer.s.size,
+              mHalBuffer.s.width, mHalBuffer.s.height, format);
+}
+
+void Camera3Buffer::dumpImage(const void *data, int frameNumber,
+                              const int size, int width, int height,
+                              int format) const
+{
+#ifdef DUMP_IMAGE
+    static unsigned int count = 0;
+    count++;
+
+    std::string fileName(gDumpPath);
+    fileName += "dump_" + std::to_string(width) +"x" + std::to_string(height)
+                             + "_frame#" + std::to_string(count)
+                             + "_req#" + std::to_string(frameNumber)
+                             + "." + CameraUtils::format2string(format).c_str();
+    LOG2("%s filename is %s", __func__, fileName.data());
+
+    FILE *fp = fopen (fileName.data(), "w+");
+    if (fp == nullptr) {
+        LOGE("open file failed");
+        return;
+    }
+    LOG1("Begin write image %s", fileName.data());
+
+    if ((fwrite(data, size, 1, fp)) != 1)
+        LOGW("Error or short count writing %d bytes to %s", size, fileName.data());
+    fclose (fp);
+#endif
+}
+
+int Camera3Buffer::v4L2Fmt2GFXFmt(int v4l2Fmt)
+{
+    int gfxFmt = -1;
+
+    switch (v4l2Fmt) {
+    case V4L2_PIX_FMT_JPEG:
+        gfxFmt = HAL_PIXEL_FORMAT_BLOB;
+        break;
+    case V4L2_PIX_FMT_SBGGR8:
+    case V4L2_PIX_FMT_SRGGB8:
+    case V4L2_PIX_FMT_SGRBG8:
+    case V4L2_PIX_FMT_SRGGB10:
+    case V4L2_PIX_FMT_SGRBG10:
+    case V4L2_PIX_FMT_SGRBG12:
+    case V4L2_PIX_FMT_SBGGR10:
+    case V4L2_PIX_FMT_SBGGR10P:
+    case V4L2_PIX_FMT_SGBRG10P:
+    case V4L2_PIX_FMT_SGRBG10P:
+    case V4L2_PIX_FMT_SRGGB10P:
+    case V4L2_PIX_FMT_SBGGR12:
+    case V4L2_PIX_FMT_SGBRG12:
+    case V4L2_PIX_FMT_SRGGB12:
+        gfxFmt = HAL_PIXEL_FORMAT_RAW16;
+        break;
+    case V4L2_PIX_FMT_YVU420:
+        gfxFmt = HAL_PIXEL_FORMAT_YV12;
+        break;
+    case V4L2_PIX_FMT_NV21:
+        gfxFmt = HAL_PIXEL_FORMAT_YCrCb_420_SP;
+        break;
+    case V4L2_PIX_FMT_NV12:
+        LOGW("Current there is no gfx format for V4L2_PIX_FMT_NV12.");
+        break;
+    case V4L2_PIX_FMT_YUYV:
+        gfxFmt = HAL_PIXEL_FORMAT_YCbCr_422_I;
+        break;
+    default:
+        LOGE("%s: no gfx format for v4l2 0x%x, %s!", __func__,
+             v4l2Fmt, CameraUtils::format2string(v4l2Fmt).c_str());
+        break;
+    }
+
+    return gfxFmt;
+}
+
+/**
+ * Utility methods to allocate Camera3Buffer from HEAP or Gfx memory
+ */
+namespace MemoryUtils {
+
+/**
+ * Allocates the memory needed to store the image described by the parameters
+ * passed during construction
+ */
+std::shared_ptr<Camera3Buffer>
+allocateHeapBuffer(int w,
+                   int h,
+                   int stride,
+                   int v4l2Fmt,
+                   int cameraId,
+                   int dataSizeOverride)
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
+    void *dataPtr;
+
+    int dataSize = dataSizeOverride ? PAGE_ALIGN(dataSizeOverride) : CameraUtils::getFrameSize(v4l2Fmt, stride, h);
+    LOG1("@%s, dataSize:%d", __func__, dataSize);
+
+    int ret = posix_memalign(&dataPtr, sysconf(_SC_PAGESIZE), dataSize);
+    if (dataPtr == nullptr || ret != 0) {
+        LOGE("Could not allocate heap camera buffer of size %d", dataSize);
+        return nullptr;
+    }
+
+    return std::shared_ptr<Camera3Buffer>(new Camera3Buffer(w, h, stride, v4l2Fmt, dataPtr, cameraId, dataSize));
+}
+
+/**
+ * Allocates internal GBM buffer
+ */
+std::shared_ptr<Camera3Buffer>
+allocateHandleBuffer(int w,
+                     int h,
+                     int gfxFmt,
+                     int usage,
+                     int cameraId)
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
+    cros::CameraBufferManager* bufManager = cros::CameraBufferManager::GetInstance();
+    buffer_handle_t handle;
+    uint32_t stride = 0;
+
+    LOG1("%s, [wxh] = [%dx%d], format 0x%x, usage 0x%x",
+          __func__, w, h, gfxFmt, usage);
+    int ret = bufManager->Allocate(w, h, gfxFmt, usage, cros::GRALLOC, &handle, &stride);
+    if (ret != 0) {
+        LOGE("Allocate handle failed! %d", ret);
+        return nullptr;
+    }
+
+    std::shared_ptr<Camera3Buffer> buffer(new Camera3Buffer());
+    camera3_stream_t stream{};
+    stream.width = w;
+    stream.height = h;
+    stream.format = gfxFmt;
+    stream.usage = usage;
+    ret = buffer->init(&stream, handle, cameraId);
+    if (ret != icamera::OK) {
+        // buffer handle will free in Camera3Buffer destructure function
+        return nullptr;
+    }
+
+    return buffer;
+}
+
+}
+} // namespace camera3
diff --git a/camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.h b/camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.h
new file mode 100644
index 000000000000..518f1417bd19
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.h
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <hardware/camera3.h>
+#include <cros-camera/camera_buffer_manager.h>
+#include <memory>
+#include "iutils/Errors.h"
+
+#include "iutils/Errors.h"
+#include "Parameters.h"
+
+namespace camera3 {
+
+// Forward declaration to  avoid extra include
+class Camera3Stream;
+
+enum Camera3BufferType {
+    BUF_TYPE_HANDLE,
+    BUF_TYPE_MALLOC,
+    BUF_TYPE_MMAP,
+};
+
+/**
+ * \class Camera3Buffer
+ *
+ * This class is the buffer abstraction in the HAL. It can store buffers
+ * provided by the framework or buffers allocated by the HAL.
+ * Allocation in the HAL can be done via gralloc, malloc or mmap
+ * in case of mmap the memory cannot be freed
+ */
+class Camera3Buffer {
+public:
+    /**
+     * default constructor
+     * Used for buffers coming from the framework. The wrapper is initialized
+     * using the method init
+     */
+    Camera3Buffer();
+
+    /**
+     * no need to delete a buffer since it is RefBase'd. Buffer will be deleted
+     * when no reference to it exist.
+     */
+    ~Camera3Buffer();
+
+    /**
+     * constructor for the HAL-allocated buffer
+     * These are used via the utility methods in the MemoryUtils namespace
+     */
+    Camera3Buffer(int w, int h, int stride, int v4l2fmt, void* usrPtr,
+                  int cameraId, int dataSizeOverride = 0);
+
+    /**
+     * initialization for the wrapper around the framework buffers
+     */
+    icamera::status_t init(const camera3_stream_buffer *aBuffer, int cameraId);
+
+    /**
+     * initialization for the fake framework buffer (allocated by the HAL)
+     */
+    icamera::status_t init(const camera3_stream_t* stream,
+                           buffer_handle_t buffer, int cameraId);
+    /**
+     * deinitialization for the wrapper around the framework buffers
+     */
+    icamera::status_t deinit();
+
+    /**
+     * dump functions
+     */
+    void dump();
+    void dumpImage(int frameNumber, const int type, int format);
+    void dumpImage(const void *data, int frameNumber, const int size, int width, int height,
+                   int format) const;
+
+    /**
+     * lock the buffer and get buffer addr from handle
+     */
+    icamera::status_t lock();
+    icamera::status_t unlock();
+
+    /**
+     * Fence
+     */
+    icamera::status_t waitOnAcquireFence();
+    icamera::status_t getFence(camera3_stream_buffer* buf);
+
+    /**
+     * Convert the GFX format to v4l2 format
+     */
+    int v4L2Fmt2GFXFmt(int v4l2Fmt);
+
+    /**
+     * APIs for getting private member
+     */
+    int width() {return mHalBuffer.s.width;}
+    int height() {return mHalBuffer.s.height;}
+    int stride() {return mHalBuffer.s.stride;}
+    unsigned int size() {return mHalBuffer.s.size;}
+    int v4l2Fmt() {return mHalBuffer.s.format;}
+    void *data() {return mHalBuffer.addr;}
+    uint64_t getTimeStamp() {return mHalBuffer.timestamp;}
+    void setTimeStamp(uint64_t timestamp) {mHalBuffer.timestamp = timestamp;}
+    int format() {return mFormat;}
+    buffer_handle_t *getBufferHandle() {return mHandlePtr;}
+    bool isLocked() const {return mLocked;}
+    int dmaBufFd() {return mType == BUF_TYPE_HANDLE ? mHandle->data[0] : mHalBuffer.dmafd;}
+    int status() {return mUserBuffer.status;}
+    camera3_stream_t* getStream() {return mUserBuffer.stream;}
+    icamera::camera_buffer_t getHalBuffer() {return mHalBuffer;}
+
+private:
+    icamera::status_t lock(int flags);
+    icamera::status_t registerBuffer();
+    icamera::status_t deregisterBuffer();
+
+private:
+     /*!< Original structure passed by request */
+    camera3_stream_buffer_t mUserBuffer = {0, 0, 0, -1, -1};
+    int             mFormat;         /*!<  HAL PIXEL fmt */
+    bool            mInit;           /*!< Boolean to check the integrity of the
+                                          buffer when it is created*/
+    bool            mLocked;         /*!< Use to track the lock status */
+    Camera3BufferType mType;
+
+    buffer_handle_t mHandle = {};
+    buffer_handle_t* mHandlePtr;
+    int mCameraId;
+    icamera::camera_buffer_t mHalBuffer;
+
+private:
+    bool            mRegistered;     /*!< Use to track the buffer register status */
+    cros::CameraBufferManager* mGbmBufferManager;
+};
+
+namespace MemoryUtils {
+
+std::shared_ptr<Camera3Buffer>
+allocateHeapBuffer(int w,
+                   int h,
+                   int stride,
+                   int v4l2Fmt,
+                   int cameraId,
+                   int dataSizeOverride = 0);
+
+std::shared_ptr<Camera3Buffer>
+allocateHandleBuffer(int w,
+                     int h,
+                     int gfxFmt,
+                     int usage,
+                     int cameraId);
+};
+
+}
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.cpp
new file mode 100644
index 000000000000..f965fb001493
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.cpp
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "modules/sandboxing/IPCCommon.h"
+
+#include <iostream>
+#include <string>
+
+namespace icamera {
+const char* IntelAlgoIpcCmdToString(IPC_CMD cmd) {
+    static const char* gIpcCmdMapping[] = {
+        "unknown",
+        "IPC_LARD_INIT",
+        "IPC_LARD_GET_TAG_LIST",
+        "IPC_LARD_RUN",
+        "IPC_LARD_DEINIT",
+        "IPC_FD_INIT",
+        "IPC_FD_RUN",
+        "IPC_FD_DEINIT",
+        "IPC_GRAPH_ADD_KEY",
+        "IPC_GRAPH_PARSE",
+        "IPC_GRAPH_RELEASE_NODES",
+        "IPC_GRAPH_CONFIG_STREAMS",
+        "IPC_GRAPH_GET_CONFIG_DATA",
+        "IPC_GRAPH_GET_CONNECTION",
+        "IPC_GRAPH_GET_PG_ID",
+        "IPC_CMC_INIT",
+        "IPC_CMC_DEINIT",
+        "IPC_MKN_INIT",
+        "IPC_MKN_ENABLE",
+        "IPC_MKN_PREPARE",
+        "IPC_MKN_DEINIT",
+        "IPC_LTM_INIT",
+        "IPC_LTM_RUN",
+        "IPC_LTM_DEINIT",
+        "IPC_AIQ_INIT",
+        "IPC_AIQ_AE_RUN",
+        "IPC_AIQ_AF_RUN",
+        "IPC_AIQ_AWB_RUN",
+        "IPC_AIQ_GBCE_RUN",
+        "IPC_AIQ_PA_RUN_V1",
+        "IPC_AIQ_SA_RUN_V2",
+        "IPC_AIQ_STATISTICS_SET_V4",
+        "IPC_AIQ_GET_AIQD_DATA",
+        "IPC_AIQ_DEINIT",
+        "IPC_AIQ_GET_VERSION",
+        "IPC_DVS_INIT",
+        "IPC_DVS_CONFIG",
+        "IPC_DVS_SET_NONE_BLANK_RATION",
+        "IPC_DVS_SET_DIGITAL_ZOOM_MODE",
+        "IPC_DVS_SET_DIGITAL_ZOOM_REGION",
+        "IPC_DVS_SET_DIGITAL_ZOOM_COORDINATE",
+        "IPC_DVS_SET_DIGITAL_ZOOM_MAGNITUDE",
+        "IPC_DVS_FREE_MORPH_TABLE",
+        "IPC_DVS_ALLOCATE_MORPH_TABLE",
+        "IPC_DVS_GET_MORPH_TABLE",
+        "IPC_DVS_SET_STATISTICS",
+        "IPC_DVS_EXECUTE",
+        "IPC_DVS_GET_IMAGE_TRANSFORMATION",
+        "IPC_DVS_DEINIT",
+        "IPC_ISP_ADAPTOR_INIT",
+        "IPC_ISP_ADAPTOR_DEINIT",
+        "IPC_ISP_GET_PAL_SIZE",
+        "IPC_ISP_CONVERT_STATS",
+        "IPC_ISP_RUN_PAL",
+        "IPC_PG_PARAM_INIT",
+        "IPC_PG_PARAM_PREPARE",
+        "IPC_PG_PARAM_ALLOCATE_PG",
+        "IPC_PG_PARAM_GET_FRAG_DESCS",
+        "IPC_PG_PARAM_PREPARE_PROGRAM",
+        "IPC_PG_PARAM_ALLOCATE_PAYLOADS",
+        "IPC_PG_PARAM_ENCODE",
+        "IPC_PG_PARAM_DECODE",
+        "IPC_PG_PARAM_DEINIT"
+    };
+
+    unsigned int num = sizeof(gIpcCmdMapping) / sizeof(gIpcCmdMapping[0]);
+    return cmd < num ? gIpcCmdMapping[cmd] : gIpcCmdMapping[0];
+}
+
+IPC_GROUP IntelAlgoIpcCmdToGroup(IPC_CMD cmd) {
+    IPC_GROUP group = IPC_GROUP_OTHER;
+    if (cmd >= IPC_AIQ_INIT && cmd <= IPC_AIQ_GET_VERSION) {
+        group = IPC_GROUP_AIQ;
+    } else if (cmd >= IPC_PG_PARAM_INIT && cmd <= IPC_PG_PARAM_DEINIT) {
+        group = IPC_GROUP_PSYS;
+    } else if (cmd >= IPC_FD_INIT && cmd <= IPC_FD_DEINIT) {
+        group = IPC_GROUP_FD;
+    } else {
+        group = IPC_GROUP_OTHER;
+    }
+
+    return group;
+}
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.h
new file mode 100644
index 000000000000..92a5852be7b1
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.h
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_cmc_types.h>
+#include <ia_types.h>
+#include <ia_aiq_types.h>
+
+#include "iutils/Errors.h"
+
+namespace icamera {
+#define IPC_MATCHING_KEY 0x56  // the value is randomly chosen
+#define IPC_REQUEST_HEADER_USED_NUM 1
+#define SHM_NAME "shm"
+
+enum IPC_CMD {
+    IPC_LARD_INIT = 1,
+    IPC_LARD_GET_TAG_LIST,
+    IPC_LARD_RUN,
+    IPC_LARD_DEINIT,
+    IPC_FD_INIT,
+    IPC_FD_RUN,
+    IPC_FD_DEINIT,
+    IPC_GRAPH_ADD_KEY,
+    IPC_GRAPH_PARSE,
+    IPC_GRAPH_RELEASE_NODES,
+    IPC_GRAPH_CONFIG_STREAMS,
+    IPC_GRAPH_GET_CONFIG_DATA,
+    IPC_GRAPH_GET_CONNECTION,
+    IPC_GRAPH_GET_PG_ID,
+    IPC_CMC_INIT,
+    IPC_CMC_DEINIT,
+    IPC_MKN_INIT,
+    IPC_MKN_ENABLE,
+    IPC_MKN_PREPARE,
+    IPC_MKN_DEINIT,
+    IPC_LTM_INIT,
+    IPC_LTM_RUN,
+    IPC_LTM_DEINIT,
+    IPC_AIQ_INIT,
+    IPC_AIQ_AE_RUN,
+    IPC_AIQ_AF_RUN,
+    IPC_AIQ_AWB_RUN,
+    IPC_AIQ_GBCE_RUN,
+    IPC_AIQ_PA_RUN_V1,
+    IPC_AIQ_SA_RUN_V2,
+    IPC_AIQ_STATISTICS_SET_V4,
+    IPC_AIQ_GET_AIQD_DATA,
+    IPC_AIQ_DEINIT,
+    IPC_AIQ_GET_VERSION,
+    IPC_DVS_INIT,
+    IPC_DVS_CONFIG,
+    IPC_DVS_SET_NONE_BLANK_RATION,
+    IPC_DVS_SET_DIGITAL_ZOOM_MODE,
+    IPC_DVS_SET_DIGITAL_ZOOM_REGION,
+    IPC_DVS_SET_DIGITAL_ZOOM_COORDINATE,
+    IPC_DVS_SET_DIGITAL_ZOOM_MAGNITUDE,
+    IPC_DVS_FREE_MORPH_TABLE,
+    IPC_DVS_ALLOCATE_MORPH_TABLE,
+    IPC_DVS_GET_MORPH_TABLE,
+    IPC_DVS_SET_STATISTICS,
+    IPC_DVS_EXECUTE,
+    IPC_DVS_GET_IMAGE_TRANSFORMATION,
+    IPC_DVS_DEINIT,
+    IPC_ISP_ADAPTOR_INIT,
+    IPC_ISP_ADAPTOR_DEINIT,
+    IPC_ISP_GET_PAL_SIZE,
+    IPC_ISP_CONVERT_STATS,
+    IPC_ISP_RUN_PAL,
+    IPC_PG_PARAM_INIT,
+    IPC_PG_PARAM_PREPARE,
+    IPC_PG_PARAM_ALLOCATE_PG,
+    IPC_PG_PARAM_GET_FRAG_DESCS,
+    IPC_PG_PARAM_PREPARE_PROGRAM,
+    IPC_PG_PARAM_ALLOCATE_PAYLOADS,
+    IPC_PG_PARAM_ENCODE,
+    IPC_PG_PARAM_DECODE,
+    IPC_PG_PARAM_DEINIT
+};
+
+#define MAX_IA_BINARY_DATA_SIZE 800000
+struct ia_binary_data_mod {
+    unsigned int size;
+    char data[MAX_IA_BINARY_DATA_SIZE];
+};
+
+const char* IntelAlgoIpcCmdToString(IPC_CMD cmd);
+
+enum IPC_GROUP {
+    IPC_GROUP_AIQ,
+    IPC_GROUP_PSYS,
+    IPC_GROUP_FD,
+    IPC_GROUP_OTHER
+};
+#define IPC_GROUP_NUM (IPC_GROUP_OTHER + 1)
+
+IPC_GROUP IntelAlgoIpcCmdToGroup(IPC_CMD cmd);
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.cpp
new file mode 100644
index 000000000000..45faca4f17ed
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.cpp
@@ -0,0 +1,495 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IPC_GRAPH_CONFIG"
+
+#include "modules/sandboxing/IPCGraphConfig.h"
+
+#include <sys/stat.h>
+#include <memory>
+
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+IPCGraphConfig::IPCGraphConfig() {
+    LOGIPC("@%s", __func__);
+}
+
+IPCGraphConfig::~IPCGraphConfig() {
+    LOGIPC("@%s", __func__);
+}
+
+status_t IPCGraphConfig::readDataFromXml(const char *fileName,
+                                         char *dataPtr, size_t *dataSize, int maxSize) {
+    CheckError(!dataSize || !fileName || !dataPtr,
+               UNKNOWN_ERROR, "%s, invalid argument", __func__);
+
+    struct stat statBuf;
+    int ret = stat(fileName, &statBuf);
+    CheckError((ret != 0), UNKNOWN_ERROR, "Failed to query the size of file: %s!", fileName);
+    CheckError(statBuf.st_size > maxSize, BAD_VALUE,
+               "The memory size less than file size: %s", fileName);
+
+    *dataSize = static_cast<size_t>(statBuf.st_size);
+    LOGIPC("%s, fileName: %s, size: %zu", __func__, fileName, *dataSize);
+
+    FILE *file = fopen(fileName, "rb");
+    CheckError(!file, NAME_NOT_FOUND, "%s, Failed to open file: %s", __func__, fileName);
+
+    size_t len = fread(dataPtr, 1, *dataSize, file);
+    fclose(file);
+
+    CheckError((len != *dataSize), UNKNOWN_ERROR,
+               "%s, Failed to read data from file: %s", __func__, fileName);
+
+    return OK;
+}
+
+bool IPCGraphConfig::clientFlattenParse(void *pData, uint32_t size, int cameraId,
+                                        const char *graphDescFile, const char *settingsFile) {
+    LOGIPC("@%s, pData:%p, size: %zu, cameraId: %d", __func__, pData, size, cameraId);
+
+    CheckError(!pData || !graphDescFile || !settingsFile, false,
+               "@%s, pData, graphDescFile or settingsFile is nullptr", __func__);
+    CheckError(size < sizeof(GraphParseParams), false, "@%s, buffer is small", __func__);
+
+    GraphParseParams *params = static_cast<GraphParseParams*>(pData);
+    CLEAR(*params);
+
+    params->cameraId = cameraId;
+    int ret = readDataFromXml(graphDescFile, params->GD,
+                              &(params->gdSize), MAX_GRAPH_DESCRIPTOR_SIZE);
+    CheckError(ret != OK, false, "Failed to read the graph descriptor file: %s", graphDescFile);
+
+    ret = readDataFromXml(settingsFile, params->GS,
+                          &(params->gsSize), MAX_GRAPH_SETTINGS_SIZE);
+    CheckError(ret != OK, false, "Failed to read the graph settings file: %s", settingsFile);
+
+    return true;
+}
+
+bool IPCGraphConfig::serverUnflattenParse(void *pData, uint32_t size,
+                                          GraphParseParams **parseParam) {
+    LOGIPC("@%s, pData:%p, size: %zu", __func__, pData, size);
+
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(GraphParseParams), false, "@%s, buffer is small", __func__);
+    CheckError(!parseParam, false, "@%s, parseParam is nullptr", __func__);
+
+    GraphParseParams *params = static_cast<GraphParseParams*>(pData);
+    *parseParam = params;
+
+    return true;
+}
+
+bool IPCGraphConfig::clientFlattenConfigStreams(void *pData, uint32_t size,
+                                                GraphBaseInfo info, GraphSettingType type,
+                                                const std::vector<HalStream*> &streams) {
+    LOGIPC("@%s, pData:%p, cameraId: %d, configMode: %d",
+           __func__, pData, info.cameraId, info.configMode);
+
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(GraphConfigStreamParams),
+               false, "@%s, buffer is small", __func__);
+    CheckError(streams.empty(), false, "@%s, stream vector is empty", __func__);
+
+    GraphConfigStreamParams *params = static_cast<GraphConfigStreamParams*>(pData);
+    CLEAR(*params);
+
+    params->baseInfo = info;
+    params->type = type;
+    for (size_t i = 0; i < streams.size(); ++i) {
+        params->streamCfg[i] = *(streams[i]);
+        params->streamPriv[i] = *(static_cast<stream_t*>(streams[i]->mPrivate));
+        params->streamNum++;
+    }
+
+    return true;
+}
+
+bool IPCGraphConfig::serverUnflattenConfigStreams(void *pData, uint32_t size,
+                                                  GraphBaseInfo *info, GraphSettingType *type,
+                                                  std::vector<HalStream*> *streams) {
+    LOGIPC("@%s, pData:%p, size: %zu", __func__, pData, size);
+
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(GraphConfigStreamParams), false, "@%s, buffer is small", __func__);
+    CheckError(!info || !type || !streams, false,
+               "%s, the info, type or streams is nullptr", __func__);
+
+    GraphConfigStreamParams *params = static_cast<GraphConfigStreamParams*>(pData);
+
+    *info = params->baseInfo;
+    *type = params->type;
+    for (uint32_t i = 0; i < params->streamNum; ++i) {
+        params->streamCfg[i].mPrivate = static_cast<void *>(&(params->streamPriv[i]));
+        streams->push_back(&(params->streamCfg[i]));
+    }
+
+    return true;
+}
+
+bool IPCGraphConfig::clientFlattenGetGraphData(void *pData, uint32_t size, GraphBaseInfo info) {
+    LOGIPC("@%s, pData:%p, cameraId: %d, configMode: %d",
+           __func__, pData, info.cameraId, info.configMode);
+
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(GraphGetDataParams), false, "@%s, buffer is small", __func__);
+
+    GraphGetDataParams *params = static_cast<GraphGetDataParams*>(pData);
+    CLEAR(*params);
+
+    params->baseInfo = info;
+
+    return true;
+}
+
+bool IPCGraphConfig::serverUnflattenGetGraphData(void *pData, uint32_t size, GraphBaseInfo *info) {
+    LOGIPC("@%s, pData:%p, size: %zu", __func__, pData, size);
+
+    CheckError(!pData || !info, false, "@%s, pData or info is nullptr", __func__);
+    CheckError(size < sizeof(GraphGetDataParams), false, "@%s, buffer is small", __func__);
+
+    GraphGetDataParams *params = static_cast<GraphGetDataParams*>(pData);
+    *info = params->baseInfo;
+
+    return true;
+}
+
+bool IPCGraphConfig::serverFlattenGetGraphData(void *pData, uint32_t size,
+                                               IGraphType::GraphConfigData graphData) {
+    LOGIPC("@%s, pData:%p, size: %zu", __func__, pData, size);
+
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(GraphGetDataParams), false, "@%s, buffer is small", __func__);
+
+    GraphGetDataParams *params = static_cast<GraphGetDataParams*>(pData);
+
+    params->mcId = graphData.mcId;
+    params->graphId = graphData.graphId;
+    params->gdcKernelId = graphData.gdcKernelId;
+
+    params->csiReso = graphData.csiReso;
+    params->gdcReso = graphData.gdcReso;
+
+    LOGIPC("%s, mcId: %d, graphId: %d, gdcKernelId: %d",
+           __func__, params->mcId, params->graphId, params->gdcKernelId);
+
+    params->streamIdNum = graphData.streamIds.size();
+    for (size_t i = 0; i < graphData.streamIds.size(); ++i) {
+        params->streamIdData[i] = graphData.streamIds[i];
+    }
+
+    params->pgInfoNum = graphData.pgInfo.size();
+    for (size_t i = 0; i < graphData.pgInfo.size(); ++i) {
+        size_t len = graphData.pgInfo[i].pgName.copy(params->pgInfoData[i].pgName, MAX_NAME_LENGTH);
+        params->pgInfoData[i].pgName[len] = '\0';
+        params->pgInfoData[i].pgId = graphData.pgInfo[i].pgId;
+        params->pgInfoData[i].streamId = graphData.pgInfo[i].streamId;
+        params->pgInfoData[i].rbmByte = graphData.pgInfo[i].rbmValue.rbm_bytes;
+
+        if (params->pgInfoData[i].rbmByte > 0) {
+            MEMCPY_S(params->pgInfoData[i].rbmData, MAX_NAME_LENGTH,
+                     graphData.pgInfo[i].rbmValue.rbm, graphData.pgInfo[i].rbmValue.rbm_bytes);
+        }
+    }
+
+    params->mBrInfoNum = graphData.mbrInfo.size();
+    for (size_t i = 0; i < graphData.mbrInfo.size(); ++i) {
+        params->mBrInfoData[i].streamId = graphData.mbrInfo[i].streamId;
+        params->mBrInfoData[i].mBrData = graphData.mbrInfo[i].data;
+    }
+
+    params->pgNamesNum = graphData.pgNames.size();
+    for (size_t i = 0; i < params->pgNamesNum; ++i) {
+        size_t len = graphData.pgNames[i].copy(params->pgNames[i], MAX_NAME_LENGTH);
+        params->pgNames[i][len] = '\0';
+    }
+
+    params->kernelArrayNum = graphData.programGroup.size();
+    for (size_t i = 0; i < params->kernelArrayNum; ++i) {
+        params->kernelArray[i].streamId = graphData.programGroup[i].streamId;
+        ia_isp_bxt_program_group *pgPtr = graphData.programGroup[i].pgPtr;
+        params->kernelArray[i].group = *pgPtr;
+
+        for (unsigned int j = 0; j < params->kernelArray[i].group.kernel_count; ++j) {
+            params->kernelArray[i].runKernels[j] = pgPtr->run_kernels[j];
+            if (pgPtr->run_kernels[j].resolution_info) {
+                params->kernelArray[i].resoInfo[j] = *(pgPtr->run_kernels[j].resolution_info);
+                params->kernelArray[i].runKernels[j].resolution_info =
+                    &(params->kernelArray[i].resoInfo[j]);
+            } else {
+                params->kernelArray[i].runKernels[j].resolution_info = nullptr;
+            }
+
+            if (pgPtr->run_kernels[j].resolution_history) {
+                params->kernelArray[i].resoHistory[j] =
+                    *(pgPtr->run_kernels[j].resolution_history);
+                params->kernelArray[i].runKernels[j].resolution_history =
+                    &(params->kernelArray[i].resoHistory[j]);
+            } else {
+                params->kernelArray[i].runKernels[j].resolution_history = nullptr;
+            }
+        }
+        params->kernelArray[i].group.run_kernels = params->kernelArray[i].runKernels;
+
+        if (pgPtr->pipe) {
+            params->kernelArray[i].pipeInfo = *(pgPtr->pipe);
+            params->kernelArray[i].group.pipe = &(params->kernelArray[i].pipeInfo);
+        } else {
+            params->kernelArray[i].group.pipe = nullptr;
+        }
+    }
+
+    return true;
+}
+
+bool IPCGraphConfig::clientUnflattenGetGraphData(void *pData, uint32_t size,
+                                                 IGraphType::GraphConfigData *graphData) {
+    LOGIPC("@%s, pData:%p, size: %zu", __func__, pData, size);
+
+    CheckError(!pData || !graphData, false, "@%s, pData or graphData is nullptr", __func__);
+    CheckError(size < sizeof(GraphGetDataParams), false, "@%s, buffer is small", __func__);
+
+    GraphGetDataParams *params = static_cast<GraphGetDataParams*>(pData);
+
+    graphData->mcId = params->mcId;
+    graphData->graphId = params->graphId;
+    graphData->gdcKernelId = params->gdcKernelId;
+
+    graphData->csiReso = params->csiReso;
+    graphData->gdcReso = params->gdcReso;
+
+    LOGIPC("%s, mcId: %d, graphId: %d, gdcKernelId: %d",
+           __func__, params->mcId, params->graphId, params->gdcKernelId);
+
+    for (size_t i = 0; i < params->streamIdNum; ++i) {
+        graphData->streamIds.push_back(params->streamIdData[i]);
+    }
+
+    for (size_t i = 0; i < params->pgInfoNum; ++i) {
+        IGraphType::PgInfo info;
+        info.pgName = params->pgInfoData[i].pgName;
+        info.pgId = params->pgInfoData[i].pgId;
+        info.streamId = params->pgInfoData[i].streamId;
+        if (params->pgInfoData[i].rbmByte > 0) {
+            info.rbmValue.rbm_bytes = params->pgInfoData[i].rbmByte;
+            info.rbmValue.rbm = params->pgInfoData[i].rbmData;
+        } else {
+            info.rbmValue.rbm = nullptr;
+            info.rbmValue.rbm_bytes = 0;
+        }
+        graphData->pgInfo.push_back(info);
+    }
+
+    for (size_t i = 0; i < params->mBrInfoNum; ++i) {
+        IGraphType::MbrInfo info;
+        info.streamId = params->mBrInfoData[i].streamId;
+        info.data = params->mBrInfoData[i].mBrData;
+        graphData->mbrInfo.push_back(info);
+    }
+
+    for (size_t i = 0; i < params->pgNamesNum; ++i) {
+        graphData->pgNames.push_back(params->pgNames[i]);
+    }
+
+    for (size_t i = 0; i < params->kernelArrayNum; ++i) {
+        IGraphType::ProgramGroupInfo info;
+
+        info.streamId = params->kernelArray[i].streamId;
+        info.pgPtr = &(params->kernelArray[i].group);
+
+        info.pgPtr->run_kernels = params->kernelArray[i].runKernels;
+        for (unsigned j = 0; j < info.pgPtr->kernel_count; ++j) {
+            if (params->kernelArray[i].runKernels[j].resolution_info) {
+                info.pgPtr->run_kernels[j].resolution_info = &(params->kernelArray[i].resoInfo[j]);
+            } else {
+                info.pgPtr->run_kernels[j].resolution_info = nullptr;
+            }
+
+            if (params->kernelArray[i].runKernels[j].resolution_history) {
+                info.pgPtr->run_kernels[j].resolution_history =
+                    &(params->kernelArray[i].resoHistory[j]);
+            } else {
+                info.pgPtr->run_kernels[j].resolution_history = nullptr;
+            }
+        }
+
+        if (params->kernelArray[i].group.pipe) {
+            info.pgPtr->pipe = &(params->kernelArray[i].pipeInfo);
+        } else {
+            info.pgPtr->pipe = nullptr;
+        }
+
+        graphData->programGroup.push_back(info);
+    }
+
+    return true;
+}
+
+bool IPCGraphConfig::clientFlattenGetPgId(void *pData, uint32_t size, GraphBaseInfo info,
+                                          const int streamId, const int kernelId) {
+    LOGIPC("@%s, pData:%p, size:%u, cameraId :%d, config mode:%d, streamId: %d, kernelId: %d",
+           __func__, pData, size, info.cameraId, info.configMode, streamId, kernelId);
+
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(GraphGetPgIdParams), false, "@%s, buffer is small", __func__);
+
+    GraphGetPgIdParams *params = static_cast<GraphGetPgIdParams*>(pData);
+    CLEAR(*params);
+
+    params->baseInfo = info;
+    params->streamId = streamId;
+    params->kernelId = kernelId;
+
+    return true;
+}
+
+bool IPCGraphConfig::serverUnFlattenGetPgId(void *pData, uint32_t size, GraphBaseInfo *info,
+                                            uint32_t *streamId, int32_t *kernelId) {
+    LOGIPC("@%s, pData:%p, size:%u", __func__, pData, size);
+
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(GraphGetPgIdParams), false, "@%s, buffer is small", __func__);
+    CheckError(!info || !streamId || !kernelId, false,
+               "@%s, info, streamId or kernelId is nullptr", __func__);
+
+    GraphGetPgIdParams *params = static_cast<GraphGetPgIdParams*>(pData);
+
+    *info = params->baseInfo;
+    *streamId = params->streamId;
+    *kernelId = params->kernelId;
+
+    return true;
+}
+
+bool IPCGraphConfig::serverFlattenGetPgId(void *pData, uint32_t size, int32_t pgId) {
+    LOGIPC("@%s, pData:%p, size:%u, pgId: %d", __func__, pData, size, pgId);
+
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(GraphGetPgIdParams), false, "@%s, buffer is small", __func__);
+
+    GraphGetPgIdParams *params = static_cast<GraphGetPgIdParams*>(pData);
+    params->pgId = pgId;
+
+    return true;
+}
+
+bool IPCGraphConfig::clientUnFlattenGetPgId(void *pData, uint32_t size, int32_t *pgId) {
+    LOGIPC("@%s, pData:%p, size:%u", __func__, pData, size);
+
+    CheckError(!pData || !pgId, false, "@%s, pData or pgId is nullptr", __func__);
+    CheckError(size < sizeof(GraphGetPgIdParams), false, "@%s, buffer is small", __func__);
+
+    GraphGetPgIdParams *params = static_cast<GraphGetPgIdParams*>(pData);
+    *pgId = params->pgId;
+
+    return true;
+}
+
+bool IPCGraphConfig::clientFlattenGetConnection(void *pData, uint32_t size, GraphBaseInfo info,
+                                                const std::vector<std::string> &pgList) {
+    LOGIPC("@%s, pData:%p, size:%u, cameraId :%d, config mode:%d, pgName size: %zu",
+           __func__, pData, size, info.cameraId, info.configMode, pgList.size());
+
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(GraphGetConnectionParams), false, "@%s, buffer is small", __func__);
+
+    GraphGetConnectionParams *params = static_cast<GraphGetConnectionParams*>(pData);
+    CLEAR(*params);
+
+    params->baseInfo = info;
+    params->pgListNum = pgList.size();
+    for (size_t i = 0; i < pgList.size(); ++i) {
+        size_t len = pgList[i].copy(params->pgList[i], MAX_NAME_LENGTH);
+        params->pgList[i][len] = '\0';
+    }
+
+    return true;
+}
+
+bool IPCGraphConfig::serverUnFlattenGetConnection(void *pData, uint32_t size, GraphBaseInfo *info,
+                                                  std::vector<std::string> *pgList) {
+    LOGIPC("@%s, pData:%p, size:%u", __func__, pData, size);
+
+    CheckError(size < sizeof(GraphGetConnectionParams), false, "@%s, buffer is small", __func__);
+    CheckError(!pData || !info || !pgList, false,
+               "@%s, pData, info or pgList is nullptr", __func__);
+
+    GraphGetConnectionParams *params = static_cast<GraphGetConnectionParams*>(pData);
+
+    *info = params->baseInfo;
+    for (size_t i = 0; i < params->pgListNum; ++i) {
+        pgList->push_back(params->pgList[i]);
+    }
+
+    return true;
+}
+
+bool IPCGraphConfig::serverFlattenGetConnection(
+         void *pData, uint32_t size,
+         const std::vector<IGraphType::ScalerInfo> &scalerInfo,
+         const std::vector<IGraphType::PipelineConnection> &confVector) {
+    LOGIPC("@%s, pData:%p, size:%u", __func__, pData, size);
+
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(GraphGetConnectionParams), false, "@%s, buffer is small", __func__);
+
+    GraphGetConnectionParams *params = static_cast<GraphGetConnectionParams*>(pData);
+
+    params->connectionArraySize = confVector.size();
+    for (size_t i = 0; i < confVector.size(); ++i) {
+        params->connectionArray[i].connection = confVector[i];
+        if (params->connectionArray[i].connection.stream) {
+            params->connectionArray[i].stream = *(confVector[i].stream);
+        }
+    }
+
+    params->scalerInfoNum = scalerInfo.size();
+    for (size_t i = 0; i < scalerInfo.size(); ++i) {
+        params->scalerInfoArray[i] = scalerInfo[i];
+    }
+
+    return true;
+}
+
+bool IPCGraphConfig::clientUnFlattenGetConnection(
+         void *pData, uint32_t size,
+         std::vector<IGraphType::ScalerInfo> *scalerInfo,
+         std::vector<IGraphType::PipelineConnection> *confVector) {
+    LOGIPC("@%s, pData:%p, size:%u", __func__, pData, size);
+
+    CheckError(!pData || !confVector, false, "@%s, pData or confVector is nullptr", __func__);
+    CheckError(size < sizeof(GraphGetConnectionParams), false, "@%s, buffer is small", __func__);
+
+    GraphGetConnectionParams *params = static_cast<GraphGetConnectionParams*>(pData);
+
+    for (size_t i = 0; i < params->connectionArraySize; ++i) {
+        if (params->connectionArray[i].connection.stream) {
+            params->connectionArray[i].connection.stream = &(params->connectionArray[i].stream);
+        }
+        confVector->push_back(params->connectionArray[i].connection);
+    }
+
+    for (size_t i = 0; i < params->scalerInfoNum; ++i) {
+        scalerInfo->push_back(params->scalerInfoArray[i]);
+    }
+
+    return true;
+}
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.h
new file mode 100644
index 000000000000..e8e531c967dd
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.h
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <string>
+#include <vector>
+
+#include "modules/sandboxing/IPCCommon.h"
+#include "src/platformdata/gc/IGraphConfig.h"
+
+namespace icamera {
+
+#define MAX_STREAM                (4)                // Max stream number
+#define MAX_GRAPH_SETTINGS_SIZE   (2 * 1024 * 1024)  // Max graph settings file size
+#define MAX_GRAPH_DESCRIPTOR_SIZE (512 * 1024)       // Max graph descriptor file size
+#define MAX_PG_NUMBER             (10)               // Max pg number
+#define MAX_NAME_LENGTH           (128)              // Max length for name
+#define MAX_CONNECTION_COUNT      (64)               // Max connection count
+#define MAX_STREAM_KERNEL_COUNT   (500)              // Max kernels info per one stream
+
+struct GraphBaseInfo {
+    int cameraId;
+    ConfigMode configMode;
+
+    bool operator< (const GraphBaseInfo &b) const {
+        return (cameraId < b.cameraId) ? true : (configMode < b.configMode ? true : false);
+    }
+};
+
+struct GraphPgInfo {
+    char pgName[MAX_NAME_LENGTH];
+    uint32_t pgId;
+    int streamId;
+    uint32_t rbmByte;
+    char rbmData[MAX_NAME_LENGTH];
+};
+
+struct GraphMbrInfo {
+    int32_t streamId;
+    ia_isp_bxt_gdc_limits mBrData;
+};
+
+struct GraphKernelArray {
+    int32_t streamId;
+    ia_isp_bxt_program_group group;
+    ia_isp_bxt_run_kernels_t runKernels[MAX_STREAM_KERNEL_COUNT];
+    ia_isp_bxt_resolution_info_t resoInfo[MAX_STREAM_KERNEL_COUNT];
+    ia_isp_bxt_resolution_info_t resoHistory[MAX_STREAM_KERNEL_COUNT];
+    ia_isp_bxt_pipe_t pipeInfo;
+};
+
+struct GraphParseParams {
+    int cameraId;
+    size_t gdSize;
+    char GD[MAX_GRAPH_DESCRIPTOR_SIZE];
+    size_t gsSize;
+    char GS[MAX_GRAPH_SETTINGS_SIZE];
+};
+
+struct GraphConfigStreamParams {
+    GraphBaseInfo baseInfo;
+    GraphSettingType type;
+    uint32_t streamNum;
+    HalStream streamCfg[MAX_STREAM];
+    stream_t streamPriv[MAX_STREAM];
+};
+
+struct GraphGetDataParams {
+    GraphBaseInfo baseInfo;
+
+    int mcId;
+    int graphId;
+    uint32_t gdcKernelId;
+
+    camera_resolution_t csiReso;
+    camera_resolution_t gdcReso;
+
+    uint32_t streamIdNum;
+    int32_t streamIdData[MAX_STREAM];
+
+    uint32_t pgInfoNum;
+    GraphPgInfo pgInfoData[MAX_PG_NUMBER];
+
+    uint32_t mBrInfoNum;
+    GraphMbrInfo mBrInfoData[MAX_STREAM];
+
+    uint32_t pgNamesNum;
+    char pgNames[MAX_PG_NUMBER][MAX_NAME_LENGTH];
+
+    uint32_t kernelArrayNum;
+    GraphKernelArray kernelArray[MAX_STREAM];
+};
+
+struct GraphGetPgIdParams {
+    GraphBaseInfo baseInfo;
+    uint32_t streamId;
+    int32_t kernelId;
+    int32_t pgId;
+};
+
+struct GraphConnection {
+    IGraphType::PipelineConnection connection;
+    HalStream stream;
+};
+
+struct GraphGetConnectionParams {
+    GraphBaseInfo baseInfo;
+    uint32_t pgListNum;
+    char pgList[MAX_PG_NUMBER][MAX_NAME_LENGTH];
+    uint32_t connectionArraySize;
+    GraphConnection connectionArray[MAX_CONNECTION_COUNT];
+    uint32_t scalerInfoNum;
+    IGraphType::ScalerInfo scalerInfoArray[MAX_STREAM];
+};
+
+class IPCGraphConfig {
+ public:
+    IPCGraphConfig();
+    virtual ~IPCGraphConfig();
+
+    bool clientFlattenParse(void* pData, uint32_t size, int cameraId,
+                            const char *graphDescFile, const char *settingsFile);
+    bool serverUnflattenParse(void* pData, uint32_t size, GraphParseParams **parseParam);
+    bool clientFlattenConfigStreams(void *pData, uint32_t size, GraphBaseInfo info,
+                                    GraphSettingType type, const std::vector<HalStream*> &streams);
+    bool serverUnflattenConfigStreams(void* pData, uint32_t size, GraphBaseInfo *info,
+                                      GraphSettingType *type, std::vector<HalStream*> *streams);
+    bool clientFlattenGetGraphData(void *pData, uint32_t size, GraphBaseInfo info);
+    bool serverUnflattenGetGraphData(void* pData, uint32_t size, GraphBaseInfo *info);
+    bool serverFlattenGetGraphData(void* pData, uint32_t size,
+                                   IGraphType::GraphConfigData graphData);
+    bool clientUnflattenGetGraphData(void *pData, uint32_t size,
+                                     IGraphType::GraphConfigData *graphData);
+    bool clientFlattenGetPgId(void *pData, uint32_t size, GraphBaseInfo info,
+                              const int streamId, const int kernelId);
+    bool serverUnFlattenGetPgId(void *pData, uint32_t size, GraphBaseInfo *info,
+                                uint32_t *streamId, int32_t *kernelId);
+    bool serverFlattenGetPgId(void *pData, uint32_t size, int32_t pgId);
+    bool clientUnFlattenGetPgId(void *pData, uint32_t size, int32_t *pgId);
+    bool clientFlattenGetConnection(void *pData, uint32_t size,
+                                    GraphBaseInfo info, const std::vector<std::string> &pgList);
+    bool serverUnFlattenGetConnection(void *pData, uint32_t size,
+                                      GraphBaseInfo *info, std::vector<std::string> *pgList);
+    bool serverFlattenGetConnection(void *pData, uint32_t size,
+                                    const std::vector<IGraphType::ScalerInfo> &scalerInfo,
+                                    const std::vector<IGraphType::PipelineConnection> &confVector);
+    bool clientUnFlattenGetConnection(void *pData, uint32_t size,
+                                      std::vector<IGraphType::ScalerInfo> *scalerInfo,
+                                      std::vector<IGraphType::PipelineConnection> *confVector);
+
+ private:
+    status_t readDataFromXml(const char *fileName, char *dataPtr, size_t *dataSize, int maxSize);
+
+    // Disable copy constructor and assignment operator
+    DISALLOW_COPY_AND_ASSIGN(IPCGraphConfig);
+};
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.cpp
new file mode 100644
index 000000000000..33d528f97cb3
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.cpp
@@ -0,0 +1,1167 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IPCIntelAiq"
+
+#include "modules/sandboxing/IPCIntelAiq.h"
+
+#include <ia_types.h>
+
+namespace icamera {
+IPCIntelAiq::IPCIntelAiq() {
+    LOGIPC("@%s", __func__);
+}
+
+IPCIntelAiq::~IPCIntelAiq() {
+    LOGIPC("@%s", __func__);
+}
+
+// init
+bool IPCIntelAiq::clientFlattenInit(const ia_binary_data* aiqbData,
+                                    const ia_binary_data* nvmData,
+                                    const ia_binary_data* aiqdData,
+                                    unsigned int statsMaxWidth,
+                                    unsigned int statsMaxHeight,
+                                    unsigned int maxNumStatsIn,
+                                    uintptr_t cmc,
+                                    uintptr_t mkn,
+                                    uint8_t* pData, unsigned int size) {
+    LOGIPC("@%s, aiqbData:%p, nvmData:%p, aiqdData:%p", __func__, aiqbData, nvmData, aiqdData);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+
+    uint8_t* ptr = pData;
+    memset(ptr, 0, size);
+
+    aiq_init_params* params = reinterpret_cast<aiq_init_params*>(ptr);
+    params->aiqb_size = aiqbData ? aiqbData->size : 0;
+    params->nvm_size = nvmData ? nvmData->size : 0;
+    params->aiqd_size = aiqdData ? aiqdData->size : 0;
+    params->stats_max_width = statsMaxWidth;
+    params->stats_max_height = statsMaxHeight;
+    params->max_num_stats_in = maxNumStatsIn;
+    params->ia_mkn = mkn;
+    params->cmcRemoteHandle = cmc;
+
+    ptr += sizeof(aiq_init_params);
+    if (aiqbData) {
+        MEMCPY_S(ptr, aiqbData->size, aiqbData->data, aiqbData->size);
+    }
+
+    ptr += params->aiqb_size;
+    if (nvmData) {
+        MEMCPY_S(ptr, nvmData->size, nvmData->data, nvmData->size);
+    }
+
+    ptr += params->nvm_size;
+    if (aiqdData) {
+        MEMCPY_S(ptr, aiqdData->size, aiqdData->data, aiqdData->size);
+    }
+
+    return true;
+}
+
+bool IPCIntelAiq::serverUnflattenInit(const void* pData, int dataSize,
+                                      ia_binary_data* aiqbData,
+                                      ia_binary_data* nvmData,
+                                      ia_binary_data* aiqdData) {
+    LOGIPC("@%s, pData:%p, dataSize:%d, aiqbData:%p, nvmData:%p, aiqdData:%p", __func__,
+           pData, dataSize, aiqbData, nvmData, aiqdData);
+    CheckError(dataSize < sizeof(aiq_init_params), false, "@%s, buffer is small", __func__);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(!aiqbData, false, "@%s, aiqbData is nullptr", __func__);
+    CheckError(!nvmData, false, "@%s, nvmData is nullptr", __func__);
+    CheckError(!aiqdData, false, "@%s, aiqdData is nullptr", __func__);
+
+    const aiq_init_params* params = static_cast<const aiq_init_params*>(pData);
+
+    LOGIPC("@%s, aiqb_size:%d, nvm_size:%d, aiqd_size:%d", __func__,
+           params->aiqb_size, params->nvm_size, params->aiqd_size);
+
+    int totalMemSize =
+        sizeof(aiq_init_params) + params->aiqb_size + params->nvm_size + params->aiqd_size;
+    CheckError(dataSize < totalMemSize, false,
+               "@%s, dataSize:%d is too small", __func__, dataSize);
+
+    const aiq_init_params* p = static_cast<const aiq_init_params*>(pData) + 1;
+    uint8_t* ptr = reinterpret_cast<uint8_t*>(const_cast<aiq_init_params*>(p));
+    aiqbData->size = params->aiqb_size;
+    aiqbData->data = aiqbData->size > 0 ? ptr : nullptr;
+
+    ptr += params->aiqb_size;
+    nvmData->size = params->nvm_size;
+    nvmData->data = nvmData->size > 0 ? ptr : nullptr;
+
+    ptr += params->nvm_size;
+    aiqdData->size = params->aiqd_size;
+    aiqdData->data = aiqdData->size > 0 ? ptr : nullptr;
+
+    return true;
+}
+
+// ae
+bool IPCIntelAiq::clientFlattenAe(uintptr_t aiq,
+                                  const ia_aiq_ae_input_params& inParams,
+                                  ae_run_params* params) {
+    LOGIPC("@%s, params:%p", __func__, params);
+    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false,
+               "@%s, aiq is nullptr", __func__);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    params->aiq_handle = aiq;
+
+    params->base = inParams;
+    const ia_aiq_ae_input_params* base = &params->base;
+
+    if (base->aec_features) {
+        params->aec_features = *inParams.aec_features;
+    }
+
+    if (base->exposure_coordinate) {
+        params->exposure_coordinate = *inParams.exposure_coordinate;
+    }
+
+    if (base->exposure_window) {
+        params->exposure_window = *inParams.exposure_window;
+    }
+
+    if (inParams.num_exposures > 1) {
+        LOGE("@%s, BUG: num_exposures:%d > 1. Copying only first.",
+             __func__, inParams.num_exposures);
+    }
+
+    if (base->sensor_descriptor) {
+        params->sensor_descriptor = *inParams.sensor_descriptor;
+    }
+
+    if (base->manual_exposure_time_us) {
+        params->manual_exposure_time_us = *inParams.manual_exposure_time_us;
+    }
+
+    if (base->manual_analog_gain) {
+        params->manual_analog_gain = *inParams.manual_analog_gain;
+    }
+
+    if (base->manual_iso) {
+        params->manual_iso = *inParams.manual_iso;
+    }
+
+    if (base->manual_limits) {
+        params->manual_limits = *inParams.manual_limits;
+    }
+
+    return true;
+}
+
+bool IPCIntelAiq::serverUnflattenAe(ae_run_params* inParams,
+                                    ia_aiq_ae_input_params** params) {
+    LOGIPC("@%s, inParams:%p, params:%p", __func__, inParams, params);
+    CheckError(!inParams, false, "@%s, inParams is nullptr", __func__);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    ia_aiq_ae_input_params* base = &inParams->base;
+    if (base->aec_features) {
+        base->aec_features = &inParams->aec_features;
+    }
+
+    if (base->exposure_coordinate) {
+        base->exposure_coordinate = &inParams->exposure_coordinate;
+    }
+
+    if (base->exposure_window) {
+        base->exposure_window = &inParams->exposure_window;
+    }
+
+    if (base->sensor_descriptor) {
+        base->sensor_descriptor = &inParams->sensor_descriptor;
+    }
+
+    if (base->manual_exposure_time_us) {
+        base->manual_exposure_time_us = &inParams->manual_exposure_time_us;
+    }
+
+    if (base->manual_analog_gain) {
+        base->manual_analog_gain = &inParams->manual_analog_gain;
+    }
+
+    if (base->manual_iso) {
+        base->manual_iso = &inParams->manual_iso;
+    }
+
+    if (base->manual_limits) {
+        base->manual_limits = &inParams->manual_limits;
+    }
+
+    *params = base;
+
+    return true;
+}
+
+bool IPCIntelAiq::clientUnflattenAe(ae_run_params* params, ia_aiq_ae_results** results) {
+    LOGIPC("@%s, params:%p, results:%p", __func__, params, results);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+    CheckError(!results, false, "@%s, results is nullptr", __func__);
+
+    ae_run_params_results* res = &params->res;
+    bool ret = unflattenAeResults(res);
+    CheckError((ret == false), false, "@%s, unflattenAeResults fails", __func__);
+
+    *results = &res->base;
+
+    return true;
+}
+
+bool IPCIntelAiq::serverFlattenAe(const ia_aiq_ae_results& aeResults, ae_run_params* params) {
+    LOGIPC("@%s, params:%p", __func__, params);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    bool ret = flattenAeResults(aeResults, &params->res);
+    CheckError(ret == false, false, "@%s, flattenAeResults fails", __func__);
+
+    return true;
+}
+
+bool IPCIntelAiq::flattenAeResults(const ia_aiq_ae_results& aeResults,
+                                   ae_run_params_results* res) {
+    LOGIPC("@%s, res:%p", __func__, res);
+    CheckError(!res, false, "@%s, res is nullptr", __func__);
+
+    res->base = aeResults;
+    const ia_aiq_ae_results* base = &res->base;
+
+    if (base->exposures && base->num_exposures > 0) {
+        CheckError(base->num_exposures > MAX_NUM_EXPOSURES, false,
+                   "@%s, base->num_exposures:% is too big", __func__, base->num_exposures);
+
+        for (unsigned int i = 0; i < base->num_exposures; i++) {
+            res->exposures[i] = aeResults.exposures[i];
+
+            if (res->exposures[i].exposure) {
+                res->exposure[i] = *aeResults.exposures[i].exposure;
+            }
+            if (res->exposures[i].sensor_exposure) {
+                res->sensor_exposure[i] = *aeResults.exposures[i].sensor_exposure;
+            }
+            if (res->exposures[i].exposure_plan_ids) {
+                CheckError(base->exposures->num_exposure_plan > MAX_NUM_OF_EXPOSURE_PLANS, false,
+                           "@%s, base->exposures->num_exposure_plan:% is too big", __func__,
+                           base->exposures->num_exposure_plan);
+                MEMCPY_S(res->exposure_plan_ids[i],
+                         sizeof(unsigned int) * MAX_NUM_OF_EXPOSURE_PLANS,
+                         aeResults.exposures[i].exposure_plan_ids,
+                         sizeof(unsigned int) * aeResults.exposures[i].num_exposure_plan);
+            }
+        }
+    }
+
+    if (base->weight_grid) {
+        res->weight_grid = *aeResults.weight_grid;
+
+        if (res->weight_grid.weights) {
+            unsigned int gridElements =
+                aeResults.weight_grid->width * aeResults.weight_grid->height;
+            gridElements = CLIP(gridElements, MAX_SIZE_WEIGHT_GRID, 1);
+            MEMCPY_S(res->weights, sizeof(res->weights),
+                aeResults.weight_grid->weights, gridElements * sizeof(unsigned char));
+        }
+    }
+
+    if (base->flashes) {
+        // Valgrind will give warning from here in the first round. It should be fine.
+        if (aeResults.num_flashes > 0) {
+            MEMCPY_S(res->flashes, sizeof(res->flashes),
+                aeResults.flashes, MAX_NUM_FLASHES * sizeof(ia_aiq_flash_parameters));
+        }
+    }
+
+    if (base->aperture_control) {
+        res->aperture_control = *aeResults.aperture_control;
+    }
+
+    return true;
+}
+
+bool IPCIntelAiq::unflattenAeResults(ae_run_params_results* res) {
+    LOGIPC("@%s, res:%p", __func__, res);
+    CheckError(!res, false, "@%s, res is nullptr", __func__);
+
+    ia_aiq_ae_results* base = &res->base;
+
+    if (base->exposures) {
+        base->exposures = res->exposures;
+
+        CheckError(base->num_exposures > MAX_NUM_EXPOSURES, false,
+                   "@%s, base->num_exposures:% is too big", __func__, base->num_exposures);
+
+        for (unsigned int i = 0; i < base->num_exposures; i++) {
+            if (base->exposures[i].exposure) {
+                base->exposures[i].exposure = &res->exposure[i];
+            }
+            if (base->exposures[i].sensor_exposure) {
+                base->exposures[i].sensor_exposure = &res->sensor_exposure[i];
+            }
+            if (base->exposures[i].exposure_plan_ids) {
+                base->exposures[i].exposure_plan_ids = res->exposure_plan_ids[i];
+            }
+        }
+    }
+
+    if (base->weight_grid) {
+        base->weight_grid = &res->weight_grid;
+        if (base->weight_grid->weights) {
+            base->weight_grid->weights = res->weights;
+        }
+    }
+
+    if (base->flashes) {
+        base->flashes = res->flashes;
+    }
+
+    if (base->aperture_control) {
+        base->aperture_control = &res->aperture_control;
+    }
+
+    return true;
+}
+
+// af
+bool IPCIntelAiq::clientFlattenAf(uintptr_t aiq,
+                                  const ia_aiq_af_input_params& inParams,
+                                  af_run_params* params) {
+    LOGIPC("@%s, params:%p", __func__, params);
+    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false,
+               "@%s, aiq is nullptr", __func__);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    params->aiq_handle = aiq;
+
+    params->base = inParams;
+    ia_aiq_af_input_params* base = &params->base;
+    if (base->focus_rect) {
+        params->focus_rect = *inParams.focus_rect;
+    }
+    if (base->manual_focus_parameters) {
+        params->manual_focus_parameters = *inParams.manual_focus_parameters;
+    }
+
+    return true;
+}
+
+bool IPCIntelAiq::clientUnflattenAf(const af_run_params& params, ia_aiq_af_results** results) {
+    LOGIPC("@%s, results:%p", __func__, results);
+    CheckError(!results, false, "@%s, results is nullptr", __func__);
+
+    *results = const_cast<ia_aiq_af_results*>(&params.results);
+
+    return true;
+}
+
+bool IPCIntelAiq::serverUnflattenAf(af_run_params* inParams,
+                                    ia_aiq_af_input_params** params) {
+    LOGIPC("@%s, inParams:%p, params:%p", __func__, inParams, params);
+    CheckError(!inParams, false, "@%s, inParams is nullptr", __func__);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    ia_aiq_af_input_params* base = &inParams->base;
+    if (base->focus_rect) {
+        base->focus_rect = &inParams->focus_rect;
+    }
+    if (base->manual_focus_parameters) {
+        base->manual_focus_parameters = &inParams->manual_focus_parameters;
+    }
+
+    *params = base;
+
+    return true;
+}
+
+bool IPCIntelAiq::serverFlattenAf(const ia_aiq_af_results& afResults, af_run_params* params) {
+    LOGIPC("@%s, params:%p", __func__, params);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    ia_aiq_af_results* results = &params->results;
+    *results = afResults;
+
+    LOGIPC("af results->status:%d", results->status);
+    LOGIPC("af results->current_focus_distance:%d", results->current_focus_distance);
+    LOGIPC("af results->next_lens_position:%d", results->next_lens_position);
+    LOGIPC("af results->lens_driver_action:%d", results->lens_driver_action);
+    LOGIPC("af results->use_af_assist:%d", results->use_af_assist);
+    LOGIPC("af results->final_lens_position_reached:%d", results->final_lens_position_reached);
+
+    return true;
+}
+
+// awb
+bool IPCIntelAiq::clientFlattenAwb(uintptr_t aiq,
+                                   const ia_aiq_awb_input_params& inParams,
+                                   awb_run_params* params) {
+    LOGIPC("@%s, aiq:0x%, params:%p", __func__, aiq, params);
+    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false,
+               "@%s, aiq is nullptr", __func__);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    params->aiq_handle = aiq;
+
+    params->base = inParams;
+    const ia_aiq_awb_input_params* base = &params->base;
+
+    if (base->manual_cct_range) {
+        params->manual_cct_range = *inParams.manual_cct_range;
+    }
+
+    if (base->manual_white_coordinate) {
+        params->manual_white_coordinate = *inParams.manual_white_coordinate;
+    }
+
+    return true;
+}
+
+bool IPCIntelAiq::clientUnflattenAwb(const awb_run_params& inParams,
+                                     ia_aiq_awb_results** results) {
+    LOGIPC("@%s, results:%p", __func__, results);
+    CheckError(!results, false, "@%s, results is nullptr", __func__);
+
+    *results = const_cast<ia_aiq_awb_results*>(&inParams.results);
+
+    return true;
+}
+
+bool IPCIntelAiq::serverUnflattenAwb(awb_run_params* inParams,
+                                     ia_aiq_awb_input_params** params) {
+    LOGIPC("@%s, inParams:%p, params:%p", __func__, inParams, params);
+    CheckError(!inParams, false, "@%s, inParams is nullptr", __func__);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    ia_aiq_awb_input_params* base = &inParams->base;
+
+    if (base->manual_cct_range) {
+        base->manual_cct_range = &inParams->manual_cct_range;
+    }
+
+    if (base->manual_white_coordinate) {
+        base->manual_white_coordinate = &inParams->manual_white_coordinate;
+    }
+
+    LOGIPC("@%s, manual_cct_range:%p, manual_white_coordinate:%p", __func__,
+           base->manual_cct_range, base->manual_white_coordinate);
+
+    *params = base;
+
+    return true;
+}
+
+bool IPCIntelAiq::serverFlattenAwb(const ia_aiq_awb_results& awbResults, awb_run_params* params) {
+    LOGIPC("@%s, params:%p", __func__, params);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    ia_aiq_awb_results* results = &params->results;
+    *results = awbResults;
+
+    LOGIPC("awb results->accurate_r_per_g:%f", results->accurate_r_per_g);
+    LOGIPC("awb results->accurate_b_per_g:%f", results->accurate_b_per_g);
+    LOGIPC("awb results->final_r_per_g:%f", results->final_r_per_g);
+    LOGIPC("awb results->final_b_per_g:%f", results->final_b_per_g);
+    LOGIPC("awb results->cct_estimate:%d", results->cct_estimate);
+    LOGIPC("awb results->distance_from_convergence:%f", results->distance_from_convergence);
+
+    return true;
+}
+
+// gbce
+bool IPCIntelAiq::clientFlattenGbce(uintptr_t aiq,
+                                    const ia_aiq_gbce_input_params& inParams,
+                                    gbce_run_params* params) {
+    LOGIPC("@%s, params:%p", __func__,  params);
+    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false,
+               "@%s, aiq is nullptr", __func__);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    params->aiq_handle = aiq;
+    params->base = inParams;
+
+    return true;
+}
+
+bool IPCIntelAiq::clientUnflattenGbce(gbce_run_params* params,
+                                      ia_aiq_gbce_results** results) {
+    LOGIPC("@%s, params:%p, results:%p", __func__, params, results);
+    CheckError(!results, false, "@%s, results is nullptr", __func__);
+
+    gbce_results_params* res = &params->res;
+    bool ret = unflattenGbceResults(res);
+    CheckError(!ret, false, "@%s, unflattenGbceResults fails", __func__);
+
+    *results = &res->base;
+
+    return true;
+}
+
+bool IPCIntelAiq::serverFlattenGbce(const ia_aiq_gbce_results& gbceResults,
+                                    gbce_run_params* params) {
+    LOGIPC("@%s, params:%p", __func__, params);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    return flattenGbceResults(gbceResults, &params->res);
+}
+
+bool IPCIntelAiq::flattenGbceResults(const ia_aiq_gbce_results& gbceResults,
+                                     gbce_results_params* res) {
+    LOGIPC("@%s, res:%p", __func__, res);
+    CheckError(!res, false, "@%s, res is nullptr", __func__);
+
+    size_t size = gbceResults.gamma_lut_size * sizeof(*gbceResults.g_gamma_lut);
+    LOGIPC("@%s, gamma_lut_size:%d, size:%zu, tone_map_lut_size:%d", __func__,
+           gbceResults.gamma_lut_size, size, gbceResults.tone_map_lut_size);
+
+    res->base = gbceResults;
+
+    const ia_aiq_gbce_results* base = &res->base;
+
+    if (base->r_gamma_lut) {
+        MEMCPY_S(res->r_gamma_lut, sizeof(res->r_gamma_lut), gbceResults.r_gamma_lut, size);
+    }
+
+    if (base->b_gamma_lut) {
+        MEMCPY_S(res->b_gamma_lut, sizeof(res->b_gamma_lut), gbceResults.b_gamma_lut, size);
+    }
+
+    if (base->g_gamma_lut) {
+        MEMCPY_S(res->g_gamma_lut, sizeof(res->g_gamma_lut), gbceResults.g_gamma_lut, size);
+    }
+
+    if (base->tone_map_lut) {
+        MEMCPY_S(res->tone_map_lut, sizeof(res->tone_map_lut),
+                 gbceResults.tone_map_lut,
+                 gbceResults.tone_map_lut_size * sizeof(*gbceResults.tone_map_lut));
+    }
+
+    return true;
+}
+
+bool IPCIntelAiq::unflattenGbceResults(gbce_results_params* res) {
+    LOGIPC("@%s, res:%p", __func__, res);
+    CheckError(!res, false, "@%s, res is nullptr", __func__);
+
+    ia_aiq_gbce_results* base = &res->base;
+
+    LOGIPC("@%s, gamma_lut_size:%d", __func__, base->gamma_lut_size);
+    LOGIPC("@%s, tone_map_lut_size:%d", __func__, base->tone_map_lut_size);
+    CheckError(base->gamma_lut_size > MAX_NUM_GAMMA_LUTS, false,
+               "@%s, gamma_lut_size:%d is too big", __func__, base->gamma_lut_size);
+    CheckError((base->tone_map_lut_size > MAX_NUM_TOME_MAP_LUTS), false,
+               "@%s, tone_map_lut_size:%d is too big", __func__, base->tone_map_lut_size);
+
+    if (base->r_gamma_lut) {
+        base->r_gamma_lut = res->r_gamma_lut;
+    }
+
+    if (base->b_gamma_lut) {
+        base->b_gamma_lut = res->b_gamma_lut;
+    }
+
+    if (base->g_gamma_lut) {
+        base->g_gamma_lut = res->g_gamma_lut;
+    }
+
+    if (base->tone_map_lut) {
+        base->tone_map_lut = res->tone_map_lut;
+    }
+
+    return true;
+}
+
+// pa
+bool IPCIntelAiq::clientFlattenPaV1(uintptr_t aiq,
+                                    const ia_aiq_pa_input_params& inParams,
+                                    pa_run_v1_params* params) {
+    LOGIPC("@%s, params:%p", __func__, params);
+    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false,
+               "@%s, aiq is nullptr", __func__);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    params->aiq_handle = aiq;
+
+    params->base = inParams;
+    ia_aiq_pa_input_params* base = &params->base;
+
+    if (base->awb_results) {
+        params->awb_results = *base->awb_results;
+    }
+
+    if (base->exposure_params) {
+        params->exposure_params = *base->exposure_params;
+    }
+
+    if (base->color_gains) {
+        params->color_gains = *base->color_gains;
+    }
+
+    return true;
+}
+
+bool IPCIntelAiq::clientUnflattenPaV1(pa_run_v1_params* params,
+                                      ia_aiq_pa_results_v1** results) {
+    LOGIPC("@%s, params:%p, results:%p", __func__, params, results);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+    CheckError(!results, false, "@%s, results is nullptr", __func__);
+
+    pa_run_params_results_v1* res = &params->res;
+    bool ret = unflattenPaResultsV1(res);
+    CheckError((ret == false), false, "@%s, unflattenPaResultsV1 fails", __func__);
+
+    *results = &res->base;
+
+    return true;
+}
+
+bool IPCIntelAiq::serverUnflattenPaV1(pa_run_v1_params* inParams,
+                                      ia_aiq_pa_input_params** params) {
+    LOGIPC("@%s, inParams:%p, params:%p", __func__, inParams, params);
+    CheckError(!inParams, false, "@%s, inParams is nullptr", __func__);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    ia_aiq_pa_input_params* base = &inParams->base;
+
+    if (base->awb_results) {
+        base->awb_results = &inParams->awb_results;
+    }
+
+    if (base->exposure_params) {
+        base->exposure_params = &inParams->exposure_params;
+    }
+
+    if (base->color_gains) {
+        base->color_gains = &inParams->color_gains;
+    }
+
+    *params = base;
+
+    return true;
+}
+
+bool IPCIntelAiq::serverFlattenPaV1(const ia_aiq_pa_results_v1& paResults,
+                                    pa_run_v1_params* params) {
+    LOGIPC("@%s, params:%p", __func__, params);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    bool ret = flattenPaResultsV1(paResults, &params->res);
+    CheckError(ret == false, false, "@%s, flattenPaResultsV1 fails", __func__);
+
+    return true;
+}
+
+bool IPCIntelAiq::flattenPaResultsV1(const ia_aiq_pa_results_v1& paResults,
+                                     pa_run_params_results_v1* res) {
+    LOGIPC("@%s, res:%p", __func__, res);
+    CheckError(!res, false, "@%s, res is nullptr", __func__);
+
+    res->base = paResults;
+    ia_aiq_pa_results_v1* base = &res->base;
+
+    ia_aiq_color_channels_lut* linearization = &base->linearization;
+    CheckError((MAX_NUM_LUTS < linearization->size), false,
+               "@%s, linearization:%d is too big", __func__, linearization->size);
+    if (linearization->gr) {
+        MEMCPY_S(res->gr, sizeof(res->gr),
+            linearization->gr, sizeof(*linearization->gr) * linearization->size);
+    }
+    if (linearization->r) {
+        MEMCPY_S(res->r, sizeof(res->r),
+            linearization->r, sizeof(*linearization->r) * linearization->size);
+    }
+    if (linearization->b) {
+        MEMCPY_S(res->b, sizeof(res->b),
+            linearization->b, sizeof(*linearization->b) * linearization->size);
+    }
+    if (linearization->gb) {
+        MEMCPY_S(res->gb, sizeof(res->gb),
+            linearization->gb, sizeof(*linearization->gb) * linearization->size);
+    }
+
+    ia_aiq_advanced_ccm_t* preferred_acm = base->preferred_acm;
+    if (preferred_acm) {
+        CheckError((MAX_SECTOR_COUNT < preferred_acm->sector_count), false,
+                   "@%s, sector_count:%d is too big", __func__, preferred_acm->sector_count);
+
+        res->preferred_acm = *preferred_acm;
+
+        if (preferred_acm->hue_of_sectors) {
+            MEMCPY_S(res->hue_of_sectors, sizeof(res->hue_of_sectors),
+                     preferred_acm->hue_of_sectors,
+                     sizeof(*preferred_acm->hue_of_sectors) * preferred_acm->sector_count);
+        }
+
+        if (preferred_acm->advanced_color_conversion_matrices) {
+            MEMCPY_S(res->advanced_color_conversion_matrices,
+                     sizeof(res->advanced_color_conversion_matrices),
+                     preferred_acm->advanced_color_conversion_matrices,
+                     (sizeof(*preferred_acm->advanced_color_conversion_matrices)
+                         * preferred_acm->sector_count));
+        }
+    }
+
+    ia_aiq_ir_weight_t* ir_weight = base->ir_weight;
+    if (ir_weight) {
+        res->ir_weight = *ir_weight;
+
+        if (ir_weight->ir_weight_grid_R) {
+            MEMCPY_S(res->ir_weight_grid_R, sizeof(res->ir_weight_grid_R),
+                     ir_weight->ir_weight_grid_R,
+                     sizeof(*ir_weight->ir_weight_grid_R) * ir_weight->height * ir_weight->width);
+        }
+
+        if (ir_weight->ir_weight_grid_G) {
+            MEMCPY_S(res->ir_weight_grid_G, sizeof(res->ir_weight_grid_G),
+                     ir_weight->ir_weight_grid_G,
+                     sizeof(*ir_weight->ir_weight_grid_G) * ir_weight->height * ir_weight->width);
+        }
+
+        if (ir_weight->ir_weight_grid_B) {
+            MEMCPY_S(res->ir_weight_grid_B, sizeof(res->ir_weight_grid_B),
+                     ir_weight->ir_weight_grid_B,
+                     sizeof(*ir_weight->ir_weight_grid_B) * ir_weight->height * ir_weight->width);
+        }
+    }
+
+    ia_aiq_rgbir_t* rgbir = base->rgbir;
+    if (rgbir) {
+        res->rgbir = *rgbir;
+
+        CheckError(rgbir->n_models > MAX_NUM_IR_MODES, false,
+                   "@%s, rgbir->n_models:%d is too big", __func__, rgbir->n_models);
+
+        if (rgbir->models && rgbir->n_models > 0) {
+            for (unsigned int i = 0; i < rgbir->n_models; i++) {
+                res->models[i] = rgbir->models[i];
+            }
+        }
+    }
+
+    return true;
+}
+
+bool IPCIntelAiq::unflattenPaResultsV1(pa_run_params_results_v1* res) {
+    LOGIPC("@%s, res:%p", __func__, res);
+    CheckError(!res, false, "@%s, res is nullptr", __func__);
+
+    ia_aiq_pa_results_v1* base = &res->base;
+
+    if (base->linearization.gr) {
+        base->linearization.gr = res->gr;
+    }
+    if (base->linearization.r) {
+        base->linearization.r = res->r;
+    }
+    if (base->linearization.b) {
+        base->linearization.b = res->b;
+    }
+    if (base->linearization.gb) {
+        base->linearization.gb = res->gb;
+    }
+
+    if (base->preferred_acm) {
+        base->preferred_acm = &res->preferred_acm;
+
+        if (base->preferred_acm->hue_of_sectors) {
+            base->preferred_acm->hue_of_sectors = res->hue_of_sectors;
+        }
+
+        if (base->preferred_acm->advanced_color_conversion_matrices) {
+            base->preferred_acm->advanced_color_conversion_matrices =
+                static_cast<float(*)[3][3]>(res->advanced_color_conversion_matrices);
+        }
+    }
+
+    if (base->ir_weight) {
+        base->ir_weight = &res->ir_weight;
+
+        if (base->ir_weight->ir_weight_grid_R) {
+            base->ir_weight->ir_weight_grid_R = res->ir_weight_grid_R;
+        }
+        if (base->ir_weight->ir_weight_grid_G) {
+            base->ir_weight->ir_weight_grid_G = res->ir_weight_grid_G;
+        }
+        if (base->ir_weight->ir_weight_grid_B) {
+            base->ir_weight->ir_weight_grid_B = res->ir_weight_grid_B;
+        }
+    }
+
+    if (base->rgbir) {
+        base->rgbir = &res->rgbir;
+
+        ia_aiq_rgbir_t* resRgbir = &res->rgbir;
+        if (resRgbir->models && resRgbir->n_models > 0) {
+            resRgbir->models = res->models;
+        }
+    }
+
+    return true;
+}
+
+// sa
+bool IPCIntelAiq::clientFlattenSaV2(uintptr_t aiq,
+                                    const ia_aiq_sa_input_params_v1& inParams,
+                                    sa_run_v2_params* params) {
+    LOGIPC("@%s, params:%p", __func__, params);
+    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false,
+               "@%s, aiq is nullptr", __func__);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    params->aiq_handle = aiq;
+
+    params->base = inParams;
+    const ia_aiq_sa_input_params_v1* base = &params->base;
+
+    if (base->sensor_frame_params) {
+        params->sensor_frame_params = *inParams.sensor_frame_params;
+    }
+
+    if (base->awb_results) {
+        params->awb_results = *inParams.awb_results;
+    }
+
+    return true;
+}
+
+bool IPCIntelAiq::clientUnflattenSaV2(sa_run_v2_params* params,
+                                      ia_aiq_sa_results_v1** results) {
+    LOGIPC("@%s, params:%p, results:%p", __func__, params, results);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+    CheckError(!results, false, "@%s, results is nullptr", __func__);
+
+    sa_run_v2_params_results* res = &params->res;
+    bool ret = unflattenSaResultsV2(res);
+    CheckError(ret == false, false, "@%s, unflattenSaResultsV2 fails", __func__);
+
+    *results = &res->base;
+
+    return true;
+}
+
+bool IPCIntelAiq::serverUnflattenSaV2(const sa_run_v2_params& inParams,
+                                      ia_aiq_sa_input_params_v1** params) {
+    LOGIPC("@%s, params:%p", __func__, params);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    ia_aiq_sa_input_params_v1* base = const_cast<ia_aiq_sa_input_params_v1*>(&inParams.base);
+
+    if (base->sensor_frame_params) {
+        base->sensor_frame_params =
+            const_cast<ia_aiq_frame_params*>(&inParams.sensor_frame_params);
+    }
+
+    if (base->awb_results) {
+        base->awb_results = const_cast<ia_aiq_awb_results*>(&inParams.awb_results);
+    }
+
+    *params = base;
+
+    return true;
+}
+
+bool IPCIntelAiq::serverFlattenSaV2(const ia_aiq_sa_results_v1& saResults,
+                                    sa_run_v2_params* params) {
+    LOGIPC("@%s, params:%p", __func__, params);
+    CheckError(!params, false, "@%s, results is nullptr", __func__);
+
+    bool ret = flattenSaResultsV2(saResults, &params->res);
+    CheckError(ret == false, false, "@%s, flattenSaResultsV2 fails", __func__);
+
+    return true;
+}
+
+bool IPCIntelAiq::flattenSaResultsV2(const ia_aiq_sa_results_v1& saResults,
+                                     sa_run_v2_params_results* res) {
+    LOGIPC("@%s, res:%p", __func__, res);
+    CheckError(!res, false, "@%s, res is nullptr", __func__);
+
+    res->base = saResults;
+    ia_aiq_sa_results_v1* base = &res->base;
+
+    LOGIPC("sa_results: width:%d, height:%d, lsc_update:%d",
+           base->width, base->height, base->lsc_update);
+
+    if (base->width && base->height) {
+        size_t size = base->width * base->height * sizeof(unsigned short);
+        for (int i = 0; i < LSC_MAX_BAYER_ORDER_NUM; i++) {
+            for (int j = 0; j < LSC_MAX_BAYER_ORDER_NUM; j++) {
+                lsc_grid_content* lgc = &res->lsc_grid[i][j];
+                if (base->lsc_grid[i][j]) {
+                    MEMCPY_S(lgc->content, sizeof(lgc->content), base->lsc_grid[i][j], size);
+                }
+            }
+        }
+    } else if (base->lsc_update) {
+        LOGE("@%s, Error: LSC table size is 0", __func__);
+    }
+
+    return true;
+}
+
+bool IPCIntelAiq::unflattenSaResultsV2(sa_run_v2_params_results* res) {
+    LOGIPC("@%s, res:%p", __func__, res);
+    CheckError(!res, false, "@%s, res is nullptr", __func__);
+
+    ia_aiq_sa_results_v1* base = &res->base;
+
+    LOGIPC("sa_results_data:height:%d, width:%d", base->height, base->width);
+
+    for (int i = 0; i < LSC_MAX_BAYER_ORDER_NUM; i++) {
+        for (int j = 0; j < LSC_MAX_BAYER_ORDER_NUM; j++) {
+            lsc_grid_content* lgc = &res->lsc_grid[i][j];
+            base->lsc_grid[i][j] = lgc->content;
+        }
+    }
+
+    return true;
+}
+
+// statistics
+bool IPCIntelAiq::clientFlattenStatSetV4(uintptr_t aiq,
+                                         const ia_aiq_statistics_input_params_v4& inParams,
+                                         set_statistics_set_v4_params* params) {
+    LOGIPC("@%s, aiq:0x%, params:%p", __func__, aiq, params);
+    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false,
+               "@%s, aiq is nullptr", __func__);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    params->ia_aiq = aiq;
+
+    set_statistics_params_data* input = &params->input;
+    input->base = inParams;
+    ia_aiq_statistics_input_params_v4* base = &input->base;
+
+    if (base->frame_ae_parameters) {
+        flattenAeResults(*base->frame_ae_parameters, &input->frame_ae_parameters);
+    }
+
+    if (base->frame_af_parameters) {
+        input->frame_af_parameters = *base->frame_af_parameters;
+    }
+
+    if (base->rgbs_grids) {
+        CheckError((base->num_rgbs_grids > MAX_NUMBER_OF_GRIDS), false,
+                   "@%s, num_rgbs_grids:%d > MAX_NUMBER_OF_GRIDS:%d",
+                   __func__, base->num_rgbs_grids, MAX_NUMBER_OF_GRIDS);
+
+        for (int i = 0; i < MAX_NUMBER_OF_GRIDS; i++) {
+            ia_aiq_rgbs_grid_data* rgbs_grids = &input->rgbs_grids[i];
+            rgbs_grids->base = *base->rgbs_grids[i];
+
+            CheckError(rgbs_grids->base.grid_width * rgbs_grids->base.grid_height > MAX_NUM_BLOCKS,
+                       false, "@%s, grid_width:%d * grid_height:%d is too big", __func__,
+                       rgbs_grids->base.grid_width, rgbs_grids->base.grid_height);
+
+            MEMCPY_S(rgbs_grids->blocks_ptr,
+                     sizeof(rgbs_grids->blocks_ptr),
+                     rgbs_grids->base.blocks_ptr,
+                     rgbs_grids->base.grid_width
+                        * rgbs_grids->base.grid_height
+                        * sizeof(*rgbs_grids->base.blocks_ptr));
+        }
+    }
+
+    if (base->hdr_rgbs_grid) {
+        ia_aiq_hdr_rgbs_grid_data* hdr_rgbs_grid = &input->hdr_rgbs_grid;
+        hdr_rgbs_grid->base = *base->hdr_rgbs_grid;
+        MEMCPY_S(hdr_rgbs_grid->blocks_ptr,
+                 sizeof(hdr_rgbs_grid->blocks_ptr),
+                 hdr_rgbs_grid->base.blocks_ptr,
+                 hdr_rgbs_grid->base.grid_width
+                    * hdr_rgbs_grid->base.grid_height
+                    * sizeof(*hdr_rgbs_grid->base.blocks_ptr));
+    }
+
+    if (base->af_grids) {
+        CheckError((base->num_af_grids > MAX_NUMBER_OF_AF_GRIDS), false,
+                   "@%s, num_af_grids:%d > MAX_NUMBER_OF_AF_GRIDS:%d",
+                   __func__, base->num_af_grids, MAX_NUMBER_OF_AF_GRIDS);
+
+        for (int i = 0; i < MAX_NUMBER_OF_AF_GRIDS; i++) {
+            ia_aiq_af_grid_data* af_grids = &input->af_grids[i];
+            af_grids->base = *base->af_grids[i];
+            MEMCPY_S(af_grids->filter_response_1,
+                     sizeof(af_grids->filter_response_1),
+                     af_grids->base.filter_response_1,
+                     af_grids->base.grid_width
+                        * af_grids->base.grid_height
+                        * sizeof(*af_grids->base.filter_response_1));
+            MEMCPY_S(af_grids->filter_response_2,
+                     sizeof(af_grids->filter_response_2),
+                     af_grids->base.filter_response_2,
+                     af_grids->base.grid_width
+                        * af_grids->base.grid_height
+                        * sizeof(*af_grids->base.filter_response_2));
+        }
+    }
+
+    if (base->frame_pa_parameters) {
+        flattenPaResultsV1(*base->frame_pa_parameters, &input->frame_pa_parameters);
+    }
+
+    if (base->faces) {
+        input->faces.base = *base->faces;
+        for (int i = 0; i < base->faces->num_faces; i++) {
+            input->faces.faces[i] = *(base->faces->faces + i);
+        }
+    }
+
+    if (base->awb_results) {
+        input->awb_results = *base->awb_results;
+    }
+
+    if (base->frame_sa_parameters) {
+        flattenSaResultsV2(*base->frame_sa_parameters, &input->frame_sa_parameters);
+    }
+
+    if (base->depth_grids) {
+        CheckError(base->num_depth_grids > MAX_NUMBER_OF_DEPTH_GRIDS, false,
+                   "@%s, num_depth_grids:%d > MAX_NUMBER_OF_DEPTH_GRIDS:%d", __func__,
+                   base->num_depth_grids, MAX_NUMBER_OF_DEPTH_GRIDS);
+
+        for (int i = 0; i < MAX_NUMBER_OF_DEPTH_GRIDS; i++) {
+            ia_aiq_depth_grid_data* depth_grids = &input->depth_grids[i];
+            depth_grids->base = *base->depth_grids[i];
+            MEMCPY_S(depth_grids->grid_rect,
+                     sizeof(depth_grids->grid_rect),
+                     depth_grids->base.grid_rect,
+                     depth_grids->base.grid_height
+                        * depth_grids->base.grid_width
+                        * sizeof(*depth_grids->base.grid_rect));
+            MEMCPY_S(depth_grids->depth_data,
+                     sizeof(depth_grids->depth_data),
+                     depth_grids->base.depth_data,
+                     depth_grids->base.grid_height
+                        * depth_grids->base.grid_width
+                        * sizeof(*depth_grids->base.depth_data));
+            MEMCPY_S(depth_grids->confidence,
+                     sizeof(depth_grids->confidence),
+                     depth_grids->base.confidence,
+                     depth_grids->base.grid_height
+                        * depth_grids->base.grid_width
+                        * sizeof(*depth_grids->base.confidence));
+        }
+    }
+
+    if (base->ir_grid) {
+        input->ir_grid = *base->ir_grid;
+        MEMCPY_S(input->ir_grid_data,
+                 MAX_IR_WEIGHT_GRID_DATA_SIZE * sizeof(unsigned short),
+                 base->ir_grid->data,
+                 base->ir_grid->width * base->ir_grid->height * sizeof(unsigned short));
+    }
+
+    return true;
+}
+
+bool IPCIntelAiq::serverUnflattenStatSetV4(set_statistics_set_v4_params* inParams,
+                                           ia_aiq_statistics_input_params_v4** params) {
+    LOGIPC("@%s, inParams:%p, params:%p", __func__, inParams, params);
+    CheckError(!inParams, false, "@%s, inParams is nullptr", __func__);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    set_statistics_params_data* input = &inParams->input;
+    ia_aiq_statistics_input_params_v4* base = &input->base;
+
+    if (base->frame_ae_parameters) {
+        unflattenAeResults(&input->frame_ae_parameters);
+        base->frame_ae_parameters = &input->frame_ae_parameters.base;
+    }
+
+    if (base->frame_af_parameters) {
+        base->frame_af_parameters = &input->frame_af_parameters;
+    }
+
+    if (base->rgbs_grids) {
+        CheckError(base->num_rgbs_grids > MAX_NUMBER_OF_GRIDS, false,
+                   "@%s, num_rgbs_grids:%d > MAX_NUMBER_OF_GRIDS:%d",
+                   __func__, base->num_rgbs_grids, MAX_NUMBER_OF_GRIDS);
+
+        for (int i = 0; i < base->num_rgbs_grids; i++) {
+            ia_aiq_rgbs_grid_data* rgbs_grids = &input->rgbs_grids[i];
+            rgbs_grids->base.blocks_ptr = rgbs_grids->blocks_ptr;
+
+            input->rgbs_grids_array[i] = &rgbs_grids->base;
+        }
+        base->rgbs_grids = (input->rgbs_grids_array);
+    }
+
+    if (base->hdr_rgbs_grid) {
+        input->hdr_rgbs_grid.base.blocks_ptr = input->hdr_rgbs_grid.blocks_ptr;
+        base->hdr_rgbs_grid = &input->hdr_rgbs_grid.base;
+    }
+
+    if (base->af_grids) {
+        CheckError((base->num_af_grids > MAX_NUMBER_OF_AF_GRIDS), false,
+                   "@%s, num_af_grids:%d > MAX_NUMBER_OF_AF_GRIDS:%d",
+                   __func__, base->num_af_grids, MAX_NUMBER_OF_AF_GRIDS);
+
+        for (int i = 0; i < base->num_af_grids; i++) {
+            ia_aiq_af_grid_data* af_grids = &input->af_grids[i];
+            af_grids->base.filter_response_1 = af_grids->filter_response_1;
+            af_grids->base.filter_response_2 = af_grids->filter_response_2;
+
+            input->af_grids_array[i] = &af_grids->base;
+        }
+        base->af_grids = input->af_grids_array;
+    }
+
+    if (base->frame_pa_parameters) {
+        unflattenPaResultsV1(&input->frame_pa_parameters);
+        base->frame_pa_parameters = &input->frame_pa_parameters.base;
+    }
+
+    if (base->faces) {
+        input->faces.base.faces = input->faces.faces;
+        base->faces = &input->faces.base;
+    }
+
+    if (base->awb_results) {
+        base->awb_results = &input->awb_results;
+    }
+
+    if (base->frame_sa_parameters) {
+        unflattenSaResultsV2(&input->frame_sa_parameters);
+        base->frame_sa_parameters = &input->frame_sa_parameters.base;
+    }
+
+    if (base->depth_grids) {
+        CheckError((base->num_depth_grids > MAX_NUMBER_OF_DEPTH_GRIDS), false,
+                   "@%s, num_depth_grids:%d > MAX_NUMBER_OF_DEPTH_GRIDS:%d",
+                   __func__, base->num_depth_grids, MAX_NUMBER_OF_DEPTH_GRIDS);
+
+        for (int i = 0; i < base->num_depth_grids; i++) {
+            ia_aiq_depth_grid_data* depth_grids = &input->depth_grids[i];
+            depth_grids->base.grid_rect = depth_grids->grid_rect;
+            depth_grids->base.depth_data = depth_grids->depth_data;
+            depth_grids->base.confidence = depth_grids->confidence;
+
+            input->depth_grids_array[i] = &depth_grids->base;
+        }
+        base->depth_grids = input->depth_grids_array;
+    }
+
+    if (base->ir_grid) {
+        input->ir_grid.data = input->ir_grid_data;
+        base->ir_grid = &input->ir_grid;
+    }
+
+    *params = base;
+
+    return true;
+}
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.h
new file mode 100644
index 000000000000..931300bbce79
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.h
@@ -0,0 +1,367 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_aiq.h>
+
+#include "FaceBase.h"
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+struct aiq_init_params {
+    unsigned int aiqb_size;
+    unsigned int nvm_size;
+    unsigned int aiqd_size;
+    unsigned int stats_max_width;
+    unsigned int stats_max_height;
+    unsigned int max_num_stats_in;
+    uintptr_t ia_mkn;
+    uintptr_t cmcRemoteHandle;
+    uintptr_t results;
+};
+
+struct aiq_deinit_params {
+    uintptr_t aiq_handle;
+};
+
+struct af_run_params {
+    uintptr_t aiq_handle;
+
+    ia_aiq_af_input_params base;
+    ia_rectangle focus_rect;
+    ia_aiq_manual_focus_parameters manual_focus_parameters;
+
+    ia_aiq_af_results results;
+};
+
+#define MAX_NUM_GAMMA_LUTS 2048
+#define MAX_NUM_TOME_MAP_LUTS 2048
+struct gbce_results_params {
+    ia_aiq_gbce_results base;
+
+    float r_gamma_lut[MAX_NUM_GAMMA_LUTS];
+    float b_gamma_lut[MAX_NUM_GAMMA_LUTS];
+    float g_gamma_lut[MAX_NUM_GAMMA_LUTS];
+    float tone_map_lut[MAX_NUM_TOME_MAP_LUTS];
+};
+struct gbce_run_params {
+    uintptr_t aiq_handle;
+
+    ia_aiq_gbce_input_params base;
+
+    gbce_results_params res;
+};
+
+#define MAX_NUM_EXPOSURES 3
+#define MAX_NUM_FLASHES 1
+#define MAX_NUM_OF_EXPOSURE_PLANS 4
+#define MAX_SIZE_WEIGHT_GRID (128 * 128)
+struct ae_run_params_results {
+    ia_aiq_ae_results base;
+
+    ia_aiq_ae_exposure_result exposures[MAX_NUM_EXPOSURES];
+    ia_aiq_hist_weight_grid weight_grid;
+    ia_aiq_flash_parameters flashes[MAX_NUM_FLASHES];
+    ia_aiq_aperture_control aperture_control;
+
+    // the below is in ia_aiq_ae_exposure_result exposures[MAX_NUM_EXPOSURES];
+    ia_aiq_exposure_parameters exposure[MAX_NUM_EXPOSURES];
+    ia_aiq_exposure_sensor_parameters sensor_exposure[MAX_NUM_EXPOSURES];
+    unsigned int exposure_plan_ids[MAX_NUM_EXPOSURES][MAX_NUM_OF_EXPOSURE_PLANS];
+
+    // the below is in ia_aiq_hist_weight_grid weight_grid;
+    unsigned char weights[MAX_SIZE_WEIGHT_GRID];
+};
+
+struct ae_run_params {
+    uintptr_t aiq_handle;
+
+    ia_aiq_ae_input_params base;
+    ia_aiq_exposure_sensor_descriptor sensor_descriptor;
+    ia_rectangle exposure_window;
+    ia_coordinate exposure_coordinate;
+    long manual_exposure_time_us;
+    float manual_analog_gain;
+    short manual_iso;
+    ia_aiq_ae_features aec_features;
+    ia_aiq_ae_manual_limits manual_limits;
+
+    ae_run_params_results res;
+};
+
+struct awb_run_params {
+    uintptr_t aiq_handle;
+
+    ia_aiq_awb_input_params base;
+    ia_aiq_awb_manual_cct_range manual_cct_range;
+    ia_coordinate manual_white_coordinate;
+
+    ia_aiq_awb_results results;
+};
+
+#define MAX_NUM_LUTS 128
+#define MAX_SECTOR_COUNT 128
+#define MAX_IR_WIDTH 128
+#define MAX_IR_HEIGHT 128
+#define MAX_NUM_IR_BLOCKS (MAX_IR_WIDTH * MAX_IR_HEIGHT)
+#define MAX_NUM_IR_MODES 5
+struct pa_run_params_results_v1 {
+    ia_aiq_pa_results_v1 base;
+
+    ia_aiq_advanced_ccm_t preferred_acm;
+    ia_aiq_ir_weight_t ir_weight;
+    ia_aiq_rgbir_t rgbir;
+
+    // for ia_aiq_color_channels_lut linearization
+    float gr[MAX_NUM_LUTS];
+    float r[MAX_NUM_LUTS];
+    float b[MAX_NUM_LUTS];
+    float gb[MAX_NUM_LUTS];
+
+    // for ia_aiq_advanced_ccm_t *preferred_acm
+    unsigned int hue_of_sectors[MAX_SECTOR_COUNT];
+    float advanced_color_conversion_matrices[MAX_SECTOR_COUNT][3][3];
+
+    // for ia_aiq_ir_weight_t *ir_weight
+    uint16_t ir_weight_grid_R[MAX_NUM_IR_BLOCKS];
+    uint16_t ir_weight_grid_G[MAX_NUM_IR_BLOCKS];
+    uint16_t ir_weight_grid_B[MAX_NUM_IR_BLOCKS];
+
+    // for ia_aiq_rgbir_t *rgbir
+    ia_aiq_rgbir_model_t models[MAX_NUM_IR_MODES];
+};
+
+struct ia_atbx_face_state_data {
+    ia_atbx_face_state base;
+
+    ia_atbx_face faces[MAX_FACES_DETECTABLE];
+};
+
+struct pa_run_v1_params {
+    uintptr_t aiq_handle;
+
+    ia_aiq_pa_input_params base;
+    ia_aiq_awb_results awb_results;
+    ia_aiq_exposure_parameters exposure_params;
+    ia_aiq_color_channels color_gains;
+
+    pa_run_params_results_v1 res;
+};
+
+#define LSC_MAX_BAYER_ORDER_NUM 4
+#define LSC_TABLE_MAX_WIDTH 100
+#define LSC_TABLE_MAX_HEIGHT 100
+#define LSC_TABLE_MAX_SIZE (LSC_TABLE_MAX_WIDTH * LSC_TABLE_MAX_HEIGHT)
+struct lsc_grid_content {
+    uint16_t content[LSC_TABLE_MAX_SIZE];
+};
+struct sa_run_v2_params_results {
+    ia_aiq_sa_results_v1 base;
+
+    lsc_grid_content lsc_grid[LSC_MAX_BAYER_ORDER_NUM][LSC_MAX_BAYER_ORDER_NUM];
+};
+
+struct sa_run_v2_params {
+    uintptr_t aiq_handle;
+
+    ia_aiq_sa_input_params_v1 base;
+    ia_aiq_frame_params sensor_frame_params;
+    ia_aiq_awb_results awb_results;
+
+    sa_run_v2_params_results res;
+};
+
+#define MAX_IA_BINARY_DATA_PARAMS_SIZE 500000
+struct ia_binary_data_params {
+    uintptr_t aiq_handle;
+    uint8_t data[MAX_IA_BINARY_DATA_PARAMS_SIZE];
+    unsigned int size;
+};
+
+#define MAX_IA_AIQ_VERSION_PARAMS_DATA_SIZE 100
+struct ia_aiq_version_params {
+    uintptr_t aiq_handle;
+    char data[MAX_IA_AIQ_VERSION_PARAMS_DATA_SIZE];
+    unsigned int size;
+};
+
+#define MAX_WIDTH 96
+#define MAX_HEIGHT 72
+#define MAX_NUM_BLOCKS (MAX_WIDTH * MAX_HEIGHT)
+struct ia_aiq_rgbs_grid_data {
+    ia_aiq_rgbs_grid base;
+
+    rgbs_grid_block blocks_ptr[MAX_NUM_BLOCKS];
+};
+
+struct ia_aiq_hdr_rgbs_grid_data {
+    ia_aiq_hdr_rgbs_grid base;
+
+    hdr_rgbs_grid_block blocks_ptr[MAX_NUM_BLOCKS];
+};
+
+#define MAX_AF_GRID_WIDTH 96
+#define MAX_AF_GRID_HEIGHT 72
+#define MAX_AF_GRID_SIZE (MAX_AF_GRID_HEIGHT * MAX_AF_GRID_WIDTH)
+struct ia_aiq_af_grid_data {
+    ia_aiq_af_grid base;
+
+    int filter_response_1[MAX_AF_GRID_SIZE];
+    int filter_response_2[MAX_AF_GRID_SIZE];
+};
+
+#define MAX_DEPTH_GRID_WIDHT 128
+#define MAX_DEPTH_GRID_HEIGHT 128
+#define MAX_DEPTH_GRID_SIZE (MAX_DEPTH_GRID_WIDHT * MAX_DEPTH_GRID_HEIGHT)
+struct ia_aiq_depth_grid_data {
+    ia_aiq_depth_grid base;
+
+    ia_rectangle grid_rect[MAX_DEPTH_GRID_SIZE];
+    int depth_data[MAX_DEPTH_GRID_SIZE];
+    unsigned char confidence[MAX_DEPTH_GRID_SIZE];
+};
+
+#define MAX_NUMBER_OF_GRIDS 1
+#define MAX_NUMBER_OF_AF_GRIDS 1
+#define MAX_NUMBER_OF_HISTROGRAMS 1
+#define MAX_NUMBER_OF_DEPTH_GRIDS 1
+#define MAX_IR_WEIGHT_GRID_DATA_SIZE 480
+struct set_statistics_params_data {
+    ia_aiq_statistics_input_params_v4 base;
+
+    ae_run_params_results frame_ae_parameters;
+
+    ia_aiq_af_results frame_af_parameters;
+
+    const ia_aiq_rgbs_grid* rgbs_grids_array[MAX_NUMBER_OF_GRIDS];
+    ia_aiq_rgbs_grid_data rgbs_grids[MAX_NUMBER_OF_GRIDS];
+
+    ia_aiq_hdr_rgbs_grid_data hdr_rgbs_grid;
+
+    const ia_aiq_af_grid* af_grids_array[MAX_NUMBER_OF_AF_GRIDS];
+    ia_aiq_af_grid_data af_grids[MAX_NUMBER_OF_AF_GRIDS];
+
+    pa_run_params_results_v1 frame_pa_parameters;
+
+    ia_atbx_face_state_data faces;
+
+    ia_aiq_awb_results awb_results;
+
+    sa_run_v2_params_results frame_sa_parameters;
+
+    const ia_aiq_depth_grid* depth_grids_array[MAX_NUMBER_OF_DEPTH_GRIDS];
+    ia_aiq_depth_grid_data depth_grids[MAX_NUMBER_OF_DEPTH_GRIDS];
+
+    ia_aiq_grid ir_grid;
+    unsigned short ir_grid_data[MAX_IR_WEIGHT_GRID_DATA_SIZE];
+};
+
+struct set_statistics_set_v4_params {
+    uintptr_t ia_aiq;
+    set_statistics_params_data input;
+};
+
+class IPCIntelAiq {
+ public:
+    IPCIntelAiq();
+    virtual ~IPCIntelAiq();
+
+    // for init
+    bool clientFlattenInit(const ia_binary_data* aiqbData,
+                           const ia_binary_data* nvmData,
+                           const ia_binary_data* aiqdData,
+                           unsigned int statsMaxWidth,
+                           unsigned int statsMaxHeight,
+                           unsigned int maxNumStatsIn,
+                           uintptr_t cmc,
+                           uintptr_t mkn,
+                           uint8_t* pData, unsigned int size);
+    bool serverUnflattenInit(const void* pData, int dataSize,
+                             ia_binary_data* aiqbData,
+                             ia_binary_data* nvmData,
+                             ia_binary_data* aiqdData);
+
+    // for ae
+    bool clientFlattenAe(uintptr_t aiq,
+                         const ia_aiq_ae_input_params& inParams,
+                         ae_run_params* params);
+    bool clientUnflattenAe(ae_run_params* params, ia_aiq_ae_results** results);
+    bool serverUnflattenAe(ae_run_params* inParams, ia_aiq_ae_input_params** params);
+    bool serverFlattenAe(const ia_aiq_ae_results& aeResults, ae_run_params* params);
+
+    bool flattenAeResults(const ia_aiq_ae_results& aeResults, ae_run_params_results* res);
+    bool unflattenAeResults(ae_run_params_results* res);
+
+    // for af
+    bool clientFlattenAf(uintptr_t aiq,
+                         const ia_aiq_af_input_params& inParams,
+                         af_run_params* params);
+    bool clientUnflattenAf(const af_run_params& params, ia_aiq_af_results** results);
+    bool serverUnflattenAf(af_run_params* inParams, ia_aiq_af_input_params** params);
+    bool serverFlattenAf(const ia_aiq_af_results& afResults, af_run_params* params);
+
+    // for awb
+    bool clientFlattenAwb(uintptr_t aiq,
+                          const ia_aiq_awb_input_params& inParams,
+                          awb_run_params* params);
+    bool clientUnflattenAwb(const awb_run_params& inParams, ia_aiq_awb_results** results);
+    bool serverUnflattenAwb(awb_run_params* inParams, ia_aiq_awb_input_params** params);
+    bool serverFlattenAwb(const ia_aiq_awb_results& awbResults, awb_run_params* params);
+
+    // for gbce
+    bool clientFlattenGbce(uintptr_t aiq,
+                           const ia_aiq_gbce_input_params& inParams,
+                           gbce_run_params* params);
+    bool clientUnflattenGbce(gbce_run_params* params, ia_aiq_gbce_results** results);
+    bool serverFlattenGbce(const ia_aiq_gbce_results& gbceResults, gbce_run_params* params);
+
+    bool flattenGbceResults(const ia_aiq_gbce_results& gbceResults, gbce_results_params* res);
+    bool unflattenGbceResults(gbce_results_params* res);
+
+    // for pa
+    bool clientFlattenPaV1(uintptr_t aiq,
+                           const ia_aiq_pa_input_params& inParams,
+                           pa_run_v1_params* params);
+    bool clientUnflattenPaV1(pa_run_v1_params* params, ia_aiq_pa_results_v1** results);
+    bool serverUnflattenPaV1(pa_run_v1_params* inParams, ia_aiq_pa_input_params** params);
+    bool serverFlattenPaV1(const ia_aiq_pa_results_v1& paResults, pa_run_v1_params* params);
+
+    bool flattenPaResultsV1(const ia_aiq_pa_results_v1& paResults,
+                            pa_run_params_results_v1* res);
+    bool unflattenPaResultsV1(pa_run_params_results_v1* res);
+
+    // for sa
+    bool clientFlattenSaV2(uintptr_t aiq,
+                           const ia_aiq_sa_input_params_v1& inParams,
+                           sa_run_v2_params* params);
+    bool clientUnflattenSaV2(sa_run_v2_params* params, ia_aiq_sa_results_v1** results);
+    bool serverUnflattenSaV2(const sa_run_v2_params& inParams, ia_aiq_sa_input_params_v1** params);
+    bool serverFlattenSaV2(const ia_aiq_sa_results_v1& saResults, sa_run_v2_params* params);
+
+    bool flattenSaResultsV2(const ia_aiq_sa_results_v1& saResults,
+                            sa_run_v2_params_results* res);
+    bool unflattenSaResultsV2(sa_run_v2_params_results* res);
+
+    // for statistics
+    bool clientFlattenStatSetV4(uintptr_t aiq,
+                                const ia_aiq_statistics_input_params_v4& inParams,
+                                set_statistics_set_v4_params* params);
+    bool serverUnflattenStatSetV4(set_statistics_set_v4_params* inParams,
+                                  ia_aiq_statistics_input_params_v4** params);
+};
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.cpp
new file mode 100644
index 000000000000..b751ebdf60ac
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.cpp
@@ -0,0 +1,259 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IPC_INTEL_CMC"
+
+#include "modules/sandboxing/IPCIntelCmc.h"
+
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+IPCIntelCmc::IPCIntelCmc() {
+    LOGIPC("@%s", __func__);
+}
+
+IPCIntelCmc::~IPCIntelCmc() {
+    LOGIPC("@%s", __func__);
+}
+
+bool IPCIntelCmc::clientFlattenInit(const ia_binary_data& aiqb, cmc_init_params* params) {
+    LOGIPC("@%s, aiqb: data:%p, size:%d, params:%p", __func__, aiqb.data, aiqb.size, params);
+
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+    CheckError(!aiqb.data, false, "@%s, aiqb.data is nullptr", __func__);
+    CheckError(aiqb.size == 0, false, "@%s, aiqb.size is 0", __func__);
+    CheckError(aiqb.size > sizeof(params->input.data), false,
+               "@%s, aiqb:%d is too big", __func__, aiqb.size);
+
+    ia_binary_data_mod* input = &params->input;
+    MEMCPY_S(input->data, sizeof(input->data), aiqb.data, aiqb.size);
+    input->size = aiqb.size;
+
+    return true;
+}
+
+bool IPCIntelCmc::clientUnflattenInit(const cmc_init_params& params,
+                                      ia_cmc_t** cmc,
+                                      uintptr_t* cmcRemoteHandle) {
+    LOGIPC("@%s, cmc:%p", __func__, cmc);
+    CheckError(!cmc, false, "@%s, cmc is nullptr", __func__);
+
+    int ret = unflattenCmcData(const_cast<ia_cmc_data*>(&params.results));
+    CheckError(ret == false, false, "%s, unflattenCmcData fails", __func__);
+
+    *cmc = const_cast<ia_cmc_t*>(&params.results.base);
+    *cmcRemoteHandle = params.results.cmcRemoteHandle;
+
+    return true;
+}
+
+bool IPCIntelCmc::serverUnflattenInit(const cmc_init_params& params, ia_binary_data* aiqb) {
+    LOGIPC("@%s, aiqb:%p", __func__, aiqb);
+    CheckError(aiqb == nullptr, false, "@%s, aiqb is nullptr", __func__);
+
+    ia_binary_data_mod* input = const_cast<ia_binary_data_mod*>(&params.input);
+    aiqb->data = input->data;
+    aiqb->size = input->size;
+
+    return true;
+}
+
+bool IPCIntelCmc::serverFlattenInit(const ia_cmc_t& cmc, cmc_init_params* params) {
+    LOGIPC("@%s, params:%p", __func__, params);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    int ret = flattenCmcData(&cmc, &params->results);
+    CheckError(ret == false, false, "%s flattenCmcData fails", __func__);
+
+    return true;
+}
+
+bool IPCIntelCmc::flattenCmcData(const ia_cmc_t* cmc, ia_cmc_data* results) {
+    CheckError(!cmc || !results, false, "%s, cmc or results is nullptr", __func__);
+
+    results->base = *cmc;
+    results->cmcRemoteHandle = reinterpret_cast<uintptr_t>(cmc);
+
+    ia_cmc_t* base = &results->base;
+    if (base->cmc_general_data) {
+        results->cmc_general_data = *base->cmc_general_data;
+    }
+
+    cmc_parsed_black_level_t* baseBL = &base->cmc_parsed_black_level;
+    cmc_parsed_black_level_data* retBL = &results->cmc_parsed_black_level;
+    if (baseBL->cmc_black_level) {
+        retBL->cmc_black_level = *baseBL->cmc_black_level;
+    }
+    if (baseBL->cmc_black_level_luts) {
+        retBL->cmc_black_level_luts = *baseBL->cmc_black_level_luts;
+    }
+
+    if (base->cmc_saturation_level) {
+        results->cmc_saturation_level = *base->cmc_saturation_level;
+    }
+
+    if (base->cmc_sensitivity) {
+        results->cmc_sensitivity = *base->cmc_sensitivity;
+    }
+
+    cmc_parsed_lens_shading_t* baseLS = &base->cmc_parsed_lens_shading;
+    cmc_parsed_lens_shading_data* retLS = &results->cmc_parsed_lens_shading;
+    if (baseLS->cmc_lens_shading) {
+        retLS->cmc_lens_shading = *baseLS->cmc_lens_shading;
+    }
+    if (baseLS->cmc_lsc_grids) {
+        retLS->cmc_lsc_grids = *baseLS->cmc_lsc_grids;
+    }
+    if (baseLS->lsc_grids) {
+        retLS->lsc_grids = *baseLS->lsc_grids;
+    }
+    if (baseLS->cmc_lsc_rg_bg_ratios) {
+        retLS->cmc_lsc_rg_bg_ratios = *baseLS->cmc_lsc_rg_bg_ratios;
+    }
+
+    cmc_parsed_optics_t* baseOptics = &base->cmc_parsed_optics;
+    cmc_parsed_optics_data* retOptics = &results->cmc_parsed_optics;
+    if (baseOptics->cmc_optomechanics) {
+        retOptics->cmc_optomechanics = *baseOptics->cmc_optomechanics;
+    }
+    if (baseOptics->lut_apertures) {
+        retOptics->lut_apertures = *baseOptics->lut_apertures;
+    }
+
+    cmc_parsed_color_matrices_t* baseCM = &base->cmc_parsed_color_matrices;
+    cmc_parsed_color_matrices_data* retCM = &results->cmc_parsed_color_matrices;
+    if (baseCM->cmc_color_matrices) {
+        retCM->cmc_color_matrices = *baseCM->cmc_color_matrices;
+    }
+    if (baseCM->cmc_color_matrix) {
+        // fix asan issue:base->cmc_parsed_color_matrices.cmc_color_matrix is not 4 aligned
+        // use memcpy instead of *
+        MEMCPY_S(&retCM->cmc_color_matrix, sizeof(retCM->cmc_color_matrix),
+                 baseCM->cmc_color_matrix, sizeof(cmc_color_matrix_t));
+    }
+    if (baseCM->ccm_estimate_method) {
+        retCM->ccm_estimate_method = *baseCM->ccm_estimate_method;
+    }
+
+    cmc_parsed_analog_gain_conversion_t* baseAGC = &base->cmc_parsed_analog_gain_conversion;
+    cmc_parsed_analog_gain_conversion_data* retAGC = &results->cmc_parsed_analog_gain_conversion;
+    if (baseAGC->cmc_analog_gain_conversion) {
+        retAGC->cmc_analog_gain_conversion = *baseAGC->cmc_analog_gain_conversion;
+
+        CheckError(baseAGC->cmc_analog_gain_conversion->num_segments > MAX_NUM_SEGMENTS,
+                   false, "@%s, num_segments:%d is too big", __func__,
+                   baseAGC->cmc_analog_gain_conversion->num_segments);
+        CheckError(baseAGC->cmc_analog_gain_conversion->num_pairs > MAX_NUM_ANALOG_PAIRS,
+                   false, "@%s, num_pairs:%d is too big", __func__,
+                   baseAGC->cmc_analog_gain_conversion->num_pairs);
+
+        if (baseAGC->cmc_analog_gain_segments) {
+            MEMCPY_S(retAGC->cmc_analog_gain_segments, sizeof(retAGC->cmc_analog_gain_segments),
+                     baseAGC->cmc_analog_gain_segments,
+                     (sizeof(*baseAGC->cmc_analog_gain_segments)
+                     * baseAGC->cmc_analog_gain_conversion->num_segments));
+        }
+        if (baseAGC->cmc_analog_gain_pairs) {
+            MEMCPY_S(retAGC->cmc_analog_gain_pairs, sizeof(retAGC->cmc_analog_gain_pairs),
+                     baseAGC->cmc_analog_gain_pairs,
+                     (sizeof(*baseAGC->cmc_analog_gain_pairs)
+                     * baseAGC->cmc_analog_gain_conversion->num_pairs));
+        }
+    }
+
+    return true;
+}
+
+bool IPCIntelCmc::unflattenCmcData(ia_cmc_data* results) {
+    LOGIPC("@%s", __func__);
+    CheckError(!results, false, "%s, results is nullptr", __func__);
+
+    ia_cmc_t* base = &results->base;
+
+    if (base->cmc_general_data) {
+        base->cmc_general_data = &results->cmc_general_data;
+    }
+
+    cmc_parsed_black_level_t* baseBL = &base->cmc_parsed_black_level;
+    cmc_parsed_black_level_data* retBL = &results->cmc_parsed_black_level;
+    if (baseBL->cmc_black_level) {
+        baseBL->cmc_black_level = &retBL->cmc_black_level;
+    }
+    if (baseBL->cmc_black_level_luts) {
+        baseBL->cmc_black_level_luts = &retBL->cmc_black_level_luts;
+    }
+
+    if (base->cmc_saturation_level) {
+        base->cmc_saturation_level = &results->cmc_saturation_level;
+    }
+
+    if (base->cmc_sensitivity) {
+        base->cmc_sensitivity = &results->cmc_sensitivity;
+    }
+
+    cmc_parsed_lens_shading_t* baseLS = &base->cmc_parsed_lens_shading;
+    cmc_parsed_lens_shading_data* retLS = &results->cmc_parsed_lens_shading;
+    if (baseLS->cmc_lens_shading) {
+        baseLS->cmc_lens_shading = &retLS->cmc_lens_shading;
+    }
+    if (baseLS->cmc_lsc_grids) {
+        baseLS->cmc_lsc_grids = &retLS->cmc_lsc_grids;
+    }
+    if (baseLS->lsc_grids) {
+        baseLS->lsc_grids = &retLS->lsc_grids;
+    }
+    if (baseLS->cmc_lsc_rg_bg_ratios) {
+        baseLS->cmc_lsc_rg_bg_ratios = &retLS->cmc_lsc_rg_bg_ratios;
+    }
+
+    cmc_parsed_optics_t* baseOptics = &base->cmc_parsed_optics;
+    cmc_parsed_optics_data* retOptics = &results->cmc_parsed_optics;
+    if (baseOptics->cmc_optomechanics) {
+        baseOptics->cmc_optomechanics = &retOptics->cmc_optomechanics;
+    }
+    if (baseOptics->lut_apertures) {
+        baseOptics->lut_apertures = &retOptics->lut_apertures;
+    }
+
+    cmc_parsed_color_matrices_t* baseCM = &base->cmc_parsed_color_matrices;
+    cmc_parsed_color_matrices_data* retCM = &results->cmc_parsed_color_matrices;
+    if (baseCM->cmc_color_matrices) {
+        baseCM->cmc_color_matrices = &retCM->cmc_color_matrices;
+    }
+    if (baseCM->cmc_color_matrix) {
+        baseCM->cmc_color_matrix = &retCM->cmc_color_matrix;
+    }
+    if (baseCM->ccm_estimate_method) {
+        baseCM->ccm_estimate_method = &retCM->ccm_estimate_method;
+    }
+
+    cmc_parsed_analog_gain_conversion_t* baseAGC = &base->cmc_parsed_analog_gain_conversion;
+    cmc_parsed_analog_gain_conversion_data* retAGC = &results->cmc_parsed_analog_gain_conversion;
+    if (baseAGC->cmc_analog_gain_conversion) {
+        baseAGC->cmc_analog_gain_conversion = &retAGC->cmc_analog_gain_conversion;
+
+        if (baseAGC->cmc_analog_gain_segments) {
+            baseAGC->cmc_analog_gain_segments = retAGC->cmc_analog_gain_segments;
+        }
+        if (baseAGC->cmc_analog_gain_pairs) {
+            baseAGC->cmc_analog_gain_pairs = retAGC->cmc_analog_gain_pairs;
+        }
+    }
+
+    return true;
+}
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.h
new file mode 100644
index 000000000000..bc57ca06c16b
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.h
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_types.h>
+#include <ia_cmc_types.h>
+
+#include "modules/sandboxing/IPCCommon.h"
+
+namespace icamera {
+typedef struct {
+    cmc_black_level_t cmc_black_level;
+    cmc_black_level_lut_t cmc_black_level_luts;
+} cmc_parsed_black_level_data;
+
+typedef struct {
+    cmc_lens_shading_t cmc_lens_shading;
+    cmc_lsc_grid_t cmc_lsc_grids;
+    uint16_t lsc_grids;
+    chromaticity_t cmc_lsc_rg_bg_ratios;
+} cmc_parsed_lens_shading_data;
+
+typedef struct {
+    cmc_optomechanics_t cmc_optomechanics;
+    uint16_t lut_apertures;
+} cmc_parsed_optics_data;
+
+typedef struct {
+    cmc_color_matrices_t cmc_color_matrices;
+    cmc_color_matrix_t cmc_color_matrix;
+    uint16_t ccm_estimate_method;
+} cmc_parsed_color_matrices_data;
+
+#define MAX_NUM_SEGMENTS 512
+#define MAX_NUM_ANALOG_PAIRS 1024
+typedef struct {
+    cmc_analog_gain_conversion_t cmc_analog_gain_conversion;
+    cmc_analog_gain_segment_t cmc_analog_gain_segments[MAX_NUM_SEGMENTS];
+    cmc_analog_gain_pair_t cmc_analog_gain_pairs[MAX_NUM_ANALOG_PAIRS];
+} cmc_parsed_analog_gain_conversion_data;
+
+struct ia_cmc_data {
+    ia_cmc_t base;
+
+    cmc_general_data_t cmc_general_data;
+    cmc_parsed_black_level_data cmc_parsed_black_level;
+    cmc_saturation_level_t cmc_saturation_level;
+    cmc_sensitivity_t cmc_sensitivity;
+    cmc_parsed_lens_shading_data cmc_parsed_lens_shading;
+    cmc_parsed_optics_data cmc_parsed_optics;
+    cmc_parsed_color_matrices_data cmc_parsed_color_matrices;
+    cmc_parsed_analog_gain_conversion_data cmc_parsed_analog_gain_conversion;
+
+    uintptr_t cmcRemoteHandle;  // it stores the remote cmc pointer.
+};
+
+struct cmc_init_params {
+    ia_binary_data_mod input;
+    ia_cmc_data results;
+};
+
+struct cmc_deinit_params {
+    uintptr_t cmc_handle;
+};
+
+class IPCIntelCmc {
+ public:
+    IPCIntelCmc();
+    virtual ~IPCIntelCmc();
+
+    // for init
+    bool clientFlattenInit(const ia_binary_data& aiqb, cmc_init_params* params);
+    bool clientUnflattenInit(const cmc_init_params& params,
+                             ia_cmc_t** cmc,
+                             uintptr_t* cmcRemoteHandle);
+    bool serverFlattenInit(const ia_cmc_t& cmc, cmc_init_params* params);
+    bool serverUnflattenInit(const cmc_init_params& pData, ia_binary_data* aiqb);
+
+    bool flattenCmcData(const ia_cmc_t* cmc, ia_cmc_data* results);
+    bool unflattenCmcData(ia_cmc_data* results);
+};
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.cpp
new file mode 100644
index 000000000000..aa86cb613fe9
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.cpp
@@ -0,0 +1,724 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IPC_INTEL_DVS"
+
+#include "modules/sandboxing/IPCIntelDvs.h"
+
+#include <ia_types.h>
+
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+#include "CameraLog.h"
+
+namespace icamera {
+IPCIntelDvs::IPCIntelDvs() {
+    LOGIPC("@%s", __func__);
+}
+
+IPCIntelDvs::~IPCIntelDvs() {
+    LOGIPC("@%s", __func__);
+}
+
+bool IPCIntelDvs::clientFlattenInit(void *pData, unsigned int size,
+                                    const ia_binary_data *dvsDataPtr, const ia_cmc_t *cmc) {
+    LOGIPC("@%s, pData:%p, size:%d, dvsDataPtr:%p, cmc:%p",
+           __func__, pData, size, dvsDataPtr, cmc);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(!dvsDataPtr, false, "@%s, dvsDataPtr is nullptr", __func__);
+    CheckError(!cmc, false, "@%s, cmc is nullptr", __func__);
+    CheckError(size < sizeof(DvsInitParams), false, "@%s, buffer is small", __func__);
+    CheckError(dvsDataPtr->size > MAX_DVS_DATA_SIZE, false,
+               "@%s, data:%d is too small", __func__, dvsDataPtr->size);
+
+    DvsInitParams *params = static_cast<DvsInitParams*>(pData);
+    params->base.size = dvsDataPtr->size;
+    params->base.data = params->data;
+    MEMCPY_S(params->data, MAX_DVS_DATA_SIZE, dvsDataPtr->data, dvsDataPtr->size);
+
+    params->cmcHandle = reinterpret_cast<uintptr_t>(cmc);
+    return true;
+}
+
+bool IPCIntelDvs::serverUnflattenInit(void *pData, int size,
+                                      ia_binary_data **dvsDataPtr, ia_cmc_t **cmc) {
+    LOGIPC("@%s, pData:%p, size:%d, dvsDataPtr:%p, cmc:%p",
+           __func__, pData, size, dvsDataPtr, cmc);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsInitParams), false, "@%s, buffer is small", __func__);
+    CheckError(!dvsDataPtr, false, "@%s, dvsDataPtr is nullptr", __func__);
+    CheckError(!cmc, false, "@%s, cmc is nullptr", __func__);
+
+    DvsInitParams *params = reinterpret_cast<DvsInitParams*>(pData);
+    params->base.data = params->data;
+
+    *dvsDataPtr = &params->base;
+    *cmc = reinterpret_cast<ia_cmc_t *>(params->cmcHandle);
+    return true;
+}
+
+bool IPCIntelDvs::serverFlattenInit(void *pData, unsigned int size, ia_dvs_state *dvs) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsInitParams), false, "@%s, buffer is small", __func__);
+
+    DvsInitParams *params = static_cast<DvsInitParams*>(pData);
+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
+    return true;
+}
+
+bool IPCIntelDvs::clientUnflattenInit(const void *pData, unsigned int size, ia_dvs_state **dvs) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsInitParams), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+
+    const DvsInitParams *params = static_cast<const DvsInitParams*>(pData);
+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
+
+    return true;
+}
+
+bool IPCIntelDvs::clientFlattenDeinit(void *pData, unsigned int size, ia_dvs_state *dvs) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsDeinitParams), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+
+    DvsDeinitParams* params = static_cast<DvsDeinitParams*>(pData);
+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
+
+    return true;
+}
+
+bool IPCIntelDvs::serverUnflattenDeinit(const void *pData, unsigned int size, ia_dvs_state **dvs) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsDeinitParams), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+
+    const DvsDeinitParams* params = static_cast<const DvsDeinitParams*>(pData);
+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
+
+    return true;
+}
+
+bool IPCIntelDvs::clientFlattenConfig(void *pData, unsigned int size, ia_dvs_state *dvs,
+                                      const ia_dvs_configuration *config, float zoomRatio) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, config:%p, zoomRatio:%f",
+           __func__, pData, size, dvs, config, zoomRatio);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsConfigParams), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+    CheckError(!config, false, "@%s, config is nullptr", __func__);
+
+    DvsConfigParams *params = static_cast<DvsConfigParams*>(pData);
+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
+    MEMCPY_S(&params->configData, sizeof(ia_dvs_configuration),
+             config, sizeof(ia_dvs_configuration));
+    params->zoomRatio = zoomRatio;
+
+    return true;
+}
+
+bool IPCIntelDvs::serverUnflattenConfig(const void *pData, unsigned int size, ia_dvs_state **dvs,
+                                        ia_dvs_configuration **config, float *zoomRatio) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, config:%p, zoomRatio:%f",
+           __func__, pData, size, dvs, config, zoomRatio);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsConfigParams), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+    CheckError(!config, false, "@%s, config is nullptr", __func__);
+    CheckError(!zoomRatio, false, "@%s, zoomRatio is nullptr", __func__);
+
+    DvsConfigParams *params =
+                       const_cast<DvsConfigParams*>(static_cast<const DvsConfigParams*>(pData));
+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
+    *config = &params->configData;
+    *zoomRatio = params->zoomRatio;
+
+    return true;
+}
+
+bool IPCIntelDvs::clientFlattenNoneBlanckRation(void *pData, unsigned int size,
+                                                ia_dvs_state *dvs, float nonBlankingRatio) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, nonBlankingRatio:%f",
+           __func__, pData, size, dvs, nonBlankingRatio);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsNoneBlankRatioParams), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+
+    DvsNoneBlankRatioParams *params = static_cast<DvsNoneBlankRatioParams*>(pData);
+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
+    params->nonBlankingRatio = nonBlankingRatio;
+
+    return true;
+}
+
+bool IPCIntelDvs::serverUnflattenNoneBlanckRation(const void *pData, unsigned int size,
+                                                  ia_dvs_state **dvs, float *nonBlankingRatio) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, nonBlankingRatio:%f",
+           __func__, pData, size, dvs, nonBlankingRatio);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsNoneBlankRatioParams), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+    CheckError(!nonBlankingRatio, false, "@%s, nonBlankingRatio is nullptr", __func__);
+
+    const DvsNoneBlankRatioParams *params = static_cast<const DvsNoneBlankRatioParams*>(pData);
+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
+    *nonBlankingRatio = params->nonBlankingRatio;
+
+    return true;
+}
+
+bool IPCIntelDvs::clientFlattenDigitalZoomMode(void *pData, unsigned int size,
+                                               ia_dvs_state *dvs, ia_dvs_zoom_mode zoomMode) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomMode:%d", __func__, pData, size, dvs, zoomMode);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsDigitalZoomMode), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+
+    DvsDigitalZoomMode *params = static_cast<DvsDigitalZoomMode*>(pData);
+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
+    params->zoomMode = zoomMode;
+
+    return true;
+}
+
+bool IPCIntelDvs::serverUnflattenDigitalZoomMode(const void *pData, unsigned int size,
+                                                 ia_dvs_state **dvs,
+                                                 ia_dvs_zoom_mode *zoomMode) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomMode:%d", __func__, pData, size, dvs, zoomMode);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsDigitalZoomMode), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+    CheckError(!zoomMode, false, "@%s, zoomMode is nullptr", __func__);
+
+    const DvsDigitalZoomMode *params = static_cast<const DvsDigitalZoomMode*>(pData);
+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
+    *zoomMode = params->zoomMode;
+
+    return true;
+}
+
+bool IPCIntelDvs::clientFlattenDigitalZoomRegion(void *pData, unsigned int size,
+                                                 ia_dvs_state *dvs, ia_rectangle *zoomRegion) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomRegion:%p",
+           __func__, pData, size, dvs, zoomRegion);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsDigitalZoomRegion), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+    CheckError(!zoomRegion, false, "@%s, zoomRegion is nullptr", __func__);
+
+    DvsDigitalZoomRegion *params = static_cast<DvsDigitalZoomRegion*>(pData);
+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
+    params->zoomRegion = *zoomRegion;
+
+    return true;
+}
+
+bool IPCIntelDvs::serverUnflattenDigitalZoomRegion(const void *pData, unsigned int size,
+                                                   ia_dvs_state **dvs,
+                                                   ia_rectangle **zoomRegion) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomRegion:%p",
+           __func__, pData, size, dvs, zoomRegion);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsDigitalZoomRegion), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+    CheckError(!zoomRegion, false, "@%s, zoomRegion is nullptr", __func__);
+
+    DvsDigitalZoomRegion *params =
+              const_cast<DvsDigitalZoomRegion*>(static_cast<const DvsDigitalZoomRegion*>(pData));
+    *dvs = reinterpret_cast<ia_dvs_state *>(params->dvsHandle);
+    *zoomRegion = &params->zoomRegion;
+    return true;
+}
+
+bool IPCIntelDvs::clientFlattenDigitalZoomCoordinate(void *pData, unsigned int size,
+                                                     ia_dvs_state *dvs,
+                                                     ia_coordinate *zoomCoordinate) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomCoordinate:%p",
+           __func__, pData, size, dvs, zoomCoordinate);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsDigitalZoomCoordinate), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+    CheckError(!zoomCoordinate, false, "@%s, zoomCoordinate is nullptr", __func__);
+
+    DvsDigitalZoomCoordinate *params = static_cast<DvsDigitalZoomCoordinate*>(pData);
+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
+    params->zoomCoordinate = *zoomCoordinate;
+
+    return true;
+}
+
+bool IPCIntelDvs::serverUnflattenDigitalZoomCoordinate(const void *pData, unsigned int size,
+                                                       ia_dvs_state **dvs,
+                                                       ia_coordinate **zoomCoordinate) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomCoordinate:%p",
+           __func__, pData, size, dvs, zoomCoordinate);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsDigitalZoomCoordinate), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+    CheckError(!zoomCoordinate, false, "@%s, zoomCoordinate is nullptr", __func__);
+
+    DvsDigitalZoomCoordinate *params =
+       const_cast<DvsDigitalZoomCoordinate*>(static_cast<const DvsDigitalZoomCoordinate*>(pData));
+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
+    *zoomCoordinate = &params->zoomCoordinate;
+
+    return true;
+}
+
+bool IPCIntelDvs::clientFlattenDigitalZoomMagnitude(void *pData, unsigned int size,
+                                                    ia_dvs_state *dvs, float zoomRatio) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomRatio:%f",
+           __func__, pData, size, dvs, zoomRatio);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsDigitalZoomMagnitude), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+
+    DvsDigitalZoomMagnitude *params = static_cast<DvsDigitalZoomMagnitude*>(pData);
+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
+    params->zoomRatio = zoomRatio;
+
+    return true;
+}
+
+bool IPCIntelDvs::serverUnflattenDigitalZoomMagnitude(const void *pData, unsigned int size,
+                                                      ia_dvs_state **dvs, float *zoomRatio) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomRatio:%f",
+           __func__, pData, size, dvs, zoomRatio);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsDigitalZoomMagnitude), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+    CheckError(!zoomRatio, false, "@%s, zoomRatio is nullptr", __func__);
+
+    const DvsDigitalZoomMagnitude *params = static_cast<const DvsDigitalZoomMagnitude*>(pData);
+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
+    *zoomRatio = params->zoomRatio;
+
+    return true;
+}
+
+bool IPCIntelDvs::clientFlattenFreeMorphTable(void *pData, unsigned int size,
+                                              ia_dvs_state *dvs,
+                                              ia_dvs_morph_table *morphTable) {
+    LOGIPC("@%s, pData:%p, size:%d, morphTable:%p", __func__, pData, size, morphTable);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsFreeMorphParams), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
+
+    DvsFreeMorphParams *params = static_cast<DvsFreeMorphParams*>(pData);
+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
+    params->morphHandle = reinterpret_cast<uintptr_t>(morphTable);
+
+    return true;
+}
+
+bool IPCIntelDvs::serverUnflattenFreeMorphTable(const void *pData, unsigned int size,
+                                                ia_dvs_state **dvs,
+                                                ia_dvs_morph_table **morphTable) {
+    LOGIPC("@%s, pData:%p, size:%d, morphTable:%p", __func__, pData, size, morphTable);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsFreeMorphParams), false, "@%s, buffer is small", __func__);
+    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
+
+    const DvsFreeMorphParams *params = static_cast<const DvsFreeMorphParams*>(pData);
+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
+    *morphTable = reinterpret_cast<ia_dvs_morph_table*>(params->morphHandle);
+
+    return true;
+}
+
+bool IPCIntelDvs::clientFlattenAllocateMorphTable(void *pData, unsigned int size,
+                                                  ia_dvs_state *dvs) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+
+    DvsMorphParams *params = static_cast<DvsMorphParams*>(pData);
+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
+
+    return true;
+}
+
+bool IPCIntelDvs::serverUnflattenAllocateMorphTalbe(const void *pData, unsigned int size,
+                                                    ia_dvs_state **dvs) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+
+    const DvsMorphParams *params = static_cast<const DvsMorphParams*>(pData);
+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
+
+    return true;
+}
+
+bool IPCIntelDvs::serverFlattenAllocateMorphTalbe(void *pData, unsigned int size,
+                                                  ia_dvs_morph_table *morphTable) {
+    LOGIPC("@%s, pData:%p, size:%d, morphRemote:%p", __func__, pData, size, morphTable);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
+    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
+
+    DvsMorphParams *params = static_cast<DvsMorphParams*>(pData);
+    params->morphHandle = reinterpret_cast<uintptr_t>(morphTable);
+
+    return true;
+}
+
+bool IPCIntelDvs::clientUnflattenAllocateMorphTalbe(const void *pData, unsigned int size,
+                                                    ia_dvs_morph_table **morphTable) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
+    CheckError(!morphTable, false, "@%s, morphLocal is nullptr", __func__);
+
+    const DvsMorphParams *params = static_cast<const DvsMorphParams*>(pData);
+    *morphTable = reinterpret_cast<ia_dvs_morph_table*>(params->morphHandle);
+    return true;
+}
+
+bool IPCIntelDvs::clientFlattenGetMorphTable(void *pData, unsigned int size,
+                                             ia_dvs_state *dvs,
+                                             ia_dvs_morph_table *morphTable) {
+    LOGIPC("@%s, pData:%p, size:%d, morphTable:%p", __func__, pData, size, morphTable);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
+
+    DvsMorphParams *params = static_cast<DvsMorphParams*>(pData);
+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
+    params->morphHandle = reinterpret_cast<uintptr_t>(morphTable);
+
+    return true;
+}
+
+bool IPCIntelDvs::serverUnflattenGetMorphTalbe(const void *pData, unsigned int size,
+                                               ia_dvs_state **dvs,
+                                               ia_dvs_morph_table **morphTable) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, morphTable:%p",
+           __func__, pData, size, dvs, morphTable);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
+
+    const DvsMorphParams *params = static_cast<const DvsMorphParams*>(pData);
+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
+    *morphTable = reinterpret_cast<ia_dvs_morph_table*>(params->morphHandle);
+
+    return true;
+}
+
+bool IPCIntelDvs::flattenMorphTable(const ia_dvs_morph_table *morphTable, DvsMorphParams *params) {
+    LOGIPC("@%s", __func__);
+    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+    CheckError(!morphTable->xcoords_y || !morphTable->ycoords_y,
+               false, "@%s, y coords is nullptr", __func__);
+    CheckError(!morphTable->xcoords_uv || !morphTable->ycoords_uv,
+               false, "@%s, uv coords is nullptr", __func__);
+    CheckError(!morphTable->xcoords_uv_float || !morphTable->ycoords_uv_float,
+               false, "@%s, uv coords float is nullptr", __func__);
+
+    unsigned int SizeY = morphTable->width_y * morphTable->height_y * sizeof(int32_t);
+    unsigned int SizeUV = morphTable->width_uv * morphTable->height_uv * sizeof(int32_t);
+    unsigned int SizeYLocal = MAX_DVS_COORDS_Y_SIZE * sizeof(int32_t);
+    unsigned int SizeUVLocal = MAX_DVS_COORDS_UV_SIZE * sizeof(int32_t);
+    CheckError(SizeY > SizeYLocal, false, "@%s, coords_y data is small", __func__);
+    CheckError(SizeUV > SizeUVLocal, false, "@%s, coords_uv data is small", __func__);
+    MEMCPY_S(params->xcoordsY, SizeYLocal, morphTable->xcoords_y, SizeY);
+    MEMCPY_S(params->ycoordsY, SizeYLocal, morphTable->ycoords_y, SizeY);
+    MEMCPY_S(params->xcoordsUV, SizeUVLocal, morphTable->xcoords_uv, SizeUV);
+    MEMCPY_S(params->ycoordsUV, SizeUVLocal, morphTable->ycoords_uv, SizeUV);
+
+    SizeUV = morphTable->width_uv * morphTable->height_uv * sizeof(float);
+    SizeUVLocal = MAX_DVS_COORDS_UV_SIZE * sizeof(float);
+    CheckError(SizeUV > SizeUVLocal, false,
+               "@%s, coords_uv data of float type is small", __func__);
+    MEMCPY_S(params->xcoordsUVFloat, SizeUVLocal, morphTable->xcoords_uv_float, SizeUV);
+    MEMCPY_S(params->ycoordsUVFloat, SizeUVLocal, morphTable->ycoords_uv_float, SizeUV);
+
+    return true;
+}
+
+bool IPCIntelDvs::serverFlattenGetMorphTalbe(void *pData, unsigned int size,
+                                             ia_dvs_morph_table *morphTable) {
+    LOGIPC("@%s, pData:%p, size:%d, morphTable:%p", __func__, pData, size, morphTable);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
+    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
+
+    DvsMorphParams *params = static_cast<DvsMorphParams*>(pData);
+    params->morphTable = *morphTable;
+
+    return flattenMorphTable(morphTable, params);
+}
+
+bool IPCIntelDvs::unflattenMorphTalbe(DvsMorphParams *params) {
+    LOGIPC("@%s", __func__);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    params->morphTable.xcoords_y = params->xcoordsY;
+    params->morphTable.ycoords_y = params->ycoordsY;
+    params->morphTable.xcoords_uv = params->xcoordsUV;
+    params->morphTable.ycoords_uv = params->ycoordsUV;
+    params->morphTable.xcoords_uv_float = params->xcoordsUVFloat;
+    params->morphTable.ycoords_uv_float = params->ycoordsUVFloat;
+
+    return true;
+}
+
+bool IPCIntelDvs::clientUnflattenGetMorphTalbe(void *pData, unsigned int size,
+                                               ia_dvs_morph_table **morphTable) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
+    CheckError(!morphTable, false, "@%s, morphLocal is nullptr", __func__);
+
+    DvsMorphParams *params = static_cast<DvsMorphParams*>(pData);
+    bool ret = unflattenMorphTalbe(params);
+    CheckError(!ret, false, "@%s, unflattenMorphTalbe fails", __func__);
+    *morphTable = &params->morphTable;
+
+    return true;
+}
+
+bool IPCIntelDvs::clientFlattenSetStatistics(void *pData, unsigned int size,
+                                             ia_dvs_state *dvs,
+                                             const ia_dvs_statistics *statistics,
+                                             const ia_aiq_ae_results *aeResults,
+                                             const ia_aiq_af_results *afResults,
+                                             const ia_aiq_sensor_events *sensorEvents,
+                                             uint64_t frameReadoutStart,
+                                             uint64_t frameReadoutEnd) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsStatistcs), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+
+    DvsStatistcs *params = static_cast<DvsStatistcs*>(pData);
+    CLEAR(*params);
+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
+
+    if (statistics) {
+        params->statisticsFlag = true;
+        CheckError(MV_ENTRIE_COUNT < statistics->vector_count,
+                   false, "statistics buffer is small");
+        params->statistics.vector_count = statistics->vector_count;
+        MEMCPY_S(params->motion_vectors,
+                 MV_ENTRIE_COUNT * sizeof(ia_dvs_motion_vector),
+                 statistics->motion_vectors,
+                 statistics->vector_count * sizeof(ia_dvs_motion_vector));
+    }
+
+    if (aeResults) {
+        params->aeResultsFlag = true;
+        int ret = mIpcAiq.flattenAeResults(*aeResults, &params->aeResultsBase);
+        CheckError(ret != OK, false, "failed to copy ae result");
+    }
+
+    if (afResults) {
+        params->afResultsFlag = true;
+        params->afResultsBase = *afResults;
+    }
+
+    if (sensorEvents) {
+        params->sensorEventsFlag = true;
+        size_t sensorDataLen = sizeof(ia_aiq_sensor_data);
+        size_t sensorEventLen = sensorDataLen * MAX_MOTION_SENSOR_COUNT_DVS;
+        CheckError(MAX_MOTION_SENSOR_COUNT_DVS < sensorEvents->num_accelerometer_events, false,
+                   "accelerometer_events buffer is small");
+        CheckError(MAX_MOTION_SENSOR_COUNT_DVS < sensorEvents->num_gravity_events, false,
+                   "gravity_events buffer is small");
+        CheckError(MAX_MOTION_SENSOR_COUNT_DVS < sensorEvents->num_gyroscope_events, false,
+                   "gyroscope_events buffer is small");
+        CheckError(MAX_MOTION_SENSOR_COUNT_DVS < sensorEvents->num_ambient_light_events, false,
+                   "ambient_light_events buffer is small");
+        CheckError(MAX_MOTION_SENSOR_COUNT_DVS < sensorEvents->num_dmd_events, false,
+                   "dmd_events buffer is small");
+        MEMCPY_S(params->sensorEvents.accelerometer_events, sensorEventLen,
+                 sensorEvents->accelerometer_events,
+                 sensorEvents->num_accelerometer_events * sensorDataLen);
+        MEMCPY_S(params->sensorEvents.gravity_events, sensorEventLen,
+                 sensorEvents->gravity_events, sensorEvents->num_gravity_events * sensorDataLen);
+        MEMCPY_S(params->sensorEvents.gyroscope_events, sensorEventLen,
+                 sensorEvents->gyroscope_events,
+                 sensorEvents->num_gyroscope_events * sensorDataLen);
+        MEMCPY_S(params->sensorEvents.ambient_light_events,
+                 sizeof(params->sensorEvents.ambient_light_events),
+                 sensorEvents->ambient_light_events,
+                 sensorEvents->num_ambient_light_events * sizeof(ia_aiq_ambient_light_events));
+        MEMCPY_S(params->sensorEvents.dmd_events, sizeof(params->sensorEvents.dmd_events),
+                 sensorEvents->dmd_events,
+                 sensorEvents->num_dmd_events * sizeof(ia_aiq_dmd_sensor_events));
+        params->sensorEventsBase = *sensorEvents;
+    }
+    params->frameReadoutStart = frameReadoutStart;
+    params->frameReadoutEnd = frameReadoutEnd;
+
+    return true;
+}
+
+bool IPCIntelDvs::serverUnflattenSetStatistics(void *pData, unsigned int size,
+                                               ia_dvs_state **dvs,
+                                               ia_dvs_statistics **statistics,
+                                               ia_aiq_ae_results **aeResults,
+                                               ia_aiq_af_results **afResults,
+                                               ia_aiq_sensor_events **sensorEvents,
+                                               uint64_t *frameReadoutStart,
+                                               uint64_t *frameReadoutEnd) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+
+    DvsStatistcs *params = static_cast<DvsStatistcs*>(pData);
+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
+
+    *statistics = nullptr;
+    if (params->statisticsFlag) {
+        params->statistics.motion_vectors = params->motion_vectors;
+        *statistics = &params->statistics;
+    }
+
+    *aeResults = nullptr;
+    if (params->aeResultsFlag) {
+        bool ret = mIpcAiq.unflattenAeResults(&params->aeResultsBase);
+        CheckError(!ret, false, "@%s, unflattenAeResults fails", __func__);
+        *aeResults = &params->aeResultsBase.base;
+    }
+
+    *afResults = nullptr;
+    if (params->afResultsFlag) {
+        *afResults = &params->afResultsBase;
+    }
+
+    *sensorEvents = nullptr;
+    if (params->sensorEventsFlag) {
+        if (params->sensorEventsBase.num_accelerometer_events != 0) {
+            params->sensorEventsBase.accelerometer_events =
+                                                     params->sensorEvents.accelerometer_events;
+        }
+        if (params->sensorEventsBase.num_gravity_events != 0) {
+            params->sensorEventsBase.gravity_events = params->sensorEvents.gravity_events;
+        }
+        if (params->sensorEventsBase.num_gyroscope_events != 0) {
+            params->sensorEventsBase.gyroscope_events = params->sensorEvents.gyroscope_events;
+        }
+        if (params->sensorEventsBase.num_ambient_light_events != 0) {
+            params->sensorEventsBase.ambient_light_events =
+                                                     params->sensorEvents.ambient_light_events;
+        }
+        if (params->sensorEventsBase.num_dmd_events != 0) {
+            params->sensorEventsBase.dmd_events = params->sensorEvents.dmd_events;
+        }
+        *sensorEvents = &params->sensorEventsBase;
+    }
+
+    *frameReadoutStart = params->frameReadoutStart;
+    *frameReadoutEnd = params->frameReadoutEnd;
+
+    return true;
+}
+
+bool IPCIntelDvs::clientFlattenExecute(void *pData, unsigned int size,
+                                       ia_dvs_state *dvs, uint16_t focusPosition) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, focusPosition:%d",
+           __func__, pData, size, dvs, focusPosition);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsExecute), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+
+    DvsExecute *params = static_cast<DvsExecute*>(pData);
+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
+    params->focusPosition = focusPosition;
+
+    return true;
+}
+
+bool IPCIntelDvs::serverUnflattenExecute(const void *pData, unsigned int size,
+                                         ia_dvs_state **dvs, uint16_t *focusPosition) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, focusPosition:%p",
+           __func__, pData, size, dvs, focusPosition);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsExecute), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+    CheckError(!focusPosition, false, "@%s, focusPosition is nullptr", __func__);
+
+    const DvsExecute *params = static_cast<const DvsExecute*>(pData);
+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
+    *focusPosition = params->focusPosition;
+
+    return true;
+}
+
+bool IPCIntelDvs::clientFlattenImageTransformation(void *pData, unsigned int size,
+                                                   ia_dvs_state *dvs) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsImageTransformation), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+
+    DvsImageTransformation *params = static_cast<DvsImageTransformation*>(pData);
+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
+
+    return true;
+}
+
+bool IPCIntelDvs::serverUnflattenImageTransformation(void *pData, unsigned int size,
+                                                    ia_dvs_state **dvs) {
+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsImageTransformation), false, "@%s, buffer is small", __func__);
+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
+
+    DvsImageTransformation *params = static_cast<DvsImageTransformation*>(pData);
+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
+
+    return true;
+}
+
+bool IPCIntelDvs::serverFlattenImageTransformation(void *pData, unsigned int size,
+                                            ia_dvs_image_transformation *imageTransformation) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsImageTransformation), false, "@%s, buffer is small", __func__);
+    CheckError(!imageTransformation, false, "@%s, imageTransformation is nullptr", __func__);
+
+    DvsImageTransformation *params = static_cast<DvsImageTransformation*>(pData);
+    params->imageTransformation = *imageTransformation;
+
+    return true;
+}
+
+bool IPCIntelDvs::clientUnflattenImageTransformation(const void *pData, unsigned int size,
+                                           ia_dvs_image_transformation **imageTransformation) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(DvsImageTransformation), false, "@%s, buffer is small", __func__);
+    CheckError(!imageTransformation, false, "@%s, imageTransformation is nullptr", __func__);
+
+    DvsImageTransformation *params =
+           const_cast<DvsImageTransformation*>(static_cast<const DvsImageTransformation*>(pData));
+    *imageTransformation = &params->imageTransformation;
+
+    return true;
+}
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.h
new file mode 100644
index 000000000000..cb1fa6309387
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.h
@@ -0,0 +1,247 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_dvs.h>
+#include <ia_dvs_types.h>
+#include <ia_isp_bxt.h>
+
+#include "modules/sandboxing/IPCCommon.h"
+#include "modules/sandboxing/IPCIntelAiq.h"
+#include "DvsResult.h"
+
+namespace icamera {
+#define MAX_DVS_DATA_SIZE MAX_IA_BINARY_DATA_SIZE
+
+struct DvsInitParams {
+    ia_binary_data base;
+    unsigned char data[MAX_DVS_DATA_SIZE];
+    uintptr_t cmcHandle;
+
+    // the below is returned
+    uintptr_t dvsHandle;
+};
+
+struct DvsDeinitParams {
+    uintptr_t dvsHandle;
+};
+
+struct DvsConfigParams {
+    uintptr_t dvsHandle;
+    ia_dvs_configuration configData;
+    float zoomRatio;
+};
+
+struct DvsNoneBlankRatioParams {
+    uintptr_t dvsHandle;
+    float nonBlankingRatio;
+};
+
+struct DvsDigitalZoomMode {
+    uintptr_t dvsHandle;
+    ia_dvs_zoom_mode zoomMode;
+};
+
+struct DvsDigitalZoomRegion {
+    uintptr_t dvsHandle;
+    ia_rectangle zoomRegion;
+};
+
+struct DvsDigitalZoomCoordinate {
+    uintptr_t dvsHandle;
+    ia_coordinate zoomCoordinate;
+};
+
+struct DvsDigitalZoomMagnitude {
+    uintptr_t dvsHandle;
+    float zoomRatio;
+};
+
+struct DvsFreeMorphParams {
+    uintptr_t dvsHandle;
+    uintptr_t morphHandle;
+};
+
+struct DvsMorphParams {
+    uintptr_t dvsHandle;
+    uintptr_t morphHandle;  // save remote morph table pointer
+
+    ia_dvs_morph_table morphTable;  // used by client
+    uint32_t xcoordsY[MAX_DVS_COORDS_Y_SIZE];
+    uint32_t ycoordsY[MAX_DVS_COORDS_Y_SIZE];
+    uint32_t xcoordsUV[MAX_DVS_COORDS_UV_SIZE];
+    uint32_t ycoordsUV[MAX_DVS_COORDS_UV_SIZE];
+    float xcoordsUVFloat[MAX_DVS_COORDS_UV_SIZE];
+    float ycoordsUVFloat[MAX_DVS_COORDS_UV_SIZE];
+};
+
+struct DvsExecute {
+    uintptr_t dvsHandle;
+    uint16_t focusPosition;
+};
+
+struct DvsImageTransformation {
+    uintptr_t dvsHandle;
+    ia_dvs_image_transformation imageTransformation;
+};
+
+#define MAX_MOTION_SENSOR_COUNT_DVS 100
+struct DvsSensorEvents {
+    ia_aiq_sensor_data accelerometer_events[MAX_MOTION_SENSOR_COUNT_DVS];
+    ia_aiq_sensor_data gravity_events[MAX_MOTION_SENSOR_COUNT_DVS];
+    ia_aiq_sensor_data gyroscope_events[MAX_MOTION_SENSOR_COUNT_DVS];
+    ia_aiq_ambient_light_events ambient_light_events[MAX_MOTION_SENSOR_COUNT_DVS];
+    ia_aiq_dmd_sensor_events dmd_events[MAX_MOTION_SENSOR_COUNT_DVS];
+};
+
+#define MV_ENTRIE_COUNT 5000
+struct DvsStatistcs {
+    uintptr_t dvsHandle;
+
+    bool statisticsFlag;
+    ia_dvs_statistics statistics;
+    ia_dvs_motion_vector motion_vectors[MV_ENTRIE_COUNT];
+
+    bool aeResultsFlag;
+    ae_run_params_results aeResultsBase;
+
+    bool afResultsFlag;
+    ia_aiq_af_results afResultsBase;
+
+    bool sensorEventsFlag;
+    ia_aiq_sensor_events sensorEventsBase;
+    DvsSensorEvents sensorEvents;
+
+    uint64_t frameReadoutStart;
+    uint64_t frameReadoutEnd;
+};
+
+class IPCIntelDvs {
+ public:
+    IPCIntelDvs();
+    ~IPCIntelDvs();
+
+    // for DvsInitParams
+    bool clientFlattenInit(void *pData, unsigned int size,
+                           const ia_binary_data *dvsDataPtr, const ia_cmc_t *cmc);
+    bool serverUnflattenInit(void *pData, int size,
+                             ia_binary_data **dvsDataPtr, ia_cmc_t **cmc);
+    bool serverFlattenInit(void *pData, unsigned int size, ia_dvs_state *dvs);
+    bool clientUnflattenInit(const void *pData, unsigned int size, ia_dvs_state **dvs);
+
+    // for DvsDeinitParams
+    bool clientFlattenDeinit(void *pData, unsigned int size, ia_dvs_state *dvs);
+    bool serverUnflattenDeinit(const void *pData, unsigned int size, ia_dvs_state **dvs);
+
+    // for DvsConfigParams
+    bool clientFlattenConfig(void *pData, unsigned int size, ia_dvs_state *dvs,
+                             const ia_dvs_configuration *config, float zoomRatio);
+    bool serverUnflattenConfig(const void *pData, unsigned int size, ia_dvs_state **dvs,
+                               ia_dvs_configuration **config, float *zoomRatio);
+
+    // for DvsNoneBlankRatioParams
+    bool clientFlattenNoneBlanckRation(void *pData, unsigned int size,
+                                       ia_dvs_state *dvs, float nonBlankingRatio);
+    bool serverUnflattenNoneBlanckRation(const void *pData, unsigned int size,
+                                         ia_dvs_state **dvs, float *nonBlankingRatio);
+
+    // for DvsDigitalZoomMode
+    bool clientFlattenDigitalZoomMode(void *pData, unsigned int size,
+                                      ia_dvs_state *dvs, ia_dvs_zoom_mode zoomMode);
+    bool serverUnflattenDigitalZoomMode(const void *pData, unsigned int size,
+                                        ia_dvs_state **dvs, ia_dvs_zoom_mode *zoomMode);
+
+    // for DvsDigitalZoomRegion
+    bool clientFlattenDigitalZoomRegion(void *pData, unsigned int size,
+                                        ia_dvs_state *dvs, ia_rectangle *zoomRegion);
+    bool serverUnflattenDigitalZoomRegion(const void *pData, unsigned int size,
+                                          ia_dvs_state **dvs, ia_rectangle **zoomRegion);
+
+    // for DvsDigitalZoomCoordinate
+    bool clientFlattenDigitalZoomCoordinate(void *pData, unsigned int size, ia_dvs_state *dvs,
+                                            ia_coordinate *zoomCoordinate);
+    bool serverUnflattenDigitalZoomCoordinate(const void *pData, unsigned int size,
+                                              ia_dvs_state **dvs,
+                                              ia_coordinate **zoomCoordinate);
+
+    // for DvsDigitalZoomMagnitude
+    bool clientFlattenDigitalZoomMagnitude(void *pData, unsigned int size,
+                                           ia_dvs_state *dvs, float zoomRatio);
+    bool serverUnflattenDigitalZoomMagnitude(const void *pData, unsigned int size,
+                                             ia_dvs_state **dvs, float *zoomRatio);
+
+    // for DvsFreeMorphParams
+    bool clientFlattenFreeMorphTable(void *pData, unsigned int size,
+                                     ia_dvs_state *dvs,
+                                     ia_dvs_morph_table *morphTable);
+    bool serverUnflattenFreeMorphTable(const void *pData, unsigned int size,
+                                       ia_dvs_state **dvs,
+                                       ia_dvs_morph_table **morphTable);
+
+    // for DvsMorphParams
+    bool clientFlattenAllocateMorphTable(void *pData, unsigned int size, ia_dvs_state *dvs);
+    bool serverUnflattenAllocateMorphTalbe(const void *pData,
+                                           unsigned int size, ia_dvs_state **dvs);
+    bool serverFlattenAllocateMorphTalbe(void *pData, unsigned int size,
+                                         ia_dvs_morph_table *morphTable);
+    bool clientUnflattenAllocateMorphTalbe(const void *pData, unsigned int size,
+                                           ia_dvs_morph_table **morphTable);
+    bool clientFlattenGetMorphTable(void *pData, unsigned int size,
+                                    ia_dvs_state *dvs, ia_dvs_morph_table *morphTable);
+    bool serverUnflattenGetMorphTalbe(const void *pData, unsigned int size,
+                                      ia_dvs_state **dvs, ia_dvs_morph_table **morphTable);
+    bool serverFlattenGetMorphTalbe(void *pData, unsigned int size,
+                                    ia_dvs_morph_table *morphTable);
+    bool clientUnflattenGetMorphTalbe(void *pData, unsigned int size,
+                                      ia_dvs_morph_table **morphTable);
+    bool unflattenMorphTalbe(DvsMorphParams *params);
+    bool flattenMorphTable(const ia_dvs_morph_table *morphTable, DvsMorphParams *params);
+
+    // for DvsStatistcs
+    bool clientFlattenSetStatistics(void *pData, unsigned int size, ia_dvs_state *dvs,
+                                    const ia_dvs_statistics *statistics,
+                                    const ia_aiq_ae_results *aeResults,
+                                    const ia_aiq_af_results *afResults,
+                                    const ia_aiq_sensor_events *sensorEvents,
+                                    uint64_t frameReadoutStart, uint64_t frameReadoutEnd);
+    bool serverUnflattenSetStatistics(void *pData, unsigned int size, ia_dvs_state **dvs,
+                                      ia_dvs_statistics **statistics,
+                                      ia_aiq_ae_results **aeResults,
+                                      ia_aiq_af_results **afResults,
+                                      ia_aiq_sensor_events **sensorEvents,
+                                      uint64_t *frameReadoutStart, uint64_t *frameReadoutEnd);
+
+    // for DvsExecute
+    bool clientFlattenExecute(void *pData, unsigned int size,
+                              ia_dvs_state *dvs, uint16_t focusPosition);
+    bool serverUnflattenExecute(const void *pData, unsigned int size,
+                                ia_dvs_state **dvs, uint16_t *focusPosition);
+
+    // for DvsImageTransformation
+    bool clientFlattenImageTransformation(void *pData, unsigned int size,
+                                          ia_dvs_state *dvs);
+    bool serverUnflattenImageTransformation(void *pData, unsigned int size,
+                                            ia_dvs_state **dvs);
+    bool serverFlattenImageTransformation(void *pData, unsigned int size,
+                                          ia_dvs_image_transformation *imageTransformation);
+    bool clientUnflattenImageTransformation(const void *pData, unsigned int size,
+                                            ia_dvs_image_transformation **imageTransformation);
+
+ private:
+    IPCIntelAiq mIpcAiq;
+};
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.cpp
new file mode 100644
index 000000000000..b9b9314d0cc2
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IPC_FACE_DETECTION"
+
+#include "modules/sandboxing/IPCIntelFD.h"
+
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+#include "CameraLog.h"
+
+namespace icamera {
+IPCIntelFD::IPCIntelFD() {
+    LOG1("@%s", __func__);
+}
+
+IPCIntelFD::~IPCIntelFD() {
+    LOG1("@%s", __func__);
+}
+
+bool IPCIntelFD::clientFlattenInit(unsigned int max_face_num, FaceDetectionInitParams *params) {
+    LOG1("@%s, params:%p", __func__, params);
+    CheckError(params == nullptr, false, "@%s, params is nullptr", __func__);
+
+    params->max_face_num = max_face_num;
+
+    return true;
+}
+
+bool IPCIntelFD::serverUnflattenRun(const FaceDetectionRunParams &inParams,
+                                    void *imageData, pvl_image *image) {
+    LOG1("@%s, image:%p", __func__, image);
+    CheckError(image == nullptr, false, "@%s, iamge is nullptr", __func__);
+
+    image->size = inParams.size;
+    image->width = inParams.width;
+    image->height = inParams.height;
+    image->format = inParams.format;
+    image->stride = inParams.stride;
+    image->rotation = inParams.rotation;
+
+    if (imageData) {
+        image->data = const_cast<uint8_t*>(static_cast<uint8_t*>(imageData));
+    } else {
+        image->data = const_cast<uint8_t*>(inParams.data);
+    }
+
+    return true;
+}
+}  /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.h
new file mode 100644
index 000000000000..b58f2139cbe4
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "modules/sandboxing/IPCCommon.h"
+#include "FaceBase.h"
+
+namespace icamera {
+class IPCIntelFD {
+ public:
+    IPCIntelFD();
+    virtual ~IPCIntelFD();
+
+    bool clientFlattenInit(unsigned int max_face_num, FaceDetectionInitParams *params);
+    bool serverUnflattenRun(const FaceDetectionRunParams &inParams,
+                            void *imageData, pvl_image *image);
+};
+}  /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.cpp
new file mode 100644
index 000000000000..b2981a4016cb
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.cpp
@@ -0,0 +1,298 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IPC_INTEL_LARD"
+
+#include "modules/sandboxing/IPCIntelLard.h"
+
+#include <ia_types.h>
+
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+#include "CameraLog.h"
+
+namespace icamera {
+IPCIntelLard::IPCIntelLard() {
+    LOGIPC("@%s", __func__);
+}
+
+IPCIntelLard::~IPCIntelLard() {
+    LOGIPC("@%s", __func__);
+}
+
+bool IPCIntelLard::clientFlattenInit(void* pData, unsigned int size,
+                                     const ia_binary_data* lard_data_ptr) {
+    LOGIPC("@%s, pData:%p, size:%d, lard_data_ptr:%p", __func__, pData, size, lard_data_ptr);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(lard_init_params), false, "@%s, buffer is small", __func__);
+    CheckError(!lard_data_ptr, false, "@%s, lard_data_ptr is nullptr", __func__);
+
+    lard_init_params *params = static_cast<lard_init_params*>(pData);
+    params->base = *lard_data_ptr;
+
+    CheckError(params->base.size > MAX_LARD_DATA_SIZE, false,
+               "@%s, data:%d is too small", __func__, params->base.size);
+    MEMCPY_S(params->data, MAX_LARD_DATA_SIZE, params->base.data, params->base.size);
+
+    return true;
+}
+
+bool IPCIntelLard::serverUnflattenInit(void* pData, int size, ia_binary_data* lard_data_ptr) {
+    LOGIPC("@%s, pData:%p, size:%d, binaryData:%p", __func__, pData, size, lard_data_ptr);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(lard_init_params), false, "@%s, buffer is small", __func__);
+    CheckError(!lard_data_ptr, false, "@%s, binaryData is nullptr", __func__);
+
+    lard_init_params* params = static_cast<lard_init_params*>(pData);
+    params->base.data = static_cast<void*>(params->data);
+    *lard_data_ptr = params->base;
+
+    return true;
+}
+
+bool IPCIntelLard::serverFlattenInit(void* pData, int size, ia_lard* lard) {
+    LOGIPC("@%s, pData:%p, size:%d, lard:%p", __func__, pData, size, lard);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(lard_init_params), false, "@%s, buffer is small", __func__);
+    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
+
+    lard_init_params* params = static_cast<lard_init_params*>(pData);
+
+    params->results = reinterpret_cast<uintptr_t>(lard);
+
+    return true;
+}
+
+bool IPCIntelLard::clientUnflattenInit(void* pData, unsigned int size, ia_lard** lard) {
+    LOGIPC("@%s, pData:%p, size:%d, lard:%p", __func__, pData, size, lard);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(lard_init_params), false, "@%s, buffer is small", __func__);
+    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
+
+    lard_init_params* params = static_cast<lard_init_params*>(pData);
+    *lard = reinterpret_cast<ia_lard*>(params->results);
+
+    return true;
+}
+
+bool IPCIntelLard::clientFlattenGetTagList(void* pData, unsigned int size,
+                                           ia_lard* lard, unsigned int mode_tag) {
+    LOGIPC("@%s, pData:%p, size:%d, lard:%p, mode_tag:%d", __func__, pData, size, lard, mode_tag);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(lard_get_tag_list_params), false, "@%s, buffer is small", __func__);
+    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
+
+    lard_get_tag_list_params* params = static_cast<lard_get_tag_list_params*>(pData);
+    params->lard = reinterpret_cast<uintptr_t>(lard);
+    params->mode_tag = mode_tag;
+
+    return true;
+}
+
+bool IPCIntelLard::serverUnflattenGetTagList(void* pData, unsigned int size,
+                                             ia_lard** lard, unsigned int* mode_tag) {
+    LOGIPC("@%s, pData:%p, size:%d, lard:%p, mode_tag:%p", __func__, pData, size, lard, mode_tag);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(lard_get_tag_list_params), false, "@%s, buffer is small", __func__);
+    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
+    CheckError(!mode_tag, false, "@%s, mode_tag is nullptr", __func__);
+
+    lard_get_tag_list_params* params = static_cast<lard_get_tag_list_params*>(pData);
+    *lard = reinterpret_cast<ia_lard*>(params->lard);
+    *mode_tag = params->mode_tag;
+
+    return true;
+}
+
+bool IPCIntelLard::serverFlattenGetTagList(void* pData, unsigned int size,
+                                           unsigned int num_tags, const unsigned int* tags) {
+    LOGIPC("@%s, pData:%p, size:%d, num_tags:%d, tags:%p", __func__, pData, size, num_tags, tags);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(lard_get_tag_list_params), false, "@%s, buffer is small", __func__);
+    CheckError(!tags, false, "@%s, tags is nullptr", __func__);
+
+    lard_get_tag_list_params* params = static_cast<lard_get_tag_list_params*>(pData);
+    int tagsSize = num_tags * sizeof(unsigned int);
+
+    CheckError(tagsSize > MAX_LARD_DATA_SIZE, false, "@%s, tags:%d is small", __func__, tagsSize);
+    switch (params->mode_tag) {
+        case LCMC_TAG:
+            params->num_cmc_tags = num_tags;
+            MEMCPY_S(params->cmc_tags_list, tagsSize, tags, tagsSize);
+            break;
+        case LAIQ_TAG:
+            params->num_aiq_tags = num_tags;
+            MEMCPY_S(params->aiq_tags_list, tagsSize, tags, tagsSize);
+            break;
+        case LISP_TAG:
+            params->num_isp_tags = num_tags;
+            MEMCPY_S(params->isp_tags_list, tagsSize, tags, tagsSize);
+            break;
+        case LTHR_TAG:
+            params->num_others_tags = num_tags;
+            MEMCPY_S(params->others_tags_list, tagsSize, tags, tagsSize);
+            break;
+        default:
+            return false;
+    }
+
+    return true;
+}
+
+bool IPCIntelLard::clientUnflattenGetTagList(void* pData, unsigned int size, unsigned int mode_tag,
+                                             unsigned int* num_tags, const unsigned int** tags) {
+    LOGIPC("@%s, pData:%p, size:%d, mode_tag:%d, num_tags:%p, tags:%p", __func__,
+          pData, size, mode_tag, num_tags, tags);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(lard_get_tag_list_params), false, "@%s, buffer is small", __func__);
+    CheckError(!num_tags, false, "@%s, num_tags is nullptr", __func__);
+    CheckError(!tags, false, "@%s, tags is nullptr", __func__);
+
+    lard_get_tag_list_params* params = static_cast<lard_get_tag_list_params*>(pData);
+
+    switch (mode_tag) {
+        case LCMC_TAG:
+            *num_tags = params->num_cmc_tags;
+            *tags = params->cmc_tags_list;
+            break;
+        case LAIQ_TAG:
+            *num_tags = params->num_aiq_tags;
+            *tags = params->aiq_tags_list;
+            break;
+        case LISP_TAG:
+            *num_tags = params->num_isp_tags;
+            *tags = params->isp_tags_list;
+            break;
+        case LTHR_TAG:
+            *num_tags = params->num_others_tags;
+            *tags = params->others_tags_list;
+            break;
+        default:
+            return false;
+    }
+
+    return true;
+}
+
+bool IPCIntelLard::clientFlattenRun(void* pData, unsigned int size,
+                                    ia_lard* lard, ia_lard_input_params* inputParams) {
+    LOGIPC("@%s, pData:%p, size:%d, lard:%p, inputParams:%p", __func__,
+          pData, size, lard, inputParams);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(lard_run_params), false, "@%s, buffer is small", __func__);
+    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
+    CheckError(!inputParams, false, "@%s, inputParams is nullptr", __func__);
+
+    lard_run_params* params = static_cast<lard_run_params*>(pData);
+    params->lard = reinterpret_cast<uintptr_t>(lard);
+    params->inputParams = *inputParams;
+
+    return true;
+}
+
+bool IPCIntelLard::serverUnflattenRun(void* pData, unsigned int size,
+                                      ia_lard** lard, ia_lard_input_params** inputParams) {
+    LOGIPC("@%s, pData:%p, size:%d, lard:%p, inputParams:%p", __func__,
+          pData, size, lard, inputParams);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(lard_run_params), false, "@%s, buffer is small", __func__);
+    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
+    CheckError(!inputParams, false, "@%s, inputParams is nullptr", __func__);
+
+    lard_run_params* params = static_cast<lard_run_params*>(pData);
+    *lard = reinterpret_cast<ia_lard*>(params->lard);
+    *inputParams = &params->inputParams;
+
+    return true;
+}
+
+bool IPCIntelLard::serverFlattenRun(void* pData, unsigned int size, ia_lard_results* result) {
+    LOGIPC("@%s, pData:%p, size:%d, result:%p", __func__, pData, size, result);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(lard_run_params), false, "@%s, buffer is small", __func__);
+    CheckError(!result, false, "@%s, result is nullptr", __func__);
+
+    lard_run_params* params = static_cast<lard_run_params*>(pData);
+
+    lard_run_params_results* results = &params->results;
+    ia_lard_results* base = &results->base;
+    *base = *result;
+
+    CheckError(base->aiqb_cmc_data.size > MAX_LARD_DATA_SIZE, false,
+               "@%s, cmc:%d is too big", __func__, base->aiqb_cmc_data.size);
+    CheckError(base->aiqb_aiq_data.size > MAX_LARD_DATA_SIZE, false,
+               "@%s, aiq:%d is too big", __func__, base->aiqb_aiq_data.size);
+    CheckError(base->aiqb_isp_data.size > MAX_LARD_DATA_SIZE, false,
+               "@%s, isp:%d is too big", __func__, base->aiqb_isp_data.size);
+    CheckError(base->aiqb_other_data.size > MAX_LARD_DATA_SIZE, false,
+               "@%s, other:%d is too big", __func__, base->aiqb_other_data.size);
+
+    MEMCPY_S(results->cmc_tags_list, MAX_LARD_DATA_SIZE,
+             base->aiqb_cmc_data.data, base->aiqb_cmc_data.size);
+    MEMCPY_S(results->aiq_tags_list, MAX_LARD_DATA_SIZE,
+             base->aiqb_aiq_data.data, base->aiqb_aiq_data.size);
+    MEMCPY_S(results->isp_tags_list, MAX_LARD_DATA_SIZE,
+             base->aiqb_isp_data.data, base->aiqb_isp_data.size);
+    MEMCPY_S(results->others_tags_list, MAX_LARD_DATA_SIZE,
+             base->aiqb_other_data.data, base->aiqb_other_data.size);
+
+    return true;
+}
+
+bool IPCIntelLard::clientUnflattenRun(void* pData, unsigned int size, ia_lard_results** result) {
+    LOGIPC("@%s, pData:%p, size:%d, result:%p", __func__, pData, size, result);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(lard_run_params), false, "@%s, buffer is small", __func__);
+    CheckError(!result, false, "@%s, result is nullptr", __func__);
+
+    lard_run_params* params = static_cast<lard_run_params*>(pData);
+    lard_run_params_results* results = &params->results;
+    ia_lard_results* base = &results->base;
+
+    base->aiqb_cmc_data.data = results->cmc_tags_list;
+    base->aiqb_aiq_data.data = results->aiq_tags_list;
+    base->aiqb_isp_data.data = results->isp_tags_list;
+    base->aiqb_other_data.data = results->others_tags_list;
+
+    *result = base;
+
+    return true;
+}
+
+bool IPCIntelLard::clientFlattenDeinit(void* pData, unsigned int size, ia_lard* lard) {
+    LOGIPC("@%s, pData:%p, size:%d, lard:%p", __func__, pData, size, lard);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(lard_deinit_params), false, "@%s, buffer is small", __func__);
+    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
+
+    lard_deinit_params* params = static_cast<lard_deinit_params*>(pData);
+    params->lard = reinterpret_cast<uintptr_t>(lard);
+
+    return true;
+}
+
+bool IPCIntelLard::serverUnflattenDeinit(void* pData, unsigned int size, ia_lard** lard) {
+    LOGIPC("@%s, pData:%p, size:%d, lard:%p", __func__, pData, size, lard);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(lard_deinit_params), false, "@%s, buffer is small", __func__);
+    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
+
+    lard_deinit_params* params = static_cast<lard_deinit_params*>(pData);
+    *lard = reinterpret_cast<ia_lard*>(params->lard);
+
+    return true;
+}
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.h
new file mode 100644
index 000000000000..00fe7adb44ef
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_lard.h>
+#include "modules/sandboxing/IPCCommon.h"
+
+namespace icamera {
+
+#define MAX_LARD_DATA_SIZE MAX_IA_BINARY_DATA_SIZE
+
+struct lard_init_params {
+    ia_binary_data base;
+    unsigned char data[MAX_LARD_DATA_SIZE];
+
+    // the below is returned
+    uintptr_t results;
+};
+
+struct lard_get_tag_list_params {
+    uintptr_t lard;
+    unsigned int mode_tag;
+
+    // the below is returned
+    unsigned int num_cmc_tags;
+    unsigned int num_aiq_tags;
+    unsigned int num_isp_tags;
+    unsigned int num_others_tags;
+    unsigned int cmc_tags_list[MAX_LARD_DATA_SIZE];
+    unsigned int aiq_tags_list[MAX_LARD_DATA_SIZE];
+    unsigned int isp_tags_list[MAX_LARD_DATA_SIZE];
+    unsigned int others_tags_list[MAX_LARD_DATA_SIZE];
+};
+
+struct lard_run_params_results {
+    ia_lard_results base;
+
+    unsigned int cmc_tags_list[MAX_LARD_DATA_SIZE];
+    unsigned int aiq_tags_list[MAX_LARD_DATA_SIZE];
+    unsigned int isp_tags_list[MAX_LARD_DATA_SIZE];
+    unsigned int others_tags_list[MAX_LARD_DATA_SIZE];
+};
+
+struct lard_run_params {
+    uintptr_t lard;
+    ia_lard_input_params inputParams;
+
+    // the below is returned
+    lard_run_params_results results;
+};
+
+struct lard_deinit_params {
+    uintptr_t lard;
+};
+
+class IPCIntelLard {
+ public:
+    IPCIntelLard();
+    virtual ~IPCIntelLard();
+
+    // for ia_lard_init
+    bool clientFlattenInit(void* pData, unsigned int size, const ia_binary_data* lard_data_ptr);
+    bool serverUnflattenInit(void* pData, int size, ia_binary_data* lard_data_ptr);
+    bool serverFlattenInit(void* pData, int size, ia_lard* lard);
+    bool clientUnflattenInit(void* pData, unsigned int size, ia_lard** lard);
+
+    // for ia_lard_get_tag_list
+    bool clientFlattenGetTagList(void* pData, unsigned int size,
+                                 ia_lard* lard, unsigned int mode_tag);
+    bool serverUnflattenGetTagList(void* pData, unsigned int size,
+                                   ia_lard** lard, unsigned int* mode_tag);
+    bool serverFlattenGetTagList(void* pData, unsigned int size,
+                                 unsigned int num_tags, const unsigned int* tags);
+    bool clientUnflattenGetTagList(void* pData, unsigned int size, unsigned int mode_tag,
+                                   unsigned int* num_tags, const unsigned int** tags);
+
+    // ia_lard_run
+    bool clientFlattenRun(void* pData, unsigned int size, ia_lard* lard,
+                          ia_lard_input_params* inputParams);
+    bool serverUnflattenRun(void* pData, unsigned int size,
+                            ia_lard** lard, ia_lard_input_params** inputParams);
+    bool serverFlattenRun(void* pData, unsigned int size, ia_lard_results* result);
+    bool clientUnflattenRun(void* pData, unsigned int size, ia_lard_results** result);
+
+    // ia_lard_deinit
+    bool clientFlattenDeinit(void* pData, unsigned int size, ia_lard* lard);
+    bool serverUnflattenDeinit(void* pData, unsigned int size, ia_lard** lard);
+};
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.cpp
new file mode 100644
index 000000000000..62fc07f316b7
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.cpp
@@ -0,0 +1,337 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IPC_INTEL_LTM"
+
+#include "modules/sandboxing/IPCIntelLtm.h"
+
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+IPCIntelLtm::IPCIntelLtm() {
+    LOGIPC("@%s", __func__);
+}
+
+IPCIntelLtm::~IPCIntelLtm() {
+    LOGIPC("@%s", __func__);
+}
+
+bool IPCIntelLtm::clientFlattenInit(const ia_binary_data &inData,
+                                    uintptr_t mkn_hanlde,
+                                    LtmInitParams *params) {
+    LOGIPC("@%s, params:%p", __func__, params);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    CheckError(sizeof(params->data) < inData.size, false, "@%s, buffer is small", __func__);
+    params->binary_data.data = params->data;
+    MEMCPY_S(params->data, sizeof(params->data), inData.data, inData.size);
+    params->binary_data.size = inData.size;
+    params->mkn_handle = mkn_hanlde;
+
+    return true;
+}
+
+bool IPCIntelLtm::serverUnflattenInit(LtmInitParams *params,
+                                      ia_binary_data *inData,
+                                      uintptr_t *mkn_hanlde) {
+    LOGIPC("@%s, params:%p", __func__, params);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+    CheckError(!inData , false, "@%s, inData is nullptr", __func__);
+    CheckError(!mkn_hanlde, false, "@%s, mkn_hanlde is nullptr", __func__);
+
+    params->binary_data.data = params->data;
+    *inData = params->binary_data;
+    *mkn_hanlde = params->mkn_handle;
+
+    return true;
+}
+
+bool IPCIntelLtm::serverFlattenInit(LtmInitParams *params, ia_ltm *ltm_handle) {
+    LOGIPC("@%s, params:%p", __func__, params);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+    CheckError(!ltm_handle, false, "@%s, ltm_handle is nullptr", __func__);
+
+    params->results = reinterpret_cast<uintptr_t>(ltm_handle);
+
+    return true;
+}
+
+bool IPCIntelLtm::clientUnflattenInit(LtmInitParams *params, ia_ltm **ltm_handle) {
+    LOGIPC("@%s, params:%p", __func__, params);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+    CheckError(!ltm_handle, false, "@%s, ltm_handle is nullptr", __func__);
+
+    *ltm_handle = reinterpret_cast<ia_ltm*> (params->results);
+    return true;
+}
+
+int IPCIntelLtm::deepCopyAeResults(const ia_aiq_ae_results &src, LtmInputAeResult *params) {
+    LOGIPC("@%s", __func__);
+
+    params->aeResultsBase = src;
+
+    if (src.exposures) {
+        CheckError(src.num_exposures > MAX_NUM_EXPOSURES_LTM,
+                   BAD_VALUE, "exposure buffer is small");
+        for (unsigned int i = 0; i < src.num_exposures; i++) {
+            params->exposures[i].exposure_index = src.exposures[i].exposure_index;
+            params->exposures[i].distance_from_convergence =
+                                                    src.exposures[i].distance_from_convergence;
+            params->exposures[i].converged = src.exposures[i].converged;
+            if (src.exposures[i].exposure) {
+                params->exposure[i] = *src.exposures[i].exposure;
+            }
+            if (src.exposures[i].sensor_exposure) {
+                params->sensor_exposure[i] = *src.exposures[i].sensor_exposure;
+            }
+            params->exposures[i].num_exposure_plan = src.exposures[i].num_exposure_plan;
+            if (src.exposures[i].exposure_plan_ids) {
+                CheckError(src.exposures[i].num_exposure_plan > MAX_NUM_OF_EXPOSURE_PLANS_LTM,
+                           BAD_VALUE, "exposures[%d].exposure_plan_ids buffer is small", i);
+                MEMCPY_S(params->exposure_plan_ids[i],
+                         MAX_NUM_OF_EXPOSURE_PLANS_LTM * sizeof(unsigned int),
+                         src.exposures[i].exposure_plan_ids,
+                         src.exposures[i].num_exposure_plan * sizeof(unsigned int));
+            }
+        }
+    }
+
+    if (src.weight_grid) {
+        params->weightGrid = *src.weight_grid;
+        unsigned int gridElements  = src.weight_grid->width * src.weight_grid->height;
+        CheckError(MAX_SIZE_WEIGHT_GRID_LTM < gridElements,
+                   false, "weight_grid buffer is small");
+        MEMCPY_S(params->weights, MAX_SIZE_WEIGHT_GRID_LTM * sizeof(char),
+                 src.weight_grid->weights, gridElements * sizeof(char));
+    }
+
+    if (src.flashes) {
+        CheckError(src.num_flashes > MAX_NUM_FLASHES_LTM, BAD_VALUE, "flash buffer is small");
+        MEMCPY_S(params->flashes, MAX_NUM_FLASHES_LTM * sizeof(ia_aiq_flash_parameters),
+                 src.flashes, src.num_flashes * sizeof(ia_aiq_flash_parameters));
+    }
+
+    if (src.aperture_control) {
+        params->apertureControl = *src.aperture_control;
+    }
+    return OK;
+}
+
+int IPCIntelLtm::deepCopyRgbsGridData(const ia_aiq_rgbs_grid &src, ia_aiq_rgbs_grid *dst) {
+    LOGIPC("%s", __func__);
+
+    CheckError(!src.blocks_ptr || src.grid_width == 0 || src.grid_height == 0,
+               BAD_VALUE, "Failed to deep copy Rgbs grid data - invalid source");
+    CheckError(!dst || !dst->blocks_ptr,
+               BAD_VALUE, "Failed to deep copy Rgbs grid data - invalid destination");
+
+    size_t gridSize = src.grid_width * src.grid_height;
+    size_t gridSizeLocal = MAX_WIDTH_STATISTICS * MAX_HEIGHT_STATISTICS;
+    CheckError(gridSizeLocal < gridSize, false, "rgbs_grid buffer is small");
+    dst->grid_width = src.grid_width;
+    dst->grid_height = src.grid_height;
+    dst->shading_correction = src.shading_correction;
+    MEMCPY_S(dst->blocks_ptr, gridSizeLocal * sizeof(rgbs_grid_block),
+             src.blocks_ptr, gridSize * sizeof(rgbs_grid_block));
+
+    LOGIPC("%s, grid size=[%dx%d]", __func__, dst->grid_width, dst->grid_height);
+    return OK;
+}
+
+int IPCIntelLtm::deepCopyHdrRgbsGridData(const ia_aiq_hdr_rgbs_grid &src,
+                                         ia_aiq_hdr_rgbs_grid *dst) {
+    LOGIPC("%s", __func__);
+
+    CheckError(!src.blocks_ptr || src.grid_width == 0 || src.grid_height == 0,
+               BAD_VALUE, "Failed to deep copy HDR Rgbs grid data - invalid source");
+    CheckError(!dst || !dst->blocks_ptr,
+               BAD_VALUE, "Failed to deep copy HDR Rgbs grid data - invalid destination");
+
+    size_t gridSize = src.grid_width * src.grid_height;
+    size_t gridSizeLocal = BXT_RGBS_GRID_MAX_WIDTH * BXT_RGBS_GRID_MAX_HEIGHT;
+    CheckError(gridSizeLocal < gridSize, false, "hdr_rgbs_grid buffer is small");
+
+    dst->grid_width = src.grid_width;
+    dst->grid_height = src.grid_height;
+    dst->grid_data_bit_depth = src.grid_data_bit_depth;
+    dst->shading_correction = src.shading_correction;
+    MEMCPY_S(dst->blocks_ptr, gridSizeLocal * sizeof(hdr_rgbs_grid_block),
+             src.blocks_ptr, gridSize * sizeof(hdr_rgbs_grid_block));
+
+    LOGIPC("%s, grid size=[%dx%d]", __func__, dst->grid_width, dst->grid_height);
+    return OK;
+}
+
+bool IPCIntelLtm::clientFlattenRun(uintptr_t ltm, const ia_ltm_input_params &ltmParams,
+                                   int imageDataSize, void *paramsAddr) {
+    LOGIPC("@%s, paramsAddr:%p", __func__, paramsAddr);
+    CheckError(!paramsAddr, false, "@%s, paramsAddr is nullptr", __func__);
+
+    LtmRunParams* params = static_cast<LtmRunParams*>(paramsAddr);
+    params->ltm_handle = ltm;
+    params->inputParamsBase = ltmParams;
+    LtmRunInputParams *inputParams = &params->inputParams;
+
+    int ret = UNKNOWN_ERROR;
+    if (ltmParams.ae_results) {
+        ret = deepCopyAeResults(*ltmParams.ae_results, &inputParams->aeResult);
+        CheckError(ret != OK, false, "@%s, Failed to deepCopyAeResult", __func__);
+    }
+
+    if (ltmParams.yv_grid) {
+        MEMCPY_S(&inputParams->yvGrid, sizeof(ia_isp_bxt_hdr_yv_grid_t),
+                 ltmParams.yv_grid, sizeof(ia_isp_bxt_hdr_yv_grid_t));
+    }
+
+    if (ltmParams.rgbs_grid_ptr) {
+        inputParams->rgbsGrid.rgbsGridbase.blocks_ptr = inputParams->rgbsGrid.blocks;
+        ret = deepCopyRgbsGridData(*ltmParams.rgbs_grid_ptr, &inputParams->rgbsGrid.rgbsGridbase);
+        CheckError(ret != OK, false, "@%s, Failed to deepCopyRgbsGridData", __func__);
+    }
+
+    if (ltmParams.hdr_rgbs_grid_ptr) {
+        inputParams->hdrRgbsGrid.hdrRgbsGridBase.blocks_ptr = inputParams->hdrRgbsGrid.blocks;
+        ret = deepCopyHdrRgbsGridData(*ltmParams.hdr_rgbs_grid_ptr,
+                                      &inputParams->hdrRgbsGrid.hdrRgbsGridBase);
+        CheckError(ret != OK, false, "@%s, Failed to deepCopyHdrRgbsGridData", __func__);
+    }
+
+    if (ltmParams.input_image_ptr) {
+        inputParams->inputImage = *ltmParams.input_image_ptr;
+        if (ltmParams.input_image_ptr->image_data) {
+            CheckError(imageDataSize < ltmParams.input_image_ptr->image_data->size,
+                        false, "image_data buffer is small");
+            CheckError(ltmParams.input_image_ptr->image_data->size != 0 &&
+                       !ltmParams.input_image_ptr->image_data->data, false, "image_data error");
+            inputParams->imageData = *ltmParams.input_image_ptr->image_data;
+            void *imageData =
+                     static_cast<void*>(static_cast<char*>(paramsAddr) + sizeof(LtmRunParams));
+            MEMCPY_S(imageData, imageDataSize,
+                     ltmParams.input_image_ptr->image_data->data,
+                     ltmParams.input_image_ptr->image_data->size);
+        }
+    }
+
+    if (ltmParams.gtm_input_params_ptr) {
+        MEMCPY_S(&inputParams->gtmInputParams, sizeof(ia_ltm_gtm_input_params),
+                 ltmParams.gtm_input_params_ptr, sizeof(ia_ltm_gtm_input_params));
+    }
+
+    return true;
+}
+
+bool IPCIntelLtm::serverUnflattenRun(void *pData, ia_ltm **ltm,
+                                     ia_ltm_input_params **inputParams) {
+    LOGIPC("@%s, pData:%p", __func__, pData);
+    CheckError(!pData, false, "@%s, params is nullptr", __func__);
+    CheckError(!ltm, false, "@%s, ltm is nullptr", __func__);
+    CheckError(!inputParams, false, "@%s, inputParams is nullptr", __func__);
+
+    LtmRunParams *params = static_cast<LtmRunParams*>(pData);
+    LtmRunInputParams *paramsTmp = &params->inputParams;
+    if (params->inputParamsBase.ae_results) {
+        LtmInputAeResult *aeResult = &paramsTmp->aeResult;
+        params->inputParamsBase.ae_results = &aeResult->aeResultsBase;
+        if (aeResult->aeResultsBase.exposures) {
+            aeResult->aeResultsBase.exposures = aeResult->exposures;
+            for (unsigned int i = 0; i < aeResult->aeResultsBase.num_exposures; i++) {
+                if (aeResult->exposures[i].exposure) {
+                    aeResult->exposures[i].exposure = &aeResult->exposure[i];
+                }
+                if (aeResult->exposures[i].sensor_exposure) {
+                    aeResult->exposures[i].sensor_exposure = &aeResult->sensor_exposure[i];
+                }
+                if (aeResult->exposures[i].exposure_plan_ids) {
+                    aeResult->exposures[i].exposure_plan_ids = aeResult->exposure_plan_ids[i];
+                }
+            }
+        }
+
+        if (aeResult->aeResultsBase.weight_grid) {
+            aeResult->aeResultsBase.weight_grid = &aeResult->weightGrid;
+            aeResult->weightGrid.weights = aeResult->weights;
+        }
+
+        if (aeResult->aeResultsBase.flashes) {
+            aeResult->aeResultsBase.flashes = aeResult->flashes;
+        }
+        if (aeResult->aeResultsBase.aperture_control) {
+            aeResult->aeResultsBase.aperture_control = &aeResult->apertureControl;
+        }
+    }
+
+    if (params->inputParamsBase.yv_grid) {
+        params->inputParamsBase.yv_grid = &paramsTmp->yvGrid;
+    }
+
+    if (params->inputParamsBase.rgbs_grid_ptr) {
+        paramsTmp->rgbsGrid.rgbsGridbase.blocks_ptr = paramsTmp->rgbsGrid.blocks;
+        params->inputParamsBase.rgbs_grid_ptr = &paramsTmp->rgbsGrid.rgbsGridbase;
+    }
+
+    if (params->inputParamsBase.hdr_rgbs_grid_ptr) {
+        paramsTmp->hdrRgbsGrid.hdrRgbsGridBase.blocks_ptr = paramsTmp->hdrRgbsGrid.blocks;
+        params->inputParamsBase.hdr_rgbs_grid_ptr = &paramsTmp->hdrRgbsGrid.hdrRgbsGridBase;
+    }
+
+    if (params->inputParamsBase.input_image_ptr) {
+        params->inputParamsBase.input_image_ptr = &paramsTmp->inputImage;
+        if (paramsTmp->inputImage.image_data) {
+            paramsTmp->inputImage.image_data = &paramsTmp->imageData;
+            if (paramsTmp->imageData.size != 0) {
+                const_cast<ia_binary_data *>(paramsTmp->inputImage.image_data)->data =
+                            static_cast<void*>(static_cast<char*>(pData) + sizeof(LtmRunParams));
+            }
+        }
+    }
+
+    if (params->inputParamsBase.gtm_input_params_ptr) {
+        params->inputParamsBase.gtm_input_params_ptr = &paramsTmp->gtmInputParams;
+    }
+
+    *ltm = reinterpret_cast<ia_ltm *>(params->ltm_handle);
+    *inputParams = &params->inputParamsBase;
+
+    return true;
+}
+
+bool IPCIntelLtm::serverFlattenRun(const ia_ltm_results &ltmResults,
+                                   const ia_ltm_drc_params &drcResults,
+                                   ia_ltm *ltm_handle, LtmRunParams *params) {
+    LOGIPC("@%s, params:%p", __func__, params);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    MEMCPY_S(&params->ltmResult, sizeof(ia_ltm_results), &ltmResults, sizeof(ia_ltm_results));
+    MEMCPY_S(&params->drcResult, sizeof(ia_ltm_drc_params),
+             &drcResults, sizeof(ia_ltm_results));
+
+    return true;
+}
+
+bool IPCIntelLtm::clientUnflattenRun(LtmRunParams *params,
+                                     ia_ltm_results **ltmResults,
+                                     ia_ltm_drc_params **drcResults) {
+    LOGIPC("@%s", __func__);
+    CheckError(!params, false, "@%s, params is nullptr", __func__);
+
+    *ltmResults = &params->ltmResult;
+    *drcResults = &params->drcResult;
+    return true;
+}
+
+}  /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.h
new file mode 100644
index 000000000000..8ba966e2048e
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.h
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_ltm.h>
+
+#include "IPCCommon.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+struct LtmInitParams {
+    ia_binary_data binary_data;
+    unsigned char data[MAX_IA_BINARY_DATA_SIZE];
+    uintptr_t mkn_handle;
+    uintptr_t results;
+};
+
+struct LtmDeinitParams {
+    uintptr_t ltm_handle;
+};
+
+#define MAX_NUM_EXPOSURES_LTM 10
+#define MAX_NUM_FLASHES_LTM 2
+#define MAX_NUM_OF_EXPOSURE_PLANS_LTM 4
+#define MAX_SIZE_WEIGHT_GRID_LTM 2048
+
+struct LtmInputAeResult {
+    ia_aiq_ae_results aeResultsBase;
+
+    ia_aiq_ae_exposure_result exposures[MAX_NUM_EXPOSURES_LTM];
+    ia_aiq_hist_weight_grid weightGrid;
+    ia_aiq_flash_parameters flashes[MAX_NUM_FLASHES_LTM];
+    ia_aiq_aperture_control apertureControl;
+
+    // the below is in ia_aiq_ae_exposure_result exposures[MAX_NUM_EXPOSURES];
+    ia_aiq_exposure_parameters exposure[MAX_NUM_EXPOSURES_LTM];
+    ia_aiq_exposure_sensor_parameters sensor_exposure[MAX_NUM_EXPOSURES_LTM];
+    unsigned int exposure_plan_ids[MAX_NUM_EXPOSURES_LTM][MAX_NUM_OF_EXPOSURE_PLANS_LTM];
+
+    // the below is in ia_aiq_hist_weight_grid weight_grid;
+    unsigned char weights[MAX_SIZE_WEIGHT_GRID_LTM];
+};
+
+#define MAX_WIDTH_STATISTICS 24
+#define MAX_HEIGHT_STATISTICS 16
+struct LtmInputRgbSGrid {
+    ia_aiq_rgbs_grid rgbsGridbase;
+    rgbs_grid_block blocks[MAX_WIDTH_STATISTICS * MAX_HEIGHT_STATISTICS];
+};
+
+#define BXT_RGBS_GRID_MAX_WIDTH 96
+#define BXT_RGBS_GRID_MAX_HEIGHT 72
+struct LtmInputHdrRgbsGrid {
+    ia_aiq_hdr_rgbs_grid hdrRgbsGridBase;
+    hdr_rgbs_grid_block blocks[BXT_RGBS_GRID_MAX_WIDTH * BXT_RGBS_GRID_MAX_HEIGHT];
+};
+
+struct LtmRunInputParams {
+    LtmInputAeResult aeResult;
+    ia_isp_bxt_hdr_yv_grid_t yvGrid;
+    LtmInputRgbSGrid rgbsGrid;
+    LtmInputHdrRgbsGrid hdrRgbsGrid;
+    ia_ltm_input_image inputImage;
+    ia_binary_data imageData;
+    ia_ltm_gtm_input_params gtmInputParams;
+};
+
+struct LtmRunParams {
+    uintptr_t ltm_handle;
+    ia_ltm_input_params inputParamsBase;
+    LtmRunInputParams inputParams;
+
+    ia_ltm_results ltmResult;
+    ia_ltm_drc_params drcResult;
+};
+
+class IPCIntelLtm {
+ public:
+    IPCIntelLtm();
+    virtual ~IPCIntelLtm();
+
+    // for init
+    bool clientFlattenInit(const ia_binary_data &inData,
+                           uintptr_t mkn_hanlde, LtmInitParams *params);
+    bool serverUnflattenInit(LtmInitParams *params,
+                             ia_binary_data *inData, uintptr_t *mkn_hanlde);
+    bool serverFlattenInit(LtmInitParams *params, ia_ltm *ltm_handle);
+    bool clientUnflattenInit(LtmInitParams *params, ia_ltm **ltm_handle);
+
+    // for run
+    bool clientFlattenRun(uintptr_t ltm, const ia_ltm_input_params &ltmParams,
+                          int imageDataSize, void *paramsAddr);
+    bool serverUnflattenRun(void *pData, ia_ltm **ltm, ia_ltm_input_params **inputParams);
+    bool serverFlattenRun(const ia_ltm_results &ltmResults, const ia_ltm_drc_params &drcResults,
+                          ia_ltm *ltm_handle, LtmRunParams *params);
+    bool clientUnflattenRun(LtmRunParams *params,
+                            ia_ltm_results **ltmResults, ia_ltm_drc_params **drcResults);
+
+ private:
+    int deepCopyAeResults(const ia_aiq_ae_results &src, LtmInputAeResult *params);
+    int deepCopyRgbsGridData(const ia_aiq_rgbs_grid &src, ia_aiq_rgbs_grid *dst);
+    int deepCopyHdrRgbsGridData(const ia_aiq_hdr_rgbs_grid &src, ia_aiq_hdr_rgbs_grid *dst);
+};
+}  /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.cpp
new file mode 100644
index 000000000000..1c880d5d5ea2
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.cpp
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IPC_INTEL_MKN"
+
+#include "modules/sandboxing/IPCIntelMkn.h"
+
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+IPCIntelMkn::IPCIntelMkn() {
+    LOGIPC("@%s", __func__);
+}
+
+IPCIntelMkn::~IPCIntelMkn() {
+    LOGIPC("@%s", __func__);
+}
+
+bool IPCIntelMkn::clientFlattenInit(ia_mkn_config_bits mkn_config_bits,
+                                    size_t mkn_section_1_size,
+                                    size_t mkn_section_2_size,
+                                    MknInitParams *params) {
+    LOGIPC("@%s, params:%p", __func__, params);
+    CheckError(params == nullptr, false, "@%s, params is nullptr", __func__);
+
+    params->mkn_config_bits = mkn_config_bits;
+    params->mkn_section_1_size = mkn_section_1_size;
+    params->mkn_section_2_size = mkn_section_2_size;
+
+    return true;
+}
+
+bool IPCIntelMkn::clientFlattenPrepare(uintptr_t mkn,
+                                       ia_mkn_trg data_target, MknPrepareParams *params) {
+    LOGIPC("@%s, params:%p", __func__, params);
+    CheckError(params == nullptr, false, "@%s, params is nullptr", __func__);
+
+    params->mkn_handle = mkn;
+    params->data_target = data_target;
+
+    return true;
+}
+
+bool IPCIntelMkn::clientUnflattenPrepare(MknPrepareParams *params, ia_binary_data *mknData) {
+    LOGIPC("@%s, mknData:%p", __func__, mknData);
+    CheckError(params == nullptr, false, "@%s, params is nullptr", __func__);
+    CheckError(mknData == nullptr, false, "@%s, mknData is nullptr", __func__);
+
+    params->results.data = static_cast<void *>(params->data);
+    *mknData = params->results;
+
+    LOGIPC("@%s, mknData.size:%d", __func__, mknData->size);
+
+    return true;
+}
+
+bool IPCIntelMkn::serverFlattenPrepare(const ia_binary_data &inData, MknPrepareParams *params) {
+    LOGIPC("@%s, params:%p", __func__, params);
+    CheckError(params == nullptr, false, "@%s, params is nullptr", __func__);
+    CheckError(sizeof(params->data) < inData.size, false, "@%s, buffer is small", __func__);
+
+    params->results.size = inData.size;
+    MEMCPY_S(params->data, sizeof(params->data), inData.data, inData.size);
+
+    return true;
+}
+}  /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.h
new file mode 100644
index 000000000000..e5aa119f0f1a
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_mkn_encoder.h>
+
+#include "IPCCommon.h"
+#include "iutils/Utils.h"
+
+struct MknInitParams {
+    ia_mkn_config_bits mkn_config_bits;
+    size_t mkn_section_1_size;
+    size_t mkn_section_2_size;
+    uintptr_t results;
+};
+
+struct MknPrepareParams {
+    uintptr_t mkn_handle;
+    ia_mkn_trg data_target;
+    ia_binary_data results;
+    char data[MAKERNOTE_SECTION1_SIZE + MAKERNOTE_SECTION2_SIZE];
+};
+
+struct MknDeinitParams {
+    uintptr_t mkn_handle;
+};
+
+struct MknEnableParams {
+    uintptr_t mkn_handle;
+    bool enable_data_collection;
+};
+
+namespace icamera {
+class IPCIntelMkn {
+ public:
+    IPCIntelMkn();
+    virtual ~IPCIntelMkn();
+
+    // for init
+    bool clientFlattenInit(ia_mkn_config_bits mkn_config_bits,
+                           size_t mkn_section_1_size,
+                           size_t mkn_section_2_size,
+                           MknInitParams* params);
+
+    // for prepare
+    bool clientFlattenPrepare(uintptr_t mkn, ia_mkn_trg data_target, MknPrepareParams *params);
+    bool clientUnflattenPrepare(MknPrepareParams *params, ia_binary_data *mknData);
+    bool serverFlattenPrepare(const ia_binary_data &inData, MknPrepareParams *results);
+};
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.cpp
new file mode 100644
index 000000000000..bf75977dba39
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.cpp
@@ -0,0 +1,478 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IPCIntelPGParam"
+
+#include "modules/sandboxing/IPCIntelPGParam.h"
+
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+
+bool IPCIntelPGParam::clientFlattenInit(void* pData, int dataSize,
+                                        int pgId, uintptr_t client, ia_p2p_platform_t platform,
+                                        const PgConfiguration& pgConfig) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_init_params), false, "@%s, dataSize is small", __func__);
+
+    pg_param_init_params *params = static_cast<pg_param_init_params*>(pData);
+    CheckError(pgConfig.pgManifestSize > sizeof(params->pgManifestData),
+               false, "@%s, manifest buffer is small", __func__);
+
+    params->pgId = pgId;
+    params->client = client;
+    params->platform = platform;
+
+    params->pgConfig.fragmentCount = pgConfig.fragmentCount;
+    params->pgConfig.inputMainFrame = pgConfig.inputMainFrame;
+    params->pgConfig.outputMainFrame = pgConfig.outputMainFrame;
+
+    params->pgConfig.pgManifestSize = pgConfig.pgManifestSize;
+    MEMCPY_S(params->pgManifestData, sizeof(params->pgManifestData),
+             pgConfig.pgManifest, pgConfig.pgManifestSize);
+
+    params->disableDataTermialsCount = pgConfig.disableDataTermials.size();
+    CheckError(params->disableDataTermialsCount > IPU_MAX_TERMINAL_COUNT, false,
+               "@%s, disableDataTermials is big", __func__);
+    memset(params->disableDataTermialsData, -1, sizeof(params->disableDataTermialsData));
+    for (int i = 0; i < params->disableDataTermialsCount; i++) {
+        params->disableDataTermialsData[i] = pgConfig.disableDataTermials[i];
+    }
+
+    return true;
+}
+
+bool IPCIntelPGParam::serverUnflattenInit(void* pData, int dataSize,
+                                          int* pgId, uintptr_t* client,
+                                          ia_p2p_platform_t* platform,
+                                          PgConfiguration* pgConfig) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_init_params), false, "@%s, buffer is small", __func__);
+    CheckError(!pgId || !client, false, "@%s, nullptr client", __func__);
+    CheckError(!platform || !pgConfig, false, "@%s, nullptr config", __func__);
+
+    pg_param_init_params *params = static_cast<pg_param_init_params*>(pData);
+    *pgId = params->pgId;
+    *client = params->client;
+    *platform = params->platform;
+
+    pgConfig->fragmentCount = params->pgConfig.fragmentCount;
+    pgConfig->inputMainFrame = params->pgConfig.inputMainFrame;
+    pgConfig->outputMainFrame = params->pgConfig.outputMainFrame;
+    pgConfig->pgManifestSize = params->pgConfig.pgManifestSize;
+    void* dataPtr = static_cast<void*>(params->pgManifestData);
+    pgConfig->pgManifest = static_cast<ia_css_program_group_manifest_t*>(dataPtr);
+
+    pgConfig->disableDataTermials.clear();
+    CheckError(params->disableDataTermialsCount > IPU_MAX_TERMINAL_COUNT, false,
+               "@%s, disableDataTermials is big", __func__);
+    for (int i = 0; i < params->disableDataTermialsCount; i++) {
+        pgConfig->disableDataTermials.push_back(params->disableDataTermialsData[i]);
+    }
+
+    return true;
+}
+
+bool IPCIntelPGParam::clientFlattenPrepare(void* pData, int dataSize, uintptr_t client,
+                                           unsigned int ipuParamSize, int32_t ipuParamHandle,
+                                           const ia_css_rbm_t* rbm) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_prepare_params), false, "@%s, buffer is small", __func__);
+
+    pg_param_prepare_params *params = static_cast<pg_param_prepare_params*>(pData);
+    params->client = client;
+    params->ipuParamSize = ipuParamSize;
+    params->ipuParamHandle = ipuParamHandle;
+
+    if (rbm) {
+        params->rbm = &params->rbmData;
+        MEMCPY_S(&params->rbmData, sizeof(params->rbmData), rbm, sizeof(*rbm));
+    } else {
+        params->rbm = nullptr;
+    }
+
+    return true;
+}
+
+bool IPCIntelPGParam::serverUnflattenPrepare(void* pData, int dataSize, uintptr_t* client,
+                                             void* palDataAddr, ia_binary_data* ipuParameters,
+                                             ia_css_rbm_t** rbm, ia_css_kernel_bitmap_t** bitmap) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_prepare_params), false, "@%s, buffer is small", __func__);
+    CheckError(!client, false, "@%s, nullptr client", __func__);
+    CheckError(!ipuParameters || !rbm || !bitmap, false, "@%s, nullptr outputs", __func__);
+    CheckError(!palDataAddr, false, "%s, palDataAddr is nullptr", __func__);
+
+    pg_param_prepare_params *params = static_cast<pg_param_prepare_params*>(pData);
+    *client = params->client;
+    ipuParameters->size = params->ipuParamSize;
+    ipuParameters->data = palDataAddr;
+    *rbm = params->rbm ? &params->rbmData : nullptr;
+    *bitmap = &params->bitmapData;
+    return true;
+}
+
+bool IPCIntelPGParam::clientUnflattenPrepare(const void* pData, int dataSize,
+                                             ia_css_kernel_bitmap_t* bitmap) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_prepare_params), false, "@%s, buffer is small", __func__);
+    CheckError(!bitmap, false, "@%s, bitmap is nullptr", __func__);
+
+    const pg_param_prepare_params *params = static_cast<const pg_param_prepare_params*>(pData);
+    MEMCPY_S(bitmap, sizeof(*bitmap), &params->bitmapData, sizeof(params->bitmapData));
+    return true;
+}
+
+int IPCIntelPGParam::getTotalPGBufferSize(int pgSize) {
+    int size = sizeof(pg_param_allocate_pg_params);
+    size += PAGE_ALIGN(pgSize);
+    return size;
+}
+
+bool IPCIntelPGParam::assignPGBuffer(void* pData, int dataSize, int pgSize, void** pgBuffer) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < pgSize, false, "@%s, buffer is small", __func__);
+    CheckError(!pgBuffer, false, "@%s, payloads is nullptr", __func__);
+
+    uintptr_t pgAddr = reinterpret_cast<uintptr_t>(pData);
+    CheckError(pgAddr & ((getpagesize() - 1)), false, "@%s, pg addr is not aligned", __func__);
+    *pgBuffer = pData;
+    return true;
+}
+
+bool IPCIntelPGParam::clientFlattenAllocatePGBuffer(void* pData, int dataSize,
+                                                    uintptr_t client, int pgSize) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    uintptr_t paramAddr = reinterpret_cast<uintptr_t>(pData) + dataSize
+                          - sizeof(pg_param_allocate_pg_params);
+    CheckError(paramAddr < reinterpret_cast<uintptr_t>(pData) + pgSize, false,
+               "@%s, dataSize is small", __func__);
+
+    pg_param_allocate_pg_params *params =
+        reinterpret_cast<pg_param_allocate_pg_params*>(paramAddr);
+    params->client = client;
+    params->pgSize = pgSize;
+
+    return true;
+}
+
+bool IPCIntelPGParam::serverUnflattenAllocatePGBuffer(const void* pData, int dataSize,
+                                                      uintptr_t* client, int* pgSize) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_allocate_pg_params), false,
+               "@%s, buffer is small", __func__);
+    CheckError(!client || !pgSize, false, "@%s, nullptr input", __func__);
+
+    uintptr_t paramAddr = reinterpret_cast<uintptr_t>(pData) + dataSize
+                          - sizeof(pg_param_allocate_pg_params);
+    pg_param_allocate_pg_params *params =
+        reinterpret_cast<pg_param_allocate_pg_params*>(paramAddr);
+    CheckError(paramAddr < reinterpret_cast<uintptr_t>(pData) + params->pgSize, false,
+               "@%s, dataSize is small", __func__);
+    *client = params->client;
+    *pgSize = params->pgSize;
+
+    return true;
+}
+
+bool IPCIntelPGParam::clientFlattenGetFragDescs(void* pData, int dataSize, uintptr_t client,
+                                                int descCount) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_get_fragment_desc_params), false,
+               "@%s, dataSize is small", __func__);
+
+    pg_param_get_fragment_desc_params *params =
+        static_cast<pg_param_get_fragment_desc_params*>(pData);
+    CheckError(descCount > sizeof(params->descsData), false, "@%s, descCount is big", __func__);
+
+    params->client = client;
+    params->descCount = descCount;
+    return true;
+}
+
+bool IPCIntelPGParam::serverUnflattenGetFragDescs(void* pData, int dataSize,
+                                                  uintptr_t* client,
+                                                  int* descCount, ia_p2p_fragment_desc** descs) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_get_fragment_desc_params), false,
+               "@%s, dataSize is small", __func__);
+    CheckError(!client, false, "@%s, nullptr client", __func__);
+    CheckError(!descCount || !descs, false, "@%s, nullptr outputs", __func__);
+
+    pg_param_get_fragment_desc_params *params =
+        static_cast<pg_param_get_fragment_desc_params*>(pData);
+    *client = params->client;
+    *descCount = params->descCount;
+    *descs = params->descsData;
+    return true;
+}
+
+bool IPCIntelPGParam::serverFlattenGetFragDescs(void* pData, int dataSize, int count) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_get_fragment_desc_params), false,
+               "@%s, dataSize is small", __func__);
+
+    pg_param_get_fragment_desc_params *params =
+        static_cast<pg_param_get_fragment_desc_params*>(pData);
+    params->returnCount = count;
+    return true;
+}
+
+bool IPCIntelPGParam::clientUnflattenGetFragDescs(const void* pData, int dataSize,
+                                                  int* count, ia_p2p_fragment_desc* descs) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_get_fragment_desc_params), false,
+               "@%s, dataSize is small", __func__);
+    CheckError(!count || !descs, false, "@%s, nullptr outputs", __func__);
+
+    const pg_param_get_fragment_desc_params *params =
+        static_cast<const pg_param_get_fragment_desc_params*>(pData);
+    *count = params->returnCount;
+    MEMCPY_S(descs, sizeof(ia_p2p_fragment_desc) * params->descCount,
+             params->descsData, sizeof(params->descsData));
+    return true;
+}
+
+bool IPCIntelPGParam::clientFlattenPrepareProgram(void* pData, int dataSize, uintptr_t client) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_prepare_program_params), false,
+               "@%s, dataSize is small", __func__);
+
+    pg_param_prepare_program_params *params = static_cast<pg_param_prepare_program_params*>(pData);
+    params->client = client;
+    return true;
+}
+
+bool IPCIntelPGParam::serverUnflattenPrepareProgram(const void* pData, int dataSize,
+                                                    uintptr_t* client) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_prepare_program_params), false,
+               "@%s, dataSize is small", __func__);
+    CheckError(!client, false, "@%s, nullptr client", __func__);
+
+    const pg_param_prepare_program_params *params =
+                          static_cast<const pg_param_prepare_program_params*>(pData);
+    *client = params->client;
+    return true;
+}
+
+bool IPCIntelPGParam::serverFlattenPrepareProgram(void* pData, int dataSize,
+                                                  int payloadCount,
+                                                  const ia_binary_data* payloads) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_prepare_program_params), false,
+               "@%s, dataSize is small", __func__);
+    CheckError(payloadCount > IPU_MAX_TERMINAL_COUNT, false, "@%s, payloadCount is big", __func__);
+    CheckError(!payloads, false, "@%s, payloads is nullptr", __func__);
+
+    pg_param_prepare_program_params *params = static_cast<pg_param_prepare_program_params*>(pData);
+    params->payloadCount = payloadCount;
+    MEMCPY_S(params->payloads, sizeof(ia_binary_data) * payloadCount,
+             payloads, sizeof(ia_binary_data) * payloadCount);
+    return true;
+}
+
+bool IPCIntelPGParam::clientUnflattenPrepareProgram(const void* pData, int dataSize,
+                                                    int* payloadCount, ia_binary_data* payloads) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_prepare_program_params), false,
+               "@%s, dataSize is small", __func__);
+    CheckError(!payloads, false, "@%s, payloads is nullptr", __func__);
+
+    const pg_param_prepare_program_params *params =
+                                static_cast<const pg_param_prepare_program_params*>(pData);
+
+    CheckError(*payloadCount < params->payloadCount, false,
+               "@%s, payloadCount is small", __func__);
+    *payloadCount = params->payloadCount;
+    for (int i = 0; i < params->payloadCount; i++) {
+        payloads[i].size = params->payloads[i].size;
+        payloads[i].data = nullptr;
+    }
+    return true;
+}
+
+int IPCIntelPGParam::getTotalPayloadSize(int payloadCount, const ia_binary_data* payloads) {
+    CheckError(!payloads, 0, "@%s, payloads is nullptr", __func__);
+    int size = sizeof(pg_param_allocate_payloads_params);
+    for (int i = 0; i < payloadCount; i++) {
+        if (payloads[i].size) {
+            size += PAGE_ALIGN(payloads[i].size);
+        }
+    }
+    return size;
+}
+
+bool IPCIntelPGParam::assignPayloads(void* pData, int dataSize,
+                                     int payloadCount, ia_binary_data* payloads) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(!payloads, false, "@%s, payloads is nullptr", __func__);
+
+    uintptr_t payloadAddr = reinterpret_cast<uintptr_t>(pData);
+    CheckError(payloadAddr & ((getpagesize() - 1)), false,
+               "@%s, payload addr is not aligned", __func__);
+    for (int i = 0; i < payloadCount; i++) {
+        if (payloads[i].size > 0) {
+            CheckError(payloadAddr > reinterpret_cast<uintptr_t>(pData) + dataSize, false,
+                       "@%s, buffer is small", __func__);
+            payloads[i].data = reinterpret_cast<void*>(payloadAddr);
+            payloadAddr += PAGE_ALIGN(payloads[i].size);
+        }
+    }
+    return true;
+}
+
+bool IPCIntelPGParam::clientFlattenAllocatePayloads(void* pData, int dataSize,
+                                                    uintptr_t client, int payloadCount,
+                                                    const ia_binary_data* payloads) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_allocate_payloads_params), false,
+               "@%s, dataSize is small", __func__);
+    CheckError(!payloads, false, "@%s, payloads is nullptr", __func__);
+
+    uintptr_t paramAddr = reinterpret_cast<uintptr_t>(pData) + dataSize
+                          - sizeof(pg_param_allocate_payloads_params);
+    pg_param_allocate_payloads_params *params =
+        reinterpret_cast<pg_param_allocate_payloads_params*>(paramAddr);
+    params->client = client;
+    params->payloadCount = payloadCount;
+    for (int i = 0; i < payloadCount; i++) {
+        params->payloads[i].size = payloads[i].size;
+        params->payloads[i].data = payloads[i].data;
+        CheckError(reinterpret_cast<uintptr_t>(payloads[i].data) > paramAddr, false,
+                   "@%s, buffer is small", __func__);
+    }
+
+    return true;
+}
+
+bool IPCIntelPGParam::serverUnflattenAllocatePayloads(void* pData, int dataSize,
+                                                      uintptr_t* client, int* payloadCount,
+                                                      ia_binary_data** payloads) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_allocate_payloads_params), false,
+               "@%s, dataSize is small", __func__);
+    CheckError(!client, false, "@%s, nullptr client", __func__);
+    CheckError(!payloads, false, "@%s, payloads is nullptr", __func__);
+    CheckError(!payloadCount || !payloads, false, "@%s, nullptr outputs", __func__);
+
+    uintptr_t paramAddr = reinterpret_cast<uintptr_t>(pData) + dataSize
+                          - sizeof(pg_param_allocate_payloads_params);
+    pg_param_allocate_payloads_params *params =
+        reinterpret_cast<pg_param_allocate_payloads_params*>(paramAddr);
+    *client = params->client;
+    *payloadCount = params->payloadCount;
+    *payloads = params->payloads;  // Copy directly and ignore client pointers
+
+    return true;
+}
+
+bool IPCIntelPGParam::clientFlattenEncode(void* pData, int dataSize, uintptr_t client,
+                                          unsigned int ipuParamSize, int32_t ipuParamHandle) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_encode_params), false, "@%s, buffer is small", __func__);
+
+    pg_param_encode_params *params = static_cast<pg_param_encode_params*>(pData);
+    params->client = client;
+    params->ipuParamSize = ipuParamSize;
+    params->ipuParamHandle = ipuParamHandle;
+    return true;
+}
+
+bool IPCIntelPGParam::serverUnflattenEncode(void* pData, int dataSize, uintptr_t* client,
+                                            void* palDataAddr, ia_binary_data* ipuParameters) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_encode_params), false, "@%s, small dataSize", __func__);
+    CheckError(!client, false, "@%s, nullptr client", __func__);
+    CheckError(!ipuParameters, false, "@%s, nullptr output", __func__);
+    CheckError(!palDataAddr, false, "%s, palDataAddr is nullptr", __func__);
+
+    pg_param_encode_params *params = static_cast<pg_param_encode_params*>(pData);
+    *client = params->client;
+    ipuParameters->size = params->ipuParamSize;
+    ipuParameters->data = palDataAddr;
+    return true;
+}
+
+bool IPCIntelPGParam::clientFlattenDecode(void* pData, int dataSize, uintptr_t client) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_decode_params), false, "@%s, size is small", __func__);
+
+    pg_param_decode_params *params = static_cast<pg_param_decode_params*>(pData);
+    params->client = client;
+    return true;
+}
+
+bool IPCIntelPGParam::serverUnflattenDecode(const void* pData, int dataSize,
+                                            uintptr_t* client) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_decode_params), false, "@%s, size is small", __func__);
+    CheckError(!client, false, "@%s, nullptr client", __func__);
+
+    const pg_param_decode_params *params = static_cast<const pg_param_decode_params*>(pData);
+    *client = params->client;
+    return true;
+}
+
+bool IPCIntelPGParam::serverFlattenDecode(void* pData, int dataSize,
+                                          const ia_binary_data& statistics) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_decode_params), false, "@%s, size is small", __func__);
+
+    pg_param_decode_params *params = static_cast<pg_param_decode_params*>(pData);
+    params->statistics.size = statistics.size;
+    params->statistics.data = params->statisticsData;
+    MEMCPY_S(params->statisticsData, sizeof(params->statisticsData),
+             statistics.data, statistics.size);
+    return true;
+}
+
+bool IPCIntelPGParam::clientUnflattenDecode(void* pData, int dataSize,
+                                            ia_binary_data* statistics) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_decode_params), false, "@%s, size is small", __func__);
+    CheckError(!statistics, false, "@%s, statistics is nullptr", __func__);
+
+    pg_param_decode_params *params = static_cast<pg_param_decode_params*>(pData);
+    statistics->size = params->statistics.size;
+    statistics->data = params->statisticsData;
+    return true;
+}
+
+bool IPCIntelPGParam::clientFlattenDeinit(void* pData, int dataSize, uintptr_t client) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_deinit_params), false, "@%s, buffer is small", __func__);
+
+    pg_param_deinit_params *params = static_cast<pg_param_deinit_params*>(pData);
+    params->client = client;
+
+    return true;
+}
+
+bool IPCIntelPGParam::serverUnflattenDeinit(const void* pData, int dataSize, uintptr_t* client) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_deinit_params), false, "@%s, size is small", __func__);
+    CheckError(!client, false, "@%s, nullptr client", __func__);
+
+    const pg_param_deinit_params *params = static_cast<const pg_param_deinit_params*>(pData);
+    *client = params->client;
+
+    return true;
+}
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.h
new file mode 100644
index 000000000000..23cf71b5a017
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.h
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+
+#include "modules/sandboxing/IPCCommon.h"
+#include "src/core/psysprocessor/PGUtils.h"
+
+namespace icamera {
+
+#define MAX_PROCESS_GROUP_SIZE 8192
+#define MAX_PAL_SIZE           0x800000  // 8M
+#define MAX_STATISTICS_SIZE    MAX_IA_BINARY_DATA_SIZE
+
+struct pg_param_init_params {
+    int pgId;
+    uintptr_t client;
+    ia_p2p_platform_t platform;
+    PgConfiguration pgConfig;
+    unsigned char pgManifestData[MAX_PROCESS_GROUP_SIZE];
+    int disableDataTermialsData[IPU_MAX_TERMINAL_COUNT];
+    int disableDataTermialsCount;
+};
+
+struct pg_param_prepare_params {
+    uintptr_t client;
+    uint32_t ipuParamSize;
+    int32_t ipuParamHandle;
+    ia_css_rbm_t* rbm;
+    ia_css_rbm_t rbmData;
+
+    // Output
+    ia_css_kernel_bitmap_t bitmapData;
+};
+
+// Shared memory: pg + struct
+// as pg memory addr should be page size aligned
+struct pg_param_allocate_pg_params {
+    uintptr_t client;
+    int pgSize;
+};
+
+struct pg_param_get_fragment_desc_params {
+    uintptr_t client;
+    int descCount;
+
+    // Output
+    int returnCount;
+    ia_p2p_fragment_desc descsData[IPU_MAX_TERMINAL_COUNT * IA_P2P_MAX_FRAGMENTS];
+};
+
+struct pg_param_prepare_program_params {
+    uintptr_t client;
+
+    // Output
+    int payloadCount;
+    ia_binary_data payloads[IPU_MAX_TERMINAL_COUNT];  // save size of payloads
+};
+
+// Shared memory: payloads + struct
+// as payload memory addr should be page size aligned
+struct pg_param_allocate_payloads_params {
+    uintptr_t client;
+    int payloadCount;
+    ia_binary_data payloads[IPU_MAX_TERMINAL_COUNT];  // save size of payloads
+};
+
+struct pg_param_encode_params {
+    uintptr_t client;
+    uint32_t ipuParamSize;
+    int32_t ipuParamHandle;
+};
+
+struct pg_param_decode_params {
+    uintptr_t client;
+
+    // Output
+    ia_binary_data statistics;
+    unsigned char statisticsData[MAX_STATISTICS_SIZE];
+};
+
+struct pg_param_deinit_params {
+    uintptr_t client;
+};
+
+class IPCIntelPGParam {
+ public:
+    IPCIntelPGParam() {}
+    virtual ~IPCIntelPGParam() {}
+
+    bool clientFlattenInit(void* pData, int dataSize, int pgId, uintptr_t client,
+                            ia_p2p_platform_t platform, const PgConfiguration& pgConfig);
+    bool serverUnflattenInit(void* pData, int dataSize, int* pgId, uintptr_t* client,
+                             ia_p2p_platform_t* platform, PgConfiguration* pgConfig);
+
+    bool clientFlattenPrepare(void* pData, int dataSize, uintptr_t client,
+                              unsigned int ipuParamSize, int32_t ipuParamHandle,
+                              const ia_css_rbm_t* rbm);
+    bool serverUnflattenPrepare(void* pData, int dataSize, uintptr_t* client,
+                                void* palDataAddr, ia_binary_data* ipuParameters,
+                                ia_css_rbm_t** rbm, ia_css_kernel_bitmap_t** bitmap);
+    bool clientUnflattenPrepare(const void* pData, int dataSize, ia_css_kernel_bitmap_t* bitmap);
+
+    int getTotalPGBufferSize(int pgSize);
+    bool assignPGBuffer(void* pData, int dataSize, int pgSize, void** pgBuffer);
+    bool clientFlattenAllocatePGBuffer(void* pData, int dataSize, uintptr_t client, int pgSize);
+    bool serverUnflattenAllocatePGBuffer(const void* pData, int dataSize,
+                                         uintptr_t* client, int* pgSize);
+
+    bool clientFlattenGetFragDescs(void* pData, int dataSize, uintptr_t client, int descCount);
+    bool serverUnflattenGetFragDescs(void* pData, int dataSize, uintptr_t* client,
+                                     int* descCount, ia_p2p_fragment_desc** descs);
+    bool serverFlattenGetFragDescs(void* pData, int dataSize, int count);
+    bool clientUnflattenGetFragDescs(const void* pData, int dataSize,
+                                     int* count, ia_p2p_fragment_desc* descs);
+
+    bool clientFlattenPrepareProgram(void* pData, int dataSize, uintptr_t client);
+    bool serverUnflattenPrepareProgram(const void* pData, int dataSize, uintptr_t* client);
+    bool serverFlattenPrepareProgram(void* pData, int dataSize,
+                                     int payloadCount, const ia_binary_data* payloads);
+    bool clientUnflattenPrepareProgram(const void* pData, int dataSize,
+                                       int* payloadCount, ia_binary_data* payloads);
+
+    int getTotalPayloadSize(int payloadCount, const ia_binary_data* payloads);
+    bool assignPayloads(void* pData, int dataSize, int payloadCount, ia_binary_data* payloads);
+    bool clientFlattenAllocatePayloads(void* pData, int dataSize, uintptr_t client,
+                                       int payloadCount, const ia_binary_data* payloads);
+    bool serverUnflattenAllocatePayloads(void* pData, int dataSize, uintptr_t* client,
+                                         int* payloadCount, ia_binary_data** payloads);
+
+    bool clientFlattenEncode(void* pData, int dataSize, uintptr_t client,
+                             unsigned int ipuParamSize, int32_t ipuParamHandle);
+    bool serverUnflattenEncode(void* pData, int dataSize, uintptr_t* client,
+                               void* palDataAddr, ia_binary_data* ipuParameters);
+
+    bool clientFlattenDecode(void* pData, int dataSize, uintptr_t client);
+    bool serverUnflattenDecode(const void* pData, int dataSize, uintptr_t* client);
+    bool serverFlattenDecode(void* pData, int dataSize, const ia_binary_data& statistics);
+    bool clientUnflattenDecode(void* pData, int dataSize, ia_binary_data* statistics);
+
+    bool clientFlattenDeinit(void* pData, int dataSize, uintptr_t client);
+    bool serverUnflattenDeinit(const void* pData, int dataSize, uintptr_t* client);
+};
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.cpp
new file mode 100644
index 000000000000..b01d4a041b28
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.cpp
@@ -0,0 +1,558 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IPC_ISP_PARAM_ADAPTOR"
+
+#include "modules/sandboxing/IPCIspParamAdaptor.h"
+
+#include <memory>
+
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+IPCIspParamAdaptor::IPCIspParamAdaptor() {
+    LOGIPC("@%s", __func__);
+}
+
+IPCIspParamAdaptor::~IPCIspParamAdaptor() {
+    LOGIPC("@%s", __func__);
+}
+
+bool IPCIspParamAdaptor::clientFlattenInit(void *pData, uint32_t size,
+                                           const ia_binary_data *ispData, const ia_cmc_t *iaCmc,
+                                           uint32_t maxStatsWidth, uint32_t maxStatsHeight,
+                                           uint32_t maxNumStatsIn, ia_mkn *iaMkn) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData || !ispData || !iaCmc, false,
+               "@%s, pData, ispData or iaCmc is nullptr", __func__);
+    CheckError(size < sizeof(IspBxtInitParam), false, "@%s, buffer is small", __func__);
+    CheckError(ispData->size > MAX_IA_BINARY_DATA_SIZE,
+               false, "%s, the buffer of isp data is too small", __func__);
+
+    IspBxtInitParam *params = static_cast<IspBxtInitParam*>(pData);
+    params->iaIsp = *ispData;
+    if (params->iaIsp.data) {
+        MEMCPY_S(params->ispAiqbData, sizeof(params->ispAiqbData), ispData->data, ispData->size);
+    }
+
+    params->iaCmcHandle = reinterpret_cast<uintptr_t>(iaCmc);
+    params->maxStatsWidth = maxStatsWidth;
+    params->maxStatsHeight = maxStatsHeight;
+    params->maxStatsIn = maxNumStatsIn;
+    params->iaMkn = nullptr;  // Not used in current
+
+    return true;
+}
+
+bool IPCIspParamAdaptor::serverUnflattenInit(IspBxtInitParam *pData, uint32_t size,
+                                             ia_binary_data **Isp, ia_cmc_t **Cmc) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(IspBxtInitParam), false, "@%s, buffer is small", __func__);
+    CheckError(!Isp || !Cmc, false, "@%s, Isp or Cmc is nullptr", __func__);
+
+    if (pData->iaIsp.data) {
+        CheckError(pData->iaIsp.size > MAX_IA_BINARY_DATA_SIZE,
+                   false, "%s, the buffer of isp data is too small", __func__);
+        pData->iaIsp.data = pData->ispAiqbData;
+    }
+    *Isp = &pData->iaIsp;
+    *Cmc = reinterpret_cast<ia_cmc_t*>(pData->iaCmcHandle);
+
+    return true;
+}
+
+bool IPCIspParamAdaptor::clientFlattenDeInit(void *pData, uint32_t size,
+                                             const ia_isp_bxt *ispHandle) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(!ispHandle, false, "@%s, ispHandle is nullptr", __func__);
+    CheckError(size < sizeof(IspBxtDeInitParam), false, "@%s, buffer is small", __func__);
+
+    IspBxtDeInitParam *params = static_cast<IspBxtDeInitParam*>(pData);
+    params->ispRemoteHandle = reinterpret_cast<uintptr_t>(ispHandle);
+
+    return true;
+}
+
+bool IPCIspParamAdaptor::serverUnflattenDeInit(const void *pData, uint32_t size,
+                                               ia_isp_bxt **ispHandle) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(!ispHandle, false, "@%s, ispHandle is nullptr", __func__);
+    CheckError(size < sizeof(IspBxtDeInitParam), false, "@%s, buffer is small", __func__);
+
+    const IspBxtDeInitParam *params = static_cast<const IspBxtDeInitParam*>(pData);
+    *ispHandle = reinterpret_cast<ia_isp_bxt*>(params->ispRemoteHandle);
+
+    return true;
+}
+
+bool IPCIspParamAdaptor::clientFlattenGetPalSize(void *pData, uint32_t size,
+                                                 const ia_isp_bxt_program_group *programGroup) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(!programGroup, false, "@%s, programGroup is nullptr", __func__);
+    CheckError(size < sizeof(PalDataSizeParam), false, "@%s, buffer is small", __func__);
+
+    PalDataSizeParam *params = static_cast<PalDataSizeParam*>(pData);
+
+    bool ret = flattenProgramGroup(programGroup, &params->programGroup);
+    CheckError(ret == false, false, "%s, flattenProgramGroup fails", __func__);
+
+    return true;
+}
+
+bool IPCIspParamAdaptor::serverUnflattenGetPalSize(void *pData, uint32_t size,
+                                                   ia_isp_bxt_program_group **programGroup) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(!programGroup, false, "@%s, programGroup is nullptr", __func__);
+    CheckError(size < sizeof(PalDataSizeParam), false, "@%s, buffer is small", __func__);
+
+    PalDataSizeParam *params = static_cast<PalDataSizeParam*>(pData);
+
+    bool ret = unflattenProgramGroup(&params->programGroup);
+    CheckError(ret == false, false, "%s, unflattenProgramGroup fails", __func__);
+
+    *programGroup = &params->programGroup.group;
+
+    return true;
+}
+
+bool IPCIspParamAdaptor::clientFlattenConvertStats(void *pData, uint32_t size,
+                                                   const ia_isp_bxt *ispHandle,
+                                                   const ConvertInputParam *inputParams) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(!ispHandle || !inputParams, false,
+               "@%s, ispHandle or inputParams is nullptr", __func__);
+    CheckError(size < sizeof(ConvertStatsParam), false, "@%s, buffer is small", __func__);
+
+    ConvertStatsParam *params = static_cast<ConvertStatsParam*>(pData);
+    params->ispRemoteHandle = reinterpret_cast<uintptr_t>(ispHandle);
+    params->multiExpo = inputParams->multiExpo;
+
+    params->statsBuffer = *inputParams->statsBuffer;
+    if (params->statsBuffer.size > 0) {
+        CheckError(params->statsBuffer.size > MAX_IA_BINARY_DATA_SIZE,
+                   false, "%s, the buffer of stats is too small", __func__);
+        MEMCPY_S(params->statsData, MAX_IA_BINARY_DATA_SIZE,
+                 inputParams->statsBuffer->data, inputParams->statsBuffer->size);
+    }
+
+    bool ret = mIpcAiq.flattenAeResults(*inputParams->aeResults, &params->aeResults);
+    CheckError(ret == false, false, "%s, flattenAeResults fails", __func__);
+
+    params->dvsReso = *inputParams->dvsReso;
+
+    return true;
+}
+
+bool IPCIspParamAdaptor::serverUnflattenConvertStats(void *pData, uint32_t size,
+                                                     ia_isp_bxt **ispHandle,
+                                                     ConvertInputParam *inputParams,
+                                                     ConvertResult *result) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(!ispHandle || !inputParams || !result, false,
+               "@%s, ispHandle, inputParams or result is nullptr", __func__);
+    CheckError(size < sizeof(ConvertStatsParam), false, "@%s, buffer is small", __func__);
+
+    ConvertStatsParam *params = static_cast<ConvertStatsParam*>(pData);
+    *ispHandle = reinterpret_cast<ia_isp_bxt*>(params->ispRemoteHandle);
+    inputParams->multiExpo = params->multiExpo;
+
+    inputParams->statsBuffer = &params->statsBuffer;
+    if (params->statsBuffer.size > 0) {
+        params->statsBuffer.data = params->statsData;
+    }
+
+    inputParams->dvsReso = &params->dvsReso;
+    ae_run_params_results *res = &params->aeResults;
+
+    bool ret = mIpcAiq.unflattenAeResults(res);
+    CheckError(ret == false, false, "%s, unflattenAeResults fails", __func__);
+    inputParams->aeResults = &res->base;
+
+    CLEAR(params->queryResults);
+    result->queryResults = &params->queryResults;
+
+    return true;
+}
+
+bool IPCIspParamAdaptor::serverFlattenConvertStats(void *pData, uint32_t size,
+                                                   const ConvertResult &result) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(ConvertStatsParam), false, "@%s, buffer is small", __func__);
+
+    ConvertStatsParam *params = static_cast<ConvertStatsParam*>(pData);
+    // the queryResults uses SHM
+
+    // flatten rgbs grid
+    CLEAR(params->rgbsGridArray);
+    for (int i = 0; i < MAX_NUM_EXPOSURES; ++i) {
+        ia_aiq_rgbs_grid *rgbs = result.rgbsGrid[i];
+        if (rgbs) {
+            params->rgbsGrid[i].base = *rgbs;
+            size_t rgbsSize = rgbs->grid_width * rgbs->grid_height * sizeof(rgbs_grid_block);
+            size_t memSize = sizeof(params->rgbsGrid[i].blocks_ptr);
+            CheckError(memSize < rgbsSize, false, "%s, memory for rgbs is too small", __func__);
+            MEMCPY_S(params->rgbsGrid[i].blocks_ptr, memSize, rgbs->blocks_ptr, rgbsSize);
+            params->rgbsGridArray[i] = &params->rgbsGrid[i].base;
+        }
+    }
+
+    // flatten af grid
+    params->afGridPtr = nullptr;
+    if (result.afGrid) {
+        params->afGrid.base = *result.afGrid;
+        size_t afSize = result.afGrid->grid_width * result.afGrid->grid_height * sizeof(int);
+        size_t memSize = sizeof(params->afGrid.filter_response_1);
+        CheckError(memSize < afSize, false, "%s, memory for af grid is too small", __func__);
+        MEMCPY_S(params->afGrid.filter_response_1, memSize,
+                 result.afGrid->filter_response_1, afSize);
+        MEMCPY_S(params->afGrid.filter_response_2, memSize,
+                 result.afGrid->filter_response_2, afSize);
+        params->afGridPtr = &params->afGrid.base;
+    }
+
+    // flatten dvs grid
+    params->dvsStatsPtr = nullptr;
+    if (result.dvsStats) {
+        params->dvsStats.base = *result.dvsStats;
+        CheckError(MV_ENTRIE_COUNT < result.dvsStats->vector_count, false,
+                   "%s, memory for dvs statistics is too small", __func__);
+        MEMCPY_S(params->dvsStats.motion_vectors,
+                 MV_ENTRIE_COUNT * sizeof(ia_dvs_motion_vector),
+                 result.dvsStats->motion_vectors,
+                 result.dvsStats->vector_count * sizeof(ia_dvs_motion_vector));
+        params->dvsStatsPtr = &params->dvsStats.base;
+    }
+
+    return true;
+}
+
+bool IPCIspParamAdaptor::clientUnflattenConvertStats(void *pData, uint32_t size,
+                                                     ConvertResult *result) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData || !result, false, "@%s, pData or result is nullptr", __func__);
+    CheckError(size < sizeof(ConvertStatsParam), false, "@%s, buffer is small", __func__);
+
+    ConvertStatsParam *params = static_cast<ConvertStatsParam*>(pData);
+    *result->queryResults = params->queryResults;
+
+    for (int i = 0; i < MAX_NUM_EXPOSURES; ++i) {
+        if (params->rgbsGridArray[i]) {
+            params->rgbsGrid[i].base.blocks_ptr = params->rgbsGrid[i].blocks_ptr;
+            result->rgbsGrid[i] = &params->rgbsGrid[i].base;
+        }
+    }
+
+    if (params->afGridPtr) {
+        params->afGrid.base.filter_response_1 = params->afGrid.filter_response_1;
+        params->afGrid.base.filter_response_2 = params->afGrid.filter_response_2;
+        result->afGrid = &params->afGrid.base;
+    }
+
+    if (params->dvsStatsPtr) {
+        params->dvsStats.base.motion_vectors = params->dvsStats.motion_vectors;
+        result->dvsStats = &params->dvsStats.base;
+    }
+
+    return true;
+}
+
+bool IPCIspParamAdaptor::clientFlattenRunPal(void *pData, uint32_t size,
+                                             const ia_isp_bxt *ispHandle,
+                                             const ia_isp_bxt_input_params_v2 *inputParams,
+                                             const ia_binary_data *outputData,
+                                             const int32_t palDataHandle) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(!ispHandle || !inputParams || !outputData, false,
+               "@%s, ispHandle, inputParams or outputData is nullptr", __func__);
+    CheckError(size < sizeof(RunPalParam), false, "@%s, buffer is small", __func__);
+
+    RunPalParam *params = static_cast<RunPalParam*>(pData);
+    params->ispRemoteHandle = reinterpret_cast<uintptr_t>(ispHandle);
+    params->inputParamsBase = *inputParams;
+    ia_isp_bxt_input_params_v2 *base = &params->inputParamsBase;
+
+    if (base->sensor_frame_params) {
+        params->frameParam = *inputParams->sensor_frame_params;
+    }
+
+    if (base->awb_results) {
+        params->awbResult = *inputParams->awb_results;
+    }
+
+    bool ret = true;
+    if (base->gbce_results) {
+        ret = mIpcAiq.flattenGbceResults(*inputParams->gbce_results, &params->gbceResult);
+        CheckError(ret == false, false, "%s, flattenGbceResults fails", __func__);
+    }
+
+    if (base->ae_results) {
+        ret = mIpcAiq.flattenAeResults(*inputParams->ae_results, &params->aeResults);
+        CheckError(ret == false, false, "%s, flattenAeResults fails", __func__);
+    }
+
+    if (base->pa_results) {
+        ret = mIpcAiq.flattenPaResultsV1(*inputParams->pa_results, &params->paResult);
+        CheckError(ret == false, false, "%s, flattenPaResultsV1 fails", __func__);
+    }
+
+    if (base->sa_results) {
+        mIpcAiq.flattenSaResultsV2(*inputParams->sa_results, &params->saResult);
+        CheckError(ret == false, false, "%s, flattenSaResultsV2 fails", __func__);
+    }
+
+    if (base->weight_grid) {
+        params->weightGrid = *inputParams->weight_grid;
+        size_t weightSize = (inputParams->weight_grid->width *
+                            inputParams->weight_grid->height * sizeof(unsigned char));
+        CheckError(weightSize > MAX_SIZE_WEIGHT_GRID * sizeof(unsigned char),
+                   false, "%s, the buffer for weight grid is too small", __func__);
+        MEMCPY_S(params->weights, MAX_SIZE_WEIGHT_GRID * sizeof(unsigned char),
+                 inputParams->weight_grid->weights, weightSize);
+        params->weightGrid.weights = const_cast<unsigned char*>(params->weights);
+    }
+
+    if (base->program_group) {
+        CLEAR(params->programGroup);
+        ret = flattenProgramGroup(inputParams->program_group, &params->programGroup);
+        CheckError(ret == false, false, "%s, flattenProgramGroup fails", __func__);
+    }
+
+    if (base->dvs_morph_table) {
+        ret = mIpcDvs.flattenMorphTable(inputParams->dvs_morph_table, &params->dvsResult);
+        CheckError(ret == false, false, "%s, flattenMorphTable fails", __func__);
+    }
+
+    if (base->custom_controls) {
+        params->customControl = *inputParams->custom_controls;
+
+        size_t customCtlSize = inputParams->custom_controls->count * sizeof(float);
+        size_t maxCtlSize = MAX_CUSTOM_CONTROLS_SIZE * sizeof(float);
+        CheckError(customCtlSize > maxCtlSize, false,
+                   "%s, the buffer for custom controls is too small", __func__);
+        if (inputParams->custom_controls->parameters) {
+            MEMCPY_S(params->customCtlParams, maxCtlSize,
+                     inputParams->custom_controls->parameters, customCtlSize);
+            params->customControl.parameters = const_cast<float*>(params->customCtlParams);
+        }
+    }
+
+    if (base->pal_override) {
+        params->palOverride = *inputParams->pal_override;
+        if (inputParams->pal_override->size > 0) {
+            MEMCPY_S(params->overrideData, sizeof(params->overrideData),
+                     inputParams->pal_override->data, inputParams->pal_override->size);
+            params->palOverride.data = static_cast<void*>(params->overrideData);
+        }
+    }
+
+    if (base->ltm_results) {
+        params->ltmResult = *inputParams->ltm_results;
+    }
+
+    if (base->ltm_drc_params) {
+        params->drcResult = *inputParams->ltm_drc_params;
+    }
+
+    if (base->gdc_transformation) {
+        params->gdcTransform = *inputParams->gdc_transformation;
+    }
+
+    if (base->view_params) {
+        MEMCPY_S(&params->viewConfig, sizeof(params->viewConfig),
+                 inputParams->view_params, sizeof(ia_view_config_t));
+    }
+
+    if (base->bcomp_results) {
+        params->bcompResult = *inputParams->bcomp_results;
+    }
+
+    if (base->gdc_mbr_limits) {
+        params->gdcLimit = *inputParams->gdc_mbr_limits;
+    }
+
+    if (outputData) {
+        params->palOutput = *outputData;
+        params->palDataHandle = palDataHandle;
+    }
+
+    return true;
+}
+
+bool IPCIspParamAdaptor::serverUnflattenRunPal(void *pData, uint32_t size, ia_isp_bxt **ispHandle,
+                                               ia_isp_bxt_input_params_v2 **paramsRes,
+                                               ia_binary_data **palOutput) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(!ispHandle || !paramsRes || !palOutput, false,
+               "@%s, ispHandle paramsRes or palOutput is nullptr", __func__);
+    CheckError(size < sizeof(RunPalParam), false, "@%s, buffer is small", __func__);
+
+    RunPalParam *params = static_cast<RunPalParam*>(pData);
+    ia_isp_bxt_input_params_v2 *base = &params->inputParamsBase;
+
+    if (base->sensor_frame_params) {
+        base->sensor_frame_params = &params->frameParam;
+    }
+
+    if (base->awb_results) {
+        base->awb_results = &params->awbResult;
+    }
+
+    bool ret = true;
+    if (base->gbce_results) {
+        ret = mIpcAiq.unflattenGbceResults(&params->gbceResult);
+        CheckError(ret == false, false, "%s, unflattenGbceResults fails", __func__);
+        base->gbce_results = &params->gbceResult.base;
+    }
+
+    if (base->ae_results) {
+        ret = mIpcAiq.unflattenAeResults(&params->aeResults);
+        CheckError(ret == false, false, "%s, unflattenAeResults fails", __func__);
+        base->ae_results = &params->aeResults.base;
+    }
+
+    if (base->pa_results) {
+        ret = mIpcAiq.unflattenPaResultsV1(&params->paResult);
+        CheckError(ret == false, false, "%s, unflattenPaResultsV1 fails", __func__);
+        base->pa_results = &params->paResult.base;
+    }
+
+    if (base->sa_results) {
+        ret = mIpcAiq.unflattenSaResultsV2(&params->saResult);
+        CheckError(ret == false, false, "%s, unflattenSaResultsV2 fails", __func__);
+        base->sa_results = &params->saResult.base;
+    }
+
+    if (base->weight_grid) {
+        if (params->weightGrid.weights) {
+            params->weightGrid.weights = const_cast<unsigned char*>(params->weights);
+        }
+        base->weight_grid = &params->weightGrid;
+    }
+
+    if (base->program_group) {
+        ret = unflattenProgramGroup(&params->programGroup);
+        CheckError(ret == false, false, "%s, unflattenProgramGroup fails", __func__);
+        base->program_group = &params->programGroup.group;
+    }
+
+    if (base->dvs_morph_table) {
+        ret = mIpcDvs.unflattenMorphTalbe(&params->dvsResult);
+        CheckError(ret == false, false, "%s, unflattenMorphTalbe fails", __func__);
+        base->dvs_morph_table = &params->dvsResult.morphTable;
+    }
+
+    if (base->custom_controls) {
+        if (params->customControl.parameters) {
+            params->customControl.parameters = const_cast<float*>(params->customCtlParams);
+        }
+        base->custom_controls = &params->customControl;
+    }
+
+    if (base->pal_override) {
+        if (params->palOverride.data) {
+            params->palOverride.data = static_cast<void*>(params->overrideData);
+        }
+        base->pal_override = &params->palOverride;
+    }
+
+    if (base->ltm_results) {
+        base->ltm_results = &params->ltmResult;
+    }
+
+    if (base->ltm_drc_params) {
+        base->ltm_drc_params = &params->drcResult;
+    }
+
+    if (base->gdc_transformation) {
+        base->gdc_transformation = &params->gdcTransform;
+    }
+
+    if (base->view_params) {
+        base->view_params = reinterpret_cast<ia_isp_bxt_view_params_t *>(&params->viewConfig);
+    }
+
+    if (base->bcomp_results) {
+        base->bcomp_results = &params->bcompResult;
+    }
+
+    if (base->gdc_mbr_limits) {
+        base->gdc_mbr_limits = &params->gdcLimit;
+    }
+
+    *ispHandle = reinterpret_cast<ia_isp_bxt*>(params->ispRemoteHandle);
+    *paramsRes = &params->inputParamsBase;
+    *palOutput = &params->palOutput;
+
+    return true;
+}
+
+bool IPCIspParamAdaptor::flattenProgramGroup(const ia_isp_bxt_program_group *src,
+                                             GraphKernelArray *res) {
+    CheckError(!src || !res, false, "@%s, src or dst is nullptr", __func__);
+    CheckError(src->kernel_count > MAX_STREAM_KERNEL_COUNT, false,
+               "%s the buffer of kernel array is tool small", __func__);
+
+    res->group = *src;
+    for (unsigned int j = 0; j < res->group.kernel_count; ++j) {
+        res->runKernels[j] = src->run_kernels[j];
+        if (res->runKernels[j].resolution_info) {
+            res->resoInfo[j] = *src->run_kernels[j].resolution_info;
+        }
+        if (res->runKernels[j].resolution_history) {
+            res->resoHistory[j] = *src->run_kernels[j].resolution_history;
+        }
+    }
+    if (res->group.pipe) {
+        res->pipeInfo = *src->pipe;
+    }
+
+    return true;
+}
+
+bool IPCIspParamAdaptor::unflattenProgramGroup(GraphKernelArray *result) {
+    CheckError(!result, false, "@%s, result is nullptr", __func__);
+    CheckError(result->group.kernel_count > MAX_STREAM_KERNEL_COUNT,
+               false, "%s, the buffer of kernel array is too small", __func__);
+
+    result->group.run_kernels = result->runKernels;
+    for (unsigned j = 0; j < result->group.kernel_count; ++j) {
+        if (result->runKernels[j].resolution_info) {
+            result->runKernels[j].resolution_info = &result->resoInfo[j];
+        }
+
+        if (result->runKernels[j].resolution_history) {
+            result->runKernels[j].resolution_history = &result->resoHistory[j];
+        }
+    }
+    if (result->group.pipe) {
+        result->group.pipe = &result->pipeInfo;
+    }
+
+    return true;
+}
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.h
new file mode 100644
index 000000000000..22520dd7f33b
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.h
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "modules/sandboxing/IPCCommon.h"
+#include "modules/algowrapper/StatsTypes.h"
+
+#include "modules/sandboxing/IPCGraphConfig.h"
+#include "modules/sandboxing/IPCIntelAiq.h"
+#include "modules/sandboxing/IPCIntelDvs.h"
+
+namespace icamera {
+
+struct IspBxtInitParam {
+    ia_binary_data iaIsp;
+    int8_t ispAiqbData[MAX_IA_BINARY_DATA_SIZE];
+    uintptr_t iaCmcHandle;
+    uint32_t maxStatsWidth;
+    uint32_t maxStatsHeight;
+    uint32_t maxStatsIn;
+    ia_mkn *iaMkn;  // hal always passes nullptr to ia_bxt_isp
+
+    uintptr_t ispRemoteHandle;
+};
+
+struct IspBxtDeInitParam {
+    uintptr_t ispRemoteHandle;
+};
+
+struct PalDataSizeParam {
+    GraphKernelArray programGroup;
+    int palDataSize;
+};
+
+struct DvsStatsParam {
+    ia_dvs_statistics base;
+    ia_dvs_motion_vector motion_vectors[MV_ENTRIE_COUNT];
+};
+
+struct ConvertStatsParam {
+    uintptr_t ispRemoteHandle;
+
+    // Input params
+    bool multiExpo;
+    ia_binary_data statsBuffer;
+    int8_t statsData[MAX_IA_BINARY_DATA_SIZE];
+    camera_resolution_t dvsReso;
+    ae_run_params_results aeResults;
+
+    // Output result
+    ia_isp_bxt_statistics_query_results_t queryResults;
+
+    ia_aiq_rgbs_grid *rgbsGridArray[MAX_NUM_EXPOSURES];
+    ia_aiq_rgbs_grid_data rgbsGrid[MAX_NUM_EXPOSURES];
+
+    ia_aiq_af_grid *afGridPtr;
+    ia_aiq_af_grid_data afGrid;
+
+    ia_dvs_statistics *dvsStatsPtr;
+    DvsStatsParam dvsStats;
+};
+
+#define MAX_CUSTOM_CONTROLS_SIZE  1024
+struct RunPalParam {
+    ia_isp_bxt_input_params_v2 inputParamsBase;
+
+    // sensor frame parameters
+    ia_aiq_frame_params frameParam;
+
+    // for 3a result
+    ia_aiq_awb_results awbResult;
+    gbce_results_params gbceResult;
+
+    ae_run_params_results aeResults;
+    pa_run_params_results_v1 paResult;
+    sa_run_v2_params_results saResult;
+
+    ia_aiq_hist_weight_grid weightGrid;
+    unsigned char weights[MAX_SIZE_WEIGHT_GRID];
+
+    GraphKernelArray programGroup;
+    DvsMorphParams dvsResult;
+
+    // for custom control
+    ia_isp_custom_controls customControl;
+    float customCtlParams[MAX_CUSTOM_CONTROLS_SIZE];
+
+    // for pal override
+    ia_binary_data palOverride;
+    int8_t overrideData[MAX_IA_BINARY_DATA_SIZE];
+
+    // for ltm result
+    ia_ltm_results ltmResult;
+    ia_ltm_drc_params drcResult;
+
+    ia_dvs_image_transformation gdcTransform;
+
+    ia_view_config_t viewConfig;
+    ia_bcomp_results bcompResult;
+    ia_isp_bxt_gdc_limits gdcLimit;
+
+    ia_binary_data palOutput;
+    int32_t palDataHandle;
+
+    uintptr_t ispRemoteHandle;
+};
+
+class IPCIspParamAdaptor {
+ public:
+    IPCIspParamAdaptor();
+    virtual ~IPCIspParamAdaptor();
+
+    // init
+    bool clientFlattenInit(void *pData, uint32_t size, const ia_binary_data *ispData,
+                           const ia_cmc_t *iaCmc, uint32_t maxStatsWidth,
+                           uint32_t maxStatsHeight, uint32_t maxNumStatsIn, ia_mkn *iaMkn);
+    bool serverUnflattenInit(IspBxtInitParam *pData, uint32_t size,
+                             ia_binary_data **Isp, ia_cmc_t **Cmc);
+
+    // deinit
+    bool clientFlattenDeInit(void *pData, uint32_t size, const ia_isp_bxt *ispHandle);
+    bool serverUnflattenDeInit(const void *pData, uint32_t size, ia_isp_bxt **ispHandle);
+
+    // get pal data size
+    bool clientFlattenGetPalSize(void *pData, uint32_t size,
+                                 const ia_isp_bxt_program_group *programGroup);
+    bool serverUnflattenGetPalSize(void *pData, uint32_t size,
+                                   ia_isp_bxt_program_group **programGroup);
+
+    // convert stats
+    bool clientFlattenConvertStats(void *pData, uint32_t size, const ia_isp_bxt *ispHandle,
+                                   const ConvertInputParam *inputParams);
+    bool serverUnflattenConvertStats(void *pData, uint32_t size, ia_isp_bxt **ispHandle,
+                                     ConvertInputParam *inputParams, ConvertResult *result);
+    bool serverFlattenConvertStats(void *pData, uint32_t size, const ConvertResult &result);
+    bool clientUnflattenConvertStats(void *pData, uint32_t size, ConvertResult *result);
+
+    // run pal
+    bool clientFlattenRunPal(void *pData, uint32_t size, const ia_isp_bxt *ispHandle,
+                             const ia_isp_bxt_input_params_v2 *inputParams,
+                             const ia_binary_data *outputData, const int32_t palDataHandle);
+    bool serverUnflattenRunPal(void *pData, uint32_t size, ia_isp_bxt **ispHandle,
+                               ia_isp_bxt_input_params_v2 **paramsRes, ia_binary_data **palOutput);
+
+ private:
+    bool flattenProgramGroup(const ia_isp_bxt_program_group *src, GraphKernelArray *res);
+    bool unflattenProgramGroup(GraphKernelArray *result);
+
+ private:
+    IPCIntelAiq mIpcAiq;
+    IPCIntelDvs mIpcDvs;
+
+    // Disable copy constructor and assignment operator
+    DISALLOW_COPY_AND_ASSIGN(IPCIspParamAdaptor);
+};
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.cpp
new file mode 100644
index 000000000000..58fa90f623d6
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.cpp
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "ClientGraphConfigImpl"
+
+#include "modules/sandboxing/client/GraphConfigImpl.h"
+#include "iutils/CameraLog.h"
+
+using std::vector;
+using std::map;
+using std::string;
+
+namespace icamera {
+
+GraphConfigImpl::GraphConfigImpl() :
+    mCameraId(-1),
+    mInitialized(false) {
+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
+    std::string parseName = "/graphParse" + std::to_string(personal) + "Shm";
+
+    mMems = {{parseName.c_str(), sizeof(GraphParseParams), &mMemParse, false}};
+
+    bool success = mCommon.allocateAllShmMems(&mMems);
+    if (!success) {
+        mCommon.releaseAllShmMems(mMems);
+        return;
+    }
+
+    LOGIPC("@%s, done, cameraId: %d", __func__, mCameraId);
+    mInitialized = true;
+}
+
+GraphConfigImpl::GraphConfigImpl(int32_t camId, ConfigMode mode, GraphSettingType type) :
+    mCameraId(camId),
+    mConfigMode(mode),
+    mType(type),
+    mInitialized(false) {
+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
+    std::string configStreamsName = "/graphConfigStreams" + std::to_string(personal) + "Shm";
+    std::string getGraphDataName = "/graphGetData" + std::to_string(personal) + "Shm";
+    std::string getPgIdName = "/graphGetPgId" + std::to_string(personal) + "Shm";
+    std::string getConnection = "/graphGetConnection" + std::to_string(personal) + "Shm";
+
+    mMems = {{configStreamsName.c_str(), sizeof(GraphConfigStreamParams), &mMemConfig, false},
+             {getGraphDataName.c_str(), sizeof(GraphGetDataParams), &mMemGetData, false},
+             {getPgIdName.c_str(), sizeof(GraphGetPgIdParams), &mMemGetPgId, false},
+             {getConnection.c_str(), sizeof(GraphGetConnectionParams), &mMemGetConnection, false}};
+
+    bool success = mCommon.allocateAllShmMems(&mMems);
+    if (!success) {
+        mCommon.releaseAllShmMems(mMems);
+        return;
+    }
+
+    mInitialized = true;
+    LOGIPC("@%s, done, cameraId: %d, configMode: %d, type",
+           __func__, mCameraId, mConfigMode, mType);
+}
+
+GraphConfigImpl::~GraphConfigImpl() {
+    mInitialized = false;
+    mCommon.releaseAllShmMems(mMems);
+    mMems.clear();
+}
+
+void GraphConfigImpl::addCustomKeyMap() {
+    LOGIPC("@%s", __func__);
+    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
+
+    bool ret = mCommon.requestSync(IPC_GRAPH_ADD_KEY);
+    CheckError(!ret, VOID_VALUE, "@%s, requestSync fails", __func__);
+}
+
+status_t GraphConfigImpl::parse(int cameraId,
+                                const char *graphDescFile, const char *settingsFile) {
+    LOGIPC("@%s", __func__);
+    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
+
+    bool ret = mIpc.clientFlattenParse(mMemParse.mAddr, mMemParse.mSize,
+                                       cameraId, graphDescFile, settingsFile);
+    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientFlattenParse fails", __func__);
+
+    status_t rt = mCommon.requestSync(IPC_GRAPH_PARSE, mMemParse.mHandle);
+    CheckError(!rt, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
+
+    return OK;
+}
+
+void GraphConfigImpl::releaseGraphNodes() {
+    LOGIPC("@%s", __func__);
+    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
+
+    bool ret = mCommon.requestSync(IPC_GRAPH_RELEASE_NODES);
+    CheckError(!ret, VOID_VALUE, "@%s, requestSync fails", __func__);
+}
+
+status_t GraphConfigImpl::configStreams(const vector<HalStream*> &activeStreams) {
+    LOGIPC("@%s", __func__);
+    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
+
+    GraphBaseInfo info = {mCameraId, mConfigMode};
+    bool ret = mIpc.clientFlattenConfigStreams(mMemConfig.mAddr, mMemConfig.mSize,
+                                               info, mType, activeStreams);
+    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientFlattenConfigStreams fails", __func__);
+
+    ret = mCommon.requestSync(IPC_GRAPH_CONFIG_STREAMS, mMemConfig.mHandle);
+    CheckError(!ret, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
+
+    return OK;
+}
+
+status_t GraphConfigImpl::getGraphConfigData(IGraphType::GraphConfigData *data) {
+    LOGIPC("@%s", __func__);
+    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
+
+    GraphBaseInfo info = {mCameraId, mConfigMode};
+    bool ret = mIpc.clientFlattenGetGraphData(mMemGetData.mAddr, mMemGetData.mSize, info);
+    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientFlattenGetGraphData fails", __func__);
+
+    ret = mCommon.requestSync(IPC_GRAPH_GET_CONFIG_DATA, mMemGetData.mHandle);
+    CheckError(!ret, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
+
+    ret = mIpc.clientUnflattenGetGraphData(mMemGetData.mAddr, mMemGetData.mSize, data);
+    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientUnflattenGetGraphData fails", __func__);
+
+    return OK;
+}
+
+status_t GraphConfigImpl::pipelineGetConnections(
+        const std::vector<std::string> &pgList,
+        std::vector<IGraphType::ScalerInfo> *scalerInfo,
+        std::vector<IGraphType::PipelineConnection> *confVector) {
+    LOGIPC("@%s", __func__);
+    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
+
+    GraphBaseInfo info = {mCameraId, mConfigMode};
+    bool ret = mIpc.clientFlattenGetConnection(mMemGetConnection.mAddr,
+                                               mMemGetConnection.mSize, info, pgList);
+    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientFlattenGetConnection fails", __func__);
+
+    ret = mCommon.requestSync(IPC_GRAPH_GET_CONNECTION, mMemGetConnection.mHandle);
+    CheckError(!ret, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
+
+    ret = mIpc.clientUnFlattenGetConnection(mMemGetConnection.mAddr,
+                                            mMemGetConnection.mSize, scalerInfo, confVector);
+    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientUnFlattenGetConnection fails", __func__);
+
+    return OK;
+}
+
+status_t GraphConfigImpl::getPgIdForKernel(const uint32_t streamId,
+                                           const int32_t kernelId, int32_t *pgId) {
+    LOGIPC("@%s", __func__);
+    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
+
+    GraphBaseInfo info = {mCameraId, mConfigMode};
+    bool ret = mIpc.clientFlattenGetPgId(mMemGetPgId.mAddr,
+                                         mMemGetPgId.mSize, info, streamId, kernelId);
+    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientFlattenGetPgId fails", __func__);
+
+    ret = mCommon.requestSync(IPC_GRAPH_GET_PG_ID, mMemGetPgId.mHandle);
+    CheckError(!ret, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
+
+    ret = mIpc.clientUnFlattenGetPgId(mMemGetPgId.mAddr, mMemGetPgId.mSize, pgId);
+    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientUnFlattenGetPgId fails", __func__);
+
+    return OK;
+}
+
+status_t GraphConfigImpl::getProgramGroup(std::string pgName,
+                                          ia_isp_bxt_program_group *programGroup) {
+    // TODO: Add this API support in the future.
+    LOGIPC("@%s", __func__);
+    return OK;
+}
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.h b/camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.h
new file mode 100644
index 000000000000..086386332d42
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+#include <utility>
+#include <vector>
+#include <string>
+
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+#include "iutils/Thread.h"
+
+#include "src/platformdata/CameraTypes.h"
+#include "src/platformdata/gc/IGraphConfig.h"
+#include "src/platformdata/gc/HalStream.h"
+#include "modules/sandboxing/IPCGraphConfig.h"
+#include "IntelAlgoCommon.h"
+
+namespace icamera {
+
+class GraphConfigImpl {
+ public:
+    GraphConfigImpl();
+    GraphConfigImpl(int32_t camId, ConfigMode mode, GraphSettingType type);
+    virtual ~GraphConfigImpl();
+
+    void addCustomKeyMap();
+    status_t parse(int cameraId, const char *graphDescFile, const char *settingsFile);
+    void releaseGraphNodes();
+
+    status_t configStreams(const std::vector<HalStream*> &activeStreams);
+    status_t getGraphConfigData(IGraphType::GraphConfigData *data);
+
+    int getProgramGroup(std::string pgName,
+                        ia_isp_bxt_program_group *programGroupForPG);
+    status_t getPgIdForKernel(const uint32_t streamId,
+                              const int32_t kernelId, int32_t *pgId);
+
+    status_t pipelineGetConnections(const std::vector<std::string> &pgList,
+                                    std::vector<IGraphType::ScalerInfo> *scalerInfo,
+                                    std::vector<IGraphType::PipelineConnection> *confVector);
+
+ private:
+    IPCGraphConfig mIpc;
+    IntelAlgoCommon mCommon;
+
+    ShmMemInfo mMemParse;
+    ShmMemInfo mMemConfig;
+    ShmMemInfo mMemGetData;
+    ShmMemInfo mMemGetPgId;
+    ShmMemInfo mMemGetConnection;
+
+    std::vector<ShmMem> mMems;
+
+    int mCameraId;
+    ConfigMode mConfigMode;
+    GraphSettingType mType;
+    bool mInitialized;
+
+    // Disable copy constructor and assignment operator
+    DISALLOW_COPY_AND_ASSIGN(GraphConfigImpl);
+};
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.cpp
new file mode 100644
index 000000000000..ff8ce077fc6a
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.cpp
@@ -0,0 +1,317 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelAiq"
+
+#include "modules/sandboxing/client/IntelAiq.h"
+
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+IntelAiq::IntelAiq() {
+    LOG1("@%s", __func__);
+
+    mAiq = reinterpret_cast<uintptr_t>(nullptr);
+
+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
+    std::string deinitName = "/aiqDeinitShm" + std::to_string(personal) + "Shm";
+    std::string aeName = "/aiqAeShm" + std::to_string(personal) + "Shm";
+    std::string afName = "/aiqAfShm" + std::to_string(personal) + "Shm";
+    std::string awbName = "/aiqAwbShm" + std::to_string(personal) + "Shm";
+    std::string gbceName = "/aiqGbceShm" + std::to_string(personal) + "Shm";
+    std::string aiqdName = "/aiqAiqdShm" + std::to_string(personal) + "Shm";
+    std::string paName = "/aiqPaShm" + std::to_string(personal) + "Shm";
+    std::string saName = "/aiqSaShm" + std::to_string(personal) + "Shm";
+    std::string statName = "/aiqStatShm" + std::to_string(personal) + "Shm";
+    std::string versionName = "/aiqVersionShm" + std::to_string(personal) + "Shm";
+
+    mMems = {
+        {deinitName.c_str(), sizeof(aiq_deinit_params), &mMemDeinit, false},
+        {aeName.c_str(), sizeof(ae_run_params), &mMemAe, false},
+        {afName.c_str(), sizeof(af_run_params), &mMemAf, false},
+        {awbName.c_str(), sizeof(awb_run_params), &mMemAwb, false},
+        {gbceName.c_str(), sizeof(gbce_run_params), &mMemGbce, false},
+        {aiqdName.c_str(), sizeof(ia_binary_data_params), &mMemAiqd, false},
+        {paName.c_str(), sizeof(pa_run_v1_params), &mMemPa, false},
+        {saName.c_str(), sizeof(sa_run_v2_params), &mMemSa, false},
+        {statName.c_str(), sizeof(set_statistics_set_v4_params), &mMemStat, false},
+        {versionName.c_str(), sizeof(ia_aiq_version_params), &mMemVersion, false}};
+
+    bool success = mCommon.allocateAllShmMems(&mMems);
+    if (!success) {
+        mCommon.releaseAllShmMems(mMems);
+        return;
+    }
+
+    LOG1("@%s, done", __func__);
+    mInitialized = true;
+}
+
+IntelAiq::~IntelAiq() {
+    LOG1("@%s", __func__);
+    mCommon.releaseAllShmMems(mMems);
+}
+
+ia_aiq* IntelAiq::init(const ia_binary_data* aiqbData,
+                       const ia_binary_data* nvmData,
+                       const ia_binary_data* aiqdData,
+                       unsigned int statsMaxWidth,
+                       unsigned int statsMaxHeight,
+                       unsigned int maxNumStatsIn,
+                       ia_cmc_t* cmc,
+                       ia_mkn* mkn) {
+    LOG1("@%s, aiqbData:%p, nvmData:%p, aiqdData:%p", __func__, aiqbData, nvmData, aiqdData);
+    CheckError(!mInitialized, nullptr, "@%s, mInitialized is false", __func__);
+
+    unsigned int aiqbSize = aiqbData ? aiqbData->size : 0;
+    unsigned int nvmSize = nvmData ? nvmData->size : 0;
+    unsigned int aiqdSize = aiqdData ? aiqdData->size : 0;
+    unsigned int size = sizeof(aiq_init_params) + aiqbSize + nvmSize + aiqdSize;
+    LOG2("@%s, aiqbSize:%d, nvmSize:%d, aiqdSize:%d", __func__, aiqbSize, nvmSize, aiqdSize);
+
+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
+    std::string initName = "/aiqInitShm" + std::to_string(personal) + "Shm";
+    ShmMemInfo shm;
+    shm.mName = initName.c_str();
+    shm.mSize = size;
+    bool ret = mCommon.allocShmMem(shm.mName, shm.mSize, &shm);
+    CheckError(!ret, nullptr, "@%s, allocShmMem fails", __func__);
+
+    ret = mIpc.clientFlattenInit(aiqbData, nvmData, aiqdData,
+                                 statsMaxWidth, statsMaxHeight, maxNumStatsIn,
+                                 reinterpret_cast<uintptr_t>(cmc),
+                                 reinterpret_cast<uintptr_t>(mkn),
+                                 static_cast<uint8_t*>(shm.mAddr), size);
+    CheckError(!ret, nullptr, "@%s, clientFlattenInit fails", __func__);
+
+    ret = mCommon.requestSync(IPC_AIQ_INIT, shm.mHandle);
+    CheckError(!ret, nullptr, "@%s, requestSync fails", __func__);
+
+    aiq_init_params* params = static_cast<aiq_init_params*>(shm.mAddr);
+    mAiq = params->results;
+    LOG2("@%s, success, aiq:%p\n", __func__, reinterpret_cast<ia_aiq*>(mAiq));
+
+    mCommon.freeShmMem(shm);
+
+    return reinterpret_cast<ia_aiq*>(mAiq);
+}
+
+ia_err IntelAiq::aeRun(const ia_aiq_ae_input_params* inputParams, ia_aiq_ae_results** results) {
+    LOG1("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
+    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
+    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general,
+               "@%s, mAiq is nullptr", __func__);
+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
+
+    ae_run_params* params = static_cast<ae_run_params*>(mMemAe.mAddr);
+
+    bool ret = mIpc.clientFlattenAe(mAiq, *inputParams, params);
+    CheckError(!ret, ia_err_general, "@%s, clientFlattenAe fails", __func__);
+
+    ret = mCommon.requestSync(IPC_AIQ_AE_RUN, mMemAe.mHandle);
+    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
+
+    ret = mIpc.clientUnflattenAe(params, results);
+    CheckError(!ret, ia_err_general, "@%s, clientUnflattenAe fails", __func__);
+
+    return ia_err_none;
+}
+
+ia_err IntelAiq::afRun(const ia_aiq_af_input_params* inputParams, ia_aiq_af_results** results) {
+    LOG1("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
+    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
+    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general,
+               "@%s, mAiq is nullptr", __func__);
+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
+
+    af_run_params* params = static_cast<af_run_params*>(mMemAf.mAddr);
+
+    bool ret = mIpc.clientFlattenAf(mAiq, *inputParams, params);
+    CheckError(!ret, ia_err_general, "@%s, clientFlattenAf fails", __func__);
+
+    ret = mCommon.requestSync(IPC_AIQ_AF_RUN, mMemAf.mHandle);
+    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
+
+    ret = mIpc.clientUnflattenAf(*params, results);
+    CheckError(!ret, ia_err_general, "@%s, clientUnflattenAf fails", __func__);
+
+    return ia_err_none;
+}
+
+ia_err IntelAiq::awbRun(const ia_aiq_awb_input_params* inputParams, ia_aiq_awb_results** results) {
+    LOG1("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
+    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
+    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general,
+               "@%s, mAiq is nullptr", __func__);
+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
+
+    awb_run_params* params = static_cast<awb_run_params*>(mMemAwb.mAddr);
+
+    bool ret = mIpc.clientFlattenAwb(mAiq, *inputParams, params);
+    CheckError(!ret, ia_err_general, "@%s, clientFlattenAwb fails", __func__);
+
+    ret = mCommon.requestSync(IPC_AIQ_AWB_RUN, mMemAwb.mHandle);
+    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
+
+    ret = mIpc.clientUnflattenAwb(*params, results);
+    CheckError(!ret, ia_err_general, "@%s, clientUnflattenAwb fails", __func__);
+
+    return ia_err_none;
+}
+
+ia_err IntelAiq::gbceRun(const ia_aiq_gbce_input_params* inputParams,
+                         ia_aiq_gbce_results** results) {
+    LOG1("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
+    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
+    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general,
+               "@%s, mAiq is nullptr", __func__);
+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
+
+    gbce_run_params* params = static_cast<gbce_run_params*>(mMemGbce.mAddr);
+
+    bool ret = mIpc.clientFlattenGbce(mAiq, *inputParams, params);
+    CheckError(!ret, ia_err_general, "@%s, clientFlattenGbce fails", __func__);
+
+    ret = mCommon.requestSync(IPC_AIQ_GBCE_RUN, mMemGbce.mHandle);
+    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
+
+    ret = mIpc.clientUnflattenGbce(params, results);
+    CheckError(!ret, ia_err_general, "@%s, clientUnflattenGbce fails", __func__);
+
+    return ia_err_none;
+}
+
+ia_err IntelAiq::paRunV1(const ia_aiq_pa_input_params* inputParams,
+                         ia_aiq_pa_results_v1** results) {
+    LOG1("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
+    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
+    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general,
+               "@%s, mAiq is nullptr", __func__);
+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
+
+    pa_run_v1_params* params = static_cast<pa_run_v1_params*>(mMemPa.mAddr);
+
+    bool ret = mIpc.clientFlattenPaV1(mAiq, *inputParams, params);
+    CheckError(!ret, ia_err_general, "@%s, clientFlattenPaV1 fails", __func__);
+
+    ret = mCommon.requestSync(IPC_AIQ_PA_RUN_V1, mMemPa.mHandle);
+    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
+
+    ret = mIpc.clientUnflattenPaV1(params, results);
+    CheckError(!ret, ia_err_general, "@%s, clientUnflattenPaV1 fails", __func__);
+
+    return ia_err_none;
+}
+
+ia_err IntelAiq::saRunV2(const ia_aiq_sa_input_params_v1* inputParams,
+                         ia_aiq_sa_results_v1** results) {
+    LOG1("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
+    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
+    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general,
+               "@%s, mAiq is nullptr", __func__);
+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
+
+    sa_run_v2_params* params = static_cast<sa_run_v2_params*>(mMemSa.mAddr);
+
+    bool ret = mIpc.clientFlattenSaV2(mAiq, *inputParams, params);
+    CheckError(!ret, ia_err_general, "@%s, clientFlattenSaV2 fails", __func__);
+
+    ret = mCommon.requestSync(IPC_AIQ_SA_RUN_V2, mMemSa.mHandle);
+    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
+
+    ret = mIpc.clientUnflattenSaV2(params, results);
+    CheckError(!ret, ia_err_general, "@%s, clientUnflattenSaV2 fails", __func__);
+
+    return ia_err_none;
+}
+
+ia_err IntelAiq::statisticsSetV4(const ia_aiq_statistics_input_params_v4* inputParams) {
+    LOG1("@%s, inputParams:%p", __func__, inputParams);
+    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
+    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general,
+               "@%s, mAiq is nullptr", __func__);
+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
+
+    set_statistics_set_v4_params* params =
+        static_cast<set_statistics_set_v4_params*>(mMemStat.mAddr);
+
+    bool ret = mIpc.clientFlattenStatSetV4(mAiq, *inputParams, params);
+    CheckError(!ret, ia_err_general, "@%s, clientFlattenStatSetV4 fails", __func__);
+
+    ret = mCommon.requestSync(IPC_AIQ_STATISTICS_SET_V4, mMemStat.mHandle);
+    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
+
+    return ia_err_none;
+}
+
+ia_err IntelAiq::getAiqdData(ia_binary_data* outData) {
+    LOG1("@%s, outData:%p", __func__, outData);
+    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
+    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general,
+               "@%s, mAiq is nullptr", __func__);
+    CheckError(!outData, ia_err_argument, "@%s, outData is nullptr", __func__);
+
+    ia_binary_data_params* params = static_cast<ia_binary_data_params*>(mMemAiqd.mAddr);
+
+    params->aiq_handle = mAiq;
+
+    int ret = mCommon.requestSync(IPC_AIQ_GET_AIQD_DATA, mMemAiqd.mHandle);
+    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
+
+    outData->data = params->data;
+    outData->size = params->size;
+
+    return ia_err_none;
+}
+
+void IntelAiq::deinit() {
+    LOG1("@%s", __func__);
+    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
+    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, VOID_VALUE,
+               "@%s, mAiq is nullptr", __func__);
+
+    aiq_deinit_params* params = static_cast<aiq_deinit_params*>(mMemDeinit.mAddr);
+    params->aiq_handle = mAiq;
+
+    int ret = mCommon.requestSync(IPC_AIQ_DEINIT, mMemDeinit.mHandle);
+    CheckError(!ret, VOID_VALUE, "@%s, requestSync fails", __func__);
+
+    mAiq = reinterpret_cast<uintptr_t>(nullptr);
+}
+
+void IntelAiq::getVersion(std::string* version) {
+    LOG1("@%s", __func__);
+    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
+    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, VOID_VALUE,
+               "@%s, mAiq is nullptr", __func__);
+
+    ia_aiq_version_params* params = static_cast<ia_aiq_version_params*>(mMemVersion.mAddr);
+    params->aiq_handle = mAiq;
+
+    int ret = mCommon.requestSync(IPC_AIQ_GET_VERSION, mMemVersion.mHandle);
+    CheckError(!ret, VOID_VALUE, "@%s, requestSync fails", __func__);
+
+    *version = params->data;
+}
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.h
new file mode 100644
index 000000000000..ca02d5c4dcf1
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_aiq.h>
+#include <ia_types.h>
+
+#include <string>
+#include <vector>
+
+#include "modules/sandboxing/client/IntelAlgoCommon.h"
+#include "modules/sandboxing/IPCIntelAiq.h"
+
+namespace icamera {
+class IntelAiq {
+ public:
+    IntelAiq();
+    virtual ~IntelAiq();
+
+    ia_aiq* init(const ia_binary_data* aiqbData,
+                 const ia_binary_data* nvmData,
+                 const ia_binary_data* aiqdData,
+                 unsigned int statsMaxWidth,
+                 unsigned int statsMaxHeight,
+                 unsigned int maxNumStatsIn,
+                 ia_cmc_t* cmc,
+                 ia_mkn* mkn);
+    ia_err aeRun(const ia_aiq_ae_input_params* inputParams, ia_aiq_ae_results** results);
+    ia_err afRun(const ia_aiq_af_input_params* inputParams, ia_aiq_af_results** results);
+    ia_err awbRun(const ia_aiq_awb_input_params* inputParams, ia_aiq_awb_results** results);
+    ia_err gbceRun(const ia_aiq_gbce_input_params* inputParams, ia_aiq_gbce_results** results);
+    ia_err paRunV1(const ia_aiq_pa_input_params* inputParams, ia_aiq_pa_results_v1** results);
+    ia_err saRunV2(const ia_aiq_sa_input_params_v1* inputParams, ia_aiq_sa_results_v1** results);
+    ia_err statisticsSetV4(const ia_aiq_statistics_input_params_v4* inputParams);
+    ia_err getAiqdData(ia_binary_data* outData);
+    void deinit();
+    void getVersion(std::string* version);
+
+ private:
+    IPCIntelAiq mIpc;
+    IntelAlgoCommon mCommon;
+
+    uintptr_t mAiq;
+
+    bool mInitialized;
+
+    ShmMemInfo mMemDeinit;
+    ShmMemInfo mMemAe;
+    ShmMemInfo mMemAf;
+    ShmMemInfo mMemAwb;
+    ShmMemInfo mMemGbce;
+    ShmMemInfo mMemAiqd;
+    ShmMemInfo mMemPa;
+    ShmMemInfo mMemSa;
+    ShmMemInfo mMemStat;
+    ShmMemInfo mMemVersion;
+
+    std::vector<ShmMem> mMems;
+};
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.cpp
new file mode 100644
index 000000000000..929018532d40
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.cpp
@@ -0,0 +1,385 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelAlgoClient"
+
+#include "modules/sandboxing/client/IntelAlgoClient.h"
+
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+#include "Parameters.h"
+
+namespace icamera {
+IntelAlgoClient::IntelAlgoClient():
+    mErrCb(nullptr),
+    mIPCStatus(true),
+    mInitialized(false) {
+    LOGIPC("@%s", __func__);
+
+    mCallback = base::Bind(&IntelAlgoClient::callbackHandler, base::Unretained(this));
+    IntelAlgoClient::return_callback = returnCallback;
+
+    mNotifyCallback = base::Bind(&IntelAlgoClient::notifyHandler, base::Unretained(this));
+    IntelAlgoClient::notify = notifyCallback;
+
+    mBridge = cros::CameraAlgorithmBridge::CreateInstance(cros::CameraAlgorithmBackend::kVendorCpu);
+    CheckError(!mBridge, VOID_VALUE, "@%s, mBridge is nullptr", __func__);
+    CheckError(mBridge->Initialize(this) != 0, VOID_VALUE, "@%s, mBridge init fails", __func__);
+
+    for (int i = 0; i < IPC_GROUP_NUM; i++) {
+        mRunner[i] = std::unique_ptr<Runner>(new Runner(static_cast<IPC_GROUP>(i), mBridge.get()));
+    }
+
+    mInitialized = true;
+}
+
+IntelAlgoClient::~IntelAlgoClient() {
+    LOGIPC("@%s", __func__);
+}
+
+bool IntelAlgoClient::isInitialized() {
+    LOGIPC("@%s, mInitialized:%d", __func__, mInitialized);
+
+    return mInitialized;
+}
+
+bool IntelAlgoClient::isIPCFine() {
+    std::lock_guard<std::mutex> l(mIPCStatusMutex);
+    LOGIPC("@%s, mIPCStatus:%d", __func__, mIPCStatus);
+
+    return mIPCStatus;
+}
+
+void IntelAlgoClient::registerErrorCallback(const camera_callback_ops_t* errCb) {
+    LOGIPC("@%s, errCb:%p", __func__, errCb);
+
+    std::lock_guard<std::mutex> l(mIPCStatusMutex);
+    mErrCb = errCb;
+
+    if (!mIPCStatus && mErrCb) {
+        camera_msg_data_t data = {CAMERA_IPC_ERROR, {0}};
+        mErrCb->notify(mErrCb, data);
+    }
+}
+
+int IntelAlgoClient::allocateShmMem(const std::string& name, int size, int* fd, void** addr) {
+    LOGIPC("@%s, name:%s, size:%d", __func__, name.c_str(), size);
+
+    *fd = -1;
+    *addr = nullptr;
+    int shmFd = -1;
+    void* shmAddr = nullptr;
+
+    shmFd = shm_open(name.c_str(), O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
+    CheckError((shmFd == -1), UNKNOWN_ERROR, "@%s, call shm_open fail", __func__);
+
+    do {
+        int ret = fcntl(shmFd, F_GETFD);
+        if (ret == -1) {
+            LOGE("@%s, call fcntl fail, error %s", __func__, strerror(errno));
+            break;
+        }
+
+        ret = ftruncate(shmFd, size);
+        if (ret == -1) {
+            LOGE("@%s, call ftruncate fail, error %s", __func__, strerror(errno));
+            break;
+        }
+
+        struct stat sb;
+        ret = fstat(shmFd, &sb);
+        if (ret == -1) {
+            LOGE("@%s, call fstat fail, error %s", __func__, strerror(errno));
+            break;
+        }
+
+        shmAddr = mmap(0, sb.st_size, PROT_WRITE, MAP_SHARED, shmFd, 0);
+        if (!shmAddr) {
+            LOGE("@%s, call mmap fail, error %s", __func__, strerror(errno));
+            break;
+        }
+
+        *fd = shmFd;
+        *addr = shmAddr;
+
+        return OK;
+    } while (0);
+
+    close(shmFd);
+    return UNKNOWN_ERROR;
+}
+
+void IntelAlgoClient::releaseShmMem(const std::string& name, int size, int fd, void* addr) {
+    LOGIPC("@%s, name:%s, size:%d, fd:%d, addr:%p", __func__, name.c_str(), size, fd, addr);
+
+    munmap(addr, size);
+    close(fd);
+    shm_unlink(name.c_str());
+}
+
+int IntelAlgoClient::requestSync(IPC_CMD cmd, int32_t bufferHandle) {
+    LOGIPC("@%s, cmd:%d:%s, bufferHandle:%d, mInitialized:%d",
+         __func__, cmd, IntelAlgoIpcCmdToString(cmd), bufferHandle, mInitialized);
+    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
+    CheckError(!isIPCFine(), UNKNOWN_ERROR, "@%s, IPC error happens", __func__);
+
+    IPC_GROUP group = IntelAlgoIpcCmdToGroup(cmd);
+
+    return mRunner[group]->requestSync(cmd, bufferHandle);
+}
+
+int IntelAlgoClient::requestSync(IPC_CMD cmd) {
+    return requestSync(cmd, -1);
+}
+
+int32_t IntelAlgoClient::registerBuffer(int bufferFd, void* addr) {
+    LOGIPC("@%s, bufferFd:%d, mInitialized:%d", __func__, bufferFd, mInitialized);
+    CheckError(!mInitialized, -1, "@%s, mInitialized is false", __func__);
+    CheckError(!isIPCFine(), -1, "@%s, IPC error happens", __func__);
+
+    int32_t handle = mBridge->RegisterBuffer(bufferFd);
+    if (handle >= 0) {
+        std::lock_guard<std::mutex> l(mShmMapMutex);
+        mShmMap[addr] = handle;
+    }
+    return handle;
+}
+
+void IntelAlgoClient::deregisterBuffer(int32_t bufferHandle) {
+    LOGIPC("@%s, bufferHandle:%d, mInitialized:%d", __func__, bufferHandle, mInitialized);
+    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
+    CheckError(!isIPCFine(), VOID_VALUE, "@%s, IPC error happens", __func__);
+
+    {
+        std::lock_guard<std::mutex> l(mShmMapMutex);
+        for (auto &item : mShmMap) {
+            if (item.second == bufferHandle) {
+                mShmMap.erase(item.first);
+                break;
+            }
+        }
+    }
+    std::vector<int32_t> handles({bufferHandle});
+    mBridge->DeregisterBuffers(handles);
+}
+
+int32_t IntelAlgoClient::registerGbmBuffer(int bufferFd) {
+    LOGIPC("@%s, bufferFd:%d, mInitialized:%d", __func__, bufferFd, mInitialized);
+    CheckError(!mInitialized, -1, "@%s, mInitialized is false", __func__);
+    CheckError(!isIPCFine(), -1, "@%s, IPC error happens", __func__);
+
+    return mBridge->RegisterBuffer(bufferFd);
+}
+
+void IntelAlgoClient::deregisterGbmBuffer(int32_t bufferHandle) {
+    LOGIPC("@%s, bufferHandle:%d, mInitialized:%d", __func__, bufferHandle, mInitialized);
+    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
+    CheckError(!isIPCFine(), VOID_VALUE, "@%s, IPC error happens", __func__);
+
+    std::vector<int32_t> handles({bufferHandle});
+    mBridge->DeregisterBuffers(handles);
+}
+
+int32_t IntelAlgoClient::getBufferHandle(void* addr) {
+    CheckError(!mInitialized, -1, "@%s, mInitialized is false", __func__);
+    if (!addr) return -1;
+
+    std::lock_guard<std::mutex> l(mShmMapMutex);
+    CheckError(mShmMap.find(addr) == mShmMap.end(), -1, "%s, Invalid client addr", __func__);
+    return mShmMap[addr];
+}
+
+void IntelAlgoClient::callbackHandler(uint32_t req_id, uint32_t status, int32_t buffer_handle) {
+    LOGIPC("@%s, req_id:%d, status:%d, buffer_handle:%d",
+         __func__, req_id, status, buffer_handle);
+
+    IPC_GROUP group = IntelAlgoIpcCmdToGroup(static_cast<IPC_CMD>(req_id));
+    mRunner[group]->callbackHandler(status, buffer_handle);
+}
+
+void IntelAlgoClient::notifyHandler(uint32_t msg) {
+    LOGIPC("@%s, msg:%d", __func__, msg);
+
+    if (msg != CAMERA_ALGORITHM_MSG_IPC_ERROR) {
+        LOGE("@%s, receive msg:%d, not CAMERA_ALGORITHM_MSG_IPC_ERROR", __func__, msg);
+        return;
+    }
+
+    std::lock_guard<std::mutex> l(mIPCStatusMutex);
+    mIPCStatus = false;
+
+    if (mErrCb) {
+        camera_msg_data_t data = {CAMERA_IPC_ERROR, {0}};
+        mErrCb->notify(mErrCb, data);
+    } else {
+        LOGE("@%s, mErrCb is nullptr, no device error is sent out", __func__);
+    }
+    LOGE("@%s, receive CAMERA_ALGORITHM_MSG_IPC_ERROR", __func__);
+}
+
+void IntelAlgoClient::returnCallback(const camera_algorithm_callback_ops_t* callback_ops,
+                                     uint32_t req_id,
+                                     uint32_t status,
+                                     int32_t buffer_handle) {
+    LOGIPC("@%s", __func__);
+    CheckError(!callback_ops, VOID_VALUE, "@%s, callback_ops is nullptr", __func__);
+
+    auto s = const_cast<IntelAlgoClient*>(static_cast<const IntelAlgoClient*>(callback_ops));
+    s->callbackHandler(req_id, status, buffer_handle);
+}
+
+void IntelAlgoClient::notifyCallback(const struct camera_algorithm_callback_ops* callback_ops,
+                                     camera_algorithm_error_msg_code_t msg) {
+    LOGIPC("@%s", __func__);
+    CheckError(!callback_ops, VOID_VALUE, "@%s, callback_ops is nullptr", __func__);
+
+    auto s = const_cast<IntelAlgoClient*>(static_cast<const IntelAlgoClient*>(callback_ops));
+    s->notifyHandler((uint32_t)msg);
+}
+
+IntelAlgoClient::Runner::Runner(IPC_GROUP group, cros::CameraAlgorithmBridge* bridge):
+    mGroup(group),
+    mBridge(bridge),
+    mIsCallbacked(false),
+    mCbResult(true),
+    mInitialized(false) {
+    LOGIPC("@%s, group:%d", __func__, mGroup);
+
+    pthread_condattr_t attr;
+    int ret = pthread_condattr_init(&attr);
+    if (ret != 0) {
+        LOGE("@%s, call pthread_condattr_init fails, ret:%d", __func__, ret);
+        pthread_condattr_destroy(&attr);
+        return;
+    }
+
+    ret = pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
+    if (ret != 0) {
+        LOGE("@%s, call pthread_condattr_setclock fails, ret:%d", __func__, ret);
+        pthread_condattr_destroy(&attr);
+        return;
+    }
+
+    ret = pthread_cond_init(&mCbCond, &attr);
+    if (ret != 0) {
+        LOGE("@%s, call pthread_cond_init fails, ret:%d", __func__, ret);
+        pthread_condattr_destroy(&attr);
+        return;
+    }
+
+    pthread_condattr_destroy(&attr);
+
+    ret = pthread_mutex_init(&mCbLock, nullptr);
+    CheckError(ret != 0, VOID_VALUE, "@%s, call pthread_mutex_init fails, ret:%d", __func__, ret);
+
+    mInitialized = true;
+}
+
+IntelAlgoClient::Runner::~Runner() {
+    LOGIPC("@%s, group:%d", __func__, mGroup);
+
+    int ret = pthread_cond_destroy(&mCbCond);
+    if (ret != 0) {
+        LOGE("@%s, call pthread_cond_destroy fails, ret:%d", __func__, ret);
+    }
+
+    ret = pthread_mutex_destroy(&mCbLock);
+    if (ret != 0) {
+        LOGE("@%s, call pthread_mutex_destroy fails, ret:%d", __func__, ret);
+    }
+}
+
+int IntelAlgoClient::Runner::requestSync(IPC_CMD cmd, int32_t bufferHandle) {
+    LOGIPC("@%s, cmd:%d:%s, group:%d, bufferHandle:%d, mInitialized:%d",
+          __func__, cmd, IntelAlgoIpcCmdToString(cmd), mGroup, bufferHandle, mInitialized);
+    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
+
+    std::lock_guard<std::mutex> lck(mMutex);
+
+    std::vector<uint8_t> reqHeader(IPC_REQUEST_HEADER_USED_NUM);
+    reqHeader[0] = IPC_MATCHING_KEY;
+
+    // cmd is for request id, no duplicate command will be issued at any given time.
+    mBridge->Request(cmd, reqHeader, bufferHandle);
+    int ret = waitCallback();
+    CheckError((ret != OK), UNKNOWN_ERROR, "@%s, call waitCallback fail", __func__);
+
+    LOGIPC("@%s, cmd:%d:%s, group:%d, mCbResult:%d, done!",
+          __func__, cmd, IntelAlgoIpcCmdToString(cmd), mGroup, mCbResult);
+
+    // check callback result
+    CheckError((mCbResult != true), UNKNOWN_ERROR, "@%s, callback fail", __func__);
+
+    return OK;
+}
+
+void IntelAlgoClient::Runner::callbackHandler(uint32_t status, int32_t buffer_handle) {
+    LOGIPC("@%s, group:%d, status:%d, buffer_handle:%d", __func__, mGroup, status, buffer_handle);
+    if (status != 0) {
+        LOGE("@%s, group:%d, status:%d, buffer_handle:%d", __func__, mGroup, status, buffer_handle);
+    }
+    mCbResult = status != 0 ? false : true;
+
+    pthread_mutex_lock(&mCbLock);
+    mIsCallbacked = true;
+    int ret = pthread_cond_signal(&mCbCond);
+    pthread_mutex_unlock(&mCbLock);
+
+    CheckError(ret != 0, VOID_VALUE,
+               "@%s, group:%d, call pthread_cond_signal fails, ret:%d", __func__, mGroup, ret);
+}
+
+int IntelAlgoClient::Runner::waitCallback() {
+    LOGIPC("@%s, group:%d", __func__, mGroup);
+
+    nsecs_t startTime = CameraUtils::systemTime();
+
+    pthread_mutex_lock(&mCbLock);
+    if (!mIsCallbacked) {
+        int ret = 0;
+        struct timespec ts = {0, 0};
+        clock_gettime(CLOCK_MONOTONIC, &ts);
+        ts.tv_sec += 5;  // 5s timeout
+
+        while (!mIsCallbacked && !ret) {
+            ret = pthread_cond_timedwait(&mCbCond, &mCbLock, &ts);
+        }
+        if (ret != 0) {
+            LOGE("@%s, group:%d, call pthread_cond_timedwait fail, ret:%d, it takes %" PRId64 "ms",
+                  __func__, mGroup, ret, (CameraUtils::systemTime() - startTime) / 1000000);
+            pthread_mutex_unlock(&mCbLock);
+            return UNKNOWN_ERROR;
+        }
+    }
+    mIsCallbacked = false;
+    pthread_mutex_unlock(&mCbLock);
+
+    LOGIPC("@%s: group:%d, it takes %" PRId64 "ms", __func__,
+          mGroup, (CameraUtils::systemTime() - startTime) / 1000000);
+
+    return OK;
+}
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.h
new file mode 100644
index 000000000000..cb536faacd7e
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.h
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <pthread.h>
+
+#include <mutex>
+#include <memory>
+#include <string>
+#include <unordered_map>
+
+#include "modules/sandboxing/IPCCommon.h"
+#include "cros-camera/camera_algorithm_bridge.h"
+#include "base/bind.h"
+#include "base/callback.h"
+#include "CameraLog.h"
+#include "Parameters.h"
+
+namespace icamera {
+class IntelAlgoClient : public camera_algorithm_callback_ops_t {
+ public:
+    IntelAlgoClient();
+    virtual ~IntelAlgoClient();
+
+    bool isInitialized();
+    bool isIPCFine();
+
+    // when IPC error happens, device error
+    // will be sent out via the camera_callback_ops_t which belongs to CameraHal.
+    // before the CameraHal be terminated, set nullptr in the function.
+    void registerErrorCallback(const camera_callback_ops_t* errCb);
+
+    int allocateShmMem(const std::string& name, int size, int* fd, void** addr);
+    void releaseShmMem(const std::string& name, int size, int fd, void* addr);
+
+    int requestSync(IPC_CMD cmd, int32_t bufferHandle);
+    int requestSync(IPC_CMD cmd);
+
+    int32_t registerBuffer(int bufferFd, void* addr);
+    void deregisterBuffer(int32_t bufferHandle);
+    int32_t registerGbmBuffer(int bufferFd);
+    void deregisterGbmBuffer(int32_t bufferHandle);
+    int32_t getBufferHandle(void* addr);
+
+ private:
+    int waitCallback();
+
+    void callbackHandler(uint32_t req_id, uint32_t status, int32_t buffer_handle);
+    void notifyHandler(uint32_t msg);
+
+    // when the request is done, the callback will be received.
+    static void returnCallback(const camera_algorithm_callback_ops_t* callback_ops,
+                               uint32_t req_id,
+                               uint32_t status,
+                               int32_t buffer_handle);
+    // when IPC error happens in the bridge, notifyCallback will be called.
+    static void notifyCallback(const struct camera_algorithm_callback_ops* callback_ops,
+                               camera_algorithm_error_msg_code_t msg);
+
+ private:
+    const camera_callback_ops_t* mErrCb;
+
+    std::unique_ptr<cros::CameraAlgorithmBridge> mBridge;
+
+    base::Callback<void(uint32_t, uint32_t, int32_t)> mCallback;
+    base::Callback<void(uint32_t)> mNotifyCallback;
+    bool mIPCStatus;  // true: no error happens, false: error happens
+    std::mutex mIPCStatusMutex;  // the mutex for mIPCStatus
+
+    std::unordered_map<void*, int32_t> mShmMap;  // <addr in client, server handle in server>
+    std::mutex mShmMapMutex;  // the mutex for mShmMap
+
+    bool mInitialized;
+
+ private:
+    class Runner {
+     public:
+        Runner(IPC_GROUP group, cros::CameraAlgorithmBridge* bridge);
+        virtual ~Runner();
+        int requestSync(IPC_CMD cmd, int32_t bufferHandle);
+        void callbackHandler(uint32_t status, int32_t buffer_handle);
+
+     private:
+        int waitCallback();
+
+     private:
+        IPC_GROUP mGroup;
+        cros::CameraAlgorithmBridge* mBridge;
+        pthread_mutex_t mCbLock;
+        pthread_cond_t mCbCond;
+        bool mIsCallbacked;
+        bool mCbResult;  // true: success, false: fail
+
+        bool mInitialized;
+
+        std::mutex mMutex;  // the mutex for the public method
+    };
+
+    std::unique_ptr<Runner> mRunner[IPC_GROUP_NUM];
+};
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.cpp
new file mode 100644
index 000000000000..f1a1d4c1553d
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.cpp
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelAlgoCommon"
+
+#include "modules/sandboxing/client/IntelAlgoCommon.h"
+
+#include "CameraLog.h"
+#include "PlatformData.h"
+#include <string>
+#include <vector>
+
+namespace icamera {
+IntelAlgoCommon::IntelAlgoCommon() {
+    LOGIPC("@%s", __func__);
+
+    mClient = PlatformData::getIntelAlgoClient();
+    LOGIPC("@%s, mClient:%p", __func__, mClient);
+}
+
+IntelAlgoCommon::~IntelAlgoCommon() {
+    LOGIPC("@%s", __func__);
+}
+
+bool IntelAlgoCommon::allocShmMem(const std::string& name, int size, ShmMemInfo* shm) {
+    LOGIPC("@%s", __func__);
+    CheckError(mClient == nullptr, false, "@%s, mClient is nullptr", __func__);
+
+    shm->mName = name;
+    shm->mSize = size;
+    int ret = mClient->allocateShmMem(shm->mName, shm->mSize, &shm->mFd, &shm->mAddr);
+    CheckError((ret != OK), false, "@%s, call allocateShmMem fail", __func__);
+
+    shm->mHandle = mClient->registerBuffer(shm->mFd, shm->mAddr);
+    CheckError((shm->mHandle < 0), false, "@%s, call mBridge->RegisterBuffer fail", __func__);
+
+    return true;
+}
+
+int32_t IntelAlgoCommon::registerGbmBuffer(int bufferFd) {
+    LOGIPC("@%s, bufferFd:%d", __func__, bufferFd);
+    CheckError(mClient == nullptr, -1, "@%s, mClient is nullptr", __func__);
+
+    return mClient->registerGbmBuffer(bufferFd);
+}
+
+void IntelAlgoCommon::deregisterGbmBuffer(int32_t bufferHandle) {
+    LOGIPC("@%s, bufferHandle:%d", __func__, bufferHandle);
+    CheckError(mClient == nullptr, VOID_VALUE, "@%s, mClient is nullptr", __func__);
+
+    mClient->deregisterGbmBuffer(bufferHandle);
+}
+
+bool IntelAlgoCommon::requestSync(IPC_CMD cmd, int32_t handle) {
+    LOGIPC("@%s", __func__);
+    CheckError(mClient == nullptr, false, "@%s, mClient is nullptr", __func__);
+
+    return mClient->requestSync(cmd, handle) == OK ? true : false;
+}
+
+bool IntelAlgoCommon::requestSync(IPC_CMD cmd) {
+    LOGIPC("@%s", __func__);
+    CheckError(mClient == nullptr, false, "@%s, mClient is nullptr", __func__);
+
+    return mClient->requestSync(cmd) == OK ? true : false;
+}
+
+void IntelAlgoCommon::freeShmMem(const ShmMemInfo& shm) {
+    LOGIPC("@%s, mHandle:%d, mFd:%d, mName:%s, mSize:%d, mAddr:%p",
+        __func__, shm.mHandle, shm.mFd, shm.mName.c_str(), shm.mSize, shm.mAddr);
+    CheckError(mClient == nullptr, VOID_VALUE, "@%s, mClient is nullptr", __func__);
+    if (shm.mHandle < 0 || shm.mFd < 0) {
+        LOGE("@%s, mHandle:%d, mFd:%d, one of them < 0", __func__, shm.mHandle, shm.mFd);
+        return;
+    }
+
+    mClient->deregisterBuffer(shm.mHandle);
+    mClient->releaseShmMem(shm.mName, shm.mSize, shm.mFd, shm.mAddr);
+}
+
+bool IntelAlgoCommon::allocateAllShmMems(std::vector<ShmMem>* mems) {
+    LOGIPC("@%s", __func__);
+
+    for (auto& it : *mems) {
+        ShmMemInfo* mem = it.mem;
+        mem->mName = it.name;
+        mem->mSize = it.size;
+        bool ret = allocShmMem(mem->mName, mem->mSize, mem);
+        CheckError(!ret, false, "@%s, allocShmMem fails, name:%s, size:%d", __func__,
+                   mem->mName.c_str(), mem->mSize);
+        it.allocated = true;
+    }
+
+    return true;
+}
+
+void IntelAlgoCommon::releaseAllShmMems(const std::vector<ShmMem>& mems) {
+    LOGIPC("@%s", __func__);
+
+    for (auto& it : mems) {
+        if (it.allocated) {
+            freeShmMem(*it.mem);
+        }
+    }
+}
+
+int32_t IntelAlgoCommon::getShmMemHandle(void* addr) {
+    CheckError(mClient == nullptr, -1, "@%s, mClient is nullptr", __func__);
+    return mClient->getBufferHandle(addr);
+}
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.h
new file mode 100644
index 000000000000..43c9d47bea84
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "IntelAlgoClient.h"
+
+#include <string>
+#include <vector>
+
+namespace icamera {
+typedef struct ShmMemInfo {
+    std::string mName;
+    int mSize;
+    int mFd;
+    void* mAddr;
+    int32_t mHandle;
+    ShmMemInfo():
+        mName(""),
+        mSize(0),
+        mFd(-1),
+        mAddr(nullptr),
+        mHandle(-1) {}
+}ShmMemInfo;
+
+typedef struct ShmMem {
+    std::string name;
+    int size;
+    ShmMemInfo* mem;
+    bool allocated;
+} ShmMem;
+
+class IntelAlgoCommon {
+ public:
+    IntelAlgoCommon();
+    virtual ~IntelAlgoCommon();
+
+    bool allocShmMem(const std::string& name, int size, ShmMemInfo* shm);
+    int32_t registerGbmBuffer(int bufferFd);
+    void deregisterGbmBuffer(int32_t bufferHandle);
+    bool requestSync(IPC_CMD cmd, int32_t handle);
+    bool requestSync(IPC_CMD cmd);
+    void freeShmMem(const ShmMemInfo& shm);
+
+    bool allocateAllShmMems(std::vector<ShmMem>* mems);
+    void releaseAllShmMems(const std::vector<ShmMem>& mems);
+
+    int32_t getShmMemHandle(void* addr);
+
+ private:
+    IntelAlgoClient* mClient;
+};
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.cpp
new file mode 100644
index 000000000000..bfb8f49fd377
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.cpp
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelCmc"
+
+#include "modules/sandboxing/client/IntelCmc.h"
+
+#include <string>
+
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+IntelCmc::IntelCmc():
+    mInitialized(false) {
+    LOGIPC("@%s", __func__);
+
+    mHandle = nullptr;
+    mCmcRemoteHandle = reinterpret_cast<uintptr_t>(nullptr);
+
+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
+    std::string initName = "/cmcInit" + std::to_string(personal) + "Shm";
+    std::string deinitName = "/cmcDeinit" + std::to_string(personal) + "Shm";
+
+    mMems = {{initName.c_str(), sizeof(cmc_init_params), &mMemInit, false},
+             {deinitName.c_str(), sizeof(cmc_deinit_params), &mMemDeinit, false}};
+
+    bool success = mCommon.allocateAllShmMems(&mMems);
+    if (!success) {
+        mCommon.releaseAllShmMems(mMems);
+        return;
+    }
+
+    LOGIPC("@%s, done", __func__);
+    mInitialized = true;
+}
+
+IntelCmc::~IntelCmc() {
+    LOGIPC("@%s", __func__);
+    mCommon.releaseAllShmMems(mMems);
+}
+
+bool IntelCmc::init(const ia_binary_data *aiqbData, const ia_binary_data *nvmData) {
+    LOGIPC("@%s, aiqbData:%p, nvmData:%p", __func__, aiqbData, nvmData);
+    CheckError(nvmData, false, "@%s, nvmData should be nullptr", __func__);
+
+    CheckError(mInitialized == false, false, "@%s, mInitialized is false", __func__);
+    CheckError(!aiqbData, false, "@%s, aiqbData is nullptr", __func__);
+    CheckError(!aiqbData->data, false, "@%s, aiqbData->data is nullptr", __func__);
+    CheckError(aiqbData->size == 0, false, "@%s, aiqbData->size is 0", __func__);
+
+    cmc_init_params *params = static_cast<cmc_init_params*>(mMemInit.mAddr);
+
+    bool ret = mIpc.clientFlattenInit(*aiqbData, params);
+    CheckError(ret == false, false, "@%s, clientFlattenInit fails", __func__);
+
+    ret = mCommon.requestSync(IPC_CMC_INIT, mMemInit.mHandle);
+    CheckError(ret == false, false, "@%s, requestSync fails", __func__);
+
+    ret = mIpc.clientUnflattenInit(*params, &mHandle, &mCmcRemoteHandle);
+    CheckError(ret == false, false, "@%s, clientUnflattenInit fails", __func__);
+
+    return true;
+}
+
+ia_cmc_t* IntelCmc::getCmc() const {
+    LOGIPC("@%s, mHandle:%p", __func__, mHandle);
+
+    return mHandle;
+}
+
+uintptr_t IntelCmc::getCmcHandle() const {
+    LOGIPC("@%s", __func__);
+
+    return mCmcRemoteHandle;
+}
+
+void IntelCmc::deinit() {
+    LOGIPC("@%s, mCmc:%p", __func__, mHandle);
+
+    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
+    CheckError(!mHandle, VOID_VALUE, "@%s, mHandle is nullptr", __func__);
+    CheckError(reinterpret_cast<ia_cmc_t*>(mCmcRemoteHandle) == nullptr,
+               VOID_VALUE, "@%s, mCmcRemoteHandle is nullptr", __func__);
+
+    cmc_deinit_params* params = static_cast<cmc_deinit_params*>(mMemDeinit.mAddr);
+    params->cmc_handle = mCmcRemoteHandle;
+
+    bool ret = mCommon.requestSync(IPC_CMC_DEINIT, mMemDeinit.mHandle);
+    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
+    mHandle = nullptr;
+    mCmcRemoteHandle = reinterpret_cast<uintptr_t>(nullptr);
+}
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.h
new file mode 100644
index 000000000000..800ba150a7fb
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <ia_cmc_parser.h>
+
+#include <vector>
+
+#include "IntelAlgoCommon.h"
+#include "modules/sandboxing/IPCIntelCmc.h"
+
+namespace icamera {
+class IntelCmc {
+ public:
+    IntelCmc();
+    virtual ~IntelCmc();
+
+    // the nvmData must be nullptr currently
+    bool init(const ia_binary_data *aiqbData, const ia_binary_data *nvmData);
+
+    ia_cmc_t* getCmc() const;
+    uintptr_t getCmcHandle() const;
+
+    void deinit();
+
+ private:
+    IPCIntelCmc mIpc;
+    IntelAlgoCommon mCommon;
+
+    bool mInitialized;
+
+    ShmMemInfo mMemInit;
+    ShmMemInfo mMemDeinit;
+
+    std::vector<ShmMem> mMems;
+
+    ia_cmc_t* mHandle;  // it points to the SHM
+
+    // the pointer is in another process.
+    // because the ia_aiq_init() needs the cmc pointer,
+    // so keep the pinter in the IntelCmc and pass it aiq when init aiq.
+    // at the same time, it will be used when deinit the cmc.
+    uintptr_t mCmcRemoteHandle;
+};
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.cpp
new file mode 100644
index 000000000000..e008735d710c
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.cpp
@@ -0,0 +1,356 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "ClientIntelDvs"
+
+#include "modules/sandboxing/client/IntelDvs.h"
+
+#include <string>
+
+#include "CameraLog.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+IntelDvs::IntelDvs():
+    mInitialized(false) {
+    LOGIPC("@%s", __func__);
+
+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
+    std::string initName = "/dvsInit" + std::to_string(personal) + SHM_NAME;
+    std::string deinitName = "/dvsDeinit" + std::to_string(personal) + SHM_NAME;
+    std::string configName = "/dvsConfig" + std::to_string(personal) + SHM_NAME;
+    std::string setNonBlankRatioName = "/dvsSetNonBlankRatio" +
+                                       std::to_string(personal) + SHM_NAME;
+    std::string setDigitalZoomModeName = "/dvsSetDigitalZoomModeName" +
+                                         std::to_string(personal) + SHM_NAME;
+    std::string setDigitalZoomRegionName = "/dvsSetDigitalZoomRegionName" +
+                                           std::to_string(personal) + SHM_NAME;
+    std::string setDigitalZoomCoordinateName = "/dvsSetDigitalZoomCoordinateName" +
+                                              std::to_string(personal) + SHM_NAME;
+    std::string setDigitalZoomMagnitudeName = "/dvsSetDigitalZoomMagnitudeName" +
+                                              std::to_string(personal) + SHM_NAME;
+    std::string freeMorphTableName = "/dvsFreeMorphTableName" +
+                                     std::to_string(personal) + SHM_NAME;
+    std::string allocateMorphTalbeName = "/dvsAllocateMorphTalbeName" +
+                                         std::to_string(personal) + SHM_NAME;
+    std::string getMorphTableName = "/dvsGetMorphTableName" +
+                                    std::to_string(personal) + SHM_NAME;
+    std::string setStatisticsName = "/dvsSetStatisticsName" +
+                                    std::to_string(personal) + SHM_NAME;
+    std::string executeName = "/dvsExecuteName" + std::to_string(personal) + SHM_NAME;
+    std::string getImageTransformationName = "/dvsGetImageTransformationName" +
+                                             std::to_string(personal) + SHM_NAME;
+
+    mMems = {{initName.c_str(), sizeof(DvsInitParams), &mMemInit, false},
+             {deinitName.c_str(), sizeof(DvsDeinitParams), &mMemDeinit, false},
+             {configName.c_str(), sizeof(DvsConfigParams), &mMemConfig, false},
+             {setNonBlankRatioName.c_str(),
+              sizeof(DvsNoneBlankRatioParams), &mMemNonBlankRatio, false},
+             {setDigitalZoomModeName.c_str(), sizeof(DvsDigitalZoomMode), &mMemZoomMode, false},
+             {setDigitalZoomRegionName.c_str(),
+              sizeof(DvsDigitalZoomRegion), &mMemZoomRegion, false},
+             {setDigitalZoomCoordinateName.c_str(),
+              sizeof(DvsDigitalZoomCoordinate), &mMemZoomCoordinate, false},
+             {setDigitalZoomMagnitudeName.c_str(),
+              sizeof(DvsDigitalZoomMagnitude), &mMemZoomMagnitude, false},
+             {freeMorphTableName.c_str(), sizeof(DvsFreeMorphParams), &mMemFreeMorph, false},
+             {allocateMorphTalbeName.c_str(), sizeof(DvsMorphParams), &mMemAllocateMorph, false},
+             {getMorphTableName.c_str(), sizeof(DvsMorphParams), &mMemGetMorphTable, false},
+             {setStatisticsName.c_str(), sizeof(DvsStatistcs), &mMemStatistics, false},
+             {executeName.c_str(), sizeof(DvsExecute), &mMemExecute, false},
+             {getImageTransformationName.c_str(),
+              sizeof(DvsImageTransformation), &mMemImageTransfor, false},
+            };
+
+    bool success = mCommon.allocateAllShmMems(&mMems);
+    if (!success) {
+        mCommon.releaseAllShmMems(mMems);
+        return;
+    }
+
+    LOGIPC("@%s, done", __func__);
+    mInitialized = true;
+}
+
+IntelDvs::~IntelDvs() {
+    LOGIPC("@%s", __func__);
+    mCommon.releaseAllShmMems(mMems);
+}
+
+ia_err IntelDvs::init(const ia_binary_data &aiqTuningBinary,
+                      const ia_cmc_t *cmc, ia_dvs_state **dvsHandle) {
+    LOGIPC("@%s", __func__);
+    CheckError(mInitialized == false, ia_err_none, "@%s, mInitialized is false", __func__);
+    CheckError(aiqTuningBinary.data == nullptr, ia_err_none,
+               "@%s, aiqTuningBinary.data is nullptr", __func__);
+    CheckError(aiqTuningBinary.size == 0, ia_err_none,
+               "@%s, aiqTuningBinary.size is 0", __func__);
+    CheckError(dvsHandle == nullptr, ia_err_none, "@%s, dvsHandle is nullptr", __func__);
+
+    bool ret = mIpc.clientFlattenInit(mMemInit.mAddr, mMemInit.mSize, &aiqTuningBinary, cmc);
+    CheckError(ret == false, ia_err_none, "@%s, clientFlattenInit fails", __func__);
+
+    ret = mCommon.requestSync(IPC_DVS_INIT, mMemInit.mHandle);
+    CheckError(ret == false, ia_err_none, "@%s, requestSync fails", __func__);
+
+    ret = mIpc.clientUnflattenInit(mMemInit.mAddr, mMemInit.mSize, dvsHandle);
+    CheckError(ret == false, ia_err_none, "@%s, clientUnflattenInit fails", __func__);
+    return ia_err_none;
+}
+
+void IntelDvs::deinit(ia_dvs_state *dvsHandle) {
+    LOGIPC("@%s, dvsHandle:%p", __func__, dvsHandle);
+    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
+    CheckError(dvsHandle == nullptr, VOID_VALUE, "@%s, dvsHandle is nullptr", __func__);
+
+    bool ret = mIpc.clientFlattenDeinit(mMemDeinit.mAddr, mMemDeinit.mSize, dvsHandle);
+    CheckError(ret == false, VOID_VALUE, "@%s, clientFlattenDeinit fails", __func__);
+
+    ret = mCommon.requestSync(IPC_DVS_DEINIT, mMemDeinit.mHandle);
+    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
+}
+
+ia_err IntelDvs::config(ia_dvs_state *dvsHandle, ia_dvs_configuration *config, float zoomRatio) {
+    LOGIPC("@%s, dvsHandle:%p, config:%p, zoomRatio:%f", __func__, dvsHandle, config, zoomRatio);
+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
+    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
+    CheckError(config == nullptr, ia_err_general, "@%s, config is nullptr", __func__);
+
+    bool ret = mIpc.clientFlattenConfig(mMemConfig.mAddr, mMemConfig.mSize,
+                                        dvsHandle, config, zoomRatio);
+    CheckError(ret == false, ia_err_general, "@%s, clientFlattenConfig fails", __func__);
+
+    ret = mCommon.requestSync(IPC_DVS_CONFIG, mMemConfig.mHandle);
+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
+
+    return ia_err_none;
+}
+
+ia_err IntelDvs::setNonBlankRatio(ia_dvs_state *dvsHandle, float nonBlankingRatio) {
+    LOGIPC("@%s, dvsHandle:%p, nonBlankingRatio:%f", __func__, dvsHandle, nonBlankingRatio);
+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
+    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
+
+    bool ret = mIpc.clientFlattenNoneBlanckRation(mMemNonBlankRatio.mAddr,
+                                                  mMemNonBlankRatio.mSize,
+                                                  dvsHandle, nonBlankingRatio);
+    CheckError(ret == false, ia_err_general,
+               "@%s, clientFlattenNoneBlanckRation fails", __func__);
+
+    ret = mCommon.requestSync(IPC_DVS_SET_NONE_BLANK_RATION, mMemNonBlankRatio.mHandle);
+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
+
+    return ia_err_none;
+}
+
+ia_err IntelDvs::setDigitalZoomMode(ia_dvs_state *dvsHandle, ia_dvs_zoom_mode zoomMode) {
+    LOGIPC("@%s, dvsHandle:%p, zoomMode:%f", __func__, dvsHandle, zoomMode);
+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
+    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
+
+    bool ret = mIpc.clientFlattenDigitalZoomMode(mMemZoomMode.mAddr,
+                                                 mMemZoomMode.mSize, dvsHandle, zoomMode);
+    CheckError(ret == false, ia_err_general,
+               "@%s, clientFlattenDigitalZoomMode fails", __func__);
+
+    ret = mCommon.requestSync(IPC_DVS_SET_DIGITAL_ZOOM_MODE, mMemZoomMode.mHandle);
+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
+
+    return ia_err_none;
+}
+
+ia_err IntelDvs::setDigitalZoomRegion(ia_dvs_state *dvsHandle, ia_rectangle *zoomRegion) {
+    LOGIPC("@%s, dvsHandle:%p, zoomRegion:%p", __func__, dvsHandle, zoomRegion);
+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
+    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
+    CheckError(zoomRegion == nullptr, ia_err_general, "@%s, zoomRegion is nullptr", __func__);
+
+    bool ret = mIpc.clientFlattenDigitalZoomRegion(mMemZoomRegion.mAddr,
+                                                   mMemZoomRegion.mSize,
+                                                   dvsHandle, zoomRegion);
+    CheckError(ret == false, ia_err_general,
+               "@%s, clientFlattenDigitalZoomRegion fails", __func__);
+
+    ret = mCommon.requestSync(IPC_DVS_SET_DIGITAL_ZOOM_REGION, mMemZoomRegion.mHandle);
+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
+
+    return ia_err_none;
+}
+
+ia_err IntelDvs::setDigitalZoomCoordinate(ia_dvs_state *dvsHandle,
+                                          ia_coordinate *zoomCoordinate) {
+    LOGIPC("@%s, dvsHandle:%p, zoomCoordinate:%p", __func__, dvsHandle, zoomCoordinate);
+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
+    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
+    CheckError(zoomCoordinate == nullptr, ia_err_general,
+               "@%s, zoomCoordinate is nullptr", __func__);
+
+    bool ret = mIpc.clientFlattenDigitalZoomCoordinate(mMemZoomCoordinate.mAddr,
+                                                       mMemZoomCoordinate.mSize,
+                                                       dvsHandle, zoomCoordinate);
+    CheckError(ret == false, ia_err_general,
+               "@%s, clientFlattenDigitalZoomCoordinate fails", __func__);
+
+    ret = mCommon.requestSync(IPC_DVS_SET_DIGITAL_ZOOM_COORDINATE, mMemZoomCoordinate.mHandle);
+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
+
+    return ia_err_none;
+}
+
+ia_err IntelDvs::setDigitalZoomMagnitude(ia_dvs_state *dvsHandle, float zoomRatio) {
+    LOGIPC("@%s, dvsHandle:%p, zoomRatio:%f", __func__, dvsHandle, zoomRatio);
+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
+    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
+
+    bool ret = mIpc.clientFlattenDigitalZoomMagnitude(mMemZoomMagnitude.mAddr,
+                                                      mMemZoomMagnitude.mSize,
+                                                      dvsHandle, zoomRatio);
+    CheckError(ret == false, ia_err_general,
+               "@%s, clientFlattenDigitalZoomMagnitude fails", __func__);
+
+    ret = mCommon.requestSync(IPC_DVS_SET_DIGITAL_ZOOM_MAGNITUDE, mMemZoomMagnitude.mHandle);
+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
+
+    return ia_err_none;
+}
+
+void IntelDvs::freeMorphTable(ia_dvs_state *dvsHandle, ia_dvs_morph_table *morphTable) {
+    LOGIPC("@%s, dvsHandle%p, morphTable:%p", __func__, dvsHandle, morphTable);
+    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
+    CheckError(dvsHandle == nullptr, VOID_VALUE, "@%s, dvsHandle is nullptr", __func__);
+    CheckError(morphTable == nullptr, VOID_VALUE, "@%s, morphTable is nullptr", __func__);
+
+    bool ret = mIpc.clientFlattenFreeMorphTable(mMemFreeMorph.mAddr, mMemFreeMorph.mSize,
+                                                dvsHandle, morphTable);
+    CheckError(ret == false, VOID_VALUE, "@%s, clientFlattenFreeMorphTable fails", __func__);
+
+    ret = mCommon.requestSync(IPC_DVS_FREE_MORPH_TABLE, mMemFreeMorph.mHandle);
+    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
+}
+
+ia_dvs_morph_table *IntelDvs::allocateMorphTalbe(ia_dvs_state *dvsHandle) {
+    LOGIPC("@%s, dvsHandle:%p", __func__, dvsHandle);
+    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
+    CheckError(dvsHandle == nullptr, nullptr, "@%s, dvsHandle is nullptr", __func__);
+
+    bool ret = mIpc.clientFlattenAllocateMorphTable(mMemAllocateMorph.mAddr,
+                                                    mMemAllocateMorph.mSize, dvsHandle);
+    CheckError(ret == false, nullptr, "@%s, clientFlattenAllocateMorphTable fails", __func__);
+
+    ret = mCommon.requestSync(IPC_DVS_ALLOCATE_MORPH_TABLE, mMemAllocateMorph.mHandle);
+    CheckError(ret == false, nullptr, "@%s, requestSync fails", __func__);
+
+    ia_dvs_morph_table *morphTable = nullptr;
+    ret = mIpc.clientUnflattenAllocateMorphTalbe(mMemAllocateMorph.mAddr,
+                                                 mMemAllocateMorph.mSize, &morphTable);
+    CheckError(ret == false, nullptr, "@%s, clientUnflattenAllocateMorphTalbe fails", __func__);
+
+    return morphTable;
+}
+
+int IntelDvs::getMorphTable(ia_dvs_state *dvsHandle,
+                            ia_dvs_morph_table *morphTable, DvsResult *result) {
+    LOGIPC("@%s, dvsHandle:%p, morphTable:%p", __func__, dvsHandle, morphTable);
+    CheckError(mInitialized == false, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
+    CheckError(dvsHandle == nullptr, UNKNOWN_ERROR, "@%s, dvsHandle is nullptr", __func__);
+    CheckError(morphTable == nullptr, UNKNOWN_ERROR, "@%s, morphTable is nullptr", __func__);
+    CheckError(result == nullptr, UNKNOWN_ERROR, "@%s, result is nullptr", __func__);
+
+    bool ret = mIpc.clientFlattenGetMorphTable(mMemGetMorphTable.mAddr,
+                                               mMemGetMorphTable.mSize,
+                                               dvsHandle, morphTable);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenGetMorphTable fails", __func__);
+
+    ret = mCommon.requestSync(IPC_DVS_GET_MORPH_TABLE, mMemGetMorphTable.mHandle);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
+
+    ia_dvs_morph_table *morphTableTmp = nullptr;
+    ret = mIpc.clientUnflattenGetMorphTalbe(mMemGetMorphTable.mAddr,
+                                            mMemGetMorphTable.mSize, &morphTableTmp);
+    CheckError(ret == false, UNKNOWN_ERROR,
+               "@%s, clientUnflattenGetMorphTalbe fails", __func__);
+
+    int err = DvsResult::deepCopyDvsResults(*morphTableTmp, &result->mMorphTable);
+    CheckError(err != OK, UNKNOWN_ERROR, "@%s, deepCopyDvsResults fails", __func__);
+
+    return OK;
+}
+
+ia_err IntelDvs::setStatistics(ia_dvs_state *dvsHandle,
+                               const ia_dvs_statistics *statistics,
+                               const ia_aiq_ae_results *aeResults,
+                               const ia_aiq_af_results *afResults,
+                               const ia_aiq_sensor_events *sensorEvents,
+                               uint64_t frameReadoutStart,
+                               uint64_t frameReadoutEnd) {
+    LOGIPC("@%s, dvsHandle:%p", __func__, dvsHandle);
+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
+    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
+
+    bool ret = mIpc.clientFlattenSetStatistics(mMemStatistics.mAddr, mMemStatistics.mSize,
+                                               dvsHandle, statistics, aeResults,
+                                               afResults, sensorEvents,
+                                               frameReadoutStart, frameReadoutEnd);
+    CheckError(ret == false, ia_err_general, "@%s, clientFlattenSetStatistics fails", __func__);
+
+    ret = mCommon.requestSync(IPC_DVS_SET_STATISTICS, mMemStatistics.mHandle);
+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
+
+    return ia_err_none;
+}
+
+ia_err IntelDvs::execute(ia_dvs_state *dvsHandle, uint16_t focusPosition) {
+    LOGIPC("@%s, dvsHandle:%p", __func__, dvsHandle);
+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
+    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
+
+    bool ret = mIpc.clientFlattenExecute(mMemExecute.mAddr, mMemExecute.mSize,
+                                         dvsHandle, focusPosition);
+    CheckError(ret == false, ia_err_general, "@%s, clientFlattenGetMorphTable fails", __func__);
+
+    ret = mCommon.requestSync(IPC_DVS_EXECUTE, mMemExecute.mHandle);
+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
+
+    return ia_err_none;
+}
+
+ia_err IntelDvs::getImageTransformation(ia_dvs_state *dvsHandle,
+                                        ia_dvs_image_transformation *imageTransformation) {
+    LOGIPC("@%s, dvsHandle:%p", __func__, dvsHandle);
+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
+    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
+    CheckError(imageTransformation == nullptr, ia_err_general,
+                "@%s, imageTransformation is nullptr", __func__);
+
+    bool ret = mIpc.clientFlattenImageTransformation(mMemImageTransfor.mAddr,
+                                                     mMemImageTransfor.mSize, dvsHandle);
+    CheckError(ret == false, ia_err_general,
+               "@%s, clientFlattenImageTransformation fails", __func__);
+
+    ret = mCommon.requestSync(IPC_DVS_GET_IMAGE_TRANSFORMATION, mMemImageTransfor.mHandle);
+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
+
+    ia_dvs_image_transformation *info = nullptr;
+    ret = mIpc.clientUnflattenImageTransformation(mMemGetMorphTable.mAddr,
+                                                  mMemGetMorphTable.mSize, &info);
+    CheckError(ret == false, ia_err_general,
+               "@%s, clientUnflattenImageTransformation fails", __func__);
+
+    MEMCPY_S(imageTransformation, sizeof(ia_dvs_image_transformation),
+             info, sizeof(ia_dvs_image_transformation));
+    return ia_err_none;
+}
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.h
new file mode 100644
index 000000000000..76c1781a9c88
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_dvs.h>
+#include <ia_dvs_types.h>
+#include <ia_isp_bxt.h>
+
+#include <vector>
+
+#include "modules/sandboxing/IPCIntelDvs.h"
+#include "DvsResult.h"
+#include "IntelAlgoCommon.h"
+
+namespace icamera {
+class IntelDvs {
+ public:
+    IntelDvs();
+    virtual ~IntelDvs();
+
+    ia_err init(const ia_binary_data &aiqTuningBinary,
+                const ia_cmc_t *cmc, ia_dvs_state **dvsHandle);
+    void deinit(ia_dvs_state *dvsHandle);
+    ia_err config(ia_dvs_state *dvsHandle, ia_dvs_configuration *config, float zoomRatio);
+    ia_err setNonBlankRatio(ia_dvs_state *dvsHandle, float nonBlankingRatio);
+    ia_err setDigitalZoomMode(ia_dvs_state *dvsHandle, ia_dvs_zoom_mode zoomMode);
+    ia_err setDigitalZoomRegion(ia_dvs_state *dvsHandle, ia_rectangle *zoomRegion);
+    ia_err setDigitalZoomCoordinate(ia_dvs_state *dvsHandle, ia_coordinate *zoomCoordinate);
+    ia_err setDigitalZoomMagnitude(ia_dvs_state *dvsHandle, float zoomRatio);
+    void freeMorphTable(ia_dvs_state *dvsHandle, ia_dvs_morph_table *morphTable);
+    ia_dvs_morph_table *allocateMorphTalbe(ia_dvs_state *dvsHandle);
+    int getMorphTable(ia_dvs_state *dvsHandle,
+                      ia_dvs_morph_table *morphTable, DvsResult *result);
+    ia_err setStatistics(ia_dvs_state *dvsHandle, const ia_dvs_statistics *statistics,
+                         const ia_aiq_ae_results *aeResults, const ia_aiq_af_results *afResults,
+                         const ia_aiq_sensor_events *sensorEvents, uint64_t frameReadoutStart,
+                         uint64_t frameReadoutEnd);
+    ia_err execute(ia_dvs_state *dvsHandle, uint16_t focusPosition);
+    ia_err getImageTransformation(ia_dvs_state *dvsHandle,
+                                  ia_dvs_image_transformation *imageTransformation);
+
+ private:
+    IPCIntelDvs mIpc;
+    IntelAlgoCommon mCommon;
+
+    bool mInitialized;
+
+    ShmMemInfo mMemInit;
+    ShmMemInfo mMemDeinit;
+    ShmMemInfo mMemConfig;
+    ShmMemInfo mMemNonBlankRatio;
+    ShmMemInfo mMemZoomMode;
+    ShmMemInfo mMemZoomRegion;
+    ShmMemInfo mMemZoomCoordinate;
+    ShmMemInfo mMemZoomMagnitude;
+    ShmMemInfo mMemFreeMorph;
+    ShmMemInfo mMemAllocateMorph;
+    ShmMemInfo mMemGetMorphTable;
+    ShmMemInfo mMemStatistics;
+    ShmMemInfo mMemExecute;
+    ShmMemInfo mMemImageTransfor;
+
+    std::vector<ShmMem> mMems;
+};
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.cpp
new file mode 100644
index 000000000000..25ff3f46bda7
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.cpp
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "ClientIntelFaceDetection"
+
+#include "modules/sandboxing/client/IntelFaceDetection.h"
+
+#include <algorithm>
+#include "FaceBase.h"
+
+namespace icamera {
+IntelFaceDetection::IntelFaceDetection() :
+    mInitialized(false) {
+    LOG1("@%s", __func__);
+
+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
+    mMems = {{("/faceDetectionInit" + std::to_string(personal) + "Shm"),
+              sizeof(FaceDetectionInitParams), &mMemInit, false}};
+
+    for (int i = 0; i < MAX_STORE_FACE_DATA_BUF_NUM; i++) {
+        mMems.push_back({("/faceDetectionRun" + std::to_string(i) + std::to_string(personal)
+                         + "Shm"), sizeof(FaceDetectionRunParams), &mMemRunBufs[i], false});
+    }
+
+    bool success = mCommon.allocateAllShmMems(&mMems);
+    if (!success) {
+        LOGE("@%s,Failed to call allocateAllShmMems", __func__);
+        mCommon.releaseAllShmMems(mMems);
+        return;
+    }
+
+    LOG1("@%s, done", __func__);
+    mInitialized = true;
+}
+
+IntelFaceDetection::~IntelFaceDetection() {
+    LOG1("@%s", __func__);
+    mCommon.releaseAllShmMems(mMems);
+}
+
+status_t IntelFaceDetection::init(FaceDetectionInitParams *initParams, int dataSize) {
+    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
+
+    LOG1("@%s, initParams:%p, dataSize:%d", __func__, initParams, dataSize);
+    CheckError(initParams == nullptr, UNKNOWN_ERROR, "@%s, initParams is nullptr", __func__);
+    CheckError(dataSize < static_cast<int>(sizeof(FaceDetectionInitParams)),
+               UNKNOWN_ERROR, "@%s, buffer is small", __func__);
+
+    unsigned int maxFacesNum = std::min(initParams->max_face_num,
+                                        static_cast<unsigned int>(MAX_FACES_DETECTABLE));
+    LOG2("@%s, maxFacesNum:%d", __func__, maxFacesNum);
+
+    FaceDetectionInitParams *params = static_cast<FaceDetectionInitParams*>(mMemInit.mAddr);
+
+    bool ret = mIpc.clientFlattenInit(maxFacesNum, params);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenInit fails", __func__);
+
+    ret = mCommon.requestSync(IPC_FD_INIT, mMemInit.mHandle);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
+
+    return OK;
+}
+
+status_t IntelFaceDetection::deinit() {
+    LOG1("@%s", __func__);
+    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
+
+    bool ret = mCommon.requestSync(IPC_FD_DEINIT);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
+
+    return OK;
+}
+
+FaceDetectionRunParams *IntelFaceDetection::prepareRunBuffer(unsigned int index) {
+    LOG1("@%s", __func__);
+    CheckError(index >= MAX_STORE_FACE_DATA_BUF_NUM, nullptr,
+               "@%s, index is error %d", __func__, index);
+    CheckError(!mInitialized, nullptr, "@%s, mInitialized is false", __func__);
+
+    return static_cast<FaceDetectionRunParams*>(mMemRunBufs[index].mAddr);
+}
+
+status_t IntelFaceDetection::run(FaceDetectionRunParams *runParams, int dataSize, int dmafd) {
+    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
+    CheckError(!runParams, UNKNOWN_ERROR, "@%s,runParams is nullptr", __func__);
+    CheckError(dataSize < static_cast<int>(sizeof(FaceDetectionRunParams)),
+               UNKNOWN_ERROR, "@%s, buffer is small", __func__);
+
+    if (dmafd >= 0) {
+        runParams->bufferHandle = mCommon.registerGbmBuffer(dmafd);
+        CheckError((runParams->bufferHandle < 0), false,
+                   "@%s, call mCommon.registerGbmBuffer", __func__);
+    }
+
+    int32_t runBufHandle = mCommon.getShmMemHandle(static_cast<void *>(runParams));
+    CheckError(runBufHandle < 0, UNKNOWN_ERROR,
+               "@%s, getShmMemHandle fails", __func__, runParams);
+
+    bool ret = mCommon.requestSync(IPC_FD_RUN, runBufHandle);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
+
+    if (dmafd >= 0) {
+        mCommon.deregisterGbmBuffer(runParams->bufferHandle);
+    }
+
+    return OK;
+}
+}  /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.h
new file mode 100644
index 000000000000..a11130205d79
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <vector>
+
+#include "FaceBase.h"
+#include "modules/sandboxing/IPCIntelFD.h"
+#include "IntelAlgoCommon.h"
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+class IntelFaceDetection {
+ public:
+    IntelFaceDetection();
+    virtual ~IntelFaceDetection();
+
+    status_t init(FaceDetectionInitParams *initData, int dataSize);
+    status_t deinit();
+    status_t run(FaceDetectionRunParams *runParams, int dataSize, int dmafd = -1);
+    FaceDetectionRunParams *prepareRunBuffer(unsigned int index);
+
+ private:
+    IPCIntelFD mIpc;
+    IntelAlgoCommon mCommon;
+
+    bool mInitialized;
+
+    ShmMemInfo mMemInit;
+    ShmMemInfo mMemRunBufs[MAX_STORE_FACE_DATA_BUF_NUM];
+    std::vector<ShmMem> mMems;
+};
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.cpp
new file mode 100644
index 000000000000..f1cb479705ef
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.cpp
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelIspParamAdaptor"
+
+#include "modules/sandboxing/client/IntelIspParamAdaptor.h"
+
+#include <string>
+
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+
+IntelIspParamAdaptor::IntelIspParamAdaptor() :
+    mInitialized(false) {
+    LOGIPC("@%s", __func__);
+
+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
+    std::string initName = "/adaptorInit" + std::to_string(personal) + SHM_NAME;
+    std::string deInitName = "/adaptorDeinit" + std::to_string(personal) + SHM_NAME;
+    std::string getSize = "/adaptorGetSize" + std::to_string(personal) + SHM_NAME;
+    std::string convertStats = "/adaptorConvertStats" + std::to_string(personal) + SHM_NAME;
+    std::string runPal = "/adaptorRunPal" + std::to_string(personal) + SHM_NAME;
+
+    mMems = {{initName.c_str(), sizeof(IspBxtInitParam), &mMemInit, false},
+             {deInitName.c_str(), sizeof(IspBxtDeInitParam), &mMemDeinit, false},
+             {getSize.c_str(), sizeof(PalDataSizeParam), &mMemGetSize, false},
+             {convertStats.c_str(), sizeof(ConvertStatsParam), &mMemStats, false},
+             {runPal.c_str(), sizeof(RunPalParam), &mMemRunPal, false}};
+
+    bool success = mCommon.allocateAllShmMems(&mMems);
+    if (!success) {
+        mCommon.releaseAllShmMems(mMems);
+        return;
+    }
+
+    LOGIPC("@%s, done", __func__);
+    mInitialized = true;
+}
+
+IntelIspParamAdaptor::~IntelIspParamAdaptor() {
+    LOGIPC("@%s", __func__);
+    mPalDataMems.clear();
+    mCommon.releaseAllShmMems(mMems);
+}
+
+ia_isp_bxt *IntelIspParamAdaptor::init(const ia_binary_data *ispData, const ia_cmc_t *iaCmc,
+                                       unsigned int maxStatsWidth, unsigned int maxStatsHeight,
+                                       unsigned int maxNumStatsIn, ia_mkn *iaMkn) {
+    CheckError(!ispData || !iaCmc, nullptr, "%s, No CPF or CMC data", __func__);
+    LOGIPC("%s, ispData size: %d, pointer: %p, max width: %u, max height: %u",
+           __func__, ispData->size, ispData->data, maxStatsWidth, maxStatsHeight);
+    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
+
+    bool ret = mIpc.clientFlattenInit(mMemInit.mAddr, mMemInit.mSize, ispData, iaCmc,
+                                      maxStatsWidth, maxStatsHeight, maxNumStatsIn, iaMkn);
+    CheckError(ret == false, nullptr, "@%s, clientFlattenInit fails", __func__);
+
+    ret = mCommon.requestSync(IPC_ISP_ADAPTOR_INIT, mMemInit.mHandle);
+    CheckError(ret == false, nullptr, "@%s, requestSync fails", __func__);
+
+    IspBxtInitParam *params = static_cast<IspBxtInitParam*>(mMemInit.mAddr);
+    return reinterpret_cast<ia_isp_bxt*>(params->ispRemoteHandle);
+}
+
+void IntelIspParamAdaptor::deInit(const ia_isp_bxt *ispBxtHandle) {
+    LOGIPC("@%s", __func__);
+    CheckError(!ispBxtHandle, VOID_VALUE, "%s, ispBxtHandle is nullptr", __func__);
+    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
+
+    bool ret = mIpc.clientFlattenDeInit(mMemDeinit.mAddr, mMemDeinit.mSize, ispBxtHandle);
+    CheckError(ret == false, VOID_VALUE, "@%s, clientFlattenDeInit fails", __func__);
+
+    ret = mCommon.requestSync(IPC_ISP_ADAPTOR_DEINIT, mMemDeinit.mHandle);
+    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
+}
+
+int IntelIspParamAdaptor::getPalDataSize(const ia_isp_bxt_program_group *programGroup) {
+    LOGIPC("@%s", __func__);
+    CheckError(mInitialized == false, -1, "@%s, mInitialized is false", __func__);
+    CheckError(!programGroup, -1, "%s, programGroup is nullptr", __func__);
+
+    bool ret = mIpc.clientFlattenGetPalSize(mMemGetSize.mAddr, mMemGetSize.mSize, programGroup);
+    CheckError(ret == false, -1, "@%s, clientFlattenGetPalSize fails", __func__);
+
+    ret = mCommon.requestSync(IPC_ISP_GET_PAL_SIZE, mMemGetSize.mHandle);
+    CheckError(ret == false, -1, "@%s, requestSync fails", __func__);
+
+    PalDataSizeParam *params = static_cast<PalDataSizeParam*>(mMemGetSize.mAddr);
+    LOGIPC("@%s, the pal data size is: %d", __func__, params->palDataSize);
+
+    return params->palDataSize;
+}
+
+status_t IntelIspParamAdaptor::queryAndConvertStats(const ia_isp_bxt *ispBxtHandle,
+                                                    const ConvertInputParam *inputParams,
+                                                    ConvertResult *result) {
+    LOGIPC("@%s", __func__);
+    CheckError(!ispBxtHandle, UNKNOWN_ERROR, "%s, ispBxtHandle is nullptr", __func__);
+    CheckError(!inputParams || !result,
+               UNKNOWN_ERROR, "%s, inputParams or result nullptr", __func__);
+    CheckError(!inputParams->dvsReso || !inputParams->aeResults,
+               UNKNOWN_ERROR, "%s, inputParams or result nullptr", __func__);
+    CheckError((!inputParams->statsBuffer ||
+               !inputParams->statsBuffer->data || inputParams->statsBuffer->size <= 0),
+               UNKNOWN_ERROR, "%s, Wrong statistics buffer", __func__);
+    CheckError(!result->queryResults, UNKNOWN_ERROR, "%s, queryResults is nullptr", __func__);
+    CheckError(mInitialized == false, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
+
+    bool ret = mIpc.clientFlattenConvertStats(mMemStats.mAddr, mMemStats.mSize,
+                                              ispBxtHandle, inputParams);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenConvertStats fails", __func__);
+
+    ret = mCommon.requestSync(IPC_ISP_CONVERT_STATS, mMemStats.mHandle);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
+
+    ret = mIpc.clientUnflattenConvertStats(mMemStats.mAddr, mMemStats.mSize, result);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientUnflattenConvertStats fails", __func__);
+
+    return OK;
+}
+
+void *IntelIspParamAdaptor::allocatePalBuffer(int streamId, int index, int palDataSize) {
+    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
+
+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
+    std::string palDataName = "/palData" + std::to_string(streamId) +
+                              std::to_string(index) + std::to_string(personal) + SHM_NAME;
+
+    ShmMemInfo memInfo;
+    CLEAR(memInfo);
+    bool success = mCommon.allocShmMem(palDataName, palDataSize, &memInfo);
+    CheckError(success == false, nullptr,
+               "%s, failed to allocate share memory for pal", __func__);
+    LOGIPC("%s, the buffer handle: %d, address: %p", __func__, memInfo.mHandle, memInfo.mAddr);
+
+    mPalDataMems.push_back(memInfo);
+
+    return memInfo.mAddr;
+}
+
+void IntelIspParamAdaptor::freePalBuffer(void *addr) {
+    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
+
+    for (auto &mem : mPalDataMems) {
+        if (mem.mAddr == addr) {
+            mCommon.freeShmMem(mem);
+        }
+    }
+}
+
+status_t IntelIspParamAdaptor::runPal(ia_isp_bxt *ispBxtHandle,
+                                      const ia_isp_bxt_input_params_v2 *inputParams,
+                                      ia_binary_data *outputData) {
+    LOGIPC("@%s", __func__);
+    CheckError((!ispBxtHandle || !inputParams), UNKNOWN_ERROR,
+               "%s, ispBxtHandle or inputParams is nullptr", __func__);
+    CheckError((!outputData || !outputData->data || outputData->size <= 0),
+               UNKNOWN_ERROR, "%s, Wrong pal data buffer", __func__);
+    CheckError(mInitialized == false, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
+
+    int32_t palDataHandle = mCommon.getShmMemHandle(outputData->data);
+    CheckError(!palDataHandle, UNKNOWN_ERROR,
+                "%s, the pal buffer(%p) doesn't exist in SHM list", __func__, outputData->data);
+    LOGIPC("%s, pal buffer address: %p, buffer handle: %d",
+           __func__, outputData->data, palDataHandle);
+
+    bool ret = mIpc.clientFlattenRunPal(mMemRunPal.mAddr, mMemRunPal.mSize,
+                                        ispBxtHandle, inputParams, outputData, palDataHandle);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenRunPal fails", __func__);
+
+    ret = mCommon.requestSync(IPC_ISP_RUN_PAL, mMemRunPal.mHandle);
+    CheckError(ret == false, -1, "@%s, requestSync fails", __func__);
+
+    RunPalParam *params = static_cast<RunPalParam*>(mMemRunPal.mAddr);
+    outputData->size = params->palOutput.size;
+    LOGIPC("%s, the buffer handle is: %d size: %d ptr: %p after running pal",
+           __func__, params->palDataHandle, outputData->size, outputData->data);
+
+    return OK;
+}
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.h
new file mode 100644
index 000000000000..d5bbecaf5dbe
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <vector>
+
+#include "modules/sandboxing/IPCIspParamAdaptor.h"
+#include "IntelAlgoCommon.h"
+#include "iutils/Errors.h"
+
+namespace icamera {
+
+class IntelIspParamAdaptor {
+ public:
+    IntelIspParamAdaptor();
+    virtual ~IntelIspParamAdaptor();
+
+    ia_isp_bxt *init(const ia_binary_data *ispData, const ia_cmc_t *iaCmc,
+                     unsigned int maxStatsWidth, unsigned int maxStatsHeight,
+                     unsigned int maxNumStatsIn, ia_mkn *iaMkn);
+    void deInit(const ia_isp_bxt *ispBxtHandle);
+    int getPalDataSize(const ia_isp_bxt_program_group *programGroup);
+    status_t runPal(ia_isp_bxt *ispBxtHandle,
+                    const ia_isp_bxt_input_params_v2 *inputParams, ia_binary_data *outputData);
+    status_t queryAndConvertStats(const ia_isp_bxt *ispBxtHandle,
+                                  const ConvertInputParam *inputParams, ConvertResult *result);
+    void *allocatePalBuffer(int streamId, int index, int palDataSize);
+    void freePalBuffer(void *addr);
+
+ private:
+    IPCIspParamAdaptor mIpc;
+    IntelAlgoCommon mCommon;
+
+    bool mInitialized;
+    ShmMemInfo mMemInit;
+    ShmMemInfo mMemDeinit;
+    ShmMemInfo mMemGetSize;
+    ShmMemInfo mMemStats;
+    ShmMemInfo mMemRunPal;
+    std::vector<ShmMemInfo> mPalDataMems;
+
+    std::vector<ShmMem> mMems;
+};
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.cpp
new file mode 100644
index 000000000000..647325fcec72
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.cpp
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelLard"
+
+#include "modules/sandboxing/client/IntelLard.h"
+
+#include <string>
+
+#include "CameraLog.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+IntelLard::IntelLard():
+    mInitialized(false) {
+    LOGIPC("@%s", __func__);
+
+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
+    std::string initName = "/lardInit" + std::to_string(personal) + SHM_NAME;
+    std::string getTagListName = "/lardGetTagList" + std::to_string(personal) + SHM_NAME;
+    std::string runName = "/lardRun" + std::to_string(personal) + SHM_NAME;
+    std::string deinitName = "/lardDeinit" + std::to_string(personal) + SHM_NAME;
+
+    mMems = {{initName.c_str(), sizeof(lard_init_params), &mMemInit, false},
+             {getTagListName.c_str(), sizeof(lard_get_tag_list_params), &mMemGetTagList, false},
+             {runName.c_str(), sizeof(lard_run_params), &mMemRun, false},
+             {deinitName.c_str(), sizeof(lard_deinit_params), &mMemDeinit, false}};
+
+    bool success = mCommon.allocateAllShmMems(&mMems);
+    if (!success) {
+        mCommon.releaseAllShmMems(mMems);
+        return;
+    }
+
+    LOGIPC("@%s, done", __func__);
+    mInitialized = true;
+}
+
+IntelLard::~IntelLard() {
+    LOGIPC("@%s", __func__);
+    mCommon.releaseAllShmMems(mMems);
+}
+
+ia_lard* IntelLard::init(const ia_binary_data* lard_data_ptr) {
+    LOGIPC("@%s, binaryData:%p", __func__, lard_data_ptr);
+
+    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
+    CheckError(!lard_data_ptr, nullptr, "@%s, lard_data_ptr is nullptr", __func__);
+    CheckError(!lard_data_ptr->data, nullptr, "@%s, lard_data_ptr->data is nullptr", __func__);
+    CheckError(lard_data_ptr->size == 0, nullptr, "@%s, lard_data_ptr->size is 0", __func__);
+
+    bool ret = mIpc.clientFlattenInit(mMemInit.mAddr, mMemInit.mSize, lard_data_ptr);
+    CheckError(ret == false, nullptr, "@%s, clientFlattenInit fails", __func__);
+
+    ret = mCommon.requestSync(IPC_LARD_INIT, mMemInit.mHandle);
+    CheckError(ret == false, nullptr, "@%s, requestSync fails", __func__);
+
+    ia_lard* lard = nullptr;
+    ret = mIpc.clientUnflattenInit(mMemInit.mAddr, mMemInit.mSize, &lard);
+    CheckError(ret == false, nullptr, "@%s, clientUnflattenInit fails", __func__);
+
+    return lard;
+}
+
+ia_err IntelLard::getTagList(ia_lard* ia_lard_ptr, unsigned int mode_tag,
+                             unsigned int* num_tags, const unsigned int** tags) {
+    LOGIPC("@%s, ia_lard_ptr:%p, mode_tag:%d", __func__, ia_lard_ptr, mode_tag);
+
+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
+    CheckError(ia_lard_ptr == nullptr, ia_err_general, "@%s, ia_lard_ptr is nullptr", __func__);
+    CheckError(num_tags == nullptr, ia_err_general, "@%s, num_tags is nullptr", __func__);
+    CheckError(tags == nullptr, ia_err_general, "@%s, tags is nullptr", __func__);
+
+    bool ret = mIpc.clientFlattenGetTagList(mMemGetTagList.mAddr, mMemGetTagList.mSize,
+                                            ia_lard_ptr, mode_tag);
+    CheckError(ret == false, ia_err_general, "@%s, clientFlattenGetTagList fails", __func__);
+
+    ret = mCommon.requestSync(IPC_LARD_GET_TAG_LIST, mMemGetTagList.mHandle);
+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
+
+    ret = mIpc.clientUnflattenGetTagList(mMemGetTagList.mAddr, mMemGetTagList.mSize,
+                                         mode_tag, num_tags, tags);
+    CheckError(ret == false, ia_err_general, "@%s, clientUnflattenGetTagList fails", __func__);
+
+    return ia_err_none;
+}
+
+ia_err IntelLard::run(ia_lard* ia_lard_ptr, ia_lard_input_params* lard_input_params_ptr,
+                      ia_lard_results** lard_results_ptr) {
+    LOGIPC("@%s, ia_lard_ptr:%p, lard_input_params_ptr:%p", __func__,
+           ia_lard_ptr, lard_input_params_ptr);
+
+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
+    CheckError(ia_lard_ptr == nullptr, ia_err_general, "@%s, ia_lard_ptr is nullptr", __func__);
+    CheckError(lard_input_params_ptr == nullptr, ia_err_general,
+               "@%s, lard_input_params_ptr is nullptr", __func__);
+    CheckError(lard_results_ptr == nullptr, ia_err_general,
+               "@%s, lard_results_ptr is nullptr", __func__);
+
+    bool ret = mIpc.clientFlattenRun(mMemRun.mAddr, mMemRun.mSize,
+                                     ia_lard_ptr, lard_input_params_ptr);
+    CheckError(ret == false, ia_err_general, "@%s, clientFlattenRun fails", __func__);
+
+    ret = mCommon.requestSync(IPC_LARD_RUN, mMemRun.mHandle);
+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
+
+    ret = mIpc.clientUnflattenRun(mMemRun.mAddr, mMemRun.mSize, lard_results_ptr);
+    CheckError(ret == false, ia_err_general, "@%s, clientUnflattenRun fails", __func__);
+
+    return ia_err_none;
+}
+
+void IntelLard::deinit(ia_lard* ia_lard_ptr) {
+    LOGIPC("@%s, ia_lard_ptr:%p", __func__, ia_lard_ptr);
+
+    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
+    CheckError(ia_lard_ptr == nullptr, VOID_VALUE, "@%s, ia_lard_ptr is nullptr", __func__);
+
+    bool ret = mIpc.clientFlattenDeinit(mMemDeinit.mAddr, mMemDeinit.mSize, ia_lard_ptr);
+    CheckError(ret == false, VOID_VALUE, "@%s, clientFlattenDeinit fails", __func__);
+
+    ret = mCommon.requestSync(IPC_LARD_DEINIT, mMemDeinit.mHandle);
+    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
+}
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.h
new file mode 100644
index 000000000000..7f337a64e280
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_lard.h>
+#include "modules/sandboxing/IPCIntelLard.h"
+#include "IntelAlgoCommon.h"
+#include <vector>
+
+namespace icamera {
+class IntelLard {
+ public:
+    IntelLard();
+    virtual ~IntelLard();
+
+    ia_lard* init(const ia_binary_data* lard_data_ptr);
+    ia_err getTagList(ia_lard* ia_lard_ptr, unsigned int mode_tag,
+                      unsigned int* num_tags, const unsigned int** tags);
+    ia_err run(ia_lard* ia_lard_ptr, ia_lard_input_params* lard_input_params_ptr,
+               ia_lard_results** lard_results_ptr);
+    void deinit(ia_lard* ia_lard_ptr);
+
+ private:
+    IPCIntelLard mIpc;
+    IntelAlgoCommon mCommon;
+
+    bool mInitialized;
+
+    ShmMemInfo mMemInit;
+    ShmMemInfo mMemGetTagList;
+    ShmMemInfo mMemRun;
+    ShmMemInfo mMemDeinit;
+
+    std::vector<ShmMem> mMems;
+};
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.cpp
new file mode 100644
index 000000000000..c7c9c01db465
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.cpp
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "ClientIntelLtm"
+
+#include "modules/sandboxing/client/IntelLtm.h"
+
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+IntelLtm::IntelLtm() :
+    mInitialized(false),
+    mRunParamsSize(0) {
+    LOGIPC("@%s", __func__);
+
+    mCaller = reinterpret_cast<uintptr_t>(this);
+    mMems = {{("/ltmInit" + std::to_string(mCaller) + "Shm"),
+              sizeof(LtmInitParams), &mMemInit, false},
+             {("/ltmDeinit" + std::to_string(mCaller) + "Shm"),
+              sizeof(LtmDeinitParams), &mMemDeinit, false}};
+
+    bool success = mCommon.allocateAllShmMems(&mMems);
+    if (!success) {
+        mCommon.releaseAllShmMems(mMems);
+        return;
+    }
+
+    LOGIPC("@%s, done", __func__);
+    mInitialized = true;
+}
+
+IntelLtm::~IntelLtm() {
+    LOGIPC("@%s", __func__);
+    mCommon.releaseAllShmMems(mMems);
+    mCommon.freeShmMem(mMemRun);
+}
+
+ia_ltm *IntelLtm::init(const ia_binary_data *lard_data_ptr, ia_mkn *mkn) {
+    LOGIPC("@%s", __func__);
+    CheckError(!lard_data_ptr, nullptr, "@%s, lard_data_ptr is null", __func__);
+    CheckError(!mkn, nullptr, "@%s, mkn is null", __func__);
+    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
+
+    LtmInitParams *params = static_cast<LtmInitParams*>(mMemInit.mAddr);
+
+    bool ret = mIpc.clientFlattenInit(*lard_data_ptr, reinterpret_cast<uintptr_t>(mkn), params);
+    CheckError(ret == false, nullptr, "@%s, clientFlattenInit fails", __func__);
+
+    ret = mCommon.requestSync(IPC_LTM_INIT, mMemInit.mHandle);
+    CheckError(ret == false, nullptr, "@%s, requestSync fails", __func__);
+
+    ia_ltm *ltm = nullptr;
+    ret = mIpc.clientUnflattenInit(params, &ltm);
+    CheckError(ret == false, nullptr, "@%s, clientUnflattenInit fails", __func__);
+
+    return ltm;
+}
+
+void IntelLtm::deinit(ia_ltm *ltm) {
+    LOGIPC("@%s", __func__);
+    CheckError(!ltm, VOID_VALUE, "@%s, ltm is nullptr", __func__);
+    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
+
+    LtmDeinitParams *params = static_cast<LtmDeinitParams*>(mMemDeinit.mAddr);
+    params->ltm_handle = reinterpret_cast<uintptr_t>(ltm);
+
+    bool ret = mCommon.requestSync(IPC_LTM_DEINIT, mMemDeinit.mHandle);
+    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
+}
+
+int IntelLtm::allocaRunImage(int dataSize) {
+    mRunParamsSize = 0;
+    mCommon.freeShmMem(mMemRun);
+    mMemRun = {};
+
+    mMemRun.mName = "/ltmRun" + std::to_string(mCaller) + "Shm";
+    mMemRun.mSize = dataSize;
+    bool ret = mCommon.allocShmMem(mMemRun.mName, mMemRun.mSize, &mMemRun);
+    CheckError(!ret, mRunParamsSize, "@%s, allocShmMem fails", __func__);
+
+    mRunParamsSize = dataSize;
+    return mRunParamsSize;
+}
+
+ia_err IntelLtm::run(ia_ltm *ltm, const ia_ltm_input_params *inputParams,
+                     ia_ltm_results **ltmResults,
+                     ia_ltm_drc_params **drcResults) {
+    LOGIPC("@%s", __func__);
+
+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
+    CheckError(!ltm, ia_err_general, "@%s, ltm is nullptr", __func__);
+    CheckError(!inputParams, ia_err_general, "@%s, inputParams is nullptr", __func__);
+    CheckError(!ltmResults, ia_err_general, "@%s, ltmResultsis is nullptr", __func__);
+    CheckError(!drcResults, ia_err_general, "@%s, drcResults is nullptr", __func__);
+
+    int runParamsSize = sizeof(LtmRunParams);
+    if (inputParams->input_image_ptr && inputParams->input_image_ptr->image_data) {
+        runParamsSize += inputParams->input_image_ptr->image_data->size;
+    }
+
+    if (mRunParamsSize < runParamsSize) {
+        LOGIPC("@%s, mRunParamsSize %d, runParamsSize %d", __func__, mRunParamsSize, runParamsSize);
+        int dataSize = allocaRunImage(runParamsSize);
+        CheckError(dataSize <= 0, ia_err_general, "@%s, Failed to allocaRunImage", __func__);
+    }
+
+    bool ret = mIpc.clientFlattenRun(reinterpret_cast<uintptr_t>(ltm),
+                                     *inputParams, mMemRun.mSize, mMemRun.mAddr);
+    CheckError(ret == false, ia_err_general, "@%s, clientFlattenPrepare fails", __func__);
+
+    ret = mCommon.requestSync(IPC_LTM_RUN, mMemRun.mHandle);
+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
+
+    LtmRunParams* params = static_cast<LtmRunParams*>(mMemRun.mAddr);
+    ret = mIpc.clientUnflattenRun(params, ltmResults, drcResults);
+    CheckError(ret == false, ia_err_general, "@%s, clientUnflattenPrepare fails", __func__);
+
+    return ia_err_none;
+}
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.h
new file mode 100644
index 000000000000..e5daa4cc40bc
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_ltm.h>
+#include <vector>
+
+#include "IntelAlgoCommon.h"
+#include "modules/sandboxing/IPCIntelLtm.h"
+
+namespace icamera {
+class IntelLtm {
+ public:
+    IntelLtm();
+    virtual ~IntelLtm();
+
+    ia_ltm *init(const ia_binary_data *lard_data_ptr, ia_mkn *mkn);
+    void deinit(ia_ltm *ltm);
+    ia_err run(ia_ltm *ltm, const ia_ltm_input_params *inputParams,
+               ia_ltm_results **ltmResults,
+               ia_ltm_drc_params **drcResults);
+
+ private:
+    int allocaRunImage(int dataSize);
+
+ private:
+    uintptr_t mCaller;
+    IPCIntelLtm mIpc;
+    IntelAlgoCommon mCommon;
+
+    bool mInitialized;
+    int mRunParamsSize;
+
+    ShmMemInfo mMemInit;
+    ShmMemInfo mMemRun;
+    ShmMemInfo mMemDeinit;
+    std::vector<ShmMem> mMems;
+};
+}  /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.cpp
new file mode 100644
index 000000000000..102de4593317
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.cpp
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "ClientIntelMkn"
+
+#include "modules/sandboxing/client/IntelMkn.h"
+
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+IntelMkn::IntelMkn():
+    mInitialized(false) {
+    LOGIPC("@%s", __func__);
+
+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
+    mMems = {{("/mknInit" + std::to_string(personal) + "Shm"),
+              sizeof(MknInitParams), &mMemInit, false},
+             {("/mknDeinit" + std::to_string(personal) + "Shm"),
+              sizeof(MknDeinitParams), &mMemDeinit, false},
+             {("/mknPrepare" + std::to_string(personal) + "Shm"),
+              sizeof(MknPrepareParams), &mMemPrepare, false},
+             {("/mknEnable" + std::to_string(personal) + "Shm"),
+              sizeof(MknEnableParams), &mMemEnable, false}};
+
+    bool success = mCommon.allocateAllShmMems(&mMems);
+    if (!success) {
+        mCommon.releaseAllShmMems(mMems);
+        return;
+    }
+
+    LOGIPC("@%s, done", __func__);
+    mInitialized = true;
+}
+
+IntelMkn::~IntelMkn() {
+    LOGIPC("@%s", __func__);
+    mCommon.releaseAllShmMems(mMems);
+}
+
+ia_mkn *IntelMkn::init(ia_mkn_config_bits mkn_config_bits,
+                       size_t mkn_section_1_size,
+                       size_t mkn_section_2_size) {
+    LOGIPC("@%s, mkn_config_bits:%d, mkn_section_1_size:%zu, mkn_section_2_size:%zu",
+           __func__, mkn_config_bits, mkn_section_1_size, mkn_section_2_size);
+    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
+
+    MknInitParams *params = static_cast<MknInitParams*>(mMemInit.mAddr);
+
+    bool ret = mIpc.clientFlattenInit(mkn_config_bits, mkn_section_1_size,
+                                      mkn_section_2_size, params);
+    CheckError(ret == false, nullptr, "@%s, clientFlattenInit fails", __func__);
+
+    ret = mCommon.requestSync(IPC_MKN_INIT, mMemInit.mHandle);
+    CheckError(ret == false, nullptr, "@%s, requestSync fails", __func__);
+
+    return reinterpret_cast<ia_mkn*> (params->results);
+}
+
+void IntelMkn::deinit(ia_mkn *pMkn) {
+    LOGIPC("@%s", __func__);
+    CheckError(pMkn == nullptr, VOID_VALUE, "@%s, mkn is nullptr", __func__);
+    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
+
+    MknDeinitParams *params = static_cast<MknDeinitParams*>(mMemDeinit.mAddr);
+    params->mkn_handle = reinterpret_cast<uintptr_t>(pMkn);
+
+    bool ret = mCommon.requestSync(IPC_MKN_DEINIT, mMemDeinit.mHandle);
+    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
+}
+
+int IntelMkn::prepare(ia_mkn *pMkn, ia_mkn_trg data_target, ia_binary_data *pBinaryData) {
+    LOGIPC("@%s", __func__);
+
+    *pBinaryData = {nullptr, 0};
+    CheckError(pMkn == nullptr, UNKNOWN_ERROR, "@%s, mkn is nullptr", __func__);
+    CheckError(mInitialized == false, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
+
+    MknPrepareParams* params = static_cast<MknPrepareParams*>(mMemPrepare.mAddr);
+    bool ret = mIpc.clientFlattenPrepare(reinterpret_cast<uintptr_t>(pMkn),
+                                         data_target, params);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenPrepare fails", __func__);
+
+    ret = mCommon.requestSync(IPC_MKN_PREPARE, mMemPrepare.mHandle);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
+
+    ret = mIpc.clientUnflattenPrepare(params, pBinaryData);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientUnflattenPrepare fails", __func__);
+
+    return OK;
+}
+
+int IntelMkn::enable(ia_mkn *pMkn, bool enable_data_collection) {
+    LOGIPC("@%s, enable_data_collection:%d", __func__, enable_data_collection);
+
+    CheckError(pMkn == nullptr, UNKNOWN_ERROR, "@%s, mkn is nullptr", __func__);
+    CheckError(mInitialized == false, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
+
+    MknEnableParams *params = static_cast<MknEnableParams*>(mMemEnable.mAddr);
+    params->mkn_handle = reinterpret_cast<uintptr_t>(pMkn);
+    params->enable_data_collection = enable_data_collection;
+
+    bool ret = mCommon.requestSync(IPC_MKN_ENABLE, mMemEnable.mHandle);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
+
+    return OK;
+}
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.h
new file mode 100644
index 000000000000..9649432a06da
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_types.h>
+#include <ia_mkn_types.h>
+#include <ia_mkn_encoder.h>
+#include <vector>
+
+#include "IntelAlgoCommon.h"
+#include "modules/sandboxing/IPCIntelMkn.h"
+
+namespace icamera {
+class IntelMkn {
+ public:
+    IntelMkn();
+    ~IntelMkn();
+
+    ia_mkn *init(ia_mkn_config_bits mkn_config_bits,
+                 size_t mkn_section_1_size, size_t mkn_section_2_size);
+    void deinit(ia_mkn *pMkn);
+
+    int prepare(ia_mkn *pMkn, ia_mkn_trg data_target, ia_binary_data *pBinaryData);
+    int enable(ia_mkn *pMkn, bool enable_data_collection);
+
+ private:
+    IPCIntelMkn mIpc;
+    IntelAlgoCommon mCommon;
+
+    bool mInitialized;
+
+    ShmMemInfo mMemInit;
+    ShmMemInfo mMemDeinit;
+    ShmMemInfo mMemPrepare;
+    ShmMemInfo mMemEnable;
+
+    std::vector<ShmMem> mMems;
+};
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.cpp
new file mode 100644
index 000000000000..f4b03601b4c4
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.cpp
@@ -0,0 +1,271 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelPGParamC"
+
+#include "modules/sandboxing/client/IntelPGParam.h"
+
+#include <string>
+
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+
+IntelPGParam::IntelPGParam(int pgId) :
+    mInitialized(false),
+    mPgId(pgId),
+    mClient(reinterpret_cast<uintptr_t>(this)),
+    mPayloadCount(0),
+    mPGBuffer(nullptr) {
+    std::string initName = "/pgParamInit" + std::to_string(mClient) + SHM_NAME;
+    std::string prepareName = "/pgParamPrepare" + std::to_string(mClient) + SHM_NAME;
+    std::string getFragDescsName = "/pgParamGetFragDescs" + std::to_string(mClient) + SHM_NAME;
+    std::string prepareProgramName = "/pgParamPrepareProgram" + std::to_string(mClient) + SHM_NAME;
+    std::string encodeName = "/pgParamEncode" + std::to_string(mClient) + SHM_NAME;
+    std::string decodeName = "/pgParamDecode" + std::to_string(mClient) + SHM_NAME;
+    std::string deinitName = "/pgParamDeinit" + std::to_string(mClient) + SHM_NAME;
+
+    mMems = {{initName.c_str(), sizeof(pg_param_init_params), &mMemInit, false},
+             {prepareName.c_str(), sizeof(pg_param_prepare_params), &mMemPrepare, false},
+             {getFragDescsName.c_str(), sizeof(pg_param_get_fragment_desc_params),
+                                                                    &mMemGetFragDescs, false},
+             {prepareProgramName.c_str(), sizeof(pg_param_prepare_program_params),
+                                                                    &mMemPrepareProgram, false},
+             {encodeName.c_str(), sizeof(pg_param_encode_params), &mMemEncode, false},
+             {decodeName.c_str(), sizeof(pg_param_decode_params), &mMemDecode, false},
+             {deinitName.c_str(), sizeof(pg_param_deinit_params), &mMemDeinit, false},
+            };
+
+    bool success = mCommon.allocateAllShmMems(&mMems);
+    if (!success) {
+        mCommon.releaseAllShmMems(mMems);
+        return;
+    }
+
+    // Allocate when use
+    mMemAllocatePayloads.mName = "/pgParamAllocPayloads" + std::to_string(mClient) + SHM_NAME;
+    mMemAllocatePayloads.mSize = 0;
+    mMemAllocatePGBuffer.mName = "/pgParamAllocPG" + std::to_string(mClient) + SHM_NAME;
+    mMemAllocatePGBuffer.mSize = 0;
+
+    LOGIPC("@%s, done", __func__);
+    mInitialized = true;
+}
+
+IntelPGParam::~IntelPGParam() {
+    mCommon.releaseAllShmMems(mMems);
+    if (mMemAllocatePayloads.mSize) {
+        mCommon.freeShmMem(mMemAllocatePayloads);
+    }
+    if (mMemAllocatePGBuffer.mSize) {
+        mCommon.freeShmMem(mMemAllocatePGBuffer);
+    }
+}
+
+int IntelPGParam::init(ia_p2p_platform_t platform, const PgConfiguration& pgConfig) {
+    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
+
+    bool ret = mIpc.clientFlattenInit(mMemInit.mAddr, mMemInit.mSize,
+                                      mPgId, mClient, platform, pgConfig);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenInit fails", __func__);
+
+    ret = mCommon.requestSync(IPC_PG_PARAM_INIT, mMemInit.mHandle);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
+
+    return OK;
+}
+
+int IntelPGParam::prepare(const ia_binary_data* ipuParameters, const ia_css_rbm_t* rbm,
+                          ia_css_kernel_bitmap_t* bitmap) {
+    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
+    CheckError(!ipuParameters, INVALID_OPERATION, "@%s, ipuParams error", __func__);
+
+    int32_t palHandle = mCommon.getShmMemHandle(ipuParameters->data);
+    bool ret = mIpc.clientFlattenPrepare(mMemPrepare.mAddr, mMemPrepare.mSize,
+                                         mClient, ipuParameters->size, palHandle, rbm);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenPrepare fails", __func__);
+
+    ret = mCommon.requestSync(IPC_PG_PARAM_PREPARE, mMemPrepare.mHandle);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
+
+    ret = mIpc.clientUnflattenPrepare(mMemPrepare.mAddr, mMemPrepare.mSize, bitmap);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientUnflattenPrepare fails", __func__);
+
+    return OK;
+}
+
+int IntelPGParam::getFragmentDescriptors(int descCount, ia_p2p_fragment_desc* descs) {
+    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
+
+    bool ret = mIpc.clientFlattenGetFragDescs(mMemGetFragDescs.mAddr, mMemGetFragDescs.mSize,
+                                              mClient, descCount);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenGetFragDescs fails", __func__);
+
+    ret = mCommon.requestSync(IPC_PG_PARAM_GET_FRAG_DESCS, mMemGetFragDescs.mHandle);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
+
+    int count = 0;
+    ret = mIpc.clientUnflattenGetFragDescs(mMemGetFragDescs.mAddr, mMemGetFragDescs.mSize,
+                                           &count, descs);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientUnflattenGetFragDescs fails", __func__);
+    return count;
+}
+
+void* IntelPGParam::allocatePGBuffer(int pgSize) {
+    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
+
+    mPGBuffer = nullptr;
+    int size = mIpc.getTotalPGBufferSize(pgSize);
+    if (mMemAllocatePGBuffer.mAddr && mMemAllocatePGBuffer.mSize < size) {
+        mCommon.freeShmMem(mMemAllocatePGBuffer);
+        mMemAllocatePGBuffer.mSize = 0;
+        mMemAllocatePGBuffer.mAddr = nullptr;
+    }
+    if (!mMemAllocatePGBuffer.mAddr) {
+        mMemAllocatePGBuffer.mSize = size;
+        bool ret = mCommon.allocShmMem(mMemAllocatePGBuffer.mName, mMemAllocatePGBuffer.mSize,
+                                  &mMemAllocatePGBuffer);
+        CheckError(ret == false, nullptr, "@%s, allocShmMem fails", __func__);
+    }
+
+    void* pgBuffer = nullptr;
+    bool ret = mIpc.assignPGBuffer(mMemAllocatePGBuffer.mAddr, mMemAllocatePGBuffer.mSize,
+                                   pgSize, &pgBuffer);
+    CheckError(ret == false, nullptr, "@%s, assignPGBuffer fails", __func__);
+
+    ret = mIpc.clientFlattenAllocatePGBuffer(mMemAllocatePGBuffer.mAddr, mMemAllocatePGBuffer.mSize,
+                                                mClient, pgSize);
+    CheckError(ret == false, nullptr, "@%s, clientFlattenAllocatePGBuffer fails", __func__);
+
+    ret = mCommon.requestSync(IPC_PG_PARAM_ALLOCATE_PG, mMemAllocatePGBuffer.mHandle);
+    CheckError(ret == false, nullptr, "@%s, requestSync fails", __func__);
+
+    mPGBuffer = reinterpret_cast<ia_css_process_group_t*>(pgBuffer);
+    return mPGBuffer;
+}
+
+int IntelPGParam::setPGAndPrepareProgram(ia_css_process_group_t* pg) {
+    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
+    CheckError(mPGBuffer != pg, INVALID_OPERATION, "@%s, pg is not recognized", __func__);
+
+    bool ret = mIpc.clientFlattenPrepareProgram(mMemPrepareProgram.mAddr, mMemPrepareProgram.mSize,
+                                                mClient);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenPrepareProgram fails", __func__);
+
+    ret = mCommon.requestSync(IPC_PG_PARAM_PREPARE_PROGRAM, mMemPrepareProgram.mHandle);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
+
+    // Get size of payloads
+    mPayloadCount = ARRAY_SIZE(mPayloads);
+    ret = mIpc.clientUnflattenPrepareProgram(mMemPrepareProgram.mAddr, mMemPrepareProgram.mSize,
+                                             &mPayloadCount, mPayloads);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientUnlattenPrepareProgram fails", __func__);
+
+    return OK;
+}
+
+int IntelPGParam::allocatePayloads(int payloadCount, ia_binary_data* payloads) {
+    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
+    CheckError(payloadCount < mPayloadCount, UNKNOWN_ERROR, "@%s, payloadCount is small", __func__);
+    CheckError(!payloads, UNKNOWN_ERROR, "@%s, payloads is nullptr", __func__);
+    bool ret = false;
+
+    // Allocate memory
+    int size = mIpc.getTotalPayloadSize(mPayloadCount, mPayloads);
+    CheckError(size <= 0, UNKNOWN_ERROR, "@%s, payloads size error", __func__);
+    if (mMemAllocatePayloads.mAddr && mMemAllocatePayloads.mSize < size) {
+        mCommon.freeShmMem(mMemAllocatePayloads);
+        mMemAllocatePayloads.mSize = 0;
+        mMemAllocatePayloads.mAddr = nullptr;
+    }
+    if (!mMemAllocatePayloads.mAddr) {
+        mMemAllocatePayloads.mSize = size;
+        ret = mCommon.allocShmMem(mMemAllocatePayloads.mName, mMemAllocatePayloads.mSize,
+                                  &mMemAllocatePayloads);
+        CheckError(ret == false, UNKNOWN_ERROR, "@%s, allocShmMem fails", __func__);
+    }
+
+    // Split memory of payloads in client side
+    ret = mIpc.assignPayloads(mMemAllocatePayloads.mAddr, mMemAllocatePayloads.mSize,
+                              mPayloadCount, mPayloads);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, allocatePayloads fails", __func__);
+
+    ret = mIpc.clientFlattenAllocatePayloads(mMemAllocatePayloads.mAddr, mMemAllocatePayloads.mSize,
+                                             mClient, mPayloadCount, mPayloads);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenAllocatePayloads fails", __func__);
+
+    ret = mCommon.requestSync(IPC_PG_PARAM_ALLOCATE_PAYLOADS, mMemAllocatePayloads.mHandle);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
+
+    MEMCPY_S(payloads, sizeof(ia_binary_data) * mPayloadCount,
+             mPayloads, sizeof(ia_binary_data) * mPayloadCount);
+    return mPayloadCount;
+}
+
+int IntelPGParam::updatePALAndEncode(const ia_binary_data* ipuParameters,
+                           int payloadCount, ia_binary_data* payloads) {
+    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
+    CheckError(!ipuParameters, INVALID_OPERATION, "@%s, ipuParams error", __func__);
+    // Check shared memory of payloads
+    CheckError(payloadCount != mPayloadCount, BAD_VALUE, "@%s, payloadCount error", __func__);
+
+    if (memcmp(payloads, mPayloads, payloadCount * sizeof(ia_binary_data))) {
+        LOGE("@%s, payloads are not recognized", __func__);
+    }
+
+    int32_t palHandle = mCommon.getShmMemHandle(ipuParameters->data);
+    bool ret = mIpc.clientFlattenEncode(mMemEncode.mAddr, mMemEncode.mSize, mClient,
+                                        ipuParameters->size, palHandle);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenEncode fails", __func__);
+
+    ret = mCommon.requestSync(IPC_PG_PARAM_ENCODE, mMemEncode.mHandle);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
+
+    return OK;
+}
+
+int IntelPGParam::decode(int payloadCount, ia_binary_data* payloads, ia_binary_data* statistics) {
+    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
+    // Check shared memory of payloads
+    CheckError(payloadCount != mPayloadCount, BAD_VALUE, "@%s, payloadCount error", __func__);
+    if (memcmp(payloads, mPayloads, payloadCount * sizeof(ia_binary_data))) {
+        LOGE("@%s, payloads are not recognized", __func__);
+    }
+
+    bool ret = mIpc.clientFlattenDecode(mMemDecode.mAddr, mMemDecode.mSize, mClient);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenDecode fails", __func__);
+
+    ret = mCommon.requestSync(IPC_PG_PARAM_DECODE, mMemDecode.mHandle);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
+
+    ret = mIpc.clientUnflattenDecode(mMemDecode.mAddr, mMemDecode.mSize, statistics);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientUnflattenDecode fails", __func__);
+
+    return OK;
+}
+
+void IntelPGParam::deinit() {
+    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
+
+    bool ret = mIpc.clientFlattenDeinit(mMemDeinit.mAddr, mMemDeinit.mSize, mClient);
+    CheckError(ret == false, VOID_VALUE, "@%s, clientFlattenDeinit fails", __func__);
+
+    ret = mCommon.requestSync(IPC_PG_PARAM_DEINIT, mMemDeinit.mHandle);
+    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
+}
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.h
new file mode 100644
index 000000000000..771810199b32
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <vector>
+#include <memory>
+
+#include "modules/sandboxing/IPCIntelPGParam.h"
+#include "IntelAlgoCommon.h"
+
+namespace icamera {
+
+class IntelPGParam {
+ public:
+    explicit IntelPGParam(int pgId);
+    ~IntelPGParam();
+
+    int init(ia_p2p_platform_t platform, const PgConfiguration& Pgconfiguration);
+    int prepare(const ia_binary_data* ipuParameters, const ia_css_rbm_t* rbm,
+                ia_css_kernel_bitmap_t* bitmap);
+    void* allocatePGBuffer(int pgSize);
+    int getFragmentDescriptors(int terminalIdx, ia_p2p_fragment_desc* desc);
+    int setPGAndPrepareProgram(ia_css_process_group_t* pg);
+    int allocatePayloads(int payloadCount, ia_binary_data* payloads);
+    int updatePALAndEncode(const ia_binary_data* ipuParams,
+                           int payloadCount, ia_binary_data* payloads);
+    int decode(int payloadCount, ia_binary_data* payload, ia_binary_data* statistics);
+    void deinit();
+
+ private:
+    IPCIntelPGParam mIpc;
+    IntelAlgoCommon mCommon;
+    bool mInitialized;
+
+    ShmMemInfo mMemInit;
+    ShmMemInfo mMemPrepare;
+    ShmMemInfo mMemGetFragDescs;
+    ShmMemInfo mMemAllocatePGBuffer;
+    ShmMemInfo mMemPrepareProgram;
+    ShmMemInfo mMemAllocatePayloads;
+    ShmMemInfo mMemEncode;
+    ShmMemInfo mMemDecode;
+    ShmMemInfo mMemDeinit;
+    std::vector<ShmMem> mMems;
+
+    int mPgId;
+    uintptr_t mClient;
+
+    // Shared memory in client, to avoid memory copy
+    int mPayloadCount;
+    ia_binary_data mPayloads[IPU_MAX_TERMINAL_COUNT];  // save sizes
+    ia_css_process_group_t* mPGBuffer;
+};
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.cpp
new file mode 100644
index 000000000000..3786144520b6
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.cpp
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "GraphConfigServer"
+
+#include "modules/sandboxing/server/GraphConfigServer.h"
+
+#include <string>
+#include <vector>
+
+#include "CameraLog.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+GraphConfigServer::GraphConfigServer() {
+    LOGIPC("@%s", __func__);
+}
+
+GraphConfigServer::~GraphConfigServer() {
+    LOGIPC("@%s", __func__);
+}
+
+void GraphConfigServer::addCustomKeyMap() {
+    std::shared_ptr<GraphConfigImpl> graphConfigImpl = std::make_shared<GraphConfigImpl>();
+    graphConfigImpl->addCustomKeyMap();
+}
+
+status_t GraphConfigServer::parse(void *pData, size_t dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%zu", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    GraphParseParams *parseParam = nullptr;
+    bool ret = mIpc.serverUnflattenParse(pData, dataSize, &parseParam);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenParse fails", __func__);
+
+    std::shared_ptr<GraphConfigImpl> graphConfigImpl = std::make_shared<GraphConfigImpl>();
+    status_t rt = graphConfigImpl->parse(parseParam->cameraId, parseParam->GD,
+                                         parseParam->gdSize, parseParam->GS, parseParam->gsSize);
+    CheckError(rt != OK, UNKNOWN_ERROR, "@%s, Failed to parse the graph xml data", __func__);
+
+    return OK;
+}
+
+void GraphConfigServer::releaseGraphNodes() {
+    if (mGraphConfigMap.empty()) return;
+    mGraphConfigMap.begin()->second->releaseGraphNodes();
+}
+
+status_t GraphConfigServer::configStreams(void *pData, size_t dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%zu", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    GraphBaseInfo info;
+    GraphSettingType type;
+    std::vector<HalStream*> streams;
+    bool ret = mIpc.serverUnflattenConfigStreams(pData, dataSize, &info, &type, &streams);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenConfigStreams fails", __func__);
+
+    // release the old item
+    auto it = mGraphConfigMap.find(info);
+    if (it != mGraphConfigMap.end()) {
+        mGraphConfigMap.erase(it);
+    }
+    std::shared_ptr<GraphConfigImpl> graphConfigImpl =
+        std::make_shared<GraphConfigImpl>(info.cameraId, info.configMode, type);
+    status_t rt = graphConfigImpl->configStreams(streams);
+    CheckError(rt != OK, ret, "@%s, Failed to configStreams, cameraId: %d, configMode: %d",
+               __func__, info.cameraId, info.configMode);
+
+    mGraphConfigMap[info] = graphConfigImpl;
+
+    return OK;
+}
+
+status_t GraphConfigServer::getGraphConfigData(void *pData, size_t dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%zu", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    GraphBaseInfo info;
+    bool ret = mIpc.serverUnflattenGetGraphData(pData, dataSize, &info);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenGetGraphData fails", __func__);
+
+    LOGIPC("%s, cameraId: %d, configMode: %d", __func__, info.cameraId, info.configMode);
+
+    auto it = mGraphConfigMap.find(info);
+    CheckError(it == mGraphConfigMap.end(), UNKNOWN_ERROR,
+               "%s, Failed to find the graph config. cameraId: %d", __func__, info.cameraId);
+
+    IGraphType::GraphConfigData graphData;
+    status_t rt = it->second->getGraphConfigData(&graphData);
+    CheckError(rt != OK, UNKNOWN_ERROR, "%s, Failed to getGraphConfigData: cameraId: %d",
+               __func__, info.cameraId);
+
+    ret = mIpc.serverFlattenGetGraphData(pData, dataSize, graphData);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGetGraphData fails", __func__);
+
+    return OK;
+}
+
+status_t GraphConfigServer::getPgIdForKernel(void *pData, size_t dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%zu", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    uint32_t streamId = -1;
+    int32_t kernelId = 0;
+    GraphBaseInfo info;
+    bool ret = mIpc.serverUnFlattenGetPgId(pData, dataSize, &info, &streamId, &kernelId);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnFlattenGetPgId fails", __func__);
+
+    LOGIPC("%s, cameraId: %d, configMode: %d", __func__, info.cameraId, info.configMode);
+
+    auto it = mGraphConfigMap.find(info);
+    CheckError(it == mGraphConfigMap.end(), UNKNOWN_ERROR,
+               "%s, Failed to find the graph config. cameraId: %d", __func__, info.cameraId);
+
+    int32_t pgId = -1;
+    it->second->getPgIdForKernel(streamId, kernelId, &pgId);
+
+    ret = mIpc.serverFlattenGetPgId(pData, dataSize, pgId);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGetPgId fails", __func__);
+
+    return OK;
+}
+
+status_t GraphConfigServer::pipelineGetConnections(void *pData, size_t dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%zu", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    GraphBaseInfo info;
+    std::vector<std::string> pgList;
+    bool ret = mIpc.serverUnFlattenGetConnection(pData, dataSize, &info, &pgList);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnFlattenGetPgId fails", __func__);
+
+    LOGIPC("%s, cameraId: %d, configMode: %d", __func__, info.cameraId, info.configMode);
+
+    auto it = mGraphConfigMap.find(info);
+    CheckError(it == mGraphConfigMap.end(), UNKNOWN_ERROR,
+               "%s, Failed to find the graph config. cameraId: %d", __func__, info.cameraId);
+
+    std::vector<IGraphType::PipelineConnection> confVector;
+    std::vector<IGraphType::ScalerInfo> scalerInfo;
+    status_t rt = it->second->pipelineGetConnections(pgList, &scalerInfo, &confVector);
+    CheckError(rt != OK, UNKNOWN_ERROR,
+               "%s, Failed to getConnection: cameraId: %d", __func__, info.cameraId);
+
+    ret = mIpc.serverFlattenGetConnection(pData, dataSize, scalerInfo, confVector);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGetPgId fails", __func__);
+
+    return OK;
+}
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.h
new file mode 100644
index 000000000000..e3bc0985dee9
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <map>
+#include <memory>
+
+#include "iutils/Errors.h"
+#include "modules/algowrapper/graph/GraphConfigImpl.h"
+#include "modules/sandboxing/IPCGraphConfig.h"
+
+namespace icamera {
+class GraphConfigServer {
+ public:
+    GraphConfigServer();
+    virtual ~GraphConfigServer();
+
+    void addCustomKeyMap();
+    status_t parse(void* pData, size_t dataSize);
+    void releaseGraphNodes();
+    status_t configStreams(void *pData, size_t dataSize);
+    status_t getGraphConfigData(void *pData, size_t dataSize);
+    status_t getPgIdForKernel(void *pData, size_t dataSize);
+    status_t pipelineGetConnections(void *pData, size_t dataSize);
+
+ private:
+    std::map<GraphBaseInfo, std::shared_ptr<GraphConfigImpl> > mGraphConfigMap;
+    IPCGraphConfig mIpc;
+};
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.cpp
new file mode 100644
index 000000000000..a45e49f7c8d5
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.cpp
@@ -0,0 +1,337 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelAiqServer"
+
+#include "modules/sandboxing/server/IntelAiqServer.h"
+
+#include <ia_aiq.h>
+#include <ia_cmc_parser.h>
+
+#include <algorithm>
+#include <memory>
+#include <string>
+#include <utility>
+
+namespace icamera {
+IntelAiqServer::IntelAiqServer() {
+    LOGIPC("@%s", __func__);
+}
+
+IntelAiqServer::~IntelAiqServer() {
+    LOGIPC("@%s", __func__);
+}
+
+status_t IntelAiqServer::init(void* pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(aiq_init_params), UNKNOWN_ERROR,
+               "@%s, buffer is small", __func__);
+
+    aiq_init_params* params = static_cast<aiq_init_params*>(pData);
+
+    ia_binary_data aiqbData = {nullptr, 0};
+    ia_binary_data nvmData = {nullptr, 0};
+    ia_binary_data aiqdData = {nullptr, 0};
+    bool ret = mIpc.serverUnflattenInit(pData, dataSize, &aiqbData, &nvmData, &aiqdData);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
+
+    std::unique_ptr<IntelAiq> intelAiq = std::make_unique<IntelAiq>();
+
+    ia_aiq* aiq = intelAiq->init(&aiqbData,
+                                 &nvmData,
+                                 &aiqdData,
+                                 params->stats_max_width,
+                                 params->stats_max_height,
+                                 params->max_num_stats_in,
+                                 reinterpret_cast<ia_cmc_t*>(params->cmcRemoteHandle),
+                                 reinterpret_cast<ia_mkn*>(params->ia_mkn));
+    CheckError(!aiq, UNKNOWN_ERROR, "@%s, intelAiq.init fails", __func__);
+
+    mIntelAiqs[aiq] = std::move(intelAiq);
+
+    params->results = reinterpret_cast<uintptr_t>(aiq);
+
+    return OK;
+}
+
+status_t IntelAiqServer::aeRun(void* pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(ae_run_params), UNKNOWN_ERROR,
+               "@%s, buffer is small", __func__);
+
+    ae_run_params* params = static_cast<ae_run_params*>(pData);
+
+    ia_aiq_ae_input_params* aeParams = nullptr;
+    bool ret = mIpc.serverUnflattenAe(params, &aeParams);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenAe fails", __func__);
+
+    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
+    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
+        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
+        return UNKNOWN_ERROR;
+    }
+
+    ia_aiq_ae_results* aeResults = nullptr;
+    ia_err err = mIntelAiqs[aiq]->aeRun(aeParams, &aeResults);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, aeRun fails %d", __func__, err);
+
+    ret = mIpc.serverFlattenAe(*aeResults, params);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenAe fails", __func__);
+
+    return OK;
+}
+
+status_t IntelAiqServer::afRun(void* pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(af_run_params), UNKNOWN_ERROR,
+               "@%s, buffer is small", __func__);
+
+    af_run_params* params = static_cast<af_run_params*>(pData);
+
+    ia_aiq_af_input_params* afParams = nullptr;
+    bool ret = mIpc.serverUnflattenAf(params, &afParams);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflatten fails", __func__);
+
+    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
+    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
+        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
+        return UNKNOWN_ERROR;
+    }
+
+    ia_aiq_af_results* afResults = nullptr;
+    ia_err err = mIntelAiqs[aiq]->afRun(afParams, &afResults);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, afRun fails %d", __func__, err);
+
+    ret = mIpc.serverFlattenAf(*afResults, params);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlatten fails", __func__);
+
+    return OK;
+}
+
+status_t IntelAiqServer::awbRun(void* pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(awb_run_params), UNKNOWN_ERROR,
+               "@%s, buffer is small", __func__);
+
+    awb_run_params* params = static_cast<awb_run_params*>(pData);
+
+    ia_aiq_awb_input_params* awbParams = nullptr;
+    bool ret = mIpc.serverUnflattenAwb(params, &awbParams);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenAwb fails", __func__);
+
+    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
+    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
+        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
+        return UNKNOWN_ERROR;
+    }
+
+    ia_aiq_awb_results *awbResults = nullptr;
+    ia_err err = mIntelAiqs[aiq]->awbRun(awbParams, &awbResults);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, awbRun fails %d", __func__, err);
+
+    ret = mIpc.serverFlattenAwb(*awbResults, params);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenAwb fails", __func__);
+
+    return OK;
+}
+
+status_t IntelAiqServer::gbceRun(void* pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(gbce_run_params), UNKNOWN_ERROR,
+               "@%s, buffer is small", __func__);
+
+    gbce_run_params *params = static_cast<gbce_run_params*>(pData);
+
+    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
+    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
+        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
+        return UNKNOWN_ERROR;
+    }
+
+    ia_aiq_gbce_results* gbceResults = nullptr;
+    ia_err err = mIntelAiqs[aiq]->gbceRun(&params->base, &gbceResults);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, gbceRun fails %d", __func__, err);
+
+    bool ret = mIpc.serverFlattenGbce(*gbceResults, params);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGbce fails", __func__);
+
+    return OK;
+}
+
+status_t IntelAiqServer::paRunV1(void* pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pa_run_v1_params), UNKNOWN_ERROR,
+               "@%s, buffer is small", __func__);
+
+    pa_run_v1_params* params = static_cast<pa_run_v1_params*>(pData);
+
+    ia_aiq_pa_input_params* paParams = nullptr;
+    bool ret = mIpc.serverUnflattenPaV1(params, &paParams);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenPa fails", __func__);
+
+    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
+    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
+        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
+        return UNKNOWN_ERROR;
+    }
+
+//    ia_aiq_pa_results
+    ia_aiq_pa_results_v1* paResults = nullptr;
+    ia_err err = mIntelAiqs[aiq]->paRunV1(paParams, &paResults);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, paRunV1 fails %d", __func__, err);
+
+    ret = mIpc.serverFlattenPaV1(*paResults, params);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenPa fails", __func__);
+
+    return OK;
+}
+
+status_t IntelAiqServer::saRunV2(void* pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(sa_run_v2_params), UNKNOWN_ERROR,
+               "@%s, buffer is small", __func__);
+
+    sa_run_v2_params* params = static_cast<sa_run_v2_params*>(pData);
+
+    ia_aiq_sa_input_params_v1* saParams = nullptr;
+    bool ret = mIpc.serverUnflattenSaV2(*params, &saParams);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenSaV2 fails", __func__);
+
+    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
+    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
+        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
+        return UNKNOWN_ERROR;
+    }
+
+    ia_aiq_sa_results_v1* saResults = nullptr;
+    ia_err err = mIntelAiqs[aiq]->saRunV2(saParams, &saResults);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, saRunV2 fails %d", __func__, err);
+
+    ret = mIpc.serverFlattenSaV2(*saResults, params);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenSaV2 fails", __func__);
+
+    return OK;
+}
+
+status_t IntelAiqServer::statisticsSetV4(void* pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(set_statistics_set_v4_params), UNKNOWN_ERROR,
+               "@%s, buffer is small", __func__);
+
+    set_statistics_set_v4_params* params = static_cast<set_statistics_set_v4_params*>(pData);
+
+    ia_aiq_statistics_input_params_v4* stat = nullptr;
+    bool ret = mIpc.serverUnflattenStatSetV4(params, &stat);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenStatSetV4 fails", __func__);
+
+    if (stat->faces) {
+        LOGIPC("@%s, num_faces:%d", __func__, stat->faces->num_faces);
+        if (stat->faces->num_faces > 0) {
+            ia_rectangle& rect = stat->faces->faces[0].face_area;
+            LOGIPC("@%s, left:%d, top:%d, right:%d, bottom:%d", __func__,
+                   rect.left, rect.top, rect.right, rect.bottom);
+        }
+    }
+
+    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->ia_aiq);
+    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
+        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
+        return UNKNOWN_ERROR;
+    }
+
+    ia_err err = mIntelAiqs[aiq]->statisticsSetV4(stat);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR,
+               "@%s, statisticsSetV4 fails %d", __func__, err);
+
+    return OK;
+}
+
+status_t IntelAiqServer::getAiqdData(void* pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(ia_binary_data_params), UNKNOWN_ERROR,
+               "@%s, buffer is small", __func__);
+
+    ia_binary_data binaryData = {nullptr, 0};
+
+    ia_binary_data_params* params = static_cast<ia_binary_data_params*>(pData);
+
+    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
+    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
+        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
+        return UNKNOWN_ERROR;
+    }
+
+    ia_err err = mIntelAiqs[aiq]->getAiqdData(&binaryData);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, getAiqdData fails %d", __func__, err);
+    LOGIPC("@%s, binary_data, data:%p, size:%d", __func__, binaryData.data, binaryData.size);
+
+    MEMCPY_S(params->data, sizeof(params->data), binaryData.data, binaryData.size);
+    params->size = binaryData.size;
+
+    return OK;
+}
+
+status_t IntelAiqServer::deinit(void* pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(aiq_deinit_params), UNKNOWN_ERROR,
+               "@%s, buffer is small", __func__);
+
+    aiq_deinit_params* params = static_cast<aiq_deinit_params*>(pData);
+
+    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
+    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
+        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
+        return UNKNOWN_ERROR;
+    }
+
+    mIntelAiqs[aiq]->deinit();
+
+    return OK;
+}
+
+status_t IntelAiqServer::getVersion(void* pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(ia_aiq_version_params), UNKNOWN_ERROR,
+               "@%s, buffer is small", __func__);
+
+    ia_aiq_version_params* params = static_cast<ia_aiq_version_params*>(pData);
+
+    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
+    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
+        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
+        return UNKNOWN_ERROR;
+    }
+
+    std::string version;
+    mIntelAiqs[aiq]->getVersion(&version);
+    snprintf(params->data, sizeof(params->data), "%s", version.c_str());
+    params->size = std::min(version.size(), sizeof(params->data));
+    LOGIPC("@%s, aiq version:%s, size:%d", __func__, version.c_str(), params->size);
+
+    return OK;
+}
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.h
new file mode 100644
index 000000000000..fe4b0bcb9a66
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+#include <unordered_map>
+
+#include "modules/algowrapper/IntelAiq.h"
+
+#include "modules/sandboxing/IPCCommon.h"
+#include "modules/sandboxing/IPCIntelAiq.h"
+
+namespace icamera {
+class IntelAiqServer {
+ public:
+    IntelAiqServer();
+    virtual ~IntelAiqServer();
+
+    status_t init(void* pData, int dataSize);
+    status_t aeRun(void* pData, int dataSize);
+    status_t afRun(void* pData, int dataSize);
+    status_t awbRun(void* pData, int dataSize);
+    status_t gbceRun(void* pData, int dataSize);
+    status_t paRunV1(void* pData, int dataSize);
+    status_t saRunV2(void* pData, int dataSize);
+    status_t statisticsSetV4(void* pData, int dataSize);
+    status_t getAiqdData(void* pData, int dataSize);
+    status_t deinit(void* pData, int dataSize);
+    status_t getVersion(void* pData, int dataSize);
+
+ private:
+    IPCIntelAiq mIpc;
+    std::unordered_map<ia_aiq*, std::unique_ptr<IntelAiq>> mIntelAiqs;
+};
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.cpp
new file mode 100644
index 000000000000..a8157a05ea71
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.cpp
@@ -0,0 +1,484 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelAlgoServer"
+
+#include "modules/sandboxing/server/IntelAlgoServer.h"
+
+#include <ia_log.h>
+
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+
+#include <base/logging.h>
+
+#include <memory>
+#include <string>
+
+#include "iutils/Utils.h"
+
+namespace icamera {
+
+IntelAlgoServer* IntelAlgoServer::mInstance = nullptr;
+
+void IntelAlgoServer::init() {
+    LOGIPC("@%s", __func__);
+
+    if (mInstance == nullptr) {
+        mInstance = new IntelAlgoServer;
+    }
+}
+
+void IntelAlgoServer::deInit() {
+    LOGIPC("@%s", __func__);
+
+    delete mInstance;
+    mInstance = nullptr;
+}
+
+IntelAlgoServer::IntelAlgoServer():
+    mCallback(nullptr) {
+    LOGIPC("@%s", __func__);
+
+    ia_env env = {&Log::ccaPrintDebug, &Log::ccaPrintError, &Log::ccaPrintInfo};
+    ia_log_init(&env);
+
+    for (int i = 0; i < IPC_GROUP_NUM; i++) {
+        std::string name =
+            std::string("IntelAlgoServer") + std::to_string(i) + std::string(" Thread");
+        mThreads[i] = std::unique_ptr<base::Thread>(new base::Thread(name));
+        mThreads[i]->Start();
+    }
+
+    for (int32_t i = 1; i <= HANDLE_INDEX_MAX_VALUE; i++) {
+        mHandlesQueue.push(i);
+    }
+}
+
+IntelAlgoServer::~IntelAlgoServer() {
+    LOGIPC("@%s", __func__);
+
+    ia_log_deinit();
+}
+
+int32_t IntelAlgoServer::initialize(const camera_algorithm_callback_ops_t* callback_ops) {
+    LOGIPC("@%s, callback_ops:%p", __func__, callback_ops);
+
+    CheckError((!callback_ops), -EINVAL, "@%s, the callback_ops is nullptr", __func__);
+
+    mCallback = callback_ops;
+
+    return 0;
+}
+
+int32_t IntelAlgoServer::registerBuffer(int buffer_fd) {
+    LOGIPC("@%s, buffer_fd:%d", __func__, buffer_fd);
+
+    std::lock_guard<std::mutex> l(mRegisterBufMutex);
+    CheckError((mHandles.find(buffer_fd) != mHandles.end()),
+                -EINVAL, "@%s, Buffer already registered", __func__);
+    CheckError(mHandlesQueue.empty(), -EBADFD, "@%s, Failed to get buffer handle index", __func__);
+
+    struct stat sb;
+    int ret = fstat(buffer_fd, &sb);
+    CheckError((ret == -1), -EBADFD, "@%s, Failed to get buffer status", __func__);
+
+    void* addr = mmap(0, sb.st_size, PROT_WRITE, MAP_SHARED, buffer_fd, 0);
+    CheckError((!addr), -EBADFD, "@%s, Failed to map buffer", __func__);
+
+    int32_t handle = mHandlesQueue.front();
+    mHandlesQueue.pop();
+    mHandles[buffer_fd] = handle;
+
+    mShmInfoMap[handle].fd = buffer_fd;
+    mShmInfoMap[handle].addr = addr;
+    mShmInfoMap[handle].size = sb.st_size;
+
+    return handle;
+}
+
+int IntelAlgoServer::parseReqHeader(const uint8_t req_header[], uint32_t size) {
+    LOGIPC("@%s, size:%d", __func__, size);
+
+    CheckError(size < IPC_REQUEST_HEADER_USED_NUM || req_header[0] != IPC_MATCHING_KEY, -1,
+               "@%s, fails, req_header[0]:%d, size:%d", __func__, req_header[0], size);
+
+    return 0;
+}
+
+void IntelAlgoServer::returnCallback(uint32_t req_id, status_t status, int32_t buffer_handle) {
+    LOGIPC("@%s, req_id:%d:%s, status:%d", __func__,
+         req_id, IntelAlgoIpcCmdToString(static_cast<IPC_CMD>(req_id)), status);
+    (*mCallback->return_callback)(mCallback, req_id, (status == OK ? 0 : 1), buffer_handle);
+}
+
+status_t IntelAlgoServer::getShmInfo(const int32_t buffer_handle, ShmInfo *memInfo) {
+    CheckError(!memInfo, UNKNOWN_ERROR, "%s, memInfo is nullptr", __func__);
+    if (buffer_handle == -1)
+        return OK;
+
+    CheckError(mShmInfoMap.find(buffer_handle) == mShmInfoMap.end(),
+               UNKNOWN_ERROR, "%s, Invalid buffer handle", __func__);
+    *memInfo = mShmInfoMap[buffer_handle];
+
+    LOGIPC("@%s, fd:%d, size:%zu, addr: %p",
+           __func__, memInfo->fd, memInfo->size, memInfo->addr);
+
+    return OK;
+}
+
+void IntelAlgoServer::handleRequest(const MsgReq& msg) {
+    uint32_t req_id = msg.req_id;
+    int32_t buffer_handle = msg.buffer_handle;
+
+    ShmInfo info = {};
+    status_t status = getShmInfo(buffer_handle, &info);
+    if (status != OK) {
+        LOGE("@%s, Invalid buffer handle", __func__);
+        returnCallback(req_id, UNKNOWN_ERROR, buffer_handle);
+        return;
+    }
+
+    size_t requestSize = info.size;
+    void *addr = info.addr;
+    LOGIPC("@%s, req_id:%d:%s, requestSize:%zu, addr:%p, buffer_handle:%d",
+         __func__, req_id, IntelAlgoIpcCmdToString(static_cast<IPC_CMD>(req_id)),
+         requestSize, addr, buffer_handle);
+
+    switch (req_id) {
+        case IPC_LARD_INIT:
+            status = mLard.init(addr, requestSize);
+            break;
+        case IPC_LARD_GET_TAG_LIST:
+            status = mLard.getTagList(addr, requestSize);
+            break;
+        case IPC_LARD_RUN:
+            status = mLard.run(addr, requestSize);
+            break;
+        case IPC_LARD_DEINIT:
+            status = mLard.deinit(addr, requestSize);
+            break;
+        case IPC_FD_INIT:
+            status = mFaceDetection.init(addr, requestSize);
+            break;
+        case IPC_FD_RUN: {
+            FaceDetectionRunParams *palParams = static_cast<FaceDetectionRunParams*>(addr);
+            void *addrImage = nullptr;
+            if (palParams->bufferHandle >= 0) {
+                ShmInfo imageDataInfo;
+                status = getShmInfo(palParams->bufferHandle, &imageDataInfo);
+                if (status != OK) {
+                    LOGE("%s, the buffer handle for image data is invalid", __func__);
+                    break;
+                }
+                addrImage = imageDataInfo.addr;
+            }
+            status = mFaceDetection.run(addr, requestSize, addrImage);
+            break;
+        }
+        case IPC_FD_DEINIT:
+            status = mFaceDetection.deinit();
+            break;
+        case IPC_GRAPH_ADD_KEY:
+            mGraph.addCustomKeyMap();
+            break;
+        case IPC_GRAPH_PARSE:
+            mGraph.parse(addr, requestSize);
+            break;
+        case IPC_GRAPH_RELEASE_NODES:
+            mGraph.releaseGraphNodes();
+            break;
+        case IPC_GRAPH_CONFIG_STREAMS:
+            mGraph.configStreams(addr, requestSize);
+            break;
+        case IPC_GRAPH_GET_CONFIG_DATA:
+            mGraph.getGraphConfigData(addr, requestSize);
+            break;
+        case IPC_GRAPH_GET_CONNECTION:
+            mGraph.pipelineGetConnections(addr, requestSize);
+            break;
+        case IPC_GRAPH_GET_PG_ID:
+            mGraph.getPgIdForKernel(addr, requestSize);
+            break;
+        case IPC_CMC_INIT:
+            status = mCmc.init(addr, requestSize);
+            break;
+        case IPC_CMC_DEINIT:
+            status = mCmc.deinit(addr, requestSize);
+            break;
+        case IPC_MKN_INIT:
+            status = mMkn.init(addr, requestSize);
+            break;
+        case IPC_MKN_ENABLE:
+            status = mMkn.enable(addr, requestSize);
+            break;
+        case IPC_MKN_PREPARE:
+            status = mMkn.prepare(addr, requestSize);
+            break;
+        case IPC_MKN_DEINIT:
+            status = mMkn.deinit(addr, requestSize);
+            break;
+        case IPC_LTM_INIT:
+            status = mLtm.init(addr, requestSize);
+            break;
+        case IPC_LTM_RUN:
+            status = mLtm.run(addr, requestSize);
+            break;
+        case IPC_LTM_DEINIT:
+            status = mLtm.deinit(addr, requestSize);
+            break;
+        case IPC_AIQ_INIT:
+            status = mAiq.init(addr, requestSize);
+            break;
+        case IPC_AIQ_AE_RUN:
+            status = mAiq.aeRun(addr, requestSize);
+            break;
+        case IPC_AIQ_AF_RUN:
+            status = mAiq.afRun(addr, requestSize);
+            break;
+        case IPC_AIQ_AWB_RUN:
+            status = mAiq.awbRun(addr, requestSize);
+            break;
+        case IPC_AIQ_GBCE_RUN:
+            status = mAiq.gbceRun(addr, requestSize);
+            break;
+        case IPC_AIQ_PA_RUN_V1:
+            status = mAiq.paRunV1(addr, requestSize);
+            break;
+        case IPC_AIQ_SA_RUN_V2:
+            status = mAiq.saRunV2(addr, requestSize);
+            break;
+        case IPC_AIQ_STATISTICS_SET_V4:
+            status = mAiq.statisticsSetV4(addr, requestSize);
+            break;
+        case IPC_AIQ_GET_AIQD_DATA:
+            status = mAiq.getAiqdData(addr, requestSize);
+            break;
+        case IPC_AIQ_DEINIT:
+            status = mAiq.deinit(addr, requestSize);
+            break;
+        case IPC_AIQ_GET_VERSION:
+            status = mAiq.getVersion(addr, requestSize);
+            break;
+        case IPC_DVS_INIT:
+            status = mDvs.init(addr, requestSize);
+            break;
+        case IPC_DVS_CONFIG:
+            status = mDvs.config(addr, requestSize);
+            break;
+        case IPC_DVS_SET_NONE_BLANK_RATION:
+            status = mDvs.setNonBlankRatio(addr, requestSize);
+            break;
+        case IPC_DVS_SET_DIGITAL_ZOOM_MODE:
+            status = mDvs.setDigitalZoomMode(addr, requestSize);
+            break;
+        case IPC_DVS_SET_DIGITAL_ZOOM_REGION:
+            status = mDvs.setDigitalZoomRegion(addr, requestSize);
+            break;
+        case IPC_DVS_SET_DIGITAL_ZOOM_COORDINATE:
+            status = mDvs.setDigitalZoomCoordinate(addr, requestSize);
+            break;
+        case IPC_DVS_SET_DIGITAL_ZOOM_MAGNITUDE:
+            status = mDvs.setDigitalZoomMagnitude(addr, requestSize);
+            break;
+        case IPC_DVS_FREE_MORPH_TABLE:
+            status = mDvs.freeMorphTable(addr, requestSize);
+            break;
+        case IPC_DVS_ALLOCATE_MORPH_TABLE:
+            status = mDvs.allocateMorphTalbe(addr, requestSize);
+            break;
+        case IPC_DVS_GET_MORPH_TABLE:
+            status = mDvs.getMorphTalbe(addr, requestSize);
+            break;
+        case IPC_DVS_SET_STATISTICS:
+            status = mDvs.setStatistics(addr, requestSize);
+            break;
+        case IPC_DVS_EXECUTE:
+            status = mDvs.execute(addr, requestSize);
+            break;
+        case IPC_DVS_GET_IMAGE_TRANSFORMATION:
+            status = mDvs.getImageTransformation(addr, requestSize);
+            break;
+        case IPC_DVS_DEINIT:
+            status = mDvs.deinit(addr, requestSize);
+            break;
+        case IPC_ISP_ADAPTOR_INIT:
+            status = mIspAdaptor.init(addr, requestSize);
+            break;
+        case IPC_ISP_ADAPTOR_DEINIT:
+            status = mIspAdaptor.deInit(addr, requestSize);
+            break;
+        case IPC_ISP_GET_PAL_SIZE:
+            status = mIspAdaptor.getPalDataSize(addr, requestSize);
+            break;
+        case IPC_ISP_CONVERT_STATS:
+            status = mIspAdaptor.queryAndConvertStats(addr, requestSize);
+            break;
+        case IPC_ISP_RUN_PAL: {
+            RunPalParam *palParams = static_cast<RunPalParam*>(addr);
+            ShmInfo palDataInfo;
+            status = getShmInfo(palParams->palDataHandle, &palDataInfo);
+            if (status != OK) {
+                LOGE("%s, the buffer handle for pal data is invalid", __func__);
+                break;
+            }
+            LOGIPC("@%s, pal data info: fd:%d, size:%zu, addr: %p",
+                    __func__, palDataInfo.fd, palDataInfo.size, palDataInfo.addr);
+
+            status = mIspAdaptor.runPal(addr, requestSize, palDataInfo.addr);
+
+            break;
+        }
+        case IPC_PG_PARAM_INIT:
+            status = mPGParam.init(addr, requestSize);
+            break;
+        case IPC_PG_PARAM_PREPARE: {
+            pg_param_prepare_params *prepareParams = static_cast<pg_param_prepare_params*>(addr);
+            ShmInfo palDataInfo = {};
+            status = getShmInfo(prepareParams->ipuParamHandle, &palDataInfo);
+            if (status != OK) {
+                LOGE("%s, the buffer handle for pal data is invalid", __func__);
+                break;
+            }
+
+            status = mPGParam.prepare(addr, requestSize, palDataInfo.addr);
+            break;
+        }
+        case IPC_PG_PARAM_ALLOCATE_PG:
+            status = mPGParam.allocatePGBuffer(addr, requestSize);
+            break;
+        case IPC_PG_PARAM_GET_FRAG_DESCS:
+            status = mPGParam.getFragmentDescriptors(addr, requestSize);
+            break;
+        case IPC_PG_PARAM_PREPARE_PROGRAM:
+            status = mPGParam.setPGAndPrepareProgram(addr, requestSize);
+            break;
+        case IPC_PG_PARAM_ALLOCATE_PAYLOADS:
+            status = mPGParam.allocatePayloads(addr, requestSize);
+            break;
+        case IPC_PG_PARAM_ENCODE: {
+            pg_param_encode_params *encodeParams = static_cast<pg_param_encode_params*>(addr);
+            ShmInfo palDataInfo = {};
+            status = getShmInfo(encodeParams->ipuParamHandle, &palDataInfo);
+            if (status != OK) {
+                LOGE("%s, the buffer handle for pal data is invalid", __func__);
+                break;
+            }
+
+            status = mPGParam.updatePALAndEncode(addr, requestSize, palDataInfo.addr);
+            break;
+        }
+        case IPC_PG_PARAM_DECODE:
+            status = mPGParam.decode(addr, requestSize);
+            break;
+        case IPC_PG_PARAM_DEINIT:
+            mPGParam.deinit(addr, requestSize);
+            break;
+        default:
+            LOGE("@%s, req_id:%d is not defined", __func__, req_id);
+            status = UNKNOWN_ERROR;
+            break;
+    }
+
+    returnCallback(req_id, status, buffer_handle);
+}
+
+void IntelAlgoServer::request(uint32_t req_id,
+                              const uint8_t req_header[],
+                              uint32_t size,
+                              int32_t buffer_handle) {
+    LOGIPC("@%s, size:%d, buffer_handle:%d", __func__, size, buffer_handle);
+    LOGIPC("@%s, req_id:%d:%s", __func__,
+           req_id, IntelAlgoIpcCmdToString(static_cast<IPC_CMD>(req_id)));
+
+    IPC_GROUP group = IntelAlgoIpcCmdToGroup(static_cast<IPC_CMD>(req_id));
+    LOGIPC("@%s, group:%d", __func__, group);
+
+    int ret = parseReqHeader(req_header, size);
+    if (ret != 0) {
+        returnCallback(req_id, UNKNOWN_ERROR, buffer_handle);
+        return;
+    }
+
+    MsgReq msg = {req_id, buffer_handle};
+
+    mThreads[group]->task_runner()->PostTask(FROM_HERE,
+        base::Bind(&IntelAlgoServer::handleRequest, base::Unretained(this), msg));
+}
+
+void IntelAlgoServer::deregisterBuffers(const int32_t buffer_handles[], uint32_t size) {
+    LOGIPC("@%s, size:%d", __func__, size);
+
+    std::lock_guard<std::mutex> l(mRegisterBufMutex);
+    for (uint32_t i = 0; i < size; i++) {
+        int32_t handle = buffer_handles[i];
+        if (mShmInfoMap.find(handle) == mShmInfoMap.end()) {
+            continue;
+        }
+
+        mHandles.erase(mShmInfoMap[handle].fd);
+
+        munmap(mShmInfoMap[handle].addr, mShmInfoMap[handle].size);
+        close(mShmInfoMap[handle].fd);
+        mShmInfoMap.erase(handle);
+        mHandlesQueue.push(handle);
+    }
+}
+
+static int32_t initialize(const camera_algorithm_callback_ops_t* callback_ops) {
+    LOGIPC("@%s, callback_ops:%p", __func__, callback_ops);
+    return IntelAlgoServer::getInstance()->initialize(callback_ops);
+}
+
+static int32_t registerBuffer(int32_t buffer_fd) {
+    LOGIPC("@%s, buffer_fd:%d", __func__, buffer_fd);
+    return IntelAlgoServer::getInstance()->registerBuffer(buffer_fd);
+}
+
+static void request(uint32_t req_id,
+                    const uint8_t req_header[],
+                    uint32_t size,
+                    int32_t buffer_handle) {
+    LOGIPC("@%s, size:%d, buffer_handle:%d", __func__, size, buffer_handle);
+    IntelAlgoServer::getInstance()->request(req_id, req_header, size, buffer_handle);
+}
+
+static void deregisterBuffers(const int32_t buffer_handles[], uint32_t size) {
+    LOGIPC("@%s, size:%d", __func__, size);
+    return IntelAlgoServer::getInstance()->deregisterBuffers(buffer_handles, size);
+}
+
+extern "C" {
+camera_algorithm_ops_t CAMERA_ALGORITHM_MODULE_INFO_SYM
+    __attribute__((__visibility__("default"))) = {
+        .initialize = initialize,
+        .register_buffer = registerBuffer,
+        .request = request,
+        .deregister_buffers = deregisterBuffers
+    };
+}
+
+__attribute__((constructor)) void initIntelAlgoServer() {
+    icamera::Log::setDebugLevel();
+    IntelAlgoServer::init();
+}
+
+__attribute__((destructor)) void deinitIntelAlgoServer() {
+    IntelAlgoServer::deInit();
+}
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.h
new file mode 100644
index 000000000000..c5d8844df7bc
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.h
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "IntelLardServer.h"
+#include "IntelFDServer.h"
+#include "GraphConfigServer.h"
+#include "IntelCmcServer.h"
+#include "IntelMknServer.h"
+#include "IntelLtmServer.h"
+#include "IntelAiqServer.h"
+#include "IntelDvsServer.h"
+#include "IspParamAdaptorServer.h"
+#include "IntelPGParamServer.h"
+
+#include <base/bind.h>
+#include <base/threading/thread.h>
+
+#include <memory>
+#include <queue>
+#include <unordered_map>
+
+#include "cros-camera/camera_algorithm.h"
+#include "modules/sandboxing/IPCCommon.h"
+#include "iutils/Errors.h"
+#include "CameraLog.h"
+#include "iutils/Thread.h"
+
+namespace icamera {
+
+#define HANDLE_INDEX_MAX_VALUE 1024
+struct MsgReq {
+    uint32_t req_id;
+    int32_t buffer_handle;
+};
+
+class IntelAlgoServer {
+ public:
+    static void init();
+    static void deInit();
+
+    static IntelAlgoServer* getInstance() { return mInstance; }
+
+    int32_t initialize(const camera_algorithm_callback_ops_t* callback_ops);
+    int32_t registerBuffer(int buffer_fd);
+    void request(uint32_t req_id,
+                 const uint8_t req_header[],
+                 uint32_t size,
+                 int32_t buffer_handle);
+    void deregisterBuffers(const int32_t buffer_handles[], uint32_t size);
+
+    void handleRequest(const MsgReq& msg);
+
+ private:
+    IntelAlgoServer();
+    ~IntelAlgoServer();
+
+    typedef struct {
+        int32_t fd;
+        void* addr;
+        size_t size;
+    } ShmInfo;
+    status_t getShmInfo(const int32_t buffer_handle, ShmInfo *memInfo);
+    int parseReqHeader(const uint8_t req_header[], uint32_t size);
+
+    void returnCallback(uint32_t req_id, status_t status, int32_t buffer_handle);
+
+ private:
+    static IntelAlgoServer* mInstance;
+
+    std::unique_ptr<base::Thread> mThreads[IPC_GROUP_NUM];
+    const camera_algorithm_callback_ops_t* mCallback;
+
+    // key: shared memory fd from client
+    // value: handle that returns from RegisterBuffer()
+    std::unordered_map<int32_t, int32_t> mHandles;
+
+    // key: handle that returns from RegisterBuffer()
+    // value: shared memory fd and mapped address
+    std::unordered_map<int32_t, ShmInfo> mShmInfoMap;
+    std::queue<int32_t> mHandlesQueue;
+    std::mutex mRegisterBufMutex;
+
+    IntelLardServer mLard;
+    IntelFDServer mFaceDetection;
+    GraphConfigServer mGraph;
+    IntelCmcServer mCmc;
+    IntelMknServer mMkn;
+    IntelLtmServer mLtm;
+    IntelAiqServer mAiq;
+    IntelDvsServer mDvs;
+    IspParamAdaptorServer mIspAdaptor;
+    IntelPGParamServer mPGParam;
+};
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.cpp
new file mode 100644
index 000000000000..5d53f7549da5
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.cpp
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelCmcServer"
+
+#include "modules/sandboxing/server/IntelCmcServer.h"
+
+#include <ia_cmc_parser.h>
+
+#include <string.h>
+#include <utility>
+
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+
+IntelCmcServer::IntelCmcServer() {
+    LOGIPC("@%s", __func__);
+}
+
+IntelCmcServer::~IntelCmcServer() {
+    LOGIPC("@%s", __func__);
+
+    mIntelCmcs.clear();
+}
+
+status_t IntelCmcServer::init(void* pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(cmc_init_params), UNKNOWN_ERROR,
+               "@%s, buffer is small", __func__);
+
+    cmc_init_params* params = static_cast<cmc_init_params*>(pData);
+    ia_binary_data aiqbData = {nullptr, 0};
+
+    bool ret = mIpc.serverUnflattenInit(*params, &aiqbData);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
+
+    std::unique_ptr<IntelCmc> intelCmc = std::make_unique<IntelCmc>();
+
+    ret = intelCmc->init(&aiqbData, nullptr);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, intelCmc->init fails", __func__);
+
+    ia_cmc_t* cmc = intelCmc->getCmc();
+    CheckError(!cmc, UNKNOWN_ERROR, "@%s, cmc is nullptr", __func__);
+    LOGIPC("@%s, cmc:%p", __func__, cmc);
+
+    ret = mIpc.serverFlattenInit(*cmc, params);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenInit fails", __func__);
+
+    mIntelCmcs[cmc] = std::move(intelCmc);
+
+    return OK;
+}
+
+status_t IntelCmcServer::deinit(void* pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(cmc_deinit_params), UNKNOWN_ERROR,
+               "@%s, buffer is small", __func__);
+
+    cmc_deinit_params* params = static_cast<cmc_deinit_params*>(pData);
+
+    ia_cmc_t* cmc = reinterpret_cast<ia_cmc_t*>(params->cmc_handle);
+    LOGIPC("@%s, cmc:%p", __func__, cmc);
+
+    if (mIntelCmcs.find(cmc) == mIntelCmcs.end()) {
+        LOGE("@%s, cmc:%p doesn't exist", __func__, cmc);
+        return UNKNOWN_ERROR;
+    }
+
+    mIntelCmcs[cmc]->deinit();
+
+    mIntelCmcs.erase(cmc);
+
+    return OK;
+}
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.h
new file mode 100644
index 000000000000..d4ecca2004d4
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+#include <unordered_map>
+
+#include "modules/algowrapper/IntelCmc.h"
+#include "modules/sandboxing/IPCCommon.h"
+#include "modules/sandboxing/IPCIntelCmc.h"
+
+namespace icamera {
+class IntelCmcServer {
+ public:
+    IntelCmcServer();
+    virtual ~IntelCmcServer();
+
+    status_t init(void* pData, int dataSize);
+    status_t deinit(void* pData, int dataSize);
+
+ private:
+    std::unordered_map<ia_cmc_t*, std::unique_ptr<IntelCmc>> mIntelCmcs;
+    IPCIntelCmc mIpc;
+};
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.cpp
new file mode 100644
index 000000000000..92bb4f1cef20
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.cpp
@@ -0,0 +1,317 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelDvsServer"
+
+#include "modules/sandboxing/server/IntelDvsServer.h"
+
+#include <utility>
+
+#include "CameraLog.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+IntelDvsServer::IntelDvsServer() {
+    LOGIPC("@%s", __func__);
+}
+
+IntelDvsServer::~IntelDvsServer() {
+    LOGIPC("@%s", __func__);
+
+    mIntelDvss.clear();
+}
+
+status_t IntelDvsServer::init(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    ia_binary_data *dvsDataPtr = nullptr;
+    ia_cmc_t *cmc = nullptr;
+    bool ret = mIpc.serverUnflattenInit(pData, dataSize, &dvsDataPtr, &cmc);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
+
+    std::unique_ptr<IntelDvs> intelDvs = std::make_unique<IntelDvs>();
+
+    ia_dvs_state *dvs = nullptr;
+    ia_err err = intelDvs->init(*dvsDataPtr, cmc, &dvs);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, intelDvs->init fails", __func__);
+
+    ret = mIpc.serverFlattenInit(pData, dataSize, dvs);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverflattenInit fails", __func__);
+
+    mIntelDvss[dvs] = std::move(intelDvs);
+
+    return OK;
+}
+
+status_t IntelDvsServer::deinit(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    ia_dvs_state *dvs = nullptr;
+    bool ret = mIpc.serverUnflattenDeinit(pData, dataSize, &dvs);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenDeinit fails", __func__);
+
+    IntelDvs *intelDvs = getIntelDvs(dvs);
+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
+
+    intelDvs->deinit(dvs);
+    return OK;
+}
+
+status_t IntelDvsServer::config(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    ia_dvs_state *dvs = nullptr;
+    ia_dvs_configuration *config = nullptr;
+    float zoomRatio = 0;
+    bool ret = mIpc.serverUnflattenConfig(pData, dataSize, &dvs, &config, &zoomRatio);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenConfig fails", __func__);
+
+    IntelDvs *intelDvs = getIntelDvs(dvs);
+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
+
+    ia_err err = intelDvs->config(dvs, config, zoomRatio);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, config fails", __func__);
+    return OK;
+}
+
+status_t IntelDvsServer::setNonBlankRatio(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    ia_dvs_state *dvs = nullptr;
+    float nonBlankingRatio = 0;
+    bool ret = mIpc.serverUnflattenNoneBlanckRation(pData, dataSize, &dvs, &nonBlankingRatio);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenNoneBlanckRation fails", __func__);
+
+    IntelDvs *intelDvs = getIntelDvs(dvs);
+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
+
+    ia_err err = intelDvs->setNonBlankRatio(dvs, nonBlankingRatio);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, setNonBlankRatio fails", __func__);
+    return OK;
+}
+
+status_t IntelDvsServer::setDigitalZoomMode(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    ia_dvs_state *dvs = nullptr;
+    ia_dvs_zoom_mode zoomMode = ia_dvs_zoom_mode_center;
+    bool ret = mIpc.serverUnflattenDigitalZoomMode(pData, dataSize, &dvs, &zoomMode);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenDigitalZoomMode fails", __func__);
+
+    IntelDvs *intelDvs = getIntelDvs(dvs);
+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
+
+    ia_err err = intelDvs->setDigitalZoomMode(dvs, zoomMode);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, setDigitalZoomMode fails", __func__);
+    return OK;
+}
+
+status_t IntelDvsServer::setDigitalZoomRegion(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    ia_dvs_state *dvs = nullptr;
+    ia_rectangle *zoomRegion = nullptr;
+    bool ret = mIpc.serverUnflattenDigitalZoomRegion(pData, dataSize, &dvs, &zoomRegion);
+    CheckError(ret == false, UNKNOWN_ERROR,
+               "@%s, serverUnflattenDigitalZoomRegion fails", __func__);
+
+    IntelDvs *intelDvs = getIntelDvs(dvs);
+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
+
+    ia_err err = intelDvs->setDigitalZoomRegion(dvs, zoomRegion);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, setDigitalZoomRegion fails", __func__);
+    return OK;
+}
+
+status_t IntelDvsServer::setDigitalZoomCoordinate(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    ia_dvs_state *dvs = nullptr;
+    ia_coordinate *zoomCoordinate = nullptr;
+    bool ret = mIpc.serverUnflattenDigitalZoomCoordinate(pData, dataSize, &dvs, &zoomCoordinate);
+    CheckError(ret == false, UNKNOWN_ERROR,
+               "@%s, serverUnflattenDigitalZoomCoordinate fails", __func__);
+
+    IntelDvs *intelDvs = getIntelDvs(dvs);
+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
+
+    ia_err err = intelDvs->setDigitalZoomCoordinate(dvs, zoomCoordinate);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR,
+               "@%s, setDigitalZoomCoordinate fails", __func__);
+    return OK;
+}
+
+status_t IntelDvsServer::setDigitalZoomMagnitude(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    ia_dvs_state *dvs = nullptr;
+    float zoomRatio = 0;
+    bool ret = mIpc.serverUnflattenDigitalZoomMagnitude(pData, dataSize, &dvs, &zoomRatio);
+    CheckError(ret == false,
+               UNKNOWN_ERROR, "@%s, serverUnflattenDigitalZoomMagnitude fails", __func__);
+
+    IntelDvs *intelDvs = getIntelDvs(dvs);
+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
+
+    ia_err err = intelDvs->setDigitalZoomMagnitude(dvs, zoomRatio);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR,
+               "@%s, setDigitalZoomMagnitude fails", __func__);
+    return OK;
+}
+
+status_t IntelDvsServer::freeMorphTable(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    ia_dvs_morph_table *morph = nullptr;
+    ia_dvs_state *dvs = nullptr;
+    bool ret = mIpc.serverUnflattenFreeMorphTable(pData, dataSize, &dvs, &morph);
+    CheckError(ret == false, UNKNOWN_ERROR,
+               "@%s, serverUnflattenFreeMorphTable fails", __func__);
+
+    IntelDvs *intelDvs = getIntelDvs(dvs);
+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
+
+    intelDvs->freeMorphTable(dvs, morph);
+    return OK;
+}
+
+status_t IntelDvsServer::allocateMorphTalbe(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    ia_dvs_state *dvs = nullptr;
+    bool ret = mIpc.serverUnflattenAllocateMorphTalbe(pData, dataSize, &dvs);
+    CheckError(ret == false, UNKNOWN_ERROR,
+               "@%s, serverUnflattenAllocateMorphTalbe fails", __func__);
+
+    IntelDvs *intelDvs = getIntelDvs(dvs);
+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
+
+    ia_dvs_morph_table *morph = intelDvs->allocateMorphTalbe(dvs);
+
+    ret = mIpc.serverFlattenAllocateMorphTalbe(pData, dataSize, morph);
+    CheckError(ret == false, UNKNOWN_ERROR,
+               "@%s, serverFlattenAllocateMorphTalbe fails", __func__);
+
+    return OK;
+}
+
+status_t IntelDvsServer::getMorphTalbe(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    ia_dvs_state *dvs = nullptr;
+    ia_dvs_morph_table *morph = nullptr;
+    bool ret = mIpc.serverUnflattenGetMorphTalbe(pData, dataSize, &dvs, &morph);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenGetMorphTalbe fails", __func__);
+
+    IntelDvs *intelDvs = getIntelDvs(dvs);
+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
+
+    int err = intelDvs->getMorphTable(dvs, morph);
+    CheckError(err != OK, UNKNOWN_ERROR, "@%s, getMorphTalbe fails", __func__);
+
+    ret = mIpc.serverFlattenGetMorphTalbe(pData, dataSize, morph);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGetMorphTalbe fails", __func__);
+
+    return OK;
+}
+
+status_t IntelDvsServer::setStatistics(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    ia_dvs_state *dvs = nullptr;
+    ia_dvs_statistics *statistics = nullptr;
+    ia_aiq_ae_results *aeResults = nullptr;
+    ia_aiq_af_results *afResults = nullptr;
+    ia_aiq_sensor_events *sensorEvents = nullptr;
+    uint64_t frameReadoutStart = 0;
+    uint64_t frameReadoutEnd = 0;
+    bool ret = mIpc.serverUnflattenSetStatistics(pData, dataSize, &dvs, &statistics,
+                                                 &aeResults, &afResults, &sensorEvents,
+                                                 &frameReadoutStart, &frameReadoutEnd);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenSetStatistics fails", __func__);
+
+    IntelDvs *intelDvs = getIntelDvs(dvs);
+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
+
+    ia_err err = intelDvs->setStatistics(dvs, statistics, aeResults, afResults, sensorEvents,
+                                         frameReadoutStart, frameReadoutEnd);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, execute fails", __func__);
+    return OK;
+}
+
+status_t IntelDvsServer::execute(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    ia_dvs_state *dvs = nullptr;
+    uint16_t focusPosition = 0;
+    bool ret = mIpc.serverUnflattenExecute(pData, dataSize, &dvs, &focusPosition);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenExecute fails", __func__);
+
+    IntelDvs *intelDvs = getIntelDvs(dvs);
+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
+
+    ia_err err = intelDvs->execute(dvs, focusPosition);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, execute fails", __func__);
+    return OK;
+}
+
+status_t IntelDvsServer::getImageTransformation(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    ia_dvs_state *dvs = nullptr;
+    ia_dvs_image_transformation imageTransformation = {0};
+    bool ret = mIpc.serverUnflattenImageTransformation(pData, dataSize, &dvs);
+    CheckError(ret == false, UNKNOWN_ERROR,
+               "@%s, serverUnflattenImageTransformation fails", __func__);
+
+    IntelDvs *intelDvs = getIntelDvs(dvs);
+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
+
+    ia_err err = intelDvs->getImageTransformation(dvs, &imageTransformation);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, getImageTransformation fails", __func__);
+
+    ret = mIpc.serverFlattenImageTransformation(pData, dataSize, &imageTransformation);
+    CheckError(ret == false, UNKNOWN_ERROR,
+               "@%s, serverUnflattenImageTransformation fails", __func__);
+    return OK;
+}
+
+IntelDvs *IntelDvsServer::getIntelDvs(ia_dvs_state *dvs) {
+    LOGIPC("@%s, dvs:%p", __func__, dvs);
+
+    if (mIntelDvss.find(dvs) == mIntelDvss.end()) {
+        LOGE("@%s, dvs:%p doesn't exist", __func__, dvs);
+        return nullptr;
+    }
+    IntelDvs *intelMkn = mIntelDvss[dvs].get();
+
+    return intelMkn;
+}
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.h
new file mode 100644
index 000000000000..a7fd8dee3b7b
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+#include <unordered_map>
+
+#include "iutils/Errors.h"
+#include "modules/algowrapper/IntelDvs.h"
+#include "modules/sandboxing/IPCIntelDvs.h"
+
+namespace icamera {
+class IntelDvsServer {
+ public:
+    IntelDvsServer();
+    virtual ~IntelDvsServer();
+
+    status_t init(void *pData, int dataSize);
+    status_t deinit(void *pData, int dataSize);
+    status_t config(void *pData, int dataSize);
+    status_t setNonBlankRatio(void *pData, int dataSize);
+    status_t setDigitalZoomMode(void *pData, int dataSize);
+    status_t setDigitalZoomRegion(void *pData, int dataSize);
+    status_t setDigitalZoomCoordinate(void *pData, int dataSize);
+    status_t setDigitalZoomMagnitude(void *pData, int dataSize);
+    status_t freeMorphTable(void *pData, int dataSize);
+    status_t allocateMorphTalbe(void *pData, int dataSize);
+    status_t getMorphTalbe(void *pData, int dataSize);
+    status_t setStatistics(void *pData, int dataSize);
+    status_t execute(void *pData, int dataSize);
+    status_t getImageTransformation(void *pData, int dataSize);
+
+ private:
+    IntelDvs *getIntelDvs(ia_dvs_state *dvs);
+
+ private:
+    std::unordered_map<ia_dvs_state*, std::unique_ptr<IntelDvs>> mIntelDvss;
+    IPCIntelDvs mIpc;
+};
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.cpp
new file mode 100644
index 000000000000..44cd4becf048
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.cpp
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelFDServer"
+
+#include "modules/sandboxing/server/IntelFDServer.h"
+
+#include <pvl_types.h>
+#include "CameraLog.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+IntelFDServer::IntelFDServer() {
+    mFaceDetection = std::unique_ptr<IntelFaceDetection>(new IntelFaceDetection());
+
+    LOG1("@%s", __func__);
+}
+
+IntelFDServer::~IntelFDServer() {
+    LOG1("@%s", __func__);
+}
+
+status_t IntelFDServer::init(void *pData, int dataSize) {
+    LOG1("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < static_cast<int>(sizeof(FaceDetectionInitParams)),
+               UNKNOWN_ERROR, "buffer is small");
+
+    return mFaceDetection->init(static_cast<FaceDetectionInitParams*>(pData), dataSize);
+}
+
+status_t IntelFDServer::run(void *pData, int dataSize, void *imageData) {
+    LOG1("@%s, pData:%p, dataSize:%d, imageData:%p", __func__, pData, dataSize, imageData);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < static_cast<int>(sizeof(FaceDetectionRunParams)),
+               UNKNOWN_ERROR, "buffer is small");
+
+    pvl_image image;
+    FaceDetectionRunParams *pFdRunParams = static_cast<FaceDetectionRunParams*>(pData);
+    mIpcFD.serverUnflattenRun(*pFdRunParams, imageData, &image);
+
+    return mFaceDetection->run(&image, &pFdRunParams->results);
+}
+
+status_t IntelFDServer::deinit() {
+    LOG1("@%s", __func__);
+    return mFaceDetection->deinit();
+}
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.h
new file mode 100644
index 000000000000..59102e38fb9f
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+#include "iutils/Errors.h"
+#include "modules/algowrapper/IntelFaceDetection.h"
+#include "modules/sandboxing/IPCIntelFD.h"
+
+namespace icamera {
+class IntelFDServer {
+ public:
+    IntelFDServer();
+    virtual ~IntelFDServer();
+
+    status_t init(void* pData, int dataSize);
+    status_t run(void* pData, int dataSize, void *imageData);
+    status_t deinit();
+
+ private:
+    std::unique_ptr<IntelFaceDetection> mFaceDetection;
+    IPCIntelFD mIpcFD;
+};
+}  /* namespace icamera */
+
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.cpp
new file mode 100644
index 000000000000..d2b55397afe7
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.cpp
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelLardServer"
+
+#include "modules/sandboxing/server/IntelLardServer.h"
+
+#include <memory>
+
+#include "CameraLog.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+IntelLardServer::IntelLardServer() {
+    mLard = std::unique_ptr<IntelLard>(new IntelLard());
+    LOGIPC("@%s", __func__);
+}
+
+IntelLardServer::~IntelLardServer() {
+    LOGIPC("@%s", __func__);
+}
+
+status_t IntelLardServer::init(void* pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    ia_binary_data binaryData = {nullptr, 0};
+    bool ret = mIpc.serverUnflattenInit(pData, dataSize, &binaryData);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
+
+    ia_lard* lard = mLard->init(&binaryData);
+    CheckError(lard == nullptr, UNKNOWN_ERROR, "@%s, mLard.init fails", __func__);
+
+    ret = mIpc.serverFlattenInit(pData, dataSize, lard);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverflattenInit fails", __func__);
+
+    return OK;
+}
+
+status_t IntelLardServer::getTagList(void* pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    ia_lard* lard = nullptr;
+    unsigned int mode_tag = LCMC_TAG;
+
+    bool ret = mIpc.serverUnflattenGetTagList(pData, dataSize, &lard, &mode_tag);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenGetTagList fails", __func__);
+    CheckError(lard == nullptr, UNKNOWN_ERROR, "@%s, serverUnflattenGetTagList fails", __func__);
+
+    unsigned int num_tags = 0;
+    const unsigned int* tags = nullptr;
+
+    ia_err ret1 = mLard->getTagList(lard, mode_tag, &num_tags, &tags);
+    CheckError(ret1 != ia_err_none, UNKNOWN_ERROR, "@%s, mLard.getTagList fails", __func__);
+
+    mIpc.serverFlattenGetTagList(pData, dataSize, num_tags, tags);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGetTagList fails", __func__);
+    CheckError(lard == nullptr, UNKNOWN_ERROR, "@%s, serverFlattenGetTagList fails", __func__);
+
+    return OK;
+}
+
+status_t IntelLardServer::run(void* pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    ia_lard* lard = nullptr;
+    ia_lard_input_params* inputParams = nullptr;
+
+    bool ret = mIpc.serverUnflattenRun(pData, dataSize, &lard, &inputParams);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenRun fails", __func__);
+    CheckError(lard == nullptr, UNKNOWN_ERROR, "@%s, serverUnflattenRun fails", __func__);
+    CheckError(inputParams == nullptr, UNKNOWN_ERROR, "@%s, serverUnflattenRun fails", __func__);
+
+    ia_lard_results* result = nullptr;
+    ia_err ret1 = mLard->run(lard, inputParams, &result);
+    CheckError(ret1 != ia_err_none, UNKNOWN_ERROR, "@%s, mLard.run fails", __func__);
+
+    ret = mIpc.serverFlattenRun(pData, dataSize, result);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenRun fails", __func__);
+
+    return OK;
+}
+
+status_t IntelLardServer::deinit(void* pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+
+    ia_lard* lard = nullptr;
+    bool ret = mIpc.serverUnflattenDeinit(pData, dataSize, &lard);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenDeinit fails", __func__);
+    CheckError(lard == nullptr, UNKNOWN_ERROR, "@%s, serverUnflattenDeinit fails", __func__);
+
+    mLard->deinit(lard);
+
+    return OK;
+}
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.h
new file mode 100644
index 000000000000..d51c9468dbce
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "memory"
+
+#include "iutils/Errors.h"
+#include "modules/algowrapper/IntelLard.h"
+#include "modules/sandboxing/IPCIntelLard.h"
+
+namespace icamera {
+class IntelLardServer {
+ public:
+    IntelLardServer();
+    virtual ~IntelLardServer();
+
+    status_t init(void* pData, int dataSize);
+    status_t getTagList(void* pData, int dataSize);
+    status_t run(void* pData, int dataSize);
+    status_t deinit(void* pData, int dataSize);
+
+ private:
+    std::unique_ptr<IntelLard> mLard;
+    IPCIntelLard mIpc;
+};
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.cpp
new file mode 100644
index 000000000000..173f2338e1d2
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.cpp
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelLtmServer"
+
+#include "modules/sandboxing/server/IntelLtmServer.h"
+
+#include <utility>
+
+#include "CameraLog.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+IntelLtmServer::IntelLtmServer() {
+    LOGIPC("@%s", __func__);
+}
+
+IntelLtmServer::~IntelLtmServer() {
+    LOGIPC("@%s", __func__);
+}
+
+int IntelLtmServer::init(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(LtmInitParams),
+               UNKNOWN_ERROR, "@%s, buffer is small", __func__);
+
+    LtmInitParams *params = static_cast<LtmInitParams*>(pData);
+    ia_binary_data inData;
+    uintptr_t mkn_hanlde;
+    bool ret = mIpc.serverUnflattenInit(params, &inData, &mkn_hanlde);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
+
+    std::unique_ptr<IntelLtm> intelLtm = std::unique_ptr<IntelLtm>(new IntelLtm());
+    ia_mkn *mkn = reinterpret_cast<ia_mkn *>(mkn_hanlde);
+    ia_ltm *ltm = intelLtm->init(&inData, mkn);
+
+    ret = mIpc.serverFlattenInit(params, ltm);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenInit fails", __func__);
+
+    mIntelLtms[ltm] = std::move(intelLtm);
+
+    return OK;
+}
+
+int IntelLtmServer::deinit(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(LtmDeinitParams),
+               UNKNOWN_ERROR, "@%s, buffer is small", __func__);
+
+    LtmDeinitParams *params = static_cast<LtmDeinitParams*>(pData);
+    ia_ltm *ltm = reinterpret_cast<ia_ltm*>(params->ltm_handle);
+    LOGIPC("@%s, params->ltm_handle:%p", __func__, ltm);
+
+    if (mIntelLtms.find(ltm) == mIntelLtms.end()) {
+        LOGE("@%s, ltm:%p doesn't exist", __func__, ltm);
+        return UNKNOWN_ERROR;
+    }
+
+    mIntelLtms[ltm]->deinit(ltm);
+    mIntelLtms.erase(ltm);
+
+    return OK;
+}
+
+int IntelLtmServer::run(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(LtmRunParams),
+               UNKNOWN_ERROR, "@%s, buffer is small", __func__);
+
+    ia_ltm_input_params *inputParams = nullptr;
+    ia_ltm *ltm = nullptr;
+    bool ret = mIpc.serverUnflattenRun(pData, &ltm, &inputParams);
+    CheckError(!ret, UNKNOWN_ERROR, "@%s, serverUnflattenRun fails", __func__);
+
+    ia_ltm_results *ltmResults = nullptr;
+    ia_ltm_drc_params *drcResults = nullptr;
+
+    if (mIntelLtms.find(ltm) == mIntelLtms.end()) {
+        LOGE("@%s, ltm:%p doesn't exist", __func__, ltm);
+        return UNKNOWN_ERROR;
+    }
+
+    ia_err retErr = mIntelLtms[ltm]->run(ltm, inputParams, &ltmResults, &drcResults);
+    CheckError(retErr != ia_err_none, UNKNOWN_ERROR, "@%s, mIntelLtms->run fails", __func__);
+
+    LtmRunParams *params = static_cast<LtmRunParams*>(pData);
+    ret = mIpc.serverFlattenRun(*ltmResults, *drcResults, ltm, params);
+    CheckError(!ret, UNKNOWN_ERROR, "@%s, serverFlattenRun fails", __func__);
+
+    return OK;
+}
+}  /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.h
new file mode 100644
index 000000000000..b17b78cb2fee
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+#include <unordered_map>
+
+#include "iutils/Errors.h"
+#include "modules/algowrapper/IntelLtm.h"
+#include "modules/sandboxing/IPCIntelLtm.h"
+
+namespace icamera {
+class IntelLtmServer {
+ public:
+    IntelLtmServer();
+    virtual ~IntelLtmServer();
+
+    int init(void *pData, int dataSize);
+    int deinit(void *pData, int dataSize);
+    int run(void *pData, int dataSize);
+
+ private:
+    std::unordered_map<ia_ltm*, std::unique_ptr<IntelLtm>> mIntelLtms;
+    IPCIntelLtm mIpc;
+};
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.cpp
new file mode 100644
index 000000000000..271ae9a1db5d
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.cpp
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelMknServer"
+
+#include "modules/sandboxing/server/IntelMknServer.h"
+
+#include <utility>
+
+#include "CameraLog.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+IntelMknServer::IntelMknServer() {
+    LOGIPC("@%s", __func__);
+}
+
+IntelMknServer::~IntelMknServer() {
+    LOGIPC("@%s", __func__);
+
+    mIntelMkns.clear();
+}
+
+int IntelMknServer::init(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(MknInitParams),
+               UNKNOWN_ERROR, "@%s, buffer is small", __func__);
+
+    MknInitParams *params = static_cast<MknInitParams*>(pData);
+
+    std::unique_ptr<IntelMkn> intelMnk = std::make_unique<IntelMkn>();
+    ia_mkn *mkn = intelMnk->init(params->mkn_config_bits,
+                                 params->mkn_section_1_size,
+                                 params->mkn_section_2_size);
+    CheckError(mkn == nullptr, UNKNOWN_ERROR, "@%s, mkn.init fails", __func__);
+
+    params->results = reinterpret_cast<uintptr_t>(mkn);
+    LOGIPC("@%s, mkn:%p, params->results:%", __func__, mkn, params->results);
+
+    mIntelMkns[mkn] = std::move(intelMnk);
+
+    return OK;
+}
+
+int IntelMknServer::deinit(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(MknDeinitParams),
+               UNKNOWN_ERROR, "@%s, buffer is small", __func__);
+
+    MknDeinitParams *params = static_cast<MknDeinitParams*>(pData);
+    ia_mkn *mkn = reinterpret_cast<ia_mkn*>(params->mkn_handle);
+    LOGIPC("@%s, params->mkn_handle:%p", __func__, mkn);
+
+    IntelMkn *intelMnk = getIntelMkn(mkn);
+    CheckError(intelMnk == nullptr, UNKNOWN_ERROR, "@%s, mkn:%p doesn't exist", __func__, mkn);
+
+    intelMnk->deinit(mkn);
+    mIntelMkns.erase(mkn);
+
+    return OK;
+}
+
+int IntelMknServer::prepare(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(MknPrepareParams),
+               UNKNOWN_ERROR, "@%s, buffer is small", __func__);
+
+    MknPrepareParams *params = static_cast<MknPrepareParams*>(pData);
+
+    ia_mkn *mkn = reinterpret_cast<ia_mkn*>(params->mkn_handle);
+    ia_binary_data data;
+
+    IntelMkn *intelMnk = getIntelMkn(mkn);
+    CheckError(intelMnk == nullptr, UNKNOWN_ERROR, "@%s, mkn:%p doesn't exist", __func__, mkn);
+
+    int ret = intelMnk->prepare(mkn, params->data_target, &data);
+    CheckError(ret != OK, NO_MEMORY, "Failed to prepare makernote");
+    LOGIPC("@%s, data.size:%d, data.data:%p", __func__, data.size, data.data);
+
+    bool retFlag = mIpc.serverFlattenPrepare(data, params);
+    CheckError(retFlag == false, UNKNOWN_ERROR, "@%s, serverFlattenPrepare fails", __func__);
+
+    return OK;
+}
+
+int IntelMknServer::enable(void *pData, int dataSize) {
+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(MknEnableParams),
+               UNKNOWN_ERROR, "@%s, buffer is small", __func__);
+
+    MknEnableParams *params = static_cast<MknEnableParams*>(pData);
+    ia_mkn *mkn = reinterpret_cast<ia_mkn*>(params->mkn_handle);
+
+    IntelMkn *intelMnk = getIntelMkn(mkn);
+    CheckError(intelMnk == nullptr, UNKNOWN_ERROR, "@%s, mkn:%p doesn't exist", __func__, mkn);
+
+    return intelMnk->enable(mkn, params->enable_data_collection);
+}
+
+IntelMkn *IntelMknServer::getIntelMkn(ia_mkn *mkn) {
+    LOGIPC("@%s, mkn:%p", __func__, mkn);
+
+    if (mIntelMkns.find(mkn) == mIntelMkns.end()) {
+        LOGE("@%s, mkn:%p doesn't exist", __func__, mkn);
+        return nullptr;
+    }
+
+    return mIntelMkns[mkn].get();
+}
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.h
new file mode 100644
index 000000000000..f392dc3fc978
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+#include <unordered_map>
+
+#include "iutils/Errors.h"
+#include "modules/algowrapper/IntelMkn.h"
+#include "modules/sandboxing/IPCIntelMkn.h"
+
+namespace icamera {
+class IntelMknServer {
+ public:
+    IntelMknServer();
+    virtual ~IntelMknServer();
+
+    int init(void* pData, int dataSize);
+    int deinit(void* pData, int dataSize);
+
+    int enable(void *pData, int dataSize);
+    int prepare(void *pData, int dataSize);
+
+ private:
+    IntelMkn *getIntelMkn(ia_mkn *mkn);
+
+ private:
+    std::unordered_map<ia_mkn*, std::unique_ptr<IntelMkn>> mIntelMkns;
+    IPCIntelMkn mIpc;
+};
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.cpp
new file mode 100644
index 000000000000..d3057e0e8619
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.cpp
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IntelPGParamS"
+
+#include "modules/sandboxing/server/IntelPGParamServer.h"
+
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+
+IntelPGParamServer::IntelPGParamServer() {
+}
+
+IntelPGParamServer::~IntelPGParamServer() {
+}
+
+int IntelPGParamServer::init(void* pData, int dataSize) {
+    int pgId = 0;
+    uintptr_t client = 0;
+    ia_p2p_platform_t platform = IA_P2P_PLATFORM_IPU6;
+    PgConfiguration pgConfig;
+
+    bool ret = mIpc.serverUnflattenInit(pData, dataSize, &pgId, &client, &platform, &pgConfig);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
+
+    PGParamPackage package;
+    package.pgId = pgId;
+    package.mPayloadCount = 0;
+    CLEAR(package.mPayloads);
+    package.mPGBuffer = nullptr;
+    mPGParamPackages[client] = package;
+    mPGParamPackages[client].mPGParamAdapt =
+                             std::shared_ptr<IntelPGParam>(new IntelPGParam(pgId));
+    int result = mPGParamPackages[client].mPGParamAdapt->init(platform, pgConfig);
+    CheckError(result != OK, result, "@%s, init fails", __func__);
+
+    return OK;
+}
+
+int IntelPGParamServer::prepare(void* pData, int dataSize, void* palDataAddr) {
+    uintptr_t client = 0;
+    ia_binary_data ipuParameters = {nullptr, 0};
+    ia_css_rbm_t* rbm = nullptr;
+    ia_css_kernel_bitmap_t* bitmap = nullptr;
+    bool ret = mIpc.serverUnflattenPrepare(pData, dataSize, &client, palDataAddr,
+                                           &ipuParameters, &rbm, &bitmap);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenPrepare fails", __func__);
+
+    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()),
+               UNKNOWN_ERROR, "%s, the pg doesn't exist in the table", __func__);
+
+    int result = mPGParamPackages[client].mPGParamAdapt->prepare(&ipuParameters, rbm, bitmap);
+    CheckError(result != OK, result, "@%s, prepare fails", __func__);
+
+    return OK;
+}
+
+int IntelPGParamServer::allocatePGBuffer(void* pData, int dataSize) {
+    uintptr_t client = 0;
+    int pgSize = 0;
+    bool ret = mIpc.serverUnflattenAllocatePGBuffer(pData, dataSize, &client, &pgSize);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenAllocatePGBuffer fails", __func__);
+
+    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()),
+               UNKNOWN_ERROR, "%s, the pg doesn't exist in the table", __func__);
+
+    // Get server data pointer of PGBuffer
+    void* pgBuffer = nullptr;
+    ret = mIpc.assignPGBuffer(pData, dataSize, pgSize, &pgBuffer);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, assignPGBuffer fails", __func__);
+
+    mPGParamPackages[client].mPGBuffer = reinterpret_cast<ia_css_process_group_t*>(pgBuffer);
+    return OK;
+}
+
+int IntelPGParamServer::getFragmentDescriptors(void* pData, int dataSize) {
+    uintptr_t client = 0;
+    int descCount = 0;
+    ia_p2p_fragment_desc* descs = nullptr;
+    bool ret = mIpc.serverUnflattenGetFragDescs(pData, dataSize, &client, &descCount, &descs);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenGetFragDescs fails", __func__);
+
+    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()),
+               UNKNOWN_ERROR, "%s, the pg doesn't exist in the table", __func__);
+
+    int count = mPGParamPackages[client].mPGParamAdapt->getFragmentDescriptors(descCount, descs);
+    CheckError(count <= 0, count, "@%s, getFragmentDescriptors fails", __func__);
+
+    ret = mIpc.serverFlattenGetFragDescs(pData, dataSize, count);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGetFragDescs fails", __func__);
+
+    return OK;
+}
+
+int IntelPGParamServer::setPGAndPrepareProgram(void* pData, int dataSize) {
+    uintptr_t client = 0;
+    bool ret = mIpc.serverUnflattenPrepareProgram(pData, dataSize, &client);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenPrepareProgram fails", __func__);
+
+    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()),
+               UNKNOWN_ERROR, "%s, the pg doesn't exist in the table", __func__);
+    PGParamPackage& package = mPGParamPackages[client];
+
+    int result = package.mPGParamAdapt->setPGAndPrepareProgram(package.mPGBuffer);
+    CheckError(result != OK, result, "@%s, setPGAndPrepareProgram fails", __func__);
+
+    // Get payload size here
+    package.mPayloadCount = package.mPGParamAdapt->getPayloadSizes(ARRAY_SIZE(package.mPayloads),
+                                                                   package.mPayloads);
+    CheckError(!package.mPayloadCount, UNKNOWN_ERROR, "@%s, getPayloadSizes fails", __func__);
+
+    ret = mIpc.serverFlattenPrepareProgram(pData, dataSize,
+                                           package.mPayloadCount, package.mPayloads);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenPrepareProgram fails", __func__);
+
+    return OK;
+}
+
+int IntelPGParamServer::allocatePayloads(void* pData, int dataSize) {
+    uintptr_t client = 0;
+    int clientPayloadCount = 0;
+    ia_binary_data* clientPayloads = nullptr;
+    bool ret = mIpc.serverUnflattenAllocatePayloads(pData, dataSize, &client,
+                                                    &clientPayloadCount, &clientPayloads);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenAllocatePayloads fails", __func__);
+
+    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()),
+               UNKNOWN_ERROR, "%s, the pg doesn't exist in the table", __func__);
+    PGParamPackage& package = mPGParamPackages[client];
+
+    // Check size here only because shared memory is allocated in client
+    CheckError(clientPayloadCount != package.mPayloadCount, UNKNOWN_ERROR,
+               "@%s, payloadCount errror", __func__);
+    for (int i = 0; i < clientPayloadCount; i++) {
+         CheckError(clientPayloads[i].size != package.mPayloads[i].size, UNKNOWN_ERROR,
+                    "@%s, payload size error for term %d", __func__, i);
+    }
+
+    // Get server data pointer of payloads
+    ret = mIpc.assignPayloads(pData, dataSize, package.mPayloadCount, package.mPayloads);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, assignPayloads fails", __func__);
+
+    return OK;
+}
+
+int IntelPGParamServer::updatePALAndEncode(void* pData, int dataSize, void* palDataAddr) {
+    uintptr_t client = 0;
+    ia_binary_data ipuParameters = {nullptr, 0};
+
+    bool ret = mIpc.serverUnflattenEncode(pData, dataSize, &client, palDataAddr, &ipuParameters);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenEncode fails", __func__);
+
+    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()),
+               UNKNOWN_ERROR, "%s, the pg doesn't exist in the table", __func__);
+    PGParamPackage& package = mPGParamPackages[client];
+
+    int result = package.mPGParamAdapt->updatePALAndEncode(&ipuParameters,
+                                                           package.mPayloadCount,
+                                                           &package.mPayloads[0]);
+    CheckError(result != OK, result, "@%s, updatePALAndEncode fails", __func__);
+
+    return OK;
+}
+
+int IntelPGParamServer::decode(void* pData, int dataSize) {
+    uintptr_t client = 0;
+    ia_binary_data statistics = {nullptr, 0};
+
+    bool ret = mIpc.serverUnflattenDecode(pData, dataSize, &client);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenDecode fails", __func__);
+
+    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()),
+               UNKNOWN_ERROR, "%s, the pg doesn't exist in the table", __func__);
+    PGParamPackage& package = mPGParamPackages[client];
+
+    int result = package.mPGParamAdapt->decode(package.mPayloadCount, &package.mPayloads[0],
+                                               &statistics);
+    CheckError(result != OK, result, "@%s, decode fails", __func__);
+
+    ret = mIpc.serverFlattenDecode(pData, dataSize, statistics);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenDecode fails", __func__);
+
+    return OK;
+}
+
+void IntelPGParamServer::deinit(void* pData, int dataSize) {
+    uintptr_t client = 0;
+
+    bool ret = mIpc.serverUnflattenDeinit(pData, dataSize, &client);
+    CheckError(ret == false, VOID_VALUE, "@%s, serverUnflattenDeinit fails", __func__);
+
+    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()),
+               VOID_VALUE, "%s, the pg doesn't exist in the table", __func__);
+
+    mPGParamPackages[client].mPGParamAdapt->deinit();
+    mPGParamPackages.erase(client);
+}
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.h
new file mode 100644
index 000000000000..06ac128124d4
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+#include <unordered_map>
+
+#include "modules/algowrapper/IntelPGParam.h"
+#include "modules/sandboxing/IPCIntelPGParam.h"
+
+namespace icamera {
+
+class IntelPGParamServer {
+ public:
+    IntelPGParamServer();
+    ~IntelPGParamServer();
+
+    int init(void* pData, int dataSize);
+    int prepare(void* pData, int dataSize, void* palDataAddr);
+    int allocatePGBuffer(void* pData, int dataSize);
+    int getFragmentDescriptors(void* pData, int dataSize);
+    int setPGAndPrepareProgram(void* pData, int dataSize);
+    int allocatePayloads(void* pData, int dataSize);
+    int updatePALAndEncode(void* pData, int dataSize, void* palDataAddr);
+    int decode(void* pData, int dataSize);
+    void deinit(void* pData, int dataSize);
+
+ private:
+    struct PGParamPackage {
+        int pgId;
+        std::shared_ptr<IntelPGParam> mPGParamAdapt;
+        ia_binary_data mPayloads[IPU_MAX_TERMINAL_COUNT];
+        int mPayloadCount;
+        ia_css_process_group_t* mPGBuffer;
+    };
+
+    IPCIntelPGParam mIpc;
+    std::unordered_map<uintptr_t, PGParamPackage> mPGParamPackages;
+};
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.cpp
new file mode 100644
index 000000000000..3ceb99a157fc
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.cpp
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IspParamAdaptorServer"
+
+#include "modules/sandboxing/server/IspParamAdaptorServer.h"
+
+#include <utility>
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+
+IspParamAdaptorServer::IspParamAdaptorServer() {
+    LOGIPC("@%s", __func__);
+}
+
+IspParamAdaptorServer::~IspParamAdaptorServer() {
+    LOGIPC("@%s", __func__);
+    mIspParamAdaptors.clear();
+}
+
+status_t IspParamAdaptorServer::init(void *pData, int size) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData, UNKNOWN_ERROR, "%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(IspBxtInitParam),
+               UNKNOWN_ERROR, "%s, buffer is small", __func__);
+
+    IspBxtInitParam *params = static_cast<IspBxtInitParam*>(pData);
+
+    ia_binary_data *ispData = nullptr;
+    ia_cmc_t *cmcData = nullptr;
+    bool ret = mIpc.serverUnflattenInit(params, size, &ispData, &cmcData);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
+
+    std::unique_ptr<IntelIspParamAdaptor> adaptor = std::make_unique<IntelIspParamAdaptor>();
+    ia_isp_bxt *ispHandle = adaptor->init(ispData, cmcData, params->maxStatsWidth,
+                                          params->maxStatsHeight,
+                                          params->maxStatsIn, params->iaMkn);
+    CheckError(!ispHandle, UNKNOWN_ERROR, "@%s, init isp param adaptor failed", __func__);
+
+    params->ispRemoteHandle = reinterpret_cast<uintptr_t>(ispHandle);
+    LOGIPC("@%s ispHandle %p: %d", __func__, ispHandle, params->ispRemoteHandle);
+
+    mIspParamAdaptors[ispHandle] = std::move(adaptor);
+
+    return OK;
+}
+
+status_t IspParamAdaptorServer::deInit(void *pData, int size) {
+    LOGIPC("@%s", __func__);
+    CheckError(!pData, UNKNOWN_ERROR, "%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(IspBxtDeInitParam),
+               UNKNOWN_ERROR, "%s, buffer is small", __func__);
+
+    ia_isp_bxt *ispHandle = nullptr;
+    bool ret = mIpc.serverUnflattenDeInit(pData, size, &ispHandle);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenDeInit fails", __func__);
+
+    CheckError((mIspParamAdaptors.find(ispHandle) == mIspParamAdaptors.end()),
+               UNKNOWN_ERROR, "%s, the isp handle doesn't exist in the table", __func__);
+    CheckError(!mIspParamAdaptors[ispHandle], UNKNOWN_ERROR,
+               "%s, IntelIspParamAdaptor is nullptr", __func__);
+
+    mIspParamAdaptors[ispHandle]->deInit(ispHandle);
+    mIspParamAdaptors.erase(ispHandle);
+
+    return OK;
+}
+
+int IspParamAdaptorServer::getPalDataSize(void *pData, int size) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData, UNKNOWN_ERROR, "%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(PalDataSizeParam),
+               UNKNOWN_ERROR, "%s, buffer is small", __func__);
+
+    ia_isp_bxt_program_group *programGroup = nullptr;
+    bool ret = mIpc.serverUnflattenGetPalSize(pData, size, &programGroup);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenGetPalSize fails", __func__);
+
+    CheckError(mIspParamAdaptors.empty(),
+               UNKNOWN_ERROR, "%s, mIspParamAdaptors is empty", __func__);
+    int palSize = mIspParamAdaptors.begin()->second->getPalDataSize(programGroup);
+    LOGIPC("%s, The pal data size: %d", __func__, palSize);
+
+    PalDataSizeParam *params = static_cast<PalDataSizeParam*>(pData);
+    params->palDataSize = palSize;
+
+    return OK;
+}
+
+status_t IspParamAdaptorServer::queryAndConvertStats(void *pData, int size) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData, UNKNOWN_ERROR, "%s, pData is nullptr", __func__);
+    CheckError(size < sizeof(ConvertStatsParam),
+               UNKNOWN_ERROR, "%s, buffer is small", __func__);
+
+    ia_isp_bxt *ispHandle = nullptr;
+    ConvertInputParam inputParams = {};
+    ConvertResult result = {};
+
+    bool ret = mIpc.serverUnflattenConvertStats(pData, size, &ispHandle, &inputParams, &result);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenConvertStats fails", __func__);
+
+    CheckError((mIspParamAdaptors.find(ispHandle) == mIspParamAdaptors.end()),
+               UNKNOWN_ERROR, "%s, the isp handle doesn't exist in the table", __func__);
+    CheckError(!mIspParamAdaptors[ispHandle], UNKNOWN_ERROR,
+               "%s, IntelIspParamAdaptor is nullptr", __func__);
+
+    int res = mIspParamAdaptors[ispHandle]->queryAndConvertStats(ispHandle, &inputParams, &result);
+    CheckError(res != OK, res, "%s, Failed to convert the status", __func__);
+
+    ret = mIpc.serverFlattenConvertStats(pData, size, result);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenConvertStats fails", __func__);
+
+    return OK;
+}
+
+status_t IspParamAdaptorServer::runPal(void *pData, int size, void *palDataAddr) {
+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
+    CheckError(!pData, UNKNOWN_ERROR, "%s, pData is nullptr", __func__);
+    CheckError(!palDataAddr, UNKNOWN_ERROR, "%s, palDataAddr is nullptr", __func__);
+
+    ia_isp_bxt *ispHandle = nullptr;
+    ia_isp_bxt_input_params_v2 *inputParams = nullptr;
+    ia_binary_data *palOutput = nullptr;
+
+    bool ret = mIpc.serverUnflattenRunPal(pData, size, &ispHandle, &inputParams, &palOutput);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenRunPal fails", __func__);
+    palOutput->data = palDataAddr;
+    LOGIPC("%s, palDataAddr: %p, size: %d", __func__, palDataAddr, palOutput->size);
+
+    CheckError((mIspParamAdaptors.find(ispHandle) == mIspParamAdaptors.end()),
+               UNKNOWN_ERROR, "%s, the isp handle doesn't exist in the table", __func__);
+    CheckError(!mIspParamAdaptors[ispHandle], UNKNOWN_ERROR,
+               "%s, IntelIspParamAdaptor is nullptr", __func__);
+
+    int res = mIspParamAdaptors[ispHandle]->runPal(ispHandle, inputParams, palOutput);
+    CheckError(res != OK, res, "%s, Failed to run pal", __func__);
+    LOGIPC("%s, the pal data size is: %d after running", __func__, palOutput->size);
+
+    return OK;
+}
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.h
new file mode 100644
index 000000000000..0d6a5e799433
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+#include <unordered_map>
+
+#include "iutils/Errors.h"
+#include "modules/algowrapper/IntelIspParamAdaptor.h"
+#include "modules/sandboxing/IPCIspParamAdaptor.h"
+
+namespace icamera {
+
+class IspParamAdaptorServer {
+ public:
+    IspParamAdaptorServer();
+    virtual ~IspParamAdaptorServer();
+
+    status_t init(void *pData, int size);
+    status_t deInit(void *pData, int size);
+    status_t getPalDataSize(void *pData, int size);
+    status_t runPal(void *pData, int size, void *palDataAddr);
+    status_t queryAndConvertStats(void *pData, int size);
+
+ private:
+    IPCIspParamAdaptor mIpc;
+    std::unordered_map<ia_isp_bxt*, std::unique_ptr<IntelIspParamAdaptor> > mIspParamAdaptors;
+};
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/3a/AiqCore.cpp b/camera/hal/intel/ipu6/src/3a/AiqCore.cpp
new file mode 100644
index 000000000000..cc57591593e6
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqCore.cpp
@@ -0,0 +1,982 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "AiqCore"
+
+#include <math.h>
+
+#include <memory>
+#include <string>
+
+#include "PlatformData.h"
+#include "MakerNote.h"
+#include "AiqUtils.h"
+#include "Parameters.h"
+
+#include "iutils/CameraLog.h"
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+
+#include "AiqCore.h"
+
+namespace icamera {
+#define VALID_COLOR_GAINS(colorGains) (colorGains[0] > 0 && colorGains[1] > 0 && \
+                                       colorGains[2] > 0 && colorGains[3] > 0)
+AiqCore::AiqCore(int cameraId) :
+    mCameraId(cameraId),
+    mAeForceLock(false),
+    mAwbForceLock(false),
+    mAfForceLock(false),
+    mIntel3AResult(nullptr),
+    mLastAeResult(nullptr),
+    mLastAwbResult(nullptr),
+    mLastAfResult(nullptr),
+    mAeRunTime(0),
+    mAwbRunTime(0),
+    mAiqState(AIQ_NOT_INIT),
+    mUseManualColorMatrix(false),
+    mHyperFocalDistance(0.0f),
+    mTuningMode(TUNING_MODE_MAX),
+    mShadingMode(SHADING_MODE_FAST),
+    mLensShadingMapMode(LENS_SHADING_MAP_MODE_OFF) {
+    LOG3A("@%s", __func__);
+
+    mIntel3AParameter = std::unique_ptr<Intel3AParameter>(new Intel3AParameter(cameraId));
+    mIntel3AResult = std::unique_ptr<Intel3AResult>(new Intel3AResult());
+
+    CLEAR(mFrameParams);
+    CLEAR(mGbceParams);
+    CLEAR(mPaParams);
+    CLEAR(mSaParams);
+    CLEAR(mColorMatrix);
+    CLEAR(mColorGains);
+    CLEAR(mIntelAiqHandle);
+    CLEAR(mIntelAiqHandleStatus);
+    CLEAR(mPaColorGains);
+
+    CLEAR(mResizeLscGridR);
+    CLEAR(mResizeLscGridGr);
+    CLEAR(mResizeLscGridGb);
+    CLEAR(mResizeLscGridB);
+
+    // init LscOffGrid to 1.0f
+    std::fill(std::begin(mLscOffGrid), std::end(mLscOffGrid), 1.0f);
+
+}
+
+AiqCore::~AiqCore() {
+    LOG3A("@%s", __func__);
+
+    for (int i = 0; i < TUNING_MODE_MAX; i++) {
+        if (mIntelAiqHandle[i]) {
+            delete mIntelAiqHandle[i];
+        }
+    }
+}
+
+int AiqCore::initAiqPlusParams() {
+    LOG3A("@%s", __func__);
+
+    CLEAR(mFrameParams);
+    CLEAR(mGbceParams);
+    CLEAR(mPaParams);
+    CLEAR(mPaColorGains);
+    CLEAR(mSaParams);
+    CLEAR(mColorMatrix);
+    CLEAR(mColorGains);
+
+    mUseManualColorMatrix = false;
+
+    mGbceParams.gbce_level = ia_aiq_gbce_level_use_tuning;
+    mGbceParams.frame_use = ia_aiq_frame_use_video;
+    mGbceParams.ev_shift = 0;
+    mGbceParams.tone_map_level = ia_aiq_tone_map_level_use_tuning;
+
+    mPaParams.color_gains = nullptr;
+
+    mSaParams.sensor_frame_params = &mFrameParams;
+    /* use convergence time from tunings */
+    mSaParams.manual_convergence_time = -1.0;
+
+    return OK;
+}
+
+int AiqCore::init() {
+    LOG3A("@%s", __func__);
+
+    initAiqPlusParams();
+
+#ifndef ENABLE_SANDBOXING
+    ia_env env = {&Log::ccaPrintDebug, &Log::ccaPrintError, &Log::ccaPrintInfo};
+    ia_log_init(&env);
+#endif
+
+    mAiqState = AIQ_INIT;
+
+    int ret = mIntel3AParameter->init();
+    CheckError(ret != OK, ret, "@%s, Init 3a parameter failed ret: %d", __func__, ret);
+
+    mLastAeResult = nullptr;
+    mLastAwbResult = nullptr;
+    mLastAfResult = nullptr;
+    mAeRunTime = 0;
+    mAwbRunTime = 0;
+
+    return OK;
+}
+
+void AiqCore::deinitIntelAiqHandle() {
+    LOG3A("@%s", __func__);
+
+    for (auto mode = 0; mode < TUNING_MODE_MAX; mode++) {
+        IntelAiq* aiq = mIntelAiqHandle[mode];
+        if (!aiq) continue;
+
+        if (PlatformData::isAiqdEnabled(mCameraId)) {
+            ia_binary_data outData = {nullptr, 0};
+            ia_err iaErr = aiq->getAiqdData(&outData);
+            if (AiqUtils::convertError(iaErr) == OK) {
+                AiqdData* aiqdData =
+                    PlatformData::getAiqdData(mCameraId, static_cast<TuningMode>(mode));
+                aiqdData->saveAiqdData(&outData);
+            } else {
+                LOGW("@%s, failed to get aiqd data, iaErr %d", __func__, iaErr);
+            }
+        }
+        aiq->deinit();
+        delete aiq;
+        mIntelAiqHandle[mode] = nullptr;
+    }
+    CLEAR(mIntelAiqHandleStatus);
+}
+
+int AiqCore::deinit() {
+    LOG3A("@%s", __func__);
+
+#ifndef ENABLE_SANDBOXING
+    ia_log_deinit();
+#endif
+
+    deinitIntelAiqHandle();
+
+    mAiqState = AIQ_NOT_INIT;
+
+    return OK;
+}
+
+int AiqCore::initIntelAiqHandle(const std::vector<TuningMode>& tuningModes) {
+    LOG3A("@%s", __func__);
+
+    CpfStore* cpf = PlatformData::getCpfStore(mCameraId);
+    CheckError(!cpf, NO_INIT, "@%s, No CPF for cameraId: %d", __func__, mCameraId);
+
+    ia_mkn* mkn = MakerNote::getInstance(mCameraId)->getMknHandle();
+    CheckError(!mkn, NO_INIT, "@%s, getMknHandle fails", __func__);
+
+    ia_binary_data *nvmData = static_cast<ia_binary_data*>(PlatformData::getNvmData(mCameraId));
+    ia_binary_data aiqData = {nullptr, 0};
+    // Initialize mIntelAiqHandle array based on different cpf data
+    for (auto & mode : tuningModes) {
+        uintptr_t cmcHandle = reinterpret_cast<uintptr_t>(nullptr);
+        int ret = cpf->getDataAndCmc(nullptr, &aiqData, nullptr, &cmcHandle, mode);
+        CheckError(ret != OK, BAD_VALUE, "@%s, getDataAndCmc fails", __func__);
+
+        ia_binary_data* aiqd = nullptr;
+        if (PlatformData::PlatformData::isAiqdEnabled(mCameraId)) {
+            AiqdData* aiqdData = PlatformData::getAiqdData(mCameraId, mode);
+            aiqd = aiqdData ? aiqdData->getAiqdData() : nullptr;
+        }
+
+        int statsNum = PlatformData::getExposureNum(mCameraId,
+                           CameraUtils::isMultiExposureCase(mode));
+        {
+            IntelAiq* intelAiq = new IntelAiq();
+            PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->init", 1);
+            ia_aiq* aiq = intelAiq->init(&(aiqData),
+                                        nvmData,
+                                        aiqd,
+                                        MAX_STATISTICS_WIDTH,
+                                        MAX_STATISTICS_HEIGHT,
+                                        statsNum,
+                                        reinterpret_cast<ia_cmc_t*>(cmcHandle),
+                                        mkn);
+            if (aiq) {
+                mIntelAiqHandle[mode] = intelAiq;
+
+                std::string aiqVersion;
+                intelAiq->getVersion(&aiqVersion);
+                LOGI("@%s, AIQ VERSION: %s", __func__, aiqVersion.c_str());
+            } else {
+                mIntelAiqHandle[mode] = nullptr;
+                delete intelAiq;
+            }
+        }
+        CheckError(!mIntelAiqHandle[mode], NO_INIT, "@%s: init aiq failed!", __func__);
+        mIntelAiqHandleStatus[mode] = true;
+    }
+
+    return OK;
+}
+
+int AiqCore::configure(const std::vector<ConfigMode>& configModes) {
+    LOG3A("@%s", __func__);
+
+    int ret = OK;
+    bool allTuningModeConfiged = true;
+    std::vector<TuningMode> tuningModes;
+    for (auto cfg : configModes) {
+        TuningMode mode;
+        ret = PlatformData::getTuningModeByConfigMode(mCameraId, cfg, mode);
+        CheckError(ret != OK, ret, "%s: getTuningModeByConfigMode fails, cfg:%d", __func__, cfg);
+        tuningModes.push_back(mode);
+
+        if (!mIntelAiqHandle[mode]) {
+            allTuningModeConfiged = false;
+        }
+    }
+
+    if (mAiqState == AIQ_CONFIGURED && allTuningModeConfiged) {
+        return OK;
+    }
+
+    deinitIntelAiqHandle();
+
+    ret = initIntelAiqHandle(tuningModes);
+    if (ret == OK) {
+        mAiqState = AIQ_CONFIGURED;
+    }
+
+    return OK;
+}
+
+int AiqCore::setSensorInfo(const ia_aiq_frame_params &frameParams,
+                           const ia_aiq_exposure_sensor_descriptor &descriptor) {
+    LOG3A("@%s", __func__);
+
+    mFrameParams = frameParams;
+    mIntel3AParameter->setSensorInfo(descriptor);
+
+    return OK;
+}
+
+/**
+ *  Hyperfocal distance is the closest distance at which a lens can be focused
+ *  while keeping objects at infinity acceptably sharp. When the lens is focused
+ *  at this distance, all objects at distances from half of the hyperfocal
+ *  distance out to infinity will be acceptably sharp.
+ *
+ *  The equation used for this is:
+ *        f*f
+ *  H = -------
+ *        N*c
+ *
+ *  where:
+ *   f is the focal length
+ *   N is the f-number (f/D for aperture diameter D)
+ *   c is the Circle Of Confusion (COC)
+ *
+ *   the COC is calculated as the pixel width of 2 pixels
+ *
+ *  The hyperfocal distance in mm. It is ensured it will never be 0 to
+ *  avoid division by 0. If any of the required CMC items is missing
+ *  it will return the default value 5m
+ */
+int AiqCore::calculateHyperfocalDistance(TuningMode mode) {
+    LOG3A("@%s, tuning mode: %d", __func__, mode);
+
+    CpfStore *cpf = PlatformData::getCpfStore(mCameraId);
+    CheckError(!cpf, BAD_VALUE, "@%s, No CPF for cameraId:%d", __func__, mCameraId);
+    ia_cmc_t *cmcData = nullptr;
+    int ret = cpf->getDataAndCmc(nullptr, nullptr, nullptr, nullptr, mode, &cmcData);
+    CheckError(ret != OK || !cmcData, BAD_VALUE, "@%s get cmc data failed", __func__);
+
+    float pixelSizeMicro = 100.0f;  // size of pixels in um, default to avoid division by 0
+    float focalLengthMillis = 0.0f;
+    const float DEFAULT_HYPERFOCAL_DISTANCE = 5000.0f;
+
+    cmc_optomechanics_t *optoInfo = cmcData->cmc_parsed_optics.cmc_optomechanics;
+    if (optoInfo) {
+        // Pixel size is stored in CMC in hundreds of micrometers
+        pixelSizeMicro = optoInfo->sensor_pix_size_h / 100;
+        // focal length is stored in CMC in hundreds of millimeters
+        focalLengthMillis = static_cast<float>(optoInfo->effect_focal_length) / 100;
+    }
+
+    // fixed aperture, the fn should be divided 100 because the value
+    // is multiplied 100 in cmc avoid division by 0
+    if (!cmcData->cmc_parsed_optics.lut_apertures ||
+        cmcData->cmc_parsed_optics.lut_apertures[0] == 0) {
+        LOG3A("lut apertures is not provided or zero in the cmc. Using default");
+        mHyperFocalDistance = DEFAULT_HYPERFOCAL_DISTANCE;
+        return OK;
+    }
+
+    float fNumber = static_cast<float>(cmcData->cmc_parsed_optics.lut_apertures[0]) / 100;
+    // assuming square pixel
+    const int CIRCLE_OF_CONFUSION_IN_PIXELS = 2;
+    float cocMicros = pixelSizeMicro * CIRCLE_OF_CONFUSION_IN_PIXELS;
+    float hyperfocalDistanceMillis = 1000 * (focalLengthMillis * focalLengthMillis) /
+                                     (fNumber * cocMicros);
+
+    mHyperFocalDistance = (hyperfocalDistanceMillis == 0.0f) ? DEFAULT_HYPERFOCAL_DISTANCE :
+                          hyperfocalDistanceMillis;
+
+    return OK;
+}
+
+/**
+ *
+ * Calculate the Depth of field (DOF) for a given AF Result.
+ *
+ * The Formulas to calculate the near and afar DOF are:
+ *          H * s
+ * Dn = ---------------
+ *         H + (s-f)
+ *
+ *          H * s
+ * Df =  ------------
+ *         H - (s-f)
+ *
+ * Where:
+ * H is the hyperfocal distance (that we get from CPF) (it cannot be 0)
+ * s is the distance to focused object (current focus distance)
+ * f is the focal length
+ *
+ * \param[in] afResults with current focus distance in mm
+ * \param[out] dof info: DOF for near and far limit in diopters
+ */
+int AiqCore::calculateDepthOfField(const ia_aiq_af_results &afResults,
+                                   camera_range_t *focusRange) {
+    LOG3A("@%s, afResults:%p, focusRange:%p", __func__, afResults, focusRange);
+    CheckError(!focusRange, BAD_VALUE, "@%s, Bad input values", __func__);
+
+    const float DEFAULT_DOF = 5000.0f;
+    focusRange->min = 1000.0f / DEFAULT_DOF;
+    focusRange->max = 1000.0f / DEFAULT_DOF;
+
+    float focusDistance = 1.0f * afResults.current_focus_distance;
+    if (focusDistance == 0.0f) {
+        // Not reporting error since this may be normal in fixed focus sensors
+        return OK;
+    }
+
+    ia_cmc_t *cmcData = nullptr;
+    cmc_optomechanics_t *optoInfo = nullptr;
+    CpfStore *cpf = PlatformData::getCpfStore(mCameraId);
+    if (cpf) {
+        cpf->getDataAndCmc(nullptr, nullptr, nullptr, nullptr, mTuningMode, &cmcData);
+    }
+    if (cmcData) {
+        optoInfo = cmcData->cmc_parsed_optics.cmc_optomechanics;
+    }
+
+    float focalLengthMillis = 2.3f;
+    if (optoInfo) {
+        // focal length is stored in CMC in hundreds of millimeters
+        focalLengthMillis = static_cast<float>(optoInfo->effect_focal_length) / 100;
+    }
+
+    float num = mHyperFocalDistance * focusDistance;
+    float denom = (mHyperFocalDistance + focusDistance - focalLengthMillis);
+    if (denom != 0.0f) {
+        focusRange->min = num / denom;
+    }
+
+    denom = (mHyperFocalDistance - focusDistance + focalLengthMillis);
+    if (denom != 0.0f) {
+        focusRange->max = num / denom;
+    }
+
+    focusRange->min = 1000.0f / focusRange->min;
+    focusRange->max = 1000.0f / focusRange->max;
+
+    return OK;
+}
+
+int AiqCore::updateParameter(const aiq_parameter_t &param) {
+    LOG3A("@%s", __func__);
+
+    mUseManualColorMatrix = (param.awbMode == AWB_MODE_MANUAL_COLOR_TRANSFORM);
+    mColorMatrix = param.manualColorMatrix;
+    mColorGains = param.manualColorGains;
+
+    if (mTuningMode != param.tuningMode) {
+        int ret = calculateHyperfocalDistance(param.tuningMode);
+        CheckError(ret != OK, ret, "%s calculateHyperfocalDistance fails", __func__);
+        mTuningMode = param.tuningMode;
+    }
+    mShadingMode = param.shadingMode;
+    mLensShadingMapMode = param.lensShadingMapMode;
+    mLensShadingMapSize = param.lensShadingMapSize;
+
+    mGbceParams.frame_use = AiqUtils::convertFrameUsageToIaFrameUsage(param.frameUsage);
+
+    // In still frame use force update by setting convergence time to 0.
+    // in other cases use tunings.
+    mSaParams.manual_convergence_time = (param.frameUsage == FRAME_USAGE_STILL) ? 0.0 : -1.0;
+
+    mIntel3AParameter->updateParameter(param);
+    mAeForceLock = param.aeForceLock;
+    mAwbForceLock = param.awbForceLock;
+    mAfForceLock = mIntel3AParameter->mAfForceLock;
+
+    return OK;
+}
+
+int AiqCore::setStatistics(const ia_aiq_statistics_input_params_v4 *ispStatistics) {
+    LOG3A("@%s, ispStatistics:%p", __func__, ispStatistics);
+    CheckError(!ispStatistics, BAD_VALUE, "@%s, ispStatistics is nullptr", __func__);
+
+    int ret = OK;
+
+    IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
+    CheckError(!intelAiq, UNKNOWN_ERROR, "%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
+    {
+        PERF_CAMERA_ATRACE_PARAM1_IMAGING("statisticsSetV4", 1);
+        ia_err iaErr = intelAiq->statisticsSetV4(ispStatistics);
+        ret = AiqUtils::convertError(iaErr);
+        CheckError(ret != OK, ret, "Error setting statistics, ret = %d", ret);
+    }
+
+    return ret;
+}
+
+int AiqCore::runAiq(AiqResult *aiqResult) {
+    LOG3A("@%s, aiqResult:%p", __func__, aiqResult);
+    CheckError(!aiqResult, BAD_VALUE, "@%s, aiqResult is nullptr", __func__);
+
+    int ret = run3A(aiqResult);
+    CheckError(ret != OK, ret, "run3A failed, ret: %d", ret);
+
+    ret = runAiqPlus(aiqResult);
+    CheckError(ret != OK, ret, "runAiqPlus failed, ret: %d", ret);
+
+    return OK;
+}
+
+int AiqCore::run3A(AiqResult *aiqResult) {
+    LOG3A("@%s, aiqResult:%p", __func__, aiqResult);
+    CheckError(!aiqResult, BAD_VALUE, "@%s, aiqResult is nullptr", __func__);
+
+    int ret = OK;
+    int aaaType = IMAGING_ALGO_AE | IMAGING_ALGO_AWB;
+    if (PlatformData::getLensHwType(mCameraId) == LENS_VCM_HW) {
+        aaaType |= IMAGING_ALGO_AF;
+    }
+
+    if (aaaType & IMAGING_ALGO_AE) {
+        ret |= runAe(&aiqResult->mAeResults);
+    }
+    if (aaaType & IMAGING_ALGO_AWB) {
+        ret |= runAwb(&aiqResult->mAwbResults);
+    }
+    if (aaaType & IMAGING_ALGO_AF) {
+        ret |= runAf(aiqResult);
+    }
+
+    return ret;
+}
+
+int AiqCore::runAiqPlus(AiqResult *aiqResult) {
+    LOG3A("@%s, aiqResult:%p", __func__, aiqResult);
+    CheckError(!aiqResult, BAD_VALUE, "@%s, aiqResult is nullptr", __func__);
+
+    int algoType = IMAGING_ALGO_GBCE | IMAGING_ALGO_PA | IMAGING_ALGO_SA;
+
+    int ret = OK;
+    if (algoType & IMAGING_ALGO_GBCE) {
+        ret |= runGbce(&aiqResult->mGbceResults);
+    }
+    if (algoType & IMAGING_ALGO_PA) {
+        ret |= runPa(&aiqResult->mPaResults, &aiqResult->mAwbResults,
+                     aiqResult->mAeResults.exposures[0].exposure,
+                     &aiqResult->mPreferredAcm);
+    }
+    if ((algoType & IMAGING_ALGO_SA) && (mShadingMode != SHADING_MODE_OFF)) {
+        ret |= runSa(&aiqResult->mSaResults, &aiqResult->mAwbResults,
+                     aiqResult->mAiqParam.lensShadingMap);
+    }
+
+    return ret;
+}
+
+int AiqCore::runAe(ia_aiq_ae_results* aeResults) {
+    LOG3A("@%s, aeResults:%p", __func__, aeResults);
+    CheckError(!aeResults, BAD_VALUE, "@%s, aeResults is nullptr", __func__);
+    PERF_CAMERA_ATRACE();
+
+    int ret = OK;
+    ia_aiq_ae_results *newAeResults = mLastAeResult;
+
+    if (!mAeForceLock && (mAeRunTime % mIntel3AParameter->mAePerTicks == 0)) {
+        LOG3A("AEC frame_use: %d", mIntel3AParameter->mAeParams.frame_use);
+
+        IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
+        CheckError(!intelAiq, UNKNOWN_ERROR, "%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
+        {
+            PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->aeRun", 1);
+            ia_err iaErr = intelAiq->aeRun(&mIntel3AParameter->mAeParams, &newAeResults);
+            ret = AiqUtils::convertError(iaErr);
+            CheckError(ret != OK || !newAeResults, ret, "Error running AE, ret: %d", ret);
+        }
+    }
+
+    mIntel3AParameter->updateAeResult(newAeResults);
+
+    ret = mIntel3AResult->deepCopyAeResults(*newAeResults, aeResults);
+
+    mLastAeResult = aeResults;
+    ++mAeRunTime;
+
+    return ret;
+}
+
+int AiqCore::runAf(AiqResult *aiqResult) {
+    LOG3A("@%s, aiqResult:%p", __func__, aiqResult);
+    CheckError(!aiqResult, BAD_VALUE, "@%s, aiqResult is nullptr", __func__);
+    PERF_CAMERA_ATRACE();
+
+    ia_aiq_af_results *afResults = &aiqResult->mAfResults;
+    ia_aiq_af_results *newAfResults = mLastAfResult;
+
+    int ret = OK;
+    if (!mAfForceLock) {
+        IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
+        CheckError(!intelAiq, UNKNOWN_ERROR, "@%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
+        {
+            PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->afRun", 1);
+            ia_err iaErr = intelAiq->afRun(&mIntel3AParameter->mAfParams, &newAfResults);
+            ret = AiqUtils::convertError(iaErr);
+            CheckError(ret != OK || !newAfResults, ret, "Error running AF, ret: %d", ret);
+        }
+    }
+
+    focusDistanceResult(newAfResults, &aiqResult->mAfDistanceDiopters, &aiqResult->mFocusRange);
+    ret = mIntel3AResult->deepCopyAfResults(*newAfResults, afResults);
+
+    mLastAfResult = afResults;
+    mIntel3AParameter->fillAfTriggerResult(newAfResults);
+    return ret;
+}
+
+void AiqCore::focusDistanceResult(const ia_aiq_af_results *afResults,
+                                  float *afDistanceDiopters,
+                                  camera_range_t *focusRange) {
+    LOG3A("@%s, afResults:%p, afDistanceDiopters:%p, focusRange:%p", __func__,
+          afResults, afDistanceDiopters, focusRange);
+    CheckError(!afResults || !afDistanceDiopters || !focusRange, VOID_VALUE,
+               "@%s, Bad input values", __func__);
+
+    *afDistanceDiopters = 1.2f;
+    if (mIntel3AParameter->mAfParams.focus_mode == ia_aiq_af_operation_mode_infinity) {
+        // infinity mode is special: we need to report 0.0f (1/inf = 0)
+        *afDistanceDiopters = 0.0f;
+    } else if (afResults->current_focus_distance != 0) {
+        // In AIQ, 'current_focus_distance' is in millimeters
+        // For rounding multiply by extra 100.
+        // This allows the diopters to have 2 decimal values
+        *afDistanceDiopters = 100 * 1000 * (1.0 / afResults->current_focus_distance);
+        *afDistanceDiopters = ceil(*afDistanceDiopters);
+        // Divide by 100 for final result.
+        *afDistanceDiopters = *afDistanceDiopters / 100;
+    }
+    LOG3A("%s, Zero focus distance in AF result, reporting %f", __func__, *afDistanceDiopters);
+
+    calculateDepthOfField(*afResults, focusRange);
+    LOG3A("%s, focus distance with diopters: %f %f", __func__, focusRange->min, focusRange->max);
+}
+
+int AiqCore::runAwb(ia_aiq_awb_results* awbResults) {
+    LOG3A("@%s, awbResults:%p", __func__, awbResults);
+    CheckError(!awbResults, BAD_VALUE, "@%s, awbResults is nullptr", __func__);
+    PERF_CAMERA_ATRACE();
+
+    int ret = OK;
+    ia_aiq_awb_results *newAwbResults = mLastAwbResult;
+
+    if (!mAwbForceLock && (mAwbRunTime % mIntel3AParameter->mAwbPerTicks == 0)) {
+        IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
+        CheckError(!intelAiq, UNKNOWN_ERROR, "%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
+        {
+            PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->awbRun", 1);
+            ia_err iaErr = intelAiq->awbRun(&mIntel3AParameter->mAwbParams, &newAwbResults);
+            ret = AiqUtils::convertError(iaErr);
+            CheckError(ret != OK || !newAwbResults, ret, "Error running AWB, ret: %d", ret);
+        }
+    }
+
+    CheckError(!newAwbResults, BAD_VALUE, "newAwbResults is nullptr");
+
+    if (!PlatformData::isIsysEnabled(mCameraId)) {
+        // Fix AWB gain to 1 for none-ISYS cases
+        newAwbResults->accurate_r_per_g = 1;
+        newAwbResults->accurate_b_per_g = 1;
+        newAwbResults->final_r_per_g = 1;
+        newAwbResults->final_b_per_g = 1;
+    }
+
+    mIntel3AParameter->updateAwbResult(newAwbResults);
+
+    ret = mIntel3AResult->deepCopyAwbResults(*newAwbResults, awbResults);
+
+    mLastAwbResult = awbResults;
+    ++mAwbRunTime;
+
+    return ret;
+}
+
+int AiqCore::runGbce(ia_aiq_gbce_results *gbceResults) {
+    LOG3A("%s, gbceResults:%p", __func__, gbceResults);
+    CheckError(!gbceResults, BAD_VALUE, "@%s, gbceResults is nullptr", __func__);
+
+    PERF_CAMERA_ATRACE();
+    ia_aiq_gbce_results *newGbceResults = nullptr;
+
+    IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
+    CheckError(!intelAiq, UNKNOWN_ERROR, "%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
+    {
+        PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->gbceRun", 1);
+        ia_err iaErr = intelAiq->gbceRun(&mGbceParams, &newGbceResults);
+        int ret = AiqUtils::convertError(iaErr);
+        CheckError(ret != OK, ret, "@%s, gbceRun fails, ret: %d", __func__, ret);
+    }
+
+    return AiqUtils::deepCopyGbceResults(*newGbceResults, gbceResults);
+}
+
+int AiqCore::runPa(ia_aiq_pa_results_v1 *paResults,
+                   ia_aiq_awb_results *awbResults,
+                   ia_aiq_exposure_parameters *exposureParams,
+                   ia_aiq_advanced_ccm_t *preferredAcm) {
+    LOG3A("%s, paResults:%p, awbResults:%p, exposureParams:%p, preferredAcm:%p", __func__,
+          paResults, awbResults, exposureParams, preferredAcm);
+    CheckError(!paResults || !awbResults || !exposureParams || !preferredAcm, BAD_VALUE,
+               "@%s, Bad input values", __func__);
+
+    PERF_CAMERA_ATRACE();
+    ia_aiq_pa_results_v1 *newPaResults = nullptr;
+
+    mPaParams.awb_results = awbResults;
+    mPaParams.exposure_params = exposureParams;
+    mPaParams.color_gains = nullptr;
+
+    IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
+    CheckError(!intelAiq, UNKNOWN_ERROR, "%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
+    {
+        PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->paRunV1", 1);
+        ia_err iaErr = intelAiq->paRunV1(&mPaParams, &newPaResults);
+        int ret = AiqUtils::convertError(iaErr);
+        CheckError(ret != OK || !newPaResults, ret, "Error running PA, ret: %d", ret);
+    }
+
+    dumpPaResult(newPaResults);
+
+    // Override color_conversion_matrix and color_gains
+    // when application requires manual color transform.
+    if (mUseManualColorMatrix) {
+        MEMCPY_S(&newPaResults->color_conversion_matrix,
+                 sizeof(newPaResults->color_conversion_matrix),
+                 &mColorMatrix.color_transform,
+                 sizeof(mColorMatrix.color_transform));
+
+        if (VALID_COLOR_GAINS(mColorGains.color_gains_rggb)) {
+            newPaResults->color_gains.r  = mColorGains.color_gains_rggb[0];
+            newPaResults->color_gains.gr = mColorGains.color_gains_rggb[1];
+            newPaResults->color_gains.gb = mColorGains.color_gains_rggb[2];
+            newPaResults->color_gains.b  = mColorGains.color_gains_rggb[3];
+        }
+
+        // Override advanced color conversion matrix also if it enabled
+        if (newPaResults->preferred_acm) {
+            for (unsigned int i = 0; i < newPaResults->preferred_acm->sector_count; i++) {
+                MEMCPY_S(&newPaResults->preferred_acm->advanced_color_conversion_matrices[i],
+                         sizeof(newPaResults->preferred_acm->advanced_color_conversion_matrices[0]),
+                         &mColorMatrix.color_transform,
+                         sizeof(mColorMatrix.color_transform));
+            }
+        }
+    }
+
+    return AiqUtils::deepCopyPaResults(*newPaResults, paResults, preferredAcm);
+}
+
+int AiqCore::checkColorOrder(cmc_bayer_order bayerOrder, ColorOrder *colorOrder) {
+    LOG3A("@%s, bayerOrder = %d, colorOrder:%p", __func__, bayerOrder, colorOrder);
+    CheckError(!colorOrder, BAD_VALUE, "@%s, colorOrder is nullptr", __func__);
+
+    int ret = OK;
+    switch (bayerOrder) {
+    case cmc_bayer_order_grbg:
+    /* use gr r b gb constitute 2X2 array
+     * gr    r
+     * b     gb
+     * The four channel use x y coordinate to indicate
+     * gr(0, 0) r(1, 0) b(0, 1) gb(1, 1)
+    */
+        colorOrder->r[0] = 1;
+        colorOrder->r[1] = 0;
+        colorOrder->b[0] = 0;
+        colorOrder->b[1] = 1;
+        colorOrder->gr[0] = 0;
+        colorOrder->gr[1] = 0;
+        colorOrder->gb[0] = 1;
+        colorOrder->gb[1] = 1;
+        break;
+    case cmc_bayer_order_rggb:
+        colorOrder->r[0] = 0;
+        colorOrder->r[1] = 0;
+        colorOrder->b[0] = 1;
+        colorOrder->b[1] = 1;
+        colorOrder->gr[0] = 1;
+        colorOrder->gr[1] = 0;
+        colorOrder->gb[0] = 0;
+        colorOrder->gb[1] = 1;
+        break;
+    case cmc_bayer_order_bggr:
+        colorOrder->r[0] = 1;
+        colorOrder->r[1] = 1;
+        colorOrder->b[0] = 0;
+        colorOrder->b[1] = 0;
+        colorOrder->gr[0] = 0;
+        colorOrder->gr[1] = 1;
+        colorOrder->gb[0] = 1;
+        colorOrder->gb[1] = 0;
+        break;
+    case cmc_bayer_order_gbrg:
+        colorOrder->r[0] = 0;
+        colorOrder->r[1] = 1;
+        colorOrder->b[0] = 1;
+        colorOrder->b[1] = 0;
+        colorOrder->gr[0] = 1;
+        colorOrder->gr[1] = 1;
+        colorOrder->gb[0] = 0;
+        colorOrder->gb[1] = 0;
+        break;
+    default:
+        ret = BAD_VALUE;
+        break;
+    }
+    return ret;
+}
+
+int AiqCore::reFormatLensShadingMap(const LSCGrid &inputLscGrid, float *dstLscGridRGGB) {
+    LOG3A("@%s, width %d, height %d", __func__, inputLscGrid.width, inputLscGrid.height);
+
+    CheckError(inputLscGrid.isBad() || !dstLscGridRGGB, BAD_VALUE,
+               "@%s, Bad input values for lens shading map reformatting", __func__);
+
+    // Metadata spec request order [R, Geven, Godd, B]
+    // the lensShading from ISP is 4 width * height block,
+    // for ia_aiq_bayer_order_grbg, the four block is G, R, B, G
+    size_t size = inputLscGrid.height * inputLscGrid.width;
+    for (size_t i = 0; i < size; i++) {
+        *dstLscGridRGGB++ = inputLscGrid.gridR[i];
+        *dstLscGridRGGB++ = inputLscGrid.gridGr[i];
+        *dstLscGridRGGB++ = inputLscGrid.gridGb[i];
+        *dstLscGridRGGB++ = inputLscGrid.gridB[i];
+    }
+
+    return OK;
+}
+
+int AiqCore::storeLensShadingMap(const LSCGrid &inputLscGrid,
+                                 const LSCGrid &resizeLscGrid, float *dstLscGridRGGB) {
+    LOG3A("@%s", __func__);
+    CheckError(inputLscGrid.isBad() || resizeLscGrid.isBad() || !dstLscGridRGGB, BAD_VALUE,
+               "@%s, Bad input values for lens shading map storing", __func__);
+
+    int destWidth = resizeLscGrid.width;
+    int destHeight = resizeLscGrid.height;
+    int width = inputLscGrid.width;
+    int height = inputLscGrid.height;
+
+    if (width != destWidth || height != destHeight) {
+        // requests lensShadingMapSize must be smaller than 64*64
+        // and it is a constant size.
+        // Our lensShadingMapSize is dynamic based on the resolution, so need
+        // to do resize for 4 channels separately
+
+        AiqUtils::resize2dArray(inputLscGrid.gridR,  width, height,
+                      resizeLscGrid.gridR,  destWidth, destHeight);
+        AiqUtils::resize2dArray(inputLscGrid.gridGr,  width, height,
+                      resizeLscGrid.gridGr,  destWidth, destHeight);
+        AiqUtils::resize2dArray(inputLscGrid.gridGb,  width, height,
+                      resizeLscGrid.gridGb,  destWidth, destHeight);
+        AiqUtils::resize2dArray(inputLscGrid.gridB,  width, height,
+                      resizeLscGrid.gridB,  destWidth, destHeight);
+
+        LOG3A("resize lens shading map from [%d,%d] to [%d,%d]",
+              width, height, destWidth, destHeight);
+    } else {
+        size_t size = destWidth * destHeight * sizeof(resizeLscGrid.gridR[0]);
+        STDCOPY((int8_t *) resizeLscGrid.gridR,  (int8_t *) inputLscGrid.gridR,  size);
+        STDCOPY((int8_t *) resizeLscGrid.gridGr, (int8_t *) inputLscGrid.gridGr, size);
+        STDCOPY((int8_t *) resizeLscGrid.gridGb, (int8_t *) inputLscGrid.gridGb, size);
+        STDCOPY((int8_t *) resizeLscGrid.gridB,  (int8_t *) inputLscGrid.gridB,  size);
+    }
+
+    return reFormatLensShadingMap(resizeLscGrid, dstLscGridRGGB);
+}
+
+int AiqCore::processSAResults(ia_aiq_sa_results_v1 *saResults, float *lensShadingMap) {
+    LOG3A("@%s, saResults:%p, lensShadingMap:%p", __func__, saResults, lensShadingMap);
+    CheckError(!saResults || !lensShadingMap, BAD_VALUE, "@%s, Bad input values", __func__);
+
+    if (!saResults->lsc_update || (mLensShadingMapMode == LENS_SHADING_MAP_MODE_OFF)) {
+        return OK;
+    }
+
+    ColorOrder co_ind = {};
+    int ret = checkColorOrder(saResults->color_order, &co_ind);
+    CheckError(ret != OK, BAD_VALUE, "Failed to checkColorOrder, ret: %d", ret);
+
+    LSCGrid inputGrid;
+    inputGrid.gridB = saResults->lsc_grid[co_ind.b[0]][co_ind.b[1]];
+    inputGrid.gridR = saResults->lsc_grid[co_ind.r[0]][co_ind.r[1]];
+    inputGrid.gridGr = saResults->lsc_grid[co_ind.gr[0]][co_ind.gr[1]];
+    inputGrid.gridGb = saResults->lsc_grid[co_ind.gb[0]][co_ind.gb[1]];
+    inputGrid.width = saResults->width;
+    inputGrid.height = saResults->height;
+
+    LSCGrid resizeGrid;
+    resizeGrid.gridB = mResizeLscGridB;
+    resizeGrid.gridR = mResizeLscGridR;
+    resizeGrid.gridGr = mResizeLscGridGr;
+    resizeGrid.gridGb = mResizeLscGridGb;
+    resizeGrid.width = mLensShadingMapSize.x;
+    resizeGrid.height = mLensShadingMapSize.y;
+
+    float lscGridRGGB[MAX_LSC_GRID_SIZE * 4];
+    storeLensShadingMap(inputGrid, resizeGrid, lscGridRGGB);
+
+    size_t size = resizeGrid.width * resizeGrid.height * 4;
+    size_t errCount = 0;
+    for (size_t i = 0; i < size; i++) {
+        if (lscGridRGGB[i] < 1.0f) {
+            lscGridRGGB[i] = 1.0f;
+            errCount++;
+        }
+    }
+    if (errCount) {
+        LOGW("Error - SA produced too small values (%d/%d)!", errCount, size);
+    }
+
+    float *lsm = (mShadingMode != SHADING_MODE_OFF) ? lscGridRGGB : mLscOffGrid;
+    for (size_t i = 0; i < size; i++) {
+        lensShadingMap[i] = lsm[i];
+    }
+
+    return OK;
+}
+
+int AiqCore::runSa(ia_aiq_sa_results_v1 *saResults,
+                   ia_aiq_awb_results *awbResults,
+                   float *lensShadingMap) {
+    LOG3A("%s, saResults:%p, awbResults:%p, lensShadingMap:%p", __func__,
+          saResults, awbResults, lensShadingMap);
+    CheckError(!saResults || !awbResults || !lensShadingMap, BAD_VALUE,
+               "@%s, Bad input values", __func__);
+
+    PERF_CAMERA_ATRACE();
+    int ret = OK;
+    ia_aiq_sa_results_v1 *newSaResults = nullptr;
+
+    mSaParams.awb_results = awbResults;
+
+    IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
+    CheckError(!intelAiq, UNKNOWN_ERROR, "%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
+    {
+        PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->saRunV2", 1);
+        ia_err iaErr = intelAiq->saRunV2(&mSaParams, &newSaResults);
+        ret = AiqUtils::convertError(iaErr);
+        CheckError(ret != OK || !newSaResults, ret, "intelAiq->saRunV2 fails, ret: %d", ret);
+    }
+
+    dumpSaResult(newSaResults);
+    ret = AiqUtils::deepCopySaResults(*newSaResults, saResults);
+    CheckError(ret != OK, ret, "Error deepCopySaResults, ret: %d", ret);
+
+    return processSAResults(saResults, lensShadingMap);
+}
+
+int AiqCore::dumpPaResult(const ia_aiq_pa_results_v1 *paResult) {
+    LOG3A("%s, paResult:%p", __func__, paResult);
+    CheckError(!paResult, BAD_VALUE, "@%s, paResult is nullptr", __func__);
+
+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) return OK;
+
+    LOG3A("   PA results brightness %f saturation %f",
+          paResult->brightness_level,
+          paResult->saturation_factor);
+    LOG3A("   PA results black level row 0: %f %f %f  %f ",
+          paResult->black_level_4x4[0][0],
+          paResult->black_level_4x4[0][1],
+          paResult->black_level_4x4[0][2],
+          paResult->black_level_4x4[0][3]);
+    LOG3A("   PA results black level row 1: %f %f %f  %f ",
+          paResult->black_level_4x4[1][0],
+          paResult->black_level_4x4[1][1],
+          paResult->black_level_4x4[1][2],
+          paResult->black_level_4x4[1][3]);
+    LOG3A("   PA results black level row 2: %f %f %f  %f ",
+          paResult->black_level_4x4[2][0],
+          paResult->black_level_4x4[2][1],
+          paResult->black_level_4x4[2][2],
+          paResult->black_level_4x4[2][3]);
+    LOG3A("   PA results black level row 3: %f %f %f  %f ",
+          paResult->black_level_4x4[3][0],
+          paResult->black_level_4x4[3][1],
+          paResult->black_level_4x4[3][2],
+          paResult->black_level_4x4[3][3]);
+    LOG3A("   PA results color gains %f %f %f  %f ",
+          paResult->color_gains.r,
+          paResult->color_gains.gr,
+          paResult->color_gains.gb,
+          paResult->color_gains.b);
+    LOG3A("   PA results linearization table size %d",
+          paResult->linearization.size);
+
+    for (int i = 0; i < 3; i++) {
+        LOG3A("   PA results color matrix  [%.3f %.3f %.3f] ",
+              paResult->color_conversion_matrix[i][0],
+              paResult->color_conversion_matrix[i][1],
+              paResult->color_conversion_matrix[i][2]);
+    }
+
+    if (paResult->preferred_acm) {
+        LOG3A("   PA results advanced ccm sector count %d ",
+              paResult->preferred_acm->sector_count);
+    }
+    if (paResult->ir_weight) {
+        LOG3A("   PA results ir weight grid [ %d x %d ] ",
+              paResult->ir_weight->width, paResult->ir_weight->height);
+    }
+
+    return OK;
+}
+
+int AiqCore::dumpSaResult(const ia_aiq_sa_results_v1 *saResult) {
+    LOG3A("%s, saResult:%p", __func__, saResult);
+    CheckError(!saResult, BAD_VALUE, "@%s, saResult is nullptr", __func__);
+
+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) return OK;
+
+    LOG3A("   SA results lsc Update %d size %dx%d",
+          saResult->lsc_update, saResult->width,  saResult->height);
+
+    return OK;
+}
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/3a/AiqCore.h b/camera/hal/intel/ipu6/src/3a/AiqCore.h
new file mode 100644
index 000000000000..0d0c03221b4e
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqCore.h
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+
+#include "ia_aiq.h"
+#include "ia_ltm.h"
+#include "ia_cmc_types.h"
+#ifndef ENABLE_SANDBOXING
+#include "ia_log.h"
+#endif
+
+#include "AiqSetting.h"
+#include "AiqResult.h"
+
+#include "Intel3AParameter.h"
+#include "Intel3AResult.h"
+
+#ifdef ENABLE_SANDBOXING
+#include "modules/sandboxing/client/IntelAiq.h"
+#else
+#include "modules/algowrapper/IntelAiq.h"
+#endif
+
+namespace icamera {
+
+/*
+ * \class AiqCore
+ * This class is used to set parameter, statistics and run Ae,
+ * Af, Awb, Gbce, Pa, Sa.
+ */
+class AiqCore {
+
+public:
+    AiqCore(int cameraId);
+    ~AiqCore();
+
+    /**
+     * \brief AiqCore init
+     *
+     * Init AiqPlus and AAAObject
+     */
+    int init();
+
+    /**
+     * \brief AiqCore deinit
+     *
+     * Deinit AiqPlus and AAAObject
+     */
+    int deinit();
+
+    /**
+     * \brief AiqCore configure
+     *
+     * Configure AiqPlus ConfigMode
+     */
+    int configure(const std::vector<ConfigMode>& configModes);
+
+    /**
+     * \brief Set sensor and frame info
+     *
+     * \param frameParams: the frame info parameter
+     * \param descriptor: the sensor info parameter
+     */
+    int setSensorInfo(const ia_aiq_frame_params &frameParams,
+                      const ia_aiq_exposure_sensor_descriptor &descriptor);
+
+    /**
+     * \brief update param and set converge speed
+     *
+     * \param param: the parameter update to AiqPlus and Aiq3A or custom 3A
+     */
+    int updateParameter(const aiq_parameter_t &param);
+
+    /**
+     * \brief Set ispStatistics to AiqPlus and Aiq3A or custom 3A
+     */
+    int setStatistics(const ia_aiq_statistics_input_params_v4 *ispStatistics);
+
+    /**
+     * \brief run 3A and AiqPlus
+     *
+     * \return OK if succeed, other value indicates failed
+     */
+    int runAiq(AiqResult *aiqResult);
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(AiqCore);
+
+    // LSC data
+    typedef struct ColorOrder {
+        uint8_t r[2];
+        uint8_t gr[2];
+        uint8_t gb[2];
+        uint8_t b[2];
+    } ColorOrder;
+
+    class LSCGrid {
+     public: /* this was a struct: class just to satisfy a static code scanner */
+        uint16_t width;
+        uint16_t height;
+        uint16_t *gridR;
+        uint16_t *gridGr;
+        uint16_t *gridGb;
+        uint16_t *gridB;
+
+        bool isBad() const {
+            return (gridB == NULL || gridGb == NULL || gridR == NULL ||
+                    gridGr == NULL || width == 0 || height == 0);
+        }
+        LSCGrid(): width(0), height(0), gridR(NULL), gridGr(NULL),
+            gridGb(NULL), gridB(NULL) {}
+    };
+
+    int run3A(AiqResult *aiqResult);
+    int runAiqPlus(AiqResult *aiqResult);
+    int runAe(ia_aiq_ae_results* aeResults);
+    int runAf(AiqResult *aiqResult);
+    void focusDistanceResult(const ia_aiq_af_results *afResults,
+                             float *afDistanceDiopters,
+                             camera_range_t *focusRange);
+    int runAwb(ia_aiq_awb_results* awbResults);
+    int runGbce(ia_aiq_gbce_results *gbceResults);
+    int runPa(ia_aiq_pa_results_v1 *paResults,
+              ia_aiq_awb_results *awbResults,
+              ia_aiq_exposure_parameters *exposureParams,
+              ia_aiq_advanced_ccm_t *preferredAcm);
+    int runSa(ia_aiq_sa_results_v1 *saResults,
+              ia_aiq_awb_results *awbResults,
+              float *lensShadingMap);
+    int processSAResults(ia_aiq_sa_results_v1 *saResults, float *lensShadingMap);
+    int checkColorOrder(cmc_bayer_order bayerOrder, ColorOrder *colorOrder);
+    int storeLensShadingMap(const LSCGrid &inputLscGrid,
+                            const LSCGrid &resizeLscGrid, float *dstLscGridRGGB);
+    int reFormatLensShadingMap(const LSCGrid &inputLscGrid, float *dstLscGridRGGB);
+
+    int calculateHyperfocalDistance(TuningMode mode);
+    int calculateDepthOfField(const ia_aiq_af_results &afResults, camera_range_t *focusRange);
+    int initAiqPlusParams();
+    int initIntelAiqHandle(const std::vector<TuningMode>& tuningModes);
+    void deinitIntelAiqHandle(void);
+    // debug dumpers
+    int dumpPaResult(const ia_aiq_pa_results_v1* paResult);
+    int dumpSaResult(const ia_aiq_sa_results_v1* saResult);
+
+private:
+    int mCameraId;
+
+    bool mAeForceLock;
+    bool mAwbForceLock;
+    bool mAfForceLock;
+
+    std::unique_ptr<Intel3AParameter> mIntel3AParameter;
+    std::unique_ptr<Intel3AResult> mIntel3AResult;
+
+    // Original AeResult class arrays are kept in 3a engine which is safely used here.
+    ia_aiq_ae_results *mLastAeResult;
+    ia_aiq_awb_results *mLastAwbResult;
+    ia_aiq_af_results *mLastAfResult;
+
+    int mAeRunTime;
+    int mAwbRunTime;
+
+    IntelAiq *mIntelAiqHandle[TUNING_MODE_MAX];
+    bool mIntelAiqHandleStatus[TUNING_MODE_MAX];
+
+    enum AiqState {
+        AIQ_NOT_INIT = 0,
+        AIQ_INIT,
+        AIQ_CONFIGURED,
+        AIQ_MAX
+    } mAiqState;
+
+    ia_aiq_frame_params mFrameParams;
+
+    ia_aiq_gbce_input_params mGbceParams;
+    ia_aiq_pa_input_params mPaParams;
+    ia_aiq_color_channels mPaColorGains;
+    ia_aiq_sa_input_params_v1 mSaParams;
+
+    bool mUseManualColorMatrix;
+    camera_color_transform_t mColorMatrix;
+    camera_color_gains_t mColorGains;
+    float mHyperFocalDistance;  // in millimeters
+
+    TuningMode mTuningMode;
+    camera_shading_mode_t mShadingMode;
+    camera_lens_shading_map_mode_type_t mLensShadingMapMode;
+    camera_coordinate_t mLensShadingMapSize;
+    uint16_t mResizeLscGridR[MAX_LSC_GRID_SIZE];
+    uint16_t mResizeLscGridGr[MAX_LSC_GRID_SIZE];
+    uint16_t mResizeLscGridGb[MAX_LSC_GRID_SIZE];
+    uint16_t mResizeLscGridB[MAX_LSC_GRID_SIZE];
+    float mLscOffGrid[MAX_LSC_GRID_SIZE * 4];
+
+};
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/3a/AiqEngine.cpp b/camera/hal/intel/ipu6/src/3a/AiqEngine.cpp
new file mode 100644
index 000000000000..f958f87b31d1
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqEngine.cpp
@@ -0,0 +1,526 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "AiqEngine"
+
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+#include "PlatformData.h"
+#include "AiqEngine.h"
+#include "FaceDetection.h"
+
+namespace icamera {
+
+AiqEngine::AiqEngine(int cameraId, SensorHwCtrl *sensorHw, LensHw *lensHw, AiqSetting *setting) :
+    mCameraId(cameraId),
+    mAiqSetting(setting),
+    mFirstAiqRunning(true),
+    mFirstExposureSetting(true),
+    mAiqRunningForPerframe(false),
+    m3ACadenceSequence(0),
+    mLastStatsSequence(-1)
+{
+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
+
+    CLEAR(mRgbsGridArray);
+    CLEAR(mAfGridArray);
+
+    mIntelMkn = MakerNote::getInstance(mCameraId);
+
+    mAiqCore = new AiqCore(mCameraId);
+
+    mSensorManager = new SensorManager(mCameraId, sensorHw);
+
+    mLensManager = new LensManager(mCameraId, lensHw);
+
+    // Should consider better place to maintain the life cycle of AiqResultStorage
+    mAiqResultStorage = AiqResultStorage::getInstance(mCameraId);
+    mCurrentStatsSequence = 0;
+}
+
+AiqEngine::~AiqEngine()
+{
+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
+
+    delete mLensManager;
+
+    delete mSensorManager;
+
+    delete mAiqCore;
+
+    AiqResultStorage::releaseAiqResultStorage(mCameraId);
+
+    MakerNote::releaseMakerNote(mCameraId);
+}
+
+int AiqEngine::init()
+{
+    AutoMutex l(mEngineLock);
+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
+
+    if (mAiqCore->init() != OK) {
+        return UNKNOWN_ERROR;
+    }
+
+    mSensorManager->init();
+
+    LOG1("%s, end mCameraId = %d", __func__, mCameraId);
+    return OK;
+}
+
+int AiqEngine::deinit()
+{
+    AutoMutex l(mEngineLock);
+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
+
+    mSensorManager->deinit();
+
+    mAiqCore->deinit();
+
+    LOG1("%s, end mCameraId = %d", __func__, mCameraId);
+    return OK;
+}
+
+int AiqEngine::configure(const std::vector<ConfigMode>& configModes)
+{
+    AutoMutex l(mEngineLock);
+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
+
+    mAiqCore->configure(configModes);
+
+    return OK;
+}
+
+int AiqEngine::startEngine()
+{
+    AutoMutex l(mEngineLock);
+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
+
+    mFirstAiqRunning = true;
+    mFirstExposureSetting = true;
+
+    mSensorManager->reset();
+
+    mLensManager->start();
+
+    m3ACadenceSequence = 0;
+
+    LOG1("%s, end mCameraId = %d", __func__, mCameraId);
+
+    return OK;
+}
+
+int AiqEngine::stopEngine()
+{
+    AutoMutex l(mEngineLock);
+    LOG1("%s, end mCameraId = %d", __func__, mCameraId);
+
+    mLensManager->stop();
+
+    return OK;
+}
+
+int AiqEngine::run3A(long *settingSequence)
+{
+    LOG3A("%s", __func__);
+    // Run 3A in call thread
+    AutoMutex l(mEngineLock);
+
+    // Handle 3A cadence logic
+    int run3ACadence = mAiqParam.run3ACadence;
+    if (run3ACadence < 1) {
+        LOGW("Invalid 3A cadence %d, use default 1.", run3ACadence);
+        run3ACadence = 1;
+    }
+    LOG2("%s: run3ACadence is %d", __func__, run3ACadence);
+
+    if (m3ACadenceSequence % run3ACadence != 0) {
+        // Skip 3A per cadence
+        m3ACadenceSequence ++;
+        return OK;
+    }
+    LOG2("%s: run 3A for cadence sequence %ld", __func__, m3ACadenceSequence);
+    m3ACadenceSequence ++;
+
+    mAiqRunningForPerframe = (settingSequence != nullptr);
+    AiqState state = prepareInputParam();
+
+    AiqResult *aiqResult = mAiqResultStorage->acquireAiqResult();
+    aiqResult->mTuningMode = mAiqParam.tuningMode;
+
+    if (state == AIQ_STATE_RUN) {
+        state = runAiq(aiqResult);
+    }
+    if (state == AIQ_STATE_RESULT_SET) {
+        state = handleAiqResult(aiqResult);
+    }
+    if (state == AIQ_STATE_DONE) {
+        done(aiqResult);
+    }
+
+    mAiqResultStorage->unLockAiqStatistics();
+
+    if (settingSequence) {
+        *settingSequence = mAiqResultStorage->getAiqResult()->mSequence;
+        LOG3A("%s, sequence %ld, mLastStatsSequence %ld", __func__, *settingSequence,
+               mLastStatsSequence);
+    }
+
+    mIntelMkn->saveMakernoteData(mAiqParam.makernoteMode,
+                                 mAiqResultStorage->getAiqResult()->mSequence);
+
+    return (state == AIQ_STATE_DONE || state == AIQ_STATE_WAIT) ? 0 : UNKNOWN_ERROR;
+}
+
+EventListener *AiqEngine::getSofEventListener()
+{
+    AutoMutex l(mEngineLock);
+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
+
+    return mSensorManager->getSofEventListener();
+}
+
+int AiqEngine::saveAfGridData(const ia_aiq_af_grid* afGrid, ia_aiq_af_grid* dst)
+{
+    LOG3A("%s", __func__);
+    if (afGrid == nullptr
+        || afGrid->filter_response_1 == nullptr
+        || afGrid->filter_response_2 == nullptr
+        || afGrid->grid_width == 0
+        || afGrid->grid_height == 0) {
+        LOGE("%s, af grids are invalid", __func__);
+        return BAD_VALUE;
+    }
+
+    size_t gridSize = afGrid->grid_width * afGrid->grid_height;
+    if (afGrid->grid_width != dst->grid_width || afGrid->grid_height != dst->grid_height) {
+        if (dst->filter_response_1 != nullptr) {
+            delete [] dst->filter_response_1;
+        }
+        dst->filter_response_1 = new int[gridSize];
+        if (dst->filter_response_2 != nullptr) {
+            delete [] dst->filter_response_2;
+        }
+        dst->filter_response_2 = new int[gridSize];
+    }
+
+    dst->grid_width = afGrid->grid_width;
+    dst->grid_height = afGrid->grid_height;
+    dst->block_width = afGrid->block_width;
+    dst->block_height = afGrid->block_height;
+    MEMCPY_S(dst->filter_response_1, gridSize * sizeof(int),
+             afGrid->filter_response_1, gridSize * sizeof(int));
+    MEMCPY_S(dst->filter_response_2, gridSize * sizeof(int),
+             afGrid->filter_response_2, gridSize * sizeof(int));
+
+    LOG3A("%s, grid size=[%dx%d]", __func__, dst->grid_width, dst->grid_height);
+    return OK;
+}
+
+int AiqEngine::saveRgbsGridData(const ia_aiq_rgbs_grid* rgbsGrid, ia_aiq_rgbs_grid* dst)
+{
+    LOG3A("%s", __func__);
+    if (rgbsGrid == nullptr
+        || rgbsGrid->blocks_ptr == nullptr
+        || rgbsGrid->grid_width == 0
+        || rgbsGrid->grid_height == 0) {
+        LOGE("%s, rgbs grids are invalid", __func__);
+        return BAD_VALUE;
+    }
+
+    size_t gridSize = rgbsGrid->grid_width * rgbsGrid->grid_height;
+    if (rgbsGrid->grid_width != dst->grid_width || rgbsGrid->grid_height != dst->grid_height) {
+        if (dst->blocks_ptr != nullptr) {
+            delete [] dst->blocks_ptr;
+        }
+        dst->blocks_ptr = new rgbs_grid_block[gridSize];
+    }
+
+    dst->grid_width = rgbsGrid->grid_width;
+    dst->grid_height = rgbsGrid->grid_height;
+    MEMCPY_S(dst->blocks_ptr, gridSize * sizeof(rgbs_grid_block),
+             rgbsGrid->blocks_ptr, gridSize * sizeof(rgbs_grid_block));
+
+    dst->shading_correction = rgbsGrid->shading_correction;
+
+    LOG3A("%s, grid size=[%dx%d]", __func__, dst->grid_width, dst->grid_height);
+    return OK;
+}
+
+int AiqEngine::prepareStats(ia_aiq_statistics_input_params_v4 *statsParam,
+                            ia_aiq_gbce_results *gbceResults,
+                            AiqStatistics *aiqStatistics)
+{
+    mLastStatsSequence = aiqStatistics->mSequence;
+    LOG3A("%s, sequence %ld", __func__, aiqStatistics->mSequence);
+
+    statsParam->rgbs_grids = mRgbsGridArray;
+    statsParam->af_grids = mAfGridArray;
+
+    int ret = OK;
+    do {
+
+        // The statistics timestamp is incorrect. If possible, use SOF timestamp instead.
+        unsigned long long timestamp = mSensorManager->getSofTimestamp(aiqStatistics->mSequence);
+        if (timestamp == 0) {
+            LOG2("The sof sequence was not found %ld", aiqStatistics->mSequence);
+            timestamp = aiqStatistics->mTimestamp;
+        }
+
+        statsParam->frame_id = aiqStatistics->mSequence;
+        statsParam->frame_timestamp = timestamp;
+        statsParam->num_rgbs_grids = PlatformData::getExposureNum(mCameraId,
+                                         CameraUtils::isMultiExposureCase(mAiqParam.tuningMode));
+
+        if (statsParam->num_rgbs_grids > 1) {
+            for (unsigned int i = 0; i < statsParam->num_rgbs_grids; i++) {
+                statsParam->rgbs_grids[i] = &(aiqStatistics->mRgbsGridArray[i]);
+            }
+        } else {
+            statsParam->rgbs_grids[0] = &(aiqStatistics->mRgbsGridArray[0]);
+        }
+        statsParam->af_grids[0] = &(aiqStatistics->mAfGridArray[0]);
+        statsParam->num_af_grids = 1;
+        statsParam->external_histograms = nullptr;
+        statsParam->num_external_histograms = 0;
+        statsParam->camera_orientation = ia_aiq_camera_orientation_unknown;
+
+        const AiqResult *feedback = mAiqResultStorage->getAiqResult(aiqStatistics->mSequence);
+        if (feedback == nullptr) {
+            LOGW("%s: no feed back result for sequence %ld! use the latest instead",
+                    __func__, aiqStatistics->mSequence);
+            feedback = mAiqResultStorage->getAiqResult();
+        }
+
+        statsParam->frame_ae_parameters = &feedback->mAeResults;
+        statsParam->frame_af_parameters = &feedback->mAfResults;
+        statsParam->frame_pa_parameters = &feedback->mPaResults;
+        statsParam->awb_results = &feedback->mAwbResults;
+        statsParam->frame_sa_parameters = &feedback->mSaResults;
+
+        *gbceResults = feedback->mGbceResults;
+    } while (0);
+    LOG3A("%s end", __func__);
+    return ret;
+}
+
+void AiqEngine::setAiqResult(AiqResult *aiqResult, bool skip)
+{
+    SensorExpGroup sensorExposures;
+    for (unsigned int i = 0; i < aiqResult->mAeResults.num_exposures; i++) {
+        SensorExposure exposure;
+        exposure.sensorParam = *aiqResult->mAeResults.exposures[i].sensor_exposure;
+        exposure.realDigitalGain = (aiqResult->mAeResults.exposures[i].exposure)->digital_gain;
+        sensorExposures.push_back(exposure);
+    }
+    bool useSof = !mFirstExposureSetting;
+    aiqResult->mSequence = mSensorManager->updateSensorExposure(sensorExposures, useSof);
+    if (mFirstExposureSetting) {
+        mFirstExposureSetting = false;
+    }
+    aiqResult->mSkip = skip;
+
+    if (skip) {
+        LOG3A("%s, skipping frame aiqResult->mSequence = %ld", __func__, aiqResult->mSequence);
+    }
+
+    mLensManager->setLensResult(aiqResult->mAeResults, aiqResult->mAfResults);
+
+    aiqResult->mAiqParam = mAiqParam;
+}
+
+int AiqEngine::getSkippingNum(AiqResult *aiqResult)
+{
+    LOG3A("%s", __func__);
+    int skipNum = 0;
+
+    if (!mFirstAiqRunning) {
+        const AiqResult *lastResult = mAiqResultStorage->getAiqResult();
+        if (lastResult->mTuningMode != aiqResult->mTuningMode) {
+            // Skip 3 frames when pipe switching
+            skipNum = 3;
+        }
+    } else if (mAiqRunningForPerframe) {
+        // The 1st result takes effect @ frame (initialSkip) (applied before stream on)
+        skipNum = PlatformData::getInitialSkipFrame(mCameraId);
+    }
+
+    return skipNum;
+}
+
+bool AiqEngine::needRun3A(AiqStatistics *aiqStatistics)
+{
+    LOG3A("%s", __func__);
+
+    // Force to run 3a for per-frame control case
+    if (mAiqRunningForPerframe) {
+        return true;
+    }
+
+    // Force to run 3a for the first time running
+    if (mFirstAiqRunning) {
+        return true;
+    }
+
+    if (aiqStatistics == nullptr) {
+        LOG3A("no stats and not need to re-run 3A");
+        return false;
+    }
+
+    if (mLastStatsSequence == aiqStatistics->mSequence) {
+        LOG3A("no new stats skip, mLastStatsSequence = %ld", mLastStatsSequence);
+        return false;
+    } else if (mSensorManager->getCurrentExposureAppliedDelay() > kMaxExposureAppliedDelay) {
+        LOG3A("exposure setting applied delay is too larger, skip it");
+        return false;
+    }
+
+    return true;
+}
+
+AiqEngine::AiqState AiqEngine::prepareInputParam(void)
+{
+    // set Aiq Params
+    int ret = mAiqSetting->getAiqParameter(mAiqParam);
+    if (ret != OK)
+        return AIQ_STATE_ERROR;
+
+    // Update sensor info for the first-run of AIQ
+    if (mFirstAiqRunning) {
+        mSensorManager->setFrameRate(mAiqParam.fps);
+        // set sensor info if needed
+        ia_aiq_exposure_sensor_descriptor sensorDescriptor;
+        ia_aiq_frame_params frameParams;
+        CLEAR(sensorDescriptor);
+        CLEAR(frameParams);
+        ret = mSensorManager->getSensorInfo(frameParams, sensorDescriptor);
+        CheckError((ret != OK), AIQ_STATE_ERROR, "Get sensor info failed:%d", ret);
+        mAiqCore->setSensorInfo(frameParams, sensorDescriptor);
+    }
+
+    // update lens related parameters
+    mLensManager->getLensInfo(mAiqParam);
+
+    mAiqCore->updateParameter(mAiqParam);
+    // set Stats
+    ia_aiq_statistics_input_params_v4 statsParam;
+    CLEAR(statsParam);
+    ia_aiq_gbce_results gbceResults;
+    CLEAR(gbceResults);
+
+    AiqStatistics *aiqStats =
+        const_cast<AiqStatistics*>(mAiqResultStorage->getAndLockAiqStatistics());
+
+    if (!needRun3A(aiqStats)) {
+        return AIQ_STATE_WAIT;
+    }
+
+    if (aiqStats == nullptr) {
+        LOG3A("%s: run aiq without stats data", __func__);
+        return AIQ_STATE_RUN;
+    }
+
+    // update face detection related parameters
+    ia_atbx_face faces[MAX_FACES_DETECTABLE];
+    ia_atbx_face_state facesState;
+    if (PlatformData::isFaceAeEnabled(mCameraId)) {
+        facesState.num_faces = 0;
+        facesState.faces = faces;
+        int ret = icamera::FaceDetection::getResult(mCameraId, &facesState);
+        if (ret == OK && facesState.num_faces > 0) {
+            ia_rectangle rect = facesState.faces[0].face_area;
+            LOG3A("@%s, face number:%d, left:%d, top:%d, right:%d, bottom:%d", __func__,
+                   facesState.num_faces, rect.left, rect.top, rect.right, rect.bottom);
+            statsParam.faces = &facesState;
+        }
+    }
+
+    ret = prepareStats(&statsParam, &gbceResults, aiqStats);
+
+    if (ret != OK) {
+        LOG3A("%s: no useful stats", __func__);
+        return AIQ_STATE_RUN;
+    }
+
+    mAiqCore->setStatistics(&statsParam);
+
+    return AIQ_STATE_RUN;
+}
+
+AiqEngine::AiqState AiqEngine::runAiq(AiqResult *aiqResult)
+{
+    int ret = mAiqCore->runAiq(aiqResult);
+    if (ret != OK) {
+        return AIQ_STATE_ERROR;
+    }
+
+    return AIQ_STATE_RESULT_SET;
+}
+
+AiqEngine::AiqState AiqEngine::handleAiqResult(AiqResult *aiqResult)
+{
+    LOG2("%s: aiqResult->mTuningMode = %d", __func__, aiqResult->mTuningMode);
+
+    applyManualTonemaps(aiqResult);
+
+    return AIQ_STATE_DONE;
+}
+
+int AiqEngine::applyManualTonemaps(AiqResult *aiqResult)
+{
+    /*
+     * Normal use-case is the automatic modes, and we need not do anything here
+     */
+    if (mAiqParam.tonemapMode == TONEMAP_MODE_FAST ||
+        mAiqParam.tonemapMode == TONEMAP_MODE_HIGH_QUALITY) {
+        return OK;
+    }
+
+    if (mAiqParam.tonemapMode == TONEMAP_MODE_GAMMA_VALUE) {
+        AiqUtils::applyTonemapGamma(mAiqParam.tonemapGamma, &aiqResult->mGbceResults);
+    } else if (mAiqParam.tonemapMode == TONEMAP_MODE_PRESET_CURVE) {
+        if (mAiqParam.tonemapPresetCurve == TONEMAP_PRESET_CURVE_SRGB) {
+            AiqUtils::applyTonemapSRGB(&aiqResult->mGbceResults);
+        } else if (mAiqParam.tonemapPresetCurve == TONEMAP_PRESET_CURVE_REC709) {
+            AiqUtils::applyTonemapREC709(&aiqResult->mGbceResults);
+        }
+    }
+    return OK;
+}
+
+AiqEngine::AiqState AiqEngine::done(AiqResult *aiqResult)
+{
+    int skipNum = getSkippingNum(aiqResult);
+    AiqResult *tmp = aiqResult;
+
+    for (int i = 0; i < skipNum; i++) {
+        // Increase the sensor settings sequence id, so for any frame that
+        // its sequence id is bigger than the user expected id will be discarded.
+        setAiqResult(tmp, true);
+        mAiqResultStorage->updateAiqResult(tmp->mSequence);
+        tmp = mAiqResultStorage->acquireAiqResult();
+        *tmp = *aiqResult;
+    }
+
+    setAiqResult(tmp, false);
+    mAiqResultStorage->updateAiqResult(tmp->mSequence);
+
+    mFirstAiqRunning = false;
+    return AIQ_STATE_WAIT;
+}
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/3a/AiqEngine.h b/camera/hal/intel/ipu6/src/3a/AiqEngine.h
new file mode 100644
index 000000000000..11b96cb46649
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqEngine.h
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "MakerNote.h"
+#include "AiqSetting.h"
+#include "AiqCore.h"
+#include "AiqResult.h"
+#include "AiqStatistics.h"
+#include "AiqResultStorage.h"
+#include "SensorManager.h"
+#include "LensManager.h"
+
+namespace icamera {
+
+/*
+ * \class AiqEngine
+ * This class is used to parse Stats, control \class AiqEngine
+ * This class is used to parse Stats, control running AIQ algorithms
+ * and set result to HW layer.
+ * This is sub thread class.
+ */
+class AiqEngine {
+
+public:
+    AiqEngine(int cameraId, SensorHwCtrl *sensorHw, LensHw *lensHw, AiqSetting *setting);
+    ~AiqEngine();
+
+    /**
+     * \brief Init AiqResult, AiqCore and SensorManager
+     */
+    int init();
+
+    /**
+     * \brief Deinit AiqResult, AiqCore and SensorManager
+     */
+    int deinit();
+
+    /**
+     * \brief configure with ConfigMode
+     */
+    int configure(const std::vector<ConfigMode>& configModes);
+
+    /**
+     * \brief Calculate and set frame and sensor info, and run 3a with default setting.
+     */
+    int startEngine();
+
+    /**
+     * \brief Run 3a to get new 3a settings.
+     * Return 0 if the operation succeeds, and output settingSequence to
+     * indicate the frame that settings are applied.
+     * settingSequence -1 means uncertain frame for this settings.
+     */
+    int run3A(long *settingSequence);
+
+    /**
+     * \brief Stop 3a thrad and LensManager.
+     */
+    int stopEngine();
+
+    /**
+     * \brief Get software EventListener
+     */
+    EventListener *getSofEventListener();
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(AiqEngine);
+
+    int saveAfGridData(const ia_aiq_af_grid* afGrid, ia_aiq_af_grid* dst);
+    int saveRgbsGridData(const ia_aiq_rgbs_grid* rgbsGrid, ia_aiq_rgbs_grid* dst);
+
+    int prepareStats(ia_aiq_statistics_input_params_v4 *statsParami,
+                     ia_aiq_gbce_results *gbceResults,
+                     AiqStatistics *aiqStatistics);
+
+    void setAiqResult(AiqResult *aiqResult, bool skip);
+
+    int getSkippingNum(AiqResult *aiqResult);
+
+    bool needRun3A(AiqStatistics *aiqStatistics);
+
+    enum AiqState {
+        AIQ_STATE_IDLE = 0,
+        AIQ_STATE_WAIT,
+        AIQ_STATE_INPUT_PREPARE,
+        AIQ_STATE_RUN,
+        AIQ_STATE_RESULT_SET,
+        AIQ_STATE_DONE,
+        AIQ_STATE_ERROR,
+        AIQ_STATE_MAX
+    };
+
+    AiqState prepareInputParam(void);
+    AiqState runAiq(AiqResult *aiqResult);
+    AiqState handleAiqResult(AiqResult *aiqResult);
+    AiqState done(AiqResult *aiqResult);
+
+    int run();
+
+    // For manual ISP settings
+    int applyManualTonemaps(AiqResult *aiqResult);
+
+private:
+    static const nsecs_t kWaitDuration = 1000000000; //1000ms
+    static const int kMaxStatisticsDataSize = 3;
+    static const int kMaxExposureAppliedDelay = 5;
+
+private:
+    int mCameraId;
+    AiqResultStorage* mAiqResultStorage;
+    MakerNote *mIntelMkn;
+    AiqSetting *mAiqSetting;
+    AiqCore *mAiqCore;
+    SensorManager *mSensorManager;
+    LensManager *mLensManager;
+    bool mFirstAiqRunning;
+    bool mFirstExposureSetting;
+    bool mAiqRunningForPerframe;
+
+    // Guard for public API of AiqEngine.
+    Mutex mEngineLock;
+    Condition mStatsAvailableSignal;
+
+    uint32_t mCurrentStatsSequence;
+
+    const ia_aiq_rgbs_grid* mRgbsGridArray[MAX_EXPOSURES_NUM];
+    const ia_aiq_af_grid* mAfGridArray[MAX_EXPOSURES_NUM];
+
+    aiq_parameter_t mAiqParam;
+
+    long m3ACadenceSequence;
+    long mLastStatsSequence;
+};
+
+} /* namespace icamera */
+
diff --git a/camera/hal/intel/ipu6/src/3a/AiqResult.cpp b/camera/hal/intel/ipu6/src/3a/AiqResult.cpp
new file mode 100644
index 000000000000..b8d83651b4c6
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqResult.cpp
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "AiqResult"
+
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+
+#include "AiqResult.h"
+
+namespace icamera {
+
+AiqResult::AiqResult(int cameraId) :
+    mCameraId(cameraId),
+    mSequence(-1),
+    mTuningMode(TUNING_MODE_VIDEO),
+    mAfDistanceDiopters(0.0f),
+    mSkip(false)
+{
+    LOG3A("@%s", __func__);
+
+    CLEAR(mGrid);
+    CLEAR(mFlashes);
+    CLEAR(mRGammaLut);
+    CLEAR(mGGammaLut);
+    CLEAR(mBGammaLut);
+    CLEAR(mToneMapLut);
+    CLEAR(mHueSectors);
+    CLEAR(mAdvancedCCM);
+    CLEAR(mIrWeightGridR);
+    CLEAR(mIrWeightGridG);
+    CLEAR(mIrWeightGridB);
+    CLEAR(mCustomControls);
+    CLEAR(mCustomControlsParams);
+    CLEAR(mSaResults);
+    CLEAR(mAwbResults);
+    CLEAR(mIrWeight);
+    CLEAR(mApertureControl);
+    CLEAR(mGbceResults);
+    CLEAR(mWeightGrid);
+    CLEAR(mPreferredAcm);
+    CLEAR(mPaResults);
+    CLEAR(mAeResults);
+    CLEAR(mAfResults);
+    CLEAR(mFocusRange);
+}
+
+AiqResult::~AiqResult()
+{
+    LOG3A("@%s", __func__);
+    deinit();
+}
+
+int AiqResult::init()
+{
+    LOG3A("@%s", __func__);
+
+    CLEAR(mAeResults);
+    CLEAR(mAfResults);
+    CLEAR(mAwbResults);
+    CLEAR(mGbceResults);
+    CLEAR(mSaResults);
+    CLEAR(mPaResults);
+
+    CLEAR(mExposureResults);
+    CLEAR(mWeightGrid);
+    CLEAR(mGrid);
+    CLEAR(mFlashes);
+    CLEAR(mGenericExposure);
+    CLEAR(mSensorExposure);
+    CLEAR(mApertureControl);
+    CLEAR(mPreferredAcm);
+    CLEAR(mIrWeight);
+
+    mAiqParam.reset();
+
+    /*AE results init */
+    mAeResults.num_exposures = 1;
+    mAeResults.exposures = mExposureResults;
+    mAeResults.aperture_control = &mApertureControl;
+    mAeResults.weight_grid = &mWeightGrid;
+    mAeResults.weight_grid->weights = mGrid;
+    mAeResults.flashes = mFlashes;
+    for (unsigned int i = 0; i< MAX_EXPOSURES_NUM; i++) {
+        mAeResults.exposures[i].exposure = &mGenericExposure[i];
+        mAeResults.exposures[i].sensor_exposure = &mSensorExposure[i];
+    }
+    /* GBCE results init */
+    mGbceResults.r_gamma_lut = mRGammaLut;
+    mGbceResults.g_gamma_lut = mGGammaLut;
+    mGbceResults.b_gamma_lut = mBGammaLut;
+    mGbceResults.tone_map_lut = mToneMapLut;
+
+    /* SA results init */
+    mSaResults.width = MAX_LSC_WIDTH;
+    mSaResults.height = MAX_LSC_HEIGHT;
+
+    for (int i = 0; i < MAX_BAYER_ORDER_NUM; i++) {
+        for (int j = 0; j < MAX_BAYER_ORDER_NUM; j++) {
+            mSaResults.lsc_grid[i][j] = new unsigned short[MAX_LSC_WIDTH * MAX_LSC_HEIGHT];
+            memset(mSaResults.lsc_grid[i][j], 0,
+                   sizeof(unsigned short) * MAX_LSC_WIDTH * MAX_LSC_HEIGHT);
+        }
+    }
+
+    /* PA results init */
+    mPaResults.ir_weight = &mIrWeight;
+
+    mPaResults.ir_weight->ir_weight_grid_R = mIrWeightGridR;
+    mPaResults.ir_weight->ir_weight_grid_G = mIrWeightGridG;
+    mPaResults.ir_weight->ir_weight_grid_B = mIrWeightGridB;
+
+    mPreferredAcm.hue_of_sectors = mHueSectors;
+    mPreferredAcm.advanced_color_conversion_matrices = mAdvancedCCM;
+
+    /* Custom Controls init */
+    mCustomControls.parameters = mCustomControlsParams;
+
+    return OK;
+}
+
+int AiqResult::deinit()
+{
+    LOG3A("@%s", __func__);
+
+    for (int i = 0; i < MAX_BAYER_ORDER_NUM; ++i) {
+        for (int j = 0; j < MAX_BAYER_ORDER_NUM; ++j) {
+            delete []  mSaResults.lsc_grid[i][j];
+            mSaResults.lsc_grid[i][j] = nullptr;
+        }
+    }
+
+    return OK;
+}
+
+AiqResult &AiqResult::operator=(const AiqResult &other)
+{
+    deepCopyAiqResult(other, this);
+    mSequence = other.mSequence;
+    mTuningMode = other.mTuningMode;
+    mSkip = other.mSkip;
+    mCustomControls.count = other.mCustomControls.count;
+    for (int i = 0; i < mCustomControls.count; i++) {
+        mCustomControlsParams[i] = other.mCustomControlsParams[i];
+    }
+    mAiqParam = other.mAiqParam;
+
+    return *this;
+}
+
+int AiqResult::deepCopyAiqResult(const AiqResult &src, AiqResult *dst)
+{
+    int ret = AiqUtils::deepCopyAeResults(src.mAeResults, &dst->mAeResults);
+    ret |= AiqUtils::deepCopyAfResults(src.mAfResults, &dst->mAfResults);
+    ret |= AiqUtils::deepCopyAwbResults(src.mAwbResults, &dst->mAwbResults);
+    ret |= AiqUtils::deepCopyGbceResults(src.mGbceResults, &dst->mGbceResults);
+    ret |= AiqUtils::deepCopyPaResults(src.mPaResults, &dst->mPaResults, &dst->mPreferredAcm);
+    ret |= AiqUtils::deepCopySaResults(src.mSaResults, &dst->mSaResults);
+
+    return ret;
+}
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/3a/AiqResult.h b/camera/hal/intel/ipu6/src/3a/AiqResult.h
new file mode 100644
index 000000000000..eb4b9eee8a74
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqResult.h
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "ia_aiq.h"
+#include "ia_ltm.h"
+#include "ia_isp_types.h"
+
+#include "AiqUtils.h"
+#include "AiqSetting.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+
+/**
+ * \class AiqResult
+ * The private structs are part of AE, AF, AWB, PA and SA results.
+ * They need to be separately introduced to store the contents of the results
+ * that the AIQ algorithms return as pointers.
+ * Then we can do deep copy of the results
+ */
+class AiqResult {
+
+public:
+    AiqResult(int cameraId);
+    ~AiqResult();
+
+    int init();
+    int deinit();
+
+    AiqResult& operator=(const AiqResult& other);
+
+private:
+    int deepCopyAiqResult(const AiqResult &src, AiqResult *dst);
+
+public:
+    int mCameraId;
+    long mSequence;
+    TuningMode mTuningMode;
+    float mAfDistanceDiopters;
+    bool mSkip;
+    camera_range_t mFocusRange;
+
+    ia_aiq_ae_results mAeResults;
+    ia_aiq_awb_results mAwbResults;
+    ia_aiq_af_results mAfResults;
+    ia_aiq_gbce_results mGbceResults;
+    ia_aiq_pa_results_v1 mPaResults;
+    ia_aiq_sa_results_v1 mSaResults;
+
+    ia_aiq_advanced_ccm_t mPreferredAcm;
+
+    ia_isp_custom_controls mCustomControls;
+
+    aiq_parameter_t mAiqParam;
+
+private:
+
+    /*!< ia_aiq_ae_results pointer contents */
+    ia_aiq_ae_exposure_result mExposureResults[MAX_EXPOSURES_NUM];
+    ia_aiq_aperture_control   mApertureControl;
+    ia_aiq_hist_weight_grid   mWeightGrid;
+    unsigned char mGrid[MAX_AE_GRID_SIZE];
+    ia_aiq_flash_parameters   mFlashes[NUM_FLASH_LEDS];
+
+    /*!< ia_aiq_ae_exposure_result pointer contents */
+    ia_aiq_exposure_parameters        mGenericExposure[MAX_EXPOSURES_NUM];
+    ia_aiq_exposure_sensor_parameters mSensorExposure[MAX_EXPOSURES_NUM];
+
+    /*!< ia_aiq_gbce results */
+    /* The actual size of this table can be calculated by running cold
+     * GBCE, it will provide those tables.
+     */
+    float mRGammaLut[MAX_GAMMA_LUT_SIZE];
+    float mGGammaLut[MAX_GAMMA_LUT_SIZE];
+    float mBGammaLut[MAX_GAMMA_LUT_SIZE];
+    float mToneMapLut[MAX_TONEMAP_LUT_SIZE];
+
+    /*!< ia_aiq_pa_results pointer content */
+    unsigned int mHueSectors[MAX_NUM_SECTORS];
+    float mAdvancedCCM[MAX_NUM_SECTORS][3][3];
+    ia_aiq_ir_weight_t mIrWeight;
+    unsigned short mIrWeightGridR[MAX_IR_WEIGHT_GRID_SIZE];
+    unsigned short mIrWeightGridG[MAX_IR_WEIGHT_GRID_SIZE];
+    unsigned short mIrWeightGridB[MAX_IR_WEIGHT_GRID_SIZE];
+
+    /*!< ia_isp_custom_controls pointer content */
+    float mCustomControlsParams[MAX_CUSTOM_CONTROLS_PARAM_SIZE];
+
+};
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/3a/AiqResultStorage.cpp b/camera/hal/intel/ipu6/src/3a/AiqResultStorage.cpp
new file mode 100644
index 000000000000..5d98a639c3c4
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqResultStorage.cpp
@@ -0,0 +1,286 @@
+/*
+ * Copyright (C) 2016-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "AiqResultStorage"
+
+#include "AiqResultStorage.h"
+
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+
+std::map<int, AiqResultStorage*> AiqResultStorage::sInstances;
+Mutex AiqResultStorage::sLock;
+
+AiqResultStorage* AiqResultStorage::getInstance(int cameraId)
+{
+    AutoMutex lock(sLock);
+    return getInstanceLocked(cameraId);
+}
+
+void AiqResultStorage::releaseAiqResultStorage(int cameraId)
+{
+    AutoMutex lock(sLock);
+    AiqResultStorage* storage = getInstanceLocked(cameraId);
+    sInstances.erase(cameraId);
+    delete storage;
+}
+
+AiqResultStorage::AiqResultStorage(int cameraId) :
+    mCameraId(cameraId)
+{
+    LOG1("AiqResultStorage created for id:%d", mCameraId);
+
+    for (int i = 0; i < kStorageSize; i++) {
+        mAiqResults[i] = new AiqResult(mCameraId);
+        mAiqResults[i]->init();
+    }
+    // INTEL_DVS_S
+    for (int i = 0; i < kDvsStorageSize; i++) {
+        mDvsResults[i] = new DvsResult();
+    }
+    // INTEL_DVS_E
+    // LOCAL_TONEMAP_S
+    for (int i = 0; i < kLtmStorageSize; i++) {
+        mLtmResults[i] = new ltm_result_t;
+    }
+    // LOCAL_TONEMAP_E
+}
+
+AiqResultStorage::~AiqResultStorage()
+{
+    LOG1("AiqResultStorage released for id:%d", mCameraId);
+
+    for (int i = 0; i < kStorageSize; i++) {
+        delete mAiqResults[i];
+    }
+    // INTEL_DVS_S
+    for (int i = 0; i < kDvsStorageSize; i++) {
+        delete mDvsResults[i];
+    }
+    // INTEL_DVS_E
+    // LOCAL_TONEMAP_S
+    for (int i = 0; i < kLtmStorageSize; i++) {
+        delete mLtmResults[i];
+    }
+    // LOCAL_TONEMAP_E
+}
+
+// LOCAL_TONEMAP_S
+ltm_result_t* AiqResultStorage::acquireLtmResult()
+{
+    AutoWMutex rlock(mDataLock);
+
+    int index = mCurrentLtmIndex + 1;
+    index %= kLtmStorageSize;
+
+    mLtmResults[index]->sequence = -1;
+
+    return mLtmResults[index];
+}
+
+void AiqResultStorage::updateLtmResult(long sequence)
+{
+    AutoWMutex wlock(mDataLock);
+
+    mCurrentLtmIndex++;
+    mCurrentLtmIndex %= kLtmStorageSize;
+
+    mLtmResults[mCurrentLtmIndex]->sequence = sequence;
+}
+
+const ltm_result_t* AiqResultStorage::getLtmResult(long sequence)
+{
+    AutoRMutex rlock(mDataLock);
+
+    if (mCurrentLtmIndex == -1)
+        return nullptr;
+
+    // Sequence is -1 means to get the latest result
+    if (sequence == -1) {
+        return mLtmResults[mCurrentLtmIndex];
+    }
+
+    // Try to find the matched result
+    for (int i = 0; i < kLtmStorageSize; i++) {
+        int tmpIdx = (mCurrentLtmIndex + kLtmStorageSize - i) % kLtmStorageSize;
+        if (mLtmResults[tmpIdx]->sequence >= 0 && sequence >= mLtmResults[tmpIdx]->sequence) {
+            LOG2("%s, find the ltm result (expect: %ld actual: %ld)",
+                    __func__, sequence, mLtmResults[tmpIdx]->sequence);
+            return mLtmResults[tmpIdx];
+        }
+    }
+
+    return nullptr;
+}
+// LOCAL_TONEMAP_E
+
+// INTEL_DVS_S
+DvsResult* AiqResultStorage::acquireDvsResult()
+{
+    AutoWMutex rlock(mDataLock);
+
+    int index = mCurrentDvsIndex + 1;
+    index %= kDvsStorageSize;
+
+    mDvsResults[index]->mSequence = -1;
+
+    return mDvsResults[index];
+}
+
+void AiqResultStorage::updateDvsResult(long sequence)
+{
+    AutoWMutex wlock(mDataLock);
+
+    mCurrentDvsIndex++;
+    mCurrentDvsIndex %= kDvsStorageSize;
+
+    mDvsResults[mCurrentDvsIndex]->mSequence = sequence;
+}
+
+const DvsResult* AiqResultStorage::getDvsResult(long sequence)
+{
+    AutoRMutex rlock(mDataLock);
+
+    if (mCurrentDvsIndex == -1)
+        return nullptr;
+
+    CheckError(mDvsResults[mCurrentDvsIndex]->mSequence == -1, nullptr, "invalid sequence id -1");
+
+    if (sequence == -1)
+        return mDvsResults[mCurrentDvsIndex];
+
+    // Try to find the matched result
+    for (int i = 0; i < kDvsStorageSize; i++) {
+        int tmpIdx = (mCurrentDvsIndex + kDvsStorageSize - i) % kDvsStorageSize;
+        if (mDvsResults[tmpIdx]->mSequence >= 0 && sequence >= mDvsResults[tmpIdx]->mSequence) {
+            LOG2("%s, find the DVS result (expect: %ld actual: %ld)",
+                    __func__, sequence, mDvsResults[tmpIdx]->mSequence);
+            return mDvsResults[tmpIdx];
+        }
+    }
+
+    return nullptr;
+}
+// INTEL_DVS_E
+
+AiqStatistics* AiqResultStorage::acquireAiqStatistics()
+{
+    AutoWMutex rlock(mDataLock);
+
+    int index = (mCurrentAiqStatsIndex + 1) % kAiqStatsStorageSize;
+    if (mAiqStatistics[index].mInUse) {
+        // The "next" storage is still in use, skip it.
+        mCurrentAiqStatsIndex = index;
+        index = (mCurrentAiqStatsIndex + 1) % kAiqStatsStorageSize;
+    }
+
+    mAiqStatistics[index].mSequence = -1;
+
+    return &mAiqStatistics[index];
+}
+
+void AiqResultStorage::updateAiqStatistics(long sequence)
+{
+    AutoWMutex wlock(mDataLock);
+
+    mCurrentAiqStatsIndex++;
+    mCurrentAiqStatsIndex %= kAiqStatsStorageSize;
+
+    mAiqStatistics[mCurrentAiqStatsIndex].mSequence = sequence;
+}
+
+const AiqStatistics* AiqResultStorage::getAndLockAiqStatistics()
+{
+    AutoRMutex rlock(mDataLock);
+
+    if (mCurrentAiqStatsIndex == -1)
+        return nullptr;
+
+    CheckError(mAiqStatistics[mCurrentAiqStatsIndex].mSequence == -1,
+          nullptr, "Invalid sequence id -1 of stored aiq statistics");
+
+    mAiqStatistics[mCurrentAiqStatsIndex].mInUse = true;
+    return &mAiqStatistics[mCurrentAiqStatsIndex];
+}
+
+void AiqResultStorage::unLockAiqStatistics()
+{
+    AutoRMutex rlock(mDataLock);
+    for (int i = 0; i < kAiqStatsStorageSize; i++) {
+        mAiqStatistics[i].mInUse = false;
+    }
+}
+
+AiqResult* AiqResultStorage::acquireAiqResult()
+{
+    AutoWMutex rlock(mDataLock);
+
+    int index = mCurrentIndex + 1;
+    index %= kStorageSize;
+
+    mAiqResults[index]->mSequence = -1;
+
+    return mAiqResults[index];
+}
+
+void AiqResultStorage::updateAiqResult(long sequence)
+{
+    AutoWMutex wlock(mDataLock);
+
+    mCurrentIndex++;
+    mCurrentIndex %= kStorageSize;
+
+    mAiqResults[mCurrentIndex]->mSequence = sequence;
+}
+
+const AiqResult* AiqResultStorage::getAiqResult(long sequence)
+{
+    AutoRMutex rlock(mDataLock);
+
+    // Sequence id is -1 means user wants get the latest result.
+    if (sequence == -1) {
+        // If mCurrentIndex is -1, that means no result is saved to the storage yet,
+        // just return the first one in this case.
+        return mAiqResults[(mCurrentIndex == -1) ? 0 : mCurrentIndex];
+    }
+
+    for (int i = 0; i < kStorageSize; i++) {
+        // Search from the newest result
+        int tmpIdx = (mCurrentIndex + kStorageSize - i) % kStorageSize;
+        if (mAiqResults[tmpIdx]->mSequence >= 0 && sequence >= mAiqResults[tmpIdx]->mSequence) {
+            return mAiqResults[tmpIdx];
+        }
+    }
+
+    return nullptr;
+}
+
+/**
+ * Private function with no lock in it, must be called with lock protection
+ */
+AiqResultStorage* AiqResultStorage::getInstanceLocked(int cameraId)
+{
+    if (sInstances.find(cameraId) != sInstances.end()) {
+        return sInstances[cameraId];
+    }
+
+    sInstances[cameraId] = new AiqResultStorage(cameraId);
+    return sInstances[cameraId];
+}
+
+} //namespace icamera
+
diff --git a/camera/hal/intel/ipu6/src/3a/AiqResultStorage.h b/camera/hal/intel/ipu6/src/3a/AiqResultStorage.h
new file mode 100644
index 000000000000..432ecc1632aa
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqResultStorage.h
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2016-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <map>
+
+#include "AiqResult.h"
+
+// LOCAL_TONEMAP_S
+#include "Ltm.h"
+// LOCAL_TONEMAP_E
+// INTEL_DVS_S
+#include "Dvs.h"
+// INTEL_DVS_E
+#include "AiqStatistics.h"
+
+#include "iutils/Utils.h"
+#include "iutils/Thread.h"
+#include "iutils/RWLock.h"
+
+namespace icamera {
+
+/**
+ * \class AiqResultStorage
+ *
+ * This class provides interfaces for setting and getting AiqResult, and a storage space
+ * which is able to contain at most `kStorageSize` AiqResults at same time.
+ *
+ * It's a singleton based on camera id, and its life cycle can be maintained by
+ * its static methods getInstance and releaseAiqResultStorage.
+ */
+class AiqResultStorage {
+public:
+    /**
+     * \brief Get internal instance for cameraId.
+     *
+     * param[in] int camera id: only one instance for one particular camera id.
+     *
+     * return the instance of AiqResultStorage for cameraId
+     */
+    static AiqResultStorage* getInstance(int cameraId);
+
+    /**
+     * \brief Release the static instance of AiqResultStorage for cameraId.
+     */
+    static void releaseAiqResultStorage(int cameraId);
+
+    /**
+     * \brief Acquire Aiq result.
+     *
+     * The function will return one Aiq result pointer which is kept by Aiq algo.
+     * The sequence id is set to -1 which indicates the Aiq result is invalid.
+     *
+     * return Aiq result pointer to be kept by Aiq algo.
+     */
+    AiqResult* acquireAiqResult();
+
+    /**
+     * \brief Update mCurrentIndex and set sequence id into internal storage.
+     */
+    void updateAiqResult(long sequence);
+
+    /**
+     * \brief Get the pointer of aiq result to internal storage by given sequence id.
+     *
+     * The function will return the internal pointer of AiqResult, the caller MUST use this
+     * pointer quickly, let's say less than 10ms. For any time-consuming operations, it's
+     * the caller's responsibility to do a deep-copy, otherwise the data in returned AiqResult
+     * may not be consistent.
+     *
+     * param[in] long sequence: specify which aiq result is needed.
+     *
+     * return 1. when sequence id is -1 or not provided, the lastest result will be returned.
+     *        2. when sequence id is larger than -1, the result with gaven sequence id will be returned.
+     *        3. if cannot find in result storage, it means either sequence id is too old and its
+     *           result was overrided, or the sequence id is too new, and its result has not been
+     *           saved into storage yet. For both cases, nullptr will be returned.
+     */
+    const AiqResult* getAiqResult(long sequence = -1);
+
+    // LOCAL_TONEMAP_S
+    /**
+     * \brief Acquire Ltm result.
+     *
+     * The function will return one Ltm result pointer which is kept by LTM algo.
+     * The sequence id is set to -1 which indicates the Ltm result is invalid.
+     *
+     * return Ltm result pointer to be kept by LTM algo.
+     */
+    ltm_result_t* acquireLtmResult();
+
+    /**
+     * \brief Update mCurrentLtmIndex and set sequence id in internal storage.
+     */
+    void updateLtmResult(long sequence);
+
+    /**
+     * \brief Get the pointer of ltm_result_t.
+     *
+     * The function will return the latest Ltm result.
+     *
+     * return the latest Ltm result.
+     */
+    const ltm_result_t* getLtmResult(long sequence = -1);
+    // LOCAL_TONEMAP_E
+
+    // INTEL_DVS_S
+    /**
+     * \brief Acquire Dvs result.
+     *
+     * The function will return one Dvs result pointer which is kept by Dvs algo.
+     * The sequence id is set to -1 which indicates the Dvs result is invalid.
+     *
+     * return Dvs result pointer to be kept by Dvs algo.
+     */
+    DvsResult* acquireDvsResult();
+
+    /**
+     * \brief Update mCurrentDvsIndex and set sequence id in internal storage.
+     */
+    void updateDvsResult(long sequence);
+
+    /**
+     * \brief Get the pointer of DvsResult to internal storage.
+     *
+     * The function will return the latest DVS result.
+     *
+     * param[in] long sequence: specify which aiq result is needed.
+     *
+     * return the latest dvs result if sequence is -1, otherwise return the result of sequence.
+     */
+    const DvsResult* getDvsResult(long sequence = -1);
+    // INTEL_DVS_E
+
+    /**
+     * \brief Acquire AIQ statistics.
+     *
+     * The function will return one AIQ statistics pointer which is kept by AIQ statistics decoder.
+     * The sequence id is set to -1 which indicates the AIQ statistics is invalid.
+     *
+     * return AIQ statistics pointer to be kept by AIQ statistics decoder..
+     */
+    AiqStatistics* acquireAiqStatistics();
+
+    /**
+     * \brief Update mCurrentAiqStatsIndex and set sequence id in internal storage.
+     */
+    void updateAiqStatistics(long sequence);
+
+    /**
+     * \brief Get the pointer of AIQ statistics to internal storage.
+     *
+     * The function will return the latest AIQ statistics, and set the mInUse flag to true.
+     *
+     * return the latest AIQ statistics.
+     */
+    const AiqStatistics* getAndLockAiqStatistics();
+
+    /**
+     * \brief Clear the mInUse flag of all the AIQ statitics in internal storage.
+     */
+    void unLockAiqStatistics();
+
+    /**
+     * DVS statistics storage.
+     * A pair of {pointer to ia_dvs_statistics, sequence} is stored.
+     * The function updateDvsStatistics() is called by PipeExecutor, while getDvsStatistics()
+     * called by Dvs. They are called in the same thread on PSys statistics available.
+     */
+    /**
+     * \brief Update the dvs statistics in internal storage.
+     */
+    void updateDvsStatistics(const DvsStatistics &dvsStats) { mDvsStatistics = dvsStats; }
+    /**
+     * \brief Get the pointer of dvs statistics to internal storage.
+     */
+    DvsStatistics* getDvsStatistics() { return &mDvsStatistics; }
+
+    /**
+     * LTM statistics storage.
+     * A pair of {pointer to ia_isp_bxt_hdr_yv_grid_t, sequence} is stored.
+     * The function updateLtmStatistics() is called by PipeExecutor, while getLtmStatistics()
+     * called by Ltm. They are called in the same thread on PSys statistics available.
+     */
+    /**
+     * \brief Update the ltm statistics in internal storage.
+     */
+    void updateLtmStatistics(const LtmStatistics &ltmStats) { mLtmStatistics = ltmStats; }
+    /**
+     * \brief Get the pointer of ltm statistics to internal storage.
+     */
+    LtmStatistics* getLtmStatistics() { return &mLtmStatistics; }
+
+private:
+    AiqResultStorage(int cameraId);
+    ~AiqResultStorage();
+
+    static AiqResultStorage* getInstanceLocked(int cameraId);
+
+private:
+    static std::map<int, AiqResultStorage*> sInstances;
+    // Guard for singleton creation.
+    static Mutex sLock;
+
+    int mCameraId;
+    RWLock mDataLock;   // lock for all the data storage below
+
+    static const int kStorageSize = MAX_SETTING_COUNT; // Should > MAX_BUFFER_COUNT + sensorLag
+    int mCurrentIndex = -1;
+    AiqResult* mAiqResults[kStorageSize];
+
+    // LOCAL_TONEMAP_S
+    static const int kLtmStorageSize = MAX_SETTING_COUNT; // Should > MAX_BUFFER_COUNT + ltmLag
+    int mCurrentLtmIndex = -1;
+    ltm_result_t* mLtmResults[kLtmStorageSize];
+    // LOCAL_TONEMAP_E
+
+    // INTEL_DVS_S
+    static const int kDvsStorageSize = MAX_SETTING_COUNT;
+    int mCurrentDvsIndex = -1;
+    DvsResult* mDvsResults[kDvsStorageSize];
+    // INTEL_DVS_E
+
+    static const int kAiqStatsStorageSize = 3; // Always use the latest, but may hold for long time
+    int mCurrentAiqStatsIndex = -1;
+    AiqStatistics mAiqStatistics[kAiqStatsStorageSize];
+
+    DvsStatistics mDvsStatistics;
+    LtmStatistics mLtmStatistics;
+};
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/3a/AiqSetting.cpp b/camera/hal/intel/ipu6/src/3a/AiqSetting.cpp
new file mode 100644
index 000000000000..b9b2265ec9e4
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqSetting.cpp
@@ -0,0 +1,350 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "AiqSetting"
+
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+
+#include "AiqSetting.h"
+#include "PlatformData.h"
+#include "ParameterHelper.h"
+
+namespace icamera {
+
+AiqSetting::AiqSetting(int cameraId) :
+    mCameraId(cameraId),
+    mPipeSwitchFrameCount(0)
+{
+    LOG3A("@%s", __func__);
+}
+
+AiqSetting::~AiqSetting()
+{
+    LOG3A("@%s", __func__);
+}
+
+int AiqSetting::init(void)
+{
+    LOG3A("@%s", __func__);
+    AutoWMutex wlock(mParamLock);
+
+    mPipeSwitchFrameCount = 0;
+
+    mAiqParam.reset();
+
+    return OK;
+}
+
+int AiqSetting::deinit(void)
+{
+    LOG3A("@%s", __func__);
+    AutoWMutex wlock(mParamLock);
+
+    return OK;
+}
+
+int AiqSetting::configure(const stream_config_t *streamList)
+{
+    LOG3A("@%s", __func__);
+    AutoWMutex wlock(mParamLock);
+
+    camera_resolution_t resolution = {streamList->streams[0].width, streamList->streams[0].height};
+    for (int i = 0; i < streamList->num_streams; i++) {
+        if (streamList->streams[i].usage == CAMERA_STREAM_PREVIEW) {
+            resolution = {streamList->streams[i].width, streamList->streams[i].height};
+            break;
+        }
+    }
+
+    updateFrameUsage(streamList);
+
+    mAiqParam.tuningMode = TUNING_MODE_MAX;
+    mAiqParam.resolution = resolution;
+
+    mTuningModes.clear();
+    std::vector<ConfigMode> configModes;
+    PlatformData::getConfigModesByOperationMode(mCameraId, streamList->operation_mode, configModes);
+    for (auto cfg : configModes) {
+        TuningMode tuningMode;
+        if (PlatformData::getTuningModeByConfigMode(mCameraId, cfg, tuningMode) == OK) {
+            mTuningModes.push_back(tuningMode);
+        }
+    }
+    if (!mTuningModes.empty()) {
+        mAiqParam.tuningMode = mTuningModes[0];
+    }
+    LOG3A("%s, tuningMode %d, configMode %x", __func__, mAiqParam.tuningMode, configModes[0]);
+
+    return OK;
+}
+
+void AiqSetting::updateFrameUsage(const stream_config_t *streamList)
+{
+    bool preview = false, still = false, video = false;
+    for (int i = 0; i < streamList->num_streams; i++) {
+        if (streamList->streams[i].usage == CAMERA_STREAM_VIDEO_CAPTURE) {
+            video = true;
+        } else if (streamList->streams[i].usage == CAMERA_STREAM_STILL_CAPTURE) {
+            still = true;
+        } else if (streamList->streams[i].usage == CAMERA_STREAM_PREVIEW
+                   || streamList->streams[i].usage == CAMERA_STREAM_APP) {
+            preview = true;
+        }
+    }
+
+    mAiqParam.frameUsage = FRAME_USAGE_PREVIEW;
+    if (video) {
+        mAiqParam.frameUsage = FRAME_USAGE_VIDEO;
+    } else if (preview && still) {
+        mAiqParam.frameUsage = FRAME_USAGE_CONTINUOUS;
+    } else if (still) {
+        mAiqParam.frameUsage = FRAME_USAGE_STILL;
+    }
+}
+
+int AiqSetting::setParameters(const Parameters& params)
+{
+    LOG3A("@%s", __func__);
+    AutoWMutex wlock(mParamLock);
+
+    // Update AE related parameters
+    params.getAeMode(mAiqParam.aeMode);
+    params.getAeLock(mAiqParam.aeForceLock);
+    params.getExposureTime(mAiqParam.manualExpTimeUs);
+    params.getSensitivityGain(mAiqParam.manualGain);
+    params.getBlcAreaMode(mAiqParam.blcAreaMode);
+    params.getAeRegions(mAiqParam.aeRegions);
+    params.getAeConvergeSpeedMode(mAiqParam.aeConvergeSpeedMode);
+    params.getAeConvergeSpeed(mAiqParam.aeConvergeSpeed);
+    params.getRun3ACadence(mAiqParam.run3ACadence);
+
+    int ev = 0;
+    camera_range_t evRange = {-3, 3};
+    camera_rational_t evStep = {1, 1};
+    params.getAeCompensation(ev);
+    params.getAeCompensationRange(evRange);
+    params.getAeCompensationStep(evStep);
+
+    if (evStep.denominator == 0) {
+        mAiqParam.evShift = 0.0;
+    } else {
+        ev = CLIP(ev, evRange.max, evRange.min);
+        mAiqParam.evShift = (float)ev * evStep.numerator / evStep.denominator;
+    }
+
+    params.getFrameRate(mAiqParam.fps);
+    params.getAntiBandingMode(mAiqParam.antibandingMode);
+    // Update AWB related parameters
+    params.getAwbMode(mAiqParam.awbMode);
+    params.getAwbLock(mAiqParam.awbForceLock);
+    params.getAwbCctRange(mAiqParam.cctRange);
+    params.getAwbGains(mAiqParam.awbManualGain);
+    params.getAwbWhitePoint(mAiqParam.whitePoint);
+    params.getAwbGainShift(mAiqParam.awbGainShift);
+    params.getColorTransform(mAiqParam.manualColorMatrix);
+    params.getColorGains(mAiqParam.manualColorGains);
+    params.getAwbConvergeSpeedMode(mAiqParam.awbConvergeSpeedMode);
+    params.getAwbConvergeSpeed(mAiqParam.awbConvergeSpeed);
+
+    // Update AF related parameters
+    params.getAfMode(mAiqParam.afMode);
+    params.getAfRegions(mAiqParam.afRegions);
+    params.getAfTrigger(mAiqParam.afTrigger);
+
+    params.getWeightGridMode(mAiqParam.weightGridMode);
+    params.getSceneMode(mAiqParam.sceneMode);
+
+    params.getAeDistributionPriority(mAiqParam.aeDistributionPriority);
+
+    params.getWdrLevel(mAiqParam.ltmStrength);
+
+    unsigned int length = sizeof(mAiqParam.customAicParam.data);
+    if (params.getCustomAicParam(mAiqParam.customAicParam.data, &length) == OK) {
+        mAiqParam.customAicParam.length = length;
+    }
+
+    params.getYuvColorRangeMode(mAiqParam.yuvColorRangeMode);
+
+    params.getExposureTimeRange(mAiqParam.exposureTimeRange);
+    params.getSensitivityGainRange(mAiqParam.sensitivityGainRange);
+
+    params.getVideoStabilizationMode(mAiqParam.videoStabilizationMode);
+    params.getLdcMode(mAiqParam.ldcMode);
+    params.getRscMode(mAiqParam.rscMode);
+    params.getFlipMode(mAiqParam.flipMode);
+    params.getDigitalZoomRatio(mAiqParam.digitalZoomRatio);
+
+    int ret = params.getMakernoteMode(mAiqParam.makernoteMode);
+    if (ret == NAME_NOT_FOUND) mAiqParam.makernoteMode = MAKERNOTE_MODE_OFF;
+
+    CameraMetadata meta;
+    ParameterHelper::copyMetadata(params, &meta);
+
+    uint32_t tag = CAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE;
+    icamera_metadata_entry entry = meta.find(tag);
+    if (entry.count == 1) {
+        mAiqParam.minFocusDistance = entry.data.f[0];
+    }
+    params.getFocusDistance(mAiqParam.focusDistance);
+    params.getShadingMode(mAiqParam.shadingMode);
+    params.getLensShadingMapMode(mAiqParam.lensShadingMapMode);
+    params.getLensInfoShadingMapSize(mAiqParam.lensShadingMapSize);
+
+    params.getTonemapMode(mAiqParam.tonemapMode);
+    params.getTonemapPresetCurve(mAiqParam.tonemapPresetCurve);
+    params.getTonemapGamma(mAiqParam.tonemapGamma);
+
+    mAiqParam.dump();
+
+    return OK;
+}
+
+int AiqSetting::getAiqParameter(aiq_parameter_t &param)
+{
+    LOG3A("@%s", __func__);
+    AutoRMutex rlock(mParamLock);
+
+    param = mAiqParam;
+    return OK;
+}
+
+void aiq_parameter_t::reset()
+{
+    frameUsage = FRAME_USAGE_VIDEO;
+    aeMode = AE_MODE_AUTO;
+    aeForceLock = false;
+    awbMode = AWB_MODE_AUTO;
+    awbForceLock = false;
+    afMode = AF_MODE_AUTO;
+    afTrigger = AF_TRIGGER_IDLE;
+    sceneMode = SCENE_MODE_AUTO;
+    manualExpTimeUs = -1;
+    manualGain = -1;
+    evShift = 0;
+    fps = 0;
+    antibandingMode = ANTIBANDING_MODE_AUTO;
+    cctRange = { 0, 0 };
+    whitePoint = { 0, 0 };
+    awbManualGain = { 0, 0, 0 };
+    awbGainShift = { 0, 0, 0 };
+    CLEAR(manualColorMatrix);
+    CLEAR(manualColorGains);
+    aeRegions.clear();
+    blcAreaMode = BLC_AREA_MODE_OFF;
+    aeConvergeSpeedMode = CONVERGE_SPEED_MODE_AIQ;
+    awbConvergeSpeedMode = CONVERGE_SPEED_MODE_AIQ;
+    aeConvergeSpeed = CONVERGE_NORMAL;
+    awbConvergeSpeed = CONVERGE_NORMAL;
+    run3ACadence = 1;
+    ltmStrength = 0;
+    weightGridMode = WEIGHT_GRID_AUTO;
+    aeDistributionPriority = DISTRIBUTION_AUTO;
+    CLEAR(customAicParam);
+    yuvColorRangeMode = CAMERA_FULL_MODE_YUV_COLOR_RANGE;
+    exposureTimeRange.min = -1;
+    exposureTimeRange.max = -1;
+    sensitivityGainRange.min = -1;
+    sensitivityGainRange.max = -1;
+    videoStabilizationMode = VIDEO_STABILIZATION_MODE_OFF;
+    tuningMode = TUNING_MODE_MAX;
+    ldcMode = LDC_MODE_OFF;
+    rscMode = RSC_MODE_OFF;
+    flipMode = FLIP_MODE_NONE;
+    digitalZoomRatio = 1.0f;
+
+    lensPosition = 0;
+    lensMovementStartTimestamp = 0;
+    makernoteMode = MAKERNOTE_MODE_OFF;
+    minFocusDistance = 0.0f;
+    focusDistance = 0.0f;
+    shadingMode = SHADING_MODE_FAST;
+    lensShadingMapMode = LENS_SHADING_MAP_MODE_OFF;
+    lensShadingMapSize = {0, 0};
+    CLEAR(lensShadingMap);
+
+    tonemapMode = TONEMAP_MODE_FAST;
+    tonemapPresetCurve = TONEMAP_PRESET_CURVE_SRGB;
+    tonemapGamma = 0.0f;
+
+    CLEAR(resolution);
+}
+
+void aiq_parameter_t::dump()
+{
+    // Log only printed when 3a log enabled.
+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) return;
+
+    LOG3A("Application parameters:");
+    LOG3A("frame usage mode %d", frameUsage);
+    LOG3A("ae mode:%d, awb mode:%d, af mode:%d, scene mode:%d", aeMode, awbMode, afMode, sceneMode);
+    LOG3A("ae lock:%d, awb lock:%d, af trigger:%d", aeForceLock, awbForceLock, afTrigger);
+    LOG3A("EV:%f, manualExpTimeUs:%ld, manualGain:%f", evShift, manualExpTimeUs, manualGain);
+    LOG3A("FPS:%f", fps);
+    LOG3A("Antibanding mode:%d", antibandingMode);
+    LOG3A("cctRange:(%f-%f)", cctRange.min, cctRange.max);
+    LOG3A("manual white point:(%d,%d)", whitePoint.x, whitePoint.y);
+    LOG3A("manual awb gain:(%d,%d,%d)", awbManualGain.r_gain, awbManualGain.g_gain, awbManualGain.b_gain);
+    LOG3A("manual awb gain shift:(%d,%d,%d)", awbGainShift.r_gain, awbGainShift.g_gain, awbGainShift.b_gain);
+    for (int i = 0; i < 3; i++) {
+        LOG3A("manual color matrix:  [%.3f %.3f %.3f]",
+            manualColorMatrix.color_transform[i][0],
+            manualColorMatrix.color_transform[i][1],
+            manualColorMatrix.color_transform[i][2]);
+    }
+    LOG3A("manual color gains in rggb:(%.3f,%.3f,%.3f,%.3f)",
+        manualColorGains.color_gains_rggb[0], manualColorGains.color_gains_rggb[1],
+        manualColorGains.color_gains_rggb[2], manualColorGains.color_gains_rggb[3]);
+    LOG3A("ae region size:%zu, blc area mode:%d", aeRegions.size(), blcAreaMode);
+    for (auto &region : aeRegions) {
+        LOG3A("ae region (%d, %d, %d, %d, %d)",
+            region.left, region.top, region.right, region.bottom, region.weight);
+    }
+    LOG3A("af region size:%zu", aeRegions.size());
+    for (auto &region : afRegions) {
+        LOG3A("af region (%d, %d, %d, %d, %d)",
+            region.left, region.top, region.right, region.bottom, region.weight);
+    }
+    LOG3A("manual focus distance: %f, min focus distance: %f", focusDistance, minFocusDistance);
+
+    LOG3A("ae converge speed mode:(%d) awb converge speed mode:(%d)", aeConvergeSpeedMode, awbConvergeSpeedMode);
+    LOG3A("ae converge speed:(%d) awb converge speed:(%d)", aeConvergeSpeed, awbConvergeSpeed);
+    LOG3A("custom AIC parameter length:%d", customAicParam.length);
+    if (customAicParam.length > 0) {
+        LOG3A("custom AIC parameter data:%s", customAicParam.data);
+    }
+    if (tuningMode != TUNING_MODE_MAX) {
+        LOG3A("camera mode:%d", tuningMode);
+    }
+    LOG3A("ltm strength:(%d)", ltmStrength);
+    LOG3A("weight grid mode:%d", weightGridMode);
+    LOG3A("AE Distribution Priority:%d", aeDistributionPriority);
+    LOG3A("Yuv Color Range Mode:%d", yuvColorRangeMode);
+    LOG3A("AE exposure time range, min %f, max %f", exposureTimeRange.min, exposureTimeRange.max);
+    LOG3A("AE sensitivity gain range, min %.2f, max %.2f", sensitivityGainRange.min, sensitivityGainRange.max);
+    LOG3A("DVS mode %d", videoStabilizationMode);
+
+    LOG3A("Focus position %d, start timestamp %llu", lensPosition, lensMovementStartTimestamp);
+    LOG3A("makernoteMode %d", makernoteMode);
+    LOG3A("shadingMode %d", shadingMode);
+    LOG3A("lensShadingMapMode %d", lensShadingMapMode);
+    LOG3A("lensShadingMapSize x:%d, y:%d", lensShadingMapSize.x, lensShadingMapSize.y);
+
+    LOG3A("tonemap mode %d, preset curve %d, gamma %f",
+          tonemapMode, tonemapPresetCurve, tonemapGamma);
+}
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/3a/AiqSetting.h b/camera/hal/intel/ipu6/src/3a/AiqSetting.h
new file mode 100644
index 000000000000..52fc7e38f237
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqSetting.h
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "iutils/Utils.h"
+#include "iutils/RWLock.h"
+#include "Parameters.h"
+
+#include "AiqUtils.h"
+
+namespace icamera {
+
+// Imaging algorithms that are supported
+typedef enum {
+    IMAGING_ALGO_NONE = 0,
+    IMAGING_ALGO_AE   = 1,
+    IMAGING_ALGO_AWB  = 1 << 1,
+    IMAGING_ALGO_AF   = 1 << 2,
+    IMAGING_ALGO_GBCE = 1 << 3,
+    IMAGING_ALGO_PA   = 1 << 4,
+    IMAGING_ALGO_SA   = 1 << 5
+} imaging_algorithm_t;
+
+typedef struct {
+    char data[MAX_CUSTOM_CONTROLS_PARAM_SIZE];
+    unsigned int length;
+} custom_aic_param_t;
+
+typedef enum {
+    FRAME_USAGE_PREVIEW,
+    FRAME_USAGE_VIDEO,
+    FRAME_USAGE_STILL,
+    FRAME_USAGE_CONTINUOUS,
+} frame_usage_mode_t;
+
+/*
+ * aiq related parameters
+ */
+struct aiq_parameter_t {
+    frame_usage_mode_t frameUsage;
+    camera_ae_mode_t aeMode;
+    bool aeForceLock;
+    camera_awb_mode_t awbMode;
+    bool awbForceLock;
+    camera_af_mode_t afMode;
+    camera_af_trigger_t afTrigger;
+    camera_scene_mode_t sceneMode;
+    int64_t manualExpTimeUs;
+    float manualGain;
+    float evShift;
+    float fps;
+    camera_antibanding_mode_t antibandingMode;
+    camera_range_t cctRange;
+    camera_coordinate_t whitePoint;
+    camera_awb_gains_t awbManualGain;
+    camera_awb_gains_t awbGainShift;
+    camera_color_transform_t manualColorMatrix;
+    camera_color_gains_t manualColorGains;
+    camera_window_list_t aeRegions;
+    camera_window_list_t afRegions;
+    camera_blc_area_mode_t blcAreaMode;
+    camera_converge_speed_mode_t aeConvergeSpeedMode;
+    camera_converge_speed_mode_t awbConvergeSpeedMode;
+    camera_converge_speed_t aeConvergeSpeed;
+    camera_converge_speed_t awbConvergeSpeed;
+    int run3ACadence;
+    uint8_t ltmStrength;
+    camera_weight_grid_mode_t weightGridMode;
+    camera_ae_distribution_priority_t aeDistributionPriority;
+    custom_aic_param_t customAicParam;
+    camera_yuv_color_range_mode_t yuvColorRangeMode;
+    camera_range_t exposureTimeRange;
+    camera_range_t sensitivityGainRange;
+    camera_video_stabilization_mode_t videoStabilizationMode;
+    camera_resolution_t resolution;
+    camera_ldc_mode_t ldcMode;
+    camera_rsc_mode_t rscMode;
+    camera_flip_mode_t flipMode;
+    float digitalZoomRatio;
+
+    TuningMode tuningMode;
+
+    int lensPosition;
+    unsigned long long lensMovementStartTimestamp;
+    camera_makernote_mode_t makernoteMode;
+    float minFocusDistance;
+    float focusDistance;
+    camera_shading_mode_t shadingMode;
+    camera_lens_shading_map_mode_type_t lensShadingMapMode;
+    camera_coordinate_t lensShadingMapSize;
+    float lensShadingMap[MAX_LSC_GRID_SIZE * 4];
+
+    camera_tonemap_mode_t tonemapMode;
+    camera_tonemap_preset_curve_t tonemapPresetCurve;
+    float tonemapGamma;
+
+    aiq_parameter_t() { reset(); }
+    void reset();
+    void dump();
+};
+
+/*
+ * \class AiqSetting
+ * This class is used for setting parameters to other aiq class
+ * and return some useful status of aiq results
+ */
+class AiqSetting {
+
+public:
+    AiqSetting(int cameraId);
+    ~AiqSetting();
+
+    int init(void);
+    int deinit(void);
+    int configure(const stream_config_t *streamList);
+
+    int setParameters(const Parameters& params);
+
+    int getAiqParameter(aiq_parameter_t &param);
+
+private:
+    void updateFrameUsage(const stream_config_t *streamList);
+
+public:
+    int mCameraId;
+
+private:
+    std::vector<TuningMode> mTuningModes;
+    unsigned int mPipeSwitchFrameCount;
+    aiq_parameter_t mAiqParam;
+
+    RWLock mParamLock;
+};
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/3a/AiqStatistics.cpp b/camera/hal/intel/ipu6/src/3a/AiqStatistics.cpp
new file mode 100644
index 000000000000..a5e55db45ed0
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqStatistics.cpp
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "AiqStatistics"
+
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+
+#include "AiqStatistics.h"
+
+namespace icamera {
+
+AiqStatistics::AiqStatistics()
+{
+    CLEAR(mRgbsGridArray);
+    CLEAR(mAfGridArray);
+}
+
+AiqStatistics::~AiqStatistics()
+{
+    for (unsigned int i = 0; i < MAX_EXPOSURES_NUM; i++) {
+        delete [] mRgbsGridArray[i].blocks_ptr;
+        mRgbsGridArray[i].blocks_ptr = nullptr;
+
+        delete [] mAfGridArray[i].filter_response_1;
+        mAfGridArray[i].filter_response_1 = nullptr;
+        delete [] mAfGridArray[i].filter_response_2;
+        mAfGridArray[i].filter_response_2 = nullptr;
+    }
+}
+
+AiqStatistics &AiqStatistics::operator=(const AiqStatistics &other)
+{
+    mSequence = other.mSequence;
+    mTimestamp = other.mTimestamp;
+    mTuningMode = other.mTuningMode;
+
+    const ia_aiq_rgbs_grid *rgbs_grid[MAX_EXPOSURES_NUM];
+    for (int i = 0; i < other.mExposureNum; i++) {
+        rgbs_grid[i] = &other.mRgbsGridArray[i];
+    }
+    saveRgbsGridData(rgbs_grid, other.mExposureNum);
+
+    saveAfGridData(&other.mAfGridArray[0]);
+
+    return *this;
+}
+
+#define GRID_SIZE_UNEQUAL(g1, g2) \
+        ((g1)->grid_width != (g2)->grid_width || (g1)->grid_height != (g2)->grid_height)
+
+int AiqStatistics::saveRgbsGridData(const ia_aiq_rgbs_grid* const *rgbsGrids, int exposureNum)
+{
+    CheckError(rgbsGrids == nullptr, BAD_VALUE, "Rgbs grid is null");
+
+    for (int i = 0; i < exposureNum; i++) {
+        int ret = copyRgbsGridData(rgbsGrids[i], &mRgbsGridArray[i]);
+        CheckError(ret != OK, ret, "save Rgbs grid %d failed ret %d", i, ret);
+    }
+    mExposureNum = exposureNum;
+    return OK;
+}
+
+int AiqStatistics::copyRgbsGridData(const ia_aiq_rgbs_grid *src, ia_aiq_rgbs_grid *dst)
+{
+    LOG3A("%s", __func__);
+    CheckError(src == nullptr || dst == nullptr, BAD_VALUE, "src or dst rgbs grid is null");
+
+    // Release the old memory if size changes.
+    if (GRID_SIZE_UNEQUAL(src, dst)) {
+        if (dst->blocks_ptr) delete [] dst->blocks_ptr;
+        CLEAR(*dst);
+    }
+
+    if (src->blocks_ptr == nullptr || src->grid_width == 0 || src->grid_height == 0) {
+        return OK;
+    }
+
+    size_t gridSize = src->grid_width * src->grid_height;
+    if (dst->blocks_ptr == nullptr) {
+        dst->blocks_ptr = new rgbs_grid_block[gridSize];
+    }
+
+    dst->grid_width = src->grid_width;
+    dst->grid_height = src->grid_height;
+    MEMCPY_S(dst->blocks_ptr, gridSize * sizeof(rgbs_grid_block),
+             src->blocks_ptr, gridSize * sizeof(rgbs_grid_block));
+
+    dst->shading_correction = src->shading_correction;
+
+    LOG3A("%s, grid size=[%dx%d]", __func__, dst->grid_width, dst->grid_height);
+    return OK;
+}
+
+int AiqStatistics::saveAfGridData(const ia_aiq_af_grid *afGrid)
+{
+    LOG3A("%s", __func__);
+    CheckError(afGrid == nullptr, BAD_VALUE, "AF grid is null");
+
+    // Release the old memory if size changes.
+    if (GRID_SIZE_UNEQUAL(afGrid, &mAfGridArray[0])) {
+        if (mAfGridArray[0].filter_response_1) delete [] mAfGridArray[0].filter_response_1;
+        if (mAfGridArray[0].filter_response_2) delete [] mAfGridArray[0].filter_response_2;
+        CLEAR(mAfGridArray);
+    }
+
+    if (afGrid->filter_response_1 == nullptr || afGrid->filter_response_2 == nullptr
+        || afGrid->grid_width == 0 || afGrid->grid_height == 0) {
+        return OK;
+    }
+
+    size_t gridSize = afGrid->grid_width * afGrid->grid_height;
+    if (mAfGridArray[0].filter_response_1 == nullptr) {
+        mAfGridArray[0].filter_response_1 = new int[gridSize];
+    }
+    if (mAfGridArray[0].filter_response_2 == nullptr) {
+        mAfGridArray[0].filter_response_2 = new int[gridSize];
+    }
+
+    mAfGridArray[0].grid_width = afGrid->grid_width;
+    mAfGridArray[0].grid_height = afGrid->grid_height;
+    mAfGridArray[0].block_width = afGrid->block_width;
+    mAfGridArray[0].block_height = afGrid->block_height;
+    MEMCPY_S(mAfGridArray[0].filter_response_1, gridSize * sizeof(int),
+             afGrid->filter_response_1, gridSize * sizeof(int));
+    MEMCPY_S(mAfGridArray[0].filter_response_2, gridSize * sizeof(int),
+             afGrid->filter_response_2, gridSize * sizeof(int));
+
+    LOG3A("%s, grid size=[%dx%d]", __func__, mAfGridArray[0].grid_width, mAfGridArray[0].grid_height);
+    return OK;
+}
+
+} /* namespace icamera */
+
diff --git a/camera/hal/intel/ipu6/src/3a/AiqStatistics.h b/camera/hal/intel/ipu6/src/3a/AiqStatistics.h
new file mode 100644
index 000000000000..da4a2ec34ef3
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqStatistics.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "ia_aiq_types.h"
+#include "ia_isp_bxt_types.h"
+#include "ia_dvs_types.h"
+#include "ia_isp_bxt_statistics_types.h"
+
+#include "AiqUtils.h"
+
+namespace icamera {
+
+/*
+ * \class AiqStatistics
+ *
+ * This class is used to envelop AIQ statistics.
+ */
+class AiqStatistics {
+public:
+    AiqStatistics();
+    ~AiqStatistics();
+
+    AiqStatistics& operator=(const AiqStatistics& other);
+
+    int saveRgbsGridData(const ia_aiq_rgbs_grid* const *rgbsGrid, int exposureNum);
+    int saveAfGridData(const ia_aiq_af_grid *afGrid);
+
+private:
+    int copyRgbsGridData(const ia_aiq_rgbs_grid *src, ia_aiq_rgbs_grid *dst);
+
+public:
+    long mSequence = -1;
+    unsigned long long mTimestamp = 0;
+    TuningMode mTuningMode = TUNING_MODE_MAX;
+    bool mInUse = false;
+
+    int mExposureNum = 0;
+    ia_aiq_rgbs_grid mRgbsGridArray[MAX_EXPOSURES_NUM];
+    ia_aiq_af_grid mAfGridArray[MAX_EXPOSURES_NUM];
+};
+
+} /* namespace icamera */
+
diff --git a/camera/hal/intel/ipu6/src/3a/AiqUnit.cpp b/camera/hal/intel/ipu6/src/3a/AiqUnit.cpp
new file mode 100644
index 000000000000..d197d2e68029
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqUnit.cpp
@@ -0,0 +1,271 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "AiqUnit"
+
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+
+#include "AiqUnit.h"
+
+namespace icamera {
+
+AiqUnit::AiqUnit(int cameraId, SensorHwCtrl *sensorHw, LensHw *lensHw) :
+    mCameraId(cameraId),
+    mAiqUnitState(AIQ_UNIT_NOT_INIT),
+    // LOCAL_TONEMAP_S
+    mLtm(nullptr),
+    // LOCAL_TONEMAP_E
+    mFirstAiqRunning(true)
+{
+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
+
+    mAiqSetting = new AiqSetting(cameraId);
+
+    mAiqEngine = new AiqEngine(cameraId, sensorHw, lensHw, mAiqSetting);
+
+    // INTEL_DVS_S
+    mDvs = new Dvs(cameraId, mAiqSetting);
+    // INTEL_DVS_E
+    // LOCAL_TONEMAP_S
+    if (PlatformData::isLtmEnabled(mCameraId)) {
+        mLtm = new Ltm(cameraId);
+    }
+    // LOCAL_TONEMAP_E
+}
+
+AiqUnit::~AiqUnit()
+{
+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
+
+    if (mAiqUnitState == AIQ_UNIT_START) {
+        stop();
+    }
+
+    if (mAiqUnitState == AIQ_UNIT_INIT) {
+        deinit();
+    }
+
+    // LOCAL_TONEMAP_S
+    delete mLtm;
+    // LOCAL_TONEMAP_E
+    // INTEL_DVS_S
+    delete mDvs;
+    // INTEL_DVS_E
+    delete mAiqEngine;
+    delete mAiqSetting;
+}
+
+int AiqUnit::init()
+{
+    AutoMutex l(mAiqUnitLock);
+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
+
+    int ret = mAiqSetting->init();
+    if (ret != OK) {
+        mAiqSetting->deinit();
+        return ret;
+    }
+
+    if (mAiqUnitState == AIQ_UNIT_NOT_INIT) {
+        ret = mAiqEngine->init();
+        if (ret != OK) {
+            mAiqEngine->deinit();
+            return ret;
+        }
+
+        // INTEL_DVS_S
+        mDvs->init();
+        // INTEL_DVS_E
+        // LOCAL_TONEMAP_S
+        if (mLtm) {
+            mLtm->init();
+        }
+        // LOCAL_TONEMAP_E
+    }
+
+    mAiqUnitState = AIQ_UNIT_INIT;
+
+    return OK;
+}
+
+int AiqUnit::deinit()
+{
+    AutoMutex l(mAiqUnitLock);
+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
+
+    // LOCAL_TONEMAP_S
+    if (mLtm) {
+        mLtm->deinit();
+    }
+    // LOCAL_TONEMAP_E
+    // INTEL_DVS_S
+    mDvs->deinit();
+    // INTEL_DVS_E
+    mAiqEngine->deinit();
+
+    mAiqSetting->deinit();
+
+    mAiqUnitState = AIQ_UNIT_NOT_INIT;
+
+    return OK;
+}
+
+int AiqUnit::configure(const stream_config_t *streamList)
+{
+    CheckError(streamList == nullptr, BAD_VALUE, "streamList is nullptr");
+
+    AutoMutex l(mAiqUnitLock);
+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
+
+    if (mAiqUnitState != AIQ_UNIT_INIT && mAiqUnitState != AIQ_UNIT_STOP) {
+        LOGW("%s: configure in wrong state: %d", __func__, mAiqUnitState);
+        return BAD_VALUE;
+    }
+
+    std::vector<ConfigMode> configModes;
+    PlatformData::getConfigModesByOperationMode(mCameraId, streamList->operation_mode, configModes);
+
+    int ret = mAiqSetting->configure(streamList);
+    CheckError(ret != OK, ret, "configure AIQ settings error: %d", ret);
+
+    ret = mAiqEngine->configure(configModes);
+    CheckError(ret != OK, ret, "configure AIQ engine error: %d", ret);
+    // INTEL_DVS_S
+    ret = mDvs->configure(configModes);
+    CheckError(ret != OK, ret, "configure DVS engine error: %d", ret);
+    // INTEL_DVS_E
+    // LOCAL_TONEMAP_S
+    if (mLtm) {
+        ret = mLtm->configure(configModes);
+        CheckError(ret != OK, ret, "configure LTM engine error: %d", ret);
+    }
+    // LOCAL_TONEMAP_E
+
+    mAiqUnitState = AIQ_UNIT_CONFIGURED;
+    return OK;
+}
+
+int AiqUnit::start()
+{
+    AutoMutex l(mAiqUnitLock);
+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
+
+    if (mAiqUnitState != AIQ_UNIT_CONFIGURED && mAiqUnitState != AIQ_UNIT_STOP) {
+        LOGW("%s: configure in wrong state: %d", __func__, mAiqUnitState);
+        return BAD_VALUE;
+    }
+
+    // LOCAL_TONEMAP_S
+    if (mLtm) {
+        mLtm->start();
+    }
+    // LOCAL_TONEMAP_E
+    int ret = mAiqEngine->startEngine();
+    if (ret == OK) {
+        mAiqUnitState = AIQ_UNIT_START;
+    }
+
+    mFirstAiqRunning = true;
+
+    return OK;
+}
+
+int AiqUnit::stop()
+{
+    AutoMutex l(mAiqUnitLock);
+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
+
+    if (mAiqUnitState == AIQ_UNIT_START) {
+        mAiqEngine->stopEngine();
+        // LOCAL_TONEMAP_S
+        if (mLtm) {
+            mLtm->stop();
+        }
+        // LOCAL_TONEMAP_E
+    }
+
+    mAiqUnitState = AIQ_UNIT_STOP;
+
+    return OK;
+}
+
+int AiqUnit::run3A(long *settingSequence)
+{
+    AutoMutex l(mAiqUnitLock);
+
+    if (settingSequence)
+       *settingSequence = -1;
+
+    if (mAiqUnitState != AIQ_UNIT_START) {
+        LOGW("%s: AIQ is not started: %d", __func__, mAiqUnitState);
+        return BAD_VALUE;
+    }
+
+    int ret = mAiqEngine->run3A(settingSequence);
+    CheckError(ret != OK, ret, "run 3A failed.");
+
+    if (mFirstAiqRunning) {
+        // LOCAL_TONEMAP_S
+        if (mLtm) {
+            aiq_parameter_t aiqParam;
+            mAiqSetting->getAiqParameter(aiqParam);
+            // Run Ltm without stat after first AiqResults have been saved
+            mLtm->handleLtm(nullptr);
+        }
+        // LOCAL_TONEMAP_E
+        mFirstAiqRunning = false;
+    }
+
+    return OK;
+}
+
+std::vector<EventListener*> AiqUnit::getSofEventListener()
+{
+    AutoMutex l(mAiqUnitLock);
+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
+
+    std::vector<EventListener*> eventListenerList;
+    eventListenerList.push_back(mAiqEngine->getSofEventListener());
+    return eventListenerList;
+}
+
+std::vector<EventListener*> AiqUnit::getStatsEventListener()
+{
+    AutoMutex l(mAiqUnitLock);
+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
+
+    std::vector<EventListener*> eventListenerList;
+    // LOCAL_TONEMAP_S
+    if (mLtm) {
+        eventListenerList.push_back(mLtm);
+    }
+    // LOCAL_TONEMAP_E
+    // INTEL_DVS_S
+    eventListenerList.push_back(mDvs);
+    // INTEL_DVS_E
+    return eventListenerList;
+}
+
+int AiqUnit::setParameters(const Parameters &params)
+{
+    AutoMutex l(mAiqUnitLock);
+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
+
+    return mAiqSetting->setParameters(params);
+}
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/3a/AiqUnit.h b/camera/hal/intel/ipu6/src/3a/AiqUnit.h
new file mode 100644
index 000000000000..9aac6840480b
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqUnit.h
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "CameraEvent.h"
+
+#include "AiqSetting.h"
+#include "AiqEngine.h"
+// INTEL_DVS_S
+#include "Dvs.h"
+// INTEL_DVS_E
+// LOCAL_TONEMAP_S
+#include "Ltm.h"
+// LOCAL_TONEMAP_E
+
+namespace icamera {
+
+class SensorHwCtrl;
+class LensHw;
+
+/*
+ * \class AiqUnit
+ * This class is used for upper layer to control 3a engine.
+ */
+
+class AiqUnitBase{
+
+public:
+    AiqUnitBase() {}
+    virtual ~AiqUnitBase() {}
+
+    virtual int init() { return OK; }
+    virtual int deinit() { return OK; }
+    virtual int configure(const stream_config_t * /*streamList*/) { return OK; }
+    virtual int start() { return OK; }
+    virtual int stop() { return OK; }
+    virtual int run3A(long * /*settingSequence*/)  { return OK; }
+
+    virtual std::vector<EventListener*> getSofEventListener()
+    {
+        std::vector<EventListener*> eventListenerList;
+        return eventListenerList;
+    }
+    virtual std::vector<EventListener*> getStatsEventListener()
+    {
+        std::vector<EventListener*> eventListenerList;
+        return eventListenerList;
+    }
+
+    virtual int setParameters(const Parameters & /*params*/) { return OK; }
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(AiqUnitBase);
+
+};
+
+class AiqUnit : public AiqUnitBase {
+
+public:
+    AiqUnit(int cameraId, SensorHwCtrl *sensorHw, LensHw *lensHw);
+    ~AiqUnit();
+
+    /**
+     * \brief Init 3a related objects
+     */
+    int init();
+
+    /**
+     * \brief Deinit 3a related objects
+     */
+    int deinit();
+
+    /**
+     * \brief configure 3a engine with stream configuration
+     */
+    int configure(const stream_config_t *streamList);
+
+    /**
+     * \brief Start 3a Engine
+     */
+    int start();
+
+    /**
+     * \brief Stop 3a Engine
+     */
+    int stop();
+
+    /**
+     * \brief Run 3a to get new 3a settings.
+     * Return 0 if the operation succeeds, and output settingSequence to
+     * indicate the frame that settings are applied.
+     * settingSequence -1 means uncertain frame for this settings.
+     */
+    int run3A(long *settingSequence);
+
+    /**
+     * \brief Get software EventListener
+     */
+    std::vector<EventListener*> getSofEventListener();
+
+    /**
+     * \brief Get stats EventListener
+     */
+    std::vector<EventListener*> getStatsEventListener();
+
+    /**
+     * \brief Set 3A Parameters
+     *
+     * \param params: the Parameters update to 3A
+     */
+    int setParameters(const Parameters &params);
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(AiqUnit);
+
+private:
+    int mCameraId;
+    enum AiqUnitState {
+        AIQ_UNIT_NOT_INIT = 0,
+        AIQ_UNIT_INIT,
+        AIQ_UNIT_CONFIGURED,
+        AIQ_UNIT_START,
+        AIQ_UNIT_STOP,
+        AIQ_UNIT_MAX
+    } mAiqUnitState;
+
+    // INTEL_DVS_S
+    Dvs *mDvs;
+    // INTEL_DVS_E
+    // LOCAL_TONEMAP_S
+    Ltm *mLtm;
+    // LOCAL_TONEMAP_E
+    AiqEngine *mAiqEngine;
+    AiqSetting *mAiqSetting;
+
+    bool mFirstAiqRunning;
+
+    // Guard for AiqUnit public API.
+    Mutex mAiqUnitLock;
+};
+
+} /* namespace icamera */
+
diff --git a/camera/hal/intel/ipu6/src/3a/AiqUtils.cpp b/camera/hal/intel/ipu6/src/3a/AiqUtils.cpp
new file mode 100644
index 000000000000..83e52afa0d91
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqUtils.cpp
@@ -0,0 +1,506 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "AiqUtils"
+
+#include <math.h>
+
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+#include "AiqUtils.h"
+#include "AiqSetting.h"
+
+namespace icamera {
+
+#define TONEMAP_MIN_POINTS 64
+
+int AiqUtils::deepCopyAeResults(const ia_aiq_ae_results& src, ia_aiq_ae_results* dst)
+{
+    LOG3A("@%s", __func__);
+
+    /**
+     * lets check that all the pointers are there
+     * in the source and in the destination
+     */
+    CheckError(!dst||!dst->exposures||!dst->flashes||!dst->weight_grid||!dst->weight_grid->weights
+        ,BAD_VALUE ,"Failed to deep copy AE result- invalid destination");
+
+    CheckError(!src.exposures||!src.flashes||!src.weight_grid||!src.weight_grid->weights
+        ,BAD_VALUE ,"Failed to deep copy AE result- invalid source");
+
+    dst->lux_level_estimate = src.lux_level_estimate;
+    dst->flicker_reduction_mode = src.flicker_reduction_mode;
+    dst->multiframe = src.multiframe;
+    dst->num_flashes = src.num_flashes;
+    dst->num_exposures = src.num_exposures;
+    if (src.aperture_control) {
+        *dst->aperture_control = *src.aperture_control;
+    }
+    for (unsigned int i = 0; i < dst->num_exposures; i++)
+    {
+        dst->exposures[i].converged = src.exposures[i].converged;
+        dst->exposures[i].distance_from_convergence = src.exposures[i].distance_from_convergence;
+        dst->exposures[i].exposure_index = src.exposures[i].exposure_index;
+        if (src.exposures[i].exposure) {
+            *dst->exposures[i].exposure = *src.exposures[i].exposure;
+        }
+        if (src.exposures[i].sensor_exposure) {
+            *dst->exposures[i].sensor_exposure = *src.exposures[i].sensor_exposure;
+        }
+    }
+
+    // Copy weight grid
+    dst->weight_grid->width = src.weight_grid->width;
+    dst->weight_grid->height = src.weight_grid->height;
+
+    unsigned int gridElements  = src.weight_grid->width *
+                                 src.weight_grid->height;
+    gridElements = CLIP(gridElements, MAX_AE_GRID_SIZE, 1);
+    MEMCPY_S(dst->weight_grid->weights, gridElements*sizeof(char),
+             src.weight_grid->weights, gridElements*sizeof(char));
+
+    // Copy the flash info structure
+    MEMCPY_S(dst->flashes, NUM_FLASH_LEDS*sizeof(ia_aiq_flash_parameters),
+             src.flashes, NUM_FLASH_LEDS*sizeof(ia_aiq_flash_parameters));
+
+    return OK;
+}
+
+int AiqUtils::deepCopyAfResults(const ia_aiq_af_results& src, ia_aiq_af_results* dst)
+{
+    LOG3A("@%s", __func__);
+
+    CheckError(!dst, BAD_VALUE, "Failed to deep copy Af result- invalid destination or Source");
+
+    MEMCPY_S(dst, sizeof(ia_aiq_af_results), &src, sizeof(ia_aiq_af_results));
+    return OK;
+}
+
+int AiqUtils::deepCopyAwbResults(const ia_aiq_awb_results& src, ia_aiq_awb_results* dst)
+{
+    LOG3A("@%s", __func__);
+
+    CheckError(!dst, BAD_VALUE, "Failed to deep copy Awb result- invalid destination or Source");
+
+    MEMCPY_S(dst, sizeof(ia_aiq_awb_results), &src, sizeof(ia_aiq_awb_results));
+    return OK;
+}
+
+int AiqUtils::deepCopyGbceResults(const ia_aiq_gbce_results& src, ia_aiq_gbce_results* dst)
+{
+    LOG3A("%s", __func__);
+
+    CheckError(!dst||!dst->r_gamma_lut||!dst->g_gamma_lut||!dst->b_gamma_lut||!dst->tone_map_lut
+        ,BAD_VALUE ,"Failed to deep copy GBCE result- invalid destination");
+    CheckError(!src.r_gamma_lut||!src.g_gamma_lut||!src.b_gamma_lut
+        ,BAD_VALUE ,"Failed to deep copy GBCE result- invalid source");
+
+    MEMCPY_S(dst->r_gamma_lut, src.gamma_lut_size*sizeof(float),
+             src.r_gamma_lut, src.gamma_lut_size*sizeof(float));
+
+    MEMCPY_S(dst->g_gamma_lut, src.gamma_lut_size*sizeof(float),
+             src.g_gamma_lut, src.gamma_lut_size*sizeof(float));
+
+    MEMCPY_S(dst->b_gamma_lut, src.gamma_lut_size*sizeof(float),
+             src.b_gamma_lut, src.gamma_lut_size*sizeof(float));
+
+    dst->gamma_lut_size = src.gamma_lut_size;
+
+    // Copy tone mapping table
+    if (src.tone_map_lut != nullptr)
+    {
+        MEMCPY_S(dst->tone_map_lut, src.tone_map_lut_size * sizeof(float),
+                 src.tone_map_lut, src.tone_map_lut_size * sizeof(float));
+
+    }
+    dst->tone_map_lut_size = src.tone_map_lut_size; // zero indicates GBCE is ineffective.
+
+    return OK;
+}
+
+int AiqUtils::deepCopyPaResults(const ia_aiq_pa_results_v1& src, ia_aiq_pa_results_v1* dst,
+                                ia_aiq_advanced_ccm_t* preferredAcm)
+{
+    LOG3A("%s", __func__);
+
+    CheckError(!dst, BAD_VALUE ,"Failed to deep copy PA result- invalid destination");
+
+    MEMCPY_S(dst->color_conversion_matrix, sizeof(dst->color_conversion_matrix),
+             src.color_conversion_matrix, sizeof(src.color_conversion_matrix));
+    for (unsigned int i = 0; i < 4; i++)
+        for (unsigned int j = 0; j < 4; j++)
+            dst->black_level_4x4[i][j] = src.black_level_4x4[i][j];
+    dst->color_gains = src.color_gains;
+    dst->saturation_factor = src.saturation_factor;
+    dst->brightness_level = src.brightness_level;
+
+    if (src.ir_weight) {
+        unsigned long int irSize = src.ir_weight->width * src.ir_weight->height;
+        if (irSize) {
+            LOG3A("%s irSize = %ld", __func__, irSize);
+            MEMCPY_S(dst->ir_weight->ir_weight_grid_R, irSize * sizeof(unsigned short),
+                     src.ir_weight->ir_weight_grid_R, irSize * sizeof(unsigned short));
+            MEMCPY_S(dst->ir_weight->ir_weight_grid_G, irSize * sizeof(unsigned short),
+                     src.ir_weight->ir_weight_grid_G, irSize * sizeof(unsigned short));
+            MEMCPY_S(dst->ir_weight->ir_weight_grid_B, irSize * sizeof(unsigned short),
+                     src.ir_weight->ir_weight_grid_B, irSize * sizeof(unsigned short));
+            dst->ir_weight->width = src.ir_weight->width;
+            dst->ir_weight->height = src.ir_weight->height;
+        }
+    }
+
+    if (src.preferred_acm && src.preferred_acm->sector_count) {
+        dst->preferred_acm = preferredAcm;
+
+        LOG3A("%s advanced ccm sector count = %d", __func__, src.preferred_acm->sector_count);
+        MEMCPY_S(dst->preferred_acm->hue_of_sectors,
+                 src.preferred_acm->sector_count * sizeof(unsigned int),
+                 src.preferred_acm->hue_of_sectors,
+                 src.preferred_acm->sector_count * sizeof(unsigned int));
+        MEMCPY_S(dst->preferred_acm->advanced_color_conversion_matrices,
+                 src.preferred_acm->sector_count * sizeof(float[3][3]),
+                 src.preferred_acm->advanced_color_conversion_matrices,
+                 src.preferred_acm->sector_count  * sizeof(float[3][3]));
+        dst->preferred_acm->sector_count = src.preferred_acm->sector_count;
+    } else {
+        dst->preferred_acm = nullptr;
+    }
+
+    /* current linearization.size is zero, set related pointers to nullptr */
+    dst->linearization.r = nullptr;
+    dst->linearization.gr = nullptr;
+    dst->linearization.gb = nullptr;
+    dst->linearization.b = nullptr;
+    dst->linearization.size = 0;
+
+    return OK;
+}
+
+int AiqUtils::deepCopyLtmResults(const ia_ltm_results& src, ia_ltm_results* dst)
+{
+    LOG3A("%s", __func__);
+
+    CheckError(!dst, BAD_VALUE ,"Failed to deep copy LTM result- invalid destination");
+
+    MEMCPY_S(dst, sizeof(ia_ltm_results), &src, sizeof(ia_ltm_results));
+
+    return OK;
+}
+
+int AiqUtils::deepCopyLtmDRCParams(const ia_ltm_drc_params& src, ia_ltm_drc_params* dst)
+{
+    LOG3A("%s", __func__);
+
+    CheckError(!dst, BAD_VALUE ,"Failed to deep copy LTM DRC params- invalid destination");
+
+    MEMCPY_S(dst, sizeof(ia_ltm_drc_params), &src, sizeof(ia_ltm_drc_params));
+
+    return OK;
+}
+
+int AiqUtils::deepCopySaResults(const ia_aiq_sa_results_v1& src, ia_aiq_sa_results_v1* dst)
+{
+    LOG3A("%s", __func__);
+
+    CheckError(!dst, BAD_VALUE, "Failed to deep copy SA result- invalid destination");
+
+    const size_t gridSize = src.width * src.height;
+    if ((size_t)(dst->width * dst->height) < gridSize) {
+        LOG3A("%s: increases the size of LSC table from %dx%d to %dx%d.",
+              __func__, dst->width, dst->height, src.width, src.height);
+
+        // allocated buffer is too small to accomodate what SA returns.
+        for (int i = 0; i < MAX_BAYER_ORDER_NUM; ++i) {
+            for (int j = 0; j < MAX_BAYER_ORDER_NUM; ++j) {
+                // re-allocate
+                delete [] dst->lsc_grid[i][j];
+                dst->lsc_grid[i][j] = new unsigned short[gridSize];
+
+                // copy a table
+                if (src.lsc_grid[i][j]) {
+                    MEMCPY_S(dst->lsc_grid[i][j], gridSize * sizeof(unsigned short),
+                             src.lsc_grid[i][j], gridSize * sizeof(unsigned short));
+                }
+            }
+        }
+    } else {
+        // copy tables
+        for (int i = 0; i < MAX_BAYER_ORDER_NUM; i++) {
+            for (int j = 0; j < MAX_BAYER_ORDER_NUM; j++) {
+                if (dst->lsc_grid[i][j] && src.lsc_grid[i][j]) {
+                    MEMCPY_S(dst->lsc_grid[i][j], gridSize * sizeof(unsigned short),
+                             src.lsc_grid[i][j], gridSize * sizeof(unsigned short));
+                }
+            }
+        }
+    }
+
+    dst->width = src.width;
+    dst->height = src.height;
+    dst->lsc_update = src.lsc_update;
+    dst->fraction_bits = src.fraction_bits;
+    dst->color_order = src.color_order;
+
+    MEMCPY_S(dst->light_source, sizeof(dst->light_source), src.light_source, sizeof(src.light_source));
+    MEMCPY_S(&dst->frame_params, sizeof(dst->frame_params), &src.frame_params, sizeof(src.frame_params));
+
+    return OK;
+}
+
+int AiqUtils::deepCopyDvsResults(const ia_dvs_morph_table& src, ia_dvs_morph_table* dst)
+{
+    LOG3A("%s", __func__);
+
+    CheckError(!dst || !dst->xcoords_y || !dst->ycoords_y
+          || !dst->xcoords_uv || !dst->ycoords_uv
+          || !dst->xcoords_uv_float || !dst->ycoords_uv_float
+          ,BAD_VALUE ,"Failed to deep copy DVS result- invalid destination");
+
+    CheckError(!src.xcoords_y || !src.ycoords_y
+          || !src.xcoords_uv || !src.ycoords_uv
+          || !src.xcoords_uv_float || !src.ycoords_uv_float
+          ,BAD_VALUE ,"Failed to deep copy DVS result- invalid source");
+
+    CheckError(src.width_y == 0 || src.height_y == 0 || src.width_uv == 0 || src.height_uv == 0
+          ,BAD_VALUE ,"Failed to deep copy DVS result- invalid source size y[%dx%d] uv[%dx%d]",
+          src.width_y, src.height_y, src.width_uv, src.height_uv);
+
+    dst->width_y = src.width_y;
+    dst->height_y = src.height_y;
+    dst->width_uv = src.width_uv;
+    dst->height_uv = src.height_uv;
+    dst->morph_table_changed = src.morph_table_changed;
+    unsigned int SizeY = dst->width_y  * dst->height_y * sizeof(int32_t);
+    unsigned int SizeUV = dst->width_uv * dst->height_uv * sizeof(int32_t);
+    MEMCPY_S(dst->xcoords_y, SizeY, src.xcoords_y, SizeY);
+    MEMCPY_S(dst->ycoords_y, SizeY, src.ycoords_y, SizeY);
+    MEMCPY_S(dst->xcoords_uv, SizeUV, src.xcoords_uv, SizeUV);
+    MEMCPY_S(dst->ycoords_uv, SizeUV, src.ycoords_uv, SizeUV);
+
+    SizeUV = dst->width_uv * dst->height_uv * sizeof(float);
+    MEMCPY_S(dst->xcoords_uv_float, SizeUV, src.xcoords_uv_float, SizeUV);
+    MEMCPY_S(dst->ycoords_uv_float, SizeUV, src.ycoords_uv_float, SizeUV);
+
+    return OK;
+}
+
+int AiqUtils::deepCopyDvsResults(const ia_dvs_image_transformation& src, ia_dvs_image_transformation* dst)
+{
+    LOG3A("%s", __func__);
+
+    CheckError(!dst,BAD_VALUE ,"Failed to deep copy DVS result- invalid destination");
+
+    dst->num_homography_matrices = src.num_homography_matrices;
+    MEMCPY_S(dst->matrices, sizeof(dst->matrices), src.matrices, sizeof(src.matrices));
+
+    return OK;
+}
+
+int AiqUtils::convertError(ia_err iaErr)
+{
+    LOG3A("%s, iaErr = %d", __func__, iaErr);
+    switch (iaErr) {
+    case ia_err_none:
+        return OK;
+    case ia_err_general:
+        return UNKNOWN_ERROR;
+    case ia_err_nomemory:
+        return NO_MEMORY;
+    case ia_err_data:
+        return BAD_VALUE;
+    case ia_err_internal:
+        return INVALID_OPERATION;
+    case ia_err_argument:
+        return BAD_VALUE;
+    default:
+        return UNKNOWN_ERROR;
+    }
+}
+
+/**
+ * Convert SensorFrameParams defined in PlatformData to ia_aiq_frame_params in aiq
+ */
+void AiqUtils::convertToAiqFrameParam(const SensorFrameParams &sensor, ia_aiq_frame_params &aiq)
+{
+    aiq.cropped_image_height = sensor.cropped_image_height;
+    aiq.cropped_image_width = sensor.cropped_image_width;
+    aiq.horizontal_crop_offset = sensor.horizontal_crop_offset;
+    aiq.horizontal_scaling_denominator = sensor.horizontal_scaling_denominator;
+    aiq.horizontal_scaling_numerator = sensor.horizontal_scaling_numerator;
+    aiq.vertical_crop_offset = sensor.vertical_crop_offset;
+    aiq.vertical_scaling_denominator = sensor.vertical_scaling_denominator;
+    aiq.vertical_scaling_numerator = sensor.vertical_scaling_numerator;
+}
+
+camera_coordinate_t AiqUtils::convertCoordinateSystem(const camera_coordinate_system_t& srcSystem,
+                                                      const camera_coordinate_system_t& dstSystem,
+                                                      const camera_coordinate_t& srcCoordinate)
+{
+    int dstWidth = dstSystem.right - dstSystem.left;
+    int dstHeight = dstSystem.bottom - dstSystem.top;
+    int srcWidth = srcSystem.right - srcSystem.left;
+    int srcHeight = srcSystem.bottom - srcSystem.top;
+
+    camera_coordinate_t result;
+    result.x = (srcCoordinate.x - srcSystem.left) * dstWidth / srcWidth + dstSystem.left;
+    result.y = (srcCoordinate.y - srcSystem.top) * dstHeight / srcHeight + dstSystem.top;
+
+    return result;
+}
+
+camera_coordinate_t AiqUtils::convertToIaCoordinate(const camera_coordinate_system_t& srcSystem,
+                                                    const camera_coordinate_t& srcCoordinate)
+{
+    camera_coordinate_system_t iaCoordinate = {IA_COORDINATE_LEFT, IA_COORDINATE_TOP,
+                                               IA_COORDINATE_RIGHT, IA_COORDINATE_BOTTOM};
+
+    return convertCoordinateSystem(srcSystem, iaCoordinate, srcCoordinate);
+}
+
+camera_window_t AiqUtils::convertToIaWindow(const camera_coordinate_system_t& srcSystem,
+                                            const camera_window_t& srcWindow)
+{
+    camera_coordinate_t leftTop;
+    camera_coordinate_t rightBottom;
+    leftTop.x     = srcWindow.left;
+    leftTop.y     = srcWindow.top;
+    rightBottom.x = srcWindow.right;
+    rightBottom.y = srcWindow.bottom;
+    leftTop       = convertToIaCoordinate(srcSystem, leftTop);
+    rightBottom   = convertToIaCoordinate(srcSystem, rightBottom);
+
+    camera_window_t result;
+    result.left   = leftTop.x;
+    result.top    = leftTop.y;
+    result.right  = rightBottom.x;
+    result.bottom = rightBottom.y;
+    result.weight = srcWindow.weight;
+    return result;
+}
+
+/**
+ * Map user input manual gain(0, 255) to (AWB_GAIN_NORMALIZED_START, AWB_GAIN_NORMALIZED_END)
+ */
+float AiqUtils::normalizeAwbGain(int gain)
+{
+    gain = CLIP(gain, AWB_GAIN_MAX, AWB_GAIN_MIN);
+    return AWB_GAIN_NORMALIZED_START + (float)(gain - AWB_GAIN_MIN) * \
+                                       AWB_GAIN_RANGE_NORMALIZED / AWB_GAIN_RANGE_USER;
+}
+
+int AiqUtils::convertToUserAwbGain(float normalizedGain)
+{
+    normalizedGain = CLIP(normalizedGain, AWB_GAIN_NORMALIZED_START, AWB_GAIN_NORMALIZED_END);
+    return AWB_GAIN_MIN + (normalizedGain - AWB_GAIN_NORMALIZED_START) * \
+                          AWB_GAIN_RANGE_USER / AWB_GAIN_RANGE_NORMALIZED;
+}
+
+float AiqUtils::convertSpeedModeToTime(camera_converge_speed_t mode)
+{
+    float convergenceTime = -1;
+    /*
+     * The unit of manual_convergence_time is second, and 3.0 means 3 seconds.
+     * The default value can be changed based on customer requirement.
+     */
+    switch (mode) {
+        case CONVERGE_MID:
+            convergenceTime = 3.0;
+            break;
+        case CONVERGE_LOW:
+            convergenceTime = 5.0;
+            break;
+        case CONVERGE_NORMAL:
+        default:
+            convergenceTime = -1;
+            break;
+    }
+    return convergenceTime;
+}
+
+/*
+ * Get ia_aiq_frame_use
+ *
+ * Convert frame usage to ia_aiq_frame_use
+ */
+ia_aiq_frame_use AiqUtils::convertFrameUsageToIaFrameUsage(int frameUsage)
+{
+    switch (frameUsage) {
+        case FRAME_USAGE_VIDEO:
+            return ia_aiq_frame_use_video;
+        case FRAME_USAGE_STILL:
+            return ia_aiq_frame_use_still;
+        case FRAME_USAGE_CONTINUOUS:
+            return ia_aiq_frame_use_continuous;
+    }
+    return ia_aiq_frame_use_preview;
+}
+
+void AiqUtils::applyTonemapGamma(float gamma, ia_aiq_gbce_results* results) {
+    CheckError(gamma < EPSILON, VOID_VALUE, "Bad gamma %f", gamma);
+    CheckError(!results, VOID_VALUE, "gbce results nullptr");
+
+    int lutSize = results->gamma_lut_size;
+    CheckError(lutSize < TONEMAP_MIN_POINTS, VOID_VALUE, "Bad gamma lut size (%d) in gbce results", lutSize);
+    for (int i = 0; i < lutSize; i++) {
+        results->g_gamma_lut[i] = pow(i / static_cast<float>(lutSize), 1 / gamma);
+    }
+
+    MEMCPY_S(results->b_gamma_lut, lutSize * sizeof(float),
+             results->g_gamma_lut, lutSize * sizeof(float));
+    MEMCPY_S(results->r_gamma_lut, lutSize * sizeof(float),
+             results->g_gamma_lut, lutSize * sizeof(float));
+}
+
+void AiqUtils::applyTonemapSRGB(ia_aiq_gbce_results* results) {
+    CheckError(!results, VOID_VALUE, "gbce results nullptr");
+
+    int lutSize = results->gamma_lut_size;
+    CheckError(lutSize < TONEMAP_MIN_POINTS, VOID_VALUE, "Bad gamma lut size (%d) in gbce results", lutSize);
+    for (int i = 0; i < lutSize; i++) {
+        if (i / (lutSize - 1)  < 0.0031308)
+            results->g_gamma_lut[i] = 12.92 * (i / (lutSize - 1));
+        else
+            results->g_gamma_lut[i] =
+                    1.055 * pow(i / static_cast<float>(lutSize - 1), 1 / 2.4) - 0.055;
+    }
+
+    MEMCPY_S(results->b_gamma_lut, lutSize * sizeof(float),
+             results->g_gamma_lut, lutSize * sizeof(float));
+    MEMCPY_S(results->r_gamma_lut, lutSize * sizeof(float),
+             results->g_gamma_lut, lutSize * sizeof(float));
+}
+
+void AiqUtils::applyTonemapREC709(ia_aiq_gbce_results* results) {
+    CheckError(!results, VOID_VALUE, "gbce results nullptr");
+
+    int lutSize = results->gamma_lut_size;
+    CheckError(lutSize < TONEMAP_MIN_POINTS, VOID_VALUE, "Bad gamma lut size (%d) in gbce results", lutSize);
+    for (int i = 0; i < lutSize; i++) {
+        if (i / (lutSize - 1) < 0.018)
+            results->g_gamma_lut[i] = 4.5 * (i / (lutSize - 1));
+        else
+            results->g_gamma_lut[i] =
+                    1.099 * pow(i / static_cast<float>(lutSize - 1), 0.45) - 0.099;
+    }
+
+    MEMCPY_S(results->b_gamma_lut, lutSize * sizeof(float),
+             results->g_gamma_lut, lutSize * sizeof(float));
+    MEMCPY_S(results->r_gamma_lut, lutSize * sizeof(float),
+             results->g_gamma_lut, lutSize * sizeof(float));
+}
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/3a/AiqUtils.h b/camera/hal/intel/ipu6/src/3a/AiqUtils.h
new file mode 100644
index 000000000000..cf446fa99876
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqUtils.h
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2015-2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "PlatformData.h"
+#include "Parameters.h"
+#include "ia_aiq.h"
+#include "ia_ltm_types.h"
+#include "ia_dvs_types.h"
+#include "ia_isp_bxt_statistics_types.h"
+
+namespace icamera {
+
+/*!> Top limit for the RGBS grid size */
+static const unsigned int MAX_AE_GRID_SIZE = 2048;
+/*!> Number of leds AEC algorithm provides output for */
+static const unsigned int MAX_EXPOSURES_NUM = 3;
+static const unsigned int NUM_FLASH_LEDS = 1;
+static const unsigned int MAX_GAMMA_LUT_SIZE = 2048;
+static const unsigned int MAX_TONEMAP_LUT_SIZE = 2048;
+
+static const unsigned int MAX_STATISTICS_WIDTH = BXT_RGBS_GRID_MAX_WIDTH;
+static const unsigned int MAX_STATISTICS_HEIGHT = BXT_RGBS_GRID_MAX_HEIGHT;
+
+static const unsigned int MAX_LSC_WIDTH = 100;
+static const unsigned int MAX_LSC_HEIGHT = 100;
+
+static const unsigned int MAX_IR_WEIGHT_GRID_SIZE = 480;
+static const unsigned int MAX_NUM_SECTORS = 36;
+
+static const int MAX_BAYER_ORDER_NUM = 4;
+
+/*! \brief Definitions of IA imaging coordinate system. */
+static const unsigned int IA_COORDINATE_TOP = 0;
+static const unsigned int IA_COORDINATE_LEFT = 0;
+static const unsigned int IA_COORDINATE_BOTTOM = 8192;
+static const unsigned int IA_COORDINATE_RIGHT = 8192;
+static const unsigned int IA_COORDINATE_WIDTH = (IA_COORDINATE_RIGHT - IA_COORDINATE_LEFT);
+static const unsigned int IA_COORDINATE_HEIGHT = (IA_COORDINATE_BOTTOM - IA_COORDINATE_TOP);
+
+/**
+ *  The normalized awb gain range is (4.0, 1.0) which is just experimental.
+ *  TODO: Maybe need put them in configuration file later.
+ */
+static const int AWB_GAIN_NORMALIZED_START = 4.0;
+static const int AWB_GAIN_NORMALIZED_END = 1.0;
+static const int AWB_GAIN_RANGE_NORMALIZED = AWB_GAIN_NORMALIZED_END - AWB_GAIN_NORMALIZED_START;
+
+static const float AWB_GAIN_MIN = 0;
+static const float AWB_GAIN_MAX = 255;
+static const float AWB_GAIN_RANGE_USER = AWB_GAIN_MAX - AWB_GAIN_MIN;
+
+static const int MAX_CUSTOM_CONTROLS_PARAM_SIZE = 1024;
+
+namespace AiqUtils {
+
+int deepCopyAeResults(const ia_aiq_ae_results& src, ia_aiq_ae_results* dst);
+int deepCopyAfResults(const ia_aiq_af_results& src, ia_aiq_af_results* dst);
+int deepCopyAwbResults(const ia_aiq_awb_results& src, ia_aiq_awb_results* dst);
+int deepCopyGbceResults(const ia_aiq_gbce_results& src, ia_aiq_gbce_results* dst);
+int deepCopyPaResults(const ia_aiq_pa_results_v1& src, ia_aiq_pa_results_v1* dst,
+                      ia_aiq_advanced_ccm_t* preferredAcm);
+int deepCopySaResults(const ia_aiq_sa_results_v1& src, ia_aiq_sa_results_v1* dst);
+int deepCopyLtmResults(const ia_ltm_results& src, ia_ltm_results* dst);
+int deepCopyLtmDRCParams(const ia_ltm_drc_params& src, ia_ltm_drc_params* dst);
+int deepCopyDvsResults(const ia_dvs_morph_table& src, ia_dvs_morph_table* dst);
+int deepCopyDvsResults(const ia_dvs_image_transformation& src, ia_dvs_image_transformation* dst);
+
+int convertError(ia_err iaErr);
+
+void convertToAiqFrameParam(const SensorFrameParams& sensor, ia_aiq_frame_params& aiq);
+
+camera_coordinate_t convertCoordinateSystem(const camera_coordinate_system_t& srcSystem,
+                                            const camera_coordinate_system_t& dstSystem,
+                                            const camera_coordinate_t& srcCoordinate);
+camera_coordinate_t convertToIaCoordinate(const camera_coordinate_system_t& srcSystem,
+                                          const camera_coordinate_t& srcCoordinate);
+camera_window_t convertToIaWindow(const camera_coordinate_system_t& srcSystem,
+                                  const camera_window_t& srcWindow);
+float normalizeAwbGain(int gain);
+int convertToUserAwbGain(float normalizedGain);
+float convertSpeedModeToTime(camera_converge_speed_t mode);
+
+ia_aiq_frame_use convertFrameUsageToIaFrameUsage(int frameUsage);
+
+void applyTonemapGamma(float gamma, ia_aiq_gbce_results* results);
+void applyTonemapSRGB(ia_aiq_gbce_results* results);
+void applyTonemapREC709(ia_aiq_gbce_results* results);
+
+// Resize a 2D array with linear interpolation
+// For some cases, we need to upscale or downscale a 2D array.
+// For example, Android requests lensShadingMapSize must be smaller than 64*64,
+// but for some sensors, the lens shading map is bigger than this, so need to do resize.
+/* Value of 8 is maximum in order to avoid overflow with 16-bit inputs */
+#define FRAC_BITS_CURR_LOC 8
+#define FRAC_BASE (short)(1) << FRAC_BITS_CURR_LOC
+
+/*!
+ * \brief Resize a 2D array with linear interpolation.
+ *
+ * @param[in,out]
+ *  in a_src                pointer to input array (width-major)
+ *  in a_src_w              width of the input array
+ *  in a_src_h              height of the input array
+ *  in a_dst                pointer to output array (width-major)
+ *  in a_dst_w              width of the output array
+ *  in a_dst_h              height of the output array
+ */
+template <typename T> int resize2dArray(
+    const T* a_src, int a_src_w, int a_src_h,
+    T* a_dst, int a_dst_w, int a_dst_h) {
+    int i, j, step_size_w, step_size_h, rounding_term;
+
+    if (a_src_w < 2 || a_dst_w < 2 || a_src_h < 2 || a_dst_h < 2) {
+        return  -1;
+    }
+    nsecs_t startTime = CameraUtils::systemTime();
+    step_size_w = ((a_src_w - 1) << FRAC_BITS_CURR_LOC) / (a_dst_w - 1);
+    step_size_h = ((a_src_h - 1) << FRAC_BITS_CURR_LOC) / (a_dst_h - 1);
+    rounding_term = (1 << (2 * FRAC_BITS_CURR_LOC - 1));
+    for (j = 0; j < a_dst_h; ++j) {
+        unsigned int curr_loc_h, curr_loc_lower_h;
+        curr_loc_h = j * step_size_h;
+        curr_loc_lower_h = (curr_loc_h > 0) ? (curr_loc_h - 1) >> FRAC_BITS_CURR_LOC : 0;
+
+        for (i = 0; i < a_dst_w; ++i) {
+            unsigned int curr_loc_w, curr_loc_lower_w;
+
+            curr_loc_w = i * step_size_w;
+            curr_loc_lower_w = (curr_loc_w > 0) ? (curr_loc_w - 1) >> FRAC_BITS_CURR_LOC : 0;
+
+            a_dst[a_dst_w * j + i] =
+                (a_src[curr_loc_lower_w + curr_loc_lower_h * a_src_w]  *
+                        (((curr_loc_lower_w + 1) << FRAC_BITS_CURR_LOC) - curr_loc_w) *
+                        (((curr_loc_lower_h + 1) << FRAC_BITS_CURR_LOC) - curr_loc_h) +
+                a_src[curr_loc_lower_w + 1 + curr_loc_lower_h * a_src_w] *
+                        (curr_loc_w-((curr_loc_lower_w) << FRAC_BITS_CURR_LOC))   *
+                        (((curr_loc_lower_h + 1) << FRAC_BITS_CURR_LOC) - curr_loc_h) +
+                a_src[curr_loc_lower_w + (curr_loc_lower_h + 1) * a_src_w]  *
+                        (((curr_loc_lower_w + 1) << FRAC_BITS_CURR_LOC) - curr_loc_w) *
+                        (curr_loc_h - ((curr_loc_lower_h) << FRAC_BITS_CURR_LOC)) +
+                a_src[curr_loc_lower_w + 1 + (curr_loc_lower_h + 1) * a_src_w] *
+                        (curr_loc_w - ((curr_loc_lower_w) << FRAC_BITS_CURR_LOC))   *
+                        (curr_loc_h - ((curr_loc_lower_h) << FRAC_BITS_CURR_LOC))
+                + rounding_term) / (FRAC_BASE * FRAC_BASE);
+        }
+    }
+    LOG2("resize the 2D array cost %dus",
+         (unsigned)((CameraUtils::systemTime() - startTime) / 1000));
+
+    return 0;
+}
+
+template int resize2dArray<float>(
+    const float* a_src, int a_src_w, int a_src_h,
+    float* a_dst, int a_dst_w, int a_dst_h);
+template int resize2dArray<unsigned short>(
+    const unsigned short* a_src, int a_src_w, int a_src_h,
+    unsigned short* a_dst, int a_dst_w, int a_dst_h);
+template int resize2dArray<int>(
+    const int* a_src, int a_src_w, int a_src_h,
+    int* a_dst, int a_dst_w, int a_dst_h);
+} // namespace AiqUtils
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/3a/Dvs.cpp b/camera/hal/intel/ipu6/src/3a/Dvs.cpp
new file mode 100644
index 000000000000..87afe9e0975b
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/Dvs.cpp
@@ -0,0 +1,608 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "Dvs"
+#include "src/3a/Dvs.h"
+
+#include <ia_cmc_parser.h>
+#include <ia_pal_types_isp_ids_autogen.h>
+
+#include "iutils/CameraLog.h"
+#include "iutils/CameraDump.h"
+#include "iutils/Utils.h"
+#include "PlatformData.h"
+#include "AiqUtils.h"
+#include "AiqResultStorage.h"
+#include "IGraphConfigManager.h"
+#include "IGraphConfig.h"
+
+namespace icamera {
+
+const float MAX_DVS2_YUVDS_RATIO = 1.3f;
+const int DVS_OXDIM_Y = 128;
+const int DVS_OYDIM_Y = 32;
+const int DVS_OXDIM_UV  = 64;
+const int DVS_OYDIM_UV  = 16;
+
+const int ENVELOPE_BQ_WIDTH = 192;
+const int ENVELOPE_BQ_HEIGHT = 96;
+
+Dvs::Dvs(int cameraId, AiqSetting *setting) :
+    mDvsHandle(nullptr),
+    mDvsEnabled(false),
+    mLdcEnabled(false),
+    mRscEnabled(false),
+    mDigitalZoomRatio(1.0f),
+    mCameraId(cameraId),
+    mFps(30),
+    mConfigMode(CAMERA_STREAM_CONFIGURATION_MODE_NORMAL),
+    mTuningMode(TUNING_MODE_VIDEO),
+    mAiqSetting(setting),
+    mKernelId(0),
+    mMorphTable(nullptr),
+    mStatistics(nullptr),
+    mConfigured(false) {
+    LOG1("@%s", __func__);
+
+    CLEAR(mSrcResolution);
+    CLEAR(mDstResolution);
+    CLEAR(mImage_transformation);
+
+    mIntelDvs = new IntelDvs();
+}
+
+Dvs::~Dvs() {
+    LOG1("@%s", __func__);
+    delete mIntelDvs;
+}
+
+int Dvs::initDvsHandle(TuningMode tuningMode) {
+    int status = OK;
+
+    CpfStore* cpf = PlatformData::getCpfStore(mCameraId);
+    CheckError((cpf == nullptr), NO_INIT, "@%s, No CPF for cameraId:%d", __func__, mCameraId);
+
+    ia_binary_data aiqData;
+    uintptr_t cmcHandle = reinterpret_cast<uintptr_t>(nullptr);
+    int ret = cpf->getDataAndCmc(nullptr, &aiqData, nullptr, &cmcHandle, tuningMode);
+    CheckError(ret != OK, BAD_VALUE, "@%s, Get cpf data failed", __func__);
+
+    ia_err err = mIntelDvs->init(aiqData, reinterpret_cast<ia_cmc_t*>(cmcHandle), &mDvsHandle);
+    CheckError(err != ia_err_none, NO_INIT, "@%s, Failed to initilize IntelDvs", __func__);
+
+    return status;
+}
+
+int Dvs::deinitDvsHandle() {
+    int status = deInitDVSTable();
+    if (mDvsHandle) {
+        mIntelDvs->deinit(mDvsHandle);
+        mDvsHandle = nullptr;
+    }
+
+    return status;
+}
+
+int Dvs::init() {
+    LOG1("@%s", __func__);
+
+    return OK;
+}
+
+int Dvs::deinit() {
+    LOG1("@%s", __func__);
+    AutoMutex l(mLock);
+
+    return deinitDvsHandle();
+}
+
+int Dvs::configure(const std::vector<ConfigMode>& configModes) {
+    LOG1("@%s, isDvsSupported:%d", __func__, PlatformData::isDvsSupported(mCameraId));
+    AutoMutex l(mLock);
+    mConfigured = false;
+    if (!PlatformData::isDvsSupported(mCameraId)) return OK;
+
+    if (configModes.empty()) {
+        return UNKNOWN_ERROR;
+    }
+    mConfigMode = configModes[0];
+
+    TuningMode tuningMode;
+    if (PlatformData::getTuningModeByConfigMode(mCameraId, mConfigMode, tuningMode) != OK) {
+        return UNKNOWN_ERROR;
+    }
+    mTuningMode = tuningMode;
+
+    mKernelId = 0;
+    CLEAR(mSrcResolution);
+    CLEAR(mDstResolution);
+
+    return reconfigure();
+}
+
+int Dvs::configure(TuningMode tuningMode, uint32_t kernelId,
+                   int srcWidth, int srcHeight, int dstWidth, int dstHeight) {
+    LOG1("@%s, isDvsSupported:%d", __func__, PlatformData::isDvsSupported(mCameraId));
+    AutoMutex l(mLock);
+    mConfigured = false;
+    if (!PlatformData::isDvsSupported(mCameraId)) return OK;
+
+    mTuningMode = tuningMode;
+    mKernelId = kernelId;
+    mSrcResolution.width = srcWidth;
+    mSrcResolution.height = srcHeight;
+    mDstResolution.width = dstWidth;
+    mDstResolution.height = dstHeight;
+
+    return reconfigure();
+}
+
+int Dvs::setDVSConfiguration(uint32_t kernelId, ia_dvs_configuration *config) {
+    config->num_axis = mDvsEnabled ? ia_dvs_algorithm_6_axis : ia_dvs_algorithm_0_axis;
+
+    /* General setting for dvs */
+    config->source_bq.width_bq = mSrcResolution.width / 2;
+    config->source_bq.height_bq = mSrcResolution.height / 2;
+    config->output_bq.width_bq = mSrcResolution.width / 2;
+    config->output_bq.height_bq = mSrcResolution.height / 2;
+    // if the DstResolution is valid, the output_bq from dstResolution.
+    if (mDstResolution.width != 0 && mDstResolution.height != 0) {
+        config->output_bq.width_bq = mDstResolution.width / 2;
+        config->output_bq.height_bq = mDstResolution.height / 2;
+    }
+    config->ispfilter_bq.width_bq = 0;
+    config->ispfilter_bq.height_bq = 0;
+
+    // config->num_axis = ia_dvs_algorithm_0_axis;
+    config->gdc_shift_x = 0;
+    config->gdc_shift_y = 0;
+
+    if (kernelId == ia_pal_uuid_isp_gdc3_1) {
+        config->oxdim_y = DVS_OXDIM_Y;
+        config->oydim_y = DVS_OYDIM_Y;
+        config->oxdim_uv = DVS_OXDIM_UV;
+        config->oydim_uv = DVS_OYDIM_UV;
+    } else {
+        config->oxdim_y = DVS_OXDIM_Y / 2;
+        config->oydim_y = DVS_OYDIM_Y;
+        config->oxdim_uv = DVS_OXDIM_UV;
+        config->oydim_uv = DVS_OYDIM_UV;
+    }
+
+    config->hw_config.scan_mode = ia_dvs_gdc_scan_mode_stb;
+    config->hw_config.interpolation = ia_dvs_gdc_interpolation_bci;
+    config->hw_config.performance_point = ia_dvs_gdc_performance_point_1x1;
+
+    config->gdc_buffer_config.x_offset = 0;
+    config->gdc_buffer_config.y_offset = 0;
+    config->gdc_buffer_config.width = config->source_bq.width_bq;
+    config->gdc_buffer_config.height = config->source_bq.height_bq;
+    config->frame_rate = mFps;
+    config->validate_morph_table = false;
+
+    /*
+     * cropping from the active pixel array, needs to be coming from history
+     */
+    config->crop_params.horizontal_crop_offset = 0;
+    config->crop_params.vertical_crop_offset = 0;
+    config->crop_params.cropped_width = 0;
+    config->crop_params.cropped_height = 0;
+
+    config->envelope_bq.width_bq = ENVELOPE_BQ_WIDTH;
+    config->envelope_bq.height_bq = ENVELOPE_BQ_HEIGHT;
+
+    int bq_max_width = static_cast<int>(MAX_DVS2_YUVDS_RATIO *
+                                        static_cast<float>(config->output_bq.width_bq));
+    int bq_max_height = static_cast<int>(MAX_DVS2_YUVDS_RATIO *
+                                         static_cast<float>(config->output_bq.height_bq));
+
+    if (config->source_bq.width_bq - config->envelope_bq.width_bq -
+        config->ispfilter_bq.width_bq > bq_max_width)
+        config->envelope_bq.width_bq =
+            config->source_bq.width_bq - config->ispfilter_bq.width_bq - bq_max_width;
+
+    if (config->source_bq.height_bq - config->envelope_bq.height_bq -
+        config->ispfilter_bq.height_bq > bq_max_height)
+        config->envelope_bq.height_bq =
+            config->source_bq.height_bq - config->ispfilter_bq.height_bq - bq_max_height;
+
+    if (mLdcEnabled) {
+        // The crop must be set in LDC function, or there is config dvs fail
+        config->crop_params.cropped_width = mDstResolution.width / 2;
+        config->crop_params.cropped_height = mDstResolution.height / 2;
+        // envelope bq is only for stabilization and it has to be set as 0 when ldc enabled.
+        // TODO: clear define the envelope_bq when ldc & video stabilization enabled together
+        config->envelope_bq.width_bq = 0;
+        config->envelope_bq.height_bq = 0;
+        config->use_lens_distortion_correction = true;
+    }
+
+    if (mRscEnabled) {
+        // TODO: set config.nonblanking_ratio to inputReadoutTime/framePeriod.
+    }
+    return 0;
+}
+
+int Dvs::reconfigure() {
+    LOG1("@%s", __func__);
+
+    int status = OK;
+    uint32_t gdcKernelId = mKernelId;
+
+    // If parameters are not valid, try to query them in GC.
+    if (gdcKernelId == 0 || mSrcResolution.width == 0 || mSrcResolution.height == 0) {
+        // update GC
+        std::shared_ptr<IGraphConfig> gc = nullptr;
+
+        if (PlatformData::getGraphConfigNodes(mCameraId)) {
+            IGraphConfigManager *GCM = IGraphConfigManager::getInstance(mCameraId);
+            if (GCM) {
+                gc = GCM->getGraphConfig(mConfigMode);
+            }
+        }
+        CheckWarning(gc == nullptr, OK, "Failed to get GC in DVS");
+
+        // update resolution infomation
+        status = gc->getGdcKernelSetting(gdcKernelId, mSrcResolution);
+        CheckWarning(status != OK, OK, "Failed to get GDC kernel setting, DVS disabled");
+    }
+    LOG1("%s, GDC kernel setting: id: %u, src resolution: %dx%d, dst resolution: %dx%d",
+         __func__, gdcKernelId, mSrcResolution.width, mSrcResolution.height,
+         mDstResolution.width, mDstResolution.height);
+
+    if (mDvsHandle) {
+        deinitDvsHandle();
+    }
+    status = initDvsHandle(mTuningMode);
+
+    if (!mDvsHandle)
+        return status;
+
+    ia_dvs_configuration config;
+    CLEAR(config);
+
+    setDVSConfiguration(gdcKernelId, &config);
+    dumpConfiguration(config);
+
+    CheckError(mSrcResolution.width <= (config.envelope_bq.width_bq * 2), UNKNOWN_ERROR,
+               "%s the mSrcResolution width: %d is too small", __func__, mSrcResolution.width);
+    CheckError(mSrcResolution.height <= (config.envelope_bq.height_bq * 2), UNKNOWN_ERROR,
+               "%s the mSrcResolution height: %d is too small", __func__, mSrcResolution.height);
+
+    float zoomHRatio = mSrcResolution.width /
+                       (mSrcResolution.width - config.envelope_bq.width_bq * 2);
+    float zoomVRatio = mSrcResolution.height /
+                       (mSrcResolution.height - config.envelope_bq.height_bq * 2);
+    ia_err err = mIntelDvs->config(mDvsHandle, &config,
+                                   (zoomHRatio > zoomVRatio) ? zoomHRatio : zoomVRatio);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "Configure DVS failed %d", err);
+
+    LOG2("Configure DVS success");
+    err = mIntelDvs->setNonBlankRatio(mDvsHandle, config.nonblanking_ratio);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "set non blank ratio failed %d", err);
+
+    status = initDVSTable();
+    CheckError(status != OK, UNKNOWN_ERROR, "Allocate dvs table failed");
+    mConfigured = true;
+
+    return status;
+}
+
+void Dvs::handleEvent(EventData eventData) {
+    if (eventData.type != EVENT_PSYS_STATS_BUF_READY) return;
+    if (!mConfigured) return;
+
+    LOG3A("%s: handle EVENT_PSYS_STATS_BUF_READY", __func__);
+    int64_t sequence = eventData.data.statsReady.sequence;
+
+    AiqResultStorage* aiqResultStorage = AiqResultStorage::getInstance(mCameraId);
+    DvsStatistics *dvsStatistics = aiqResultStorage->getDvsStatistics();
+    if (dvsStatistics->sequence != sequence || dvsStatistics->dvsStats == nullptr) return;
+
+    // Set dvs statistics
+    {
+    AutoMutex l(mLock);
+    mStatistics = dvsStatistics->dvsStats;
+    }
+
+    // Run dvs
+    if (mAiqSetting) {
+        aiq_parameter_t aiqParam;
+        mAiqSetting->getAiqParameter(aiqParam);
+        updateParameter(aiqParam);
+    }
+
+    DvsResult *dvsResult = aiqResultStorage->acquireDvsResult();
+
+    const AiqResult *feedback = aiqResultStorage->getAiqResult(sequence);
+    if (feedback == nullptr) {
+        LOGW("%s: no aiq result for sequence %ld! use the latest instead", __func__, sequence);
+        feedback = aiqResultStorage->getAiqResult();
+    }
+
+    const ia_aiq_af_results *afResults = nullptr;
+    if (PlatformData::getLensHwType(mCameraId) == LENS_VCM_HW) {
+        afResults = &feedback->mAfResults;
+    }
+    int ret = run(&feedback->mAeResults, afResults, dvsResult, sequence);
+    CheckError(ret != OK, VOID_VALUE, "Run DVS fail");
+
+    aiqResultStorage->updateDvsResult(sequence);
+}
+
+int Dvs::run(const ia_aiq_ae_results *aeResults, const ia_aiq_af_results *afResults,
+             DvsResult *result, int64_t sequence) {
+    LOG2("@%s", __func__);
+    if (!mConfigured) return OK;
+
+    PERF_CAMERA_ATRACE_IMAGING();
+    AutoMutex l(mLock);
+
+    runImpl(aeResults, afResults);
+
+    int dvsType = PlatformData::getDVSType(mCameraId);
+    switch (dvsType) {
+        case MORPH_TABLE: {
+            return getMorphTable(sequence, result);
+        }
+        case IMG_TRANS:
+            return getImageTrans(sequence, result);
+        default:
+            LOGE("not supportted dvs type");
+            return UNKNOWN_ERROR;
+    }
+}
+
+int Dvs::configureDigitalZoom(ia_dvs_zoom_mode zoom_mode, ia_rectangle *zoom_region,
+                              ia_coordinate *zoom_coordinate) {
+    LOG2("@%s zoom mode:%d", __func__, zoom_mode);
+    AutoMutex l(mLock);
+
+    ia_err err = mIntelDvs->setDigitalZoomMode(mDvsHandle, zoom_mode);
+    CheckError(err != ia_err_none, BAD_VALUE, "set zoom mode error: %d", err);
+
+    if (zoom_mode == ia_dvs_zoom_mode_region) {
+        err = mIntelDvs->setDigitalZoomRegion(mDvsHandle, zoom_region);
+    } else if (zoom_mode == ia_dvs_zoom_mode_coordinate) {
+        err = mIntelDvs->setDigitalZoomCoordinate(mDvsHandle, zoom_coordinate);
+    }
+
+    int ret = AiqUtils::convertError(err);
+    CheckError(ret != OK, ret, "Error config zoom: %d", ret);
+
+    return OK;
+}
+
+int Dvs::setZoomRatio(float zoomRatio) {
+    LOG2("@%s zoom:%4.2f", __func__, zoomRatio);
+    AutoMutex l(mLock);
+
+    ia_err err = mIntelDvs->setDigitalZoomMagnitude(mDvsHandle, zoomRatio);
+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "set digital zoom magnitude error: %d", err);
+
+    return OK;
+}
+
+/**
+ * Private function implementations. mLock is assumed to be held.
+ */
+
+int Dvs::initDVSTable() {
+    LOG1("@%s", __func__);
+
+    int dvsType = PlatformData::getDVSType(mCameraId);
+    switch (dvsType) {
+        case MORPH_TABLE:
+            if (mMorphTable) {
+                mIntelDvs->freeMorphTable(mDvsHandle, mMorphTable);
+                mMorphTable = nullptr;
+            }
+            if (mDvsHandle) {
+                mMorphTable = mIntelDvs->allocateMorphTalbe(mDvsHandle);
+                CheckError(!mMorphTable, UNKNOWN_ERROR, "mMorphTable allocate failed");
+            }
+            break;
+        case IMG_TRANS:
+            LOG1("not need allocate MorphTable for image_transformation");
+            break;
+        default:
+            LOGE("not supportted dvs type");
+            return UNKNOWN_ERROR;
+    }
+    return OK;
+}
+
+int Dvs::deInitDVSTable() {
+    int status = OK;
+    if (mMorphTable) {
+        mIntelDvs->freeMorphTable(mDvsHandle, mMorphTable);
+        mMorphTable = nullptr;
+    }
+
+    return status;
+}
+
+int Dvs::runImpl(const ia_aiq_ae_results *aeResults, const ia_aiq_af_results *afResults) {
+    LOG2("@%s", __func__);
+    ia_err err = ia_err_none;
+    int ret = OK;
+
+    if (!mDvsHandle)
+        return UNKNOWN_ERROR;
+
+    if ((mDvsEnabled) && mStatistics && mStatistics->vector_count > 0) {
+        err = mIntelDvs->setStatistics(mDvsHandle, mStatistics,
+                                       aeResults, afResults, /*sensor events*/nullptr, 0, 0);
+        ret = AiqUtils::convertError(err);
+        CheckError(ret != OK, ret, "DVS set statistics failed: %d", ret);
+    } else if ((mDvsEnabled) && !mStatistics) {
+        return UNKNOWN_ERROR;
+    }
+
+    uint16_t focusPosition = 0;
+    if (afResults) {
+        focusPosition = static_cast<uint16_t>(afResults->next_lens_position);
+    }
+
+    err = mIntelDvs->execute(mDvsHandle, focusPosition);
+    ret = AiqUtils::convertError(err);
+    CheckError(ret != OK, ret, "DVS execution failed: %d", ret);
+
+    return OK;
+}
+
+int Dvs::getMorphTable(int64_t sequence, DvsResult *result) {
+    LOG2("@%s", __func__);
+    CheckError(!result, UNKNOWN_ERROR, "@%s, result is null", __func__);
+
+    int ret = mIntelDvs->getMorphTable(mDvsHandle, mMorphTable, result);
+    CheckError(ret != OK, ret, "Error geting DVS result: %d", ret);
+    return dumpDVSTable(&result->mMorphTable, sequence);
+}
+
+int Dvs::getImageTrans(int64_t sequence, DvsResult *result) {
+    LOG2("@%s", __func__);
+
+    ia_err err = mIntelDvs->getImageTransformation(mDvsHandle, &mImage_transformation);
+    int ret = AiqUtils::convertError(err);
+    CheckError(ret != OK, ret, "Error geting DVS result: %d", ret);
+    dumpDVSTable(&mImage_transformation, sequence);
+    return AiqUtils::deepCopyDvsResults(mImage_transformation, &result->mTransformation);
+}
+
+int Dvs::updateParameter(const aiq_parameter_t &param) {
+    LOG2("@%s", __func__);
+    if (!mConfigured) return OK;
+
+    bool dvsEnabled = (param.videoStabilizationMode == VIDEO_STABILIZATION_MODE_ON);
+    bool ldcEnabled = (param.ldcMode == LDC_MODE_ON);
+    bool rscEnabled = (param.rscMode == RSC_MODE_ON);
+    int digitalZoomRatio = param.digitalZoomRatio;
+
+    if ((param.fps > 0.01 && param.fps != mFps)
+        || param.tuningMode != mTuningMode
+        || dvsEnabled != mDvsEnabled || ldcEnabled != mLdcEnabled
+        || rscEnabled != mRscEnabled) {
+        mFps = param.fps > 0.01 ? param.fps : mFps;
+        mTuningMode = param.tuningMode;
+        mDvsEnabled = dvsEnabled;
+        mLdcEnabled = ldcEnabled;
+        mRscEnabled = rscEnabled;
+
+        LOG3A("%s: DVS fps = %f ", __func__, mFps);
+        LOG3A("%s: DVS tuning Mode = %d ", __func__, mTuningMode);
+        LOG3A("%s: DVS enabled = %d ", __func__, mDvsEnabled);
+        LOG3A("%s: LDC enabled = %d ", __func__, mLdcEnabled);
+        LOG3A("%s: RSC enabled = %d ", __func__, mRscEnabled);
+
+        return reconfigure();
+    }
+
+    if (param.digitalZoomRatio > 0 && param.digitalZoomRatio!= mDigitalZoomRatio) {
+        mDigitalZoomRatio = digitalZoomRatio;
+        setZoomRatio(mDigitalZoomRatio);
+        LOG3A("%s: digital zoom ratio = %f ", __func__, mDigitalZoomRatio);
+    }
+
+    return OK;
+}
+
+int Dvs::dumpDVSTable(ia_dvs_morph_table *table, int64_t sequence) {
+    if (!CameraDump::isDumpTypeEnable(DUMP_AIQ_DVS_RESULT)) return OK;
+
+    LOG3A("%s", __func__);
+
+    CheckError(!table, BAD_VALUE, "%s: morph table is nullptr, and nothing to dump.", __func__);
+
+    BinParam_t bParam;
+    bParam.bType = BIN_TYPE_GENERAL;
+    bParam.mType = M_PSYS;
+    bParam.sequence = sequence;
+    bParam.gParam.appendix = "dvs_morph_table_x_y";
+    CameraDump::dumpBinary(0, table->xcoords_y,
+                           table->width_y * table->height_y * sizeof(uint32_t), &bParam);
+    bParam.gParam.appendix = "dvs_morph_table_y_y";
+    CameraDump::dumpBinary(0, table->ycoords_y,
+                           table->width_y * table->height_y * sizeof(uint32_t), &bParam);
+    bParam.gParam.appendix = "dvs_morph_table_x_uv";
+    CameraDump::dumpBinary(0, table->xcoords_uv,
+                           table->width_uv * table->height_uv * sizeof(uint32_t), &bParam);
+    bParam.gParam.appendix = "dvs_morph_table_y_uv";
+    CameraDump::dumpBinary(0, table->ycoords_uv,
+                           table->width_uv * table->height_uv * sizeof(uint32_t), &bParam);
+
+    LOG3A("%s: DVS morph table y=[%d x %d], uv=[%d x %d] changed=%s", __func__,
+          table->width_y, table->height_y,
+          table->width_uv, table->height_uv,
+          table->morph_table_changed == true ? "TRUE" : "FALSE");
+    return OK;
+}
+
+int Dvs::dumpDVSTable(ia_dvs_image_transformation *trans, int64_t sequence) {
+    if (!CameraDump::isDumpTypeEnable(DUMP_AIQ_DVS_RESULT)) return OK;
+
+    LOG3A("%s", __func__);
+
+    CheckError(!trans, BAD_VALUE, "%s: trans table is nullptr, and nothing to dump.", __func__);
+
+    LOG3A("%s: DVS trans table num_homography_matrices=%d", __func__,
+            trans->num_homography_matrices);
+
+    BinParam_t bParam;
+    bParam.bType = BIN_TYPE_GENERAL;
+    bParam.mType = M_PSYS;
+    bParam.sequence = sequence;
+    for (int i = 0; i < DVS_HOMOGRAPHY_MATRIX_MAX_COUNT; i++) {
+        LOG3A("%s: DVS trans table %d start_row=%d", __func__,
+            i, trans->matrices[i].start_row);
+        bParam.gParam.appendix = "matrices";
+        CameraDump::dumpBinary(0, &trans->matrices[i].matrix, 3 * 3 * sizeof(float), &bParam);
+    }
+
+    return OK;
+}
+
+int Dvs::dumpConfiguration(ia_dvs_configuration config) {
+    LOG3A("%s", __func__);
+
+    LOG3A("config.num_axis %d", config.num_axis);
+    LOG3A("config.nonblanking_ratio %f", config.nonblanking_ratio);
+    LOG3A("config.source_bq.width_bq %d", config.source_bq.width_bq);
+    LOG3A("config.source_bq.height_bq %d", config.source_bq.height_bq);
+    LOG3A("config.output_bq.width_bq %d", config.output_bq.width_bq);
+    LOG3A("config.output_bq.height_bq %d", config.output_bq.height_bq);
+    LOG3A("config.envelope_bq.width_bq %d", config.envelope_bq.width_bq);
+    LOG3A("config.envelope_bq.height_bq %d", config.envelope_bq.height_bq);
+    LOG3A("config.ispfilter_bq.width_bq %d", config.ispfilter_bq.width_bq);
+    LOG3A("config.ispfilter_bq.height_bq %d", config.ispfilter_bq.height_bq);
+    LOG3A("config.gdc_shift_x %d", config.gdc_shift_x);
+    LOG3A("config.gdc_shift_y %d", config.gdc_shift_y);
+    LOG3A("config.oxdim_y %d", config.oxdim_y);
+    LOG3A("config.oydim_y %d", config.oydim_y);
+    LOG3A("config.oxdim_uv %d", config.oxdim_uv);
+    LOG3A("config.oydim_uv %d", config.oydim_uv);
+    LOG3A("config.hw_config.scan_mode %d", config.hw_config.scan_mode);
+    LOG3A("config.hw_config.interpolation %d", config.hw_config.interpolation);
+    LOG3A("config.hw_config.performance_point %d", config.hw_config.performance_point);
+    LOG3A("config.validate_morph_table = %s",
+          (config.validate_morph_table == true) ? "true" : "false");
+    LOG3A("config.use_lens_distortion_correction = %s",
+          (config.use_lens_distortion_correction == true) ? "true" : "false");
+
+    return OK;
+}
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/3a/Dvs.h b/camera/hal/intel/ipu6/src/3a/Dvs.h
new file mode 100644
index 000000000000..ffa6389dcea4
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/Dvs.h
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_dvs.h>
+#include <ia_dvs_types.h>
+#include <ia_isp_bxt.h>
+#include <memory>
+#include <vector>
+
+#include "iutils/Thread.h"
+#include "iutils/Errors.h"
+
+#include "AiqSetting.h"
+#include "CameraEvent.h"
+#include "DvsResult.h"
+
+#ifdef ENABLE_SANDBOXING
+#include "modules/sandboxing/client/IntelDvs.h"
+#else
+#include "modules/algowrapper/IntelDvs.h"
+#endif
+
+namespace icamera {
+struct DvsStatistics {
+    explicit DvsStatistics(ia_dvs_statistics *dvs = nullptr, int64_t seq = -1) {
+        dvsStats = dvs;
+        sequence = seq;
+    }
+    ia_dvs_statistics *dvsStats;
+    int64_t sequence;
+};
+
+/**
+ * \class Dvs
+ * Wrapper of the DVSx, provide 2 basic functionalities in video mode:
+ * 1. zoom (including center and freeform)
+ * 2. DVS
+ * The algorithm should generate the morph table to support the
+ * above functionalities.
+ */
+class Dvs : public EventListener {
+ public:
+    explicit Dvs(int cameraId, AiqSetting *setting = nullptr);
+    ~Dvs();
+
+    int init();
+    int deinit();
+    int configure(const std::vector<ConfigMode>& configMode);
+    int configure(TuningMode tuningMode, uint32_t kernelId,
+                  int srcWidth, int srcHeight, int dstWidth, int dstHeight);
+    int updateParameter(const aiq_parameter_t &param);
+    void handleEvent(EventData eventData);
+
+    int run(const ia_aiq_ae_results *aeResults, const ia_aiq_af_results *afResults,
+            DvsResult *result, int64_t sequence = 0);
+
+ private:
+    int configureDigitalZoom(ia_dvs_zoom_mode zoom_mode, ia_rectangle *zoom_region,
+                             ia_coordinate *zoom_coordinate);
+    int setZoomRatio(float zoom);
+
+    int initDvsHandle(TuningMode tuningMode);
+    int deinitDvsHandle();
+    int initDVSTable();
+    int deInitDVSTable();
+    int reconfigure();
+    int runImpl(const ia_aiq_ae_results *aeResults, const ia_aiq_af_results *afResults);
+    int getMorphTable(int64_t sequence, DvsResult *result);
+    int getImageTrans(int64_t sequence, DvsResult *result);
+    int setDVSConfiguration(uint32_t kernelId, ia_dvs_configuration *config);
+    int dumpDVSTable(ia_dvs_morph_table *table, int64_t sequence);
+    int dumpDVSTable(ia_dvs_image_transformation *trans, int64_t sequence);
+    int dumpConfiguration(ia_dvs_configuration config);
+
+ private:
+    // Guard for class Dvs public API
+    IntelDvs *mIntelDvs;
+    Mutex mLock;
+    ia_dvs_state *mDvsHandle;
+    bool mDvsEnabled;
+    bool mLdcEnabled;
+    bool mRscEnabled;
+    float mDigitalZoomRatio;
+    int mCameraId;
+    float mFps;
+    ConfigMode mConfigMode;
+    TuningMode mTuningMode;
+    AiqSetting *mAiqSetting;
+
+    uint32_t mKernelId;
+    camera_resolution_t mSrcResolution;
+    camera_resolution_t mDstResolution;
+
+    ia_dvs_morph_table *mMorphTable;
+    ia_dvs_image_transformation mImage_transformation;
+    ia_dvs_statistics *mStatistics;
+    bool mConfigured;
+
+    // prevent copy constructor and assignment operator
+    DISALLOW_COPY_AND_ASSIGN(Dvs);
+};
+
+}  /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/3a/DvsResult.cpp b/camera/hal/intel/ipu6/src/3a/DvsResult.cpp
new file mode 100644
index 000000000000..c9a80301621e
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/DvsResult.cpp
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "DvsResult"
+
+#include "src/3a/DvsResult.h"
+
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+
+namespace icamera {
+DvsResult::DvsResult() :
+    mSequence(-1) {
+    LOG3A("@%s", __func__);
+
+    CLEAR(mTransformation);
+    CLEAR(mMorphTable);
+    CLEAR(mDvsXcoordsY);
+    CLEAR(mDvsYcoordsY);
+    CLEAR(mDvsXcoordsUV);
+    CLEAR(mDvsYcoordsUV);
+    CLEAR(mDvsXcoordsUVFloat);
+    CLEAR(mDvsYcoordsUVFloat);
+    mMorphTable.xcoords_y = mDvsXcoordsY;
+    mMorphTable.ycoords_y = mDvsYcoordsY;
+    mMorphTable.xcoords_uv = mDvsXcoordsUV;
+    mMorphTable.ycoords_uv = mDvsYcoordsUV;
+    mMorphTable.xcoords_uv_float = mDvsXcoordsUVFloat;
+    mMorphTable.ycoords_uv_float = mDvsYcoordsUVFloat;
+}
+
+DvsResult::~DvsResult() {
+    LOG3A("@%s", __func__);
+}
+
+int DvsResult::deepCopyDvsResults(const ia_dvs_morph_table& src, ia_dvs_morph_table* dst) {
+    LOG3A("%s", __func__);
+
+    CheckError(!dst || !dst->xcoords_y || !dst->ycoords_y
+               || !dst->xcoords_uv || !dst->ycoords_uv
+               || !dst->xcoords_uv_float || !dst->ycoords_uv_float,
+               BAD_VALUE , "Failed to deep copy DVS result- invalid destination");
+
+    CheckError(!src.xcoords_y || !src.ycoords_y
+               || !src.xcoords_uv || !src.ycoords_uv
+               || !src.xcoords_uv_float || !src.ycoords_uv_float,
+               BAD_VALUE , "Failed to deep copy DVS result- invalid source");
+
+    CheckError(src.width_y == 0 || src.height_y == 0 || src.width_uv == 0 || src.height_uv == 0,
+               BAD_VALUE , "Failed to deep copy DVS result- invalid source size y[%dx%d] uv[%dx%d]",
+               src.width_y, src.height_y, src.width_uv, src.height_uv);
+
+    dst->width_y = src.width_y;
+    dst->height_y = src.height_y;
+    dst->width_uv = src.width_uv;
+    dst->height_uv = src.height_uv;
+    dst->morph_table_changed = src.morph_table_changed;
+    unsigned int SizeY = dst->width_y  * dst->height_y * sizeof(int32_t);
+    unsigned int SizeUV = dst->width_uv * dst->height_uv * sizeof(int32_t);
+    MEMCPY_S(dst->xcoords_y, SizeY, src.xcoords_y, SizeY);
+    MEMCPY_S(dst->ycoords_y, SizeY, src.ycoords_y, SizeY);
+    MEMCPY_S(dst->xcoords_uv, SizeUV, src.xcoords_uv, SizeUV);
+    MEMCPY_S(dst->ycoords_uv, SizeUV, src.ycoords_uv, SizeUV);
+
+    SizeUV = dst->width_uv * dst->height_uv * sizeof(float);
+    MEMCPY_S(dst->xcoords_uv_float, SizeUV, src.xcoords_uv_float, SizeUV);
+    MEMCPY_S(dst->ycoords_uv_float, SizeUV, src.ycoords_uv_float, SizeUV);
+
+    return OK;
+}
+
+int DvsResult::deepCopyDvsResults(const ia_dvs_image_transformation& src,
+                                  ia_dvs_image_transformation* dst) {
+    LOG3A("%s", __func__);
+
+    CheckError(!dst, BAD_VALUE , "Failed to deep copy DVS result- invalid destination");
+
+    dst->num_homography_matrices = src.num_homography_matrices;
+    MEMCPY_S(dst->matrices, sizeof(dst->matrices), src.matrices, sizeof(src.matrices));
+
+    return OK;
+}
+
+DvsResult &DvsResult::operator=(const DvsResult &other) {
+    deepCopyDvsResults(other.mMorphTable, &this->mMorphTable);
+    deepCopyDvsResults(other.mTransformation, &this->mTransformation);
+    mSequence = other.mSequence;
+
+    return *this;
+}
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/3a/DvsResult.h b/camera/hal/intel/ipu6/src/3a/DvsResult.h
new file mode 100644
index 000000000000..1be7b5b3bec2
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/DvsResult.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ia_dvs_types.h>
+
+namespace icamera {
+static const int MAX_DVS_COORDS_Y_SIZE = 33 * 69;
+static const int MAX_DVS_COORDS_UV_SIZE = 33 * 69;
+
+class DvsResult {
+ public:
+    DvsResult();
+    ~DvsResult();
+
+    DvsResult& operator=(const DvsResult& other);
+
+    ia_dvs_morph_table mMorphTable;
+    ia_dvs_image_transformation mTransformation;
+    int64_t mSequence;
+
+    static int deepCopyDvsResults(const ia_dvs_morph_table& src, ia_dvs_morph_table* dst);
+    static int deepCopyDvsResults(const ia_dvs_image_transformation& src,
+                                  ia_dvs_image_transformation* dst);
+
+ private:
+    uint32_t mDvsXcoordsY[MAX_DVS_COORDS_Y_SIZE];
+    uint32_t mDvsYcoordsY[MAX_DVS_COORDS_Y_SIZE];
+    uint32_t mDvsXcoordsUV[MAX_DVS_COORDS_UV_SIZE];
+    uint32_t mDvsYcoordsUV[MAX_DVS_COORDS_UV_SIZE];
+    float mDvsXcoordsUVFloat[MAX_DVS_COORDS_UV_SIZE];
+    float mDvsYcoordsUVFloat[MAX_DVS_COORDS_UV_SIZE];
+};
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/3a/I3AControlFactory.cpp b/camera/hal/intel/ipu6/src/3a/I3AControlFactory.cpp
new file mode 100644
index 000000000000..8eaac4ab5145
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/I3AControlFactory.cpp
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2015-2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "I3AControlFactory"
+
+#include "iutils/CameraLog.h"
+#include "PlatformData.h"
+
+#include "I3AControlFactory.h"
+
+namespace icamera {
+
+AiqUnitBase *I3AControlFactory::createI3AControl(int cameraId, SensorHwCtrl *sensorHw, LensHw *lensHw)
+{
+    LOG1("@%s cameraId = %d", __func__, cameraId);
+    if (PlatformData::isEnableAIQ(cameraId)) {
+        return new AiqUnit(cameraId, sensorHw, lensHw);
+    }
+    return new AiqUnitBase();
+}
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/3a/I3AControlFactory.h b/camera/hal/intel/ipu6/src/3a/I3AControlFactory.h
new file mode 100644
index 000000000000..93482cc2996c
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/I3AControlFactory.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2015-2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "AiqUnit.h"
+#include "SensorHwCtrl.h"
+#include "LensHw.h"
+
+namespace icamera {
+
+/*
+ * \factory class I3AControlFactory
+ * This class is used to create the right instance of 3A unit
+ * automatically based on 3a enabled status
+ */
+class I3AControlFactory {
+public:
+    /**
+     * \brief Select the AIQ unit according to config file and compiling option
+     *
+     * \param cameraId: the camera id
+     * \param sensorHw: the hw sensor
+     * \param lensHw: the hw lens
+     *
+     * \return the AIQ unit base class
+     */
+    static AiqUnitBase *createI3AControl(int cameraId, SensorHwCtrl *sensorHw, LensHw *lensHw);
+};
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/3a/ImagingControl.h b/camera/hal/intel/ipu6/src/3a/ImagingControl.h
new file mode 100644
index 000000000000..74fa2289a34c
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/ImagingControl.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2018-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "iutils/Errors.h"
+#include "AiqSetting.h"
+#include "AiqResult.h"
+
+namespace icamera {
+
+/*
+ * \interface class ImagingControl
+ * This is an interface class for imaging algorithm controllers.
+ */
+class ImagingControl {
+public:
+    virtual ~ImagingControl() {}
+
+    virtual int init() = 0;
+    virtual int deinit() = 0;
+    virtual int run(AiqResult *aiqResult, int algoType) = 0;
+
+    virtual int configure(const std::vector<ConfigMode>& configModes) { return OK; }
+    virtual int updateParameter(const aiq_parameter_t &param) { return OK; }
+    virtual int setFrameInfo(const ia_aiq_frame_params &frameParams) { return OK; }
+    virtual int setSensorInfo(const ia_aiq_exposure_sensor_descriptor &descriptor) { return OK; }
+    virtual int setStatistics(const ia_aiq_statistics_input_params_v4 *ispStatistics) { return OK; }
+    virtual int getSupportedAlgoType() { return IMAGING_ALGO_NONE; }
+
+};
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/3a/LensManager.cpp b/camera/hal/intel/ipu6/src/3a/LensManager.cpp
new file mode 100644
index 000000000000..7bc95176543b
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/LensManager.cpp
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2016-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "LensManager"
+
+#include "LensManager.h"
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+#include "PlatformData.h"
+
+namespace icamera {
+
+LensManager::LensManager(int cameraId, LensHw *lensHw) :
+    mCameraId(cameraId),
+    mLensHw(lensHw),
+    mDcIrisCommand(ia_aiq_aperture_control_dc_iris_close),
+    mFocusPosition(-1)
+{
+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
+}
+
+LensManager::~LensManager()
+{
+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
+}
+
+int LensManager::start()
+{
+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
+    AutoMutex l(mLock);
+
+    mDcIrisCommand = ia_aiq_aperture_control_dc_iris_close;
+    mFocusPosition = -1;
+
+    return OK;
+}
+
+int LensManager::stop()
+{
+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
+    AutoMutex l(mLock);
+
+    if (!mLensHw->isLensSubdevAvailable()) {
+        return OK;
+    }
+
+    return OK;
+}
+
+int LensManager::setLensResult(const ia_aiq_ae_results &aeResults,
+                               const ia_aiq_af_results &afResults)
+{
+    LOG3A("%s, mCameraId = %d", __func__, mCameraId);
+    AutoMutex l(mLock);
+
+    if (!mLensHw->isLensSubdevAvailable()) {
+        return OK;
+    }
+
+    int ret = OK;
+
+    int lensHwType = PlatformData::getLensHwType(mCameraId);
+    switch(lensHwType) {
+        case LENS_VCM_HW:
+            if (mFocusPosition != afResults.next_lens_position) {
+                ret = mLensHw->setFocusPosition(afResults.next_lens_position);
+                mFocusPosition = afResults.next_lens_position;
+                LOG3A("mFocusPosition = %d, camera id %d", mFocusPosition, mCameraId);
+                LOG2("SENSORCTRLINFO: vcm_step=%d", mFocusPosition);
+            }
+            break;
+        default:
+            LOGW("Not supported Lens HW type, lensHwType = %d", lensHwType);
+            break;
+    }
+
+    return ret;
+}
+
+void LensManager::getLensInfo(aiq_parameter_t &aiqParam) {
+
+    if (PlatformData::getLensHwType(mCameraId) == LENS_VCM_HW) {
+        mLensHw->getLatestPosition(aiqParam.lensPosition, aiqParam.lensMovementStartTimestamp);
+    }
+}
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/3a/LensManager.h b/camera/hal/intel/ipu6/src/3a/LensManager.h
new file mode 100644
index 000000000000..cbd1de401d28
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/LensManager.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2016-2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "ia_aiq.h"
+
+#include "LensHw.h"
+#include "AiqSetting.h"
+
+namespace icamera {
+
+/*
+ * \class LensManager
+ * This class is used to control focus and aperture related controls.
+ */
+class LensManager {
+
+public:
+    LensManager(int cameraId, LensHw *lensHw);
+    ~LensManager();
+
+    /**
+     * \brief Called when AIQ engine is started
+     */
+    int start();
+
+    /**
+     * \brief Called when AIQ engine is stopped.
+     */
+    int stop();
+
+    /**
+     * \brief Set Lens results
+     *
+     * \param[in] ia_aiq_ae_results includes aperture result
+     *            and ia_aiq_af_results includes focus result.
+     *
+     * \return OK if set successfully.
+     */
+    int setLensResult(const ia_aiq_ae_results &aeResults,
+                      const ia_aiq_af_results &afResults);
+    /**
+     * \brief Get Lens info
+     *
+     * \param[out] aiqParam: updating lens related parameters.
+     *
+     */
+    void getLensInfo(aiq_parameter_t &aiqParam);
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(LensManager);
+
+private:
+    int mCameraId;
+    LensHw *mLensHw;
+    ia_aiq_aperture_control_dc_iris_command mDcIrisCommand;
+    int mFocusPosition;
+
+    // Guard for LensManager public API.
+    Mutex mLock;
+};
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/3a/Ltm.cpp b/camera/hal/intel/ipu6/src/3a/Ltm.cpp
new file mode 100644
index 000000000000..fde6a1076cdf
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/Ltm.cpp
@@ -0,0 +1,550 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "Ltm"
+
+#include <cmath>
+#include <memory>
+
+#include "Ltm.h"
+
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+
+#include "MakerNote.h"
+#include "PlatformData.h"
+#include "AiqResultStorage.h"
+#include "AiqUtils.h"
+
+#include "ia_log.h"
+
+namespace icamera {
+
+Ltm::Ltm(int cameraId) :
+    mCameraId(cameraId),
+    mLtm(nullptr),
+    mTuningMode(TUNING_MODE_MAX),
+    mLtmState(LTM_NOT_INIT),
+    mThreadRunning(false),
+    mInputParamIndex(-1)
+{
+    CLEAR(mLtmParams);
+    CLEAR(mSisBuffer);
+    CLEAR(mLtmBinParam);
+
+    mIntelLtm = std::unique_ptr<IntelLtm>(new IntelLtm());
+    mLtmThread = new LtmThread(this);
+    LOG3A("%s", __func__);
+}
+
+Ltm::~Ltm()
+{
+    LOG3A("%s", __func__);
+    mLtmThread->join();
+    delete mLtmThread;
+}
+
+int Ltm::initLtmParams()
+{
+    for (int i = 0; i < kMaxLtmParamsNum; i++) {
+        mLtmParams[i]->ltmParams.ltm_level = ia_ltm_level_use_tuning;
+        mLtmParams[i]->ltmParams.frame_use = ia_aiq_frame_use_video;
+        mLtmParams[i]->ltmParams.ev_shift = 0;
+        mLtmParams[i]->ltmParams.ltm_strength_manual = 100;
+        mLtmParams[i]->ltmParams.gtm_input_params_ptr = &(mLtmParams[i]->gtmParams);
+
+        mLtmParams[i]->gtmParams.manual_convergence_time = -1;
+        mLtmParams[i]->gtmParams.manual_gain = -1;
+        mLtmParams[i]->gtmParams.frame_timestamp = 0;
+    }
+
+    return OK;
+}
+
+int Ltm::init()
+{
+    LOG3A("%s", __func__);
+
+    AutoMutex l(mLtmLock);
+
+    for (int i = 0; i < kMaxLtmParamsNum; i++) {
+        mLtmParams[i] = new LtmInputParams;
+        mSisBuffer[i] = new SisBuffer;
+    }
+
+    initLtmParams();
+
+    mLtmState = LTM_INIT;
+
+    return OK;
+}
+
+int Ltm::deinit()
+{
+    LOG3A("%s", __func__);
+
+    deinitIaLtmHandle();
+
+    AutoMutex l(mLtmLock);
+
+    for (int i = 0; i < kMaxLtmParamsNum; i++) {
+        if (mSisBuffer[i]->sisImage.data) {
+            free(mSisBuffer[i]->sisImage.data);
+            mSisBuffer[i]->sisImage.data = nullptr;
+        }
+
+        if (mLtmParams[i]->ltmParams.input_image_ptr) {
+            free(mLtmParams[i]->ltmParams.input_image_ptr);
+            mLtmParams[i]->ltmParams.input_image_ptr = nullptr;
+        }
+
+        delete mSisBuffer[i];
+        mSisBuffer[i] = nullptr;
+
+        delete mLtmParams[i];
+        mLtmParams[i] = nullptr;
+    }
+    mLtmState = LTM_NOT_INIT;
+
+    return OK;
+}
+
+int Ltm::initIaLtmHandle(TuningMode tuningMode)
+{
+    LOG3A("%s", __func__);
+
+    ia_mkn *mkn = MakerNote::getInstance(mCameraId)->getMknHandle();
+    CheckError((mkn == nullptr), NO_INIT, "Error in initing makernote");
+
+    CpfStore* cpf = PlatformData::getCpfStore(mCameraId);
+    CheckError((cpf == nullptr), NO_INIT, "@%s, No CPF for cameraId:%d", __func__, mCameraId);
+
+    ia_binary_data otherData;
+    int ret = cpf->getDataAndCmc(nullptr, nullptr, &otherData, nullptr, tuningMode);
+    CheckError(ret != OK, BAD_VALUE, "@%s, Get cpf data failed", __func__);
+    {
+        PERF_CAMERA_ATRACE_PARAM1("ia_ltm_init", 0);
+        mLtm = mIntelLtm->init(&otherData, mkn);
+    }
+    CheckError(mLtm == nullptr, NO_INIT, "Failed to init ltm");
+
+    return OK;
+}
+
+int Ltm::deinitIaLtmHandle()
+{
+    LOG3A("%s", __func__);
+
+    if (mLtm) {
+        PERF_CAMERA_ATRACE_PARAM1("ia_ltm_deinit", 0);
+        mIntelLtm->deinit(mLtm);
+        mLtm = nullptr;
+    }
+
+    return OK;
+}
+
+int Ltm::configure(const std::vector<ConfigMode>& configModes)
+{
+    LOG3A("%s", __func__);
+
+    TuningMode tMode = TUNING_MODE_MAX;
+    for (auto cfg : configModes) {
+        // Only support the 1st tuning mode if multiple config mode is configured.
+        if (cfg == CAMERA_STREAM_CONFIGURATION_MODE_NORMAL) {
+            tMode = TUNING_MODE_VIDEO;
+            break;
+        }
+    }
+
+    if (tMode == TUNING_MODE_MAX) {
+        return OK;
+    }
+
+    if (mLtmState == LTM_CONFIGURED && mTuningMode == tMode) {
+        return OK;
+    }
+
+    deinitIaLtmHandle();
+
+    int ret = initIaLtmHandle(tMode);
+    CheckError((ret != OK), ret, "%s, configure LTM algo failed %d", __func__, ret);
+
+    mTuningMode = tMode;
+    mLtmState = LTM_CONFIGURED;
+
+    updateTuningData();
+
+    LOG3A("%s Ltm algo is Configured", __func__);
+    return OK;
+}
+
+int Ltm::start()
+{
+    LOG1("@%s", __func__);
+    AutoMutex l(mLtmLock);
+
+    if (PlatformData::isEnableLtmThread(mCameraId)) {
+        mThreadRunning = true;
+        mLtmThread->run("ltm_thread", PRIORITY_NORMAL);
+    }
+
+    return OK;
+}
+
+void Ltm::stop()
+{
+    LOG1("@%s", __func__);
+
+    if (PlatformData::isEnableLtmThread(mCameraId)) {
+        mLtmThread->requestExit();
+        {
+            AutoMutex l(mLtmLock);
+            mThreadRunning = false;
+            mParamAvailableSignal.signal();
+        }
+        mLtmThread->requestExitAndWait();
+    }
+
+    while (!mLtmParamsQ.empty()) {
+        mLtmParamsQ.pop();
+    }
+}
+
+void Ltm::handleEvent(EventData eventData)
+{
+    if (eventData.type == EVENT_PSYS_STATS_BUF_READY) {
+        LOG3A("%s: handle EVENT_PSYS_STATS_BUF_READY", __func__);
+        long sequence = eventData.data.statsReady.sequence;
+        unsigned long long timestamp = TIMEVAL2USECS(eventData.data.statsReady.timestamp);
+
+        LtmStatistics *ltmStatistics = AiqResultStorage::getInstance(mCameraId)->getLtmStatistics();
+        if (ltmStatistics->sequence != sequence || ltmStatistics->yvGrid == nullptr) return;
+
+        handleLtm(ltmStatistics->yvGrid, timestamp, sequence);
+    } else if (eventData.type == EVENT_PSYS_STATS_SIS_BUF_READY) {
+        LOG3A("%s: handle EVENT_PSYS_STATS_SIS_BUF_READY", __func__);
+        handleSisLtm(eventData.buffer);
+    }
+}
+
+AiqResult *Ltm::getAiqResult(long sequence)
+{
+    long ltmSequence = sequence;
+    AiqResultStorage *resultStorage = AiqResultStorage::getInstance(mCameraId);
+    if (ltmSequence > 0) {
+        ltmSequence += PlatformData::getLtmGainLag(mCameraId);
+    }
+
+    LOG3A("%s, ltmSequence %ld, sequence %ld", __func__, ltmSequence, sequence);
+    AiqResult* feedback = const_cast<AiqResult*>(resultStorage->getAiqResult(ltmSequence));
+    if (feedback == nullptr) {
+        LOGW("%s: no feed back result for sequence %ld! use the latest instead",
+                __func__, ltmSequence);
+        feedback = const_cast<AiqResult*>(resultStorage->getAiqResult());
+    }
+
+    return feedback;
+}
+
+int Ltm::handleLtm(ia_isp_bxt_hdr_yv_grid_t* inputYvGrid, unsigned long long timestamp, long sequence)
+{
+    LOG3A("@%s", __func__);
+    AutoMutex l(mLtmLock);
+
+    mInputParamIndex++;
+    mInputParamIndex %= kMaxLtmParamsNum;
+
+    if (inputYvGrid) {
+        mLtmParams[mInputParamIndex]->yvGrid = *inputYvGrid;
+        mLtmParams[mInputParamIndex]->ltmParams.yv_grid = &(mLtmParams[mInputParamIndex]->yvGrid);
+    } else {
+        mLtmParams[mInputParamIndex]->ltmParams.yv_grid = nullptr;
+    }
+
+    AiqResult* feedback = getAiqResult(sequence);
+    updateParameter(feedback->mAiqParam, timestamp);
+
+    if ((!PlatformData::isEnableLtmThread(mCameraId)) || sequence == 0) {
+        AiqResultStorage *resultStorage = AiqResultStorage::getInstance(mCameraId);
+        ltm_result_t *ltmResult = resultStorage->acquireLtmResult();
+
+        runLtm(&(feedback->mAeResults), ltmResult);
+        resultStorage->updateLtmResult(sequence);
+        updateTuningData();
+    } else {
+        mLtmParams[mInputParamIndex]->sequence = sequence;
+        bool needSignal = mLtmParamsQ.empty();
+        mLtmParamsQ.push(mLtmParams[mInputParamIndex]);
+        if (needSignal) {
+            mParamAvailableSignal.signal();
+        }
+    }
+
+    return OK;
+}
+
+int Ltm::handleSisLtm(const std::shared_ptr<CameraBuffer> &cameraBuffer)
+{
+    LOG3A("@%s", __func__);
+    AutoMutex l(mLtmLock);
+
+    ia_binary_data* sisFrame = (ia_binary_data*)cameraBuffer->getBufferAddr();
+    CheckError(sisFrame == nullptr, BAD_VALUE, "sis frame buffer is nullptr!");
+    int sisWidth = cameraBuffer->getWidth();
+    int sisHeight = cameraBuffer->getHeight();
+    int sequence = cameraBuffer->getSequence();
+
+    mInputParamIndex++;
+    mInputParamIndex %= kMaxLtmParamsNum;
+
+    AiqResult *feedback = getAiqResult(sequence);
+
+    int size = sisFrame->size;
+    CheckError((size <= 0), BAD_VALUE, "sis data size err!");
+
+    void *data = sisFrame->data;
+    CheckError((data == nullptr), BAD_VALUE, "sis data ptr err!");
+
+    ia_ltm_input_image *inputImagePtr = mLtmParams[mInputParamIndex]->ltmParams.input_image_ptr;
+    if (!inputImagePtr) {
+        inputImagePtr = (ia_ltm_input_image *)malloc(sizeof(ia_ltm_input_image));
+        CheckError((inputImagePtr == nullptr), NO_INIT, "Error in initing image ptr");
+
+        memset(inputImagePtr, 0, sizeof(ia_ltm_input_image));
+        mLtmParams[mInputParamIndex]->ltmParams.input_image_ptr = inputImagePtr;
+
+        inputImagePtr->image_info.raw_image.data_format = ia_image_data_format_rawplain16_interleaved;
+        inputImagePtr->image_info.raw_image.bayer_order = cmc_bayer_order_grbg;
+        inputImagePtr->image_info.raw_image.data_format_bpp = 16;
+        inputImagePtr->image_info.raw_image.data_bpp = 15;
+
+        mSisBuffer[mInputParamIndex]->sisPort = SIS_A;
+        mSisBuffer[mInputParamIndex]->sisImage.size = size;
+        mSisBuffer[mInputParamIndex]->sisImage.data = malloc(size);
+        CheckError((mSisBuffer[mInputParamIndex]->sisImage.data == nullptr),
+            NO_MEMORY, "sis buffer allocated failed!");
+
+        MEMCPY_S(mSisBuffer[mInputParamIndex]->sisImage.data, size, data, size);
+
+        inputImagePtr->image_data = &mSisBuffer[mInputParamIndex]->sisImage;
+        // width_cols and height_lines are quad count, need to divide 2 for them.
+        inputImagePtr->image_info.raw_image.width_cols = sisWidth / 2;
+        inputImagePtr->image_info.raw_image.height_lines = sisHeight / 2;
+
+        mLtmBinParam.sParam.gridWidth = sisWidth;
+        mLtmBinParam.sParam.gridHeight = sisHeight;
+    }
+
+    updateParameter(feedback->mAiqParam, 0);
+
+    if ((!PlatformData::isEnableLtmThread(mCameraId)) || sequence == 0) {
+        AiqResultStorage *resultStorage = AiqResultStorage::getInstance(mCameraId);
+        ltm_result_t *ltmResult = resultStorage->acquireLtmResult();
+
+        runLtm(&(feedback->mAeResults), ltmResult);
+        resultStorage->updateLtmResult(sequence);
+        updateTuningData();
+    } else {
+        mLtmParams[mInputParamIndex]->sequence = sequence;
+        bool needSignal = mLtmParamsQ.empty();
+        mLtmParamsQ.push(mLtmParams[mInputParamIndex]);
+        if (needSignal) {
+            mParamAvailableSignal.signal();
+        }
+    }
+
+    return OK;
+}
+
+int Ltm::runLtm()
+{
+    LtmInputParams *inputParams = NULL;
+
+    AiqResultStorage *resultStorage = AiqResultStorage::getInstance(mCameraId);
+    ConditionLock lock(mLtmLock);
+
+    while(mLtmParamsQ.empty()) {
+        // To prevent possible dead lock during stop of ltm thread.
+        if (!mThreadRunning) {
+            LOG2("%s, ltm thread is not active, no need to wait ltm stat", __func__);
+            return OK;
+        }
+
+        mParamAvailableSignal.wait(lock);
+
+        if (!mThreadRunning) {
+            LOG2("%s, ltm thread is not active while waiting ltm stat", __func__);
+            return OK;
+        }
+    }
+
+    CheckError(mLtmParamsQ.empty(), UNKNOWN_ERROR, "Failed to get ltm input params buffers");
+    inputParams = mLtmParamsQ.front();
+    mLtmParamsQ.pop();
+    CheckError(!inputParams, OK, "%s, the inputParams is NULL", __func__);
+
+    ltm_result_t *ltmResult = resultStorage->acquireLtmResult();
+    LOG1("@%s the sequence: %ld", __func__, inputParams->sequence);
+    AiqResult *feedback = getAiqResult(inputParams->sequence);
+
+    mLtmBinParam.sequence = inputParams->sequence;
+    runLtm(&(feedback->mAeResults), ltmResult, &(inputParams->ltmParams));
+    resultStorage->updateLtmResult(inputParams->sequence);
+
+    updateTuningData();
+
+    return OK;
+}
+
+int Ltm::runLtm(ia_aiq_ae_results* aeResult, ltm_result_t *ltmResult, ia_ltm_input_params *ltmParams)
+{
+    LOG3A("%s", __func__);
+    PERF_CAMERA_ATRACE();
+
+    if (mLtmState != LTM_CONFIGURED) {
+        return OK;
+    }
+
+    ia_ltm_results *tmpLtmResults = nullptr;
+    ia_ltm_drc_params *tmpLtmDrcParams = nullptr;
+    ia_ltm_input_params *tmpLtmParams = ltmParams;
+
+    if (tmpLtmParams == NULL) {
+        tmpLtmParams = &(mLtmParams[mInputParamIndex]->ltmParams);
+    }
+
+    if (!tmpLtmParams->yv_grid) {
+        // ltm can run without Yv grid and default ltm params will be used.
+        LOGD("mYvGrid is Null.");
+    }
+    tmpLtmParams->ae_results = aeResult;
+
+    LOG3A("%s: begin running LTM", __func__);
+    ia_err iaErr;
+    {
+        PERF_CAMERA_ATRACE_PARAM1_IMAGING("ia_ltm_run", 0);
+        iaErr = mIntelLtm->run(mLtm, tmpLtmParams, &tmpLtmResults, &tmpLtmDrcParams);
+    }
+
+    int ret = AiqUtils::convertError(iaErr);
+    CheckError(ret != OK, ret, "Error running LTM: %d", ret);
+
+    LOG3A("%s: LTM GAIN = %lf", __func__, tmpLtmResults->ltm_gain);
+
+    dumpLtmDrcParams(tmpLtmDrcParams);
+    dumpLtmResultsParams(tmpLtmResults);
+
+    {
+        PERF_CAMERA_ATRACE_PARAM1("deepCopyLtmResults", 0);
+        ret = AiqUtils::deepCopyLtmResults(*tmpLtmResults, &ltmResult->ltmResults);
+    }
+    CheckError(ret != OK, ret, "Error on copying LTM results: %d", ret);
+
+    {
+        PERF_CAMERA_ATRACE_PARAM1("deepCopyLtmDRCParams", 0);
+        ret = AiqUtils::deepCopyLtmDRCParams(*tmpLtmDrcParams, &ltmResult->ltmDrcParams);
+    }
+    CheckError(ret != OK, ret, "Error on copying DRC results: %d", ret);
+
+    ltmResult->yvGridInfo.width = tmpLtmParams->yv_grid ? tmpLtmParams->yv_grid->grid_width : 0;
+    ltmResult->yvGridInfo.height = tmpLtmParams->yv_grid ? tmpLtmParams->yv_grid->grid_height : 0;
+
+    return OK;
+}
+
+int Ltm::updateTuningData()
+{
+    LOG3A("%s", __func__);
+
+    if (mLtmState != LTM_CONFIGURED) {
+        return INVALID_OPERATION;
+    }
+
+    return OK;
+}
+
+int Ltm::updateParameter(const aiq_parameter_t &param, unsigned long long timestamp)
+{
+    LOG3A("%s: frame resolution %dx%d", __func__, param.resolution.width, param.resolution.height);
+
+    mLtmParams[mInputParamIndex]->ltmParams.ev_shift = param.evShift;
+    mLtmParams[mInputParamIndex]->ltmParams.ltm_strength_manual = param.ltmStrength;
+    mLtmParams[mInputParamIndex]->ltmParams.frame_width = param.resolution.width;
+    mLtmParams[mInputParamIndex]->ltmParams.frame_height = param.resolution.height;
+
+    mLtmParams[mInputParamIndex]->gtmParams.manual_convergence_time = -1;
+
+    if (param.manualGain >= 0) {
+        mLtmParams[mInputParamIndex]->gtmParams.manual_gain = pow(10, (param.manualGain / 20));
+    } else {
+        mLtmParams[mInputParamIndex]->gtmParams.manual_gain = -1;
+    }
+    mLtmParams[mInputParamIndex]->gtmParams.frame_timestamp = timestamp;
+
+    LOG3A("%s: Ltm EV shift %f strength %d", __func__,
+            mLtmParams[mInputParamIndex]->ltmParams.ev_shift,
+            mLtmParams[mInputParamIndex]->ltmParams.ltm_strength_manual);
+    LOG3A("%s: Gtm manual gain %f, manual convergence time %f, frame timestamp %llu",
+            __func__, mLtmParams[mInputParamIndex]->gtmParams.manual_gain,
+            mLtmParams[mInputParamIndex]->gtmParams.manual_convergence_time,
+            mLtmParams[mInputParamIndex]->gtmParams.frame_timestamp);
+
+    return OK;
+}
+
+int Ltm::dumpLtmDrcParams(const ia_ltm_drc_params* ltmDrcParams)
+{
+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) return OK;
+
+    LOG3A("%s", __func__);
+
+    if (!ltmDrcParams){
+        LOG2("%s: ltmDrcParams is nullptr, and nothing to dump.", __func__);
+        return BAD_VALUE;
+    }
+
+    //Only dump first 10 values.
+    for (unsigned int i = 0; i < 10; i++) {
+       LOG3A("   LTM DRC params matrix gain %u weight %u",
+            ltmDrcParams->gain_map[i], ltmDrcParams->weight_map[i]);
+    }
+
+    return OK;
+}
+
+int Ltm::dumpLtmResultsParams(const ia_ltm_results *ltmResults)
+{
+    if (!CameraDump::isDumpTypeEnable(DUMP_LTM_OUTPUT)) return OK;
+
+    LOG3A("%s", __func__);
+
+    if (!ltmResults){
+        LOG2("%s: ltmResults is nullptr, and nothing to dump.", __func__);
+        return BAD_VALUE;
+    }
+
+    char fileName[MAX_NAME_LEN] = {'\0'};
+    snprintf(fileName, (MAX_NAME_LEN-1), "ia_ltm_luts_%ld_w_%d_h_%d.bin",
+        mLtmBinParam.sequence, mLtmBinParam.sParam.gridWidth, mLtmBinParam.sParam.gridHeight);
+
+    CameraDump::writeData(ltmResults->ltm_luts, sizeof(ltmResults->ltm_luts), fileName);
+
+    return OK;
+}
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/3a/Ltm.h b/camera/hal/intel/ipu6/src/3a/Ltm.h
new file mode 100644
index 000000000000..1f97e1975f96
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/Ltm.h
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2016-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <queue>
+#include <memory>
+
+#ifdef ENABLE_SANDBOXING
+#include "modules/sandboxing/client/IntelLtm.h"
+#else
+#include "modules/algowrapper/IntelLtm.h"
+#endif
+
+#include "CameraEvent.h"
+#include "AiqSetting.h"
+#include "AiqResult.h"
+#include "iutils/Thread.h"
+#include "iutils/CameraDump.h"
+
+namespace icamera {
+
+struct ltm_result_t {
+    ia_ltm_drc_params ltmDrcParams;
+    ia_ltm_results ltmResults;
+
+    camera_resolution_t yvGridInfo;
+
+    long sequence;
+
+    ltm_result_t() {
+        CLEAR(ltmDrcParams);
+        CLEAR(ltmResults);
+        yvGridInfo = {0, 0};
+        sequence = -1;
+    }
+};
+
+struct LtmInputParams {
+    ia_isp_bxt_hdr_yv_grid_t yvGrid;
+    ia_ltm_input_params ltmParams;
+    ia_ltm_gtm_input_params gtmParams;
+    long sequence;
+
+    LtmInputParams() {
+        CLEAR(yvGrid);
+        CLEAR(ltmParams);
+        CLEAR(gtmParams);
+        sequence = -1;
+    }
+};
+/**
+ * There are two SIS port, SIS_A is for preview.
+ * SIS_B is for still and capture.
+ */
+enum SisPort
+{
+    SIS_A = 0,
+    SIS_B,
+    MAX_SIS_NUM
+};
+
+struct SisBuffer
+{
+    SisPort sisPort;
+    ia_binary_data sisImage;
+
+    SisBuffer() {
+        sisPort = SIS_A;
+        CLEAR(sisImage);
+    }
+};
+
+struct LtmStatistics {
+    LtmStatistics(ia_isp_bxt_hdr_yv_grid_t *inputYvGrid = nullptr, long seq = -1) {
+        yvGrid = inputYvGrid;
+        sequence = seq;
+    }
+    ia_isp_bxt_hdr_yv_grid_t *yvGrid;
+    long sequence;
+};
+
+/**
+ * \class Ltm
+ * This class is used to run Local tone mapping (Ltm) algorithm.
+ */
+class Ltm : public EventListener {
+ public:
+    Ltm(int cameraId);
+    ~Ltm();
+
+    int init();
+    int deinit();
+    int start();
+    void stop();
+
+    int configure(const std::vector<ConfigMode>& configModes);
+
+    /**
+     * \brief handle statistics event
+     */
+    void handleEvent(EventData eventData);
+
+    int handleLtm(ia_isp_bxt_hdr_yv_grid_t* yvGrid,
+                  unsigned long long timestamp = 0,
+                  long sequence = 0);
+    int handleSisLtm(const std::shared_ptr<CameraBuffer> &cameraBuffer);
+ private:
+    DISALLOW_COPY_AND_ASSIGN(Ltm);
+
+    int runLtm();
+    int initLtmParams();
+    int runLtm(ia_aiq_ae_results* aeResult, ltm_result_t *ltmResult, ia_ltm_input_params *ltmParams = NULL);
+
+    int initIaLtmHandle(TuningMode tuningMode);
+    int deinitIaLtmHandle();
+
+    int updateTuningData();
+    AiqResult *getAiqResult(long sequence);
+    int updateParameter(const aiq_parameter_t &param, unsigned long long timestamp);
+
+    int dumpLtmDrcParams(const ia_ltm_drc_params* ltmDrcParams);
+    int dumpLtmResultsParams(const ia_ltm_results *ltmResults);
+
+ private:
+    /**
+     * \brief The ltm thread
+     */
+    class LtmThread: public Thread {
+        Ltm *mLtmHandle;
+        public:
+        LtmThread(Ltm *pThis)
+            : mLtmHandle(pThis) { }
+
+        virtual bool threadLoop() {
+            int ret = mLtmHandle->runLtm();
+            return (ret == 0);
+        }
+    };
+
+    int mCameraId;
+    ia_ltm *mLtm;
+    TuningMode mTuningMode;
+
+    enum LtmState {
+        LTM_NOT_INIT = 0,
+        LTM_INIT,
+        LTM_CONFIGURED,
+        LTM_MAX
+    } mLtmState;
+
+    // Use it to lock mInputParamIndex and mLtmParams
+    // And use it for thread condition lock
+    Mutex  mLtmLock;
+    LtmThread *mLtmThread;
+    bool mThreadRunning;
+    Condition mParamAvailableSignal;
+    static const nsecs_t kWaitDuration = 2000000000;  // 2000ms
+    static const int kMaxLtmParamsNum = 2;  // 2 ltm input params
+
+    int mInputParamIndex;
+    LtmInputParams *mLtmParams[kMaxLtmParamsNum];
+    std::queue<LtmInputParams *> mLtmParamsQ;
+
+    SisBuffer *mSisBuffer[kMaxLtmParamsNum];
+    BinParam_t mLtmBinParam;
+
+    std::unique_ptr<IntelLtm> mIntelLtm;
+};
+
+}  /* namespace icamera */
+
diff --git a/camera/hal/intel/ipu6/src/3a/MakerNote.cpp b/camera/hal/intel/ipu6/src/3a/MakerNote.cpp
new file mode 100644
index 000000000000..0008866d88a5
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/MakerNote.cpp
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2018-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "MakerNote"
+
+#include "src/3a/MakerNote.h"
+
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+
+std::map<int, MakerNote*> MakerNote::sInstances;
+Mutex MakerNote::sLock;
+
+MakerNote *MakerNote::getInstance(int cameraId) {
+    AutoMutex lock(sLock);
+    return getInstanceLocked(cameraId);
+}
+
+void MakerNote::releaseMakerNote(int cameraId) {
+    AutoMutex lock(sLock);
+    MakerNote* note = getInstanceLocked(cameraId);
+
+    sInstances.erase(cameraId);
+    delete note;
+}
+
+MakerNote *MakerNote::getInstanceLocked(int cameraId) {
+    if (sInstances.find(cameraId) != sInstances.end()) {
+        return sInstances[cameraId];
+    }
+
+    sInstances[cameraId] = new MakerNote();
+    LOG1("@%s, create MakerNote instance %d", __func__, cameraId);
+    return sInstances[cameraId];
+}
+
+MakerNote::MakerNote() :
+    mMknState(UNINIT),
+    mMkn(nullptr) {
+    LOG1("@%s", __func__);
+
+    for (int i = 0; i < MAX_MAKER_NOTE_LIST_SIZE; i++) {
+        std::shared_ptr<MakernoteData> data = std::shared_ptr<MakernoteData>(new MakernoteData());
+        mMakernoteDataList.push_back(data);
+    }
+
+    mMkn = mIntelMkn.init(ia_mkn_cfg_compression,
+                          MAKERNOTE_SECTION1_SIZE, MAKERNOTE_SECTION2_SIZE);
+    CheckError(mMkn == nullptr, VOID_VALUE, "@%s, Failed to init mkn", __func__);
+
+    int ret = mIntelMkn.enable(mMkn, true);
+    CheckError(ret != ia_err_none, VOID_VALUE,
+               "@%s, Failed to enable mkn ret %d", __func__, ret);
+
+    mMknState = INIT;
+}
+
+MakerNote::~MakerNote() {
+    LOG1("@%s", __func__);
+
+    AutoMutex lock(mMknLock);
+    mIntelMkn.deinit(mMkn);
+
+    mMakernoteDataList.clear();
+}
+
+int MakerNote::acquireMakernoteData(int64_t sequence, Parameters *param) {
+    LOG1("@%s", __func__);
+
+    AutoMutex lock(mMknLock);
+    CheckError(mMknState != INIT, BAD_VALUE, "@%s, mkn isn't initialized", __func__);
+    CheckError(param == nullptr, BAD_VALUE, "@%s, param is nullptr", __func__);
+
+    for (auto rit = mMakernoteDataList.rbegin(); rit != mMakernoteDataList.rend(); ++rit) {
+        if ((*rit)->sequence >= 0 && sequence >= (*rit)->sequence) {
+            LOG2("@%s, found sequence %ld for request sequence %ld", __func__,
+                 (*rit)->sequence, sequence);
+            param->setMakernoteData((*rit)->section, (*rit)->size);
+            return OK;
+        }
+    }
+
+    return UNKNOWN_ERROR;
+}
+
+int MakerNote::saveMakernoteData(camera_makernote_mode_t makernoteMode, int64_t sequence) {
+    LOG1("@%s", __func__);
+    if (makernoteMode == MAKERNOTE_MODE_OFF) return OK;
+
+    AutoMutex lock(mMknLock);
+    CheckError(mMknState != INIT, BAD_VALUE, "@%s, mkn isn't initialized", __func__);
+
+    ia_mkn_trg mknTrg = (makernoteMode == MAKERNOTE_MODE_JPEG ? ia_mkn_trg_section_1 :
+                                                                ia_mkn_trg_section_2);
+    ia_binary_data makerNote;
+    int ret = mIntelMkn.prepare(mMkn, mknTrg, &makerNote);
+    CheckError(ret != OK, UNKNOWN_ERROR, "@%s, Failed to prepare makernote", __func__);
+    CheckError((makerNote.data == nullptr), UNKNOWN_ERROR,
+               "@%s, invalid makernote data pointer", __func__);
+    CheckError(makerNote.size == 0, UNKNOWN_ERROR, "@%s, 0 size makernote data saved", __func__);
+
+    std::shared_ptr<MakernoteData> data = mMakernoteDataList.front();
+    mMakernoteDataList.pop_front();
+
+    MEMCPY_S(data->section, sizeof(char) * (MAKERNOTE_SECTION1_SIZE + MAKERNOTE_SECTION2_SIZE),
+             makerNote.data, makerNote.size);
+
+    data->size = makerNote.size;
+    data->sequence = sequence;
+    LOG2("@%s, saved makernote %d for sequence %ld", __func__, makernoteMode, sequence);
+
+    mMakernoteDataList.push_back(data);
+    return OK;
+}
+
+ia_mkn *MakerNote::getMknHandle() {
+    LOG1("@%s", __func__);
+    AutoMutex lock(mMknLock);
+    CheckError(mMknState != INIT, nullptr, "@%s, mkn isn't initialized", __func__);
+
+    return mMkn;
+}
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/3a/MakerNote.h b/camera/hal/intel/ipu6/src/3a/MakerNote.h
new file mode 100644
index 000000000000..9aac30499592
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/MakerNote.h
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2018-2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <map>
+#include <list>
+#include <memory>
+
+#ifdef ENABLE_SANDBOXING
+#include "modules/sandboxing/client/IntelMkn.h"
+#else
+#include "modules/algowrapper/IntelMkn.h"
+#endif
+
+#include "iutils/Utils.h"
+#include "iutils/Thread.h"
+#include "Parameters.h"
+
+namespace icamera {
+
+struct MakernoteData {
+    int64_t sequence;
+    unsigned int size;
+    char section[MAKERNOTE_SECTION1_SIZE + MAKERNOTE_SECTION2_SIZE];
+
+    MakernoteData() {
+        sequence = -1;
+        size = 0;
+        CLEAR(section);
+    }
+};
+
+/**
+ * \class MakerNote
+ *
+ * This class encapsulates Intel Makernotes function, and provides interface
+ * for enabling and acquiring Makenotes which is called by AiqEngine, Ltm
+ * and AiqPlus.
+ *
+ * It's a singleton based on camera id, and its life cycle can  be maintained
+ * by its static methods getInstance and releaseMakerNote.
+ */
+class MakerNote {
+ public:
+    /**
+     * \brief Get instance for cameraId.
+     *
+     * param[in] int camera id.
+     *
+     * return the instance of MakerNote for cameraId.
+     */
+    static MakerNote *getInstance(int cameraId);
+
+    /**
+     * \brief Release the static instance of MakerNote for cameraId.
+     */
+    static void releaseMakerNote(int cameraId);
+
+    /**
+     * \brief acquire Makernote data.
+     *
+     * param[in] int64_t sequence: the sequence in frame buffer;
+     * param[out] param: Makernote data will be saved in Parameters as metadata.
+     *
+     * return OK if acquire Makernote successfully, otherwise return ERROR.
+     */
+    int acquireMakernoteData(int64_t sequence, Parameters *param);
+
+    /**
+     * \brief Save Makernote by ia_mkn_trg mode
+     *
+     * param[in] camera_makernote_mode_t: MAKERNOTE_MODE_JPEG is corresponding
+     *           to ia_mkn_trg_section_1 for Normal Jpeg capture;
+     *           MAKERNOTE_MODE_RAW is corresponding to ia_mkn_trg_section_2
+     *           for Raw image capture.
+     * param[in] int64_t sequence: the sequence in latest AiqResult
+     *
+     * return OK if get Makernote successfully, otherwise return ERROR.
+     */
+    int saveMakernoteData(camera_makernote_mode_t makernoteMode, int64_t sequence);
+
+    /**
+     * \brief Get ia_mkn (Makernote) handle.
+     */
+    ia_mkn *getMknHandle();
+
+ private:
+    MakerNote();
+    ~MakerNote();
+
+    static MakerNote *getInstanceLocked(int cameraId);
+
+ private:
+    // Should > max request number in processing
+    static const int MAX_MAKER_NOTE_LIST_SIZE = 10;
+
+    enum MknState {
+        UNINIT,
+        INIT
+    } mMknState;
+
+    static std::map<int, MakerNote*> sInstances;
+    // Guard for singleton creation
+    static Mutex sLock;
+
+    // Guard for MakerNote API
+    Mutex mMknLock;
+    ia_mkn *mMkn;
+
+    IntelMkn mIntelMkn;
+
+    std::list<std::shared_ptr<MakernoteData>> mMakernoteDataList;
+};
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/3a/SensorManager.cpp b/camera/hal/intel/ipu6/src/3a/SensorManager.cpp
new file mode 100644
index 000000000000..1abd08dcdab7
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/SensorManager.cpp
@@ -0,0 +1,327 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "SensorManager"
+
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+
+#include "AiqUtils.h"
+#include "SensorManager.h"
+#include "PlatformData.h"
+
+using std::vector;
+
+namespace icamera {
+
+SensorManager::SensorManager(int cameraId, SensorHwCtrl *sensorHw) :
+    mCameraId(cameraId),
+    mSensorHwCtrl(sensorHw),
+    mModeSwitched(false),
+    mPerframeControl(false),
+    mLastSofSequence(-1),
+    mGainDelay(0),
+    mSensorExposureHistoryIndex(-1)
+{
+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
+
+    CLEAR(mWdrModeSetting);
+
+    if (PlatformData::getGainLag(mCameraId) > 0) {
+        mGainDelay = PlatformData::getExposureLag(mCameraId) - PlatformData::getGainLag(mCameraId);
+    }
+}
+
+SensorManager::~SensorManager()
+{
+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
+}
+
+int SensorManager::init()
+{
+    AutoMutex l(mLock);
+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
+
+    mSensorExposures.reserve(kMaxSensorExposures);
+    reset();
+    return OK;
+}
+
+int SensorManager::deinit()
+{
+    AutoMutex l(mLock);
+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
+
+    return OK;
+}
+
+void SensorManager::reset()
+{
+    mPerframeControl = false,
+    mLastSofSequence = -1;
+
+    mModeSwitched = false;
+
+    for (int i = 0; i < kMaxExposureHistory; i++) {
+        mSensorExposureHistory[i].clear();
+    }
+
+    mSensorExposureHistoryIndex = -1;
+
+    CLEAR(mWdrModeSetting);
+    mWdrModeSetting.tuningMode = TUNING_MODE_MAX;
+
+    mSofEventInfo.clear();
+}
+
+EventListener *SensorManager::getSofEventListener()
+{
+    AutoMutex l(mLock);
+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
+
+    return this;
+}
+
+void SensorManager::handleEvent(EventData eventData)
+{
+    AutoMutex l(mLock);
+    LOG3A("@%s", __func__);
+
+    if (eventData.type == EVENT_ISYS_SOF) {
+        LOG3A("sequence = %ld, timestamp = %ld",
+                eventData.data.sync.sequence,
+                TIMEVAL2USECS(eventData.data.sync.timestamp));
+        handleSensorExposure();
+        mLastSofSequence = eventData.data.sync.sequence;
+
+        SofEventInfo info;
+        info.sequence = eventData.data.sync.sequence;
+        info.timestamp = ((long)eventData.data.sync.timestamp.tv_sec) * 1000000
+                         + eventData.data.sync.timestamp.tv_usec;
+        if (mSofEventInfo.size() >= kMaxSofEventInfo) {
+            mSofEventInfo.erase(mSofEventInfo.begin());
+        }
+        mSofEventInfo.push_back(info);
+    }
+}
+
+uint64_t SensorManager::getSofTimestamp(long sequence)
+{
+    AutoMutex l(mLock);
+
+    for (auto info : mSofEventInfo) {
+        if (info.sequence == sequence) {
+            return info.timestamp;
+        }
+    }
+    return 0;
+}
+
+void SensorManager::handleSensorExposure()
+{
+    if (!mSensorExposures.empty()) {
+        SensorExpGroup& exposures = mSensorExposures[0];
+        setFrameDuration(exposures[0].sensorParam.line_length_pixels, exposures[0].sensorParam.frame_length_lines);
+        setSensorExposureAndGains(exposures);
+        mSensorExposures.erase(mSensorExposures.begin());
+    } else {
+        if (mGainDelay > 0 && mSensorExposureHistoryIndex >= mGainDelay) {
+            // If gain setting is postponed, set last gain setting to sensor driver
+            int index = mSensorExposureHistoryIndex % kMaxExposureHistory;
+            setSensorGains(index);
+        }
+        mPerframeControl = false;
+    }
+}
+
+int SensorManager::getCurrentExposureAppliedDelay()
+{
+    AutoMutex l(mLock);
+
+    return mSensorExposures.size() + PlatformData::getExposureLag(mCameraId);
+}
+
+uint32_t SensorManager::updateSensorExposure(SensorExpGroup sensorExposures, bool useSof)
+{
+    AutoMutex l(mLock);
+
+    long appliedSeq = mLastSofSequence < 0 ? 0 : \
+                      mLastSofSequence + PlatformData::getExposureLag(mCameraId);
+
+    if (sensorExposures.empty()) {
+        LOGW("%s: No exposure parameter", __func__);
+        return ((uint32_t)appliedSeq);
+    }
+
+    if (useSof) {
+        mSensorExposures.push_back(sensorExposures);
+        mPerframeControl = true;
+        appliedSeq += mSensorExposures.size();
+    } else if (PlatformData::isIsysEnabled(mCameraId)
+               && !mPerframeControl) {
+        setFrameDuration(sensorExposures[0].sensorParam.line_length_pixels, sensorExposures[0].sensorParam.frame_length_lines);
+        setSensorExposureAndGains(sensorExposures);
+    }
+
+    LOG3A("@%s, useSof:%d, mLastSofSequence:%ld, appliedSeq %ld", __func__, useSof,
+           mLastSofSequence, appliedSeq);
+    return ((uint32_t)appliedSeq);
+}
+
+void SensorManager::setSensorExposureAndGains(SensorExpGroup sensorExposures)
+{
+    mSensorExposureHistoryIndex++;
+    mSensorExposureHistory[mSensorExposureHistoryIndex % kMaxExposureHistory] = sensorExposures;
+
+    vector<int> coarseExposures;
+    vector<int> fineExposures;
+    for (auto exp : sensorExposures) {
+        coarseExposures.push_back(exp.sensorParam.coarse_integration_time);
+        fineExposures.push_back(exp.sensorParam.fine_integration_time);
+    }
+    mSensorHwCtrl->setExposure(coarseExposures, fineExposures);
+
+    int64_t index = mSensorExposureHistoryIndex % kMaxExposureHistory;
+
+    // If exposure and gain lag are different, gain setting need to be postponed.
+    if (mGainDelay > 0 && mSensorExposureHistoryIndex >= mGainDelay) {
+        index = (mSensorExposureHistoryIndex - mGainDelay) % kMaxExposureHistory;
+    }
+
+    setSensorGains(index);
+}
+
+void SensorManager::setSensorGains(int index)
+{
+    vector<int> analogGains;
+    vector<int> digitalGains;
+    for (auto exp : mSensorExposureHistory[index]) {
+        analogGains.push_back(exp.sensorParam.analog_gain_code_global);
+
+        int digitalGain = exp.sensorParam.digital_gain_global;
+        if (PlatformData::isUsingIspDigitalGain(mCameraId)) {
+            digitalGain = PlatformData::getSensorDigitalGain(mCameraId, exp.realDigitalGain);
+        }
+        digitalGains.push_back(digitalGain);
+    }
+
+    mSensorHwCtrl->setGains(analogGains, digitalGains);
+}
+
+int SensorManager::setFrameDuration(int lineLengthPixels, int frameLengthLines)
+{
+    return mSensorHwCtrl->setFrameDuration(lineLengthPixels, frameLengthLines);
+}
+
+int SensorManager::setFrameRate(float fps)
+{
+    return mSensorHwCtrl->setFrameRate(fps);
+}
+
+int SensorManager::getSensorInfo(ia_aiq_frame_params &frameParams,
+                                 ia_aiq_exposure_sensor_descriptor &sensorDescriptor)
+{
+    LOG3A("@%s", __func__);
+    SensorFrameParams sensorFrameParams;
+    CLEAR(sensorFrameParams);
+
+    int ret = PlatformData::calculateFrameParams(mCameraId, sensorFrameParams);
+    if (ret == OK) {
+        AiqUtils::convertToAiqFrameParam(sensorFrameParams, frameParams);
+    }
+
+    if (!PlatformData::isIsysEnabled(mCameraId)) {
+        vector <camera_resolution_t> res;
+        PlatformData::getSupportedISysSizes(mCameraId, res);
+
+        CheckError(res.empty(), BAD_VALUE, "Supported ISYS resolutions are not configured.");
+        // In none-ISYS cases, only take 30 fps into account.
+        int fps = 30;
+        float freq = res[0].width * res[0].height * fps / 1000000;
+        sensorDescriptor = {freq, static_cast<unsigned short>(res[0].width),
+                            static_cast<unsigned short>(res[0].height), 24, 0,
+                            static_cast<unsigned short>(res[0].width), 6, 0};
+        LOG3A("freq %f, width %d, height %d", freq, res[0].width, res[0].height);
+        return OK;
+    }
+
+    ret |= getSensorModeData(sensorDescriptor);
+
+    LOG3A("ia_aiq_frame_params=[%d, %d, %d, %d, %d, %d, %d, %d]",
+        frameParams.horizontal_crop_offset,
+        frameParams.vertical_crop_offset,
+        frameParams.cropped_image_height,
+        frameParams.cropped_image_width,
+        frameParams.horizontal_scaling_numerator,
+        frameParams.horizontal_scaling_denominator,
+        frameParams.vertical_scaling_numerator,
+        frameParams.vertical_scaling_denominator);
+
+    LOG3A("ia_aiq_exposure_sensor_descriptor=[%f, %d, %d, %d, %d, %d, %d, %d]",
+        sensorDescriptor.pixel_clock_freq_mhz,
+        sensorDescriptor.pixel_periods_per_line,
+        sensorDescriptor.line_periods_per_field,
+        sensorDescriptor.line_periods_vertical_blanking,
+        sensorDescriptor.coarse_integration_time_min,
+        sensorDescriptor.coarse_integration_time_max_margin,
+        sensorDescriptor.fine_integration_time_min,
+        sensorDescriptor.fine_integration_time_max_margin);
+
+    return ret;
+}
+
+/**
+ * get sensor mode data (sensor descriptor) from sensor driver
+ *
+ * \return OK if successfully.
+ */
+int SensorManager::getSensorModeData(ia_aiq_exposure_sensor_descriptor& sensorData)
+{
+    int pixel = 0;
+    int status =  mSensorHwCtrl->getPixelRate(pixel);
+    CheckError(status != OK, status, "Failed to get pixel clock ret:%d", status);
+    sensorData.pixel_clock_freq_mhz = (float)pixel / 1000000;
+
+    int width = 0, height = 0, pixelCode = 0;
+    status = mSensorHwCtrl->getActivePixelArraySize(width, height, pixelCode);
+    CheckError(status != OK, status, "Failed to get active pixel array size ret:%d", status);
+
+    int pixel_periods_per_line, line_periods_per_field;
+    status = mSensorHwCtrl->getFrameDuration(pixel_periods_per_line, line_periods_per_field);
+    CheckError(status != OK, status, "Failed to get frame Durations ret:%d", status);
+
+    sensorData.pixel_periods_per_line = CLIP(pixel_periods_per_line, USHRT_MAX, 0);
+    sensorData.line_periods_per_field = CLIP(line_periods_per_field, USHRT_MAX, 0);
+
+    int coarse_int_time_min, integration_step = 0, integration_max = 0;
+    status = mSensorHwCtrl->getExposureRange(coarse_int_time_min, integration_max, integration_step);
+    CheckError(status != OK, status, "Failed to get Exposure Range ret:%d", status);
+
+    sensorData.coarse_integration_time_min = CLIP(coarse_int_time_min, USHRT_MAX, 0);
+    sensorData.coarse_integration_time_max_margin = PlatformData::getCITMaxMargin(mCameraId);
+
+    // fine integration is not supported by v4l2
+    sensorData.fine_integration_time_min = 0;
+    sensorData.fine_integration_time_max_margin = sensorData.pixel_periods_per_line;
+    int vblank;
+    status = mSensorHwCtrl->getVBlank(vblank);
+    CheckError(status != OK, status, "Failed to get vblank ret:%d", status);
+    sensorData.line_periods_vertical_blanking = CLIP(vblank, USHRT_MAX, 0);
+
+    return OK;
+}
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/3a/SensorManager.h b/camera/hal/intel/ipu6/src/3a/SensorManager.h
new file mode 100644
index 000000000000..bb42a306ffd3
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/SensorManager.h
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2015-2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "iutils/Thread.h"
+
+#include "ia_aiq.h"
+
+#include "CameraEvent.h"
+#include "SensorHwCtrl.h"
+
+namespace icamera {
+
+/*
+ * \struct WdrModeSetting
+ *
+ * This struct is used to control wdr mode switching.
+ */
+typedef struct {
+    long sequence;
+    TuningMode tuningMode;
+} WdrModeSetting;
+
+typedef struct {
+    unsigned short realDigitalGain;
+    ia_aiq_exposure_sensor_parameters sensorParam;
+} SensorExposure;
+
+typedef struct {
+    long sequence;
+    uint64_t timestamp;
+} SofEventInfo;
+
+typedef std::vector <SensorExposure> SensorExpGroup;
+/*
+ * \class SensorManager
+ *
+ * This class is used to control exposure and gain synchronization mechanism
+ * and get some sensor info.
+ */
+class SensorManager : public EventListener {
+
+public:
+    SensorManager(int cameraId, SensorHwCtrl *sensorHw);
+    ~SensorManager();
+
+    int init();
+    int deinit();
+    void reset();
+
+    // get EventListener
+    EventListener *getSofEventListener();
+
+    void handleEvent(EventData eventData);
+    uint32_t updateSensorExposure(SensorExpGroup sensorExposures, bool useSof = true);
+    int getSensorInfo(ia_aiq_frame_params &frameParams,
+                      ia_aiq_exposure_sensor_descriptor &sensorDescriptor);
+
+    int setFrameRate(float fps);
+    int getCurrentExposureAppliedDelay();
+    uint64_t getSofTimestamp(long sequence);
+private:
+    DISALLOW_COPY_AND_ASSIGN(SensorManager);
+
+    void handleSensorExposure();
+    int getSensorModeData(ia_aiq_exposure_sensor_descriptor& sensorData);
+    void setSensorExposureAndGains(SensorExpGroup sensorExposures);
+    int setFrameDuration(int lineLengthPixels, int frameLengthLines);
+    void setSensorGains(int index);
+
+private:
+    static const int kMaxSensorExposures = 10;
+    static const int kMaxExposureHistory = 5;
+    static const int kMaxSofEventInfo = 10;
+
+    int mCameraId;
+    SensorHwCtrl *mSensorHwCtrl;
+
+    bool    mModeSwitched;         // Whether the TuningMode get updated
+    WdrModeSetting mWdrModeSetting;
+
+    bool mPerframeControl;
+    std::vector<SensorExpGroup> mSensorExposures;
+
+    long mLastSofSequence;
+
+    // Guard for SensorManager public API.
+    Mutex mLock;
+
+    int mGainDelay;
+    SensorExpGroup mSensorExposureHistory[kMaxExposureHistory];
+    int64_t mSensorExposureHistoryIndex;
+
+    std::vector<SofEventInfo> mSofEventInfo;
+};
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.cpp b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.cpp
new file mode 100644
index 000000000000..2c1b76461d9f
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.cpp
@@ -0,0 +1,694 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "Intel3AParameter"
+
+#include <cmath>
+#include <climits>
+
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+
+#include "Intel3AParameter.h"
+#include "AiqUtils.h"
+
+namespace icamera {
+
+Intel3AParameter::Intel3AParameter(int cameraId) :
+    mCameraId(cameraId),
+    mUseManualAwbGain(false),
+    mWeightGridMode(WEIGHT_GRID_AUTO),
+    mAePerTicks(1),
+    mAwbPerTicks(1),
+    mAfForceLock(false),
+    mDuringAfTriggerScan(false)
+{
+    LOG3A("%s", __func__);
+
+    CLEAR(mAeParams);
+    CLEAR(mAfParams);
+    CLEAR(mAwbParams);
+
+    CLEAR(mManualGains);
+    CLEAR(mAwbGainShift);
+
+    CLEAR(mSensorDescriptor);
+    CLEAR(mExposureWindow);
+    CLEAR(mExposureCoordinate);
+    CLEAR(mAeFeatures);
+    CLEAR(mAeManualLimits);
+    CLEAR(mManualFocusParams);
+    CLEAR(mFocusRect);
+    CLEAR(mManualCctRange);
+    CLEAR(mManualWhiteCoordinate);
+
+    CLEAR(mManualExposureTimeUs);
+    CLEAR(mManualAnalogGain);
+    CLEAR(mManualIso);
+    mAfTrigger = AF_TRIGGER_IDLE;
+    mAfMode = AF_MODE_OFF;
+}
+
+Intel3AParameter::~Intel3AParameter()
+{
+    LOG3A("%s", __func__);
+}
+
+int Intel3AParameter::init()
+{
+    LOG3A("%s", __func__);
+
+    mAeParams.sensor_descriptor = &mSensorDescriptor;
+    mAeParams.exposure_window = &mExposureWindow;
+    mAeParams.exposure_coordinate = &mExposureCoordinate;
+    mAeParams.aec_features = &mAeFeatures;
+    mAeParams.manual_limits = &mAeManualLimits;
+
+    mAfParams.focus_rect = &mFocusRect;
+    mAfParams.manual_focus_parameters = &mManualFocusParams;
+
+    mAwbParams.manual_cct_range = &mManualCctRange;
+    mAwbParams.manual_white_coordinate = &mManualWhiteCoordinate;
+
+    // set default params
+    initAeParameter();
+    initAfParameter();
+    initAwbParameter();
+
+    mUseManualAwbGain = false;
+    mWeightGridMode = WEIGHT_GRID_AUTO;
+    mAePerTicks = 1;
+    mAwbPerTicks = 1;
+
+    mAfMode = AF_MODE_AUTO;
+    mAfForceLock = false;
+    mAfTrigger = AF_TRIGGER_IDLE;
+    mDuringAfTriggerScan = false;
+    return OK;
+}
+
+void Intel3AParameter::initAeParameter()
+{
+    mAeParams.num_exposures = 1;
+    mAeParams.frame_use = ia_aiq_frame_use_video;
+    mAeParams.flash_mode = ia_aiq_flash_mode_off;
+    mAeParams.operation_mode = ia_aiq_ae_operation_mode_automatic;
+    mAeParams.metering_mode = ia_aiq_ae_metering_mode_evaluative;
+    mAeParams.priority_mode = ia_aiq_ae_priority_mode_normal;
+    mAeParams.flicker_reduction_mode = ia_aiq_ae_flicker_reduction_auto;
+    mAeParams.ev_shift = 0.0f;
+    mAeParams.manual_exposure_time_us = nullptr;
+    mAeParams.manual_analog_gain = nullptr;
+    mAeParams.manual_iso = nullptr;
+
+    mAeParams.exposure_window = nullptr;
+    mAeParams.exposure_coordinate = nullptr;
+    mAeParams.aec_features = nullptr;
+    mAeParams.manual_convergence_time = -1;
+    mAeParams.exposure_distribution_priority = ia_aiq_ae_exposure_distribution_auto;
+}
+
+void Intel3AParameter::initAfParameter()
+{
+    mAfParams.frame_use = ia_aiq_frame_use_video;
+    mAfParams.lens_position = 0;
+    mAfParams.lens_movement_start_timestamp = 0;
+    mAfParams.focus_mode = ia_aiq_af_operation_mode_infinity;
+    mAfParams.focus_range = ia_aiq_af_range_extended;
+    mAfParams.focus_metering_mode = ia_aiq_af_metering_mode_auto;
+    mAfParams.flash_mode = ia_aiq_flash_mode_off;
+    mAfParams.focus_rect = &mFocusRect;
+    mAfParams.focus_rect->left = 0;
+    mAfParams.focus_rect->top = 0;
+    mAfParams.focus_rect->right = 0;
+    mAfParams.focus_rect->bottom = 0;
+    mAfParams.manual_focus_parameters = &mManualFocusParams;
+    mAfParams.manual_focus_parameters->manual_focus_action = ia_aiq_manual_focus_action_none;
+    mAfParams.manual_focus_parameters->manual_focus_distance = MAX_FOCUS_DISTANCE;
+    mAfParams.manual_focus_parameters->manual_lens_position = 0;
+    mAfParams.trigger_new_search = false;
+}
+
+void Intel3AParameter::initAwbParameter()
+{
+    mAwbParams.frame_use = ia_aiq_frame_use_video;
+    mAwbParams.scene_mode = ia_aiq_awb_operation_mode_auto;
+    mAwbParams.manual_convergence_time = -1;
+
+    mUseManualAwbGain = false;
+    CLEAR(mManualGains);
+    CLEAR(mAwbGainShift);
+}
+
+int Intel3AParameter::setSensorInfo(ia_aiq_exposure_sensor_descriptor descriptor)
+{
+    LOG3A("%s", __func__);
+
+    mSensorDescriptor.pixel_clock_freq_mhz = descriptor.pixel_clock_freq_mhz;
+    mSensorDescriptor.pixel_periods_per_line = descriptor.pixel_periods_per_line;
+    mSensorDescriptor.line_periods_per_field = descriptor.line_periods_per_field;
+    mSensorDescriptor.line_periods_vertical_blanking = descriptor.line_periods_vertical_blanking;
+    mSensorDescriptor.fine_integration_time_min = descriptor.fine_integration_time_min;
+    mSensorDescriptor.fine_integration_time_max_margin = descriptor.fine_integration_time_max_margin;
+    mSensorDescriptor.coarse_integration_time_min = descriptor.coarse_integration_time_min;
+    mSensorDescriptor.coarse_integration_time_max_margin = descriptor.coarse_integration_time_max_margin;
+
+    return OK;
+}
+
+int Intel3AParameter::updateParameter(aiq_parameter_t param)
+{
+    LOG3A("%s", __func__);
+
+    updateAeParameter(param);
+    updateAwbParameter(param);
+    updateAfParameter(param);
+
+    return OK;
+}
+
+/**
+ * Override ae result by those settings provided by application
+ */
+void Intel3AParameter::updateAeResult(ia_aiq_ae_results* aeResult)
+{
+    CheckError(!aeResult || !aeResult->weight_grid, VOID_VALUE, "Invalid aeResult");
+
+}
+
+float Intel3AParameter::convertdBGainToISO(float sensitivityGain, int baseIso)
+{
+    // Convert db Gain to ISO
+    float manualGain = pow(10, (sensitivityGain / 20));
+    manualGain *= baseIso;
+    return manualGain;
+}
+
+void Intel3AParameter::setAeManualLimits(const aiq_parameter_t& param)
+{
+    mAeParams.manual_limits = &mAeManualLimits;
+
+    mAeManualLimits.manual_exposure_time_max = -1;
+    mAeManualLimits.manual_exposure_time_min = -1;
+    mAeManualLimits.manual_iso_min = -1;
+    mAeManualLimits.manual_iso_max = -1;
+
+    if (param.fps > 0.01) {
+        mAeManualLimits.manual_frame_time_us_max = 1000000 / param.fps;
+        mAeManualLimits.manual_frame_time_us_min = 1000000 / param.fps;
+    }
+
+    if (param.exposureTimeRange.min > 0 && param.exposureTimeRange.max >= param.exposureTimeRange.min) {
+        camera_range_t etRange;
+        CLEAR(etRange);
+        if (PlatformData::getSupportAeExposureTimeRange(mCameraId, param.sceneMode, etRange) == OK) {
+            etRange.min = CLIP(param.exposureTimeRange.min, etRange.max, etRange.min);
+            etRange.max = CLIP(param.exposureTimeRange.max, etRange.max, etRange.min);
+        } else {
+            etRange.min = param.exposureTimeRange.min;
+            etRange.max = param.exposureTimeRange.max;
+        }
+        mAeManualLimits.manual_exposure_time_min = etRange.min;
+        mAeManualLimits.manual_exposure_time_max = etRange.max;
+    }
+
+    if (param.sensitivityGainRange.min >= 0
+        && param.sensitivityGainRange.max >= param.sensitivityGainRange.min) {
+        camera_range_t range;
+        CLEAR(range);
+        range.min = param.sensitivityGainRange.min;
+        range.max = param.sensitivityGainRange.max;
+
+        camera_range_t gainRange;
+        CLEAR(gainRange);
+        if (PlatformData::getSupportAeGainRange(mCameraId, param.sceneMode, gainRange) == OK) {
+            range.min = CLIP(range.min, gainRange.max, gainRange.min);
+            range.max = CLIP(range.max, gainRange.max, gainRange.min);
+        }
+
+        CpfStore* cpf = PlatformData::getCpfStore(mCameraId);
+        if (cpf) {
+            ia_binary_data aiqData;
+            ia_cmc_t *cmc = nullptr;
+            int ret = cpf->getDataAndCmc(nullptr, &aiqData, nullptr,
+                                         nullptr, param.tuningMode, &cmc);
+            if (ret == OK) {
+                if (cmc != nullptr && cmc->cmc_sensitivity != nullptr) {
+                    float isoMin = convertdBGainToISO(range.min, cmc->cmc_sensitivity->base_iso);
+                    float isoMax = convertdBGainToISO(range.max, cmc->cmc_sensitivity->base_iso);
+                    if (isoMin <= INT_MAX && isoMax <= INT_MAX) {
+                        mAeManualLimits.manual_iso_min = static_cast<int>(isoMin);
+                        mAeManualLimits.manual_iso_max = static_cast<int>(isoMax);
+                    } else {
+                        LOGW("ISO limits out of short range, isoMin %f, isoMax %f",
+                             isoMin, isoMax);
+                    }
+                }
+            }
+        }
+    }
+
+    LOG3A("%s, manual limited ISO-[%d--%d], expo-[%d--%d], frame time-[%d--%d]", __func__,
+          mAeManualLimits.manual_iso_min, mAeManualLimits.manual_iso_max,
+          mAeManualLimits.manual_exposure_time_min, mAeManualLimits.manual_exposure_time_max,
+          mAeManualLimits.manual_frame_time_us_min, mAeManualLimits.manual_frame_time_us_max);
+}
+
+void Intel3AParameter::setManualExposure(const aiq_parameter_t& param)
+{
+    int64_t manualExpTimeUs = param.manualExpTimeUs;
+    if (manualExpTimeUs <= 0 || param.aeDistributionPriority == DISTRIBUTION_ISO) {
+        return;
+    }
+
+    camera_range_t etRange;
+    CLEAR(etRange);
+    if (PlatformData::getSupportAeExposureTimeRange(mCameraId, param.sceneMode, etRange) == OK) {
+         manualExpTimeUs = CLIP(manualExpTimeUs, etRange.max, etRange.min);
+    }
+
+    mAeParams.manual_exposure_time_us = mManualExposureTimeUs;
+    for (unsigned int i = 0; i < mAeParams.num_exposures - 1; i++) {
+        mAeParams.manual_exposure_time_us[i] = -1;
+    }
+    mAeParams.manual_exposure_time_us[mAeParams.num_exposures - 1] = manualExpTimeUs;
+    LOG3A("%s, manual exposure %ld", __func__, manualExpTimeUs);
+}
+
+void Intel3AParameter::setManualGain(const aiq_parameter_t& param)
+{
+    float manualGain = param.manualGain;
+    if (manualGain < 0 || param.aeDistributionPriority == DISTRIBUTION_SHUTTER) {
+        return;
+    }
+
+    camera_range_t gainRange;
+    CLEAR(gainRange);
+    if (PlatformData::getSupportAeGainRange(mCameraId, param.sceneMode, gainRange) == OK) {
+        manualGain = CLIP(manualGain, gainRange.max, gainRange.min);
+    }
+
+    mAeParams.manual_analog_gain = mManualAnalogGain;
+    // Convert db to sensor analog gain.
+    for (unsigned int i = 0; i < mAeParams.num_exposures; i++) {
+        mAeParams.manual_analog_gain[i] = pow(10, (manualGain / 20));
+    }
+    LOG3A("%s, manual gain %f, AG %f", __func__, manualGain, mManualAnalogGain[0]);
+}
+
+void Intel3AParameter::updateAeParameter(const aiq_parameter_t& param)
+{
+    mAeParams.frame_use = AiqUtils::convertFrameUsageToIaFrameUsage(param.frameUsage);
+    mAeParams.num_exposures = PlatformData::getExposureNum(mCameraId,
+                                  CameraUtils::isMultiExposureCase(param.tuningMode));
+    setAeManualLimits(param);
+
+    switch(param.antibandingMode) {
+        case ANTIBANDING_MODE_AUTO:
+            mAeParams.flicker_reduction_mode = ia_aiq_ae_flicker_reduction_auto;
+            break;
+        case ANTIBANDING_MODE_50HZ:
+            mAeParams.flicker_reduction_mode = ia_aiq_ae_flicker_reduction_50hz;
+            break;
+        case ANTIBANDING_MODE_60HZ:
+            mAeParams.flicker_reduction_mode = ia_aiq_ae_flicker_reduction_60hz;
+            break;
+        case ANTIBANDING_MODE_OFF:
+            mAeParams.flicker_reduction_mode = ia_aiq_ae_flicker_reduction_off;
+            break;
+    }
+
+    switch (param.aeDistributionPriority) {
+        case DISTRIBUTION_AUTO:
+            mAeParams.exposure_distribution_priority = ia_aiq_ae_exposure_distribution_auto;
+            break;
+        case DISTRIBUTION_SHUTTER:
+            mAeParams.exposure_distribution_priority = ia_aiq_ae_exposure_distribution_shutter;
+            break;
+        case DISTRIBUTION_ISO:
+            mAeParams.exposure_distribution_priority = ia_aiq_ae_exposure_distribution_iso;
+            break;
+        case DISTRIBUTION_APERTURE:
+            mAeParams.exposure_distribution_priority = ia_aiq_ae_exposure_distribution_aperture;
+            break;
+        default:
+            mAeParams.exposure_distribution_priority = ia_aiq_ae_exposure_distribution_auto;
+            break;
+    }
+
+    mAeParams.manual_exposure_time_us = nullptr;
+    mAeParams.manual_analog_gain = nullptr;
+
+    if (param.aeMode == AE_MODE_MANUAL) {
+        setManualGain(param);
+        setManualExposure(param);
+    }
+
+    mAeParams.ev_shift = param.evShift;
+
+    if (param.aeConvergeSpeedMode == CONVERGE_SPEED_MODE_AIQ) {
+        mAePerTicks = 1;
+
+        mAeParams.manual_convergence_time = AiqUtils::convertSpeedModeToTime(param.aeConvergeSpeed);
+    } else {
+        mAeParams.manual_convergence_time = -1;
+
+        /*
+         * The unit of mAePerTicks is frame count, 3 means 3 frames.
+         * The default value can be changed based on customer requirement.
+         */
+        switch (param.aeConvergeSpeed) {
+            case CONVERGE_MID:
+                mAePerTicks = 30;
+                break;
+            case CONVERGE_LOW:
+                mAePerTicks = 60;
+                break;
+            case CONVERGE_NORMAL:
+            default:
+                mAePerTicks = 1;
+                break;
+        }
+    }
+
+    mAeParams.exposure_coordinate = nullptr;
+    if (param.blcAreaMode == BLC_AREA_MODE_ON && !param.aeRegions.empty()) {
+        // Current only one AE metering window is supported, so use the latest one
+        camera_window_t window = param.aeRegions.back();
+
+        if (window.right > window.left && window.bottom > window.top) {
+            camera_coordinate_t coordinate;
+            CLEAR(coordinate);
+            coordinate.x = window.left + (window.right - window.left) / 2;
+            coordinate.y = window.top + (window.bottom - window.top) / 2;
+            camera_coordinate_system_t frameCoord = {0, 0, param.resolution.width, param.resolution.height};
+            LOG3A("%s: frame resolution %dx%d", __func__, param.resolution.width, param.resolution.height);
+
+            coordinate = AiqUtils::convertToIaCoordinate(frameCoord, coordinate);
+            mExposureCoordinate.x = coordinate.x;
+            mExposureCoordinate.y = coordinate.y;
+            mAeParams.exposure_coordinate = &mExposureCoordinate;
+            LOG3A("%s, exposure coordinate = [%d,%d], region = [%d,%d,%d,%d]", __func__,
+                    mAeParams.exposure_coordinate->x, mAeParams.exposure_coordinate->y,
+                    window.left, window.top, window.right, window.bottom);
+        }
+    }
+}
+
+/**
+ * Override awb result by AWB gains or gain shift provided by application
+ */
+void Intel3AParameter::updateAwbResult(ia_aiq_awb_results* awbResult)
+{
+    CheckError((awbResult == nullptr), VOID_VALUE, "No Awb result provided.");
+
+    camera_awb_gains_t& gains = mUseManualAwbGain ? mManualGains : mAwbGainShift;
+    float normalizedR = AiqUtils::normalizeAwbGain(gains.r_gain);
+    float normalizedG = AiqUtils::normalizeAwbGain(gains.g_gain);
+    float normalizedB = AiqUtils::normalizeAwbGain(gains.b_gain);
+
+    const float MAX_PER_G = AWB_GAIN_NORMALIZED_START / AWB_GAIN_NORMALIZED_END;
+    const float MIN_PER_G = 1.0 / MAX_PER_G;
+
+    if (mUseManualAwbGain) {
+        awbResult->accurate_b_per_g = CLIP((normalizedB / normalizedG), MAX_PER_G, MIN_PER_G);
+        awbResult->accurate_r_per_g = CLIP((normalizedR / normalizedG), MAX_PER_G, MIN_PER_G);
+    } else {
+        awbResult->accurate_b_per_g *= CLIP((normalizedB / normalizedG), MAX_PER_G, MIN_PER_G);
+        awbResult->accurate_r_per_g *= CLIP((normalizedR / normalizedG), MAX_PER_G, MIN_PER_G);
+    }
+
+    //Only override final results when manual gain or gain shift applied.
+    if (mUseManualAwbGain || gains.r_gain != 0 || gains.g_gain != 0
+        || gains.b_gain != 0) {
+        LOG3A("%s: override final awb results", __func__);
+        awbResult->final_b_per_g = awbResult->accurate_b_per_g;
+        awbResult->final_r_per_g = awbResult->accurate_r_per_g;
+    }
+
+    LOG3A("%s (r,g,b): (%d,%d,%d) -> (b/g, r/g): (%f,%f)",
+          mUseManualAwbGain ? "Manual gain" : "Gain shift",
+          gains.r_gain, gains.g_gain, gains.b_gain,
+          awbResult->accurate_b_per_g, awbResult->accurate_r_per_g);
+}
+
+void Intel3AParameter::updateAwbParameter(const aiq_parameter_t& param)
+{
+    mAwbParams.frame_use = AiqUtils::convertFrameUsageToIaFrameUsage(param.frameUsage);
+
+    switch (param.awbMode) {
+        case AWB_MODE_INCANDESCENT:
+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_incandescent;
+            break;
+
+        case AWB_MODE_FLUORESCENT:
+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_fluorescent;
+            break;
+
+        case AWB_MODE_DAYLIGHT:
+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_daylight;
+            break;
+
+        case AWB_MODE_FULL_OVERCAST:
+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_fully_overcast;
+            break;
+
+        case AWB_MODE_PARTLY_OVERCAST:
+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_partly_overcast;
+            break;
+
+        case AWB_MODE_SUNSET:
+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_sunset;
+            break;
+
+        case AWB_MODE_VIDEO_CONFERENCE:
+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_video_conference;
+            break;
+
+        case AWB_MODE_MANUAL_CCT_RANGE:
+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_manual_cct_range;
+            mManualCctRange.min_cct = std::min(param.cctRange.min, param.cctRange.max);
+            mManualCctRange.max_cct = std::max(param.cctRange.min, param.cctRange.max);
+            mAwbParams.manual_cct_range = &mManualCctRange;
+            break;
+
+        case AWB_MODE_MANUAL_WHITE_POINT:
+        {
+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_manual_white;
+            mAwbParams.manual_white_coordinate = &mManualWhiteCoordinate;
+            camera_coordinate_system_t frameCoord = {0, 0, param.resolution.width, param.resolution.height};
+            LOG3A("%s: frame resolution %dx%d", __func__, param.resolution.width, param.resolution.height);
+            camera_coordinate_t iaCoord = AiqUtils::convertToIaCoordinate(frameCoord, param.whitePoint);
+
+            mManualWhiteCoordinate.x = iaCoord.x;
+            mManualWhiteCoordinate.y = iaCoord.y;
+            break;
+        }
+        case AWB_MODE_MANUAL_GAIN:
+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_auto;
+            mManualGains = param.awbManualGain;
+            break;
+
+        default:
+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_auto;
+            break;
+    }
+
+    mUseManualAwbGain = (param.awbMode == AWB_MODE_MANUAL_GAIN);
+    mAwbGainShift = param.awbGainShift;
+
+    if (param.awbConvergeSpeedMode == CONVERGE_SPEED_MODE_AIQ) {
+        mAwbPerTicks = 1;
+
+        mAwbParams.manual_convergence_time = AiqUtils::convertSpeedModeToTime(param.awbConvergeSpeed);
+    } else {
+        mAwbParams.manual_convergence_time = -1;
+
+        /*
+         * The unit of mAePerTicks is frame count, 3 means 3 frames.
+         * The default value can be changed based on customer requirement.
+         */
+        switch (param.aeConvergeSpeed) {
+            case CONVERGE_MID:
+                mAwbPerTicks = 30;
+                break;
+            case CONVERGE_LOW:
+                mAwbPerTicks = 60;
+                break;
+            case CONVERGE_NORMAL:
+            default:
+                mAwbPerTicks = 1;
+                break;
+        }
+    }
+}
+
+void Intel3AParameter::updateAfParameter(const aiq_parameter_t& param)
+{
+    mAfParams.lens_position = param.lensPosition;
+    mAfParams.lens_movement_start_timestamp = param.lensMovementStartTimestamp;
+
+    LOG3A("%s, Focus position %d, timestamp %llu, afMode %d", __func__, param.lensPosition,
+            param.lensMovementStartTimestamp, param.afMode);
+
+    // Mode
+    if (mAfMode != param.afMode) {
+        // Reset af parameter
+        initAfParameter();
+
+        mAfMode = param.afMode;
+        if (mAfMode == AF_MODE_CONTINUOUS_PICTURE
+            || mAfMode == AF_MODE_CONTINUOUS_VIDEO) {
+            mAfParams.focus_mode = ia_aiq_af_operation_mode_auto;
+        }
+        mAfTrigger = AF_TRIGGER_IDLE;
+        mAfForceLock = false;
+        mDuringAfTriggerScan = false;
+    }
+    mAfParams.frame_use = AiqUtils::convertFrameUsageToIaFrameUsage(param.frameUsage);
+
+    // Trigger
+    mAfParams.trigger_new_search = false;
+    if (mAfTrigger != AF_TRIGGER_START && param.afTrigger == AF_TRIGGER_START) {
+        LOG3A("%s: Trigger AF scan, mode %d", __func__, mAfMode);
+        updateAfParameterForAfTriggerStart();
+    } else if (mAfTrigger != AF_TRIGGER_CANCEL && param.afTrigger == AF_TRIGGER_CANCEL) {
+        LOG3A("%s: Cancel AF scan, mode %d", __func__, mAfMode);
+        updateAfParameterForAfTriggerCancel();
+    }
+    mAfTrigger = param.afTrigger;
+
+    // Region
+    mAfParams.focus_rect = nullptr;
+    if (!param.afRegions.empty()) {
+        // Current only one AF metering window is supported, so use the latest one
+        camera_window_t window = param.afRegions.back();
+        if (window.right > window.left && window.bottom > window.top) {
+            camera_coordinate_system_t frameCoord = {0, 0, param.resolution.width, param.resolution.height};
+            window = AiqUtils::convertToIaWindow(frameCoord, window);
+            mFocusRect.left   = window.left;
+            mFocusRect.top    = window.top;
+            mFocusRect.right  = window.right;
+            mFocusRect.bottom = window.bottom;
+            mAfParams.focus_rect = &mFocusRect;
+            LOG3A("%s, af region = [%d,%d, %d, %d], window = [%d,%d,%d,%d]", __func__,
+                    mFocusRect.left, mFocusRect.top, mFocusRect.right, mFocusRect.bottom,
+                    window.left, window.top, window.right, window.bottom);
+        }
+    }
+
+    // Manual lens position
+    if (mAfMode == AF_MODE_OFF) {
+        mAfParams.manual_focus_parameters = &mManualFocusParams;
+        mAfParams.focus_mode = ia_aiq_af_operation_mode_manual;
+        mAfParams.focus_range = ia_aiq_af_range_extended;
+        mAfParams.focus_metering_mode = ia_aiq_af_metering_mode_auto;
+
+        // Set AIQ manual action to 'none' by default
+        mAfParams.manual_focus_parameters->manual_focus_action = ia_aiq_manual_focus_action_none;
+
+        // The focusDistance value from app is diopters, so the focusInMm = 1 / focusDistance
+        // Clamp focus distance between [0.0, minFocusDistance].
+        float focusDistance = param.focusDistance;
+        if (focusDistance > param.minFocusDistance) {
+            focusDistance = param.minFocusDistance;
+        } else if (focusDistance < 0.0f) {
+            focusDistance = 0.0f;
+        }
+
+        unsigned focusInMm = 0;
+        if (focusDistance != 0.0f) {
+            focusInMm = 1000 * (1.0f / focusDistance);
+            mAfParams.manual_focus_parameters->manual_focus_action =
+                ia_aiq_manual_focus_action_set_distance;
+        } else {
+            // 0.0f focus distance means infinity
+            mAfParams.focus_mode = ia_aiq_af_operation_mode_infinity;
+        }
+
+        mAfParams.manual_focus_parameters->manual_focus_distance = focusInMm;
+    } else {
+        mAfParams.manual_focus_parameters = nullptr;
+    }
+
+    LOG3A("%s, afForceLock %d, duringAfTriggerScan %d", __func__, mAfForceLock, mDuringAfTriggerScan);
+}
+
+void Intel3AParameter::updateAfParameterForAfTriggerStart()
+{
+    mDuringAfTriggerScan = true;
+    mAfForceLock = false;
+
+    switch (mAfMode) {
+        case AF_MODE_AUTO:
+        case AF_MODE_MACRO:
+            // Start user af scan in this frame.
+            mAfParams.frame_use = ia_aiq_frame_use_still;
+            mAfParams.focus_mode = ia_aiq_af_operation_mode_auto;
+            mAfParams.trigger_new_search = true;
+            break;
+        case AF_MODE_CONTINUOUS_VIDEO:
+            // Lock AF immediately
+            mAfForceLock = true;
+            break;
+        case AF_MODE_CONTINUOUS_PICTURE:
+            // Continue the current scan and check the af result later
+            break;
+        default:
+            break;
+    }
+}
+
+void Intel3AParameter::updateAfParameterForAfTriggerCancel()
+{
+    mDuringAfTriggerScan = false;
+    mAfForceLock = false;
+
+    switch (mAfMode) {
+        case AF_MODE_AUTO:
+        case AF_MODE_MACRO:
+            // Stop AF scan triggered by user.
+            mAfParams.focus_mode = ia_aiq_af_operation_mode_infinity;
+            break;
+        default:
+            break;
+    }
+}
+
+void Intel3AParameter::fillAfTriggerResult(ia_aiq_af_results *afResults)
+{
+    if (!afResults || !mAfForceLock) {
+        return;
+    }
+
+    // Check the result of autofocus triggered by user
+    switch (mAfMode) {
+        case AF_MODE_CONTINUOUS_PICTURE:
+        case AF_MODE_AUTO:
+        case AF_MODE_MACRO:
+            // Lock AF after current scan
+            mAfForceLock = (afResults->status != ia_aiq_af_status_local_search
+                          && afResults->status != ia_aiq_af_status_extended_search);
+            break;
+        default:
+            break;
+    }
+
+    LOG3A("%s, %d update afForceLock %d", __func__, afResults->status, mAfForceLock);
+}
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.h b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.h
new file mode 100644
index 000000000000..3e42003a9805
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2015-2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "ia_aiq.h"
+
+#include "AiqSetting.h"
+#include "AiqUtils.h"
+
+namespace icamera {
+
+/*
+ * \class Intel3AParameter
+ * This class is used to prepare those parameters for
+ * 3A running.
+ */
+class Intel3AParameter {
+
+public:
+    Intel3AParameter(int cameraId);
+    ~Intel3AParameter();
+
+    int init();
+    int setSensorInfo(ia_aiq_exposure_sensor_descriptor descriptor);
+    int updateParameter(aiq_parameter_t param);
+    void updateAeResult(ia_aiq_ae_results* aeResult);
+    void updateAwbResult(ia_aiq_awb_results* awbResult);
+
+    void fillAfTriggerResult(ia_aiq_af_results *afResults);
+
+private:
+    void initAeParameter();
+    void initAfParameter();
+    void initAwbParameter();
+
+    void updateAeParameter(const aiq_parameter_t& param);
+    void updateAwbParameter(const aiq_parameter_t& param);
+    void updateAfParameter(const aiq_parameter_t& param);
+    void updateAfParameterForAfTriggerStart();
+    void updateAfParameterForAfTriggerCancel();
+
+    float convertdBGainToISO(float sensitivityGain, int baseIso);
+    void setManualExposure(const aiq_parameter_t& param);
+    void setManualGain(const aiq_parameter_t& param);
+    void setAeManualLimits(const aiq_parameter_t& param);
+public:
+    int mCameraId;
+    // aiq 3a parameters
+    ia_aiq_ae_input_params  mAeParams;
+    ia_aiq_af_input_params  mAfParams;
+    ia_aiq_awb_input_params mAwbParams;
+
+    bool mUseManualAwbGain;
+    camera_awb_gains_t mManualGains;
+    camera_awb_gains_t mAwbGainShift;
+    camera_weight_grid_mode_t mWeightGridMode;
+
+    int mAePerTicks;
+    int mAwbPerTicks;
+
+    bool mAfForceLock; // Lock AF to respond autofocus action triggered by user.
+private:
+    static const int MAX_FOCUS_DISTANCE = 5000; // unit is mm
+
+    /*!< ia_aiq_ae_input_params pointer contents */
+    ia_aiq_exposure_sensor_descriptor mSensorDescriptor;
+    ia_rectangle mExposureWindow;
+    ia_coordinate mExposureCoordinate;
+    ia_aiq_ae_features mAeFeatures;
+    ia_aiq_ae_manual_limits mAeManualLimits;
+
+    /*!< ia_aiq_af_input_params pointer contents */
+    ia_aiq_manual_focus_parameters mManualFocusParams;
+    ia_rectangle mFocusRect;
+
+    /*!< ia_aiq_awb_input_params pointer contents */
+    ia_aiq_awb_manual_cct_range mManualCctRange;
+    ia_coordinate mManualWhiteCoordinate;
+
+    long mManualExposureTimeUs[MAX_EXPOSURES_NUM];
+    float mManualAnalogGain[MAX_EXPOSURES_NUM];
+    short mManualIso[MAX_EXPOSURES_NUM];
+
+    camera_af_mode_t mAfMode;
+    camera_af_trigger_t mAfTrigger;
+    bool mDuringAfTriggerScan;
+};
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AResult.cpp b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AResult.cpp
new file mode 100644
index 000000000000..03fbf117fe83
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AResult.cpp
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2015-2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "Intel3AResult"
+
+#include "Intel3AResult.h"
+
+#include <string.h>
+
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+
+#include "AiqUtils.h"
+
+namespace icamera {
+
+Intel3AResult::Intel3AResult()
+{
+    LOG3A("@%s", __func__);
+}
+
+Intel3AResult::~Intel3AResult()
+{
+    LOG3A("@%s", __func__);
+}
+
+int Intel3AResult::deepCopyAeResults(const ia_aiq_ae_results &src, ia_aiq_ae_results *dst)
+{
+    dumpAeResults(src);
+    return AiqUtils::deepCopyAeResults(src, dst);
+}
+
+int Intel3AResult::deepCopyAfResults(const ia_aiq_af_results &src, ia_aiq_af_results *dst)
+{
+    dumpAfResults(src);
+    return AiqUtils::deepCopyAfResults(src, dst);
+}
+
+int Intel3AResult::deepCopyAwbResults(const ia_aiq_awb_results &src, ia_aiq_awb_results *dst)
+{
+    dumpAwbResults(src);
+    return AiqUtils::deepCopyAwbResults(src, dst);
+}
+
+int Intel3AResult::dumpAeResults(const ia_aiq_ae_results &aeResult)
+{
+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) {
+        return OK;
+    }
+
+    LOG3A("@%s", __func__);
+
+    if (aeResult.exposures) {
+        for (unsigned int i = 0; i < aeResult.num_exposures; i++) {
+            if (aeResult.exposures[i].exposure) {
+                LOG3A(" AE exp[%d] result ag %2.1f dg %2.1f Fn %2.1f exp time %dus total %d filter[%s] iso %d", i,
+                        aeResult.exposures[i].exposure->analog_gain,
+                        aeResult.exposures[i].exposure->digital_gain,
+                        aeResult.exposures[i].exposure->aperture_fn,
+                        aeResult.exposures[i].exposure->exposure_time_us,
+                        aeResult.exposures[i].exposure->total_target_exposure,
+                        aeResult.exposures[i].exposure->nd_filter_enabled? "YES": "NO",
+                        aeResult.exposures[i].exposure->iso);
+            }
+            if (aeResult.exposures[i].sensor_exposure) {
+                LOG3A(" AE sensor exp[%d] result ag %d dg %d coarse: %d fine: %d llp:%d fll:%d", i,
+                        aeResult.exposures[i].sensor_exposure->analog_gain_code_global,
+                        aeResult.exposures[i].sensor_exposure->digital_gain_global,
+                        aeResult.exposures[i].sensor_exposure->coarse_integration_time,
+                        aeResult.exposures[i].sensor_exposure->fine_integration_time,
+                        aeResult.exposures[i].sensor_exposure->line_length_pixels,
+                        aeResult.exposures[i].sensor_exposure->frame_length_lines);
+            }
+            LOG3A(" AE Converged : %s", aeResult.exposures[i].converged ? "YES" : "NO");
+        }
+    } else {
+        LOGE("nullptr in StatsInputParams->frame_ae_parameters->exposures");
+    }
+    LOG3A(" AE bracket mode = %d %s", aeResult.multiframe,
+               aeResult.multiframe == ia_aiq_bracket_mode_ull ? "ULL" : "none-ULL");
+
+    if (aeResult.weight_grid && aeResult.weight_grid->width != 0 &&  aeResult.weight_grid->height != 0) {
+        LOG3A(" AE weight grid = [%dx%d]", aeResult.weight_grid->width, aeResult.weight_grid->height);
+        if (aeResult.weight_grid->weights) {
+            for (int i = 0; i < 5 && i < aeResult.weight_grid->height; i++) {
+                LOG3A(" AE weight_grid[%d] = %d ", aeResult.weight_grid->width/2,
+                        aeResult.weight_grid->weights[aeResult.weight_grid->width/2]);
+            }
+        }
+    }
+
+    if (aeResult.aperture_control) {
+        LOG3A(" AE aperture fn = %f, iris command = %d, code = %d", aeResult.aperture_control->aperture_fn,
+                   aeResult.aperture_control->dc_iris_command, aeResult.aperture_control->code);
+    }
+
+    return OK;
+}
+
+int Intel3AResult::dumpAfResults(const ia_aiq_af_results &afResult)
+{
+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) {
+        return OK;
+    }
+
+    LOG3A("@%s", __func__);
+
+    LOG3A("AF results current_focus_distance %d final_position_reached %s",
+                afResult.current_focus_distance,
+                afResult.final_lens_position_reached ? "TRUE":"FALSE");
+    LOG3A("AF results driver_action %d, next_lens_position %d",
+                afResult.lens_driver_action,
+                afResult.next_lens_position);
+    LOG3A("AF results use_af_assist %s",
+          afResult.use_af_assist? "TRUE":"FALSE");
+
+    switch (afResult.status) {
+    case ia_aiq_af_status_local_search:
+        LOG3A("AF result state _local_search");
+        break;
+    case ia_aiq_af_status_extended_search:
+        LOG3A("AF result state extended_search");
+        break;
+    case ia_aiq_af_status_success:
+        LOG3A("AF state success");
+        break;
+    case ia_aiq_af_status_fail:
+        LOG3A("AF state fail");
+        break;
+    case ia_aiq_af_status_idle:
+    default:
+        LOG3A("AF state idle");
+    }
+
+    return OK;
+}
+
+int Intel3AResult::dumpAwbResults(const ia_aiq_awb_results &awbResult)
+{
+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) {
+        return OK;
+    }
+
+    LOG3A("@%s", __func__);
+
+    LOG3A("AWB result: accurate_r/g %f, accurate_b/g %f final_r/g %f final_b/g %f",
+            awbResult.accurate_r_per_g,
+            awbResult.accurate_b_per_g,
+            awbResult.final_r_per_g,
+            awbResult.final_b_per_g);
+    LOG3A("AWB result: cct_estimate %d, distance_from_convergence %f",
+            awbResult.cct_estimate,
+            awbResult.distance_from_convergence);
+
+    return OK;
+}
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AResult.h b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AResult.h
new file mode 100644
index 000000000000..54366f2ce300
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AResult.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2015-2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "ia_aiq.h"
+
+namespace icamera {
+
+/*
+ * \class Intel3AResult
+ * This class is used to do result conversion and result dumping.
+ * It is an example for third party 3A.
+ */
+class Intel3AResult {
+
+public:
+    Intel3AResult();
+    ~Intel3AResult();
+
+    int deepCopyAeResults(const ia_aiq_ae_results &src, ia_aiq_ae_results *dst);
+    int deepCopyAfResults(const ia_aiq_af_results &src, ia_aiq_af_results *dst);
+    int deepCopyAwbResults(const ia_aiq_awb_results &src, ia_aiq_awb_results *dst);
+
+private:
+    int dumpAeResults(const ia_aiq_ae_results &aeResult);
+    int dumpAfResults(const ia_aiq_af_results &afResult);
+    int dumpAwbResults(const ia_aiq_awb_results &awbResult);
+
+};
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/core/BufferQueue.cpp b/camera/hal/intel/ipu6/src/core/BufferQueue.cpp
new file mode 100644
index 000000000000..32c160e46074
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/BufferQueue.cpp
@@ -0,0 +1,286 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "BufferQueue"
+
+#include "iutils/CameraLog.h"
+
+#include "BufferQueue.h"
+#include "PlatformData.h"
+
+namespace icamera {
+
+BufferProducer::BufferProducer(int memType) : mMemType(memType)
+{
+    LOG1("@%s BufferProducer created mMemType: %d", __func__, mMemType);
+}
+
+BufferQueue::BufferQueue() : mBufferProducer(nullptr),
+                             mProcessThread(nullptr),
+                             mThreadRunning(false)
+{
+    LOG1("@%s BufferQueue created", __func__);
+}
+
+BufferQueue::~BufferQueue()
+{
+    LOG1("@%s BufferQueue destroyed", __func__);
+}
+
+int BufferQueue::queueInputBuffer(Port port, const std::shared_ptr<CameraBuffer> &camBuffer)
+{
+    // If it's not in mInputQueue, then it's not for this processor.
+    if (mInputQueue.find(port) == mInputQueue.end()) {
+        return OK;
+    }
+
+    LOG2("%s CameraBuffer %p for port:%d", __func__, camBuffer.get(), port);
+
+    CameraBufQ &input = mInputQueue[port];
+    bool needSignal = input.empty();
+    input.push(camBuffer);
+    if (needSignal) {
+        mFrameAvailableSignal.signal();
+    }
+
+    LOG2("%s Exit", __func__);
+    return OK;
+}
+
+int BufferQueue::onFrameAvailable(Port port, const std::shared_ptr<CameraBuffer> &camBuffer)
+{
+    AutoMutex l(mBufferQueueLock);
+
+    return queueInputBuffer(port, camBuffer);
+}
+
+void BufferQueue::setBufferProducer(BufferProducer *producer)
+{
+    LOG1("%s producer %p", __func__, producer);
+
+    AutoMutex l(mBufferQueueLock);
+    mBufferProducer = producer;
+
+    if (producer == nullptr)
+        return;
+
+    mBufferProducer->addFrameAvailableListener(this);
+}
+
+void BufferQueue::addFrameAvailableListener(BufferConsumer *listener)
+{
+    LOG1("%s listener %p", __func__, listener);
+    AutoMutex   l(mBufferQueueLock);
+    bool isAlreadyAdded = false;
+    for (auto& consumer : mBufferConsumerList) {
+        if (consumer == listener) {
+            isAlreadyAdded = true;
+            break;
+        }
+    }
+
+    // If the listener has been already added, then we don't register it again.
+    if (isAlreadyAdded) {
+        return;
+    }
+    mBufferConsumerList.push_back(listener);
+}
+
+void BufferQueue::removeFrameAvailableListener(BufferConsumer *listener)
+{
+    LOG1("%s listener %p", __func__, listener);
+    AutoMutex   l(mBufferQueueLock);
+
+    for (auto it = mBufferConsumerList.begin(); it != mBufferConsumerList.end(); ++it) {
+        if ((*it) == listener) {
+            mBufferConsumerList.erase(it);
+            break;
+        }
+    }
+}
+
+int BufferQueue::qbuf(Port port, const std::shared_ptr<CameraBuffer> &camBuffer)
+{
+    LOG2("%s CameraBuffer %p for port:%d", __func__, camBuffer.get(), port);
+
+    //Enqueue buffer to internal pool
+    AutoMutex   l(mBufferQueueLock);
+    if (camBuffer != nullptr && camBuffer->getStreamType() == CAMERA_STREAM_INPUT) {
+        return queueInputBuffer(port, camBuffer);
+    }
+
+    if (mOutputQueue.find(port) == mOutputQueue.end()) {
+        LOGE("Not supported port:%d", port);
+        return BAD_VALUE;
+    }
+
+    CameraBufQ &output = mOutputQueue[port];
+    bool needSignal = output.empty();
+    output.push(camBuffer);
+    if (needSignal) {
+        mOutputAvailableSignal.signal();
+    }
+
+    return OK;
+}
+
+void BufferQueue::clearBufferQueues()
+{
+    AutoMutex l(mBufferQueueLock);
+
+    mInputQueue.clear();
+    for (const auto& input : mInputFrameInfo) {
+        mInputQueue[input.first] = CameraBufQ();
+    }
+
+    mOutputQueue.clear();
+    for (const auto& output : mOutputFrameInfo) {
+        mOutputQueue[output.first] = CameraBufQ();
+    }
+}
+
+void BufferQueue::setFrameInfo(const std::map<Port, stream_t>& inputInfo,
+                               const std::map<Port, stream_t>& outputInfo)
+{
+    mInputFrameInfo = inputInfo;
+    mOutputFrameInfo = outputInfo;
+
+    clearBufferQueues();
+}
+
+void BufferQueue::getFrameInfo(std::map<Port, stream_t>& inputInfo,
+                               std::map<Port, stream_t>& outputInfo) const
+{
+    inputInfo = mInputFrameInfo;
+    outputInfo = mOutputFrameInfo;
+}
+
+int BufferQueue::waitFreeBuffersInQueue(ConditionLock& lock,
+                                        std::map<Port, std::shared_ptr<CameraBuffer> > &cInBuffer,
+                                        std::map<Port, std::shared_ptr<CameraBuffer> > &cOutBuffer,
+                                        int64_t timeout)
+{
+    LOG2("@%s start waiting the input and output buffers", __func__);
+
+    if (!mThreadRunning) {
+        LOG1("@%s: Processor is not active.", __func__);
+        return OK;
+    }
+
+    int ret = OK;
+    timeout = (timeout ? timeout : kWaitDuration) * SLOWLY_MULTIPLIER;
+
+    for (auto& input: mInputQueue) {
+        Port port = input.first;
+        CameraBufQ &inputQueue = input.second;
+        while (inputQueue.empty()) {
+            LOG2("%s: wait input port %d", __func__, port);
+            ret = mFrameAvailableSignal.waitRelative(lock, timeout);
+
+            // Thread was stopped during wait
+            if (!mThreadRunning) {
+                LOG1("@%s: Processor is not active while waiting for input buffers", __func__);
+                return OK;
+            }
+
+            if (ret == TIMED_OUT) {
+                return ret;
+            }
+        }
+        // Wake up from the buffer available
+        cInBuffer[port] = inputQueue.front();
+    }
+
+    for (auto& output: mOutputQueue) {
+        Port port = output.first;
+        CameraBufQ &outputQueue = output.second;
+        while (outputQueue.empty()) {
+            LOG2("%s: wait output port %d", __func__, port);
+            ret = mOutputAvailableSignal.waitRelative(lock, timeout);
+
+            // Thread was stopped during wait
+            if (!mThreadRunning) {
+                LOG1("@%s: Processor is not active while waiting for output buffers.", __func__);
+                return OK;
+            }
+
+            if (ret == TIMED_OUT) {
+                return ret;
+            }
+        }
+
+        cOutBuffer[port] = outputQueue.front();
+    }
+
+    return ret;
+}
+
+int BufferQueue::allocProducerBuffers(int camId, int bufNum)
+{
+    LOG1("%s: buffer queue size %d", __func__, bufNum);
+
+    mInternalBuffers.clear();
+
+    CheckError(!mBufferProducer, BAD_VALUE ,"@%s: Buffer Producer is nullptr", __func__);
+
+    for (const auto& item : mInputFrameInfo) {
+        Port port = item.first;
+        int srcFmt = item.second.format;
+        int srcWidth = item.second.width;
+        int srcHeight = item.second.height;
+
+        LOG1("%s fmt:%s (%dx%d)", __func__,
+             CameraUtils::format2string(srcFmt).c_str(), srcWidth, srcHeight);
+
+        int32_t size = 0;
+        bool isISYSCompression = PlatformData::getISYSCompression(camId);
+        if (isISYSCompression)
+            size = CameraUtils::getFrameSize(srcFmt, srcWidth, srcHeight, false, true, true);
+        else
+            size = CameraUtils::getFrameSize(srcFmt, srcWidth, srcHeight);
+        int memType = mBufferProducer->getMemoryType();
+
+        for (int i = 0; i < bufNum; i++) {
+            std::shared_ptr<CameraBuffer> camBuffer;
+            switch (memType) {
+            case V4L2_MEMORY_USERPTR:
+                camBuffer = CameraBuffer::create(camId, BUFFER_USAGE_PSYS_INPUT, V4L2_MEMORY_USERPTR,
+                                                 size, i, srcFmt, srcWidth, srcHeight);
+                CheckError(!camBuffer, NO_MEMORY, "Allocate producer userptr buffer failed");
+                break;
+
+            case V4L2_MEMORY_MMAP:
+                camBuffer = std::make_shared<CameraBuffer>(camId, BUFFER_USAGE_PSYS_INPUT,
+                                                      V4L2_MEMORY_MMAP, size, i, srcFmt);
+                CheckError(!camBuffer, NO_MEMORY, "Allocate producer mmap buffer failed");
+                camBuffer->setUserBufferInfo(srcFmt, srcWidth, srcHeight);
+                mBufferProducer->allocateMemory(port, camBuffer);
+                break;
+
+            default:
+                LOGE("Not supported v4l2 memory type:%d", memType);
+                return BAD_VALUE;
+            }
+
+            mInternalBuffers[port].push_back(camBuffer);
+            mBufferProducer->qbuf(port, camBuffer);
+        }
+    }
+
+    return OK;
+}
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/BufferQueue.h b/camera/hal/intel/ipu6/src/core/BufferQueue.h
new file mode 100644
index 000000000000..a8ab5d337688
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/BufferQueue.h
@@ -0,0 +1,206 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <map>
+#include <vector>
+#include "iutils/Thread.h"
+#include "iutils/Errors.h"
+
+#include "CameraEvent.h"
+#include "CameraBuffer.h"
+
+/**
+ * These are the abstract Classes for buffer communication between different class of HAL
+ */
+namespace icamera {
+
+class BufferProducer;
+
+/**
+ * BufferConsumer listens on the onFrameAvailable event from the producer by
+ * calling setBufferProducer
+ */
+class BufferConsumer {
+public:
+    virtual ~BufferConsumer() {};
+    virtual int onFrameAvailable(Port port, const std::shared_ptr<CameraBuffer> &camBuffer) = 0;
+    virtual void setBufferProducer(BufferProducer *producer) = 0;
+};
+
+/**
+ * BufferProcuder get the buffers from consumer by "qbuf".
+ * Notfiy the consumer by calling the onFramAvaible interface of consumer.
+ * The consumer must be registered by "addFrameAvailableListener" before getting
+ * any buffer done notification.
+ */
+class BufferProducer : public EventSource {
+public:
+    BufferProducer(int memType = V4L2_MEMORY_USERPTR);
+    virtual ~BufferProducer() {};
+    virtual int qbuf(Port port, const std::shared_ptr<CameraBuffer> &camBuffer) = 0;
+    virtual int allocateMemory(Port port, const std::shared_ptr<CameraBuffer> &camBuffer) = 0;
+    virtual void addFrameAvailableListener(BufferConsumer *listener) = 0;
+    virtual void removeFrameAvailableListener(BufferConsumer *listener) = 0;
+    int getMemoryType(void) const {return mMemType;}
+
+private:
+    int mMemType;
+};
+
+class BufferQueue: public BufferConsumer, public BufferProducer, public EventListener {
+public:
+    BufferQueue();
+    virtual ~BufferQueue();
+
+    /**
+     * \brief the notify when poll one frame buffer
+     *
+     * Push the CameraBuffer to InputQueue and send a signal if needed
+     */
+    virtual int onFrameAvailable(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
+
+    /**
+     * \brief Register the BufferProducer
+     *
+     * Register the BufferProducer: Psys, software, or captureUnit
+     */
+    virtual void setBufferProducer(BufferProducer *producer);
+
+    /**
+     * \brief Queue one buffer to producer
+     *
+     * Push this buffer to output queue
+     */
+    virtual int qbuf(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
+
+    /**
+     * \brief allocate memory
+     *
+     * Not support this function in Psys and SWProcessor
+     */
+    virtual int allocateMemory(Port port,
+                               const std::shared_ptr<CameraBuffer> &camBuffer) { return -1; }
+
+    /**
+     * \brief Add the get frame listener
+     */
+    virtual void addFrameAvailableListener(BufferConsumer *listener);
+
+    /**
+     * \brief Remove the get frame listener
+     */
+    virtual void removeFrameAvailableListener(BufferConsumer *listener);
+
+    /**
+     * \brief Set all frames configuration
+     *
+     * Must be called before configure which needs use frame configuration.
+     */
+    virtual void setFrameInfo(const std::map<Port, stream_t>& inputInfo,
+                              const std::map<Port, stream_t>& outputInfo);
+
+    /*
+     * \brief Get all frames configuration
+     */
+    virtual void getFrameInfo(std::map<Port, stream_t>& inputInfo,
+                              std::map<Port, stream_t>& outputInfo) const;
+
+    /**
+     * \brief Register user buffers to processor(PSys)
+     */
+    virtual int registerUserOutputBufs(Port port,
+            const std::shared_ptr<CameraBuffer> &camBuffer) { return OK; }
+
+    /**
+     * \brief Common Interface
+     */
+    virtual int start() = 0;
+    virtual void stop() = 0;
+    virtual int setParameters(const Parameters& param) { return OK; }
+    virtual int getParameters(Parameters& param) { return OK; }
+    virtual int configure(const std::vector<ConfigMode>& configModes) { return OK; }
+
+protected:
+    virtual int processNewFrame() = 0;
+
+    /**
+     * \brief Clear and initialize input and output buffer queues.
+     */
+    void clearBufferQueues();
+    /**
+     * \brief Wait for available input and output buffers.
+     *
+     * Only fetch buffer from the buffer queue, need pop buffer from
+     * the queue after the buffer is used, and need to be protected by mBufferQueueLock.
+     */
+    int waitFreeBuffersInQueue(ConditionLock& lock,
+                               std::map<Port, std::shared_ptr<CameraBuffer> > &cInBuffer,
+                               std::map<Port, std::shared_ptr<CameraBuffer> > &cOutBuffer,
+                               int64_t timeout = 0);
+    /**
+     * \brief Buffers allocation for producer
+     */
+    int allocProducerBuffers(int camId, int bufNum);
+
+protected:
+    /**
+     * \brief The process new frame buffer thread
+     *
+     * Use this thread listen to the input queue and output queue.
+     * And do process if these two queues are not empty
+     */
+    class ProcessThread: public Thread {
+        BufferQueue *mProcessor;
+        public:
+            ProcessThread(BufferQueue *p)
+                : mProcessor(p) { }
+
+            virtual bool threadLoop() {
+                int ret = mProcessor->processNewFrame();
+                return (ret == 0);
+            }
+    };
+    static const nsecs_t kWaitDuration = 10000000000; //10000ms
+
+    BufferProducer *mBufferProducer;
+    std::vector<BufferConsumer*> mBufferConsumerList;
+
+    std::map<Port, stream_t> mInputFrameInfo;
+    std::map<Port, stream_t> mOutputFrameInfo;
+
+    std::map<Port, CameraBufQ> mInputQueue;
+    std::map<Port, CameraBufQ> mOutputQueue;
+
+    // For internal buffers allocation for producer
+    std::map<Port, CameraBufVector> mInternalBuffers;
+
+    // Guard for BufferQueue public API
+    Mutex  mBufferQueueLock;
+    Condition mFrameAvailableSignal;
+    Condition mOutputAvailableSignal;
+
+    //for the thread loop
+    ProcessThread* mProcessThread;
+    bool mThreadRunning;   //state of the processor. true after start and false after stop
+
+private:
+    int queueInputBuffer(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
+
+};
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/CameraBuffer.cpp b/camera/hal/intel/ipu6/src/core/CameraBuffer.cpp
new file mode 100644
index 000000000000..a272944edeba
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/CameraBuffer.cpp
@@ -0,0 +1,401 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "CameraBuffer"
+
+#include <sys/mman.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <vector>
+
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+
+#include "PlatformData.h"
+#include "CameraBuffer.h"
+
+namespace icamera {
+CameraBuffer::CameraBuffer(int cameraId, int usage, int memory, uint32_t size, int index, int format) :
+    mNumPlanes(1),
+    mAllocatedMemory(false),
+    mU(nullptr),
+    mBufferUsage(usage),
+    mSettingSequence(-1)
+
+{
+    v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+    int num_plane = 1;
+
+    LOG1("%s: construct CameraBuffer with cameraId:%d, usage:%d, memory:%d, size:%d, format:%d, index:%d",
+         __func__, cameraId, usage, memory, size, format, index);
+
+    mU = new camera_buffer_t;
+    CLEAR(*mU);
+    mU->flags = BUFFER_FLAG_INTERNAL;
+    mU->sequence = -1;
+
+    switch (usage) {
+        case BUFFER_USAGE_PSYS_INPUT:
+            //follow through
+        case BUFFER_USAGE_PSYS_INTERNAL:
+        case BUFFER_USAGE_GENERAL:
+            if (PlatformData::isIsysEnabled(cameraId)
+                && PlatformData::isCSIFrontEndCapture(cameraId)) {
+                type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+                num_plane = CameraUtils::getNumOfPlanes(format);
+            } else {
+                type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+            }
+            break;
+        case BUFFER_USAGE_PSYS_STATS:
+            type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+            break;
+        case BUFFER_USAGE_MIPI_CAPTURE:
+        case BUFFER_USAGE_METADATA:
+            type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+            num_plane = CameraUtils::getNumOfPlanes(format);
+            break;
+        default:
+            LOGE("Not supported Usage");
+    }
+
+    CLEAR(mMmapAddrs);
+    CLEAR(mDmaFd);
+
+    initBuffer(memory, type, size, index, num_plane);
+}
+
+CameraBuffer::~CameraBuffer()
+{
+    LOG1("Free CameraBuffer");
+
+    freeMemory();
+
+    if (mU->flags & BUFFER_FLAG_INTERNAL) {
+        delete mU;
+    }
+}
+
+void CameraBuffer::initBuffer(int memType, v4l2_buf_type bufType, uint32_t size, int idx, int num_plane)
+{
+    mV.SetMemory(memType);
+    mV.SetIndex(idx);
+
+    mV.SetType(bufType);
+
+    if (!V4L2_TYPE_IS_MULTIPLANAR(bufType)) {
+        mV.SetOffset(0, 0);
+        mV.SetLength(size, 0);
+        LOGE("SINGLE PLANE!");
+    } else {
+        mV.SetLength(num_plane, 0);
+        mNumPlanes = num_plane;
+        for (int i = 0; i < mNumPlanes; ++i) {
+            mV.SetLength(size, i);
+        }
+    }
+
+    mV.SetFlags(mV.Flags() | V4L2_BUF_FLAG_NO_CACHE_INVALIDATE | V4L2_BUF_FLAG_NO_CACHE_CLEAN);
+}
+
+//Helper function to construct a Internal CameraBuffer
+std::shared_ptr<CameraBuffer> CameraBuffer::create(int cameraId, int usage, int memory, unsigned int size, int index,
+                                              int srcFmt, int srcWidth, int srcHeight)
+{
+    std::shared_ptr<CameraBuffer> camBuffer = std::make_shared<CameraBuffer>(cameraId, usage, memory, size, index, srcFmt);
+
+    CheckError(!camBuffer, nullptr, "@%s: fail to alloc CameraBuffer", __func__);
+
+    camBuffer->setUserBufferInfo(srcFmt, srcWidth, srcHeight);
+
+    int ret = camBuffer->allocateMemory();
+
+    CheckError(ret != OK, nullptr, "Allocate memory failed ret %d", ret);
+
+    return camBuffer;
+}
+
+//Internal frame Buffer
+void CameraBuffer::setUserBufferInfo(int format, int width, int height)
+{
+    LOG1("%s: format:%d, width:%d, height:%d", __func__, format, width, height);
+    mU->s.width = width;
+    mU->s.height = height;
+    mU->s.format = format;
+    if (format != -1) {
+        mU->s.stride = CameraUtils::getStride(format, width);
+    }
+}
+
+//Called when a buffer is from the application
+void CameraBuffer::setUserBufferInfo(camera_buffer_t *ubuffer)
+{
+    CheckError(ubuffer == nullptr, VOID_VALUE, "%s: ubuffer is nullptr", __func__);
+
+    if (mU->flags & BUFFER_FLAG_INTERNAL) delete mU;
+    mU = ubuffer;
+
+    LOG1("%s: ubuffer->s.MemType: %d, addr: %p, fd: %d", __func__, ubuffer->s.memType,
+         ubuffer->addr, ubuffer->dmafd);
+    //update the v4l2 buffer memory with user infro
+    switch (ubuffer->s.memType) {
+        case V4L2_MEMORY_USERPTR:
+            setAddr(ubuffer->addr, 0);
+            break;
+        case V4L2_MEMORY_DMABUF:
+            setFd(ubuffer->dmafd, 0);
+            break;
+        case V4L2_MEMORY_MMAP:
+            /* do nothing */
+            break;
+        default:
+            LOGE("iomode %d is not supported yet.", mV.Memory());
+            break;
+    }
+
+    if (mU->s.streamType == CAMERA_STREAM_INPUT || ubuffer->sequence >= 0) {
+        mV.SetSequence(ubuffer->sequence);
+        LOG2("%s, input buffer sequence %lld", __func__, ubuffer->sequence);
+    }
+}
+
+void CameraBuffer::updateV4l2Buffer(const v4l2_buffer_t& v4l2buf)
+{
+    mV.SetField(v4l2buf.field);
+    mV.SetTimestamp(v4l2buf.timestamp);
+    mV.SetSequence(v4l2buf.sequence);
+    mV.SetRequestFd(v4l2buf.request_fd);
+}
+
+/*export mmap buffer as dma_buf fd stored in mV and mU*/
+int CameraBuffer::exportMmapDmabuf(V4L2VideoNode *vDevice)
+{
+    std::vector<int> fds;
+
+    int ret = vDevice->ExportFrame(mV.Index(), &fds);
+
+    CheckError(ret != OK, -1, "exportMmapDmabuf failed, ret %d", ret);
+
+    for (size_t i = 0; i < fds.size(); ++i) {
+        setFd(fds[i], i);
+    }
+
+    if (mU->flags & BUFFER_FLAG_DMA_EXPORT) {
+        mU->dmafd = getFd(0);
+    }
+
+    return OK;
+}
+
+int CameraBuffer::allocateMemory(V4L2VideoNode* vDevice)
+{
+    int ret = BAD_VALUE;
+    LOG1("%s", __func__);
+    switch(mV.Memory()) {
+        case V4L2_MEMORY_USERPTR:
+            ret = allocateUserPtr();
+            mAllocatedMemory = true;
+            mU->addr = getAddr();
+            break;
+        case V4L2_MEMORY_MMAP:
+            exportMmapDmabuf(vDevice);
+            ret = allocateMmap(vDevice);
+            mU->addr = getAddr();
+            mAllocatedMemory = true;
+            break;
+        default:
+            LOGE("memory type %d is incorrect for allocateMemory.", mV.Memory());
+            return BAD_VALUE;
+    }
+
+    return ret;
+}
+
+int CameraBuffer::allocateUserPtr()
+{
+    void* buffer = nullptr;
+    for (int i = 0; i < mNumPlanes; ++i) {
+        int ret = posix_memalign(&buffer, getpagesize(), mV.Length(i));
+        CheckError(ret != 0, -1, "%s, posix_memalign fails, ret:%d", __func__, ret);
+        mV.SetUserptr(reinterpret_cast<uintptr_t>(buffer), i);
+        mMmapAddrs[i] = buffer;
+    }
+    return OK;
+}
+
+void CameraBuffer::freeUserPtr()
+{
+    for (int i = 0; i < mNumPlanes; ++i) {
+        void* ptr = reinterpret_cast<void*>(mV.Userptr(i));
+        mMmapAddrs[i] = nullptr;
+        ::free(ptr);
+        mV.SetUserptr(reinterpret_cast<uintptr_t>(nullptr), i);
+    }
+}
+
+int CameraBuffer::allocateMmap(V4L2VideoNode* dev)
+{
+    std::vector<void*> addrs;
+    int ret = dev->MapMemory(mV.Index(), PROT_READ | PROT_WRITE,
+                            MAP_SHARED, &addrs);
+
+    CheckError(ret != OK, -1, "allocateMmap failed, ret %d", ret);
+
+    for (unsigned int i = 0; i < addrs.size(); ++i) {
+        if (addrs[i] == MAP_FAILED) {
+            mMmapAddrs[i] = nullptr;
+            continue ;
+        }
+        mMmapAddrs[i] = addrs[i];
+    }
+
+    return OK;
+}
+
+void* CameraBuffer::getAddr(int plane)
+{
+    CheckError(plane < 0 || plane >= mNumPlanes, nullptr, "Wrong plane number %d", plane);
+
+    switch (mV.Memory()) {
+        case V4L2_MEMORY_MMAP:
+            return mMmapAddrs[plane];
+        case V4L2_MEMORY_USERPTR:
+            return reinterpret_cast<void*>(mV.Userptr(plane));
+        default:
+            LOGE("%s: Not supported memory type %u", __func__, mV.Memory());
+    }
+    return nullptr;
+}
+
+void CameraBuffer::setAddr(void *addr, int plane)
+{
+    CheckError(plane < 0 || plane >= mNumPlanes, VOID_VALUE,
+               "Wrong plane number %d", plane);
+
+    switch (mV.Memory()) {
+        case V4L2_MEMORY_MMAP:
+            mMmapAddrs[plane] = addr;
+            return;
+        case V4L2_MEMORY_USERPTR:
+            mV.SetUserptr(reinterpret_cast<uintptr_t>(addr), plane);
+            mMmapAddrs[plane] = addr;
+            return;
+        default:
+            LOGE("%s: Not supported memory type %u", __func__, mV.Memory());
+    }
+}
+
+void CameraBuffer::freeMmap()
+{
+    int ret = OK;
+
+    for (int i = 0; i < mNumPlanes; i++) {
+        if (getFd(i) != -1) {
+            ::close(getFd(i));
+            setFd(-1, i);
+        }
+        if (mMmapAddrs[i]) {
+            ret = ::munmap(mMmapAddrs[i], mV.Length(i));
+            CheckError(ret != 0, VOID_VALUE, "failed to munmap buffer %d", i);
+            mMmapAddrs[i] = nullptr;
+        }
+    }
+}
+
+void* CameraBuffer::mapDmaBufferAddr(int fd, unsigned int bufferSize)
+{
+    if(fd < 0 || !bufferSize) {
+        LOGE("%s, fd:0x%x, bufferSize:%u", __func__, fd, bufferSize);
+        return nullptr;
+    }
+    return ::mmap(nullptr, bufferSize, PROT_READ, MAP_SHARED, fd, 0);
+}
+
+void CameraBuffer::unmapDmaBufferAddr(void* addr, unsigned int bufferSize)
+{
+    if(addr == nullptr || !bufferSize) {
+        LOGE("%s, addr:%p, bufferSize:%u", __func__, addr, bufferSize);
+        return;
+    }
+    munmap(addr, bufferSize);
+}
+
+void CameraBuffer::freeMemory()
+{
+    if (!mAllocatedMemory) {
+        LOG2("@%s Memory(in %p) is not allocated by CameraBuffer class. Don't free it.", __func__, this);
+        return ;
+    }
+
+    switch(mV.Memory()) {
+        case V4L2_MEMORY_USERPTR:
+            freeUserPtr();
+            break;
+        case V4L2_MEMORY_MMAP:
+            freeMmap();
+            break;
+        default:
+            LOGE("Free camera buffer failed, due to memory %d type is not implemented yet.", mV.Memory());
+    }
+}
+
+void CameraBuffer::updateUserBuffer(void)
+{
+    mU->timestamp = TIMEVAL2NSECS(getTimestamp());
+    mU->s.field = getField();
+
+    // Use valid setting sequence to align shutter/parameter with buffer
+    mU->sequence = (mSettingSequence < 0) ? getSequence() : mSettingSequence;
+}
+
+void CameraBuffer::updateFlags(void)
+{
+    int flag = V4L2_BUF_FLAG_NO_CACHE_INVALIDATE | V4L2_BUF_FLAG_NO_CACHE_CLEAN;
+    bool set = true;
+
+    //clear the flags if the buffers is accessed by the SW
+    if ((mU->flags & BUFFER_FLAG_SW_READ) || (mU->flags & BUFFER_FLAG_SW_WRITE)) {
+        set = false;
+    }
+
+    mV.SetFlags(set ? (mV.Flags() | flag): (mV.Flags() & (~flag)));
+}
+
+bool CameraBuffer::isFlagsSet(int flag)
+{
+    return ((mU->flags & flag) ? true : false);
+}
+
+void CameraBuffer::setFd(int val, int plane)
+{
+    if (mV.Memory() == V4L2_MEMORY_MMAP) {
+        mDmaFd[plane] = val;
+    } else {
+        mV.SetFd(val, plane);
+    }
+}
+
+int CameraBuffer::getFd(int plane)
+{
+    if (mV.Memory() == V4L2_MEMORY_MMAP) {
+        return mDmaFd[plane];
+    }
+
+    return mV.Fd(plane);
+}
+
+}//namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/CameraBuffer.h b/camera/hal/intel/ipu6/src/core/CameraBuffer.h
new file mode 100644
index 000000000000..909396f3fa25
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/CameraBuffer.h
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+#include <queue>
+#include <vector>
+
+#include <linux/videodev2.h>
+#include <v4l2_device.h>
+
+#include "api/Parameters.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+
+typedef struct v4l2_buffer v4l2_buffer_t;
+
+/* CameraBuffer is the core buffers for HAL. The buffer usage is described by the
+ * BufferUsage. CameraBuffer are constructed based on usage */
+enum BufferUsage {
+    BUFFER_USAGE_GENERAL = 0,
+    BUFFER_USAGE_PSYS_STATS,
+    BUFFER_USAGE_PSYS_INPUT,
+    BUFFER_USAGE_MIPI_CAPTURE,
+    BUFFER_USAGE_METADATA,
+    BUFFER_USAGE_PSYS_INTERNAL,
+};
+
+class CameraBuffer {
+public:
+    //assist function to create frame buffers
+    static std::shared_ptr<CameraBuffer>
+    create(int cameraId, int usage, int memory, unsigned int size, int index,
+           int srcFmt = -1, int srcWidth=-1, int srcHeight=-1);
+
+public:
+    CameraBuffer(int cameraId, int usage, int memory, uint32_t size, int index, int format = -1);
+    virtual ~CameraBuffer();
+
+public:
+    //user buffer information
+    int getWidth() const { return mU->s.width; }
+    int getHeight() const { return mU->s.height; }
+    int getStride() const { return mU->s.stride; }
+    int getFormat() const { return mU->s.format; }
+    int getStreamType() const { return mU->s.streamType; }
+    int getStreamUsage() const { return mU->s.usage; }
+    int getStreamId() const { return mU->s.id; }
+    int getFlags() const { return mU->flags; }
+
+    //v4l2 buffer information
+    uint32_t getIndex(void) const { return mV.Index(); }
+
+    uint32_t getSequence(void) const { return mV.Sequence(); }
+    void setSequence(uint32_t sequence) { mV.SetSequence(sequence); }
+
+    uint32_t getField() const { return mV.Field(); }
+    void setField(uint32_t field) { mV.SetField(field); }
+
+    struct timeval getTimestamp(void) const  { return mV.Timestamp(); }
+    void setTimestamp(struct timeval timestamp) { mV.SetTimestamp(timestamp); }
+
+    int getFd(int planeIndex = 0);
+
+    uint32_t getMemory(void) const { return mV.Memory(); }
+
+    int numPlanes() { return mNumPlanes; }
+
+     //For debug only v4l2 buffer information
+    int getCsi2Port(void) const { return (mV.RequestFd() >> 4) & 0xf; }
+    int getVirtualChannel(void) const { return mV.RequestFd() & 0xf; }
+
+    /* u buffer is used to attach user private structure pointer
+     * in CameraBuffer.
+     *
+     * Now, one of this usage is linking camera_buffer_t to CameraBuffer
+     * together, so that we can get each pointer by other.
+     * Notes: Please don't abuse this. It is only used in CameraDevice for user buffer
+     */
+    camera_buffer_t *getUserBuffer() { return mU; }
+    //update the user  buffer with latest v4l2 buffer info from driver
+    void    updateUserBuffer(void);
+    //Update the v4l2 flags according to user buffer flag
+    void    UpdateFlags(void);
+    void    updateFlags(void);
+
+    //Check if the specific flag in "mU->flags" is set or not
+    bool isFlagsSet(int flag);
+    //The ubuffer is from application
+    void setUserBufferInfo(camera_buffer_t *ubuffer);
+    void setUserBufferInfo(int format, int width, int height);
+
+    uint32_t getBufferSize(int planeIndex = 0) { return mV.Length(planeIndex); }
+    void setBufferSize(unsigned int size, int planeIndex = 0) { mV.SetLength(size, planeIndex); }
+
+    unsigned int getBytesused(int planeIndex = 0) { return mV.BytesUsed(planeIndex); }
+    void setBytesused(unsigned int bytes, int planeIndex = 0) { mV.SetBytesUsed(bytes, planeIndex); }
+
+    void* getBufferAddr(int planeIndex = 0) { return getAddr(planeIndex); }
+    void  setBufferAddr(void *addr, int planeIndex = 0) { return setAddr(addr, planeIndex); }
+
+    void updateV4l2Buffer(const v4l2_buffer_t& v4l2buf);
+
+    V4L2Buffer& getV4L2Buffer() { return mV; }
+
+    int getUsage() const { return mBufferUsage; }
+
+    void setSettingSequence(long sequence) { mSettingSequence = sequence; }
+    long getSettingSequence() const { return mSettingSequence; }
+
+    //Buffers are allocated the buffers by Camera
+    int allocateMemory(V4L2VideoNode *vDevice = nullptr);
+
+public:
+    static void* mapDmaBufferAddr(int fd, unsigned int bufferSize);
+    static void unmapDmaBufferAddr(void* addr, unsigned int bufferSize);
+
+private:
+    CameraBuffer(const CameraBuffer&);
+    CameraBuffer& operator=(const CameraBuffer&);
+
+    void freeMemory();
+    int exportMmapDmabuf(V4L2VideoNode *vDevice);
+
+    int allocateMmap(V4L2VideoNode* dev);
+    int allocateUserPtr();
+    void freeUserPtr();
+    void freeMmap();
+    void* getAddr(int plane = 0);
+    void setAddr(void *userAddr, int plane = 0);
+    void initBuffer(int memType, v4l2_buf_type bufType, uint32_t size, int idx, int num_plane);
+
+    void setFd(int val, int plane);
+
+protected:
+    V4L2Buffer mV;
+    int mNumPlanes;
+
+private:
+    //To tag whether the memory is allocated by CameraBuffer class. We need to free them
+    bool mAllocatedMemory;
+
+    camera_buffer_t *mU;
+    int mBufferUsage;
+    long mSettingSequence;
+
+    void* mMmapAddrs[VIDEO_MAX_PLANES];
+    int mDmaFd[VIDEO_MAX_PLANES];
+};
+
+typedef std::vector<std::shared_ptr<CameraBuffer> > CameraBufVector;
+typedef std::queue<std::shared_ptr<CameraBuffer> > CameraBufQ;
+
+}
diff --git a/camera/hal/intel/ipu6/src/core/CameraDevice.cpp b/camera/hal/intel/ipu6/src/core/CameraDevice.cpp
new file mode 100644
index 000000000000..ca12298576b3
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/CameraDevice.cpp
@@ -0,0 +1,1162 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "CameraDevice"
+
+#include <vector>
+
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+
+#include "IGraphConfig.h"
+#include "ICamera.h"
+#include "PlatformData.h"
+#include "CameraDevice.h"
+#include "V4l2DeviceFactory.h"
+#include "I3AControlFactory.h"
+#include "CaptureUnit.h"
+
+using std::vector;
+
+namespace icamera {
+
+CameraDevice::CameraDevice(int cameraId) :
+    mState(DEVICE_UNINIT),
+    mCameraId(cameraId),
+    mStreamNum(0),
+    mCallback(nullptr)
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("@%s, cameraId:%d", __func__, mCameraId);
+
+    CLEAR(mStreams);
+
+    V4l2DeviceFactory::createDeviceFactory(mCameraId);
+    CLEAR(mInputConfig);
+    mInputConfig.format = -1;
+
+    mProducer = createBufferProducer();
+
+    mSofSource = new SofSource(mCameraId);
+
+    mPerframeControlSupport = PlatformData::isFeatureSupported(mCameraId, PER_FRAME_CONTROL);
+    LOG2("%s: support perframe %d", __func__, mPerframeControlSupport);
+    mParamGenerator = new ParameterGenerator(mCameraId);
+
+    mLensCtrl = new LensHw(mCameraId);
+    mSensorCtrl = SensorHwCtrl::createSensorCtrl(mCameraId);
+
+    m3AControl = I3AControlFactory::createI3AControl(mCameraId, mSensorCtrl, mLensCtrl);
+    mRequestThread = new RequestThread(mCameraId, m3AControl, mParamGenerator);
+    mRequestThread->registerListener(EVENT_PROCESS_REQUEST, this);
+    mRequestThread->registerListener(EVENT_DEVICE_RECONFIGURE, this);
+
+    mProcessorManager = new ProcessorManager(mCameraId);
+
+    if (PlatformData::getGraphConfigNodes(mCameraId)) {
+        mGCM = IGraphConfigManager::getInstance(mCameraId);
+    } else {
+        mGCM = nullptr;
+    }
+}
+
+CameraDevice::~CameraDevice()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+    AutoMutex   m(mDeviceLock);
+
+    // Clear the media control when close the device.
+    MediaCtlConf *mc = PlatformData::getMediaCtlConf(mCameraId);
+    if (mc) {
+        MediaControl::getInstance()->mediaCtlClear(mCameraId, mc);
+    }
+
+    mRequestThread->removeListener(EVENT_PROCESS_REQUEST, this);
+    mRequestThread->removeListener(EVENT_DEVICE_RECONFIGURE, this);
+
+    delete mProcessorManager;
+
+    for (int i = 0; i < MAX_STREAM_NUMBER; i++)
+        delete mStreams[i];
+
+    delete mLensCtrl;
+    delete m3AControl;
+    delete mSensorCtrl;
+    delete mParamGenerator;
+    delete mSofSource;
+    delete mProducer;
+    delete mRequestThread;
+
+    V4l2DeviceFactory::releaseDeviceFactory(mCameraId);
+    IGraphConfigManager::releaseInstance(mCameraId);
+}
+
+int CameraDevice::init()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("@%s, mCameraId:%d, mState:%d", __func__, mCameraId, mState);
+    AutoMutex   m(mDeviceLock);
+
+    int ret = mProducer->init();
+    CheckError(ret < 0, ret, "%s: Init capture unit failed", __func__);
+
+    ret = mSofSource->init();
+    CheckError(ret != OK, ret, "@%s: init sync manager failed", __func__);
+
+    initDefaultParameters();
+
+    ret = m3AControl->init();
+    CheckError((ret != OK), ret, "%s: Init 3A Unit falied", __func__);
+
+    ret = mLensCtrl->init();
+    CheckError((ret != OK), ret, "%s: Init Lens falied", __func__);
+
+    mRequestThread->run("RequestThread", PRIORITY_NORMAL);
+
+    mState = DEVICE_INIT;
+    return ret;
+}
+
+void CameraDevice::deinit()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("@%s, mCameraId:%d, mState:%d", __func__, mCameraId, mState);
+    AutoMutex   m(mDeviceLock);
+
+    //deinit should not be call in UNINIT or START STATE
+    if (mState == DEVICE_UNINIT) {
+        //Do nothing
+        return;
+    }
+
+    m3AControl->stop();
+
+    if (mState == DEVICE_START) {
+        //stop first
+        stopLocked();
+    }
+
+    deleteStreams();
+
+    mProcessorManager->deleteProcessors();
+
+    m3AControl->deinit();
+
+    mSofSource->deinit();
+
+    mProducer->deinit();
+
+    mRequestThread->requestExit();
+    mRequestThread->join();
+
+    mState = DEVICE_UNINIT;
+}
+
+void CameraDevice::callbackRegister(const camera_callback_ops_t* callback)
+{
+    mCallback = const_cast<camera_callback_ops_t*>(callback);
+}
+
+StreamSource* CameraDevice::createBufferProducer()
+{
+
+    return new CaptureUnit(mCameraId);
+}
+
+void CameraDevice::bindListeners()
+{
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+
+    vector<EventListener*> statsListenerList = m3AControl->getStatsEventListener();
+    for (auto statsListener : statsListenerList) {
+
+        for (auto& item : mProcessors) {
+            // Subscribe PSys statistics.
+            item->registerListener(EVENT_PSYS_STATS_BUF_READY, statsListener);
+            item->registerListener(EVENT_PSYS_STATS_SIS_BUF_READY, statsListener);
+
+                item->registerListener(EVENT_PSYS_STATS_BUF_READY, mRequestThread);
+        }
+    }
+
+    vector<EventListener*> sofListenerList = m3AControl->getSofEventListener();
+    for (auto sofListener : sofListenerList) {
+        mSofSource->registerListener(EVENT_ISYS_SOF, sofListener);
+    }
+
+    if (PlatformData::psysAlignWithSof(mCameraId)) {
+        for (auto& item : mProcessors) {
+            mSofSource->registerListener(EVENT_ISYS_SOF, item);
+        }
+    }
+
+    if (mPerframeControlSupport || !PlatformData::isIsysEnabled(mCameraId)) {
+        mProcessors.back()->registerListener(EVENT_PSYS_FRAME, mRequestThread);
+    } else {
+        mProducer->registerListener(EVENT_ISYS_FRAME, mRequestThread);
+    }
+
+    if (!mProcessors.empty()) {
+        mProcessors.front()->registerListener(EVENT_PSYS_REQUEST_BUF_READY, this);
+    }
+}
+
+void CameraDevice::unbindListeners()
+{
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+
+    vector<EventListener*> statsListenerList = m3AControl->getStatsEventListener();
+    for (auto statsListener : statsListenerList) {
+
+        for (auto& item : mProcessors) {
+            item->removeListener(EVENT_PSYS_STATS_BUF_READY, statsListener);
+            item->removeListener(EVENT_PSYS_STATS_SIS_BUF_READY, statsListener);
+
+                 item->removeListener(EVENT_PSYS_STATS_BUF_READY, mRequestThread);
+        }
+    }
+
+    vector<EventListener*> sofListenerList = m3AControl->getSofEventListener();
+    for (auto sofListener : sofListenerList) {
+        mSofSource->removeListener(EVENT_ISYS_SOF, sofListener);
+    }
+
+    if (!mProcessors.empty()) {
+        mProcessors.front()->removeListener(EVENT_PSYS_REQUEST_BUF_READY, this);
+    }
+
+    if (mPerframeControlSupport || !PlatformData::isIsysEnabled(mCameraId)) {
+        mProcessors.back()->removeListener(EVENT_PSYS_FRAME, mRequestThread);
+    } else {
+        mProducer->removeListener(EVENT_ISYS_FRAME, mRequestThread);
+    }
+}
+
+int CameraDevice::configureInput(const stream_t *inputConfig)
+{
+    PERF_CAMERA_ATRACE();
+
+    AutoMutex lock(mDeviceLock);
+    mInputConfig = *inputConfig;
+
+    return OK;
+}
+
+int CameraDevice::configure(stream_config_t *streamList)
+{
+    PERF_CAMERA_ATRACE();
+
+    int numOfStreams = streamList->num_streams;
+    CheckError(!streamList->streams, BAD_VALUE, "%s: No valid stream config", __func__);
+    CheckError(numOfStreams > MAX_STREAM_NUMBER || numOfStreams <= 0, BAD_VALUE,
+          "%s: The requested stream number(%d) is invalid. Should be between [1-%d]",
+          __func__, numOfStreams, MAX_STREAM_NUMBER);
+
+    AutoMutex lock(mDeviceLock);
+
+    CheckError((mState != DEVICE_STOP) && (mState != DEVICE_INIT), INVALID_OPERATION,
+          "%s: Add streams in wrong state %d", __func__, mState);
+
+    mRequestThread->configure(streamList);
+
+    // Use concrete ISP mode from request thread for full and auto switch
+    if (PlatformData::getAutoSwitchType(mCameraId) == AUTO_SWITCH_FULL &&
+        (ConfigMode)(streamList->operation_mode) == CAMERA_STREAM_CONFIGURATION_MODE_AUTO) {
+        stream_config_t requestStreamList = mRequestThread->getStreamConfig();
+        LOG2("%s: for full and auto switch, use concrete config mode %u from request thread.",
+             __func__, requestStreamList.operation_mode);
+        return configureL(&requestStreamList);
+    }
+
+    return configureL(streamList);
+}
+
+int CameraDevice::configureL(stream_config_t *streamList, bool clean)
+{
+    LOG1("@%s, mCameraId:%d, operation_mode %x", __func__, mCameraId, (ConfigMode)streamList->operation_mode);
+
+    int ret = analyzeStream(streamList);
+    CheckError(ret != OK, ret, "@%s, analyzeStream failed", __func__);
+
+    // If configured before, destroy current streams first.
+    if (mStreamNum > 0 && clean) {
+        deleteStreams();
+    }
+    mProcessorManager->deleteProcessors();
+
+    // Clear all previous added listeners.
+    mProducer->removeAllFrameAvailableListener();
+    if (clean) {
+        ret = createStreams(streamList);
+        CheckError(ret < 0, ret, "@%s create stream failed with %d", __func__, ret);
+    }
+
+    int mcId = -1;
+    if (mGCM != nullptr) {
+        ret = mGCM->configStreams(streamList);
+        CheckError(ret != OK, INVALID_OPERATION, "No matching graph config found");
+
+        mcId = mGCM->getSelectedMcId();
+    }
+
+    std::map<Port, stream_t> producerConfigs = selectProducerConfig(streamList, mcId);
+    CheckError(producerConfigs.empty(), BAD_VALUE, "The config for producer is invalid.");
+
+    bool needProcessor = isProcessorNeeded(streamList, producerConfigs[MAIN_PORT]);
+    for (auto& item : producerConfigs) {
+        LOG1("Producer config for port:%d, fmt:%s (%dx%d), needProcessor=%d", item.first,
+             CameraUtils::format2string(item.second.format).c_str(),
+             item.second.width, item.second.height, needProcessor);
+        // Only V4L2_MEMORY_MMAP is supported when using post processor
+        if (needProcessor) {
+            item.second.memType = V4L2_MEMORY_MMAP;
+        }
+    }
+
+    vector<ConfigMode> configModes;
+    PlatformData::getConfigModesByOperationMode(mCameraId, streamList->operation_mode, configModes);
+
+    int bufferNum = MAX_BUFFER_COUNT;
+    const stream_t& tmp = streamList->streams[mSortedStreamIds.back()];
+    if (tmp.usage == CAMERA_STREAM_OPAQUE_RAW) {
+        bufferNum = PlatformData::getMaxRawDataNum(mCameraId);
+    }
+    ret = mProducer->configure(producerConfigs, configModes, bufferNum);
+    CheckError(ret < 0, BAD_VALUE, "@%s Device Configure failed", __func__);
+
+    ret = mSofSource->configure();
+    CheckError(ret != OK, ret, "@%s failed to configure SOF source device", __func__);
+
+    m3AControl->configure(streamList);
+
+    if (needProcessor) {
+        mProcessors = mProcessorManager->createProcessors(mInputConfig.format, producerConfigs,
+                                                          mStreamIdToPortMap,
+                                                          streamList, mParameter, mParamGenerator);
+        ret = mProcessorManager->configureProcessors(configModes,
+                                                     mProducer, mParameter);
+        CheckError(ret != OK, ret, "@%s configure post processor failed with:%d", __func__, ret);
+    }
+
+    ret = bindStreams(streamList);
+    CheckError(ret < 0, ret, "@%s bind stream failed with %d", __func__, ret);
+
+    mState = DEVICE_CONFIGURE;
+    return OK;
+}
+
+/**
+ * Select the producer's config from the supported list.
+ *
+ * How to decide the producer's config?
+ * 1. The producer's config can only be one of the combination from ISYS supported format and
+ *    resolution list.
+ * 2. Try to use the same config as user's required.
+ * 3. If the ISYS supported format and resolution cannot satisfy user's requirement, then use
+ *    the closest one, and let post processor do the conversion.
+ */
+std::map<Port, stream_t> CameraDevice::selectProducerConfig(const stream_config_t *streamList, int mcId)
+{
+    // Use the biggest stream to configure the producer.
+    stream_t biggestStream = streamList->streams[mSortedStreamIds[0]];
+    std::map<Port, stream_t> producerConfigs;
+
+    if (!PlatformData::isIsysEnabled(mCameraId)) {
+        // Input stream id is the last one of mSortedStreamIds
+        const stream_t& tmp = streamList->streams[mSortedStreamIds.back()];
+        if (tmp.streamType == CAMERA_STREAM_INPUT) {
+            producerConfigs[MAIN_PORT] = tmp;
+            return producerConfigs;
+        }
+    }
+
+    /*
+     * According to the stream info and operation mode to select MediaCtlConf.
+     * and isys output format. If inputFmt is given and supported, we use it as isys output format.
+     */
+    int inputFmt = mInputConfig.format;
+    int iSysFmt = biggestStream.format;
+    if (inputFmt != -1) {
+        if (!PlatformData::isISysSupportedFormat(mCameraId, inputFmt)) {
+            LOGE("The given ISYS format %s is unsupported.", CameraUtils::pixelCode2String(inputFmt));
+            return producerConfigs;
+        }
+        iSysFmt = inputFmt;
+    }
+
+    // Use CSI output to select MC config
+    vector <ConfigMode> configModes;
+    PlatformData::getConfigModesByOperationMode(mCameraId, streamList->operation_mode,
+                                             configModes);
+    stream_t matchedStream = biggestStream;
+    if (!configModes.empty() && mGCM != nullptr) {
+        std::shared_ptr<IGraphConfig> gc = mGCM->getGraphConfig(configModes[0]);
+        if (gc) {
+            camera_resolution_t csiOutput = {0, 0};
+            gc->getCSIOutputResolution(csiOutput);
+            if (csiOutput.width > 0 && csiOutput.height > 0) {
+                matchedStream.width = csiOutput.width;
+                matchedStream.height = csiOutput.height;
+            }
+        }
+    }
+
+    camera_crop_region_t cropRegion;
+    int ret = mParameter.getCropRegion(cropRegion);
+    if ((ret == OK) && (cropRegion.flag == 1)) {
+        PlatformData::selectMcConf(mCameraId, mInputConfig,
+                                  (ConfigMode)streamList->operation_mode, mcId);
+    } else {
+        PlatformData::selectMcConf(mCameraId, matchedStream,
+                                  (ConfigMode)streamList->operation_mode, mcId);
+    }
+
+    PlatformData::selectISysFormat(mCameraId, iSysFmt);
+
+    // Use the ISYS output if it's provided in media config section of config file.
+    stream_t mainConfig = PlatformData::getISysOutputByPort(mCameraId, MAIN_PORT);
+    mainConfig.memType = biggestStream.memType;
+    mainConfig.field = biggestStream.field;
+
+    if (mainConfig.width != 0 && mainConfig.height != 0) {
+        producerConfigs[MAIN_PORT] = mainConfig;
+
+        return producerConfigs;
+    }
+
+    int inputWidth = mInputConfig.width;
+    int inputHeight = mInputConfig.height;
+
+    camera_resolution_t producerRes = {inputWidth, inputHeight};
+    if (inputWidth == 0 && inputHeight == 0) {
+        // Only get the ISYS resolution when input config is not specified.
+        producerRes = PlatformData::getISysBestResolution(mCameraId, biggestStream.width,
+                                                          biggestStream.height, biggestStream.field);
+    } else if (!PlatformData::isISysSupportedResolution(mCameraId, producerRes)) {
+        LOGE("The stream config: (%dx%d) is not supported.", inputWidth, inputHeight);
+        return producerConfigs;
+    }
+
+    mainConfig.format = PlatformData::getISysFormat(mCameraId);
+    mainConfig.width = producerRes.width;
+    // Update the height according to the field.
+    mainConfig.height = CameraUtils::getInterlaceHeight(mainConfig.field, producerRes.height);
+
+    // configuration with main port
+    producerConfigs[MAIN_PORT] = mainConfig;
+
+    return producerConfigs;
+}
+
+/**
+ * Check if post processor is needed.
+ * The processor is needed when:
+ * 1. At least one of the given streams does not match with the producer's output.
+ * 2. To support specific features such as HW weaving or dewarping.
+ */
+bool CameraDevice::isProcessorNeeded(const stream_config_t *streamList,
+                                     const stream_t &producerConfig)
+{
+    camera_crop_region_t cropRegion;
+    int ret = mParameter.getCropRegion(cropRegion);
+    if ((ret == OK) && (cropRegion.flag == 1)) return true;
+
+    camera_fisheye_dewarping_mode_t dewarping_mode = FISHEYE_DEWARPING_OFF;
+    mParameter.getFisheyeDewarpingMode(dewarping_mode);
+    if (dewarping_mode > FISHEYE_DEWARPING_OFF) {
+        return true;
+    }
+
+    if (producerConfig.field != V4L2_FIELD_ANY) {
+        camera_deinterlace_mode_t mode = DEINTERLACE_OFF;
+        mParameter.getDeinterlaceMode(mode);
+        if (mode == DEINTERLACE_WEAVING) {
+            return true;
+        }
+    }
+
+    if (producerConfig.field != V4L2_FIELD_ALTERNATE) {
+        int streamCounts = streamList->num_streams;
+        for (int streamId = 0; streamId < streamCounts; streamId++) {
+            if (producerConfig.width != streamList->streams[streamId].width ||
+                producerConfig.height != streamList->streams[streamId].height ||
+                producerConfig.format != streamList->streams[streamId].format) {
+                return true;
+            }
+        }
+    }
+
+    camera_mono_downscale_mode_t monoDsMode = MONO_DS_MODE_OFF;
+    mParameter.getMonoDsMode(monoDsMode);
+    if (monoDsMode != MONO_DS_MODE_OFF) {
+        return true;
+    }
+
+    return false;
+}
+
+/**
+ * Return true only if there are both still and video stream configured.
+ */
+bool CameraDevice::isStillDuringVideo(const stream_config_t *streamList)
+{
+    bool containStill = false;
+    bool containVideo = false;
+    for (int streamId = 0; streamId < streamList->num_streams; streamId++) {
+        switch (streamList->streams[streamId].usage) {
+        case CAMERA_STREAM_PREVIEW:
+        case CAMERA_STREAM_VIDEO_CAPTURE:
+            containVideo = true;
+            break;
+        case CAMERA_STREAM_STILL_CAPTURE:
+            containStill = true;
+            break;
+        default:
+            break;
+        }
+    }
+
+    return (containStill && containVideo);
+}
+
+int CameraDevice::createStreams(stream_config_t *streamList)
+{
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+
+    int streamCounts = streamList->num_streams;
+    for (int streamId = 0; streamId < streamCounts; streamId++) {
+        stream_t& streamConf = streamList->streams[streamId];
+        LOG1("@%s, stream_number:%d, stream configure: format:%s (%dx%d)", __func__, streamCounts,
+             CameraUtils::pixelCode2String(streamConf.format), streamConf.width, streamConf.height);
+
+        streamConf.id = streamId;
+        streamConf.max_buffers = PlatformData::getMaxRequestsInflight(mCameraId);
+        CameraStream *stream = new CameraStream(mCameraId, streamId, streamConf);
+        stream->registerListener(EVENT_FRAME_AVAILABLE, mRequestThread);
+        mStreams[streamId] = stream;
+        mStreamNum++;
+
+        LOG2("@%s: automation checkpoint: interlaced: %d", __func__, streamConf.field);
+    }
+
+    return OK;
+}
+
+/**
+ * According resolution to store the streamId in descending order.
+ * Use this order to bind stream to port, and set output Port mapping
+ */
+int CameraDevice::analyzeStream(stream_config_t *streamList)
+{
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+
+    mSortedStreamIds.clear();
+    mStreamIdToPortMap.clear();
+
+    int inputStreamId = -1;
+    int opaqueRawStreamId = -1;
+    for (int i = 0; i < streamList->num_streams; i++) {
+        const stream_t& stream = streamList->streams[i];
+
+        if (stream.streamType == CAMERA_STREAM_INPUT) {
+            CheckError(inputStreamId >= 0, BAD_VALUE, "Don't support two input streams!");
+            inputStreamId = i;
+            continue;
+        }
+
+        if (stream.usage == CAMERA_STREAM_OPAQUE_RAW) {
+            CheckError(opaqueRawStreamId >= 0, BAD_VALUE, "Don't support two RAW streams!");
+            opaqueRawStreamId = i;
+            continue;
+        }
+
+        camera_crop_region_t cropRegion;
+        int ret = mParameter.getCropRegion(cropRegion);
+        if (ret != OK || cropRegion.flag == 0) {
+            bool valid = PlatformData::isSupportedStream(mCameraId, stream);
+            CheckError(!valid, BAD_VALUE, "Stream config is not supported. format:%s (%dx%d)",
+                       CameraUtils::pixelCode2String(stream.format), stream.width, stream.height);
+        }
+
+        bool saved = false;
+        // Store the streamId in descending order.
+        for (size_t j = 0; j < mSortedStreamIds.size(); j++) {
+            const stream_t& tmp = streamList->streams[mSortedStreamIds[j]];
+            if (stream.width * stream.height > tmp.width * tmp.height) {
+                mSortedStreamIds.insert((mSortedStreamIds.begin() + j), i);
+                saved = true;
+                break;
+            }
+        }
+        if (!saved)
+            mSortedStreamIds.push_back(i);
+    }
+
+    // Set opaque RAW stream as last one
+    if (opaqueRawStreamId >= 0) {
+        mSortedStreamIds.push_back(opaqueRawStreamId);
+        // Ignore input raw stream for ZSL case
+        inputStreamId = -1;
+    }
+
+    const Port kPorts[] = {MAIN_PORT, SECOND_PORT, THIRD_PORT, FORTH_PORT};
+    for (size_t i = 0; i < mSortedStreamIds.size(); i++) {
+        mStreamIdToPortMap[mSortedStreamIds[i]] = kPorts[i];
+
+        // Dump the stream info by descending order.
+        const stream_t& stream = streamList->streams[mSortedStreamIds[i]];
+        LOG1("%s  streamId: %d, %dx%d(%s)", __func__, mSortedStreamIds[i],
+                stream.width, stream.height, CameraUtils::format2string(stream.format).c_str());
+    }
+
+    bool checkInput = !PlatformData::isIsysEnabled(mCameraId);
+    if (checkInput) {
+        CheckError(inputStreamId < 0, BAD_VALUE, "Input stream was missing");
+    }
+    // Handle input stream
+    if (inputStreamId >= 0) {
+        CheckError(mSortedStreamIds.empty(), BAD_VALUE, "There is no output stream!");
+        // Check if input stream is supported or not
+        const stream_t& stream = streamList->streams[inputStreamId];
+        camera_resolution_t inputResolution = {stream.width, stream.height};
+        bool valid = PlatformData::isISysSupportedResolution(mCameraId, inputResolution);
+        CheckError(!valid, BAD_VALUE, "Stream config is not supported. format:%s (%dx%d)",
+                   CameraUtils::pixelCode2String(stream.format), stream.width, stream.height);
+        // Push input stream index to the end of vector mSortedStreamIds
+        mSortedStreamIds.push_back(inputStreamId);
+        // Use MAIN PORT for input stream
+        mStreamIdToPortMap[inputStreamId] = MAIN_PORT;
+    }
+
+    return OK;
+}
+
+/**
+ * Bind all streams to their producers and to the correct port.
+ *
+ * Bind the streams to Port in resolution descending order:
+ * Stream with max resolution            --> MAIN_PORT
+ * Stream with intermediate resolution   --> SECOND_PORT
+ * Stream with min resolution            --> THIRD_PORT
+ */
+int CameraDevice::bindStreams(stream_config_t *streamList)
+{
+    for (auto& iter : mStreamIdToPortMap) {
+        mStreams[iter.first]->setPort(iter.second);
+
+        // If no post processors, bind the stream to the producer.
+        if (mProcessors.empty()) {
+            mStreams[iter.first]->setBufferProducer(mProducer);
+        } else {
+            mStreams[iter.first]->setBufferProducer(mProcessors.back());
+        }
+    }
+
+    return OK;
+}
+
+int CameraDevice::start()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("@%s, mCameraId:%d, mState:%d", __func__, mCameraId, mState);
+
+    // Not protected by mDeviceLock because it is required in qbufL()
+    mRequestThread->wait1stRequestDone();
+
+    AutoMutex   m(mDeviceLock);
+    CheckError(mState != DEVICE_BUFFER_READY, BAD_VALUE, "start camera in wrong status %d", mState);
+    CheckError(mStreamNum == 0, BAD_VALUE, "@%s: device doesn't add any stream yet.", __func__);
+
+    int ret = startLocked();
+    if (ret != OK) {
+        LOGE("Camera device starts failed.");
+        stopLocked();  // There is error happened, stop all related units.
+        return INVALID_OPERATION;
+    }
+
+    mState = DEVICE_START;
+    return OK;
+}
+
+int CameraDevice::stop()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("@%s, mCameraId:%d, mState:%d", __func__, mCameraId, mState);
+    AutoMutex   m(mDeviceLock);
+
+    mRequestThread->clearRequests();
+
+    m3AControl->stop();
+
+    if (mState == DEVICE_START)
+        stopLocked();
+
+    mState = DEVICE_STOP;
+
+    return OK;
+}
+
+//No Lock for this fuction as it doesn't update any class member
+int CameraDevice::allocateMemory(camera_buffer_t *ubuffer)
+{
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+    CheckError(mState < DEVICE_CONFIGURE, BAD_VALUE, "@%s: Wrong state id %d", __func__, mState);
+    CheckError(ubuffer->s.id < 0 || ubuffer->s.id >= mStreamNum, BAD_VALUE,
+          "@%s: Wrong stream id %d", __func__, ubuffer->s.id);
+
+    int ret = mStreams[ubuffer->s.id]->allocateMemory(ubuffer);
+    CheckError(ret < 0, ret, "@%s: failed, index: %d", __func__, ubuffer->index);
+
+    return ret;
+}
+
+/**
+ * Delegate it to RequestThread, make RequestThread manage all buffer related actions.
+ */
+int CameraDevice::dqbuf(int streamId, camera_buffer_t **ubuffer, Parameters* settings)
+{
+    CheckError(streamId < 0 || streamId > mStreamNum, BAD_VALUE,
+          "@%s: the given stream(%d) is invalid.", __func__, streamId);
+
+    LOG2("@%s, camera id:%d, stream id:%d", __func__, mCameraId, streamId);
+
+    int ret = mRequestThread->waitFrame(streamId, ubuffer);
+    while (ret == TIMED_OUT)
+        ret = mRequestThread->waitFrame(streamId, ubuffer);
+
+    CheckError(!*ubuffer || ret != OK, BAD_VALUE, "failed to get ubuffer from stream %d", streamId);
+
+    // Update and keep latest result, copy to settings when needed.
+    ret = mParamGenerator->getParameters((*ubuffer)->sequence, &mResultParameter);
+
+    if (settings) {
+        bool still = ((*ubuffer)->s.usage == CAMERA_STREAM_STILL_CAPTURE);
+        ret = mParamGenerator->getParameters((*ubuffer)->sequence, settings,
+                                             false, still);
+    }
+
+    return ret;
+}
+
+int CameraDevice::handleQueueBuffer(int bufferNum, camera_buffer_t **ubuffer, long sequence)
+{
+    LOG2("@%s, mCameraId:%d, sequence = %ld", __func__, mCameraId, sequence);
+    CheckError(mState < DEVICE_CONFIGURE, BAD_VALUE,"@%s: Wrong state id %d", __func__, mState);
+
+    // All streams need to be queued with either a real buffer from user or an empty buffer.
+    for (int streamId = 0; streamId < mStreamNum; streamId++) {
+        bool isBufferQueued = false;
+        CheckError(mStreams[streamId] == nullptr, BAD_VALUE,
+              "@%s: stream %d is nullptr", __func__, streamId);
+
+        // Find if user has queued a buffer for mStreams[streamId].
+        for (int bufferId = 0; bufferId < bufferNum; bufferId++) {
+            camera_buffer_t* buffer = ubuffer[bufferId];
+            int streamIdInBuf = buffer->s.id;
+            CheckError(streamIdInBuf < 0 || streamIdInBuf > mStreamNum, BAD_VALUE,
+                "@%s: Wrong stream id %d", __func__, streamIdInBuf);
+
+            if (streamIdInBuf == streamId) {
+                int ret = mStreams[streamId]->qbuf(buffer, sequence);
+                CheckError(ret < 0, ret, "@%s: queue buffer:%p failed:%d", __func__, buffer, ret);
+                isBufferQueued = true;
+                break;
+            }
+        }
+
+        // If streamId is not found in buffers queued by user, then we need to queue
+        // an empty buffer to keep the BufferQueue run.
+        if (!isBufferQueued) {
+            int ret = mStreams[streamId]->qbuf(nullptr, sequence);
+            CheckError(ret < 0, ret, "@%s: queue empty buffer failed:%d", __func__, ret);
+        }
+    }
+
+    return OK;
+}
+
+int CameraDevice::registerBuffer(camera_buffer_t **ubuffer, int bufferNum)
+{
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+    CheckError(mState < DEVICE_CONFIGURE, BAD_VALUE,"@%s: Wrong state id %d", __func__, mState);
+    if (mProcessors.empty()) return OK;
+
+    for (int bufferId = 0; bufferId < bufferNum; bufferId++) {
+        camera_buffer_t *buffer = ubuffer[bufferId];
+        CheckError(buffer == nullptr, BAD_VALUE, "@%s, the queue ubuffer %d is NULL", __func__, bufferId);
+        int streamIdInBuf = buffer->s.id;
+        CheckError(streamIdInBuf < 0 || streamIdInBuf > mStreamNum, BAD_VALUE,
+                "@%s: Wrong stream id %d", __func__, streamIdInBuf);
+        std::shared_ptr<CameraBuffer> camBuffer =
+            mStreams[streamIdInBuf]->userBufferToCameraBuffer(buffer);
+        for (auto& iter : mStreamIdToPortMap) {
+            // Register buffers to the last processor
+            if (iter.first == streamIdInBuf) {
+                BufferQueue *processor = mProcessors.back();
+                processor->registerUserOutputBufs(iter.second, camBuffer);
+                break;
+            }
+        }
+    }
+
+    return OK;
+}
+
+int CameraDevice::qbuf(camera_buffer_t **ubuffer,
+                       int bufferNum, const Parameters *settings)
+{
+    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
+
+    {
+        AutoMutex   m(mDeviceLock);
+        if (mState == DEVICE_CONFIGURE || mState == DEVICE_STOP) {
+            // Start 3A here then the HAL can run 3A for request
+            int ret = m3AControl->start();
+            CheckError((ret != OK), BAD_VALUE, "Start 3a unit failed with ret:%d.", ret);
+
+            mState = DEVICE_BUFFER_READY;
+        }
+    }
+
+    if (mState != DEVICE_START && PlatformData::isNeedToPreRegisterBuffer(mCameraId)) {
+        registerBuffer(ubuffer, bufferNum);
+    }
+
+    // Make sure request's configure mode is updated by latest result param if no settings
+    if (!settings) {
+        mRequestThread->setConfigureModeByParam(mResultParameter);
+    }
+
+    return mRequestThread->processRequest(bufferNum, ubuffer, settings);
+}
+
+int CameraDevice::getParameters(Parameters& param)
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("@%s mCameraId:%d", __func__, mCameraId);
+    AutoMutex   m(mDeviceLock);
+
+    param = mParameter;
+
+    for (auto& item : mProcessors) {
+        item->getParameters(param);
+    }
+
+    return OK;
+}
+
+int CameraDevice::setParameters(const Parameters& param)
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("@%s mCameraId:%d", __func__, mCameraId);
+    AutoMutex   m(mDeviceLock);
+    return setParametersL(param);
+}
+
+int CameraDevice::setParametersL(const Parameters& param)
+{
+    // Merge given param into internal unique mParameter
+    mParameter.merge(param);
+
+    int ret = m3AControl->setParameters(param);
+    for (auto& item : mProcessors) {
+        item->setParameters(mParameter);
+    }
+
+    // Set test pattern mode
+    camera_test_pattern_mode_t testPatternMode = TEST_PATTERN_OFF;
+    if (PlatformData::isTestPatternSupported(mCameraId)
+            && param.getTestPatternMode(testPatternMode) == OK) {
+        int32_t sensorTestPattern = PlatformData::getSensorTestPattern(mCameraId, testPatternMode);
+        if (sensorTestPattern > 0) {
+            ret |= mSensorCtrl->setTestPatternMode(sensorTestPattern);
+        }
+    }
+
+    return ret;
+}
+
+//Private Functions, these functions are called with device lock hold
+
+//Destroy all the streams
+void CameraDevice::deleteStreams()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("@%s mCameraId:%d, streams:%d", __func__, mCameraId, mStreamNum);
+
+    for (int streamId = 0; streamId < mStreamNum; streamId++) {
+        mStreams[streamId]->stop();
+        delete mStreams[streamId];
+        mStreams[streamId] = nullptr;
+    }
+    mStreamNum = 0;
+}
+
+// Internal start without lock hold
+int CameraDevice::startLocked()
+{
+    int ret = OK;
+
+    bindListeners();
+
+    //Start all the streams
+    for(int i = 0; i < mStreamNum; i++) {
+        ret = mStreams[i]->start();
+        CheckError(ret < 0, BAD_VALUE, "Start stream %d failed with ret:%d.", i, ret);
+    }
+
+    for (auto& item : mProcessors) {
+        ret = item->start();
+        CheckError((ret < 0), BAD_VALUE, "Start image processor failed with ret:%d.", ret);
+    }
+
+    //Start the CaptureUnit for streamon
+    ret = mProducer->start();
+    CheckError((ret < 0), BAD_VALUE, "Start capture unit failed with ret:%d.", ret);
+
+    ret = mSofSource->start();
+    CheckError((ret != OK), BAD_VALUE, "Start SOF event source failed with ret:%d.", ret);
+
+    return OK;
+}
+
+// Internal stop without lock hold
+int CameraDevice::stopLocked()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+
+    unbindListeners();
+
+    mSofSource->stop();
+
+    //Stop the CaptureUnit for streamon
+    mProducer->stop();
+
+    for (auto& item : mProcessors) {
+        item->stop();
+    }
+
+    mParamGenerator->reset();
+
+    return OK;
+}
+
+int CameraDevice::reconfigure(stream_config_t *streamList)
+{
+    AutoMutex   m(mDeviceLock);
+
+    int ret = OK;
+
+    LOG2("%s: switch type: %d, new mode:%d", __func__,
+        PlatformData::getAutoSwitchType(mCameraId), streamList->operation_mode);
+
+    if (PlatformData::getAutoSwitchType(mCameraId) == AUTO_SWITCH_FULL) {
+        // Wait and return all user buffers in all streams firstly
+        for (int streamId = 0; streamId < mStreamNum; streamId++) {
+            mStreams[streamId]->waitToReturnAllUserBufffers();
+        }
+
+        LOG2("%s: all streams stopped", __func__);
+
+        // Stop and clean what needed.
+        m3AControl->stop();
+
+        if (mState == DEVICE_START)
+            stopLocked();
+
+        mState = DEVICE_STOP;
+
+        for (int streamId = 0; streamId < mStreamNum; streamId++) {
+            mStreams[streamId]->stop();
+        }
+
+        mProcessorManager->deleteProcessors();
+
+        m3AControl->deinit();
+
+        mSofSource->deinit();
+
+        mProducer->deinit();
+
+        /* TODO: Currently kernel have issue and need reopen subdevices
+         * when stream off and on. Remove below delete and recreate code
+         * when all kernel issues got fixed.
+         */
+        // Delete related components and v4l2 devices
+        delete mLensCtrl;
+        delete m3AControl;
+        delete mSensorCtrl;
+        delete mSofSource;
+        delete mProducer;
+
+        V4l2DeviceFactory::releaseDeviceFactory(mCameraId);
+
+        // Re-create related components and v4l2 devices
+        mProducer = createBufferProducer();
+        mSofSource = new SofSource(mCameraId);
+        mLensCtrl = new LensHw(mCameraId);
+        mSensorCtrl = SensorHwCtrl::createSensorCtrl(mCameraId);
+        m3AControl = I3AControlFactory::createI3AControl(mCameraId, mSensorCtrl, mLensCtrl);
+
+        // Init and config with new mode
+        int ret = mProducer->init();
+        CheckError(ret < 0, ret, "%s: Init capture unit failed", __func__);
+
+        ret = mSofSource->init();
+        CheckError(ret != OK, ret, "@%s: init sync manager failed", __func__);
+
+        initDefaultParameters();
+
+        ret = m3AControl->init();
+        CheckError((ret != OK), ret, "%s: Init 3A Unit falied", __func__);
+
+        ret = mLensCtrl->init();
+        CheckError((ret != OK), ret, "%s: Init Lens falied", __func__);
+
+        mState = DEVICE_INIT;
+
+        // Auto switch do not recreate streams.
+        configureL(streamList, false);
+
+        ret = m3AControl->setParameters(mParameter);
+        for (auto& item : mProcessors) {
+            item->setParameters(mParameter);
+        }
+        CheckError((ret != OK), ret, "%s: set parameters falied", __func__);
+
+        ret = m3AControl->start();
+        CheckError((ret != OK), BAD_VALUE, "Start 3a unit failed with ret:%d.", ret);
+
+        mState = DEVICE_BUFFER_READY;
+
+        ret = startLocked();
+        if (ret != OK) {
+            LOGE("Camera device starts failed.");
+            stopLocked();  // There is error happened, stop all related units.
+            return INVALID_OPERATION;
+        }
+
+        mState = DEVICE_START;
+
+        LOG2("%s: reconfigure CameraDevice done", __func__);
+    } else {
+
+        /* TODO: scene mode based psys-only auto switch here will be used to
+         * replace current auto-switch mechanism in AiqSetting:updateTuningMode,
+         * which is for non-DOL sensor auto-switch. The switch stabilization
+         * counting in AiqSetting:updateTuningMode will also be replaced by the
+         * same mechanism in RequestThread.
+         */
+        LOG2("%s: reconfigure CameraDevice to new mode %d with psys-only switch",
+             __func__, streamList->operation_mode);
+    }
+
+    return ret;
+}
+
+void CameraDevice::handleEvent(EventData eventData)
+{
+    LOG2("%s, event type:%d", __func__, eventData.type);
+
+    switch (eventData.type) {
+    case EVENT_PROCESS_REQUEST: {
+        const EventRequestData& request = eventData.data.request;
+        if (request.param) {
+            for (auto& item : mProcessors) {
+                 item->setParameters(*request.param);
+            }
+
+            // Set test pattern mode
+            camera_test_pattern_mode_t testPatternMode = TEST_PATTERN_OFF;
+            if (PlatformData::isTestPatternSupported(mCameraId)
+                    && request.param->getTestPatternMode(testPatternMode) == OK) {
+                int32_t sensorTestPattern =
+                            PlatformData::getSensorTestPattern(mCameraId, testPatternMode);
+                if (sensorTestPattern > 0) {
+                    if (mSensorCtrl->setTestPatternMode(sensorTestPattern) < 0) {
+                        LOGE("%s, set testPatternMode failed", __func__);
+                    }
+                }
+            }
+        }
+
+        handleQueueBuffer(request.bufferNum, request.buffer, request.settingSeq);
+        break;
+    }
+
+    case EVENT_DEVICE_RECONFIGURE: {
+        const EventConfigData& config = eventData.data.config;
+        reconfigure(config.streamList);
+        break;
+    }
+
+    case EVENT_PSYS_REQUEST_BUF_READY: {
+        if (mCallback) {
+            camera_msg_data_t data;
+            CLEAR(data);
+            data.type = CAMERA_ISP_BUF_READY;
+            data.data.buffer_ready.timestamp = eventData.data.requestReady.timestamp;
+            mCallback->notify(mCallback, data);
+        }
+        break;
+    }
+
+    default:
+        LOGE("Not supported event type:%d", eventData.type);
+        break;
+    }
+}
+
+int CameraDevice::initDefaultParameters()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("@%s mCameraId:%d", __func__, mCameraId);
+
+    camera_info_t info;
+    CLEAR(info);
+    PlatformData::getCameraInfo(mCameraId, info);
+
+    // Init mParameter to camera's capability first and then add some others default settings
+    mParameter = *info.capability;
+
+    // TODO: Figure out a better place to set default parameters since they may be platform specified.
+    camera_range_t fps = {10, 60};
+    mParameter.setFpsRange(fps);
+    mParameter.setFrameRate(30);
+
+    camera_image_enhancement_t enhancement;
+    CLEAR(enhancement); // All use 0 as default
+    mParameter.setImageEnhancement(enhancement);
+
+    mParameter.setWeightGridMode(WEIGHT_GRID_AUTO);
+
+    mParameter.setWdrLevel(100);
+
+    mParameter.setFlipMode(FLIP_MODE_NONE);
+
+    mParameter.setRun3ACadence(1);
+
+    mParameter.setYuvColorRangeMode(PlatformData::getYuvColorRangeMode(mCameraId));
+
+    mParameter.setTonemapMode(TONEMAP_MODE_FAST);
+
+    return OK;
+}
+
+} //namespace icamera
+
diff --git a/camera/hal/intel/ipu6/src/core/CameraDevice.h b/camera/hal/intel/ipu6/src/core/CameraDevice.h
new file mode 100644
index 000000000000..82e7afd74fd9
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/CameraDevice.h
@@ -0,0 +1,284 @@
+/*
+ * Copyright (C) 2016-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "CameraStream.h"
+#include "RequestThread.h"
+#include "StreamSource.h"
+#include "AiqUnit.h"
+#include "Parameters.h"
+#include "ParameterGenerator.h"
+#include "SensorHwCtrl.h"
+#include "SofSource.h"
+#include "LensHw.h"
+
+#include "ProcessorManager.h"
+
+#include "gc/IGraphConfigManager.h"
+
+namespace icamera {
+
+class RequestThread;
+
+/**
+  * CameraDevice : Create elements to construct the streaming pipeline
+  * Each element must be a producer or a consumer or Both.
+  *
+  * These are the typical pipelines:
+  *
+  * For a single SOC YUV capture in by pass mode
+  * StreamSource -> CameraStream
+  *
+  * For a single NV12 capture of TPG/Sensor using SwImageProcess
+  * StreamSource -> SwImageProcessor -> CameraStream
+  *
+  * For a single NV12 capture of TPG/Sensor using PSYS processor
+  * StreamSource -> PsysProcessor -> CameraStream
+  *
+  * For a dual streams NV12 video capture of TPG/Sensor using PSYS processor
+  * StreamSource -> PsysProcessor | -> CameraStream (For video recording)
+  *                              | -> CameraStream (for Preview)
+  *
+  * For a SDV(Snapshot during video) capture of TPG/Sensor uinsg PSYS processor
+  * StreamSource | -> PsysProcessor | -> CameraStream (For video recording)
+  *             |                  | -> CameraStream (for Preview)
+  *             | -> PsysProcessor | -> CameraStream (For still YUV)
+  *
+  * The buffer notification between the Class is based on Interface defined
+  * in BufferQueue. The upstream element use "onFrameAvailable" message to notfiy
+  * downstream elements that the buffers are ready for further processing
+  *
+  * Following singleton instances are created and maintained by CameraDevice
+  * 1. IGraphConfigManager
+  * 2. AiqResultStorage
+  */
+class CameraDevice : public EventListener {
+
+public:
+    CameraDevice(int cameraId);
+    ~CameraDevice();
+
+    /**
+     * \brief Camera device class init
+     *
+     * 1.Related classes init: StreamSource, SofSource, 3AControl, lensCtrl
+     * 2.Register listener if enable AIQ
+     * 3.Set the defualt parameters
+     *
+     * \return OK if succeed, other value indicates failed
+     */
+    int init();
+
+    /**
+     * \brief Camera device class deinit
+     *
+     * 1.Change the state
+     * 2.Destory the listeners
+     * 3.Delete the streams
+     * 4.Deinit the Related classes.
+     */
+    void deinit();
+
+    /**
+     * \brief Camera device start
+     *
+     * 1. Start all streams
+     * 2. Related classes start
+     *
+     * \return OK if succeed, other value indicates failed
+     */
+    int start();
+
+    /**
+     * \brief Camera device stop
+     *
+     * 1. Stop all related class module.
+     * 2. Change the state
+     */
+    int stop();
+
+    /**
+     * \brief Allocate momery according to user buffer
+     *
+     * 1. Convert user buffer to CameraBuffer and push it into UserBufferQueue
+     * 2. Calling CameraStream class to allocateMemory.
+     *
+     * \return OK if succeed, other value indicates failed
+     */
+    int allocateMemory(camera_buffer_t *ubuffer);
+
+    /**
+     * \brief dequeue buffer from cameraStream.
+     *
+     * 1. Dequeue one CameraBuffer from CameraStream
+     * 2. Fill the user buffer base on CameraBuffer
+     * 3. Fill the settings was used for this buffer if settings is not nullptr
+     *
+     * \return 0 if succeed, other value indicates failed
+     */
+    int dqbuf(int streamId, camera_buffer_t **ubuffer, Parameters* settings = nullptr);
+
+    /**
+     * \brief Queue one buffer to CameraStream
+     *
+     * 1. Get the CameraBuffer base on the ubuffer
+     * 2. Calling CameraStream to queue one CameraBuffer
+     *
+     * \return OK if succeed and BAD_VALUE if failed
+     */
+    int qbuf(camera_buffer_t **ubuffer, int bufferNum = 1, const Parameters* settings = nullptr);
+
+    /**
+     * \brief Configure the device sensor input
+     *
+     *
+     * \param inputConfig: the Output format/resolution of the isys
+     *
+     * \return OK if succeed and BAD_VALUE if failed
+     */
+    int configureInput(const stream_t *inputConfig);
+
+    /**
+     * \brief Configure the streams, devices and post processor.
+     *
+     * Configure the streams according to the streamList info
+     * Extra processor is needed if the format isn't supported in Psys output
+     *
+     * \param streamList: all the streams info
+     *
+     * \return OK if succeed and BAD_VALUE if failed
+     */
+    int configure(stream_config_t *streamList);
+
+    /**
+     * \brief Set the parameters
+     *
+     * Merge the param to internal parameters and set them to 3A
+     * and processor.
+     *
+     * \param param: the parameters need to set
+     *
+     * \return OK if succeed, other value indicates failed
+     */
+    int setParameters(const Parameters& param);
+
+    /**
+     * \brief Get the parameters
+     *
+     * Get the internal parameters list
+     *
+     * \return OK if succeed, other value indicates failed
+     */
+    int getParameters(Parameters& param);
+
+    void handleEvent(EventData eventData);
+
+    void callbackRegister(const camera_callback_ops_t* callback);
+private:
+    DISALLOW_COPY_AND_ASSIGN(CameraDevice);
+
+    /**
+     * \brief Reconfigure the streams, devices and post processor.
+     *
+     * \param streamList: all the streams info
+     *
+     * \return OK if succeed and BAD_VALUE if failed
+     */
+    int reconfigure(stream_config_t *streamList);
+
+    int startLocked();
+    int stopLocked();
+    int initDefaultParameters();
+    std::shared_ptr<CameraBuffer> userBufferToCameraBuffer(Port port,
+                                                                camera_buffer_t *ubuffer);
+
+    StreamSource* createBufferProducer();
+    std::map<Port, stream_t> selectProducerConfig(const stream_config_t *streamList, int mcId);
+    bool isProcessorNeeded(const stream_config_t *streamList, const stream_t &producerConfig);
+    bool isStillDuringVideo(const stream_config_t *streamList);
+    int analyzeStream(stream_config_t *streamList);
+    int createStreams(stream_config_t *streamList);
+    int bindStreams(stream_config_t *streamList);
+    void deleteStreams();
+
+    /**
+     * Bind all event listeners with their source.
+     */
+    void bindListeners();
+
+    /**
+     * Unbind all event listeners from their source.
+     */
+    void unbindListeners();
+
+    long fetchCaptureSettings(const Parameters * params);
+
+    // The second phase of qbuf(), done in RequestThread
+    int handleQueueBuffer(int bufferNum, camera_buffer_t **ubuffer, long sequence);
+
+    // No lock protect for internal usage, should be protected by mDeviceLock from outside
+    int configureL(stream_config_t *streamList, bool clean = true);
+    int setParametersL(const Parameters& param);
+
+    int registerBuffer(camera_buffer_t **ubuffer, int bufferNum);
+
+private:
+    enum {
+        DEVICE_UNINIT = 0,
+        DEVICE_INIT,
+        DEVICE_CONFIGURE, //means stream configured
+        DEVICE_START,
+        DEVICE_STOP,
+        DEVICE_BUFFER_READY, //At least one buffer is queued to ISP
+    } mState;
+
+    // Guard for CameraDevice public API
+    Mutex mDeviceLock;
+
+    static const nsecs_t kWaitDuration = 5000000000; //5000ms
+
+    // Pipeline elements
+    CameraStream* mStreams[MAX_STREAM_NUMBER];
+    std::map<int, Port> mStreamIdToPortMap;
+    std::vector<int> mSortedStreamIds; // Used to save sorted stream ids with descending order.
+    StreamSource *mProducer;
+
+    ProcessorManager* mProcessorManager;
+    std::vector<BufferQueue*> mProcessors;
+
+    ParameterGenerator *mParamGenerator;
+
+    LensHw *mLensCtrl;
+    SensorHwCtrl *mSensorCtrl;
+    SofSource* mSofSource;
+    AiqUnitBase *m3AControl;
+
+    //Internal used variable
+    int     mCameraId;
+    int     mStreamNum;
+    Parameters mParameter;
+    //The latest result parameters
+    Parameters mResultParameter;
+    bool mPerframeControlSupport;
+
+    RequestThread* mRequestThread;
+    IGraphConfigManager *mGCM;
+    stream_t mInputConfig;
+    camera_callback_ops_t *mCallback;
+};
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/CameraEvent.cpp b/camera/hal/intel/ipu6/src/core/CameraEvent.cpp
new file mode 100644
index 000000000000..6d2a6f10ebc1
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/CameraEvent.cpp
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2015-2017 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "CameraEvent"
+
+#include "iutils/CameraLog.h"
+
+#include "CameraEvent.h"
+
+namespace icamera {
+
+EventSource::EventSource()
+{
+    LOG1("@%s EventSource created", __func__);
+}
+
+EventSource::~EventSource()
+{
+    LOG1("@%s EventSource destructed", __func__);
+}
+
+void EventSource::registerListener(EventType eventType, EventListener* eventListener)
+{
+    LOG1("@%s eventType: %d, listener: %p", __func__, eventType, eventListener);
+
+    CheckError(eventListener == nullptr, VOID_VALUE,
+          "%s: event listener is nullptr, skip registration.", __func__);
+
+    AutoMutex l(mListenersLock);
+
+    std::set<EventListener*> listenersOfType;
+    if (mListeners.find(eventType) != mListeners.end()) {
+        listenersOfType = mListeners[eventType];
+    }
+
+    listenersOfType.insert(eventListener);
+    mListeners[eventType] = listenersOfType;
+}
+
+void EventSource::removeListener(EventType eventType, EventListener* eventListener)
+{
+    LOG1("@%s eventType: %d, listener: %p", __func__, eventType, eventListener);
+    AutoMutex l(mListenersLock);
+
+    if (mListeners.find(eventType) == mListeners.end()) {
+        LOG1("%s: no listener found for event type %d", __func__, eventType);
+        return;
+    }
+
+    std::set<EventListener*> listenersOfType = mListeners[eventType];
+    listenersOfType.erase(eventListener);
+}
+
+void EventSource::notifyListeners(EventData eventData)
+{
+    LOG2("@%s eventType: %d", __func__, eventData.type);
+    AutoMutex l(mListenersLock);
+
+    if (mListeners.find(eventData.type) == mListeners.end()){
+        LOG2("%s: no listener found for event type %d", __func__, eventData.type);
+        return;
+    }
+
+    for (auto listener : mListeners[eventData.type]) {
+        LOG2("%s: send event data to listener %p for event type %d", __func__, listener, eventData.type);
+        listener->handleEvent(eventData);
+    }
+}
+
+}
diff --git a/camera/hal/intel/ipu6/src/core/CameraEvent.h b/camera/hal/intel/ipu6/src/core/CameraEvent.h
new file mode 100644
index 000000000000..4a15167cd799
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/CameraEvent.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2015-2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <map>
+#include <set>
+
+#include "iutils/Thread.h"
+#include "CameraEventType.h"
+
+namespace icamera {
+
+class EventListener
+{
+public:
+    EventListener() {};
+    virtual ~EventListener() {};
+    virtual void handleEvent(EventData eventData) {};
+};
+
+class EventSource
+{
+private:
+    std::map<EventType, std::set<EventListener*>> mListeners;
+
+    // Guard for EventSource public API to protect mListeners.
+    Mutex mListenersLock;
+public:
+    EventSource();
+    virtual ~EventSource();
+    virtual void registerListener(EventType eventType, EventListener* eventListener);
+    virtual void removeListener(EventType eventType, EventListener* eventListener);
+    virtual void notifyListeners(EventData eventData);
+};
+
+}
diff --git a/camera/hal/intel/ipu6/src/core/CameraEventType.h b/camera/hal/intel/ipu6/src/core/CameraEventType.h
new file mode 100644
index 000000000000..8f870d4269f3
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/CameraEventType.h
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+
+#include "iutils/Utils.h"
+#include "Parameters.h"
+
+namespace icamera {
+
+class CameraBuffer;
+
+enum EventType
+{
+    EVENT_ISYS_SOF = 0,
+    EVENT_PSYS_STATS_BUF_READY,
+    EVENT_PSYS_STATS_SIS_BUF_READY,
+    EVENT_ISYS_FRAME,
+    EVENT_PSYS_FRAME,
+    EVENT_PROCESS_REQUEST,
+    EVENT_DEVICE_RECONFIGURE,
+    EVENT_FRAME_AVAILABLE,
+    EVENT_PSYS_REQUEST_BUF_READY,
+};
+
+struct EventDataStatsReady
+{
+    timeval timestamp;
+    long sequence;
+};
+
+struct EventDataSync
+{
+    timeval timestamp;
+    long sequence;
+};
+
+struct EventDataFrame
+{
+    timeval timestamp;
+    long sequence;
+};
+
+struct EventDataMeta
+{
+    timeval timestamp;
+    long sequence;
+};
+
+struct EventRequestData
+{
+    int bufferNum;
+    camera_buffer_t** buffer;
+    Parameters* param;
+
+    long settingSeq;
+};
+
+struct EventConfigData
+{
+    stream_config_t *streamList;
+};
+
+struct EventFrameAvailable
+{
+    int streamId;
+};
+
+struct EventRequestBufferReady
+{
+    int64_t timestamp;
+};
+
+struct EventData
+{
+    EventData() : type(EVENT_ISYS_SOF) {
+        CLEAR(data);
+    }
+
+    EventType type;
+    std::shared_ptr<CameraBuffer> buffer;
+    union
+    {
+        EventDataStatsReady statsReady;
+        EventDataSync sync;
+        EventDataFrame frame;
+        EventDataMeta meta;
+        EventRequestData request;
+        EventConfigData config;
+        EventFrameAvailable frameDone;
+        EventRequestBufferReady requestReady;
+    } data;
+};
+
+}
diff --git a/camera/hal/intel/ipu6/src/core/CameraStream.cpp b/camera/hal/intel/ipu6/src/core/CameraStream.cpp
new file mode 100644
index 000000000000..6bc8d32c41f0
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/CameraStream.cpp
@@ -0,0 +1,230 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "CameraStream"
+
+#include "iutils/CameraLog.h"
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+
+#include "CameraStream.h"
+#include "PlatformData.h"
+
+using std::shared_ptr;
+
+namespace icamera {
+
+CameraStream::CameraStream(int cameraId, int streamId, const stream_t& stream)
+      : mCameraId(cameraId),
+        mStreamId(streamId),
+        mPort(MAIN_PORT),
+        mBufferProducer(nullptr),
+        mNumHoldingUserBuffers(0),
+        mIsWaitingBufferReturn(false)
+{
+    LOG1("@%s: mCameraId:%d, width:%d, height:%d, format:%s", __func__,
+          mCameraId, stream.width, CameraUtils::getInterlaceHeight(stream.field, stream.height),
+          CameraUtils::pixelCode2String(stream.format));
+    LOG2("@%s: automation checkpoint: WHF: %d,%d,%s", __func__,
+          stream.width, CameraUtils::getInterlaceHeight(stream.field, stream.height),
+          CameraUtils::pixelCode2String(stream.format));
+}
+
+CameraStream::~CameraStream()
+{
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+}
+
+int CameraStream::start()
+{
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+
+    return OK;
+}
+
+int CameraStream::stop()
+{
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+
+    mIsWaitingBufferReturn = false;
+    mNumHoldingUserBuffers = 0;
+
+    if (mBufferProducer != nullptr)
+        mBufferProducer->removeFrameAvailableListener(this);
+
+    AutoMutex poolLock(mBufferPoolLock);
+    mUserBuffersPool.clear();
+
+    return OK;
+}
+
+/*
+ * Allocate memory to the stream processor which should be
+ * set by the CameraDevice
+ */
+int CameraStream::allocateMemory(camera_buffer_t *ubuffer)
+{
+    LOG1("@%s, mCameraId:%d, ubuffer %p", __func__, mCameraId, ubuffer);
+
+    int ret = BAD_VALUE;
+    shared_ptr<CameraBuffer> camBuffer = userBufferToCameraBuffer(ubuffer);
+    CheckError(!camBuffer, ret, "@%s: fail to alloc CameraBuffer", __func__);
+
+    // mBufferProducer will not change after start
+    if (mBufferProducer)
+        ret = mBufferProducer->allocateMemory(mPort, camBuffer);
+
+    return ret;
+}
+
+shared_ptr<CameraBuffer> CameraStream::userBufferToCameraBuffer(camera_buffer_t *ubuffer)
+{
+    if (ubuffer == nullptr) return nullptr;
+
+    shared_ptr<CameraBuffer> camBuffer = nullptr;
+
+    AutoMutex l(mBufferPoolLock);
+    for (auto& buffer : mUserBuffersPool) {
+        if (buffer->getUserBuffer() == ubuffer) {
+            camBuffer = buffer;
+            break;
+        }
+    }
+
+    if (!camBuffer) { // Not found in the pool, so create a new CameraBuffer for it.
+        ubuffer->index = mUserBuffersPool.size();
+        camBuffer = std::make_shared<CameraBuffer>(mCameraId, BUFFER_USAGE_GENERAL,
+                ubuffer->s.memType, ubuffer->s.size, ubuffer->index, ubuffer->s.format);
+        CheckError(!camBuffer, nullptr, "@%s: fail to alloc CameraBuffer", __func__);
+        mUserBuffersPool.push_back(camBuffer);
+    }
+    camBuffer->setUserBufferInfo(ubuffer);
+
+    // Update the v4l2 flags
+    camBuffer->updateFlags();
+
+    return camBuffer;
+}
+
+void CameraStream::waitToReturnAllUserBufffers()
+{
+    LOG1("%s: wait for all user buffers to be returned to user", __func__);
+
+    ConditionLock lock(mBufferPoolLock);
+
+    if (mNumHoldingUserBuffers > 0){
+        // mIsWaitingBufferReturn flag is used to prevent situation that signal goes before wait
+        mIsWaitingBufferReturn = true;
+        int ret = mAllBuffersReturnedSignal.waitRelative(lock,
+                                                         kWaitDuration * SLOWLY_MULTIPLIER);
+
+        if (ret == TIMED_OUT) {
+            LOGW("@%s, mCameraId:%d, time out happens when waiting return user buffers",
+                 __func__, mCameraId);
+            return;
+        }
+        mIsWaitingBufferReturn = false;
+    }
+
+    LOG1("%s: all buffers have been returned to user", __func__);
+
+    return;
+}
+
+// Q buffers to the stream processor which should be set by the CameraDevice
+int CameraStream::qbuf(camera_buffer_t *ubuffer, long sequence)
+{
+    shared_ptr<CameraBuffer> camBuffer = userBufferToCameraBuffer(ubuffer);
+    if (camBuffer) {
+        camBuffer->setSettingSequence(sequence);
+        LOG2("@%s, mCameraId:%d, mStreamId:%d, CameraBuffer:%p for port:%d, ubuffer:%p, addr:%p",
+             __func__, mCameraId, mStreamId, camBuffer.get(), mPort, ubuffer, ubuffer->addr);
+    }
+
+    int ret = BAD_VALUE;
+    // mBufferProducer will not change after start, no lock
+    if (mBufferProducer != nullptr) {
+        ret = mBufferProducer->qbuf(mPort, camBuffer);
+        if (ret == OK) {
+            mNumHoldingUserBuffers++;
+        }
+    }
+    return ret;
+}
+
+//This function is called in stop status, no lock
+void CameraStream::setBufferProducer(BufferProducer *producer)
+{
+    LOG1("@%s, mCameraId:%d, producer %p", __func__, mCameraId, producer);
+
+    mBufferProducer = producer;
+
+    if (producer != nullptr)
+        producer->addFrameAvailableListener(this);
+}
+
+int CameraStream::onFrameAvailable(Port port, const shared_ptr<CameraBuffer> &camBuffer)
+{
+    // Ignore if the buffer is not for this stream.
+    if (mPort != port) return OK;
+    if (camBuffer->getStreamId() != mStreamId) return OK;
+
+    LOG2("@%s: mCameraId:%d, mStreamId:%d, CameraBuffer:%p for port:%d",
+         __func__, mCameraId, mStreamId, camBuffer.get(), port);
+
+    // Update the user buffer info before return back
+    camBuffer->updateUserBuffer();
+
+    EventFrameAvailable frameData;
+    frameData.streamId = mStreamId;
+    EventData eventData;
+    eventData.type = EVENT_FRAME_AVAILABLE;
+    eventData.buffer = camBuffer;
+    eventData.data.frameDone = frameData;
+    notifyListeners(eventData);
+
+    camera_buffer_t* ubuffer = camBuffer->getUserBuffer();
+    LOG2("ubuffer:%p, addr:%p, timestamp:%lu, sequence:%ld",
+         ubuffer, ubuffer->addr, ubuffer->timestamp, ubuffer->sequence);
+
+    LOGVCSYNC("[onFrameDone], CPU-timestamp:%lu, sequence:%ld, vc:%d, kernel-timestamp:%luus, endl",
+        CameraUtils::systemTime(),
+        ubuffer->sequence,
+        camBuffer->getVirtualChannel(),
+        ubuffer->timestamp);
+
+    PERF_CAMERA_ATRACE_PARAM3("sequence", camBuffer->getSequence(),
+                              "csi2_port", camBuffer->getCsi2Port(),
+                              "virtual_channel", camBuffer->getVirtualChannel());
+
+    AutoMutex l(mBufferPoolLock);
+
+    if (mNumHoldingUserBuffers > 0) {
+        mNumHoldingUserBuffers--;
+    }
+
+    LOG2("mNumHoldingUserBuffers has already been counted down to %d", mNumHoldingUserBuffers);
+
+    // mIsWaitingBufferReturn is used to prevent signal before wait
+    if (mIsWaitingBufferReturn && mNumHoldingUserBuffers == 0) {
+        LOG2("%s: all user buffer returned, trigger signal", __func__);
+        mAllBuffersReturnedSignal.signal();
+    }
+
+    return OK;
+}
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/CameraStream.h b/camera/hal/intel/ipu6/src/core/CameraStream.h
new file mode 100644
index 000000000000..5ac9472d4254
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/CameraStream.h
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "Parameters.h"
+#include "CameraBuffer.h"
+#include "BufferQueue.h"
+
+#include "iutils/Thread.h"
+
+namespace icamera {
+
+/**
+  * CameraStream: The HAL represent of the application stream.
+  * CameraStream implement the BufferConsumer interface.
+  *
+  * CameraStream provide the buffer interface to application.
+  * It gets buffers from producers and returns to the app
+  *
+  * Application used the DQ buffer to get the buffers from Camera
+  * and Q buffer to return the buffers to camera.
+  */
+
+class CameraStream: public BufferConsumer, public EventSource {
+public:
+    CameraStream(int cameraId, int streamId, const stream_t& stream);
+    virtual ~CameraStream();
+
+    /**
+     * \brief Set which port this stream is linked to.
+     */
+    void setPort(Port port) { mPort = port; }
+
+    /**
+     * \brief get the port which the stream is linked to.
+     */
+    Port getPort() { return mPort; }
+
+    /**
+     * \brief Set the StreamActive state
+     */
+    int start();
+
+    /**
+     * \brief Clear streamActive state and clear up
+     * the buffer queue
+     */
+    int stop();
+
+    /**
+     * \brief Push one CameraBuffer to bufferProducer
+     */
+    int qbuf(camera_buffer_t *ubuffer, long sequence);
+
+    /**
+     * \brief Calling mBufferProducer to allocate memory
+     *
+     * \return OK if succeed and BAD_VALUE if failed
+     */
+    int allocateMemory(camera_buffer_t *buffer);
+
+    std::shared_ptr<CameraBuffer> userBufferToCameraBuffer(camera_buffer_t *ubuffer);
+
+    /**
+     * \brief Wait all user buffers to be returned to user
+     */
+    void waitToReturnAllUserBufffers();
+
+    /**
+     * \brief Register the mBufferProducer
+     */
+    virtual void setBufferProducer(BufferProducer *producer);
+
+    /**
+     * \brief The notify when polled or processed one frame buffer
+     */
+    virtual int onFrameAvailable(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
+
+private:
+    static const nsecs_t kWaitDuration = 10000000000; //10000ms
+
+    int mCameraId;
+    int mStreamId;
+    Port mPort;
+
+    BufferProducer   *mBufferProducer;
+
+    CameraBufVector    mUserBuffersPool;
+
+    // Guard for member mUserBuffersPool, used in the qbuf which is critical for FPS
+    // Prevent qbuf and dqbuf to share the same lock
+    Mutex mBufferPoolLock;
+
+    // Siginal for the situation that all buffers returned to user
+    Condition mAllBuffersReturnedSignal;
+
+    // How many user buffers are currently processing underhood.
+    int mNumHoldingUserBuffers;
+
+    // Flag to indicate that currently waiting for all user buffers to be returned
+    bool mIsWaitingBufferReturn;
+};
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/CaptureUnit.cpp b/camera/hal/intel/ipu6/src/core/CaptureUnit.cpp
new file mode 100644
index 000000000000..2823ac32488c
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/CaptureUnit.cpp
@@ -0,0 +1,510 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "CaptureUnit"
+
+#include <poll.h>
+
+#include "iutils/CameraLog.h"
+#include "iutils/CameraDump.h"
+#include "iutils/Utils.h"
+
+#include "PlatformData.h"
+#include "MediaControl.h"
+#include "CaptureUnit.h"
+
+using std::vector;
+using std::map;
+
+namespace icamera {
+
+CaptureUnit::CaptureUnit(int cameraId, int memType) :
+    StreamSource(memType),
+    mCameraId(cameraId),
+    mMaxBufferNum(MAX_BUFFER_COUNT),
+    mState(CAPTURE_UNINIT),
+    mExitPending(false)
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
+
+    mPollThread = new PollThread(this);
+
+    mMaxBuffersInDevice = PlatformData::getExposureLag(mCameraId) + 1;
+    if (mMaxBuffersInDevice < 2) {
+        mMaxBuffersInDevice = 2;
+    }
+}
+
+CaptureUnit::~CaptureUnit()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
+
+    delete mPollThread;
+}
+
+int CaptureUnit::init()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
+
+    mState = CAPTURE_INIT;
+
+    return OK;
+}
+
+void CaptureUnit::deinit()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
+
+    if (mState == CAPTURE_UNINIT) {
+        LOG1("%s: deinit without init", __func__);
+        return;
+    }
+
+    destroyDevices();
+    mPollThread->join();
+
+    mState = CAPTURE_UNINIT;
+}
+
+int CaptureUnit::createDevices()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
+
+    destroyDevices();
+
+    // Default INVALID_PORT means the device isn't associated with any outside consumers.
+    const Port kDefaultPort = INVALID_PORT;
+    Port portOfMainDevice = findDefaultPort(mOutputFrameInfo);
+    // Use the config for main port as the default one.
+    const stream_t& kDefaultStream = mOutputFrameInfo.at(portOfMainDevice);
+    // targetPorts specifies the desired port for the device. But the real port which will be used
+    // is deciced whether the port is provided by the consumer.
+    vector<Port> targetPorts;
+
+    // Use VIDEO_GENERIC by default.
+    VideoNodeType nodeType = VIDEO_GENERIC;
+
+    mDevices.push_back(new MainDevice(mCameraId, nodeType, this));
+    targetPorts.push_back(portOfMainDevice);
+
+    // Open and configure the devices. The stream and port that are used by the device is
+    // decided by whether consumer has provided such info, use the default one if not.
+    for (uint8_t i = 0; i < mDevices.size(); i++) {
+        DeviceBase* device = mDevices[i];
+
+        int ret = device->openDevice();
+        CheckError(ret != OK, ret, "Open device(%s) failed:%d", device->getName(), ret);
+
+        const Port kTargetPort = targetPorts[i];
+        bool hasPort = mOutputFrameInfo.find(kTargetPort) != mOutputFrameInfo.end();
+        const stream_t& stream = hasPort ? mOutputFrameInfo.at(kTargetPort) : kDefaultStream;
+
+        ret = device->configure(hasPort ? kTargetPort : kDefaultPort, stream, mMaxBufferNum);
+        CheckError(ret != OK, ret, "Configure device(%s) failed:%d", device->getName(), ret);
+    }
+
+    return OK;
+}
+
+void CaptureUnit::destroyDevices()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
+
+    for (auto device : mDevices) {
+        device->closeDevice();
+        delete device;
+    }
+    mDevices.clear();
+
+}
+
+/**
+ * Find the device that can handle the given port.
+ */
+DeviceBase* CaptureUnit::findDeviceByPort(Port port)
+{
+    for (auto device : mDevices) {
+        if (device->getPort() == port) {
+            return device;
+        }
+    }
+
+    return nullptr;
+}
+
+int CaptureUnit::streamOn()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
+
+    for (auto device : mDevices) {
+        int ret = device->streamOn();
+        CheckError(ret < 0, INVALID_OPERATION, "Device:%s stream on failed.", device->getName());
+    }
+
+    return OK;
+}
+
+int CaptureUnit::start()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
+
+    AutoMutex l(mLock);
+    CheckWarning(mState == CAPTURE_START, OK, "@%s: device already started", __func__);
+
+    int ret = streamOn();
+    if (ret != OK) {
+        streamOff();
+        LOGE("Devices stream on failed:%d", ret);
+        return ret;
+    }
+
+    mPollThread->run("CaptureUnit", PRIORITY_URGENT_AUDIO);
+    mState = CAPTURE_START;
+    mExitPending = false;
+    LOG2("@%s: automation checkpoint: flag: poll_started", __func__);
+
+    return OK;
+}
+
+void CaptureUnit::streamOff()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
+
+    for (auto device : mDevices) {
+        device->streamOff();
+    }
+}
+
+int CaptureUnit::stop()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
+
+    if (mState != CAPTURE_START) {
+        LOGW("@%s: device not started", __func__);
+        return OK;
+    }
+
+    mExitPending = true;
+    mPollThread->requestExit();
+    streamOff();
+    mPollThread->requestExitAndWait();
+
+    AutoMutex   l(mLock);
+    mState = CAPTURE_STOP;
+
+    for (auto device : mDevices) {
+        device->resetBuffers();
+    }
+
+    LOG2("@%s: automation checkpoint: flag: poll_stopped", __func__);
+
+    mExitPending = false; // It's already stopped.
+
+    return OK;
+}
+
+/**
+ * Check if the given outputFrames are different from the previous one.
+ * Only return false when the config for each port is exactly same.
+ */
+bool CaptureUnit::isNewConfiguration(const map<Port, stream_t>& outputFrames)
+{
+    for (const auto& item : outputFrames) {
+        if (mOutputFrameInfo.find(item.first) == mOutputFrameInfo.end()) {
+            return true;
+        }
+
+        const stream_t& oldStream = mOutputFrameInfo[item.first];
+        const stream_t& newStream = item.second;
+
+        bool isNewConfig = (oldStream.width != newStream.width || oldStream.height != newStream.height
+               || oldStream.format != newStream.format || oldStream.field != newStream.field
+               || oldStream.memType != newStream.memType);
+        if (isNewConfig) {
+            return true;
+        }
+    }
+
+    return false;
+}
+
+int CaptureUnit::configure(const map<Port, stream_t>& outputFrames,
+                           const vector<ConfigMode>& configModes,
+                           uint32_t bufferNum)
+{
+    PERF_CAMERA_ATRACE();
+
+    CheckError(outputFrames.empty(), BAD_VALUE, "No frame info configured.");
+    CheckError(mState != CAPTURE_CONFIGURE && mState != CAPTURE_INIT && mState != CAPTURE_STOP,
+          INVALID_OPERATION, "@%s: Configure in wrong state %d", __func__, mState);
+
+    Port port = findDefaultPort(outputFrames);
+    const stream_t& mainStream = outputFrames.at(port);
+
+    if (!isNewConfiguration(outputFrames)) {
+        LOGD("@%s: Configuration is not changed.", __func__);
+        return OK;
+    }
+
+    for (const auto& item : outputFrames) {
+        LOG1("%s, mCameraId:%d, port:%d, w:%d, h:%d, f:%s", __func__, mCameraId, item.first,
+              item.second.width, item.second.height,
+              CameraUtils::format2string(item.second.format).c_str());
+    }
+
+    mMaxBufferNum = bufferNum;
+    mConfigModes = configModes;
+    mOutputFrameInfo = outputFrames;
+
+    /* media ctl setup */
+    MediaCtlConf *mc = PlatformData::getMediaCtlConf(mCameraId);
+    CheckError(!mc, BAD_VALUE, "get format configuration failed for %s (%dx%d)",
+               CameraUtils::format2string(mainStream.format).c_str(),
+               mainStream.width, mainStream.height);
+
+    int status = MediaControl::getInstance()->mediaCtlSetup(mCameraId, mc,
+            mainStream.width, mainStream.height, mainStream.field);
+    CheckError(status != OK, status, "set up mediaCtl failed");
+
+    // Create, open, and configure all of needed devices.
+    status = createDevices();
+    CheckError(status != OK, status, "Create devices failed:%d", status);
+
+    mState = CAPTURE_CONFIGURE;
+
+    // mExitPending should also be set false in configure to make buffers queued before start
+    mExitPending = false;
+
+    return OK;
+}
+
+Port CaptureUnit::findDefaultPort(const map<Port, stream_t>& frames) const
+{
+    Port availablePorts[] = {MAIN_PORT, SECOND_PORT, THIRD_PORT, FORTH_PORT};
+    for (unsigned int i = 0; i < ARRAY_SIZE(availablePorts); i++) {
+        if (frames.find(availablePorts[i]) != frames.end()) {
+            return availablePorts[i];
+        }
+    }
+    return INVALID_PORT;
+}
+
+int CaptureUnit::allocateMemory(Port port, const std::shared_ptr<CameraBuffer> &camBuffer)
+{
+    const struct v4l2_buffer* v = camBuffer->getV4L2Buffer().Get();
+    CheckError(v->index >= mMaxBufferNum, -1
+        ,"index %d is larger than max count %d", v->index, mMaxBufferNum);
+    CheckError(v->memory != V4L2_MEMORY_MMAP, -1
+        ,"Allocating Memory Capture device only supports MMAP mode.");
+
+    DeviceBase* device = findDeviceByPort(port);
+    CheckError(!device, BAD_VALUE, "No device available for port:%d", port);
+
+    int ret = camBuffer->allocateMemory(device->getV4l2Device());
+    CheckError(ret < 0, ret, "Failed to allocate memory ret(%d) for port:%d", ret, port);
+
+    return OK;
+}
+
+int CaptureUnit::qbuf(Port port, const std::shared_ptr<CameraBuffer> &camBuffer)
+{
+    CheckError(camBuffer == nullptr, BAD_VALUE, "Camera buffer is null");
+    CheckError((mState == CAPTURE_INIT || mState == CAPTURE_UNINIT), INVALID_OPERATION,
+          "@%s: qbuf in wrong state %d", __func__, mState);
+
+    DeviceBase* device = findDeviceByPort(port);
+    CheckError(!device, BAD_VALUE, "No device available for port:%d", port);
+
+    LOG2("@%s, mCameraId:%d, queue CameraBuffer: %p to port:%d",
+         __func__, mCameraId, camBuffer.get(), port);
+
+    device->addPendingBuffer(camBuffer);
+
+    return processPendingBuffers();
+}
+
+int CaptureUnit::queueAllBuffers()
+{
+    PERF_CAMERA_ATRACE();
+
+    if (mExitPending) return OK;
+
+    long predictSequence = -1;
+
+    for (auto device : mDevices) {
+        int ret = device->queueBuffer(predictSequence);
+        if (mExitPending) break;
+        CheckError(ret != OK, ret, "Failed to queue buffer to device:%s, ret=%d",
+             device->getName(), ret);
+        if (predictSequence == -1) {
+            predictSequence = device->getPredictSequence();
+        }
+    }
+
+    return OK;
+}
+
+void CaptureUnit::onDequeueBuffer()
+{
+    processPendingBuffers();
+}
+
+int CaptureUnit::processPendingBuffers()
+{
+    LOG2("%s: buffers in device:%d", __func__, mDevices.front()->getBufferNumInDevice());
+
+    while (mDevices.front()->getBufferNumInDevice() < mMaxBuffersInDevice) {
+        bool hasPendingBuffer = true;
+        for (auto device : mDevices) {
+            if (!device->hasPendingBuffer()) {
+                hasPendingBuffer = false;
+                break;
+            }
+        }
+        // Do not queue buffer when one of the devices has no pending buffers.
+        if (!hasPendingBuffer) break;
+
+        int ret = queueAllBuffers();
+
+        if (mExitPending) break;
+
+        CheckError(ret != OK, ret, "Failed to queue buffers, ret=%d", ret);
+    }
+
+    return OK;
+}
+
+int CaptureUnit::poll()
+{
+    PERF_CAMERA_ATRACE();
+    int ret = 0;
+    const int poll_timeout_count = 10;
+    const int poll_timeout = gSlowlyRunRatio ? (gSlowlyRunRatio * 1000000) : 1000;
+
+    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
+
+    CheckError((mState != CAPTURE_CONFIGURE && mState != CAPTURE_START), INVALID_OPERATION,
+          "@%s: poll buffer in wrong state %d", __func__, mState);
+
+    int timeOutCount = poll_timeout_count;
+
+    std::vector<V4L2Device*> pollDevs, readyDevices;
+    for (const auto& device : mDevices) {
+        pollDevs.push_back(device->getV4l2Device());
+        LOG2("@%s: device:%s has %d buffers queued.",
+              __func__, device->getName(), device->getBufferNumInDevice());
+    }
+
+    while (timeOutCount-- && ret == 0) {
+        // If stream off, no poll needed.
+        if (mExitPending) {
+            LOG2("%s: mExitPending is true, exit", __func__);
+            //Exiting, no error
+            return -1;
+        }
+
+        V4L2DevicePoller poller {pollDevs, -1};
+        ret = poller.Poll(poll_timeout, POLLPRI | POLLIN | POLLOUT | POLLERR, &readyDevices);
+
+        LOG2("@%s: automation checkpoint: flag: poll_buffer, ret:%d", __func__, ret);
+    }
+
+    //In case poll error after stream off
+    if (mExitPending) {
+        LOG2("%s: mExitPending is true, exit", __func__);
+        //Exiting, no error
+        return -1;
+    }
+
+    CheckError(ret < 0, UNKNOWN_ERROR, "%s: Poll error, ret:%d", __func__, ret);
+
+    if (ret == 0) {
+        LOG1("%s, cameraId: %d: timeout happens, wait recovery", __func__, mCameraId);
+        return OK;
+    }
+
+    for (const auto& readyDevice : readyDevices) {
+        for (auto device : mDevices) {
+            if (device->getV4l2Device() == readyDevice) {
+                int ret = device->dequeueBuffer();
+                if (mExitPending) return -1;
+
+                if (ret != OK) {
+                    LOGE("Device:%s grab frame failed:%d", device->getName(), ret);
+                }
+                break;
+            }
+        }
+    }
+
+    return OK;
+}
+
+void CaptureUnit::addFrameAvailableListener(BufferConsumer *listener)
+{
+    LOG1("%s camera id:%d", __func__, mCameraId);
+
+    AutoMutex   l(mLock);
+    for (auto device : mDevices) {
+        device->addFrameListener(listener);
+    }
+}
+
+void CaptureUnit::removeFrameAvailableListener(BufferConsumer *listener)
+{
+    LOG1("%s camera id:%d", __func__, mCameraId);
+
+    AutoMutex   l(mLock);
+    for (auto device : mDevices) {
+        device->removeFrameListener(listener);
+    }
+}
+
+void CaptureUnit::removeAllFrameAvailableListener()
+{
+    LOG1("%s camera id:%d", __func__, mCameraId);
+
+    AutoMutex   l(mLock);
+    for (auto device : mDevices) {
+        device->removeAllFrameListeners();
+    }
+}
+
+void CaptureUnit::registerListener(EventType eventType, EventListener* eventListener)
+{
+    for (auto device : mDevices) {
+        device->registerListener(eventType, eventListener);
+    }
+}
+
+void CaptureUnit::removeListener(EventType eventType, EventListener* eventListener)
+{
+    for (auto device : mDevices) {
+        device->removeListener(eventType, eventListener);
+    }
+}
+} // namespace icamera
+
diff --git a/camera/hal/intel/ipu6/src/core/CaptureUnit.h b/camera/hal/intel/ipu6/src/core/CaptureUnit.h
new file mode 100644
index 000000000000..995b57362fe3
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/CaptureUnit.h
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <map>
+#include <vector>
+
+#include "iutils/Thread.h"
+
+#include "StreamSource.h"
+#include "CameraBuffer.h"
+#include "DeviceBase.h"
+#include "IspParamAdaptor.h"
+
+namespace icamera {
+
+/**
+  * CaptureUnit abstract the ISYS function.
+  * It implements the BufferProducer Interface and it is the source of any pipeline
+  * It hides the v4l2 and media controller to the upper layer.
+  */
+class CaptureUnit : public StreamSource, public DeviceCallback {
+
+public:
+    CaptureUnit(int cameraId, int memType = V4L2_MEMORY_MMAP);
+    virtual ~CaptureUnit();
+
+public:
+    /**
+     * \brief Queue on buffer to driver
+     *
+     * 1. Get the v4l2 buffer form the CameraBuffer
+     * 2. Queue this v4l2 buffer to driver and save it to one queue.
+     *
+     * \param[in] port: Indicates the camBuffer belongs to which port
+     * \param[in] camBuffer: the cameraBuffer queue to driver
+     *
+     * \return 0 if succeed, other value indicates failed
+     */
+    virtual int qbuf(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
+
+    /**
+     * \brief allocate memory
+     *
+     * 1. Get the v4l2 buffer form the CameraBuffer
+     * 2. Query the v4l2 buffer to get the offset
+     * 3. Calling cameraBuffer class to allocate memory
+     *
+     * \return OK if succeed, other value indicates failed
+     */
+    virtual int allocateMemory(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
+
+    /**
+     * \brief Add the frame buffer listener
+     *
+     * \param listener: the listener need to add
+     */
+    virtual void addFrameAvailableListener(BufferConsumer *listener);
+
+    /**
+     * \brief Remove the frame buffer listener
+     *
+     * \param listener: the listener need to remove
+     */
+    virtual void removeFrameAvailableListener(BufferConsumer *listener);
+
+    /**
+     * \brief Remove all the listeners
+     */
+    virtual void removeAllFrameAvailableListener();
+
+    /**
+     * \brief CaptureUnit initialze
+     */
+    virtual int init();
+
+    /**
+     * \brief CaptureUnit deinit
+     *
+     * 1. Destory all the buffer pool
+     * 2. Deinit the v4l2 device
+     * 3. Destory the poll thread
+     */
+    virtual void deinit();
+
+    /**
+     * \brief CaptureUnit start
+     *
+     * 1. Stream on
+     * 2. Running the pool Thread
+     */
+    virtual int start();
+
+    /**
+     * \brief CaptureUnit stop
+     *
+     * 1. Stream off
+     * 3. Release all the buffer queue
+     * 3. Stop the pool thread.
+     */
+    virtual int stop();
+
+    /**
+     * \brief configure the streams
+     *
+     * 1. Setup and reset the MediaControl links
+     * 2. Set format to Capture Device
+     *
+     * \param outputFrames: The output frames' configuration for ISYS.
+     * \param configModes: ConfigMode types
+     * \param bufferNum: Buffer Number
+     *
+     * \return OK if succeed, other value indicates failed
+     */
+    virtual int configure(const std::map<Port, stream_t>& outputFrames,
+                          const std::vector<ConfigMode>& configModes,
+                          uint32_t bufferNum);
+
+    // Override EventSource API to delegate the listeners to DeviceBase.
+    virtual void registerListener(EventType eventType, EventListener* eventListener);
+    virtual void removeListener(EventType eventType, EventListener* eventListener);
+
+    // Overwrite DeviceCallback API
+    void onDequeueBuffer();
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(CaptureUnit);
+
+    int createDevices();
+    void destroyDevices();
+    DeviceBase* findDeviceByPort(Port port);
+    Port findDefaultPort(const std::map<Port, stream_t>& frames) const;
+
+    int streamOn();
+    void streamOff();
+
+    int poll();
+
+    bool isNewConfiguration(const std::map<Port, stream_t>& outputFrames);
+
+    int processPendingBuffers();
+    int queueAllBuffers();
+
+private:
+    /**
+     * \brief The pool frame buffer thread
+     */
+    class PollThread: public Thread {
+        CaptureUnit *mCaptureU;
+        public:
+            PollThread(CaptureUnit *hw) : mCaptureU(hw) { }
+
+            virtual bool threadLoop() {
+                return (mCaptureU->poll() == 0);
+            }
+    };
+
+    PollThread* mPollThread;
+
+    // Guard for mCaptureUnit public API except dqbuf and qbuf
+    Mutex mLock;
+
+    int mCameraId;
+    int mMaxBuffersInDevice;  // To control the number of buffers enqueued, for per-frame control.
+
+    std::vector<ConfigMode> mConfigModes;
+    std::map<Port, stream_t> mOutputFrameInfo;
+    std::vector<DeviceBase*> mDevices;
+    uint32_t mMaxBufferNum;
+
+    enum {
+        CAPTURE_UNINIT,
+        CAPTURE_INIT,
+        CAPTURE_CONFIGURE,
+        CAPTURE_START,
+        CAPTURE_STOP,
+    } mState;
+    bool mExitPending;
+};
+
+} // namespace icamera
+
diff --git a/camera/hal/intel/ipu6/src/core/DeviceBase.cpp b/camera/hal/intel/ipu6/src/core/DeviceBase.cpp
new file mode 100644
index 000000000000..8f7e5d2d02c7
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/DeviceBase.cpp
@@ -0,0 +1,441 @@
+/*
+ * Copyright (C) 2018-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <string>
+#include <vector>
+
+#define LOG_TAG "DeviceBase"
+
+#include "iutils/CameraLog.h"
+#include "iutils/CameraDump.h"
+#include "iutils/Utils.h"
+#include "linux/ipu-isys.h"
+
+#include "SyncManager.h"
+#include "PlatformData.h"
+#include "DeviceBase.h"
+#include "CameraEventType.h"
+#include "V4l2DeviceFactory.h"
+
+using std::shared_ptr;
+
+namespace icamera {
+
+DeviceBase::DeviceBase(int cameraId, VideoNodeType nodeType, VideoNodeDirection nodeDirection,
+                       DeviceCallback* deviceCB) :
+        mCameraId(cameraId),
+        mPort(INVALID_PORT),
+        mNodeType(nodeType),
+        mNodeDirection(nodeDirection),
+        mName(GetNodeName(nodeType)),
+        mLatestSequence(-1),
+        mNeedSkipFrame(false),
+        mDeviceCB(deviceCB),
+        mMaxBufferNumber(MAX_BUFFER_COUNT)
+{
+    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
+
+    mFrameSkipNum = PlatformData::getInitialSkipFrame(mCameraId);
+
+    std::string devName;
+    int ret = PlatformData::getDevNameByType(cameraId, nodeType, devName);
+    CheckError(ret != OK, VOID_VALUE,
+               "Failed to get video device name for cameraId: %d, node type: %d",
+               cameraId, nodeType);
+
+    mDevice = new V4L2VideoNode(devName);
+}
+
+DeviceBase::~DeviceBase()
+{
+    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
+
+    delete mDevice;
+}
+
+int DeviceBase::openDevice()
+{
+    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
+
+    if (PlatformData::isEnableFrameSyncCheck(mCameraId))
+        SyncManager::getInstance()->updateSyncCamNum();
+
+    return mDevice->Open(O_RDWR);
+}
+
+void DeviceBase::closeDevice()
+{
+    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
+    {
+        AutoMutex l(mBufferLock);
+
+        std::vector<V4L2Buffer> bufs;
+        mDevice->SetupBuffers(0, true, mDevice->GetMemoryType(), &bufs);
+
+        mPendingBuffers.clear();
+        mBuffersInDevice.clear();
+        mAllocatedBuffers.clear();
+    }
+
+    mDevice->Close();
+}
+
+int DeviceBase::configure(Port port, const stream_t& config, uint32_t bufferNum)
+{
+    LOG1("%s, camera id:%d device:%s, port:%d", __func__, mCameraId, mName, port);
+
+    mPort = port;
+    mMaxBufferNumber = bufferNum;
+
+    int ret = createBufferPool(config);
+    CheckError(ret != OK, NO_MEMORY, "Failed to create buffer pool:%d", ret);
+
+    resetBuffers();
+
+    return OK;
+}
+
+int DeviceBase::streamOn()
+{
+    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
+
+    mFrameSkipNum = PlatformData::getInitialSkipFrame(mCameraId);
+
+    return mDevice->Start();
+}
+
+int DeviceBase::streamOff()
+{
+    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
+
+    mDevice->Stop(false);
+
+    return OK;
+}
+
+int DeviceBase::queueBuffer(long sequence)
+{
+    LOG2("%s, camera id:%d device:%s", __func__, mCameraId, mName);
+
+    shared_ptr<CameraBuffer> buffer;
+    AutoMutex l(mBufferLock);
+    if (mPendingBuffers.empty()) {
+        LOG2("Device:%s has no pending buffer to be queued.", mName);
+        return OK;
+    }
+    buffer = mPendingBuffers.front();
+
+    int ret = onQueueBuffer(sequence, buffer);
+    CheckError(ret != OK, ret, "Device:%s failed to preprocess the buffer with ret=%d", mName, ret);
+
+    ret = mDevice->PutFrame(&buffer->getV4L2Buffer());
+
+    if (ret >= 0) {
+        mPendingBuffers.pop_front();
+        mBuffersInDevice.push_back(buffer);
+    }
+
+    return ret;
+}
+
+int DeviceBase::dequeueBuffer()
+{
+    LOG2("%s, camera id:%d device:%s", __func__, mCameraId, mName);
+
+    shared_ptr<CameraBuffer> camBuffer = getFirstDeviceBuffer();
+    CheckError(!camBuffer, UNKNOWN_ERROR, "No buffer in device:%s.", mName);
+
+    int ret = OK;
+    int targetIndex = camBuffer->getIndex();
+
+    V4L2Buffer &vbuf = camBuffer->getV4L2Buffer();
+    int actualIndex = mDevice->GrabFrame(&vbuf);
+
+    CheckError(actualIndex < 0, BAD_VALUE, "Device grabFrame failed:%d", actualIndex);
+    if (actualIndex != targetIndex) {
+        LOGE("%s, CamBuf index isn't same with index used by kernel", __func__);
+        ret = BAD_VALUE;
+    }
+
+    mNeedSkipFrame = needQueueBack(camBuffer);
+    popBufferFromDevice();
+
+    // TODO: Will add device name info to distinguish different devices.
+    PERF_CAMERA_ATRACE_PARAM3("grabFrame SeqID", camBuffer->getSequence(),
+                              "csi2_port",       camBuffer->getCsi2Port(),
+                              "virtual_channel", camBuffer->getVirtualChannel());
+
+    ret |= onDequeueBuffer(camBuffer);
+
+    // Skip initial frames if needed.
+    if (mFrameSkipNum > 0) {
+        mFrameSkipNum--;
+    }
+    return ret;
+}
+
+int DeviceBase::getBufferNumInDevice()
+{
+    AutoMutex l(mBufferLock);
+
+    return mBuffersInDevice.size();
+}
+
+void DeviceBase::resetBuffers()
+{
+    AutoMutex l(mBufferLock);
+
+    mBuffersInDevice.clear();
+    mPendingBuffers.clear();
+
+    for (const auto& buffer : mAllocatedBuffers) {
+        mPendingBuffers.push_back(buffer);
+    }
+}
+
+bool DeviceBase::hasPendingBuffer()
+{
+    AutoMutex l(mBufferLock);
+
+    return !mPendingBuffers.empty();
+}
+
+void DeviceBase::addPendingBuffer(const shared_ptr<CameraBuffer>& buffer)
+{
+    AutoMutex l(mBufferLock);
+
+    mPendingBuffers.push_back(buffer);
+}
+
+long DeviceBase::getPredictSequence()
+{
+    AutoMutex l(mBufferLock);
+
+    return mLatestSequence + mFrameSkipNum + mBuffersInDevice.size();
+}
+
+shared_ptr<CameraBuffer> DeviceBase::getFirstDeviceBuffer()
+{
+    AutoMutex l(mBufferLock);
+
+    return mBuffersInDevice.empty() ? nullptr : mBuffersInDevice.front();
+}
+
+bool DeviceBase::skipFrameAfterSyncCheck(long sequence)
+{
+    //For multi-camera sensor, to check whether the frame synced or not
+    int count = 0;
+    const int timeoutDuration = gSlowlyRunRatio ? (gSlowlyRunRatio * 1000000) : 1000;
+    const int maxCheckTimes = 10;  //10 times
+    while (!SyncManager::getInstance()->isSynced(mCameraId, sequence)) {
+        usleep(timeoutDuration);
+        count++;
+        if (count > maxCheckTimes) {
+            return true;
+        }
+    }
+    return false;
+}
+
+void DeviceBase::popBufferFromDevice()
+{
+    AutoMutex l(mBufferLock);
+    if (mBuffersInDevice.empty()) {
+        return;
+    }
+
+    shared_ptr<CameraBuffer> camBuffer = mBuffersInDevice.front();
+    mBuffersInDevice.pop_front();
+    mLatestSequence = camBuffer->getSequence();
+
+    if (mNeedSkipFrame) {
+        mPendingBuffers.push_back(camBuffer);
+    }
+}
+
+void DeviceBase::dumpFrame(const shared_ptr<CameraBuffer>& buffer)
+{
+    if (!CameraDump::isDumpTypeEnable(DUMP_ISYS_BUFFER)) return;
+
+    LOGD("@%s, ISYS: fmt:%s(%dx%d), stride:%d, len:%d", __func__,
+         CameraUtils::format2string(buffer->getFormat()).c_str(),
+         buffer->getWidth(), buffer->getHeight(), buffer->getStride(), buffer->getBufferSize());
+
+    CameraDump::dumpImage(mCameraId, buffer, M_ISYS, mPort);
+}
+
+MainDevice::MainDevice(int cameraId, VideoNodeType nodeType, DeviceCallback* deviceCB) :
+        DeviceBase(cameraId, nodeType, INPUT_VIDEO_NODE, deviceCB)
+{
+    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
+}
+
+MainDevice::~MainDevice()
+{
+    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
+}
+
+int MainDevice::createBufferPool(const stream_t& config)
+{
+    LOG1("%s, camera id:%d, fmt:%s(%dx%d) field:%d", __func__, mCameraId,
+         CameraUtils::pixelCode2String(config.format), config.width, config.height, config.field);
+
+    // Pass down ISYS compression flag to driver, which is CSI-BE output compression
+    bool isISYSCompression = PlatformData::getISYSCompression(mCameraId);
+    if (PlatformData::isCSIBackEndCapture(mCameraId)) {
+        std::string csiBEDeviceNodeName;
+        int ret = PlatformData::getDevNameByType(mCameraId, VIDEO_GENERIC, csiBEDeviceNodeName);
+        CheckError(ret != OK, ret, "failed to get CSI-BE device node name, ret=%d", ret);
+        LOG1("csiBEDeviceNodeName is %s", csiBEDeviceNodeName.c_str());
+
+        V4L2Subdevice* csiBESubDev = V4l2DeviceFactory::getSubDev(mCameraId, csiBEDeviceNodeName);
+        ret = csiBESubDev->SetControl(V4L2_CID_IPU_ISYS_COMPRESSION, isISYSCompression);
+        LOG2("@%s, set control compression for BE capture, node name: %s, ret:%d",
+                __func__, csiBEDeviceNodeName.c_str(), ret);
+    }
+
+    bool setWithHeaderCtl = true;
+    std::string subDeviceNodeName;
+
+    if (PlatformData::getDevNameByType(mCameraId, VIDEO_ISYS_RECEIVER, subDeviceNodeName) == OK) {
+        LOG1("%s: found ISYS receiver subdevice %s", __func__, subDeviceNodeName.c_str());
+        if (PlatformData::isTPGReceiver(mCameraId)) {
+            LOG1("%s: no need to set csi header ctrl for tpg", __func__);
+            setWithHeaderCtl = false;
+        }
+    } else {
+        setWithHeaderCtl = false;
+    }
+
+    int withHeader = 1;
+    struct v4l2_format v4l2fmt;
+    v4l2fmt.fmt.pix_mp.field = config.field;
+
+    if (PlatformData::isCSIFrontEndCapture(mCameraId)) {
+        int planesNum = CameraUtils::getNumOfPlanes(config.format);
+        LOG1("@%s Num of planes: %d, mCameraId:%d", __func__, planesNum, mCameraId);
+
+        v4l2fmt.fmt.pix_mp.width = config.width;
+        v4l2fmt.fmt.pix_mp.height = config.height;
+        v4l2fmt.fmt.pix_mp.num_planes = planesNum;
+        v4l2fmt.fmt.pix_mp.pixelformat = config.format;
+        for (int i = 0; i < v4l2fmt.fmt.pix_mp.num_planes; i++) {
+            v4l2fmt.fmt.pix_mp.plane_fmt[i].bytesperline = config.width;
+            v4l2fmt.fmt.pix_mp.plane_fmt[i].sizeimage = 0;
+        }
+        // The frame data is without header(MIPI STORE MODE) when
+        // format is YUV/RGB and frame output from CSI-Front-End entity.
+        if (!CameraUtils::isRaw(config.format)) {
+            LOG2("@%s, set frame without header for format: %s",
+                    __func__, CameraUtils::pixelCode2String(config.format));
+            withHeader = 0;
+        }
+    } else {
+        v4l2fmt.fmt.pix.width = config.width;
+        v4l2fmt.fmt.pix.height = config.height;
+        v4l2fmt.fmt.pix.pixelformat = config.format;
+        v4l2fmt.fmt.pix.bytesperline = config.width;
+        v4l2fmt.fmt.pix.sizeimage = 0;
+    }
+
+    if (setWithHeaderCtl) {
+        V4L2Subdevice* receiverSubDev = V4l2DeviceFactory::getSubDev(mCameraId, subDeviceNodeName);
+        int ret = receiverSubDev->SetControl(V4L2_CID_IPU_STORE_CSI2_HEADER, withHeader);
+        CheckError(ret != OK, ret, "set v4l2 store csi2 header failed, ret=%d", ret);
+    }
+
+    v4l2fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+    V4L2Format tmpbuf {v4l2fmt};
+    int ret = mDevice->SetFormat(tmpbuf);
+    CheckError(ret != OK, ret, "set v4l2 format failed ret=%d", ret);
+    v4l2fmt = *tmpbuf.Get();
+
+    int realBufferSize = v4l2fmt.fmt.pix.sizeimage;
+    int calcBufferSize = 0;
+    if (isISYSCompression) {
+        calcBufferSize = CameraUtils::getFrameSize(config.format, config.width, config.height, false, true, true);
+    } else {
+        calcBufferSize = CameraUtils::getFrameSize(config.format, config.width, config.height);
+    }
+
+    CheckError(calcBufferSize < realBufferSize, BAD_VALUE,
+        "realBufferSize %d is larger than calcBufferSize %d.", realBufferSize, calcBufferSize);
+
+    LOG2("@%s: compression:%d, realBufSize:%d, calcBufSize:%d",
+                __func__, isISYSCompression, realBufferSize, calcBufferSize);
+
+    std::vector<V4L2Buffer> bufs;
+    int bufNum = mDevice->SetupBuffers(mMaxBufferNumber, true,
+                                       static_cast<enum v4l2_memory>(config.memType), &bufs);
+
+    CheckError(bufNum < 0, BAD_VALUE, "request buffers failed return=%d", bufNum);
+
+    return OK;
+}
+
+int MainDevice::onDequeueBuffer(shared_ptr<CameraBuffer> buffer)
+{
+    mDeviceCB->onDequeueBuffer();
+
+    if (mNeedSkipFrame) return OK;
+
+    LOG2("@%s, sequence:%ld, field:%d, timestamp: sec=%ld, usec=%ld",
+          __func__, buffer->getSequence(), buffer->getField(),
+          buffer->getTimestamp().tv_sec, buffer->getTimestamp().tv_usec);
+
+    for (auto& consumer : mConsumers) {
+        consumer->onFrameAvailable(mPort, buffer);
+    }
+
+    EventData frameData;
+    frameData.type = EVENT_ISYS_FRAME;
+    frameData.buffer = nullptr;
+    frameData.data.frame.sequence = buffer->getSequence();
+    frameData.data.frame.timestamp.tv_sec = buffer->getTimestamp().tv_sec;
+    frameData.data.frame.timestamp.tv_usec = buffer->getTimestamp().tv_usec;
+    notifyListeners(frameData);
+
+    dumpFrame(buffer);
+
+    return OK;
+}
+
+bool MainDevice::needQueueBack(shared_ptr<CameraBuffer> buffer)
+{
+    bool needSkipFrame = (mFrameSkipNum > 0);
+
+    const V4L2Buffer& vbuf = buffer->getV4L2Buffer();
+    // Check for STR2MMIO Error from kernel space
+    if((vbuf.Flags() & V4L2_BUF_FLAG_ERROR) && PlatformData::isSkipFrameOnSTR2MMIOErr(mCameraId)) {
+        // On STR2MMIO error, enqueue this buffer back to V4L2 before notifying the
+        // listener/consumer and return
+        needSkipFrame = true;
+    }
+    if (PlatformData::isEnableFrameSyncCheck(mCameraId)) {
+        struct camera_buf_info sharedCamBufInfo;
+        sharedCamBufInfo.sequence = buffer->getSequence();
+        sharedCamBufInfo.sof_ts = buffer->getTimestamp();
+        SyncManager::getInstance()->updateCameraBufInfo(mCameraId, &sharedCamBufInfo);
+        if (skipFrameAfterSyncCheck(buffer->getSequence())) {
+            LOG1("@%s: CameraID:%d sequence %ld been dropped due to frame not sync",
+                  __func__, mCameraId, buffer->getSequence());
+            needSkipFrame = true;
+        }
+    }
+    return needSkipFrame;
+}
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/DeviceBase.h b/camera/hal/intel/ipu6/src/core/DeviceBase.h
new file mode 100644
index 000000000000..753604c7550d
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/DeviceBase.h
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2018-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <v4l2_device.h>
+
+#include <set>
+#include <list>
+#include <atomic>
+
+#include "iutils/Thread.h"
+#include "v4l2/NodeInfo.h"
+#include "BufferQueue.h"
+#include "CameraBuffer.h"
+#include "IspParamAdaptor.h"
+
+namespace icamera {
+
+enum VideoNodeDirection {
+    INPUT_VIDEO_NODE,   /*!< input video devices like cameras or capture cards */
+    OUTPUT_VIDEO_NODE  /*!< output video devices like displays */
+};
+
+class DeviceCallback {
+public:
+    DeviceCallback() {};
+    virtual ~DeviceCallback() {};
+    virtual void onDequeueBuffer() {};
+};
+
+/**
+ * DeviceBase is a base class of other devices which are for a particular purpose.
+ * It provides: general operation of V4l2 devices, and secured buffer management.
+ *
+ * There are several virtual functions for subclass to override. The subclass should
+ * base on what its implementation is to override one or several of them.
+ */
+class DeviceBase : public EventSource {
+public:
+    DeviceBase(int cameraId, VideoNodeType nodeType,
+               VideoNodeDirection nodeDirection, DeviceCallback* deviceCB = nullptr);
+    virtual ~DeviceBase();
+
+    int configure(Port port, const stream_t& config, uint32_t bufferNum);
+
+    int openDevice();
+    void closeDevice();
+
+    int streamOn();
+    int streamOff();
+
+    int queueBuffer(long sequence);
+    int dequeueBuffer();
+
+    void addFrameListener(BufferConsumer *listener) { mConsumers.insert(listener); }
+    void removeFrameListener(BufferConsumer *listener) { mConsumers.erase(listener); }
+    void removeAllFrameListeners() { mConsumers.clear(); }
+
+    bool hasPendingBuffer();
+    void addPendingBuffer(const std::shared_ptr<CameraBuffer>& buffer);
+    long getPredictSequence();
+    int getBufferNumInDevice();
+    void resetBuffers();
+    bool skipFrameAfterSyncCheck(long sequence);
+
+    V4L2VideoNode* getV4l2Device() { return mDevice; }
+    const char* getName() { return mName; }
+    Port getPort() { return mPort; }
+
+protected:
+    /**
+     * Configure the device and request or create(if needed) the buffer pool.
+     */
+    virtual int createBufferPool(const stream_t& config) { return OK; }
+
+    /**
+     * Pre-process the buffer which to be queued to the device.
+     */
+    virtual int onQueueBuffer(long sequence, std::shared_ptr<CameraBuffer>& buffer) { return OK; }
+
+    /**
+     * Post-process the buffer after it's dequeued from the device.
+     */
+    virtual int onDequeueBuffer(std::shared_ptr<CameraBuffer> buffer) { return OK; }
+
+    /**
+     * Return whether the buffer needs to be queued back to mPendingBuffers.
+     */
+    virtual bool needQueueBack(std::shared_ptr<CameraBuffer> buffer) { return false; }
+
+    void dumpFrame(const std::shared_ptr<CameraBuffer>& buffer);
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(DeviceBase);
+
+    /**
+     * Get one available buffer from mBuffersInDevice
+     *
+     * Return the front buffer of mBuffersInDevice if available, otherwise return nullptr.
+     */
+    std::shared_ptr<CameraBuffer> getFirstDeviceBuffer();
+
+    /**
+     * Pop the first buffer in mBuffersInDevice.
+     * Add the buffer back to mPendingBuffers if needed.
+     */
+    void popBufferFromDevice();
+
+protected:
+    int mCameraId;
+    Port mPort;
+    VideoNodeType mNodeType;
+    VideoNodeDirection mNodeDirection;
+    const char* mName;
+    V4L2VideoNode* mDevice; // The device used to queue/dequeue buffers.
+    long mLatestSequence; // Track the latest bufffer sequence from driver.
+    bool mNeedSkipFrame; // True if the frame/buffer needs to be skipped.
+    int mFrameSkipNum; // How many frames need to be skipped after stream on.
+    DeviceCallback* mDeviceCB;
+    std::set<BufferConsumer*> mConsumers;
+
+    /**
+     * Each device has below three structures to manager its buffers.
+     * And please note that:
+     * 1. If the buffer is not allocated inside CaptureUnit, mAllocatedBuffers will be empty.
+     * 2. Buffer to be queued into drive comes from mPendingBuffers.
+     * 3. Buffer to be dequeued from driver comes from mBuffersInDevice.
+     * 4. To make code clean, no null CameraBuffer is allowed to be put into these structures.
+     * 5. The buffer cannot be in both mPendingBuffers and mBuffersInDevice.
+     *    We must make the data consistent.
+     */
+    std::vector<std::shared_ptr<CameraBuffer>> mAllocatedBuffers;
+            // Save all buffers allocated internally.
+    std::list<std::shared_ptr<CameraBuffer>> mPendingBuffers;
+            // The buffers that are going to be queued.
+    std::list<std::shared_ptr<CameraBuffer>> mBuffersInDevice; // The buffers that have been queued
+    Mutex mBufferLock; // The lock for protecting the internal buffers.
+
+    uint32_t mMaxBufferNumber;
+};
+
+/**
+ * MainDevice is a most commonly used device.
+ * It's usually for producing video frames.
+ */
+class MainDevice : public DeviceBase {
+public:
+    MainDevice(int cameraId, VideoNodeType nodeType, DeviceCallback* deviceCB);
+    ~MainDevice();
+
+private:
+    int createBufferPool(const stream_t& config);
+    int onDequeueBuffer(std::shared_ptr<CameraBuffer> buffer);
+    bool needQueueBack(std::shared_ptr<CameraBuffer> buffer);
+};
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/IspParamAdaptor.cpp b/camera/hal/intel/ipu6/src/core/IspParamAdaptor.cpp
new file mode 100644
index 000000000000..0d5e659a3298
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/IspParamAdaptor.cpp
@@ -0,0 +1,850 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "IspParamAdaptor"
+
+#include <stdio.h>
+
+#include "IspParamAdaptor.h"
+
+#include "3a/AiqResult.h"
+#include "3a/AiqResultStorage.h"
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+#include "iutils/CameraDump.h"
+#include "iutils/Errors.h"
+#include "PlatformData.h"
+#include "IGraphConfig.h"
+
+#include "ia_pal_types_isp_ids_autogen.h"
+
+namespace icamera {
+
+IspParamAdaptor::IspParamAdaptor(int cameraId, PgParamType type) :
+        mIspAdaptorState(ISP_ADAPTOR_NOT_INIT),
+        mCameraId(cameraId),
+        mPgParamType(type),
+        mTuningMode(TUNING_MODE_VIDEO),
+        mIspAdaptHandle(nullptr),
+        mBCompResults(nullptr),
+        mCurIspParamIndex(-1),
+        mGCM(nullptr),
+        mAdaptor(nullptr)
+{
+    LOG1("IspParamAdaptor was created for id:%d type:%d", mCameraId, mPgParamType);
+    CLEAR(mFrameParam);
+    CLEAR(mCurrentIpuParam);
+
+    if (PlatformData::getGraphConfigNodes(cameraId)) {
+        mGCM = IGraphConfigManager::getInstance(cameraId);
+    }
+
+    mAdaptor = std::unique_ptr<IntelIspParamAdaptor>(new IntelIspParamAdaptor());
+}
+
+IspParamAdaptor::~IspParamAdaptor()
+{
+    LOG1("IspParamAdaptor was created for id:%d type:%d", mCameraId, mPgParamType);
+}
+
+int IspParamAdaptor::init()
+{
+    PERF_CAMERA_ATRACE();
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
+    AutoMutex l(mIspAdaptorLock);
+
+    mIspAdaptorState = ISP_ADAPTOR_INIT;
+    return OK;
+}
+
+int IspParamAdaptor::deinit()
+{
+    LOG1("ISP HW param adaptor de-initialized for camera id:%d type:%d", mCameraId, mPgParamType);
+    AutoMutex l(mIspAdaptorLock);
+
+    deinitIspAdaptHandle();
+
+    //Release the memory and clear the mapping
+    for (auto& pgMap: mStreamIdToProgramGroupMap) {
+        delete[] pgMap.second.run_kernels;
+    }
+    mStreamIdToProgramGroupMap.clear();
+    mStreamIdToPGOutSizeMap.clear();
+    releaseIspParamBuffers();
+
+    CLEAR(mFrameParam);
+    CLEAR(mCurrentIpuParam);
+
+    mIspAdaptorState = ISP_ADAPTOR_NOT_INIT;
+    return OK;
+}
+
+int IspParamAdaptor::initIspAdaptHandle(ConfigMode configMode, TuningMode tuningMode)
+{
+    int ret = OK;
+
+    if (!PlatformData::isEnableAIQ(mCameraId)) {
+        return ret;
+    }
+
+    ia_binary_data ispData;
+    ia_cmc_t *cmcData = nullptr;
+    uintptr_t cmcHandle = reinterpret_cast<uintptr_t>(nullptr);
+
+    CpfStore* cpf = PlatformData::getCpfStore(mCameraId);
+    CheckError((cpf == nullptr), NO_INIT, "@%s, No CPF for cameraId:%d", __func__, mCameraId);
+    ret = cpf->getDataAndCmc(&ispData, nullptr, nullptr, &cmcHandle, tuningMode, &cmcData);
+    CheckError(ret != OK, NO_INIT, "get cpf and cmc data failed");
+
+    int statsNum = PlatformData::getExposureNum(mCameraId,
+                                                CameraUtils::isMultiExposureCase(tuningMode));
+    mIspAdaptHandle = mAdaptor->init(&ispData, reinterpret_cast<ia_cmc_t*>(cmcHandle),
+                                     MAX_STATISTICS_WIDTH, MAX_STATISTICS_HEIGHT,
+                                     statsNum, nullptr);
+    CheckError(!mIspAdaptHandle, NO_INIT, "ISP adaptor failed to initialize");
+
+    /*
+     * The number of streamId is identified in configure stream,
+     * fill the mStreamIdToProgramGroupMap and allocate the IspParameter memory
+     */
+    if (mGCM != nullptr && mGCM->isGcConfigured()) {
+        ret = initProgramGroupForAllStreams(configMode);
+        CheckError(ret != OK, ret, "%s, Failed to init programGroup for all streams", __func__);
+        ret = allocateIspParamBuffers();
+        CheckError(ret != OK, ret, "%s, Failed to allocate isp parameter buffers", __func__);
+    }
+
+    LOG1("ISP HW param adaptor initialized successfully camera id:%d", mCameraId);
+
+    return ret;
+}
+
+void IspParamAdaptor::deinitIspAdaptHandle()
+{
+    if (mIspAdaptHandle) {
+        mAdaptor->deInit(mIspAdaptHandle);
+        mIspAdaptHandle = nullptr;
+    }
+
+}
+
+int IspParamAdaptor::initProgramGroupForAllStreams(ConfigMode configMode)
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
+
+    std::vector<int32_t> streamIds;
+
+    //Release the memory and clear the mapping
+    for (auto& pgMap: mStreamIdToProgramGroupMap) {
+        delete[] pgMap.second.run_kernels;
+    }
+    mStreamIdToProgramGroupMap.clear();
+    mStreamIdToPGOutSizeMap.clear();
+    mStreamIdToMbrDataMap.clear();
+
+    std::shared_ptr<IGraphConfig> graphConfig = mGCM->getGraphConfig(configMode);
+    if(graphConfig == nullptr) {
+        LOGW("There isn't GraphConfig for camera configMode: %d", configMode);
+        return UNKNOWN_ERROR;
+    }
+
+    if (mPgParamType == PG_PARAM_ISYS) {
+        int streamId = 0; // 0 is for PG_PARAM_ISYS
+        streamIds.push_back(streamId);
+    } else {
+        status_t ret = graphConfig->graphGetStreamIds(streamIds);
+        CheckError(ret != OK, UNKNOWN_ERROR, "Failed to get the PG streamIds");
+    }
+
+    for (auto id : streamIds) {
+        ia_isp_bxt_program_group *pgPtr = graphConfig->getProgramGroup(id);
+        if (pgPtr != nullptr) {
+            ia_isp_bxt_program_group programGroup;
+            CLEAR(programGroup);
+            programGroup.run_kernels = new ia_isp_bxt_run_kernels_t[pgPtr->kernel_count];
+
+            // Skip those kernels with 0 uuid which isn't PAL uuid
+            for (unsigned int i = 0; i < pgPtr->kernel_count; i++) {
+                if (pgPtr->run_kernels[i].kernel_uuid != 0) {
+                    MEMCPY_S(&programGroup.run_kernels[programGroup.kernel_count],
+                             sizeof(ia_isp_bxt_run_kernels_t),
+                             &pgPtr->run_kernels[i],
+                             sizeof(ia_isp_bxt_run_kernels_t));
+                    programGroup.kernel_count++;
+                } else {
+                    LOG1("There is 0 uuid found, stream id %d", id);
+                }
+            }
+
+            // Override the stream id in kernel list with the one in sensor's config file.
+            // Remove this after the sensor's tuning file uses correct stream id.
+            int streamId = PlatformData::getStreamIdByConfigMode(mCameraId, configMode);
+            if (streamId != -1) {
+                programGroup.run_kernels->stream_id = streamId;
+            }
+
+            mStreamIdToProgramGroupMap[id] = programGroup;
+            mStreamIdToPGOutSizeMap[id] = mAdaptor->getPalDataSize(&programGroup);
+            ia_isp_bxt_gdc_limits mbrData;
+            status_t ret  = graphConfig->getMBRData(id, &mbrData);
+            if (ret == OK) {
+                mStreamIdToMbrDataMap[id] = mbrData;
+                LOG2("get mbr data for stream:%d:%f,%f,%f,%f",
+                     id, mbrData.rectilinear.zoom, mbrData.rectilinear.pitch,
+                     mbrData.rectilinear.yaw, mbrData.rectilinear.roll);
+            }
+        }
+    }
+
+    return OK;
+}
+
+void IspParamAdaptor::initInputParams(ia_isp_bxt_input_params_v2 *params, PgParamType type)
+{
+    CheckError(params == nullptr, VOID_VALUE, "NULL input parameter");
+
+    if (type == PG_PARAM_PSYS_ISA) {
+        params->ee_setting.feature_level = ia_isp_feature_level_low;
+        params->ee_setting.strength = 0;
+        LOG2("%s: set initial default edge enhancement setting: level: %d, strengh: %d",
+            __func__, params->ee_setting.feature_level, params->ee_setting.strength);
+
+        params->nr_setting.feature_level = ia_isp_feature_level_high;
+        params->nr_setting.strength = 0;
+        LOG2("%s: set initial default noise setting: level: %d, strengh: %d",
+            __func__, params->nr_setting.feature_level, params->nr_setting.strength);
+    }
+}
+
+int IspParamAdaptor::postConfigure(int width, int height)
+{
+    // The PG wrapper init is done by the imaging controller.
+    if(mPgParamType == PG_PARAM_PSYS_ISA) {
+        mIspAdaptorState = ISP_ADAPTOR_CONFIGURED;
+        return OK; //No need to do anything for P2P. It id done by libiacss
+    }
+
+    return OK;
+}
+
+/**
+ * configure
+ *
+ * (graph config version)
+ * This is the method used when the spatial parameters change, usually during
+ * stream configuration.
+ *
+ * We initialize the ISP adaptor to produce worst case scenario for memory
+ * allocation.
+ *
+ * At this state we initialize the wrapper code that helps encoding the PG
+ * descriptor and terminal payloads (i.e. the parameters for the PG).
+ *
+ * \param configMode[IN]: The real configure mode.
+ * \param tuningMode[IN]:  The tuning mode.
+ * \param stream[IN]: frame info.
+ * \return OK: everything went ok.
+ * \return UNKNOWN_ERROR: First run of ISP adaptation failed.
+ * \return NO_INIT: Initialization of P2P or PG_DIE wrapper failed.
+ */
+int IspParamAdaptor::configure(const stream_t &stream,
+        ConfigMode configMode, TuningMode tuningMode)
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
+    AutoMutex l(mIspAdaptorLock);
+
+    mTuningMode = tuningMode;
+
+    ia_isp_bxt_input_params_v2 inputParams;
+    CLEAR(inputParams);
+    ia_aiq_sa_results_v1 fakeSaResults;
+    CLEAR(fakeSaResults);
+
+    deinitIspAdaptHandle();
+    int ret = initIspAdaptHandle(configMode, tuningMode);
+    CheckError(ret != OK, ret, "%s, init Isp Adapt Handle failed %d", __func__, ret);
+
+    SensorFrameParams param;
+    int status = PlatformData::calculateFrameParams(mCameraId, param);
+    CheckError(status != OK, status, "%s: Failed to calculate frame params", __func__);
+    AiqUtils::convertToAiqFrameParam(param, mFrameParam);
+
+    LOG1("horizontal_crop_offset:%d", mFrameParam.horizontal_crop_offset);
+    LOG1("vertical_crop_offset:%d", mFrameParam.vertical_crop_offset);
+    LOG1("cropped_image_width:%d", mFrameParam.cropped_image_width);
+    LOG1("cropped_image_height:%d", mFrameParam.cropped_image_height);
+    LOG1("horizontal_scaling_numerator:%d", mFrameParam.horizontal_scaling_numerator);
+    LOG1("horizontal_scaling_denominator:%d", mFrameParam.horizontal_scaling_denominator);
+    LOG1("vertical_scaling_numerator:%d", mFrameParam.vertical_scaling_numerator);
+    LOG1("vertical_scaling_denominator:%d", mFrameParam.vertical_scaling_denominator);
+
+    /*
+     * Construct the dummy Shading Adaptor  results to force the creation of
+     * the LSC table.
+     * Assign them to the AIC input parameter structure.
+     */
+    unsigned short fakeLscTable[4] = {1,1,1,1};
+    for (int i = 0; i < MAX_BAYER_ORDER_NUM; i++) {
+        for (int j = 0; j < MAX_BAYER_ORDER_NUM; j++) {
+            fakeSaResults.lsc_grid[i][j] = fakeLscTable;
+        }
+    }
+    fakeSaResults.fraction_bits = 0;
+    fakeSaResults.color_order = cmc_bayer_order_grbg;
+    fakeSaResults.lsc_update = true;
+    fakeSaResults.width = 2;
+    fakeSaResults.height = 2;
+    inputParams.sa_results = &fakeSaResults;
+
+    initInputParams(&inputParams, mPgParamType);
+
+    /*
+     *  IA_ISP_BXT can run without 3A results to produce the defaults for a
+     *  given sensor configuration.
+     *  TODO: change the mCurrentIpuParam in the future.
+     */
+    mCurIspParamIndex = 0;
+    IspParameter& ipuParam = mIspParameters[mCurIspParamIndex];
+
+    ipuParam.sequence = -1;
+    for (auto& binaryMap : ipuParam.streamIdToDataMap) {
+        inputParams.program_group = &(mStreamIdToProgramGroupMap[binaryMap.first]);
+        inputParams.sensor_frame_params = &mFrameParam;
+        mCurrentIpuParam = binaryMap.second;
+        mCurrentIpuParam.size = mStreamIdToPGOutSizeMap[binaryMap.first];
+
+        PERF_CAMERA_ATRACE_PARAM1_IMAGING("ia_isp_bxt_run", 1);
+
+        int ret = mAdaptor->runPal(mIspAdaptHandle, &inputParams, &mCurrentIpuParam);
+        CheckError(ret != OK, UNKNOWN_ERROR, "ISP parameter adaptation has failed %d", ret);
+
+        binaryMap.second.size = mCurrentIpuParam.size;
+        ipuParam.dataAvailableMap[binaryMap.first] = true;
+    }
+
+    dumpIspParameter(0);
+
+    return postConfigure(stream.width, stream.height);
+}
+
+int IspParamAdaptor::getParameters(Parameters& param)
+{
+    AutoMutex l(mIspAdaptorLock);
+
+    return OK;
+}
+
+int IspParamAdaptor::decodeStatsData(TuningMode tuningMode,
+                                     std::shared_ptr<CameraBuffer> statsBuffer,
+                                     std::shared_ptr<IGraphConfig> graphConfig)
+{
+    CheckError(mIspAdaptorState != ISP_ADAPTOR_CONFIGURED,
+               INVALID_OPERATION, "%s, wrong state %d", __func__, mIspAdaptorState);
+
+    long sequence = statsBuffer->getSequence();
+    AiqResultStorage *aiqResultStorage = AiqResultStorage::getInstance(mCameraId);
+
+    const AiqResult *feedback = aiqResultStorage->getAiqResult(sequence);
+    if (feedback == nullptr) {
+        LOGW("No aiq result of sequence %ld! Use the latest instead", sequence);
+        feedback = aiqResultStorage->getAiqResult();
+    }
+
+    camera_resolution_t dvsReso;
+    CLEAR(dvsReso);
+    if (graphConfig) {
+        uint32_t gdcKernelId;
+        graphConfig->getGdcKernelSetting(gdcKernelId, dvsReso);
+    }
+
+    ia_binary_data *hwStatsData = (ia_binary_data *)(statsBuffer->getBufferAddr());
+    ConvertInputParam inputParams = {CameraUtils::isMultiExposureCase(tuningMode),
+                                     hwStatsData, &dvsReso, &feedback->mAeResults, mBCompResults};
+
+    ConvertResult result;
+    ia_isp_bxt_statistics_query_results_t queryResults;
+    CLEAR(result);
+    CLEAR(queryResults);
+    result.queryResults = &queryResults;
+
+    int ret = mAdaptor->queryAndConvertStats(mIspAdaptHandle, &inputParams, &result);
+    CheckError(ret != OK, ret, "%s, Faield to query and convert statistics", __func__);
+
+    // Decode DVS statistics
+    if (queryResults.dvs_stats) {
+        if (CameraDump::isDumpTypeEnable(DUMP_PSYS_DECODED_STAT) && hwStatsData != nullptr) {
+            BinParam_t bParam;
+            bParam.bType = BIN_TYPE_GENERAL;
+            bParam.mType = M_PSYS;
+            bParam.sequence = statsBuffer->getSequence();
+            bParam.gParam.appendix = "dvs_p2p_decoded_stats";
+            CameraDump::dumpBinary(mCameraId, hwStatsData->data, hwStatsData->size, &bParam);
+        }
+
+        if (result.dvsStats) {
+            DvsStatistics dvsStatsStorage(result.dvsStats, statsBuffer->getSequence());
+            aiqResultStorage->updateDvsStatistics(dvsStatsStorage);
+        } else {
+            LOGW("Failed to get GDC kernel setting, DVS stats not decoded");
+        }
+    }
+
+    if (queryResults.rgbs_grid && queryResults.af_grid) {
+        int exposureNum = PlatformData::getExposureNum(mCameraId, false);
+        AiqStatistics *aiqStatistics = aiqResultStorage->acquireAiqStatistics();
+
+        if (*(result.rgbsGrid)) {
+            dumpRgbsStats(*(result.rgbsGrid),
+                          statsBuffer->getSequence(), feedback->mAeResults.num_exposures);
+        }
+        if (result.afGrid) {
+            dumpAfStats(result.afGrid, statsBuffer->getSequence());
+        }
+
+        aiqStatistics->saveRgbsGridData(result.rgbsGrid, exposureNum);
+        aiqStatistics->saveAfGridData(result.afGrid);
+        aiqStatistics->mSequence = sequence;
+        aiqStatistics->mTimestamp = TIMEVAL2USECS(statsBuffer->getTimestamp());
+        aiqStatistics->mTuningMode = tuningMode;
+        aiqResultStorage->updateAiqStatistics(sequence);
+    }
+
+    return OK;
+}
+
+void IspParamAdaptor::updateKernelToggles(ia_isp_bxt_program_group programGroup) {
+
+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_KERNEL_TOGGLE)) return;
+
+    const char* ENABLED_KERNELS = "/tmp/enabledKernels";
+    const char* DISABLED_KERNELS = "/tmp/disabledKernels";
+    const int FLIE_CONT_MAX_LENGTH = 1024;
+    ia_isp_bxt_run_kernels_t* curKernel = programGroup.run_kernels;
+    char enabledKernels[FLIE_CONT_MAX_LENGTH] = { 0 };
+    char disabledKernels[FLIE_CONT_MAX_LENGTH] = { 0 };
+
+    int enLen = CameraUtils::getFileContent(ENABLED_KERNELS, enabledKernels, FLIE_CONT_MAX_LENGTH - 1);
+    int disLen = CameraUtils::getFileContent(DISABLED_KERNELS, disabledKernels, FLIE_CONT_MAX_LENGTH - 1);
+
+    if (enLen == 0 && disLen == 0) {
+        LOG2("%s: no explicit kernel toggle.", __func__);
+        return;
+    }
+
+    LOG2("%s: enabled kernels: %s, disabled kernels %s", __func__,
+        enabledKernels, disabledKernels);
+
+    for (unsigned int i = 0; i < programGroup.kernel_count; i++) {
+
+        std::string curKernelUUID = std::to_string(curKernel->kernel_uuid);
+
+        LOG2("%s: checking kernel %s", __func__, curKernelUUID.c_str());
+
+        if (strstr(enabledKernels, curKernelUUID.c_str()) != nullptr) {
+            curKernel->enable = 1;
+            LOG2("%s: kernel %d is explicitly enabled", __func__,
+                curKernel->kernel_uuid);
+        }
+
+        if (strstr(disabledKernels, curKernelUUID.c_str()) != nullptr) {
+            curKernel->enable = 0;
+            LOG2("%s: kernel %d is explicitly disabled", __func__,
+                curKernel->kernel_uuid);
+        }
+
+        curKernel ++;
+    }
+}
+
+/**
+ * runIspAdapt
+ * Convert the results of the 3A algorithms and parse with P2P.
+ */
+int IspParamAdaptor::runIspAdapt(const IspSettings* ispSettings, long settingSequence, int32_t streamId)
+{
+    PERF_CAMERA_ATRACE();
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
+    AutoMutex l(mIspAdaptorLock);
+    CheckError(mIspAdaptorState != ISP_ADAPTOR_CONFIGURED, INVALID_OPERATION, "%s, wrong state %d",
+          __func__, mIspAdaptorState);
+
+    int updateIndex = -1;
+    // Check if the given sequence is already there, if so we need update it instead of
+    // updating mCurIspParamIndex and using next buffer.
+    for (int i = 0; i < ISP_PARAM_QUEUE_SIZE; i++) {
+        if (mIspParameters[i].sequence == settingSequence) {
+            updateIndex = i;
+            break;
+        }
+    }
+
+    bool forceUpdate = false;
+    if (updateIndex == -1) {
+        mCurIspParamIndex++;
+        mCurIspParamIndex = mCurIspParamIndex % ISP_PARAM_QUEUE_SIZE;
+        updateIndex = mCurIspParamIndex;
+        forceUpdate = true;
+        // Only Store the new sequence
+        LOG2("%s, the sequence list size: %zu", __func__, mSequenceList.size());
+        if (mSequenceList.size() >= PlatformData::getMaxRawDataNum(mCameraId)) {
+            mSequenceList.pop_front();
+        }
+        mSequenceList.push_back(settingSequence);
+        mIspParameters[updateIndex].dataAvailableMap.clear();
+    }
+
+    IspParameter& ipuParam = mIspParameters[updateIndex];
+    LOG2("%s, current isp parameter index:%d, update index:%d, for sequence: %ld, stream %d",
+         __func__, mCurIspParamIndex, updateIndex, settingSequence, streamId);
+
+    ipuParam.sequence = settingSequence;
+    ia_isp_bxt_gdc_limits* mbrData = nullptr;
+    for (auto& binaryMap : ipuParam.streamIdToDataMap) {
+        if (!(streamId == -1 || binaryMap.first == streamId))
+            continue;
+        mCurrentIpuParam = binaryMap.second;
+        mCurrentIpuParam.size = mStreamIdToPGOutSizeMap[binaryMap.first];
+        if (mStreamIdToMbrDataMap.find(binaryMap.first) != mStreamIdToMbrDataMap.end())
+            mbrData = &(mStreamIdToMbrDataMap[binaryMap.first]);
+
+        int ret = runIspAdaptL(mStreamIdToProgramGroupMap[binaryMap.first],
+                            mbrData, ispSettings, settingSequence, forceUpdate);
+
+        binaryMap.second.size = mCurrentIpuParam.size;
+
+        CheckError(ret != OK, ret, "run isp adaptor error for streamId %d, sequence: %ld",
+                               binaryMap.first, settingSequence);
+        ipuParam.dataAvailableMap[binaryMap.first] = true;
+    }
+
+    return OK;
+}
+
+const ia_binary_data* IspParamAdaptor::getIpuParameter(long sequence, int streamId)
+{
+    AutoMutex l(mIspAdaptorLock);
+
+    /* For old version.
+     * TODO: We should get the ipu param according to streamId and
+     * sequenceId when there are multi-streams in one pipe.
+     */
+    if (sequence == -1 && streamId == -1) {
+        return &mCurrentIpuParam;
+    }
+
+    ia_binary_data* ipuParam = nullptr;
+    for (int i = 0; i < ISP_PARAM_QUEUE_SIZE; i++) {
+        IspParameter& param = mIspParameters[i];
+        if (param.sequence == sequence &&
+            param.streamIdToDataMap.find(streamId) != param.streamIdToDataMap.end()) {
+            if (param.dataAvailableMap.find(streamId) != param.dataAvailableMap.end()) {
+                ipuParam = &param.streamIdToDataMap[streamId];
+            } else {
+                LOGW("data unavailable for stream %d, sequence %ld", streamId, sequence);
+            }
+            break;
+        }
+    }
+
+    if (ipuParam == nullptr) {
+        LOGE("Failed to find ISP parameter for stream %d, sequence %ld", streamId, sequence);
+        ipuParam = &mCurrentIpuParam;
+    }
+
+    return ipuParam;
+}
+
+/*
+ * Allocate memory for mIspParameters
+ * TODO: Let PAL to expose the max ia_binary_data buffer size which
+ * come from mIspAdaptHandle->ia_pal.m_output_isp_parameters_size
+ */
+int IspParamAdaptor::allocateIspParamBuffers()
+{
+    releaseIspParamBuffers();
+
+    for (int i = 0; i < ISP_PARAM_QUEUE_SIZE; i++) {
+        for (auto & pgMap : mStreamIdToProgramGroupMap) {
+            ia_binary_data ispParam;
+            int size = mStreamIdToPGOutSizeMap[pgMap.first];
+            CLEAR(ispParam);
+            ispParam.size = size;
+            ispParam.data = mAdaptor->allocatePalBuffer(pgMap.first, i, size);
+            CheckError(ispParam.data == nullptr, NO_MEMORY, "Faile to calloc the memory for isp parameter");
+            mIspParameters[i].streamIdToDataMap[pgMap.first] = ispParam;
+        }
+        mIspParameters[i].sequence = -1;
+        mIspParameters[i].dataAvailableMap.clear();
+    }
+
+    return OK;
+}
+
+void IspParamAdaptor::releaseIspParamBuffers()
+{
+    for (int i = 0; i < ISP_PARAM_QUEUE_SIZE; i++) {
+        for (auto& binaryMap : mIspParameters[i].streamIdToDataMap)
+            mAdaptor->freePalBuffer(binaryMap.second.data);
+
+        mIspParameters[i].sequence = -1;
+        mIspParameters[i].streamIdToDataMap.clear();
+        mIspParameters[i].dataAvailableMap.clear();
+    }
+}
+
+int IspParamAdaptor::runIspAdaptL(ia_isp_bxt_program_group programGroup,
+                                  ia_isp_bxt_gdc_limits *mbrData,
+                                  const IspSettings* ispSettings, long settingSequence,
+                                  bool forceUpdate)
+{
+    PERF_CAMERA_ATRACE_IMAGING();
+    AiqResult* aiqResults = const_cast<AiqResult*>(AiqResultStorage::getInstance(mCameraId)->getAiqResult(settingSequence));
+    if (aiqResults == nullptr) {
+        LOGW("%s: no result for sequence %ld! use the latest instead", __func__, settingSequence);
+        aiqResults = const_cast<AiqResult*>(AiqResultStorage::getInstance(mCameraId)->getAiqResult());
+        CheckError((aiqResults == nullptr), INVALID_OPERATION, "Cannot find available aiq result.");
+    }
+    CheckError((aiqResults->mSaResults.width * aiqResults->mSaResults.height == 0),
+            INVALID_OPERATION, "No invalid aiq result needed to run Generic AIC");
+
+    LOG2("%s: device type: %d", __func__, mPgParamType);
+
+    ia_isp_bxt_input_params_v2 inputParams;
+    ia_view_config_t viewConfig;
+    CLEAR(inputParams);
+    CLEAR(viewConfig);
+
+    // LOCAL_TONEMAP_S
+    bool hasLtm = PlatformData::isLtmEnabled(mCameraId);
+
+    if (hasLtm) {
+        size_t ltmLag = PlatformData::getLtmGainLag(mCameraId);
+        long ltmSequence = settingSequence;
+
+        // Consider there may be skipped frames, so according to the gain lag and current
+        // sequence to find the actual ltm sequence in history list.
+        if (mSequenceList.size() > ltmLag) {
+            size_t index = 0;
+            for(auto iter = mSequenceList.begin(); iter != mSequenceList.end(); iter++) {
+                if (*iter == settingSequence && index >= ltmLag) {
+                    ltmSequence = *(std::prev(iter, ltmLag));
+                    break;
+                }
+                index++;
+            }
+        }
+        ltm_result_t* ltmResult = const_cast<ltm_result_t*>(AiqResultStorage::getInstance(mCameraId)->getLtmResult(ltmSequence));
+        if (ltmResult != nullptr) {
+            LOG2("%s: frame sequence %ld, ltm sequence %ld, actual sequence: %ld",
+                    __func__, settingSequence, ltmSequence, ltmResult->sequence);
+            inputParams.ltm_results = &ltmResult->ltmResults;
+            inputParams.ltm_drc_params = &ltmResult->ltmDrcParams;
+        }
+    }
+    // LOCAL_TONEMAP_E
+
+    // update metadata of runnning kernels
+    if (mPgParamType == PG_PARAM_PSYS_ISA) {
+        for (unsigned int i=0; i<programGroup.kernel_count; i++) {
+            switch (programGroup.run_kernels[i].kernel_uuid) {
+            case ia_pal_uuid_isp_tnr5_21:
+            case ia_pal_uuid_isp_tnr5_22:
+            case ia_pal_uuid_isp_tnr5_25:
+                programGroup.run_kernels[i].metadata[0] = aiqResults->mSequence;
+                LOG2("ia_pal_uuid_isp_tnr5_2x frame count = %d", programGroup.run_kernels[i].metadata[0]);
+                break;
+            case ia_pal_uuid_isp_bxt_ofa_dp:
+            case ia_pal_uuid_isp_bxt_ofa_mp:
+            case ia_pal_uuid_isp_bxt_ofa_ppp:
+                programGroup.run_kernels[i].metadata[2] = aiqResults->mAiqParam.flipMode;
+                LOG2("%s: flip mode set to %d", __func__, programGroup.run_kernels[i].metadata[2]);
+
+                programGroup.run_kernels[i].metadata[3] = aiqResults->mAiqParam.yuvColorRangeMode;
+                LOG2("ofa yuv color range mode %d", programGroup.run_kernels[i].metadata[3]);
+                break;
+            }
+        }
+    }
+
+    // Enable or disable kernels according to environment variables for debug purpose.
+    updateKernelToggles(programGroup);
+
+    inputParams.program_group = &programGroup;
+    inputParams.sensor_frame_params = &mFrameParam;
+
+    inputParams.ae_results = &aiqResults->mAeResults;
+    inputParams.gbce_results = &aiqResults->mGbceResults;
+    inputParams.awb_results = &aiqResults->mAwbResults;
+    inputParams.pa_results = &aiqResults->mPaResults;
+    inputParams.sa_results = &aiqResults->mSaResults;
+    inputParams.weight_grid = aiqResults->mAeResults.weight_grid;
+
+    if (aiqResults->mCustomControls.count > 0) {
+        inputParams.custom_controls = &aiqResults->mCustomControls;
+    }
+
+    if (ispSettings) {
+        inputParams.nr_setting = ispSettings->nrSetting;
+        inputParams.ee_setting = ispSettings->eeSetting;
+        LOG2("%s: ISP NR setting, level: %d, strength: %d",
+                __func__, (int)ispSettings->nrSetting.feature_level,
+                (int)ispSettings->nrSetting.strength);
+        inputParams.effects = ispSettings->effects;
+        inputParams.manual_brightness = ispSettings->manualSettings.manualBrightness;
+        inputParams.manual_contrast = ispSettings->manualSettings.manualContrast;
+        inputParams.manual_hue = ispSettings->manualSettings.manualHue;
+        inputParams.manual_saturation = ispSettings->manualSettings.manualSaturation;
+        LOG2("%s: ISP EE setting, level: %d, strength: %d",
+                __func__, ispSettings->eeSetting.feature_level,
+                ispSettings->eeSetting.strength);
+        // INTEL_DVS_S
+        if (ispSettings->videoStabilization) {
+            int dvsType = PlatformData::getDVSType(mCameraId);
+            LOG2("%s: ISP Video Stabilization Mode Enable, dvs type %d", __func__, dvsType);
+            DvsResult* dvsResult = const_cast<DvsResult*>(AiqResultStorage::getInstance(mCameraId)->getDvsResult());
+            if (dvsType == MORPH_TABLE) {
+                inputParams.dvs_morph_table = (dvsResult == nullptr) ? nullptr : &dvsResult->mMorphTable;
+            } else if (dvsType == IMG_TRANS) {
+                inputParams.gdc_transformation = (dvsResult == nullptr) ? nullptr : &dvsResult->mTransformation;
+            }
+        }
+        // INTEL_DVS_E
+
+        inputParams.pal_override = ispSettings->palOverride;
+    }
+
+    if (CameraUtils::isUllPsysPipe(mTuningMode)) {
+        CheckError((aiqResults->mAeResults.exposures[0].exposure == nullptr), BAD_VALUE, "Aiq exposure is NULL.");
+        // The situation that all DG passed to ISP, not sensor.
+        if (!PlatformData::isUsingSensorDigitalGain(mCameraId)) {
+            inputParams.manual_digital_gain = aiqResults->mAeResults.exposures[0].exposure->digital_gain;
+        }
+        // Fine-tune DG passed to ISP if partial ISP DG is needed.
+        if (PlatformData::isUsingIspDigitalGain(mCameraId)) {
+            inputParams.manual_digital_gain = PlatformData::getIspDigitalGain(mCameraId,
+                                aiqResults->mAeResults.exposures[0].exposure->digital_gain);
+        }
+
+        LOG3A("%s: set digital gain for ULL pipe: %f", __func__, inputParams.manual_digital_gain);
+    } else if (CameraUtils::isMultiExposureCase(mTuningMode) &&
+               PlatformData::getSensorGainType(mCameraId) == ISP_DG_AND_SENSOR_DIRECT_AG) {
+        CheckError((aiqResults->mAeResults.exposures[0].exposure == nullptr), BAD_VALUE, "Aiq exposure is NULL.");
+
+        LOG3A("%s: all digital gain is passed to ISP, DG(%ld): %f",
+              __func__, aiqResults->mSequence, aiqResults->mAeResults.exposures[0].exposure->digital_gain);
+        inputParams.manual_digital_gain = aiqResults->mAeResults.exposures[0].exposure->digital_gain;
+    }
+
+    if (forceUpdate) {
+        inputParams.sa_results->lsc_update = true;
+    }
+
+    int ret = OK;
+    {
+        PERF_CAMERA_ATRACE_PARAM1_IMAGING("ia_isp_bxt_run", 1);
+        ret = mAdaptor->runPal(mIspAdaptHandle, &inputParams, &mCurrentIpuParam);
+    }
+    CheckError(ret != OK, UNKNOWN_ERROR, "ISP parameter adaptation has failed %d", ret);
+
+    dumpIspParameter(aiqResults->mSequence);
+
+    return OK;
+}
+
+void IspParamAdaptor::dumpAfStats(const ia_aiq_af_grid *afGrid, long sequence)
+{
+    if (!afGrid) return;
+
+    if (mPgParamType == PG_PARAM_PSYS_ISA && !CameraDump::isDumpTypeEnable(DUMP_PSYS_AIQ_STAT))
+        return;
+    if (mPgParamType == PG_PARAM_ISYS && !CameraDump::isDumpTypeEnable(DUMP_ISYS_AIQ_STAT))
+        return;
+
+    BinParam_t bParam;
+    bParam.bType = BIN_TYPE_STATISTIC;
+    bParam.mType = mPgParamType == PG_PARAM_PSYS_ISA ? M_PSYS : M_ISYS;
+    bParam.sequence = sequence;
+    bParam.sParam.gridWidth = afGrid->grid_width;
+    bParam.sParam.gridHeight = afGrid->grid_height;
+    bParam.sParam.appendix = "af_stats_filter_response_1";
+    CameraDump::dumpBinary(mCameraId, afGrid->filter_response_1,
+                           afGrid->grid_width * afGrid->grid_height * sizeof(int), &bParam);
+    bParam.sParam.appendix = "af_stats_filter_response_2";
+    CameraDump::dumpBinary(mCameraId, afGrid->filter_response_2,
+                           afGrid->grid_width * afGrid->grid_height * sizeof(int), &bParam);
+}
+
+void IspParamAdaptor::dumpRgbsStats(ia_aiq_rgbs_grid *rgbsGrid, long sequence, unsigned int num)
+{
+    if (rgbsGrid == nullptr) return;
+
+    if (Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) {
+        for (unsigned int i = 0; i < num; i++ ) {
+            rgbs_grid_block *rgbsPtr = rgbsGrid[i].blocks_ptr;
+            int size = rgbsGrid[i].grid_width * rgbsGrid[i].grid_height;
+            // Print out some value to check if it's reasonable
+            for (int j = 100; j < 105 && j < size; j++) {
+                LOG3A("RGBS: [%d]:%d, %d, %d, %d, %d", j, rgbsPtr[j].avg_b, rgbsPtr[j].avg_gb,
+                            rgbsPtr[j].avg_gr, rgbsPtr[j].avg_r, rgbsPtr[j].sat);
+            }
+
+            // Only print last Rgbs Stats's y_mean for validation purpose
+            if (i < num - 1) continue;
+
+            int sumLuma = 0;
+            for (int j = 0; j < size; j++) {
+                sumLuma += (rgbsPtr[j].avg_b + rgbsPtr[j].avg_r + (rgbsPtr[j].avg_gb + rgbsPtr[j].avg_gr) / 2) / 3;
+            }
+            LOG3A("RGB stat grid[%d] %dx%d, y_mean %d", i, rgbsGrid[i].grid_width, rgbsGrid[i].grid_height, sumLuma/size);
+        }
+    }
+
+    if ((mPgParamType == PG_PARAM_PSYS_ISA && CameraDump::isDumpTypeEnable(DUMP_PSYS_AIQ_STAT)) ||
+        (mPgParamType == PG_PARAM_ISYS && CameraDump::isDumpTypeEnable(DUMP_ISYS_AIQ_STAT))) {
+        char name[30];
+        BinParam_t bParam;
+        bParam.bType    = BIN_TYPE_STATISTIC;
+        bParam.mType    = mPgParamType == PG_PARAM_PSYS_ISA ? M_PSYS : M_ISYS;
+        bParam.sequence = sequence;
+        for (unsigned int i = 0; i < num; i++ ) {
+            CLEAR(name);
+            snprintf(name, sizeof(name), "%s_stats_%u_%u",
+                    mPgParamType == PG_PARAM_PSYS_ISA ? "hdr_rgbs" : "rgbs", num, i);
+            bParam.sParam.gridWidth  = rgbsGrid[i].grid_width;
+            bParam.sParam.gridHeight = rgbsGrid[i].grid_height;
+            bParam.sParam.appendix   = name;
+            if (rgbsGrid[i].grid_width != 0 && rgbsGrid[i].grid_height != 0) {
+                CameraDump::dumpBinary(mCameraId, rgbsGrid[i].blocks_ptr,
+                                       rgbsGrid[i].grid_width * rgbsGrid[i].grid_height * sizeof(rgbs_grid_block),
+                                       &bParam);
+            }
+        }
+    }
+}
+
+void IspParamAdaptor::dumpIspParameter(long sequence) {
+    if (mPgParamType == PG_PARAM_PSYS_ISA && !CameraDump::isDumpTypeEnable(DUMP_PSYS_PAL)) return;
+    if (mPgParamType == PG_PARAM_ISYS && !CameraDump::isDumpTypeEnable(DUMP_ISYS_PAL)) return;
+
+    BinParam_t bParam;
+    bParam.bType    = BIN_TYPE_GENERAL;
+    bParam.mType    = mPgParamType == PG_PARAM_PSYS_ISA ? M_PSYS : M_ISYS;
+    bParam.sequence = sequence;
+    bParam.gParam.appendix = "pal";
+    CameraDump::dumpBinary(mCameraId, mCurrentIpuParam.data, mCurrentIpuParam.size, &bParam);
+}
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/IspParamAdaptor.h b/camera/hal/intel/ipu6/src/core/IspParamAdaptor.h
new file mode 100644
index 000000000000..f0b25e4e49df
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/IspParamAdaptor.h
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <v4l2_device.h>
+
+#include <memory>
+#include <vector>
+#include <list>
+#include <unordered_map>
+
+#include "iutils/Errors.h"
+#include "CameraBuffer.h"
+#include "CameraTypes.h"
+
+#include "NodeInfo.h"
+
+extern "C" {
+#ifndef CAL_BUILD
+#include "ia_camera/ipu_process_group_wrapper.h"
+#endif
+}
+
+#ifdef ENABLE_SANDBOXING
+#include "modules/sandboxing/client/IntelIspParamAdaptor.h"
+#else
+#include "modules/algowrapper/IntelIspParamAdaptor.h"
+#endif
+
+#include "ia_aiq_types.h"
+#include "ia_isp_bxt_types.h"
+#include "ia_isp_bxt_statistics_types.h"
+#include "ia_isp_bxt.h"
+#include "ia_bcomp_types.h"
+#include "gc/IGraphConfigManager.h"
+#include "IspSettings.h"
+
+namespace icamera {
+
+enum PgParamType {
+    PG_PARAM_VIDEO = 0,
+    PG_PARAM_PSYS_ISA,
+    PG_PARAM_ISYS,
+    PG_PARAM_STILL_4k,
+    PG_PARAM_STILL_8m
+};
+
+/**
+ * This class is for isp parameter converting including:
+ * 1. Convert hw statistics to aiq statistics
+ * 2. Convert aiq result to isa config
+ * 3. Run isp config
+ * 4. Provide p2p handle
+ */
+class IspParamAdaptor {
+public:
+    IspParamAdaptor(int cameraId, PgParamType type);
+    virtual ~IspParamAdaptor();
+
+    int init();
+    int deinit();
+    int configure(const stream_t &stream, ConfigMode configMode, TuningMode tuningMode);
+
+    int getParameters(Parameters& param);
+    int decodeStatsData(TuningMode tuningMode,
+                        std::shared_ptr<CameraBuffer> statsBuffer,
+                        std::shared_ptr<IGraphConfig> graphConfig = nullptr);
+
+    int runIspAdapt(const IspSettings* ispSettings, long settingSequence = -1, int32_t streamId = -1);
+    //Get ISP param from mult-stream ISP param adaptation
+    const ia_binary_data* getIpuParameter(long sequence = -1, int streamId = -1);
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(IspParamAdaptor);
+
+    int initProgramGroupForAllStreams(ConfigMode configMode);
+    int postConfigure(int width, int height);
+    void initInputParams(ia_isp_bxt_input_params_v2 *params, PgParamType type);
+
+    int initIspAdaptHandle(ConfigMode configMode, TuningMode tuningMode);
+    void deinitIspAdaptHandle();
+
+    int runIspAdaptL(ia_isp_bxt_program_group programGroup, ia_isp_bxt_gdc_limits* mbrData,
+                     const IspSettings* ispSettings, long settingSequence,
+                     bool forceUpdate = false);
+
+    //Allocate memory for mIspParameters
+    int allocateIspParamBuffers();
+    //Release memory for mIspParameters
+    void releaseIspParamBuffers();
+
+    // Dumping methods for debugging purposes.
+    void dumpRgbsStats(ia_aiq_rgbs_grid *rgbs_grid, long sequence, unsigned int num = 1);
+    void dumpAfStats(const ia_aiq_af_grid *afGrid, long sequence);
+    void dumpIspParameter(long sequence);
+    // Enable or disable kernels according to environment variables for debug purpose.
+    void updateKernelToggles(ia_isp_bxt_program_group programGroup);
+
+ private:
+    enum IspAdaptorState {
+        ISP_ADAPTOR_NOT_INIT,
+        ISP_ADAPTOR_INIT,
+        ISP_ADAPTOR_CONFIGURED
+    } mIspAdaptorState;
+
+    int mCameraId;
+    PgParamType mPgParamType;
+    TuningMode mTuningMode;
+
+    ia_isp_bxt   *mIspAdaptHandle;
+    ia_bcomp_results *mBCompResults;
+
+    //Guard for IspParamAdaptor public API
+    Mutex mIspAdaptorLock;
+    std::map<int, ia_isp_bxt_program_group> mStreamIdToProgramGroupMap;
+    std::map<int, int> mStreamIdToPGOutSizeMap;
+    std::map<int, ia_isp_bxt_gdc_limits> mStreamIdToMbrDataMap;
+    ia_aiq_frame_params mFrameParam;
+    ia_binary_data mCurrentIpuParam;   // current output from AIC
+    static const int ISP_PARAM_QUEUE_SIZE = 10;
+    int mCurIspParamIndex;
+    struct IspParameter {
+        long sequence; // frame sequence id
+        std::map<int, ia_binary_data> streamIdToDataMap; // map from stream id to ia_binary_data
+        std::unordered_map<int32_t, bool> dataAvailableMap;
+    } mIspParameters[ISP_PARAM_QUEUE_SIZE];
+
+    IGraphConfigManager *mGCM;
+    std::list<long> mSequenceList;  // Store the sequence history in IspParamAdaptor
+    std::unique_ptr<IntelIspParamAdaptor> mAdaptor;
+};
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/IspSettings.h b/camera/hal/intel/ipu6/src/core/IspSettings.h
new file mode 100644
index 000000000000..803c5bc17c86
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/IspSettings.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2018-2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "ia_isp_types.h"
+#include "iutils/Utils.h"
+#include "Parameters.h"
+
+namespace icamera {
+
+struct IspImageEnhancement{
+    char manualSharpness;
+    char manualBrightness;
+    char manualContrast;
+    char manualHue;
+    char manualSaturation;
+};
+
+struct IspSettings {
+    ia_isp_feature_setting nrSetting;
+    ia_isp_feature_setting eeSetting;
+    ia_isp_effect effects;
+    bool videoStabilization;
+    IspImageEnhancement manualSettings;
+    ia_binary_data* palOverride;
+    float zoom;
+    camera_mount_type_t sensorMountType;
+    IspSettings() { CLEAR(*this); zoom = 1.0f; }
+};
+
+} // namespace icamera
+
diff --git a/camera/hal/intel/ipu6/src/core/LensHw.cpp b/camera/hal/intel/ipu6/src/core/LensHw.cpp
new file mode 100644
index 000000000000..a2588e25a5f2
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/LensHw.cpp
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2016-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "LensHw"
+
+#include "LensHw.h"
+#include "iutils/CameraLog.h"
+#include "V4l2DeviceFactory.h"
+#include "PlatformData.h"
+
+namespace icamera {
+
+LensHw::LensHw(int cameraId):
+    mCameraId(cameraId),
+    mLensSubdev(nullptr),
+    mLastLensPosition(0),
+    mLensMovementStartTime(0)
+{
+    LOG1("@%s", __func__);
+}
+
+LensHw::~LensHw() {
+    LOG1("@%s", __func__);
+}
+
+int LensHw::init()
+{
+    LOG1("@%s", __func__);
+    std::string lensName = PlatformData::getLensName(mCameraId);
+    if (lensName.empty()) {
+        LOG1("%s No Lens for camera id:%d ", __func__, mCameraId);
+        return OK;
+    }
+
+    LOG1("%s camera id:%d lens name:%s", __func__, mCameraId, lensName.c_str());
+    std::string subDevName;
+    CameraUtils::getSubDeviceName(lensName.c_str(), subDevName);
+    if (!subDevName.empty()) {
+        mLensSubdev = V4l2DeviceFactory::getSubDev(mCameraId, subDevName);
+        mLensName=lensName;
+        return OK;
+    }
+
+    LOGW("%s Fail to init lens for camera id:%d lens name:%s", __func__, mCameraId, lensName.c_str());
+    return OK;
+}
+
+/**
+ * focus with absolute value
+ */
+int LensHw::setFocusPosition(int position)
+{
+    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
+    mLastLensPosition = position;
+
+    struct timespec t = {};
+    clock_gettime(CLOCK_MONOTONIC, &t);
+
+    mLensMovementStartTime = ((long)t.tv_sec) * 1000000 + (long)t.tv_nsec / 1000;
+
+    LOG2("@%s: %d, time %lld", __func__, position, mLensMovementStartTime);
+    return mLensSubdev->SetControl(V4L2_CID_FOCUS_ABSOLUTE, position);
+}
+
+/**
+ * focus with  relative value
+ */
+int LensHw::setFocusStep(int steps)
+{
+    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
+    LOG2("@%s", __func__);
+    return mLensSubdev->SetControl(V4L2_CID_FOCUS_RELATIVE, steps);
+}
+
+int LensHw::getFocusPosition(int &position)
+{
+    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
+    LOG2("@%s", __func__);
+    return mLensSubdev->GetControl(V4L2_CID_FOCUS_ABSOLUTE, &position);
+}
+
+int LensHw::getFocusStatus(int & /*status*/)
+{
+    LOG2("@%s", __func__);
+    return OK;
+}
+
+int LensHw::startAutoFocus(void)
+{
+    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
+    LOG2("@%s", __func__);
+    return mLensSubdev->SetControl(V4L2_CID_AUTO_FOCUS_START, 1);
+}
+
+int LensHw::stopAutoFocus(void)
+{
+    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
+    LOG2("@%s", __func__);
+    return mLensSubdev->SetControl(V4L2_CID_AUTO_FOCUS_STOP, 0);
+}
+
+int LensHw::getAutoFocusStatus(int &status)
+{
+    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
+    LOG2("@%s", __func__);
+    return mLensSubdev->GetControl(V4L2_CID_AUTO_FOCUS_STATUS,
+                                    reinterpret_cast<int*>(&status));
+}
+
+int LensHw::setAutoFocusRange(int value)
+{
+    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
+    LOG2("@%s", __func__);
+    return mLensSubdev->SetControl(V4L2_CID_AUTO_FOCUS_RANGE, value);
+}
+
+int LensHw::getAutoFocusRange(int &value)
+{
+    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
+    LOG2("@%s", __func__);
+    return mLensSubdev->GetControl(V4L2_CID_AUTO_FOCUS_RANGE, &value);
+}
+
+const char* LensHw::getLensName(void)
+{
+    return mLensName.c_str();
+}
+
+/**
+ * getLatestPosition
+ *
+ * returns the latest position commanded to the lens actuator and when this
+ * was issued.
+ * This method does not query the driver.
+ *
+ * \param: lensPosition[OUT]: lens position last applied
+ * \param: time[OUT]: time in micro seconds when the lens move command was sent.
+ */
+int LensHw::getLatestPosition(int& lensPosition, unsigned long long& time)
+{
+    lensPosition = mLastLensPosition;
+    time = mLensMovementStartTime;
+    return OK;
+}
+
+}   // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/LensHw.h b/camera/hal/intel/ipu6/src/core/LensHw.h
new file mode 100644
index 000000000000..997cc13dcf76
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/LensHw.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2016-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <v4l2_device.h>
+
+#include <string>
+
+namespace icamera {
+
+typedef ::cros::V4L2Subdevice V4L2Subdevice;
+
+/**
+ * \class LensHw
+ * This class adds the methods that are needed
+ * to drive the camera lens using v4l2 commands and custom ioctl.
+ *
+ */
+class LensHw {
+
+public:
+    LensHw(int cameraId);
+    ~LensHw();
+
+    int init();
+
+    const char* getLensName(void);
+
+    int setFocusPosition(int position);
+    int setFocusStep(int steps);
+    int getFocusPosition(int &position);
+    int getFocusStatus(int &status);
+    int startAutoFocus(void);
+    int stopAutoFocus(void);
+    int getAutoFocusStatus(int &status);
+    int setAutoFocusRange(int value);
+    int getAutoFocusRange(int &value);
+    int getLatestPosition(int& lensPosition, unsigned long long& time);
+    bool isLensSubdevAvailable() { return (mLensSubdev != nullptr); }
+
+private:
+    int mCameraId;
+    V4L2Subdevice* mLensSubdev;
+    std::string mLensName;
+    int mLastLensPosition;
+    unsigned long long mLensMovementStartTime; /*!< In microseconds */
+};  // class LensHW
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/PSysProcessor.cpp b/camera/hal/intel/ipu6/src/core/PSysProcessor.cpp
new file mode 100644
index 000000000000..b026ad00114b
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/PSysProcessor.cpp
@@ -0,0 +1,860 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "PSysProcessor"
+
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+#include "iutils/CameraDump.h"
+#include "iutils/SwImageConverter.h"
+
+#include "PlatformData.h"
+#include "3a/AiqResultStorage.h"
+#include "ParameterGenerator.h"
+
+#include "PSysProcessor.h"
+
+/*
+ * The sof event time margin is a tunning value
+ * it's based on sensor vblank, psys iterating time
+ * and thread scheduling
+ */
+#define SOF_EVENT_MARGIN (3000000)  // 3ms
+
+using std::shared_ptr;
+
+namespace icamera {
+PSysProcessor::PSysProcessor(int cameraId, ParameterGenerator *pGenerator) :
+        mCameraId(cameraId),
+        mParameterGenerator(pGenerator),
+        mCurConfigMode(CAMERA_STREAM_CONFIGURATION_MODE_NORMAL),
+        mTuningMode(TUNING_MODE_MAX),
+        mRawPort(INVALID_PORT),
+        mOpaqueRawPort(INVALID_PORT),
+        mStatus(PIPELINE_UNCREATED)
+{
+    LOG1("@%s camera id:%d", __func__, mCameraId);
+
+    mProcessThread = new ProcessThread(this);
+    CLEAR(mSofTimestamp);
+}
+
+PSysProcessor::~PSysProcessor()
+{
+    LOG1("@%s ", __func__);
+
+    mProcessThread->join();
+    delete mProcessThread;
+}
+
+int PSysProcessor::configure(const std::vector<ConfigMode>& configModes)
+{
+    //Create PSysDAGs actually
+    LOG1("@%s ", __func__);
+    CheckError(mStatus == PIPELINE_CREATED, -1, "@%s mStatus is in wrong status: PIPELINE_CREATED", __func__);
+    mConfigModes = configModes;
+
+    std::map<Port, stream_t> outputFrameInfo;
+    // Check if it's required to output raw image from ISYS
+    for (auto &outFrameInfo : mOutputFrameInfo) {
+        if (outFrameInfo.second.format == V4L2_PIX_FMT_SGRBG12) {
+            mRawPort = outFrameInfo.first;
+        } else if (outFrameInfo.second.usage == CAMERA_STREAM_OPAQUE_RAW) {
+            mOpaqueRawPort = outFrameInfo.first;
+        } else {
+            outputFrameInfo[outFrameInfo.first] = outFrameInfo.second;
+        }
+    }
+
+    int ret = OK;
+    //Create PSysDAG according to real configure mode
+    for (auto &cfg : mConfigModes) {
+        if (mPSysDAGs.find(cfg) != mPSysDAGs.end()) {
+            continue;
+        }
+
+        TuningConfig tuningConfig;
+        ret = PlatformData::getTuningConfigByConfigMode(mCameraId, cfg, tuningConfig);
+        CheckError(ret != OK, ret, "%s: can't get config for mode %d", __func__, cfg);
+
+        LOG1("Create PSysDAG for ConfigMode %d", cfg);
+        shared_ptr<PSysDAG> pSysDAG = shared_ptr<PSysDAG>(new PSysDAG(mCameraId, this));
+
+        pSysDAG->setFrameInfo(mInputFrameInfo, outputFrameInfo);
+        ret = pSysDAG->configure(tuningConfig.configMode, tuningConfig.tuningMode);
+        CheckError(ret != OK, ret, "@%s configure psys dag failed:%d", __func__, ret);
+
+        mPSysDAGs[tuningConfig.configMode] = pSysDAG;
+
+        //Update default active config mode
+        mCurConfigMode = tuningConfig.configMode;
+        mTuningMode = tuningConfig.tuningMode;
+    }
+
+    if (ret == OK) mStatus = PIPELINE_CREATED;
+    return ret;
+
+}
+
+int PSysProcessor::registerUserOutputBufs(Port port, const shared_ptr<CameraBuffer> &camBuffer)
+{
+    for (auto psysDAGPair : mPSysDAGs) {
+        shared_ptr<PSysDAG> psysDAG = psysDAGPair.second;
+        if (!psysDAG) continue;
+        int ret = psysDAG->registerUserOutputBufs(port, camBuffer);
+        CheckError(ret != OK, BAD_VALUE, "%s, register user buffer failed, ret: %d", __func__, ret);
+    }
+
+    return OK;
+}
+
+int PSysProcessor::start()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("%s", __func__);
+    AutoMutex   l(mBufferQueueLock);
+    int rawBufferNum = mOpaqueRawPort != INVALID_PORT ? PlatformData::getMaxRawDataNum(mCameraId) :
+                       PlatformData::getPreferredBufQSize(mCameraId);
+
+    /* Should use MIN_BUFFER_COUNT to optimize frame latency when PSYS processing
+     * time is slower than ISYS
+     */
+    bool needProducerBuffer = PlatformData::isIsysEnabled(mCameraId);
+
+    if (needProducerBuffer) {
+        int ret = allocProducerBuffers(mCameraId, rawBufferNum);
+        CheckError(ret != OK, NO_MEMORY, "Allocating producer buffer failed:%d", ret);
+    }
+
+    mThreadRunning = true;
+    mProcessThread->run("PsysProcessor", PRIORITY_NORMAL);
+    for (auto psysDAGPair : mPSysDAGs) {
+        shared_ptr<PSysDAG> curPsysDAG = psysDAGPair.second;
+        if (!curPsysDAG) continue;
+        curPsysDAG->start();
+        if (needProducerBuffer && PlatformData::isNeedToPreRegisterBuffer(mCameraId)) {
+            curPsysDAG->registerInternalBufs(mInternalBuffers);
+        }
+    }
+
+    return OK;
+}
+
+void PSysProcessor::stop()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("%s", __func__);
+
+    for (auto psysDAGPair : mPSysDAGs) {
+        shared_ptr<PSysDAG> curPsysDAG = psysDAGPair.second;
+        if (!curPsysDAG) continue;
+        curPsysDAG->stop();
+    }
+
+    mProcessThread->requestExit();
+    {
+        AutoMutex l(mBufferQueueLock);
+        mThreadRunning = false;
+        //Wakeup the thread to exit
+        mFrameAvailableSignal.signal();
+        mOutputAvailableSignal.signal();
+        mFrameDoneSignal.signal();
+        AutoMutex lMeta(mMetaQueueLock);
+        mMetaAvailableSignal.signal();
+    }
+    {
+        AutoMutex l(mSofLock);
+        mSofCondition.signal();
+    }
+
+    mProcessThread->requestExitAndWait();
+
+    // Thread is not running. It is safe to clear the Queue
+    clearBufferQueues();
+}
+
+int PSysProcessor::setParameters(const Parameters& param)
+{
+    LOG1("%s camera id:%d", __func__, mCameraId);
+    // Process image enhancement related settings.
+    camera_image_enhancement_t enhancement;
+    int ret = param.getImageEnhancement(enhancement);
+    AutoWMutex wl(mIspSettingsLock);
+    if (ret == OK) {
+        mIspSettings.manualSettings.manualSharpness = (char)enhancement.sharpness;
+        mIspSettings.manualSettings.manualBrightness = (char)enhancement.brightness;
+        mIspSettings.manualSettings.manualContrast = (char)enhancement.contrast;
+        mIspSettings.manualSettings.manualHue = (char)enhancement.hue;
+        mIspSettings.manualSettings.manualSaturation = (char)enhancement.saturation;
+
+        // TODO: need to consider how to add feature level from user setting.
+        mIspSettings.eeSetting.feature_level = ia_isp_feature_level_low;
+        mIspSettings.eeSetting.strength = enhancement.sharpness;
+    } else {
+        mIspSettings.eeSetting.feature_level = ia_isp_feature_level_low;
+        mIspSettings.eeSetting.strength = 0;
+    }
+
+    camera_nr_mode_t manualNrMode;
+    camera_nr_level_t manualNrLevel;
+
+    int manualNrModeSet = param.getNrMode(manualNrMode);
+    int manualNrLevelSet = param.getNrLevel(manualNrLevel);
+
+    if (manualNrModeSet == OK) {
+        LOG2("%s: manual NR mode set: %d", __func__, manualNrMode);
+        switch (manualNrMode) {
+            case NR_MODE_OFF:
+                mIspSettings.nrSetting.feature_level = ia_isp_feature_level_off;
+                break;
+            case NR_MODE_AUTO:
+                mIspSettings.nrSetting.feature_level = ia_isp_feature_level_low;
+                break;
+            case NR_MODE_MANUAL_NORMAL:
+                mIspSettings.nrSetting.feature_level = ia_isp_feature_level_low;
+                break;
+            case NR_MODE_MANUAL_EXPERT:
+                mIspSettings.nrSetting.feature_level = ia_isp_feature_level_high;
+                break;
+            default:
+                mIspSettings.nrSetting.feature_level = ia_isp_feature_level_low;
+        }
+
+    } else {
+        LOG2("%s: manual NR mode not set, default enabled", __func__);
+        mIspSettings.nrSetting.feature_level = ia_isp_feature_level_high;
+    }
+
+    if (manualNrLevelSet == OK) {
+        LOG2("%s: manual NR level set: %d", __func__, manualNrLevel.overall);
+        mIspSettings.nrSetting.strength = (char)manualNrLevel.overall;
+    } else {
+        LOG2("%s: manual NR level not set, default used", __func__);
+        mIspSettings.nrSetting.strength = (char)0;
+    }
+
+    LOG2("%s: ISP NR setting, level: %d, strength: %d",
+            __func__, (int)mIspSettings.nrSetting.feature_level,
+            (int)mIspSettings.nrSetting.strength);
+
+    camera_video_stabilization_mode_t stabilizationMode;
+    ret = param.getVideoStabilizationMode(stabilizationMode);
+    if (ret == OK) {
+         mIspSettings.videoStabilization = (stabilizationMode == VIDEO_STABILIZATION_MODE_ON);
+    } else {
+         mIspSettings.videoStabilization = false;
+    }
+    LOG2("%s: Video stablilization enabled:%d", __func__, mIspSettings.videoStabilization);
+
+    return ret;
+}
+
+int PSysProcessor::getParameters(Parameters& param)
+{
+    LOG1("@%s ", __func__);
+    AutoRMutex rl(mIspSettingsLock);
+    camera_image_enhancement_t enhancement = { mIspSettings.manualSettings.manualSharpness,
+                                               mIspSettings.manualSettings.manualBrightness,
+                                               mIspSettings.manualSettings.manualContrast,
+                                               mIspSettings.manualSettings.manualHue,
+                                               mIspSettings.manualSettings.manualSaturation };
+    int ret = param.setImageEnhancement(enhancement);
+
+    ret |= mPSysDAGs[mCurConfigMode]->getParameters(param);
+
+    return ret;
+}
+
+/**
+ * Get available setting sequence from outBuf
+ */
+long PSysProcessor::getSettingSequence(const CameraBufferPortMap &outBuf)
+{
+    long settingSequence = -1;
+    for (auto& output: outBuf) {
+        if (output.second) {
+            settingSequence = output.second->getSettingSequence();
+            break;
+        }
+    }
+    return settingSequence;
+}
+
+/**
+ * Check if the input frame should be skipped
+ *
+ * If the corresponding mSkip of AiqResult gotten from sequence is true,
+ * return true; otherwise return false.
+ */
+bool PSysProcessor::needSkipOutputFrame(long sequence)
+{
+    // Check if need to skip output frame
+    const AiqResult* aiqResults = AiqResultStorage::getInstance(mCameraId)->getAiqResult(sequence);
+    if (aiqResults != nullptr && aiqResults->mSkip) {
+        LOG1("%s, sequence %ld", __func__, sequence);
+        return true;
+    }
+    return false;
+}
+
+/**
+ * Check if 'inBuffer' can be used for 'settingSequence' to run PSys pipe.
+ *
+ * If 'settingSequence' is -1, it means the output buffer doesn't require particular
+ * input buffer, so it can run the pipe.
+ * If 'inputSequence' larger than 'settingSequence', the pipeline needs to
+ * run as well, otherwise the pipe doesn't need to run and this input buffer needs to
+ * be skipped.
+ */
+bool PSysProcessor::needExecutePipe(long settingSequence, long inputSequence)
+{
+    if (settingSequence == -1 || inputSequence >= settingSequence) {
+        return true;
+    }
+
+    return false;
+}
+
+/**
+ * Check if the input buffer need to be reused
+ *
+ * If 'settingSequence' is -1, it means the output buffer doesn't require particular
+ * input buffer, so the input buffer doesn't need to be reused.
+ * If 'inputSequence' larger than 'settingSequence', means the input buffer
+ * may be required by following output buffer, so it may be reused later.
+ */
+bool PSysProcessor::needHoldOnInputFrame(long settingSequence, long inputSequence)
+{
+    if (settingSequence == -1 || inputSequence <= settingSequence) {
+        return false;
+    }
+
+    return true;
+}
+
+/**
+ * Check if pipe needs to be switched according to AIQ result.
+ */
+bool PSysProcessor::needSwitchPipe(long sequence)
+{
+    const AiqResult* aiqResults = AiqResultStorage::getInstance(mCameraId)->getAiqResult(sequence);
+    if (aiqResults == nullptr) {
+        LOG2("%s: not found sequence %ld in AiqResultStorage, no update for active modes",
+            __func__, sequence);
+        return false;
+    }
+
+    TuningMode curTuningMode = aiqResults->mTuningMode;
+    LOG2("%s: aiqResults->mTuningMode = %d", __func__, curTuningMode);
+
+    if (mTuningMode == curTuningMode) {
+        return false;
+    }
+
+    for (auto cfg : mConfigModes) {
+        TuningMode tMode;
+        int ret = PlatformData::getTuningModeByConfigMode(mCameraId, cfg, tMode);
+        if (ret == OK && tMode == curTuningMode) {
+            mCurConfigMode = cfg;
+            mTuningMode = curTuningMode;
+            return true;
+        }
+    }
+    return false;
+}
+
+void PSysProcessor::handleEvent(EventData eventData)
+{
+    LOG2("%s: got event type %d", __func__, eventData.type);
+    // Process registered events
+    switch (eventData.type) {
+        case EVENT_ISYS_SOF:
+            {
+                AutoMutex l(mSofLock);
+                gettimeofday(&mSofTimestamp, nullptr);
+                LOG2("%s, received SOF event sequence: %ld, timestamp: %ld",
+                     __func__, eventData.data.sync.sequence, TIMEVAL2USECS(mSofTimestamp));
+                mSofCondition.signal();
+            }
+            break;
+        default:
+            LOGW("Unexpected event: %d", eventData.type);
+            break;
+    }
+}
+
+// PSysProcessor ThreadLoop
+int PSysProcessor::processNewFrame() {
+    PERF_CAMERA_ATRACE();
+    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
+
+    CheckError(!mBufferProducer, INVALID_OPERATION, "No available producer");
+
+    int ret = OK;
+    CameraBufferPortMap srcBuffers, dstBuffers;
+
+    if (!PlatformData::psysAlignWithSof(mCameraId)) {
+        {
+            ConditionLock lock(mBufferQueueLock);
+            ret = waitFreeBuffersInQueue(lock, srcBuffers, dstBuffers);
+            // Already stopped
+            if (!mThreadRunning) return -1;
+
+            // Wait frame buffer time out should not involve thread exit.
+            if (ret != OK) {
+                LOG1("%s, cameraId: %d timeout happen, wait recovery", __func__, mCameraId);
+                return OK;
+            }
+        }
+
+        ret = prepareTask(&srcBuffers, &dstBuffers);
+        CheckError(ret != OK, UNKNOWN_ERROR, "%s, Failed to process frame", __func__);
+    } else {
+        {
+            ConditionLock lock(mSofLock);
+
+            timeval curTime;
+            gettimeofday(&curTime, nullptr);
+            int64_t sofInterval = TIMEVAL2NSECS(curTime) - TIMEVAL2NSECS(mSofTimestamp);
+
+            // Wait next sof event when missing last one for a long time
+            if (sofInterval > SOF_EVENT_MARGIN) {
+                LOG2("%s, need to wait next sof event. sofInterval: %ld", __func__, sofInterval);
+                ret = mSofCondition.waitRelative(lock, kWaitDuration * SLOWLY_MULTIPLIER);
+
+                // Already stopped
+                if (!mThreadRunning) return -1;
+
+                // Wait sof event time out should not involve thread exit.
+                if (ret != OK) {
+                    LOG1("%s, cameraId: %d wait sof event timeout, recovery", __func__, mCameraId);
+                    return OK;
+                }
+            }
+        }
+
+        // push all the pending buffers to task
+        while (true) {
+            {
+                ConditionLock lock(mBufferQueueLock);
+                ret = waitFreeBuffersInQueue(lock, srcBuffers, dstBuffers, SOF_EVENT_MARGIN);
+
+                // Return to wait next sof event if there isn't pending buffer.
+                if (ret != OK) {
+                    LOG1("%s, cameraId: %d, there isn't pending buffer, recovery",
+                         __func__, mCameraId);
+                    return OK;
+                }
+            }
+
+            ret = prepareTask(&srcBuffers, &dstBuffers);
+            CheckError(ret != OK, UNKNOWN_ERROR, "%s, Failed to process frame", __func__);
+        }
+    }
+
+    return OK;
+}
+
+void PSysProcessor::handleRawReprocessing(CameraBufferPortMap *srcBuffers,
+                                          CameraBufferPortMap *dstBuffers, bool *hasYuv,
+                                          bool *hasRawOutput)
+{
+    std::shared_ptr<CameraBuffer> rawOutputBuffer = nullptr;
+    long settingSequence = -1;
+    bool hasRawInput = false;
+
+    for (const auto& item : *dstBuffers) {
+        if (item.second) {
+            if (item.second->getStreamUsage() == CAMERA_STREAM_OPAQUE_RAW) {
+                rawOutputBuffer = item.second;
+            } else {
+                *hasYuv = true;
+            }
+            if (item.second->getSettingSequence() >= 0) {
+                settingSequence = item.second->getSettingSequence();
+            }
+        }
+    }
+
+    Port defaultPort = srcBuffers->begin()->first;
+    shared_ptr<CameraBuffer> mainBuf = (*srcBuffers)[defaultPort];
+    long inputSequence = mainBuf->getSequence();
+
+    if (rawOutputBuffer) {
+        if (!needExecutePipe(settingSequence, inputSequence)) {
+            LOG2("%s, inputSequence %ld is smaller than settingSequence %ld, skip sensor frame.",
+                 __func__, inputSequence, settingSequence);
+            return;
+        }
+        // Return opaque RAW data
+        uint64_t timestamp = TIMEVAL2NSECS(mainBuf->getTimestamp());
+        sensor_raw_info_t opaqueRawInfo = { inputSequence, timestamp };
+
+        rawOutputBuffer->updateV4l2Buffer(*mainBuf->getV4L2Buffer().Get());
+
+        MEMCPY_S(rawOutputBuffer->getBufferAddr(), rawOutputBuffer->getBufferSize(),
+                 &opaqueRawInfo, sizeof(opaqueRawInfo));
+        LOG2("%s, timestamp %ld, inputSequence %ld, dstBufferSize %d, addr %p", __func__,
+              timestamp, inputSequence, rawOutputBuffer->getBufferSize(),
+              rawOutputBuffer->getBufferAddr());
+
+        // Return opaque RAW buffer
+        for (auto &it : mBufferConsumerList) {
+            it->onFrameAvailable(mOpaqueRawPort, rawOutputBuffer);
+        }
+        *hasRawOutput = true;
+
+        // Remove from dstBuffers map
+        dstBuffers->erase(mOpaqueRawPort);
+
+        // Save buffer into mRawQueue
+        CameraBufferPortMap mapBuf;
+        for (const auto& src : *srcBuffers) {
+            mapBuf[src.first] = src.second;
+        }
+
+        AutoMutex lock(mRawBufferMapLock);
+        mRawBufferMap[inputSequence] = mapBuf;
+    } else if (settingSequence != -1 && inputSequence > settingSequence) {
+        AutoMutex lock(mRawBufferMapLock);
+        // Find Raw buffer in mRawBufferMap
+        if (mRawBufferMap.find(settingSequence) != mRawBufferMap.end()) {
+            CameraBufferPortMap &mapBuf = mRawBufferMap[settingSequence];
+            for (const auto& bufPortMap : mapBuf) {
+                (*srcBuffers)[bufPortMap.first] = bufPortMap.second;
+            }
+            hasRawInput = true;
+        }
+    }
+
+    LOG2("%s, hasRawInput %d, hasRawOutput %d, hasYuv %d, settingSequence %ld, inputSequence %ld",
+          __func__, hasRawInput, *hasRawOutput, *hasYuv, settingSequence, inputSequence);
+}
+
+bool PSysProcessor::isBufferHoldForRawReprocess(long sequence)
+{
+    if (mOpaqueRawPort == INVALID_PORT) return false;
+
+    AutoMutex lock(mRawBufferMapLock);
+    if (mRawBufferMap.find(sequence) == mRawBufferMap.end()) return false;
+
+    // If too many buffers are holden in mRawQueue, return back to producer
+    if (mRawBufferMap.size() >= (PlatformData::getMaxRawDataNum(mCameraId) -
+                                PlatformData::getMaxRequestsInflight(mCameraId))) {
+        std::map<long, CameraBufferPortMap>::iterator it = mRawBufferMap.begin();
+        CameraBufferPortMap &bufferPortMap = it->second;
+        for (auto &item : bufferPortMap) {
+            mBufferProducer->qbuf(item.first, item.second);
+        }
+        mRawBufferMap.erase(mRawBufferMap.begin());
+    }
+    return true;
+}
+
+status_t PSysProcessor::prepareTask(CameraBufferPortMap *srcBuffers,
+                                    CameraBufferPortMap *dstBuffers) {
+    CheckError(srcBuffers->empty() || dstBuffers->empty(),
+               UNKNOWN_ERROR, "%s, the input or output buffer is empty", __func__);
+
+    bool hasYuv = false;
+    bool hasRawOutput = false;
+    if (mOpaqueRawPort != INVALID_PORT) {
+        handleRawReprocessing(srcBuffers, dstBuffers, &hasYuv, &hasRawOutput);
+        if (hasRawOutput && !hasYuv) {
+            // If no YUV is needed, only RAW output requests
+            AutoMutex l(mBufferQueueLock);
+            for (auto& input: mInputQueue) {
+                input.second.pop();
+            }
+            for (auto& output: mOutputQueue) {
+                output.second.pop();
+            }
+            return OK;
+        }
+    }
+
+    Port defaultPort = srcBuffers->begin()->first;
+    shared_ptr<CameraBuffer> mainBuf = (*srcBuffers)[defaultPort];
+    long inputSequence = mainBuf->getSequence();
+    uint64_t timestamp = TIMEVAL2NSECS(mainBuf->getTimestamp());
+    LOG2("%s: input buffer sequence %ld timestamp %ld", __func__, inputSequence, timestamp);
+
+    // Output raw image
+    if (mRawPort != INVALID_PORT) {
+        shared_ptr<CameraBuffer> dstBuf = nullptr;
+
+        // Get output buffer and remove it from dstBuffers
+        for (auto &buffer : *dstBuffers) {
+            if (buffer.first == mRawPort) {
+                dstBuf = buffer.second;
+                CheckError(!dstBuf, UNKNOWN_ERROR, "%s, dstBuf for output raw is null", __func__);
+                dstBuf->updateV4l2Buffer(*mainBuf->getV4L2Buffer().Get());
+                dstBuffers->erase(mRawPort);
+                break;
+            }
+        }
+        outputRawImage(mainBuf, dstBuf);
+    }
+
+    long settingSequence = getSettingSequence(*dstBuffers);
+    bool needRunPipe = needExecutePipe(settingSequence, inputSequence);
+    bool holdOnInput = needHoldOnInputFrame(settingSequence, inputSequence);
+    LOG2("%s: dst sequence = %ld, src sequence = %ld, needRunPipe = %d, needReuseInput = %d",
+         __func__, settingSequence, inputSequence, needRunPipe, holdOnInput);
+
+    {
+        AutoMutex l(mBufferQueueLock);
+        if (needRunPipe && !needSkipOutputFrame(inputSequence)) {
+            for (auto& output: mOutputQueue) {
+                output.second.pop();
+            }
+        }
+
+        // If input buffer will be used later, don't pop it from the queue.
+        if (!holdOnInput) {
+            for (auto& input: mInputQueue) {
+                input.second.pop();
+            }
+        }
+    }
+
+    if (needRunPipe) {
+        // Raw output already has been returned back, and don't need to handle again.
+        if (!hasRawOutput) {
+            for (const auto& output : *dstBuffers) {
+                if (output.second && output.second->getUsage() != BUFFER_USAGE_PSYS_INTERNAL) {
+                    EventData requestReady;
+                    requestReady.type = EVENT_PSYS_REQUEST_BUF_READY;
+                    requestReady.buffer = nullptr;
+                    requestReady.data.requestReady.timestamp = timestamp;
+                    notifyListeners(requestReady);
+                    break;
+                }
+            }
+        }
+        dispatchTask(*srcBuffers, *dstBuffers);
+    } else if (!holdOnInput && !hasRawOutput) {
+        for (const auto& src : *srcBuffers) {
+            mBufferProducer->qbuf(src.first, src.second);
+        }
+    }
+
+    return OK;
+}
+
+void PSysProcessor::dispatchTask(CameraBufferPortMap &inBuf, CameraBufferPortMap &outBuf)
+{
+    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
+
+    long currentSequence = inBuf.begin()->second->getSequence();
+
+    {
+        ConditionLock lock(mBufferQueueLock);
+
+        ConfigMode previousMode = mCurConfigMode;
+        bool needSwitch = needSwitchPipe(currentSequence);
+
+        if (needSwitch) {
+            LOG1("Switch pipe for sequence:%ld, unprocessed buffer number:%zu",
+                  currentSequence, mSequenceInflight.size());
+
+            // Deactive the PSysDag which is no longer used.
+            mPSysDAGs[previousMode]->pause();
+
+            // Before switching, need to wait all buffers in current pipe being processed.
+            while (!mSequenceInflight.empty()) {
+                int ret = mFrameDoneSignal.waitRelative(lock, kWaitDuration * SLOWLY_MULTIPLIER);
+                if (!mThreadRunning) {
+                    LOG1("@%s: Processor is not active while waiting for frame done.", __func__);
+                    return;
+                }
+
+                if (ret == TIMED_OUT) {
+                    LOGE("Waiting for frame done event timeout");
+                    return;
+                }
+            }
+
+            // Activate the current used PSysDag.
+            mPSysDAGs[mCurConfigMode]->resume();
+        }
+        mSequenceInflight.push(currentSequence);
+    } // End of lock mBufferQueueLock
+
+    // Prepare the task input paramerters including input and output buffers, settings etc.
+    PSysTaskData taskParam;
+    taskParam.mTuningMode = mTuningMode;
+    taskParam.mInputBuffers = inBuf;
+    taskParam.mOutputBuffers = outBuf;
+
+    long settingSequence = getSettingSequence(outBuf);
+    // Handle per-frame settings if output buffer requires
+    if (settingSequence > -1 && mParameterGenerator) {
+        Parameters params;
+        if (mParameterGenerator->getParameters(currentSequence, &params) == OK) {
+            setParameters(params);
+        }
+    }
+    {
+        AutoRMutex rl(mIspSettingsLock);
+        mIspSettings.palOverride = nullptr;
+        taskParam.mIspSettings = mIspSettings;
+    }
+
+    if (!mThreadRunning) return;
+
+    mPSysDAGs[mCurConfigMode]->addTask(taskParam);
+}
+
+void PSysProcessor::registerListener(EventType eventType, EventListener* eventListener)
+{
+    // Only delegate stats event registration to deeper layer DAG and PipeExecutor
+    if ((eventType != EVENT_PSYS_STATS_BUF_READY) && (eventType != EVENT_PSYS_STATS_SIS_BUF_READY)) {
+        BufferQueue::registerListener(eventType, eventListener);
+        return;
+    }
+
+    for (auto const& realModeDAGPair: mPSysDAGs) {
+        realModeDAGPair.second->registerListener(eventType, eventListener);
+    }
+}
+
+void PSysProcessor::removeListener(EventType eventType, EventListener* eventListener)
+{
+    // Only delegate stats event unregistration to deeper layer DAG and PipeExecutor
+    if ((eventType != EVENT_PSYS_STATS_BUF_READY) && (eventType != EVENT_PSYS_STATS_SIS_BUF_READY)) {
+        BufferQueue::removeListener(eventType, eventListener);
+        return;
+    }
+
+    for (auto const& realModeDAGPair: mPSysDAGs) {
+        realModeDAGPair.second->removeListener(eventType, eventListener);
+    }
+}
+
+void PSysProcessor::onFrameDone(const PSysTaskData& result)
+{
+    PERF_CAMERA_ATRACE();
+    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
+
+    EventDataFrame eventDataFrame;
+    CLEAR(eventDataFrame);
+    eventDataFrame.sequence = -1;
+
+    long sequence = result.mInputBuffers.begin()->second->getSequence();
+
+    for (auto& dst : result.mOutputBuffers) {
+        Port port = dst.first;
+        shared_ptr<CameraBuffer> outBuf = dst.second;
+        // If the output buffer is nullptr, that means user doesn't request that buffer,
+        // so it doesn't need to be handled here.
+        if (!outBuf) {
+            continue;
+        }
+
+        if (CameraDump::isDumpTypeEnable(DUMP_PSYS_OUTPUT_BUFFER)) {
+            CameraDump::dumpImage(mCameraId, outBuf, M_PSYS, port);
+        }
+
+        if (!needSkipOutputFrame(sequence)) {
+            for (auto &it : mBufferConsumerList) {
+                it->onFrameAvailable(port, outBuf);
+            }
+            eventDataFrame.sequence = outBuf->getSequence();
+            eventDataFrame.timestamp.tv_sec = outBuf->getTimestamp().tv_sec;
+            eventDataFrame.timestamp.tv_usec = outBuf->getTimestamp().tv_usec;
+        } else {
+            LOG1("Frame %ld is being skipped.", sequence);
+        }
+    }
+
+    if (eventDataFrame.sequence >= 0) {
+        EventData frameData;
+        frameData.type = EVENT_PSYS_FRAME;
+        frameData.buffer = nullptr;
+        frameData.data.frame.sequence = eventDataFrame.sequence;
+        frameData.data.frame.timestamp.tv_sec = eventDataFrame.timestamp.tv_sec;
+        frameData.data.frame.timestamp.tv_usec = eventDataFrame.timestamp.tv_usec;
+        notifyListeners(frameData);
+        LOG2("%s, frame done for sequence: %ld", __func__, sequence);
+    }
+
+    long settingSequence = getSettingSequence(result.mOutputBuffers);
+    bool holdOnInput = needHoldOnInputFrame(settingSequence, sequence);
+    bool hasRawOutput = isBufferHoldForRawReprocess(sequence);
+
+    // Return buffer only if the buffer is not used in the future.
+    if (!holdOnInput && mBufferProducer && !hasRawOutput) {
+        for (const auto& src : result.mInputBuffers) {
+            mBufferProducer->qbuf(src.first, src.second);
+
+            if (src.second->getStreamType() == CAMERA_STREAM_INPUT) {
+                for (auto &it : mBufferConsumerList) {
+                    it->onFrameAvailable(src.first, src.second);
+                }
+            }
+        }
+    }
+
+    AutoMutex l(mBufferQueueLock);
+    long oldest = mSequenceInflight.front();
+    if (sequence != oldest) {
+        // The output buffer should always be FIFO.
+        LOGW("The sequence should be %ld, but it's %ld", oldest, sequence);
+    }
+
+    mSequenceInflight.pop();
+    if (mSequenceInflight.empty()) {
+        mFrameDoneSignal.signal();
+    }
+}
+
+void PSysProcessor::outputRawImage(shared_ptr<CameraBuffer> &srcBuf, shared_ptr<CameraBuffer> &dstBuf)
+{
+    if ((srcBuf == nullptr) || (dstBuf == nullptr)) {
+        return;
+    }
+
+    // Copy from source buffer
+    int srcBufferSize = srcBuf->getBufferSize();
+    int srcMemoryType = srcBuf->getMemory();
+    void* pSrcBuf = (srcMemoryType == V4L2_MEMORY_DMABUF)
+                    ? CameraBuffer::mapDmaBufferAddr(srcBuf->getFd(), srcBufferSize)
+                    : srcBuf->getBufferAddr();
+
+    int dstBufferSize = dstBuf->getBufferSize();
+    int dstMemoryType = dstBuf->getMemory();
+    void* pDstBuf = (dstMemoryType == V4L2_MEMORY_DMABUF)
+                    ? CameraBuffer::mapDmaBufferAddr(dstBuf->getFd(), dstBufferSize)
+                    : dstBuf->getBufferAddr();
+
+    MEMCPY_S(pDstBuf, dstBufferSize, pSrcBuf, srcBufferSize);
+
+    if (srcMemoryType == V4L2_MEMORY_DMABUF) {
+        CameraBuffer::unmapDmaBufferAddr(pSrcBuf, srcBufferSize);
+    }
+
+    if (dstMemoryType == V4L2_MEMORY_DMABUF) {
+        CameraBuffer::unmapDmaBufferAddr(pDstBuf, dstBufferSize);
+    }
+
+    // Send output buffer to its consumer
+    for (auto &it : mBufferConsumerList) {
+        it->onFrameAvailable(mRawPort, dstBuf);
+    }
+}
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/PSysProcessor.h b/camera/hal/intel/ipu6/src/core/PSysProcessor.h
new file mode 100644
index 000000000000..e2e787b7fbd7
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/PSysProcessor.h
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <queue>
+
+#include "BufferQueue.h"
+#include "iutils/RWLock.h"
+
+#include "IspSettings.h"
+#include "psysprocessor/PSysDAG.h"
+
+namespace icamera {
+
+class ParameterGenerator;
+class PSysDAG;
+
+typedef std::map<Port, std::shared_ptr<CameraBuffer>> CameraBufferPortMap;
+typedef std::map<ConfigMode, std::shared_ptr<PSysDAG>> PSysDAGConfigModeMap;
+
+/**
+  * PSysProcessor runs the Image Process Alogirhtm in the PSYS.
+  * It implements the BufferConsumer and BufferProducer Interface
+  */
+class PSysProcessor: public BufferQueue, public PSysDagCallback {
+
+public:
+    PSysProcessor(int cameraId, ParameterGenerator *pGenerator);
+    virtual ~PSysProcessor();
+    virtual int configure(const std::vector<ConfigMode>& configModes);
+    virtual int setParameters(const Parameters& param);
+    virtual int getParameters(Parameters& param);
+
+    virtual int registerUserOutputBufs(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
+
+    //Overwrite event source API to delegate related functions
+    void registerListener(EventType eventType, EventListener* eventListener);
+    void removeListener(EventType eventType, EventListener* eventListener);
+
+    virtual int start();
+    virtual void stop();
+
+    // Overwrite PSysDagCallback API, used for returning back buffers from PSysDAG.
+    void onFrameDone(const PSysTaskData& result);
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(PSysProcessor);
+
+private:
+    int processNewFrame();
+    std::shared_ptr<CameraBuffer> allocStatsBuffer(int index);
+
+    status_t prepareTask(CameraBufferPortMap *srcBuffers, CameraBufferPortMap *dstBuffers);
+    void dispatchTask(CameraBufferPortMap &inBuf, CameraBufferPortMap &outBuf);
+
+    void handleEvent(EventData eventData);
+
+    long getSettingSequence(const CameraBufferPortMap &outBuf);
+    bool needSkipOutputFrame(long sequence);
+    bool needExecutePipe(long settingSequence, long inputSequence);
+    bool needHoldOnInputFrame(long settingSequence, long inputSequence);
+    bool needSwitchPipe(long sequence);
+
+    void outputRawImage(std::shared_ptr<CameraBuffer> &srcBuf,
+                        std::shared_ptr<CameraBuffer> &dstBuf);
+
+    void handleRawReprocessing(CameraBufferPortMap *srcBuffers,
+                               CameraBufferPortMap *dstBuffers, bool *hasYuv, bool *hasRawOutput);
+    bool isBufferHoldForRawReprocess(long sequence);
+
+private:
+    int mCameraId;
+    static const nsecs_t kWaitDuration = 1000000000; //1000ms
+    ParameterGenerator *mParameterGenerator;
+
+    IspSettings mIspSettings;
+    RWLock mIspSettingsLock;
+
+    //Since the isp settings may be re-used in all modes, so the buffer size of
+    //isp settings should be equal to frame buffer size.
+    static const int IA_PAL_CONTROL_BUFFER_SIZE = 10;
+
+    Condition mFrameDoneSignal;
+    std::queue<long> mSequenceInflight; // Save the sequences which are being processed.
+
+    std::vector<ConfigMode> mConfigModes;
+    PSysDAGConfigModeMap mPSysDAGs;
+    // Active config mode and tuning mode
+    ConfigMode mCurConfigMode;
+    TuningMode mTuningMode;
+
+    std::queue<EventDataMeta> mMetaQueue;
+    //Guard for the metadata queue
+    Mutex  mMetaQueueLock;
+    Condition mMetaAvailableSignal;
+
+    Port mRawPort;
+
+    // variables for sof alignment
+    timeval mSofTimestamp;
+    Mutex mSofLock;
+    Condition mSofCondition;
+
+    // variables for opaque raw
+    Port mOpaqueRawPort;
+    std::mutex mRawBufferMapLock;
+    std::map<long, CameraBufferPortMap> mRawBufferMap;
+
+    enum {
+        PIPELINE_UNCREATED = 0,
+        PIPELINE_CREATED
+    } mStatus;
+}; // End of class PSysProcessor
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/ProcessorManager.cpp b/camera/hal/intel/ipu6/src/core/ProcessorManager.cpp
new file mode 100644
index 000000000000..ccb204dbc8b9
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/ProcessorManager.cpp
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "ProcessorManager"
+
+#include "ProcessorManager.h"
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+
+#include "SwImageProcessor.h"
+#include "PSysProcessor.h"
+
+namespace icamera {
+
+ProcessorManager::ProcessorManager(int cameraId) :
+        mCameraId(cameraId),
+        mPsysUsage(PSYS_NOT_USED)
+{
+    LOG1("@%s, cameraId:%d", __func__, mCameraId);
+}
+
+ProcessorManager::~ProcessorManager()
+{
+    LOG1("@%s, cameraId:%d", __func__, mCameraId);
+
+    deleteProcessors();
+}
+
+std::vector<BufferQueue*> ProcessorManager::createProcessors(int inputFmt,
+        const std::map<Port, stream_t>& producerConfigs,
+        const std::map<int, Port>& streamIdToPortMap,
+        stream_config_t *streamList, const Parameters& param, ParameterGenerator* paramGenerator)
+{
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+
+    ProcessorConfig processorItem;
+    processorItem.mInputConfigs = producerConfigs;
+    for (const auto& item : streamIdToPortMap) {
+        if (streamList->streams[item.first].streamType == CAMERA_STREAM_INPUT) continue;
+        processorItem.mOutputConfigs[item.second] = streamList->streams[item.first];
+    }
+
+    // Check if PSysProcessor can be used.
+    mPsysUsage = PSYS_NORMAL;
+    for (int i = 0; i < streamList->num_streams; i++) {
+        if (streamList->streams[i].streamType == CAMERA_STREAM_INPUT ||
+            streamList->streams[i].usage == CAMERA_STREAM_OPAQUE_RAW) continue;
+
+        if (!PlatformData::usePsys(mCameraId, streamList->streams[i].format)) {
+            mPsysUsage = PSYS_NOT_USED;
+            break;
+        }
+    }
+
+    if (mPsysUsage == PSYS_NORMAL) {
+        LOG1("Using normal Psys to do image processing.");
+        processorItem.mProcessor = new PSysProcessor(mCameraId, paramGenerator);
+        mProcessors.push_back(processorItem);
+    }
+
+    if (mPsysUsage == PSYS_NOT_USED) {
+        LOG1("Using software to do color conversion.");
+        processorItem.mProcessor = new SwImageProcessor(mCameraId);
+        mProcessors.push_back(processorItem);
+    }
+
+    std::vector<BufferQueue*> processors;
+    for (auto& p : mProcessors) {
+        processors.push_back(p.mProcessor);
+    }
+
+    return processors;
+}
+
+int ProcessorManager::deleteProcessors()
+{
+    for (auto& item : mProcessors) {
+        delete item.mProcessor;
+    }
+    mProcessors.clear();
+
+    mPsysUsage = PSYS_NOT_USED;
+
+    return OK;
+}
+
+/**
+ * Configure processor with input and output streams
+ */
+int ProcessorManager::configureProcessors(const std::vector<ConfigMode>& configModes,
+                                          BufferProducer* producer,
+                                          const Parameters& param)
+{
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+
+    BufferProducer* preProcess =  nullptr;
+    for (auto& item : mProcessors) {
+        BufferQueue* processor = item.mProcessor;
+        processor->setFrameInfo(item.mInputConfigs, item.mOutputConfigs);
+        processor->setParameters(param);
+        int ret = processor->configure(configModes);
+        CheckError(ret < 0, ret, "Configure processor failed with:%d", ret);
+
+        processor->setBufferProducer(preProcess ? preProcess : producer);
+        preProcess = processor;
+    }
+
+    return OK;
+}
+
+} // end of namespace icamera
+
diff --git a/camera/hal/intel/ipu6/src/core/ProcessorManager.h b/camera/hal/intel/ipu6/src/core/ProcessorManager.h
new file mode 100644
index 000000000000..d11cb14877a4
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/ProcessorManager.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "BufferQueue.h"
+
+namespace icamera {
+
+class ParameterGenerator;
+
+/**
+ * \class ProcessorManager
+ *
+ * \brief ProcessorManager helps to create and maintain the post processors.
+ */
+class ProcessorManager {
+public:
+    ProcessorManager(int cameraId);
+    ~ProcessorManager();
+
+    std::vector<BufferQueue*> createProcessors(int inputFmt,
+                                               const std::map<Port, stream_t>& producerConfigs,
+                                               const std::map<int, Port>& streamIdToPortMap,
+                                               stream_config_t *streamList, const Parameters& param,
+                                               ParameterGenerator* paramGenerator);
+    int configureProcessors(const std::vector<ConfigMode>& configModes, BufferProducer* producer,
+                            const Parameters& param);
+    int deleteProcessors();
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(ProcessorManager);
+private:
+    int mCameraId;
+
+    enum PSysUsage {
+        PSYS_NOT_USED = 0,
+        PSYS_NORMAL,
+        PSYS_WEAVING,
+        PSYS_SCALE,
+        PSYS_CSC,
+        PSYS_SCALE_CSC,
+        PSYS_WEAVING_SCALE,
+        PSYS_WEAVING_SCALE_CSC,
+        PSYS_FISHEYE,
+        PSYS_MONO_DS,
+    } mPsysUsage;
+
+    struct ProcessorConfig {
+        BufferQueue* mProcessor;
+        std::map<Port, stream_t> mInputConfigs;
+        std::map<Port, stream_t> mOutputConfigs;
+    };
+
+    std::vector<ProcessorConfig> mProcessors;
+};
+
+} // end of namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/RequestThread.cpp b/camera/hal/intel/ipu6/src/core/RequestThread.cpp
new file mode 100644
index 000000000000..b1ee355c67e6
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/RequestThread.cpp
@@ -0,0 +1,537 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "RequestThread"
+
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+
+#include "RequestThread.h"
+
+using std::vector;
+using std::shared_ptr;
+
+namespace icamera {
+
+RequestThread::RequestThread(int cameraId, AiqUnitBase *a3AControl, ParameterGenerator* aParamGen) :
+    mCameraId(cameraId),
+    m3AControl(a3AControl),
+    mParamGenerator(aParamGen),
+    mPerframeControlSupport(false),
+    mGet3AStatWithFakeRequest(false),
+    mRequestsInProcessing(0),
+    mFirstRequest(true),
+    mRequestConfigMode(CAMERA_STREAM_CONFIGURATION_MODE_END),
+    mUserConfigMode(CAMERA_STREAM_CONFIGURATION_MODE_END),
+    mNeedReconfigPipe(false),
+    mReconfigPipeScore(0),
+    mActive(false),
+    mLastRequestId(-1),
+    mLastPredictSeq(-1),
+    mBlockRequest(true)
+{
+    CLEAR(mStreamConfig);
+    CLEAR(mConfiguredStreams);
+    CLEAR(mFakeReqBuf);
+
+    mStreamConfig.operation_mode = CAMERA_STREAM_CONFIGURATION_MODE_END;
+    mPerframeControlSupport = PlatformData::isFeatureSupported(mCameraId, PER_FRAME_CONTROL);
+}
+
+RequestThread::~RequestThread()
+{
+    while (!mReqParamsPool.empty()) {
+        mReqParamsPool.pop();
+    }
+}
+
+void RequestThread::requestExit()
+{
+    clearRequests();
+
+    Thread::requestExit();
+    AutoMutex l(mPendingReqLock);
+    mRequestSignal.signal();
+}
+
+void RequestThread::clearRequests()
+{
+    LOG1("%s", __func__);
+
+    mActive = false;
+    for (int streamId = 0; streamId < MAX_STREAM_NUMBER; streamId++) {
+        FrameQueue& frameQueue = mOutputFrames[streamId];
+        AutoMutex lock(frameQueue.mFrameMutex);
+        while (!frameQueue.mFrameQueue.empty()) {
+            frameQueue.mFrameQueue.pop();
+        }
+        frameQueue.mFrameAvailableSignal.broadcast();
+    }
+
+    AutoMutex l(mPendingReqLock);
+    mRequestsInProcessing = 0;
+    while (!mPendingRequests.empty()) {
+        mPendingRequests.pop_back();
+    }
+
+    mLastRequestId = -1;
+    mLastPredictSeq = -1;
+    mFirstRequest = true;
+    mBlockRequest = true;
+}
+
+void RequestThread::setConfigureModeByParam(const Parameters& param)
+{
+    camera_scene_mode_t sceneMode = SCENE_MODE_MAX;
+    if (param.getSceneMode(sceneMode) != OK) {
+        return;
+    }
+
+    ConfigMode configMode = CameraUtils::getConfigModeBySceneMode(sceneMode);
+    LOG2("@%s, sceneMode %d, configMode %d", __func__, sceneMode, configMode);
+
+    if (configMode == CAMERA_STREAM_CONFIGURATION_MODE_END) {
+        LOG2("%s: no valid config mode, skip setting", __func__);
+        return;
+    }
+
+    /* Reset internal mode related settings if requested mode is same as
+     * the mode currently running for better stability.
+     */
+    if (mStreamConfig.operation_mode == configMode) {
+        LOG2("%s: config mode %d keep unchanged.", __func__, configMode);
+        mNeedReconfigPipe = false;
+        mReconfigPipeScore = 0;
+        mRequestConfigMode = configMode;
+        return;
+    }
+
+    if (mRequestConfigMode != configMode) {
+        if (mRequestConfigMode != CAMERA_STREAM_CONFIGURATION_MODE_END) {
+            mNeedReconfigPipe = true;
+            mReconfigPipeScore = 0;
+            LOG2("%s: request configure mode changed, reset score %d", __func__, mReconfigPipeScore);
+        }
+        LOG2("%s: mRequestConfigMode updated from %d to %d", __func__, mRequestConfigMode, configMode);
+        mRequestConfigMode = configMode;
+    } else if (mReconfigPipeScore < PlatformData::getPipeSwitchDelayFrame(mCameraId)) {
+        mReconfigPipeScore ++;
+        LOG2("%s: request configure mode unchanged, current score %d", __func__, mReconfigPipeScore);
+    }
+}
+
+int RequestThread::configure(const stream_config_t *streamList)
+{
+    mGet3AStatWithFakeRequest = mPerframeControlSupport ? PlatformData::isPsysContinueStats(mCameraId) : false;
+    CLEAR(mFakeReqBuf);
+    bool hasVideoStream = false;
+
+    mStreamConfig.num_streams = streamList->num_streams;
+    mStreamConfig.operation_mode = streamList->operation_mode;
+    mUserConfigMode = (ConfigMode)streamList->operation_mode;
+    int previewStreamIndex = -1;
+    for (int i = 0; i < streamList->num_streams; i++) {
+        mConfiguredStreams[i] = streamList->streams[i];
+        if (previewStreamIndex < 0 && mConfiguredStreams[i].usage == CAMERA_STREAM_PREVIEW) {
+            previewStreamIndex = i;
+        }
+        if (mConfiguredStreams[i].usage == CAMERA_STREAM_PREVIEW ||
+            mConfiguredStreams[i].usage == CAMERA_STREAM_VIDEO_CAPTURE) {
+            hasVideoStream = true;
+        }
+    }
+
+    LOG1("%s: user specified Configmode: %d, hasVideoStream %d", __func__, mUserConfigMode, hasVideoStream);
+    if (mGet3AStatWithFakeRequest) {
+        if (previewStreamIndex < 0) {
+            LOGW("Can't get 3a stats event due to no preview stream");
+            mGet3AStatWithFakeRequest = false;
+        } else {
+            stream_t &stream = mConfiguredStreams[previewStreamIndex];
+            LOG1("%s: create fake request with stream index %d", __func__, previewStreamIndex);
+            mFakeBuffer = CameraBuffer::create(mCameraId, BUFFER_USAGE_PSYS_INTERNAL, V4L2_MEMORY_USERPTR,
+                                               stream.size, 0, stream.format,
+                                               stream.width, stream.height);
+
+            mFakeReqBuf.s = stream;
+            mFakeReqBuf.s.memType = V4L2_MEMORY_USERPTR;
+            mFakeReqBuf.addr = mFakeBuffer->getUserBuffer()->addr;
+        }
+    }
+    mStreamConfig.streams = mConfiguredStreams;
+
+    // Use concrete mode in RequestThread
+    if ((ConfigMode)mStreamConfig.operation_mode == CAMERA_STREAM_CONFIGURATION_MODE_AUTO) {
+        vector <ConfigMode> configModes;
+        int ret = PlatformData::getConfigModesByOperationMode(mCameraId, mStreamConfig.operation_mode, configModes);
+        CheckError((ret != OK || configModes.empty()), ret, "%s, get real ConfigMode failed %d", __func__, ret);
+        mRequestConfigMode = configModes[0];
+        LOG2("%s: use concrete mode %d as default initial mode for auto op mode", __func__, mRequestConfigMode);
+        mStreamConfig.operation_mode = mRequestConfigMode;
+    }
+
+    // Don't block request handling if no 3A stats (from video pipe)
+    mBlockRequest = PlatformData::isEnableAIQ(mCameraId) && hasVideoStream;
+
+    LOG2("%s: mRequestConfigMode initial value: %d", __func__, mRequestConfigMode);
+    return OK;
+}
+
+bool RequestThread::blockRequest() {
+    /**
+     * Block request processing if:
+     * 1. mBlockRequest is true (except the 1st request), or
+     * 2. Too many requests in flight.
+     */
+    return ((mBlockRequest && (mLastRequestId >= 0)) ||
+            mRequestsInProcessing >= PlatformData::getMaxRequestsInflight(mCameraId));
+}
+
+int RequestThread::processRequest(int bufferNum, camera_buffer_t **ubuffer, const Parameters* params)
+{
+    AutoMutex l(mPendingReqLock);
+    CameraRequest request;
+    request.mBufferNum = bufferNum;
+    bool hasVideoBuffer = false;
+
+    for (int id = 0; id < bufferNum; id++) {
+        request.mBuffer[id] = ubuffer[id];
+        if (ubuffer[id]->s.usage == CAMERA_STREAM_PREVIEW ||
+            ubuffer[id]->s.usage == CAMERA_STREAM_VIDEO_CAPTURE) {
+            hasVideoBuffer = true;
+        }
+    }
+
+    if (mFirstRequest && !hasVideoBuffer) {
+        LOG2("there is no video buffer in first request, so don't block request processing.");
+        mBlockRequest = false;
+    }
+
+    request.mParams = copyRequestParams(params);
+
+    // Raw reprocessing case, put it on the top.
+    if (ubuffer[0]->sequence >= 0 && ubuffer[0]->timestamp > 0) {
+        mPendingRequests.push_front(request);
+    } else {
+        mPendingRequests.push_back(request);
+    }
+
+    if (!mActive) {
+        mActive = true;
+    }
+
+    mRequestSignal.signal();
+    return OK;
+}
+
+shared_ptr<Parameters>
+RequestThread::copyRequestParams(const Parameters *srcParams)
+{
+    if (srcParams == nullptr)
+        return nullptr;
+
+    if (mReqParamsPool.empty()) {
+        shared_ptr<Parameters> sParams = std::make_shared<Parameters>();
+        CheckError(!sParams, nullptr, "%s: no memory!", __func__);
+        mReqParamsPool.push(sParams);
+    }
+
+    shared_ptr<Parameters> sParams = mReqParamsPool.front();
+    mReqParamsPool.pop();
+    *sParams = *srcParams;
+    return sParams;
+}
+
+int RequestThread::waitFrame(int streamId, camera_buffer_t **ubuffer)
+{
+    FrameQueue& frameQueue = mOutputFrames[streamId];
+    ConditionLock lock(frameQueue.mFrameMutex);
+
+    while (frameQueue.mFrameQueue.empty()) {
+        int ret = frameQueue.mFrameAvailableSignal.waitRelative(
+                      lock,
+                      kWaitFrameDuration * SLOWLY_MULTIPLIER);
+        if (!mActive) return INVALID_OPERATION;
+
+        if (ret == TIMED_OUT) {
+            LOGW("@%s, mCameraId:%d, time out happens, wait recovery", __func__, mCameraId);
+            return ret;
+        }
+    }
+
+    shared_ptr<CameraBuffer> camBuffer = frameQueue.mFrameQueue.front();
+    frameQueue.mFrameQueue.pop();
+    *ubuffer = camBuffer->getUserBuffer();
+
+    LOG2("@%s, frame returned. camera id:%d, stream id:%d", __func__, mCameraId, streamId);
+
+    return OK;
+}
+
+int RequestThread::wait1stRequestDone()
+{
+    LOG1("%s", __func__);
+    int ret = OK;
+    ConditionLock lock(mFirstRequestLock);
+    if (mFirstRequest) {
+        LOG1("%s, waiting the first request done", __func__);
+        ret = mFirstRequestSignal.waitRelative(
+                  lock,
+                  kWaitFirstRequestDoneDuration * SLOWLY_MULTIPLIER);
+        if (ret == TIMED_OUT)
+            LOGE("@%s: Wait 1st request timed out", __func__);
+    }
+
+    return ret;
+}
+
+void RequestThread::handleEvent(EventData eventData)
+{
+    if (!mActive) return;
+
+    /* Notes:
+      * There should be only one of EVENT_ISYS_FRAME
+      * and EVENT_PSYS_FRAME registered.
+      * There should be only one of EVENT_xx_STATS_BUF_READY
+      * registered.
+      */
+    switch (eventData.type) {
+        case EVENT_ISYS_FRAME:
+        case EVENT_PSYS_FRAME:
+            {
+                AutoMutex l(mPendingReqLock);
+                if (mRequestsInProcessing > 0) {
+                    mRequestsInProcessing--;
+                }
+                // Continue process(that maight be blocked due to many requests in flight).
+                if (!mPendingRequests.empty()) {
+                    mRequestSignal.signal();
+                }
+            }
+            break;
+        case EVENT_PSYS_STATS_BUF_READY:
+            {
+                AutoMutex l(mPendingReqLock);
+                if (mBlockRequest) {
+                    mBlockRequest = false;
+                    mRequestSignal.signal();
+                }
+            }
+            break;
+        case EVENT_FRAME_AVAILABLE:
+            {
+                if (eventData.buffer->getUserBuffer() != &mFakeReqBuf) {
+                    int streamId = eventData.data.frameDone.streamId;
+                    FrameQueue& frameQueue = mOutputFrames[streamId];
+
+                    AutoMutex lock(frameQueue.mFrameMutex);
+                    bool needSignal = frameQueue.mFrameQueue.empty();
+                    frameQueue.mFrameQueue.push(eventData.buffer);
+                    if (needSignal) {
+                        frameQueue.mFrameAvailableSignal.signal();
+                    }
+                } else {
+                    LOG2("%s: fake request return %ld", __func__, eventData.buffer->getSequence());
+                }
+
+                AutoMutex l(mPendingReqLock);
+                // Insert fake request if no any request in the HAL to keep 3A running
+                if (mGet3AStatWithFakeRequest &&
+                    eventData.buffer->getSequence() >= mLastPredictSeq &&
+                    mPendingRequests.empty()) {
+                    LOGW("No request, insert fake req after req %d to keep 3A stats update",
+                         mLastRequestId);
+                    CameraRequest fakeRequest;
+                    fakeRequest.mBufferNum = 1;
+                    fakeRequest.mBuffer[0] = &mFakeReqBuf;
+                    mFakeReqBuf.sequence = -1;
+                    mPendingRequests.push_back(fakeRequest);
+                    mRequestSignal.signal();
+                }
+            }
+            break;
+        default:
+            {
+                LOGW("Unknown event type %d", eventData.type);
+            }
+            break;
+    }
+}
+
+/**
+ * Get the next request for processing.
+ * Return false if no pending requests or it is not ready for reconfiguration.
+ */
+bool RequestThread::fetchNextRequest(CameraRequest& request)
+{
+    ConditionLock lock(mPendingReqLock);
+    if (isReconfigurationNeeded() && !isReadyForReconfigure()) {
+        return false;
+    }
+
+    if (mPendingRequests.empty()) {
+        return false;
+    }
+
+    request = mPendingRequests.front();
+    mRequestsInProcessing++;
+    mPendingRequests.pop_front();
+    LOG2("@%s, mRequestsInProcessing %d", __func__, mRequestsInProcessing);
+    return true;
+}
+
+/**
+ * Check if ConfigMode is changed or not.
+ * If new ConfigMode is different with previous configured ConfigMode,
+ * return true.
+ */
+bool RequestThread::isReconfigurationNeeded()
+{
+    bool needReconfig = (mUserConfigMode == CAMERA_STREAM_CONFIGURATION_MODE_AUTO &&
+                         PlatformData::getAutoSwitchType(mCameraId) == AUTO_SWITCH_FULL &&
+                         mNeedReconfigPipe &&
+                         (mReconfigPipeScore >= PlatformData::getPipeSwitchDelayFrame(mCameraId)));
+    LOG2("%s: need reconfigure %d, score %d, decision %d",
+         __func__, mNeedReconfigPipe, mReconfigPipeScore, needReconfig);
+    return needReconfig;
+}
+
+/**
+ * If reconfiguration is needed, there are 2 extra conditions for reconfiguration:
+ * 1, there is no buffer in processing; 2, there is buffer in mPendingRequests.
+ * Return true if reconfiguration is ready.
+ */
+bool RequestThread::isReadyForReconfigure()
+{
+    return (!mPendingRequests.empty() && mRequestsInProcessing == 0);
+}
+
+bool RequestThread::threadLoop()
+{
+    bool restart = false;
+    {
+         ConditionLock lock(mPendingReqLock);
+
+         bool waitProcessing = blockRequest() || mPendingRequests.empty();
+         if (waitProcessing) {
+            int ret = mRequestSignal.waitRelative(lock, kWaitDuration * SLOWLY_MULTIPLIER);
+            waitProcessing = blockRequest() || mPendingRequests.empty();
+            if (ret == TIMED_OUT || waitProcessing) {
+                LOGW("%s: wait event time out", __func__);
+                return true;
+            }
+        }
+
+        restart = isReconfigurationNeeded();
+    }
+
+    if (!mActive) {
+        return false;
+    }
+
+    CameraRequest request;
+    if (fetchNextRequest(request)) {
+        // Update for reconfiguration
+        if (request.mParams.get()) {
+            setConfigureModeByParam(*(request.mParams.get()));
+        }
+        // Re-check
+        if (restart && isReconfigurationNeeded()) {
+            handleReconfig();
+        }
+
+        handleRequest(request);
+    }
+    return true;
+}
+
+void RequestThread::handleReconfig()
+{
+    LOG1("%s, ConfigMode change from %x to %x", __func__,
+            mStreamConfig.operation_mode, mRequestConfigMode);
+    mStreamConfig.operation_mode = mRequestConfigMode;
+    EventConfigData configData;
+    configData.streamList = &mStreamConfig;
+    EventData eventData;
+    eventData.type = EVENT_DEVICE_RECONFIGURE;
+    eventData.data.config = configData;
+    notifyListeners(eventData);
+    mNeedReconfigPipe = false;
+    mReconfigPipeScore = 0;
+    return;
+}
+
+void RequestThread::handleRequest(CameraRequest& request)
+{
+    long predictSequence = mLastPredictSeq + 1;
+    if (mLastPredictSeq < 0) {
+        predictSequence = PlatformData::getInitialSkipFrame(mCameraId);
+    }
+
+    // Raw reprocessing case, don't run 3A.
+    if (request.mBuffer[0]->sequence >= 0 && request.mBuffer[0]->timestamp > 0) {
+        predictSequence = request.mBuffer[0]->sequence;
+        if (request.mParams.get()) {
+            mParamGenerator->updateParameters(predictSequence, request.mParams.get());
+        }
+    } else {
+        if (request.mParams.get()) {
+            m3AControl->setParameters(*request.mParams);
+        }
+        m3AControl->run3A(mPerframeControlSupport? &predictSequence : nullptr);
+
+        // Check the final prediction value
+        if (predictSequence <= mLastPredictSeq) {
+            LOGW("predict %ld error! should > %ld", predictSequence, mLastPredictSeq);
+            predictSequence = mLastPredictSeq + 1;
+        }
+
+        mLastPredictSeq = predictSequence;
+        mLastRequestId++;
+        mParamGenerator->saveParameters(mLastPredictSeq, mLastRequestId, request.mParams.get());
+    }
+    LOG2("%s: Process request: %ld:%ld, out buffer %d, param? %s", __func__,
+          mLastRequestId, predictSequence, request.mBufferNum,
+          request.mParams.get() ? "true" : "false");
+
+    // Sent event to handle request buffers
+    EventRequestData requestData;
+    requestData.bufferNum = request.mBufferNum;
+    requestData.buffer = request.mBuffer;
+    requestData.param = request.mParams.get();
+    requestData.settingSeq = predictSequence;
+    EventData eventData;
+    eventData.type = EVENT_PROCESS_REQUEST;
+    eventData.data.request = requestData;
+    notifyListeners(eventData);
+
+    // Recycle params ptr for re-using
+    if (request.mParams) {
+        AutoMutex l(mPendingReqLock);
+        mReqParamsPool.push(request.mParams);
+    }
+
+    {
+        AutoMutex l(mFirstRequestLock);
+        if (mFirstRequest) {
+            LOG1("%s: first request done", __func__);
+            mFirstRequest = false;
+            mFirstRequestSignal.signal();
+        }
+    }
+}
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/RequestThread.h b/camera/hal/intel/ipu6/src/core/RequestThread.h
new file mode 100644
index 000000000000..b4a867b78beb
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/RequestThread.h
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2016-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <deque>
+
+#include "iutils/Thread.h"
+#include "PlatformData.h"
+#include "Parameters.h"
+#include "AiqUnit.h"
+#include "Parameters.h"
+#include "ParameterGenerator.h"
+
+namespace icamera {
+
+/*
+ * The RequestThread is used to assist CameraDevice to handle request(qbuf/dqbuf).
+ */
+class RequestThread : public Thread, public EventSource, public EventListener {
+public:
+    RequestThread(int cameraId, AiqUnitBase *a3AControl, ParameterGenerator* aParamGen);
+    ~RequestThread();
+
+    bool threadLoop();
+    void requestExit();
+
+    void handleEvent(EventData eventData);
+
+    /**
+     * \Clear pending requests.
+     */
+    void clearRequests();
+
+    /**
+     * \Accept requests from user.
+     */
+    int processRequest(int bufferNum, camera_buffer_t **ubuffer, const Parameters * params);
+
+    int waitFrame(int streamId, camera_buffer_t **ubuffer);
+
+    /**
+     * \Block the caller until the first request is processed.
+     */
+    int wait1stRequestDone();
+
+    /**
+     * \brief configure the streams, devices and post processor.
+     *
+     * \param streamList: all the streams info
+     *
+     * \return OK if succeed and BAD_VALUE if failed
+     */
+    int configure(const stream_config_t *streamList);
+
+    /**
+     * \brief get stream config in request thread.
+     */
+    stream_config_t getStreamConfig() { return mStreamConfig; };
+
+    /**
+     * \brief set request configure mode by parameters.
+     */
+    void setConfigureModeByParam(const Parameters& param);
+
+private:
+    int mCameraId;
+    AiqUnitBase *m3AControl;
+    ParameterGenerator *mParamGenerator;
+    bool mPerframeControlSupport;
+    bool mGet3AStatWithFakeRequest;
+    camera_buffer_t mFakeReqBuf;
+    std::shared_ptr<CameraBuffer> mFakeBuffer;
+
+    struct CameraRequest {
+        CameraRequest() : mBufferNum(0), mParams(nullptr) {
+            CLEAR(mBuffer);
+        }
+
+        int mBufferNum;
+        camera_buffer_t *mBuffer[MAX_STREAM_NUMBER];
+        std::shared_ptr<Parameters> mParams;
+    };
+
+    std::shared_ptr<Parameters> copyRequestParams(const Parameters *params);
+
+    /**
+     * \Fetch one request from pending request Q for processing.
+     */
+    bool fetchNextRequest(CameraRequest& request);
+    bool isReadyForReconfigure();
+    bool isReconfigurationNeeded();
+    std::shared_ptr<Parameters> acquireParam();
+
+    void handleReconfig();
+    void handleRequest(CameraRequest& request);
+    bool blockRequest();
+
+    static const int kMaxRequests = MAX_BUFFER_COUNT;
+    static const nsecs_t kWaitFrameDuration = 5000000000; // 5s
+    static const nsecs_t kWaitDuration = 2000000000; // 2s
+    static const nsecs_t kWaitFirstRequestDoneDuration = 1000000000; // 1s
+
+    //Guard for all the pending requests
+    Mutex mPendingReqLock;
+    Condition mRequestSignal;
+    std::deque <CameraRequest> mPendingRequests;
+    std::queue <std::shared_ptr<Parameters> > mReqParamsPool;
+    int mRequestsInProcessing;
+
+    // Guard for the first request.
+    Mutex mFirstRequestLock;
+    Condition mFirstRequestSignal;
+    bool mFirstRequest;
+
+    // Internal used for restart function
+    ConfigMode mRequestConfigMode; // the ConfigMode is gotten from parameters set from user or AE result
+    ConfigMode mUserConfigMode; // user specified ConfigMode during initial configure
+    // Whether pipe need to reconfigure
+    bool mNeedReconfigPipe;
+    // Score indicate the num of consecutive configure mode settings, to make switch stable.
+    unsigned int  mReconfigPipeScore;
+    stream_config_t mStreamConfig;
+    stream_t mConfiguredStreams[MAX_STREAM_NUMBER];
+
+    struct FrameQueue {
+        Mutex mFrameMutex;
+        Condition mFrameAvailableSignal;
+        CameraBufQ mFrameQueue;
+    };
+    FrameQueue mOutputFrames[MAX_STREAM_NUMBER];
+    bool mActive;
+
+    long mLastRequestId;
+    long mLastPredictSeq;
+    bool mBlockRequest;  // Process the 2nd or 3th request after the 1st 3A event
+                         // to avoid unstable AWB at the beginning of stream on
+};
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/SensorHwCtrl.cpp b/camera/hal/intel/ipu6/src/core/SensorHwCtrl.cpp
new file mode 100644
index 000000000000..7af50e24b747
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/SensorHwCtrl.cpp
@@ -0,0 +1,331 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "SensorHwCtrl"
+
+#include <limits.h>
+
+#include <linux/types.h>
+#include <linux/v4l2-controls.h>
+
+#include "iutils/CameraLog.h"
+
+#include "SensorHwCtrl.h"
+#include "V4l2DeviceFactory.h"
+#include "PlatformData.h"
+
+using std::vector;
+
+namespace icamera {
+
+SensorHwCtrl::SensorHwCtrl(int cameraId, V4L2Subdevice* pixelArraySubdev, V4L2Subdevice* sensorOutputSubdev):
+        mPixelArraySubdev(pixelArraySubdev),
+        mSensorOutputSubdev(sensorOutputSubdev),
+        mCameraId(cameraId),
+        mHorzBlank(0),
+        mVertBlank(0),
+        mCropWidth(0),
+        mCropHeight(0),
+        mCurFll(0),
+        mCalculatingFrameDuration(true)
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
+    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
+}
+
+SensorHwCtrl::~SensorHwCtrl()
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
+}
+
+SensorHwCtrl* SensorHwCtrl::createSensorCtrl(int cameraId)
+{
+    if (!PlatformData::isIsysEnabled(cameraId)) {
+        return new DummySensor(cameraId);
+    }
+
+    std::string subDevName;
+    SensorHwCtrl* sensorCtrl = nullptr;
+    int ret = PlatformData::getDevNameByType(cameraId, VIDEO_PIXEL_ARRAY, subDevName);
+    if (ret == OK) {
+        LOG1("%s ArraySubdev camera id:%d dev name:%s", __func__, cameraId, subDevName.c_str());
+        V4L2Subdevice* pixelArraySubdev = V4l2DeviceFactory::getSubDev(cameraId, subDevName);
+
+        V4L2Subdevice* pixelOutputSubdev = nullptr;
+        // Binner and Scaler subdev only exits in CrlModule driver
+        if (PlatformData::isUsingCrlModule(cameraId)) {
+            subDevName.clear();
+            ret = PlatformData::getDevNameByType(cameraId, VIDEO_PIXEL_SCALER, subDevName);
+            if (ret == OK) {
+                LOG1("%s ScalerSubdev camera id:%d dev name:%s", __func__, cameraId, subDevName.c_str());
+                pixelOutputSubdev = V4l2DeviceFactory::getSubDev(cameraId, subDevName);
+            } else {
+                subDevName.clear();
+                ret = PlatformData::getDevNameByType(cameraId, VIDEO_PIXEL_BINNER, subDevName);
+                if (ret == OK) {
+                    LOG1("%s BinnerSubdev camera id:%d dev name:%s", __func__, cameraId, subDevName.c_str());
+                    pixelOutputSubdev = V4l2DeviceFactory::getSubDev(cameraId, subDevName);
+                }
+            }
+        }
+
+        sensorCtrl = new SensorHwCtrl(cameraId, pixelArraySubdev, pixelOutputSubdev);
+    } else {
+        LOG1("%s create a dummy sensor ctrl for camera id:%d", __func__, cameraId);
+        sensorCtrl = new DummySensor(cameraId);
+    }
+    return sensorCtrl;
+}
+
+int SensorHwCtrl::getActivePixelArraySize(int &width, int &height, int &pixelCode)
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
+    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
+
+    int status = mPixelArraySubdev->GetPadFormat(0, &width, &height, &pixelCode);
+    mCropWidth = width;
+    mCropHeight = height;
+
+    LOG2("@%s, width:%d, height:%d, status:%d", __func__, width, height, status);
+    return status;
+}
+
+int SensorHwCtrl::getPixelRate(int &pixelRate)
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
+    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
+
+    int ret = mPixelArraySubdev->GetControl(V4L2_CID_PIXEL_RATE, &pixelRate);
+
+    LOG2("@%s, pixelRate:%d, ret:%d", __func__, pixelRate, ret);
+
+    return ret;
+}
+
+int SensorHwCtrl::setTestPatternMode(int32_t testPatternMode)
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
+    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
+
+    LOG2("@%s, testPatternMode: %d", __func__, testPatternMode);
+    return mPixelArraySubdev->SetControl(V4L2_CID_TEST_PATTERN, testPatternMode);
+}
+
+int SensorHwCtrl::setExposure(const vector<int>& coarseExposures, const vector<int>& fineExposures)
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
+    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
+    CheckError((coarseExposures.empty() || fineExposures.empty()), BAD_VALUE, "No exposure data!");
+
+    LOG2("%s coarseExposure=%d fineExposure=%d", __func__, coarseExposures[0], fineExposures[0]);
+    LOG2("SENSORCTRLINFO: exposure_value=%d", coarseExposures[0]);
+    return mPixelArraySubdev->SetControl(V4L2_CID_EXPOSURE, coarseExposures[0]);
+}
+
+int SensorHwCtrl::setGains(const vector<int>& analogGains, const vector<int>& digitalGains)
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
+    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
+    CheckError((analogGains.empty() || digitalGains.empty()), BAD_VALUE, "No gain data!");
+
+	int ret = mPixelArraySubdev->SetControl(V4L2_CID_ANALOGUE_GAIN, analogGains[0]);
+	ret |= mPixelArraySubdev->SetControl(V4L2_CID_DIGITAL_GAIN, digitalGains[0]);
+    return ret;
+}
+
+int SensorHwCtrl::setLineLengthPixels(int llp)
+{
+    int status = OK;
+    LOG2("@%s, llp:%d", __func__, llp);
+
+    if (mCalculatingFrameDuration) {
+        int horzBlank = llp - mCropWidth;
+        if (mHorzBlank != horzBlank) {
+            status = mPixelArraySubdev->SetControl(V4L2_CID_HBLANK, horzBlank);
+        }
+    }
+
+    CheckError(status != OK, status, "failed to set llp.");
+
+    mHorzBlank = llp - mCropWidth;
+    return status;
+}
+
+int SensorHwCtrl::setFrameLengthLines(int fll)
+{
+    int status = OK;
+    LOG2("@%s, fll:%d", __func__, fll);
+
+    if (mCalculatingFrameDuration) {
+        int vertBlank = fll - mCropHeight;
+        if (mVertBlank != vertBlank) {
+            status = mPixelArraySubdev->SetControl(V4L2_CID_VBLANK, vertBlank);
+        }
+    }
+
+    mCurFll = fll;
+
+    CheckError(status != OK, status, "failed to set fll.");
+
+    mVertBlank = fll - mCropHeight;
+    return status;
+}
+
+int SensorHwCtrl::setFrameDuration(int llp, int fll)
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
+    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
+
+    int status = OK;
+    LOG2("@%s, llp:%d, fll:%d", __func__, llp, fll);
+
+    /* only set them to driver when llp or fll is not 0 */
+    if (llp) {
+        status = setLineLengthPixels(llp);
+    }
+
+    if (fll) {
+        status |= setFrameLengthLines(fll);
+    }
+
+    return status;
+}
+
+int SensorHwCtrl::getLineLengthPixels(int &llp)
+{
+    int status = OK;
+
+    if (mCalculatingFrameDuration) {
+        int horzBlank = 0;
+        status = mPixelArraySubdev->GetControl(V4L2_CID_HBLANK, &horzBlank);
+        if (status == OK) {
+            mHorzBlank = horzBlank;
+            llp = horzBlank + mCropWidth;
+        }
+    }
+
+    LOG2("@%s, llp:%d", __func__, llp);
+    CheckError(status != OK, status, "failed to get llp.");
+
+    return status;
+}
+
+int SensorHwCtrl::getFrameLengthLines(int &fll)
+{
+    int status = OK;
+
+    if (mCalculatingFrameDuration) {
+        int vertBlank = 0;
+        status = mPixelArraySubdev->GetControl(V4L2_CID_VBLANK, &vertBlank);
+        if (status == OK) {
+            mVertBlank = vertBlank;
+            fll = vertBlank + mCropHeight;
+        }
+    }
+
+    LOG2("@%s, fll:%d", __func__, fll);
+    CheckError(status != OK, status, "failed to get fll.");
+
+    return status;
+}
+
+int SensorHwCtrl::getFrameDuration(int &llp, int &fll)
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
+    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
+
+    int status = getLineLengthPixels(llp);
+
+    status |= getFrameLengthLines(fll);
+    LOG2("@%s, llp:%d, fll:%d", __func__, llp, fll);
+
+    return status;
+}
+
+int SensorHwCtrl::getVBlank(int &vblank)
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
+    vblank = mVertBlank;
+    LOG2("@%s, vblank:%d", __func__, vblank);
+
+    return OK;
+}
+
+/**
+ * get exposure range value from sensor driver
+ *
+ * \param[OUT] coarse_exposure: exposure min value
+ * \param[OUT] fine_exposure: exposure max value
+ * \param[OUT] exposure_step: step of exposure
+ * V4L2 does not support FINE_EXPOSURE setting
+ *
+ * \return OK if successfully.
+ */
+int SensorHwCtrl::getExposureRange(int &exposureMin, int &exposureMax, int &exposureStep)
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
+    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
+
+    v4l2_queryctrl exposure = {};
+    exposure.id = V4L2_CID_EXPOSURE;
+    int status = mPixelArraySubdev->QueryControl(&exposure);
+    CheckError(status != OK, status, "Couldn't get exposure Range status:%d", status);
+
+    exposureMin = exposure.minimum;
+    exposureMax = exposure.maximum;
+    exposureStep = exposure.step;
+    LOG2("@%s, exposureMin:%d, exposureMax:%d, exposureStep:%d",
+        __func__, exposureMin, exposureMax, exposureStep);
+
+    return status;
+}
+
+int SensorHwCtrl::setFrameRate(float fps)
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
+    CheckError(!mSensorOutputSubdev, NO_INIT, "sensor output sub device is not set");
+
+    LOG2("%s FPS is: %f", __func__, fps);
+
+    struct v4l2_queryctrl query;
+    CLEAR(query);
+    query.id = V4L2_CID_LINK_FREQ;
+    int status = mSensorOutputSubdev->QueryControl(&query);
+    CheckError(status != OK, status, "Couldn't get V4L2_CID_LINK_FREQ, status:%d", status);
+
+    LOG2("@%s, query V4L2_CID_LINK_FREQ:, default_value:%d, maximum:%d, minimum:%d, step:%d",
+        __func__, query.default_value, query.maximum, query.minimum, query.step);
+
+    int mode = 0;
+    if (query.maximum == query.minimum) {
+        mode = query.default_value;
+    } else {
+        /***********************************************************************************
+         * WA: This heavily depends on sensor driver implementation, need to find a graceful
+         * solution.
+         * imx185:
+         * When fps larger than 30, should switch to high speed mode, currently only
+         * 0, 1, 2 are available. 0 means 720p 30fps, 1 means 2M 30fps, and 2 means 2M 60fps.
+         * imx290:
+         * 0 and 1 available, for 30 and higher FPS.
+         ***********************************************************************************/
+        mode = (fps > 30) ? query.maximum : (query.maximum - 1);
+    }
+    LOG2("@%s, set V4L2_CID_LINK_FREQ to %d", __func__, mode);
+    return mSensorOutputSubdev->SetControl(V4L2_CID_LINK_FREQ, mode);
+}
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/SensorHwCtrl.h b/camera/hal/intel/ipu6/src/core/SensorHwCtrl.h
new file mode 100644
index 000000000000..c05f5329eff7
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/SensorHwCtrl.h
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <v4l2_device.h>
+
+#include <vector>
+
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+
+/**
+ * Base class for sensor control might be inherited by ones have different sensor driver
+ */
+class SensorHwCtrl {
+
+public:
+    static SensorHwCtrl* createSensorCtrl(int cameraId);
+    SensorHwCtrl(int cameraId, V4L2Subdevice* pixelArraySubdev, V4L2Subdevice* sensorOutputSubdev);
+    virtual ~SensorHwCtrl();
+
+    virtual int setTestPatternMode(int32_t testPatternMode);
+    virtual int getPixelRate(int &pixelRate);
+    virtual int setExposure(const std::vector<int>& coarseExposures,
+                            const std::vector<int>& fineExposures);
+    virtual int setGains(const std::vector<int>& analogGains, const std::vector<int>& digitalGains);
+    virtual int setFrameDuration(int llp, int fll);
+    virtual int getFrameDuration(int &llp, int &fll);
+    virtual int getVBlank(int &vblank);
+    virtual int getActivePixelArraySize(int &width, int &height, int &pixelCode);
+    virtual int getExposureRange(int &exposureMin, int &exposureMax, int &exposureStep);
+
+    virtual int setFrameRate(float fps);
+private:
+    int setLineLengthPixels(int llp);
+    int getLineLengthPixels(int &llp);
+    int setFrameLengthLines(int fll);
+    int getFrameLengthLines(int &fll);
+
+private:
+
+    V4L2Subdevice* mPixelArraySubdev;
+    V4L2Subdevice* mSensorOutputSubdev;
+    int mCameraId;
+    int mHorzBlank;
+    int mVertBlank;
+    int mCropWidth;
+    int mCropHeight;
+
+    // Current frame length lines
+    int mCurFll;
+
+    /**
+     * if mCalculatingFrameDuration is true, it means sensor can't set/get llp/fll directly,
+     * use HBlank/VBlank to calculate it.
+     */
+    bool mCalculatingFrameDuration;
+}; //class SensorHwCtrl
+
+/**
+ * Dummy sensor hardware ctrl interface for those sensors cannot be controlled.
+ */
+class DummySensor : public SensorHwCtrl {
+public:
+    DummySensor(int cameraId) : SensorHwCtrl(cameraId, nullptr, nullptr) {}
+    ~DummySensor() {}
+
+    int setTestPatternMode(int32_t testPatternMode) { return OK; }
+    int setDevice(V4L2Subdevice* pixelArraySubdev) { return OK; }
+    int getPixelRate(int &pixelRate) { return OK; }
+    int setExposure(const std::vector<int>& coarseExposures,
+                    const std::vector<int>& fineExposures) { return OK; }
+    int setGains(const std::vector<int>& analogGains,
+                 const std::vector<int>& digitalGains) { return OK; }
+    int setFrameDuration(int llp, int fll) { return OK; }
+    int getFrameDuration(int &llp, int &fll) { return OK; }
+    int getVBlank(int &vblank) { return OK; }
+    int getActivePixelArraySize(int &width, int &height, int &code) { return OK; }
+    int getExposureRange(int &exposureMin, int &exposureMax, int &exposureStep) { return OK; }
+    int setFrameRate(float fps) { return OK; }
+};
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/SofSource.cpp b/camera/hal/intel/ipu6/src/core/SofSource.cpp
new file mode 100644
index 000000000000..a371314fd9b1
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/SofSource.cpp
@@ -0,0 +1,226 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define LOG_TAG "SofSource"
+
+#include <poll.h>
+
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+#include "V4l2DeviceFactory.h"
+#include "PlatformData.h"
+
+#include "SofSource.h"
+
+namespace icamera {
+
+SofSource::SofSource(int cameraId) :
+    mPollThread(nullptr),
+    mCameraId(cameraId),
+    mIsysReceiverSubDev(nullptr),
+    mExitPending(false)
+{
+    LOG1("%s: SofSource is constructed", __func__);
+
+    mConfiguredDevices.clear();
+    mSofDisabled = !PlatformData::isEnableAIQ(mCameraId);
+
+    mSofDisabled = mSofDisabled || !PlatformData::isIsysEnabled(cameraId);
+}
+
+SofSource::~SofSource()
+{
+    LOG1("%s: SofSource is distructed.", __func__);
+}
+
+int SofSource::init()
+{
+    if (mSofDisabled) {
+        return OK;
+    }
+
+    mPollThread = new PollThread(this);
+
+    return OK;
+}
+
+int SofSource::deinit()
+{
+    if (mSofDisabled) {
+        return OK;
+    }
+
+    int status = deinitDev();
+    mPollThread->join();
+    delete mPollThread;
+    return status;
+}
+
+int SofSource::initDev()
+{
+    //Create and open receiver subdevice.
+    std::string subDeviceNodeName;
+
+    if (PlatformData::getDevNameByType(mCameraId, VIDEO_ISYS_RECEIVER, subDeviceNodeName) == OK) {
+        LOG1("%s: found ISYS receiver subdevice %s", __func__, subDeviceNodeName.c_str());
+    }
+
+    auto isysReceiverSubDev = V4l2DeviceFactory::getSubDev(mCameraId, subDeviceNodeName);
+    // if the sub device does not change, do nothing.
+    if (isysReceiverSubDev == mIsysReceiverSubDev) {
+        return OK;
+    }
+
+    deinitDev();
+
+    mIsysReceiverSubDev = isysReceiverSubDev;
+    mConfiguredDevices.push_back(mIsysReceiverSubDev);
+
+#ifdef CAL_BUILD
+    int status = mIsysReceiverSubDev->SubscribeEvent(V4L2_EVENT_FRAME_SYNC);
+    CheckError(status != OK, status, "%s: Failed to subscribe sync event 0", __func__);
+    LOG1("%s: Using SOF event id 0 for sync", __func__);
+#else
+    int id = 0;
+    int status = mIsysReceiverSubDev->SubscribeEvent(V4L2_EVENT_FRAME_SYNC, id);
+    CheckError(status != OK, status, "%s: Failed to subscribe sync event %d", __func__, id);
+    LOG1("%s: Using SOF event id %d for sync", __func__, id);
+#endif
+
+    return OK;
+}
+
+int SofSource::deinitDev()
+{
+    if (mIsysReceiverSubDev == nullptr) return OK;
+
+    int status = 0;
+#ifdef CAL_BUILD
+    status = mIsysReceiverSubDev->UnsubscribeEvent(V4L2_EVENT_FRAME_SYNC);
+    if (status == OK) {
+        LOG1("%s: Unsubscribe SOF event id 0 done", __func__);
+    } else {
+        LOGE("%s: Failed to unsubscribe SOF event 0, status: %d", __func__, status);
+    }
+#else
+    int id = 0;
+    status = mIsysReceiverSubDev->UnsubscribeEvent(V4L2_EVENT_FRAME_SYNC, id);
+    if (status == OK) {
+        LOG1("%s: Unsubscribe SOF event id %d done", __func__, id);
+    } else {
+        LOGE("%s: Failed to unsubscribe SOF event %d", __func__, id);
+    }
+#endif
+
+    mConfiguredDevices.clear();
+    return status;
+}
+
+int SofSource::configure()
+{
+    if (mSofDisabled) {
+        return OK;
+    }
+
+    return initDev();
+}
+
+int SofSource::start()
+{
+    LOG1("%s", __func__);
+    if (mSofDisabled) {
+        return OK;
+    }
+
+    int status = mPollThread->run("SofSource", PRIORITY_URGENT_AUDIO);
+    mExitPending = false;
+    return status;
+
+}
+
+int SofSource::stop()
+{
+    LOG1("%s", __func__);
+    if (mSofDisabled) {
+        return OK;
+    }
+
+    mExitPending = true;
+    int status = mPollThread->requestExitAndWait();
+    return status;
+
+}
+
+int SofSource::poll()
+{
+    int ret = 0;
+    const int pollTimeoutCount = 10;
+    const int pollTimeout = 1000;
+
+    vector<V4L2Subdevice*> activeDevices;
+
+    std::vector<V4L2Device*> pollDevs(mConfiguredDevices.begin(), mConfiguredDevices.end());
+    V4L2DevicePoller poller {pollDevs, -1};
+
+    vector<V4L2Device*> readyDevices;
+
+    LOG2("@%s", __func__);
+
+    int timeOutCount = pollTimeoutCount;
+
+    while (timeOutCount-- && ret == 0) {
+
+        ret = poller.Poll(pollTimeout, POLLPRI | POLLIN | POLLOUT | POLLERR, &readyDevices);
+
+        if (ret == 0 && mExitPending) {
+            //timed out
+            LOGD("@%s: Timedout or thread is not running, ret = %d", __func__, ret);
+            return BAD_VALUE;
+        }
+    }
+
+    //handle the poll error
+    if (ret < 0) {
+        if (mExitPending) {
+            //Exiting, no error
+            return 0;
+        }
+
+        LOGE("%s: Poll error", __func__);
+        return ret;
+    } else if (ret == 0) {
+        LOGD("@%s, Sof poll timeout.", __func__);
+        return 0;
+    }
+
+    struct v4l2_event event;
+    CLEAR(event);
+    mIsysReceiverSubDev->DequeueEvent(&event);
+
+    EventDataSync syncData;
+    syncData.sequence = event.u.frame_sync.frame_sequence;
+    syncData.timestamp.tv_sec = event.timestamp.tv_sec;
+    syncData.timestamp.tv_usec = (event.timestamp.tv_nsec / 1000);
+    LOG2("%s:sof event sequence %ld, event.id %u", __func__, syncData.sequence, event.id);
+    EventData eventData;
+    eventData.type = EVENT_ISYS_SOF;
+    eventData.buffer = nullptr;
+    eventData.data.sync = syncData;
+    notifyListeners(eventData);
+
+    return 0;
+}
+
+}
diff --git a/camera/hal/intel/ipu6/src/core/SofSource.h b/camera/hal/intel/ipu6/src/core/SofSource.h
new file mode 100644
index 000000000000..bebf85cc4dae
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/SofSource.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <v4l2_device.h>
+
+#include <vector>
+
+#include "CameraEvent.h"
+
+#include "iutils/Thread.h"
+
+namespace icamera {
+
+//Event source for SOF event polled from subdevice.
+class SofSource : public EventSource {
+public:
+    SofSource(int cameraId);
+    ~SofSource();
+    int init();
+    int deinit();
+    int configure();
+    int start();
+    int stop();
+private:
+    int initDev();
+    int deinitDev();
+
+private:
+    class PollThread : public Thread {
+        SofSource *mSofSource;
+        public:
+            PollThread(SofSource *sofSource)
+                    : mSofSource(sofSource) { }
+
+            virtual bool threadLoop() {
+                int ret = mSofSource->poll();
+                return (ret == 0) ? true : false;
+            }
+    };
+    PollThread* mPollThread;
+    int mCameraId;
+    V4L2Subdevice* mIsysReceiverSubDev;
+    vector<V4L2Subdevice*> mConfiguredDevices;
+    bool mExitPending;
+    bool mSofDisabled;
+
+    int poll();
+};
+}
diff --git a/camera/hal/intel/ipu6/src/core/StreamSource.h b/camera/hal/intel/ipu6/src/core/StreamSource.h
new file mode 100644
index 000000000000..fc1a09c583f1
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/StreamSource.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "BufferQueue.h"
+#include "iutils/Errors.h"
+
+namespace icamera {
+
+/**
+ * \interface StreamSource
+ * It's an abstract interface for buffer producers, like CaptureUnit, FileSource
+ * or external source producer.
+ */
+class StreamSource : public BufferProducer {
+public:
+    StreamSource(int memType) : BufferProducer(memType) {}
+    virtual ~StreamSource() {}
+    /* Initialize stream source */
+    virtual int init() = 0;
+    /* Deinitialize stream source */
+    virtual void deinit() = 0;
+    /* Configure stream source */
+    virtual int configure(const std::map<Port, stream_t>& outputFrames,
+                          const std::vector<ConfigMode>& configModes,
+                          uint32_t bufferNum) = 0;
+    /* Start stream source */
+    virtual int start() = 0;
+    /* Stop stream source */
+    virtual int stop() = 0;
+    /* Remove all liateners */
+    virtual void removeAllFrameAvailableListener() = 0;
+};
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/SwImageProcessor.cpp b/camera/hal/intel/ipu6/src/core/SwImageProcessor.cpp
new file mode 100644
index 000000000000..9652d6558405
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/SwImageProcessor.cpp
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "SwImageProcessor"
+
+#include "iutils/Utils.h"
+#include "iutils/SwImageConverter.h"
+#include "iutils/CameraLog.h"
+#include "iutils/CameraDump.h"
+
+#include "PlatformData.h"
+#include "CameraBuffer.h"
+
+#include "SwImageProcessor.h"
+
+namespace icamera {
+
+SwImageProcessor::SwImageProcessor(int cameraId) : mCameraId(cameraId)
+{
+    LOGW("@%s: You are running the SwProcessor instead of PSYS pipeline. SwProcessor is for debug only", __func__);
+    LOG1("@%s camera id:%d", __func__, mCameraId);
+
+    mProcessThread = new ProcessThread(this);
+}
+
+SwImageProcessor::~SwImageProcessor()
+{
+    LOGW("@%s: You are running the SwProcessor instead of PSYS pipeline. SwProcessor is for debug only", __func__);
+
+    mProcessThread->join();
+    delete mProcessThread;
+}
+
+int SwImageProcessor::start()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("%s", __func__);
+    AutoMutex   l(mBufferQueueLock);
+
+    int memType = mOutputFrameInfo.begin()->second.memType;
+    CheckError(memType == V4L2_MEMORY_DMABUF, BAD_VALUE,
+          "@%s: DMABUF is not supported in SwProcessor as output", __func__);
+
+    int ret = allocProducerBuffers(mCameraId, MAX_BUFFER_COUNT);
+    CheckError(ret != OK, ret, "@%s: Allocate Buffer failed", __func__);
+    mThreadRunning = true;
+    mProcessThread->run("SwImageProcessor", PRIORITY_NORMAL);
+
+    return 0;
+}
+
+void SwImageProcessor::stop()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("%s", __func__);
+
+    mProcessThread->requestExit();
+    {
+        AutoMutex l(mBufferQueueLock);
+        mThreadRunning = false;
+        //Wakeup the thread to exit
+        mFrameAvailableSignal.signal();
+        mOutputAvailableSignal.signal();
+    }
+
+    mProcessThread->requestExitAndWait();
+
+    // Thread is not running. It is safe to clear the Queue
+    clearBufferQueues();
+}
+
+int SwImageProcessor::processNewFrame()
+{
+    PERF_CAMERA_ATRACE();
+    LOG2("%s", __func__);
+
+    int ret = OK;
+    std::map<Port, std::shared_ptr<CameraBuffer> > srcBuffers, dstBuffers;
+    std::shared_ptr<CameraBuffer> cInBuffer;
+    Port inputPort = INVALID_PORT;
+
+    { // Auto lock mBufferQueueLock scope
+    ConditionLock lock(mBufferQueueLock);
+    ret = waitFreeBuffersInQueue(lock, srcBuffers, dstBuffers);
+
+    if (!mThreadRunning) return -1;
+
+    CheckError((ret < 0), -1, "@%s: wake up from the wait abnomal such as stop", __func__);
+
+    inputPort = srcBuffers.begin()->first;
+    cInBuffer = srcBuffers[inputPort];
+
+    for (auto& output: mOutputQueue) {
+        output.second.pop();
+    }
+
+    for (auto& input: mInputQueue) {
+        input.second.pop();
+    }
+    } // End of auto lock mBufferQueueLock scope
+
+    CheckError(!cInBuffer, BAD_VALUE, "Invalid input buffer.");
+
+    for (auto& dst : dstBuffers) {
+        Port port = dst.first;
+        std::shared_ptr<CameraBuffer> cOutBuffer = dst.second;
+        // If the output buffer is nullptr, that means user doesn't request that buffer,
+        // so it doesn't need to be handled here.
+        if (!cOutBuffer) {
+            continue;
+        }
+
+        //No Lock for this function make sure buffers are not freed before the stop
+        ret = SwImageConverter::convertFormat(cInBuffer->getWidth(), cInBuffer->getHeight(),
+                (unsigned char *)cInBuffer->getBufferAddr(), cInBuffer->getBufferSize(), cInBuffer->getFormat(),
+                (unsigned char *)cOutBuffer->getBufferAddr(), cOutBuffer->getBufferSize(), cOutBuffer->getFormat());
+        CheckError((ret < 0), ret, "format convertion failed with %d", ret);
+
+        if (CameraDump::isDumpTypeEnable(DUMP_SW_IMG_PROC_OUTPUT)) {
+            CameraDump::dumpImage(mCameraId, cOutBuffer, M_SWIPOP);
+        }
+
+        //update the interlaced field, sequence, and timestamp  from the src buf to dst buf
+        cOutBuffer->updateV4l2Buffer(*cInBuffer->getV4L2Buffer().Get());
+
+        //Notify listener: No lock here: mBufferConsumerList will not updated in this state
+        for (auto &it : mBufferConsumerList) {
+            it->onFrameAvailable(port, cOutBuffer);
+        }
+    }
+
+    {
+        PERF_CAMERA_ATRACE_PARAM3("sof.sequence", cInBuffer->getSequence(), "csi2_port", cInBuffer->getCsi2Port(), \
+                                    "virtual_channel", cInBuffer->getVirtualChannel());
+    }
+
+    // Return the buffers to the producer
+    if (mBufferProducer) {
+        mBufferProducer->qbuf(inputPort, cInBuffer);
+    }
+
+    return OK;
+}
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/SwImageProcessor.h b/camera/hal/intel/ipu6/src/core/SwImageProcessor.h
new file mode 100644
index 000000000000..caf832608a73
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/SwImageProcessor.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2015-2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "BufferQueue.h"
+
+namespace icamera {
+
+/**
+  * SwImageProcessor runs the Image Process Alogirhtm in the CPU.
+  * It implements the BufferConsumer and BufferProducer Interface
+  * This class is for debug purpose when the PsysProcess is not ready.
+  */
+class SwImageProcessor: public BufferQueue {
+public:
+    SwImageProcessor(int cameraId);
+    virtual ~SwImageProcessor();
+
+    /**
+     * \brief Buffer producer Interface
+     */
+    virtual int     start();
+    virtual void    stop();
+
+private:
+    int processNewFrame();
+
+private:
+    int mCameraId;
+};
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/SyncManager.cpp b/camera/hal/intel/ipu6/src/core/SyncManager.cpp
new file mode 100644
index 000000000000..0ebf7d52b471
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/SyncManager.cpp
@@ -0,0 +1,198 @@
+/*
+ * Copyright (C) 2018-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "SyncManager"
+
+#include <sys/sysinfo.h>
+#include <math.h>
+#include "iutils/CameraLog.h"
+#include "SyncManager.h"
+
+namespace icamera {
+SyncManager *SyncManager::sInstance = nullptr;
+Mutex  SyncManager::sLock;
+
+#define SEC_TO_MS(sec) ((sec) * (1000))
+#define USEC_TO_MS(usec) ((usec) / (1000))
+
+const int max_vc_sync_count = 128;
+
+SyncManager* SyncManager::getInstance()
+{
+    AutoMutex lock(sLock);
+    if (sInstance == nullptr) {
+        sInstance = new SyncManager();
+    }
+
+    return sInstance;
+}
+
+void SyncManager::releaseInstance()
+{
+    AutoMutex lock(sLock);
+    LOG1("@%s", __func__);
+
+    if (sInstance) {
+        delete sInstance;
+        sInstance = nullptr;
+    }
+}
+
+SyncManager::SyncManager()
+{
+    LOG1("@%s", __func__);
+    AutoMutex lock(mLock);
+    for (int i = 0; i < MAX_CAMERA_NUMBER; i++) {
+       for (int j = 0; j < MAX_BUFFER_COUNT; j++) {
+           mCameraBufInfo[i][j].sequence = -1;
+           CLEAR(mCameraBufInfo[i][j].sof_ts);
+       }
+    }
+
+    mTotalSyncCamNum = 0;
+    for (int i = 0; i < MAX_CAMERA_NUMBER; i++)
+        mVcSyncCount[i] = 0;
+}
+
+SyncManager::~SyncManager()
+{
+    LOG1("@%s", __func__);
+}
+
+bool SyncManager::isSynced(int cameraId, long sequence)
+{
+    LOG1("@%s", __func__);
+    const int TIME_DIFF_MS = 2;
+    bool sync = true;
+    int index = sequence % MAX_BUFFER_COUNT;
+
+    AutoMutex lock(mLock);
+    camera_buf_info bufInfo = mCameraBufInfo[cameraId][index];
+
+    int  syncNum = 0;
+    bool isSync[MAX_CAMERA_NUMBER];
+    long frameSyncedMs[MAX_CAMERA_NUMBER];
+    long curFrameMs = USEC_TO_MS(bufInfo.sof_ts.tv_usec) + SEC_TO_MS(bufInfo.sof_ts.tv_sec);
+
+    //first step: To check whether the current frame is synced with others camera channel
+    //            if timestamp difference <= 2ms, then think the frame is synced
+    for (int i = 0; i < MAX_CAMERA_NUMBER; i++) {
+        isSync[i] = false;
+        frameSyncedMs[i] = 0;
+        if (mCameraBufInfo[i][0].sequence == -1 || i == cameraId) {
+            continue;
+        }
+        for (int j = 0; j < MAX_BUFFER_COUNT; j++) {
+            if (mCameraBufInfo[i][j].sequence >= 0) {
+                camera_buf_info &temp = mCameraBufInfo[i][j];
+                long tempFrameMs = USEC_TO_MS(temp.sof_ts.tv_usec) + SEC_TO_MS(temp.sof_ts.tv_sec);
+                if (abs(tempFrameMs - curFrameMs ) <= TIME_DIFF_MS) {
+                    isSync[syncNum] = true;
+                    frameSyncedMs[syncNum] = tempFrameMs;
+                    syncNum++;
+                    break;
+                }
+            }
+        }
+    }
+    //second step: if current frame is synced with frames from other cameraID,
+    //             to check whether other 3 channel frames synced or not
+    if (syncNum >= mTotalSyncCamNum - 1) {
+        for (int i = 0; i < mTotalSyncCamNum - 1; i++) {
+            if (isSync[i]) {
+                if ((i + 1 < mTotalSyncCamNum - 1) &&
+                        abs(frameSyncedMs[i]-frameSyncedMs[i+1]) <= TIME_DIFF_MS) {
+                    sync &= true;
+                } else if ((i + 1 == mTotalSyncCamNum - 1) &&
+                        abs(frameSyncedMs[i]-frameSyncedMs[0]) <= TIME_DIFF_MS) {
+                    sync &= true;
+                } else {
+                    sync &= false;
+                }
+            }
+        }
+    } else {
+        sync = false;
+    }
+    LOG1("Id:%d, sof_ts:%ldms, sequence:%ld sync %d", cameraId, curFrameMs, sequence, sync);
+    return sync;
+}
+
+void SyncManager::updateCameraBufInfo(int cameraId, camera_buf_info* info)
+{
+    LOG1("@%s", __func__);
+    int index = info->sequence % MAX_BUFFER_COUNT;
+    AutoMutex lock(mLock);
+    mCameraBufInfo[cameraId][index] = *info;
+}
+
+void SyncManager::updateSyncCamNum()
+{
+    AutoMutex l(mLock);
+    CheckError(mTotalSyncCamNum >= MAX_CAMERA_NUMBER, VOID_VALUE,
+               "%s: sync cameras enough!", __func__);
+    mTotalSyncCamNum++;
+}
+
+bool SyncManager::vcSynced(int vc)
+{
+    CheckError(vc >= MAX_CAMERA_NUMBER, false, "%s: vc %d error!", __func__, vc);
+
+    AutoMutex l(mVcSyncLock);
+    int count = mVcSyncCount[vc];
+    int minCount = INT_MAX;
+    int maxCount = 0;
+
+    for (int i = 0; i < mTotalSyncCamNum; i++) {
+        minCount = std::min(minCount, mVcSyncCount[i]);
+        maxCount = std::max(maxCount, mVcSyncCount[i]);
+    }
+
+    // Check again if status is circling back to 0.
+    // Most of time handling code won't be executed because condition is false.
+    if (maxCount - minCount > max_vc_sync_count / 2) {
+        minCount = max_vc_sync_count;
+        maxCount = 0;
+        for (int i = 0; i < mTotalSyncCamNum; i++) {
+            count = (mVcSyncCount[i] + max_vc_sync_count) % (max_vc_sync_count + max_vc_sync_count / 4);
+            minCount = std::min(minCount, count);
+            maxCount = std::max(maxCount, count);
+        }
+        count = (mVcSyncCount[vc] + max_vc_sync_count) % (max_vc_sync_count + max_vc_sync_count / 4);
+    }
+
+    if (count > minCount) {
+        LOGVCSYNC("vc %d ready: false", vc);
+        return false;
+    } else
+        return true;
+};
+
+void SyncManager::updateVcSyncCount(int vc)
+{
+    CheckError(vc >= MAX_CAMERA_NUMBER, VOID_VALUE, "%s: vc %d error!", __func__, vc);
+    AutoMutex l(mVcSyncLock);
+    mVcSyncCount[vc] = (mVcSyncCount[vc] + 1) % (max_vc_sync_count + 1);
+};
+
+void SyncManager::printVcSyncCount(void)
+{
+    AutoMutex l(mVcSyncLock);
+    for (int i = 0; i < mTotalSyncCamNum; i++)
+        LOGVCSYNC("[%d]", mVcSyncCount[i]);
+}
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/SyncManager.h b/camera/hal/intel/ipu6/src/core/SyncManager.h
new file mode 100644
index 000000000000..c0a6af883817
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/SyncManager.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "PlatformData.h"
+
+namespace icamera {
+
+struct camera_buf_info {
+    long sequence;
+    struct timeval sof_ts;
+};
+class SyncManager {
+private:
+    //Prevent to create multiple instances
+    SyncManager();
+    ~SyncManager();
+public:
+     /**
+      * releaseInstance
+      * This function must be called when the hal is destroyed.
+      */
+    static void releaseInstance();
+    static SyncManager* getInstance();
+
+    bool isSynced(int cameraId, long sequence);
+    void updateCameraBufInfo(int cameraId, camera_buf_info* info);
+
+    void updateSyncCamNum();
+
+    bool vcSynced(int vc);
+    void updateVcSyncCount(int vc);
+    void printVcSyncCount();
+private:
+    static SyncManager* sInstance;
+    static Mutex sLock;
+    Mutex mLock;
+    struct camera_buf_info mCameraBufInfo[MAX_CAMERA_NUMBER][MAX_BUFFER_COUNT];
+
+    int mVcSyncCount[MAX_CAMERA_NUMBER];
+    Mutex mVcSyncLock;
+    int mTotalSyncCamNum;
+};
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.cpp b/camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.cpp
new file mode 100644
index 000000000000..18cc54ef5f67
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.cpp
@@ -0,0 +1,1224 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "PGCommon"
+
+#include "PGCommon.h"
+
+#include <stdint.h>
+#include <math.h>
+#include <utility>
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+#include "iutils/CameraDump.h"
+
+namespace icamera {
+
+#define IS_VALID_TERMINAL(terminal) (terminal >=0 && terminal < mTerminalCount)
+
+int PGCommon::getFrameSize(int format, int width, int height,
+                           bool needAlignedHeight, bool needExtraSize, bool needCompression)
+{
+    int size = 0;
+    int cssFormat = PGUtils::getCssFmt(format);
+    int stride = PGUtils::getCssStride(format, width);
+    switch (cssFormat) {
+    case IA_CSS_DATA_FORMAT_BAYER_LINE_INTERLEAVED:  // CSL6
+        if (needAlignedHeight) {
+            height = ALIGN_64(height);
+        }
+        size = stride * height * 3 / 2;
+        break;
+    default:
+        break;
+    }
+
+    if (!size) {
+        size = CameraUtils::getFrameSize(format, width, height,
+                                         needAlignedHeight, needExtraSize, needCompression);
+    }
+    return size;
+}
+
+PGCommon::PGCommon(int pgId, const std::string& pgName, ia_uid terminalBaseUid):
+    mCtx(nullptr),
+    mMemoryDevice(nullptr),
+    mManifestBuffer(nullptr),
+    mPGParamsBuffer(nullptr),
+    mPGParamAdapt(nullptr),
+    mPGId(pgId),
+    mName(pgName),
+    mTerminalBaseUid(terminalBaseUid),
+    mPGCount(0),
+    mPlatform(IA_P2P_PLATFORM_BXT_B0),
+    mProgramCount(0),
+    mTerminalCount(0),
+    mManifestSize(0),
+    mKernelBitmap(ia_css_kernel_bitmap_clear()),
+    mRoutingBitmap(nullptr),
+    mFragmentCount(1),
+    mPGBuffer(nullptr),
+    mProcessGroup(nullptr),
+    mCmdExtBuffer(nullptr),
+    mPPG(false),
+    mPPGStarted(false),
+    mPPGBuffer(nullptr),
+    mPPGProcessGroup(nullptr),
+    mToken(0),
+    mEvent(nullptr),
+    mTerminalBuffers(nullptr),
+    mInputMainTerminal(-1),
+    mOutputMainTerminal(-1)
+{
+    mTnrTerminalPair.inId = -1;
+    mTnrTerminalPair.outId = -1;
+    CLEAR(mTnrBuffers);
+
+    CLEAR(mCmd);
+    CLEAR(mPPGCmd);
+    CLEAR(mPPGCmdExtBuffer);
+    CLEAR(mParamPayload);
+    CLEAR(mCmdCfg);
+}
+
+PGCommon::~PGCommon()
+{
+}
+
+int PGCommon::init()
+{
+    mDisableDataTermials.clear();
+    mPGParamAdapt = std::unique_ptr<IntelPGParam>(new IntelPGParam(mPGId));
+
+    mCtx = ia_cipr_psys_create_context(nullptr);
+    mMemoryDevice = ia_cipr_psys_get_memory_device(mCtx);
+    int ret = getCapability();
+    if (ret != OK) return ret;
+
+    // create mManifestBuffer
+    ret = getManifest(mPGId);
+    if (ret != OK) return ret;
+
+    mTerminalBuffers = (ia_cipr_buffer_t**)IA_CIPR_CALLOC(mTerminalCount, sizeof(ia_cipr_buffer_t*));
+    CheckError(!mTerminalBuffers, NO_MEMORY, "Allocate terminal buffers fail");
+    memset(mTerminalBuffers, 0, (mTerminalCount * sizeof(ia_cipr_buffer_t*)));
+
+    mFrameFormatType = std::unique_ptr<ia_css_frame_format_type[]>(new ia_css_frame_format_type[mTerminalCount]);
+    for (int i = 0; i < mTerminalCount; i++) {
+        mFrameFormatType[i] = IA_CSS_N_FRAME_FORMAT_TYPES;
+    }
+
+    mPgTerminals = std::unique_ptr<uint8_t[]>(new uint8_t[mTerminalCount]);
+    for (int i = 0; i < mTerminalCount; i++) {
+        mPgTerminals[i] = IPU_MAX_TERMINAL_COUNT;
+    }
+
+    std::vector<TerminalPair> tnrTerminalPairs;
+    if (PGUtils::getTerminalPairs(mPGId, PGUtils::TERMINAL_PAIR_TNR, &tnrTerminalPairs)) {
+        mTnrTerminalPair = tnrTerminalPairs[0];
+    }
+    PGUtils::getTerminalPairs(mPGId, PGUtils::TERMINAL_PAIR_DVS, &mDvsTerminalPairs);
+
+    return ret;
+}
+
+void PGCommon::deInit()
+{
+    if (mPPGStarted) {
+        stopPPG();
+        mPPGStarted = false;
+    }
+
+    destoryCommands();
+
+    for (int i = TNR_BUFFER_IN_INDEX; i <= TNR_BUFFER_OUT_INDEX; i++) {
+        if (mTnrBuffers[i]) {
+            free(mTnrBuffers[i]);
+            mTnrBuffers[i] = nullptr;
+        }
+    }
+
+    mDvsTerminalPairs.clear();
+
+    mDisableDataTermials.clear();
+    if (mTerminalBuffers) {
+        IA_CIPR_FREE(mTerminalBuffers);
+    }
+    ia_cipr_buffer_destroy(mManifestBuffer);
+    ia_cipr_buffer_destroy(mPGParamsBuffer);
+    ia_cipr_buffer_destroy(mPGBuffer);
+    if (mPPGBuffer) {
+        ia_cipr_buffer_destroy(mPPGBuffer);
+    }
+    for (auto& item : mBuffers) {
+        ia_cipr_buffer_destroy(item.ciprBuf);
+    }
+
+    ia_cipr_psys_destroy_context(mCtx);
+
+    mPGParamAdapt->deinit();
+    mRoutingBitmap.reset();
+}
+
+void PGCommon::setInputInfo(const TerminalFrameInfoMap& inputInfos)
+{
+    mInputMainTerminal = -1;
+    int maxFrameSize = 0;
+    for (const auto& item : inputInfos) {
+        int terminal = item.first - mTerminalBaseUid;
+        CheckError(!IS_VALID_TERMINAL(terminal), VOID_VALUE, "error input terminal %d", item.first);
+
+        FrameInfo frameInfo;
+        frameInfo.mWidth = item.second.mWidth;
+        frameInfo.mHeight = item.second.mHeight;
+        frameInfo.mFormat = item.second.mFormat;
+        frameInfo.mBpp = CameraUtils::getBpp(frameInfo.mFormat);
+        frameInfo.mStride = CameraUtils::getStride(frameInfo.mFormat, frameInfo.mWidth);
+        mTerminalFrameInfos[terminal] = frameInfo;
+        int size = frameInfo.mWidth * frameInfo.mHeight;
+        if (maxFrameSize < size) {
+            maxFrameSize = size;
+            mInputMainTerminal = terminal;
+        }
+    }
+
+    // Create frame info for tnr terminals (i.e. data terminals)
+    FrameInfo config = mTerminalFrameInfos[mInputMainTerminal];
+    if (config.mHeight % 32) {
+        LOG1("%s: height %d not multiple of 32, rounding up!", __func__, config.mHeight);
+        config.mHeight = ((config.mHeight / 32) + 1) * 32;
+    }
+
+    for (int i = TNR_BUFFER_IN_INDEX; i <= TNR_BUFFER_OUT_INDEX; i++) {
+        int tnrId = (i == TNR_BUFFER_IN_INDEX) ? mTnrTerminalPair.inId : mTnrTerminalPair.outId;
+        if (tnrId < 0) continue;
+
+        mFrameFormatType[tnrId] = IA_CSS_DATA_FORMAT_NV12; // for IPU6
+        mTerminalFrameInfos[tnrId] = config;
+    }
+
+    LOG1("%s:%d use input terminal %d as main", __func__, mPGId, mInputMainTerminal);
+}
+
+void PGCommon::setOutputInfo(const TerminalFrameInfoMap& outputInfos)
+{
+    mOutputMainTerminal = -1;
+    int maxFrameSize = 0;
+    for (const auto& item : outputInfos) {
+        int terminal = item.first - mTerminalBaseUid;
+        CheckError(!IS_VALID_TERMINAL(terminal), VOID_VALUE, "error output terminal %d", item.first);
+
+        FrameInfo frameInfo;
+        frameInfo.mWidth = item.second.mWidth;
+        frameInfo.mHeight = item.second.mHeight;
+        frameInfo.mFormat = item.second.mFormat;
+        frameInfo.mBpp = CameraUtils::getBpp(frameInfo.mFormat);
+        frameInfo.mStride = CameraUtils::getStride(frameInfo.mFormat, frameInfo.mWidth);
+        mTerminalFrameInfos[terminal] = frameInfo;
+        int size = frameInfo.mWidth * frameInfo.mHeight;
+        if (maxFrameSize < size) {
+            maxFrameSize = size;
+            mOutputMainTerminal = terminal;
+        }
+    }
+}
+
+void PGCommon::setDisabledTerminals(const std::vector<ia_uid>& disabledTerminals)
+{
+    for (auto const terminalUid : disabledTerminals) {
+        int terminal = terminalUid - mTerminalBaseUid;
+        CheckError(!IS_VALID_TERMINAL(terminal), VOID_VALUE, "error disabled terminal %d", terminalUid);
+        mDisableDataTermials.push_back(terminal);
+    }
+}
+
+void PGCommon::setRoutingBitmap(const void* rbm, uint32_t bytes)
+{
+    if (!rbm || !bytes) {
+        return;
+    }
+    const unsigned char* rbmData = (const unsigned char*)rbm;
+
+    if (mRoutingBitmap.get() == nullptr) {
+        mRoutingBitmap = std::unique_ptr<ia_css_rbm_t>(new ia_css_rbm_t);
+    }
+
+    ia_css_rbm_t* rbmPtr = mRoutingBitmap.get();
+    *rbmPtr = ia_css_rbm_clear();
+    for (uint32_t bit = 0; bit < bytes * 8; bit++) {
+        if (rbmData[bit / 8] & (1 << (bit %8))) {
+            *rbmPtr = ia_css_rbm_set(*rbmPtr, bit);
+        }
+    }
+}
+
+int PGCommon::prepare(IspParamAdaptor* adaptor, int streamId)
+{
+    // Set the data terminal frame format
+    int ret = configTerminalFormat();
+    CheckError((ret != OK), ret, "%s, call configTerminal fail", __func__);
+
+    // Init and config p2p handle
+    ret = initParamAdapt();
+    CheckError((ret != OK), ret, "%s, init p2p fail", __func__);
+
+    // Query and save the requirement for each terminal, get the final kernel bitmap
+    ret = mPGParamAdapt->prepare(adaptor->getIpuParameter(-1, streamId), mRoutingBitmap.get(), &mKernelBitmap);
+    CheckError((ret != OK), ret, "%s, prepare p2p fail", __func__);
+
+    // Init PG parameters
+    ret = handlePGParams(mFrameFormatType.get());
+    CheckError((ret != OK), ret, "%s, call handlePGParams fail", __func__);
+
+    ret = setKernelBitMap();
+    CheckError((ret != OK), ret, "%s, call setKernelBitMap fail", __func__);
+
+    ret = setTerminalParams(mFrameFormatType.get());
+    CheckError((ret != OK), ret, "%s, call setTerminalParams fail", __func__);
+
+   // Create process group
+    mProcessGroup = createPG(mPGBuffer);
+    CheckError(!mProcessGroup, UNKNOWN_ERROR, "%s, create pg fail", __func__);
+    uint8_t pgTerminalCount = ia_css_process_group_get_terminal_count(mProcessGroup);
+    for (uint8_t termNum = 0 ; termNum < pgTerminalCount; termNum++) {
+        ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, termNum);
+        CheckError(!terminal, UNKNOWN_ERROR, "failed to get terminal");
+        uint16_t termIdx = ia_css_terminal_get_terminal_manifest_index(terminal);
+        CheckError((termIdx >= IPU_MAX_TERMINAL_COUNT), UNKNOWN_ERROR, "wrong term index for terminal num %d", termNum);
+        mPgTerminals[termIdx] = termNum;
+    }
+
+    mPGParamAdapt->setPGAndPrepareProgram(mProcessGroup);
+    int count = mPGParamAdapt->allocatePayloads(mTerminalCount, mParamPayload);
+    CheckError(count != mTerminalCount, NO_MEMORY, "%s, allocatePayloads fails", __func__);
+    preparePayloadBuffers();
+
+    ret = configureFragmentDesc();
+    CheckError((ret != OK), ret, "%s, call configureFragmentDesc fail", __func__);
+
+    return OK;
+}
+
+ia_css_process_group_t* PGCommon::createPG(ia_cipr_buffer_t*& pgBuffer)
+{
+    CheckError(pgBuffer, nullptr, "pg has already created");
+
+   // Create process group
+    ia_css_program_group_param_t* pgParamsBuf =
+        (ia_css_program_group_param_t*)getCiprBufferPtr(mPGParamsBuffer);
+    ia_css_program_group_manifest_t* manifestBuf =
+        (ia_css_program_group_manifest_t*)getCiprBufferPtr(mManifestBuffer);
+
+    size_t pgSize = ia_css_sizeof_process_group(manifestBuf, pgParamsBuf);
+    LOG1("%s process group size is %zu", __func__, pgSize);
+
+    void* pgMemory = mPGParamAdapt->allocatePGBuffer(pgSize);
+    CheckError(!pgMemory, nullptr, "allocate PG error");
+    pgBuffer = createUserPtrCiprBuffer(pgSize, pgMemory);
+    CheckError(!pgBuffer, nullptr, "%s, call createUserPtrCiprBuffer fail", __func__);
+
+    ia_css_process_group_t* pg = ia_css_process_group_create(getCiprBufferPtr(pgBuffer),
+                   (ia_css_program_group_manifest_t*)getCiprBufferPtr(mManifestBuffer),
+                   (ia_css_program_group_param_t*)getCiprBufferPtr(mPGParamsBuffer));
+    CheckError(!pg, nullptr, "Create process group failed.");
+
+    if (mPPG) {
+        ia_css_process_group_set_num_queues(pg, 1);
+    }
+
+    if (mRoutingBitmap.get()) {
+        ia_css_process_group_set_routing_bitmap(pg, *mRoutingBitmap.get());
+    }
+    return pg;
+}
+
+int PGCommon::createCommands()
+{
+    int bufCount = ia_css_process_group_get_terminal_count(mProcessGroup);
+    int ret = createCommand(mPGBuffer, mCmd, mCmdExtBuffer, bufCount);
+    CheckError(ret, NO_MEMORY, "create cmd fail!");
+    if (mPPG) {
+        ret = createCommand(mPPGBuffer, mPPGCmd[PPG_CMD_TYPE_START], mPPGCmdExtBuffer[PPG_CMD_TYPE_START], bufCount);
+        CheckError(ret, NO_MEMORY, "create ppg start buffer %d fail");
+        ret = createCommand(mPPGBuffer, mPPGCmd[PPG_CMD_TYPE_STOP], mPPGCmdExtBuffer[PPG_CMD_TYPE_STOP], 0);
+        CheckError(ret, NO_MEMORY, "create ppg stop %d fail");
+    }
+
+    ia_cipr_psys_event_config_t eventCfg;
+    eventCfg.timeout = kEventTimeout;
+    mEvent = ia_cipr_psys_create_event(&eventCfg);
+    CheckError(!mEvent, NO_MEMORY, "create event fail");
+
+    return OK;
+}
+
+int PGCommon::createCommand(ia_cipr_buffer_t* pg, ia_cipr_psys_command_t& cmd, ia_cipr_buffer_t*& extBuffer, int bufCount)
+{
+    ia_cipr_psys_command_config_t cmdCfg;
+    ia_cipr_memory_t memory;
+    ia_cipr_process_group_command_t *pgCommand;
+    css_err_t ret;
+
+    // Create command with basic setting
+    CLEAR(cmdCfg);
+    cmdCfg.bufcount = bufCount;
+    cmd = ia_cipr_psys_create_command(&cmdCfg);
+    CheckError(!cmd, UNKNOWN_ERROR, "%s, call create_command fail", __func__);
+    ret = ia_cipr_psys_get_command_config(cmd, &cmdCfg);
+    CheckError(ret, UNKNOWN_ERROR, "%s, call get_command_config fail", __func__);
+
+    // Create ext buffer
+    extBuffer = ia_cipr_buffer_create(sizeof(ia_cipr_process_group_command_t),
+                                     IA_CIPR_MEMORY_ALLOCATE_CPU_PTR
+                                     | IA_CIPR_MEMORY_PSYS_API,
+                                     NULL);
+    CheckError(!extBuffer, NO_MEMORY, "create cmd buffer fail");
+
+    ret = ia_cipr_memory_device_migrate_buffer(mMemoryDevice, extBuffer);
+    CheckError(ret, NO_MEMORY, "unable to access extBuffer");
+    ret = ia_cipr_buffer_get_memory(extBuffer, &memory);
+    CheckError(ret, NO_MEMORY, "unable to access extBuffer memory");
+    pgCommand = (ia_cipr_process_group_command_t*)memory.cpu_ptr;
+    CheckError(!pgCommand, NO_MEMORY, "unable to access memory.cpu_ptr");
+    pgCommand->header.size = sizeof(ia_cipr_process_group_command_t);
+    pgCommand->header.offset = sizeof(pgCommand->header);
+    pgCommand->header.version = psys_command_ext_ppg_1; // for ipu6
+    if (pgCommand->header.version == psys_command_ext_ppg_1) {
+        IA_CIPR_MEMCOPY(pgCommand->dynamic_kernel_bitmap, sizeof(ia_css_kernel_bitmap_t),
+                        &mKernelBitmap, sizeof(ia_css_kernel_bitmap_t));
+    }
+
+    // Update setting and set back to command
+    cmdCfg.id = mPGId;
+    cmdCfg.priority = 1;
+    cmdCfg.pg_params_buf = mPPG ? nullptr : mPGParamsBuffer;
+    cmdCfg.pg_manifest_buf = mManifestBuffer;
+    cmdCfg.pg = pg;
+    cmdCfg.ext_buf = extBuffer;
+    ret = ia_cipr_psys_set_command_config(cmd, &cmdCfg);
+    CheckError(ret, UNKNOWN_ERROR, "%s, call set_command_config fail", __func__);
+
+    return OK;
+}
+
+void PGCommon::destoryCommands()
+{
+    ia_cipr_psys_destroy_command(mCmd);
+    ia_cipr_buffer_destroy(mCmdExtBuffer);
+
+    for (int i = 0; i < PPG_CMD_TYPE_COUNT; i++) {
+        ia_cipr_psys_destroy_command(mPPGCmd[i]);
+        ia_cipr_buffer_destroy(mPPGCmdExtBuffer[i]);
+    }
+
+    if (mEvent) {
+        ia_cipr_psys_destroy_event(mEvent);
+    }
+}
+
+int PGCommon::configTerminalFormat()
+{
+    for (int i = 0; i < mTerminalCount; i++) {
+        if (mTerminalFrameInfos.find(i) != mTerminalFrameInfos.end()) {
+            mFrameFormatType[i] = PGUtils::getCssFmt(mTerminalFrameInfos[i].mFormat);
+        }
+    }
+    return OK;
+}
+
+int PGCommon::initParamAdapt()
+{
+    mFragmentCount = calcFragmentCount();
+
+    ia_css_program_group_manifest_t* manifestBuf =
+        (ia_css_program_group_manifest_t*)getCiprBufferPtr(mManifestBuffer);
+
+    PgConfiguration config;
+    config.pgManifest = manifestBuf;
+    config.pgManifestSize = getCiprBufferSize(mManifestBuffer);
+    config.disableDataTermials = mDisableDataTermials;
+    config.fragmentCount = mFragmentCount;
+
+    FrameInfo* pgInFrame = nullptr;
+    FrameInfo* pgOutFrame = nullptr;
+    if (mInputMainTerminal >= 0) {
+        pgInFrame = &mTerminalFrameInfos[mInputMainTerminal];
+    }
+    if (mOutputMainTerminal >= 0) {
+        pgOutFrame = &mTerminalFrameInfos[mOutputMainTerminal];
+    }
+    if (pgInFrame) {
+        config.inputMainFrame.width = pgInFrame->mWidth;
+        config.inputMainFrame.height = pgInFrame->mHeight;
+        config.inputMainFrame.bpe = pgInFrame->mBpp; //TODO: use bpe
+    }
+
+    if (pgOutFrame) {
+        config.outputMainFrame.width = pgOutFrame->mWidth;
+        config.outputMainFrame.height = pgOutFrame->mHeight;
+        config.outputMainFrame.bpe = pgOutFrame->mBpp; //TODO: use bpe
+    }
+
+    // init and config p2p handle
+    int ret = mPGParamAdapt->init(mPlatform, config);
+    return ret;
+}
+
+// Support horizontal fragment only now
+int PGCommon::calcFragmentCount(int overlap)
+{
+    int finalFragmentCount = 0;
+    ia_css_data_terminal_manifest_t * data_terminal_manifest = nullptr;
+
+    const ia_css_program_group_manifest_t *manifest =
+            (const ia_css_program_group_manifest_t*)getCiprBufferPtr(mManifestBuffer);
+    CheckError(!manifest, 1, "%s, can't get manifest ptr", __func__);
+
+    for (int termIdx = 0; termIdx < mTerminalCount; termIdx++) {
+        // Get max fragement size from manifest (align with 64)
+        ia_css_terminal_manifest_t *terminal_manifest = ia_css_program_group_manifest_get_term_mnfst(manifest, termIdx);
+        ia_css_terminal_type_t  terminal_type = ia_css_terminal_manifest_get_type(terminal_manifest);
+
+        if (!((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) || (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN))) {
+            continue;
+        }
+
+        data_terminal_manifest = ia_css_program_group_manifest_get_data_terminal_manifest(manifest, termIdx);
+        CheckError(!data_terminal_manifest, -1, "%s, can't get data terminal manifest for term %d", __func__, termIdx);
+
+        uint16_t size[IA_CSS_N_DATA_DIMENSION] = {0};
+        int ret = ia_css_data_terminal_manifest_get_max_size(data_terminal_manifest, size);
+        CheckError(ret < 0, 1, "%s: get max fragment size error for term %d", __func__, termIdx);
+
+        size[IA_CSS_COL_DIMENSION] = ALIGN_64(size[IA_CSS_COL_DIMENSION]);
+        // Overwrite the max value if need
+
+        // Calc fragment count for terminal (only for horizontal direction)
+        int maxFragmentWidth = size[IA_CSS_COL_DIMENSION];
+        FrameInfo config;
+        CLEAR(config);
+        if (mTerminalFrameInfos.find(termIdx) != mTerminalFrameInfos.end()) {
+            config = mTerminalFrameInfos[termIdx];
+        }
+        int fragmentCovered = maxFragmentWidth;
+        int fragmentCount = 1;
+        /*
+         * Calculate how many fragment frames can cover the whole frame.
+         * Consider overlap between two fragment frames.
+         * Example: frame width = 300, max fragment width = 100, overlap = 10
+         *       0|------------------------------|300
+         *  f1   0|----------|100
+         *  f2           90|----------|190
+         *  f3                   180|----------|280
+         *  f4                            270|---|300
+         */
+        while (fragmentCovered < config.mWidth) {
+            fragmentCovered += (maxFragmentWidth - overlap);
+            fragmentCount++;
+        }
+
+        if (finalFragmentCount < fragmentCount) {
+            finalFragmentCount = fragmentCount;
+        }
+    }
+
+    LOG2("%s: final fragment count %d for pg %d", __func__, finalFragmentCount, mPGId);
+    return finalFragmentCount;
+}
+
+int PGCommon::handlePGParams(const ia_css_frame_format_type* frameFormatTypes)
+{
+    int pgParamsSize = ia_css_sizeof_program_group_param(mProgramCount, mTerminalCount, mFragmentCount);
+
+    mPGParamsBuffer = createUserPtrCiprBuffer(pgParamsSize);
+    CheckError(!mPGParamsBuffer, NO_MEMORY, "%s, call createUserPtrCiprBuffer fail", __func__);
+
+    ia_css_program_group_param_t* pgParamsBuf = (ia_css_program_group_param_t*)getCiprBufferPtr(mPGParamsBuffer);
+    int ret = ia_css_program_group_param_init(pgParamsBuf, mProgramCount, mTerminalCount, mFragmentCount, frameFormatTypes);
+    CheckError((ret != OK), ret, "%s, call ia_css_program_group_param_init fail", __func__);
+
+    if (mPPG) {
+        ret = ia_css_program_group_param_set_protocol_version(
+                pgParamsBuf,
+                IA_CSS_PROCESS_GROUP_PROTOCOL_PPG);
+        CheckError((ret != OK), ret, "%s, call ia_css_program_group_param_set_protocol_version fail", __func__);
+    }
+    return ret;
+}
+
+int PGCommon::setKernelBitMap()
+{
+    ia_css_program_group_param_t* pgParamsBuf = (ia_css_program_group_param_t*)getCiprBufferPtr(mPGParamsBuffer);
+    LOG1("%s: mKernelBitmap: %#018lx", __func__, mKernelBitmap);
+    int ret = ia_css_program_group_param_set_kernel_enable_bitmap(pgParamsBuf, mKernelBitmap);
+    CheckError((ret != OK), ret, "%s, call ia_css_program_group_param_set_kernel_enable_bitmap fail", __func__);
+
+    return ret;
+}
+
+int PGCommon::setTerminalParams(const ia_css_frame_format_type* frameFormatTypes)
+{
+    ia_css_program_group_param_t* pgParamsBuf =
+        (ia_css_program_group_param_t*)getCiprBufferPtr(mPGParamsBuffer);
+    ia_css_program_group_manifest_t* pg_manifest =
+        (ia_css_program_group_manifest_t*)getCiprBufferPtr(mManifestBuffer);
+
+    for (int i = 0; i < mTerminalCount; i++) {
+        ia_css_terminal_param_t *terminalParam =
+            ia_css_program_group_param_get_terminal_param(pgParamsBuf, i);
+        CheckError(!terminalParam, UNKNOWN_ERROR, "%s, call ia_css_program_group_param_get_terminal_param fail", __func__);
+        ia_css_terminal_manifest_t *terminal_manifest = ia_css_program_group_manifest_get_term_mnfst(pg_manifest, i);
+        ia_css_terminal_type_t  terminal_type = ia_css_terminal_manifest_get_type(terminal_manifest);
+        if (!((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) || (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN))) {
+            continue;
+        }
+
+        FrameInfo config = mTerminalFrameInfos[i];
+        terminalParam->frame_format_type = frameFormatTypes[i];
+        terminalParam->dimensions[IA_CSS_COL_DIMENSION] = config.mWidth;
+        terminalParam->dimensions[IA_CSS_ROW_DIMENSION] = config.mHeight;
+        terminalParam->fragment_dimensions[IA_CSS_COL_DIMENSION] = config.mWidth;
+        terminalParam->fragment_dimensions[IA_CSS_ROW_DIMENSION] = config.mHeight;
+
+        terminalParam->bpp = PGUtils::getCssBpp(config.mFormat);
+        terminalParam->bpe = terminalParam->bpp;
+        terminalParam->stride = PGUtils::getCssStride(config.mFormat, config.mWidth);
+
+        terminalParam->offset = 0;
+        terminalParam->index[IA_CSS_COL_DIMENSION] = 0;
+        terminalParam->index[IA_CSS_ROW_DIMENSION] = 0;
+
+        LOG2("%s: setTerminalParams: index=%d, format=%d, w=%d, h=%d, fw=%d, fh=%d, bpp=%d, bpe=%d, stride=%d, offset=%d, col=%d, row=%d",
+             getName(), i,
+             terminalParam->frame_format_type,
+             terminalParam->dimensions[IA_CSS_COL_DIMENSION],
+             terminalParam->dimensions[IA_CSS_ROW_DIMENSION],
+             terminalParam->fragment_dimensions[IA_CSS_COL_DIMENSION],
+             terminalParam->fragment_dimensions[IA_CSS_ROW_DIMENSION],
+             terminalParam->bpp,
+             terminalParam->bpe,
+             terminalParam->stride,
+             terminalParam->offset,
+             terminalParam->index[IA_CSS_COL_DIMENSION],
+             terminalParam->index[IA_CSS_ROW_DIMENSION]);
+    }
+
+    return OK;
+}
+
+int PGCommon::configureFragmentDesc()
+{
+    int num = mTerminalCount * mFragmentCount;
+    std::unique_ptr<ia_p2p_fragment_desc[]> srcFragDesc =
+                    std::unique_ptr<ia_p2p_fragment_desc[]>(new ia_p2p_fragment_desc[num]);
+    int count = mPGParamAdapt->getFragmentDescriptors(num, srcFragDesc.get());
+    CheckError(!count, UNKNOWN_ERROR, "getFragmentDescriptors fails");
+
+    for (int termIdx = 0; termIdx < mTerminalCount; termIdx++) {
+        if (mPgTerminals[termIdx] >= IPU_MAX_TERMINAL_COUNT) {
+            continue;
+        }
+
+        ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, mPgTerminals[termIdx]);
+        ia_css_terminal_type_t terminalType = ia_css_terminal_get_type(terminal);
+        if (!((terminalType == IA_CSS_TERMINAL_TYPE_DATA_OUT) || (terminalType == IA_CSS_TERMINAL_TYPE_DATA_IN))) {
+            continue;
+        }
+        configureTerminalFragmentDesc(termIdx, &srcFragDesc[termIdx]);
+    }
+    return OK;
+}
+
+int PGCommon::configureTerminalFragmentDesc(int termIdx, const ia_p2p_fragment_desc* srcDesc)
+{
+#define DDR_WORD_BYTES 64
+    ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, mPgTerminals[termIdx]);
+    ia_css_terminal_type_t terminalType = ia_css_terminal_get_type(terminal);
+    if (!((terminalType == IA_CSS_TERMINAL_TYPE_DATA_OUT) || (terminalType == IA_CSS_TERMINAL_TYPE_DATA_IN))) {
+        return OK;
+    }
+
+    bool vectorized = false;
+    int packed_multiplier = 1;
+    int packed_divider = 1;
+    int dimension_bpp = PGUtils::getCssBpp(mTerminalFrameInfos[termIdx].mFormat);
+
+    switch(mFrameFormatType[termIdx]) {
+    case IA_CSS_DATA_FORMAT_BAYER_VECTORIZED:
+    case IA_CSS_DATA_FORMAT_BAYER_LINE_INTERLEAVED:
+        vectorized = true;
+        dimension_bpp = (uint8_t) ALIGN_8(PGUtils::getCssBpp(mTerminalFrameInfos[termIdx].mFormat));
+        break;
+    case IA_CSS_DATA_FORMAT_RAW:
+        dimension_bpp = (uint8_t) ALIGN_8(PGUtils::getCssBpp(mTerminalFrameInfos[termIdx].mFormat));
+        break;
+    case IA_CSS_DATA_FORMAT_BAYER_GRBG:
+    case IA_CSS_DATA_FORMAT_BAYER_RGGB:
+    case IA_CSS_DATA_FORMAT_BAYER_BGGR:
+    case IA_CSS_DATA_FORMAT_BAYER_GBRG:
+        dimension_bpp = (uint8_t) ALIGN_8(PGUtils::getCssBpp(mTerminalFrameInfos[termIdx].mFormat));
+        break;
+    case IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED:
+        dimension_bpp = (uint8_t) (PGUtils::getCssBpp(mTerminalFrameInfos[termIdx].mFormat) * 3 / 2);
+        packed_multiplier = 3;
+        packed_divider = 2;
+        vectorized = true;
+        break;
+    default:
+        break;
+    }
+
+    for (int fragIdx = 0; fragIdx < mFragmentCount; fragIdx++) {
+        ia_css_fragment_descriptor_t* dstFragDesc =
+                ia_css_data_terminal_get_fragment_descriptor((ia_css_data_terminal_t*)terminal, fragIdx);
+        CheckError(!dstFragDesc, -1, "%s: Can't get frag desc from terminal", __func__);
+
+        dstFragDesc->dimension[IA_CSS_COL_DIMENSION] = srcDesc[fragIdx].fragment_width;
+        dstFragDesc->dimension[IA_CSS_ROW_DIMENSION] = srcDesc[fragIdx].fragment_height;
+        dstFragDesc->index[IA_CSS_COL_DIMENSION] = (uint16_t)
+                (((srcDesc[fragIdx].fragment_start_x * packed_multiplier)
+                 / packed_divider) * (vectorized ? 2 : 1));
+        dstFragDesc->index[IA_CSS_ROW_DIMENSION] = (uint16_t)
+                (srcDesc[fragIdx].fragment_start_y / (vectorized ? 2 : 1));
+
+        int colOffset = 0;
+        int pixels_per_word = 0;
+        switch (mFrameFormatType[termIdx]) {
+        case IA_CSS_DATA_FORMAT_YUV420:
+        case IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED:
+        case IA_CSS_DATA_FORMAT_BAYER_VECTORIZED:
+            /** \todo Fragmentation with DMA packed formats is still open, need to
+             * check this again when it is more clear (see #H1804344344).
+             */
+            pixels_per_word = (uint16_t) floor(DDR_WORD_BYTES * 8 / dimension_bpp);
+            colOffset = (uint16_t) (floor(dstFragDesc->index[IA_CSS_COL_DIMENSION] / pixels_per_word) * DDR_WORD_BYTES);
+            colOffset = (uint16_t) (colOffset + (((dstFragDesc->index[IA_CSS_COL_DIMENSION] % pixels_per_word) * dimension_bpp) / 8));
+            break;
+        default:
+            colOffset = (uint16_t) (dstFragDesc->index[IA_CSS_COL_DIMENSION] * dimension_bpp / 8);
+            break;
+        }
+
+        dstFragDesc->offset[IA_CSS_COL_DIMENSION] = (uint16_t)colOffset;
+        dstFragDesc->offset[IA_CSS_ROW_DIMENSION] = dstFragDesc->index[IA_CSS_ROW_DIMENSION];
+
+        LOG2("%s: %d:%d: get frag desc %d (%d, %d, %d, %d)", __func__, mPGId, termIdx, fragIdx,
+             srcDesc[fragIdx].fragment_width, srcDesc[fragIdx].fragment_height,
+             srcDesc[fragIdx].fragment_start_x, srcDesc[fragIdx].fragment_start_y);
+        LOG2("%s: %d:%d:       frag %d: size(%d, %d) index(%d, %d), offset(%d, %d)", __func__, mPGId, termIdx,fragIdx,
+             dstFragDesc->dimension[IA_CSS_COL_DIMENSION],
+             dstFragDesc->dimension[IA_CSS_ROW_DIMENSION],
+             dstFragDesc->index[IA_CSS_COL_DIMENSION],
+             dstFragDesc->index[IA_CSS_ROW_DIMENSION],
+             dstFragDesc->offset[IA_CSS_COL_DIMENSION],
+             dstFragDesc->offset[IA_CSS_ROW_DIMENSION]);
+    }
+    return OK;
+}
+
+int PGCommon::iterate(CameraBufferMap &inBufs, CameraBufferMap &outBufs,
+                      ia_binary_data *statistics, const ia_binary_data *ipuParameters)
+{
+    LOG2("%s:%s ++", getName(), __func__);
+
+    int ret = prepareTerminalBuffers(ipuParameters, inBufs, outBufs);
+    CheckError((ret != OK), ret, "%s, prepareTerminalBuffers fail with %d", getName(), ret);
+
+    // Create PPG & PPG start/stop commands at the beginning
+    if (mPPG && !mPPGBuffer) {
+        ia_css_program_group_param_t* pgParamsBuf =
+            (ia_css_program_group_param_t*)getCiprBufferPtr(mPGParamsBuffer);
+        ia_css_program_group_manifest_t* manifestBuf =
+            (ia_css_program_group_manifest_t*)getCiprBufferPtr(mManifestBuffer);
+
+        size_t pgSize = ia_css_sizeof_process_group(manifestBuf, pgParamsBuf);
+
+        mPPGBuffer = createUserPtrCiprBuffer(pgSize);
+        CheckError(!mPPGBuffer, NO_MEMORY, "%s, call createUserPtrCiprBuffer fail", __func__);
+        mPPGProcessGroup = (ia_css_process_group_t*)getCiprBufferPtr(mPPGBuffer);
+        MEMCPY_S(mPPGProcessGroup, pgSize, mProcessGroup, ia_css_process_group_get_size(mProcessGroup));
+
+    }
+    if (!mCmd) {
+        ret = createCommands();
+       CheckError((ret != OK), ret, "%s, call createCommands fail", __func__);
+    }
+
+    if (mPPG && !mPPGStarted) {
+        ret = startPPG();
+        CheckError((ret != OK), ret, "%s, startPPG fail", getName());
+        mPPGStarted = true;
+    }
+
+    ret = executePG();
+    CheckError((ret != OK), ret, "%s, executePG fail", getName());
+
+    if (statistics) {
+        ret = mPGParamAdapt->decode(mTerminalCount, mParamPayload, statistics);
+        CheckError((ret != OK), ret, "%s, decode fail", getName());
+    }
+
+    LOG2("%s:%s -- ", getName(), __func__);
+    return ret;
+}
+
+int PGCommon::preparePayloadBuffers()
+{
+    ia_cipr_buffer_t* ciprBuf = nullptr;
+    for (int termIdx = 0; termIdx < mTerminalCount; termIdx++) {
+        if (mParamPayload[termIdx].size && mParamPayload[termIdx].data) {
+            ciprBuf = registerUserBuffer(mParamPayload[termIdx].size, mParamPayload[termIdx].data);
+            CheckError(!ciprBuf, NO_MEMORY, "%s, register payload buffer %p for term %d fail",
+                       __func__, mParamPayload[termIdx].data, termIdx);
+            memset(mParamPayload[termIdx].data, 0, PAGE_ALIGN(mParamPayload[termIdx].size));
+            mTerminalBuffers[termIdx] = ciprBuf;
+        }
+    }
+
+    if (mTnrTerminalPair.inId >= 0 && !mTnrBuffers[TNR_BUFFER_IN_INDEX]) {
+        LOG1("%s:%s allocate the TNR input and output buffers", __func__, getName());
+        int size = CameraUtils::getFrameSize(mTerminalFrameInfos[mInputMainTerminal].mFormat,
+                                             mTerminalFrameInfos[mInputMainTerminal].mWidth,
+                                             mTerminalFrameInfos[mInputMainTerminal].mHeight);
+
+        for (int i = TNR_BUFFER_IN_INDEX; i <= TNR_BUFFER_OUT_INDEX; i++) {
+            int idx = (i == TNR_BUFFER_IN_INDEX) ? mTnrTerminalPair.inId : mTnrTerminalPair.outId;
+
+            int ret = posix_memalign((void**)&mTnrBuffers[i], PAGE_SIZE_U, PAGE_ALIGN(size));
+            CheckError(ret, NO_MEMORY, "%s, alloc tnr %d buf for term %d fails", __func__, i, idx);
+
+            ciprBuf = registerUserBuffer(size, mTnrBuffers[i]);
+            CheckError(!ciprBuf, NO_MEMORY, "%s, register tnr %d buf %p fails", __func__, i,
+                       mTnrBuffers[i]);
+            mTerminalBuffers[idx] = ciprBuf;
+        }
+    }
+    return OK;
+}
+
+int PGCommon::prepareTerminalBuffers(const ia_binary_data *ipuParameters,
+                                     const CameraBufferMap& inBufs, const CameraBufferMap& outBufs)
+{
+    ia_cipr_buffer_t* ciprBuf = nullptr;
+    // Prepare payload
+    for (int termIdx = 0; termIdx < mTerminalCount; termIdx++) {
+        // Payload for data terminals
+        std::shared_ptr<CameraBuffer> buffer;
+        ia_uid terminalUid = mTerminalBaseUid + termIdx;
+        if (inBufs.find(terminalUid) != inBufs.end()) {
+             buffer = inBufs.at(terminalUid);
+        } else if (outBufs.find(terminalUid) != outBufs.end()) {
+             buffer = outBufs.at(terminalUid);
+        }
+
+        if (buffer) {
+            ciprBuf = (buffer->getMemory() == V4L2_MEMORY_DMABUF) \
+                     ? registerUserBuffer(buffer->getBufferSize(), buffer->getFd()) \
+                     : registerUserBuffer(buffer->getBufferSize(), buffer->getBufferAddr());
+            CheckError(!ciprBuf, NO_MEMORY, "%s, register buffer size %d for terminal %d fail",
+                       __func__, buffer->getBufferSize(), termIdx);
+            mTerminalBuffers[termIdx] = ciprBuf;
+        }
+    }
+
+    if (mTnrBuffers[TNR_BUFFER_IN_INDEX] && mTnrBuffers[TNR_BUFFER_OUT_INDEX]) {
+        std::swap(mTerminalBuffers[mTnrTerminalPair.inId],
+                  mTerminalBuffers[mTnrTerminalPair.outId]);
+    }
+
+    for (auto& pair : mDvsTerminalPairs) {
+        std::swap(mTerminalBuffers[pair.inId], mTerminalBuffers[pair.outId]);
+    }
+
+    return mPGParamAdapt->updatePALAndEncode(ipuParameters, mTerminalCount, mParamPayload);
+}
+
+int PGCommon::executePG()
+{
+    CheckError((!mCmd), INVALID_OPERATION, "%s, Command is invalid.", __func__);
+    CheckError((!mProcessGroup), INVALID_OPERATION, "%s, process group is invalid.", __func__);
+
+    ia_cipr_psys_get_command_config(mCmd, &mCmdCfg);
+    int bufferCount = ia_css_process_group_get_terminal_count(mProcessGroup);
+    mCmdCfg.id = mPGId;
+    mCmdCfg.priority = 1;
+    mCmdCfg.pg_params_buf = mPPG ? nullptr : mPGParamsBuffer;
+    mCmdCfg.pg_manifest_buf = mManifestBuffer;
+    mCmdCfg.pg = mPGBuffer;
+    mCmdCfg.ext_buf = mCmdExtBuffer;
+    mCmdCfg.bufcount = bufferCount;
+
+    for (int i = 0; i < bufferCount; i++) {
+        ia_css_terminal_t *terminal = ia_css_process_group_get_terminal(mProcessGroup, i);
+        CheckError(!terminal, UNKNOWN_ERROR, "failed to get terminal");
+        mCmdCfg.buffers[i] = mTerminalBuffers[terminal->tm_index];
+    }
+    if (mPPG) {
+         ia_css_process_group_set_token(mProcessGroup, mToken);
+    }
+
+    for (int fragIdx = 0; fragIdx < mFragmentCount; fragIdx++) {
+        int ret = ia_css_process_group_set_fragment_state(mProcessGroup, (uint16_t)fragIdx);
+        CheckError((ret != OK), ret, "%s, set fragment count %d fail %p", getName(), fragIdx, mProcessGroup);
+        ret = ia_css_process_group_set_fragment_limit(mProcessGroup, (uint16_t)(fragIdx + 1));
+        CheckError((ret != OK), ret, "%s, set fragment limit %d fail", getName(), fragIdx);
+
+        ret = handleCmd(mCmd, mCmdCfg);
+        CheckError((ret != OK), ret, "%s, call handleCmd fail", getName());
+    }
+
+    return OK;
+}
+
+int PGCommon::startPPG()
+{
+    // Get basic command config
+    ia_cipr_psys_command_config_t cmdCfg;
+    CLEAR(cmdCfg);
+    ia_cipr_psys_get_command_config(mPPGCmd[PPG_CMD_TYPE_START], &cmdCfg);
+
+    // Update config
+    cmdCfg.id = mPGId;
+    cmdCfg.priority = 1;
+    cmdCfg.pg_params_buf = mPPG ? nullptr : mPGParamsBuffer;
+    cmdCfg.pg_manifest_buf = mManifestBuffer;
+    cmdCfg.pg = mPPGBuffer;
+    cmdCfg.ext_buf = mPPGCmdExtBuffer[PPG_CMD_TYPE_START];
+    cmdCfg.bufcount = ia_css_process_group_get_terminal_count(mProcessGroup);
+    memset(cmdCfg.buffers, 0, sizeof(ia_cipr_buffer_t*) * cmdCfg.bufcount);
+    ia_css_process_group_set_fragment_state(mPPGProcessGroup, 0);
+    ia_css_process_group_set_fragment_limit(mPPGProcessGroup, 1);
+
+    int ret = handleCmd(mPPGCmd[PPG_CMD_TYPE_START], cmdCfg);
+    mToken = ia_css_process_group_get_token(mPPGProcessGroup);
+    return ret;
+}
+
+int PGCommon::stopPPG()
+{
+    ia_cipr_psys_command_config_t cmdCfg;
+
+    CLEAR(cmdCfg);
+    cmdCfg.bufcount = 0;
+    ia_cipr_psys_get_command_config(mPPGCmd[PPG_CMD_TYPE_STOP], &cmdCfg);
+
+    cmdCfg.id = mCmdCfg.id;
+    cmdCfg.priority = mCmdCfg.priority;
+    cmdCfg.pg_params_buf = mPPG ? nullptr : mCmdCfg.pg_params_buf;
+    cmdCfg.pg_manifest_buf = mCmdCfg.pg_manifest_buf;
+    cmdCfg.pg = mPPGBuffer;
+    cmdCfg.ext_buf = mPPGCmdExtBuffer[PPG_CMD_TYPE_STOP];
+    cmdCfg.bufcount = 0;
+    cmdCfg.buffers = nullptr;
+
+    int ret =  handleCmd(mPPGCmd[PPG_CMD_TYPE_STOP], cmdCfg);
+    return ret;
+}
+
+int PGCommon::handleCmd(ia_cipr_psys_command_t& cmd, ia_cipr_psys_command_config_t& cmdCfg)
+{
+    ia_cipr_psys_event_config_t eventCfg;
+    ia_cipr_psys_get_event_config(mEvent, &eventCfg);
+    cmdCfg.issue_id = (uint64_t)(cmd);
+    eventCfg.command_issue_id = cmdCfg.issue_id;
+
+    css_err_t ret = ia_cipr_psys_set_command_config(cmd, &cmdCfg);
+    CheckError((ret != css_err_none), UNKNOWN_ERROR, "%s, call ia_cipr_psys_set_command_config fail", __func__);
+
+    ret = ia_cipr_psys_get_command_config(cmd, &cmdCfg);
+    CheckError((ret != css_err_none), UNKNOWN_ERROR, "%s, call ia_cipr_psys_get_command_config fail", __func__);
+
+    ret = ia_cipr_psys_queue_command(mCtx, cmd);
+    CheckError((ret != css_err_none), UNKNOWN_ERROR, "%s, call ia_cipr_psys_queue_command fail %d", __func__, ret);
+
+    // Wait event
+    ret = ia_cipr_psys_wait_for_event(mCtx, mEvent);
+    CheckError((ret != css_err_none), UNKNOWN_ERROR, "%s, call wait_for_event fail, ret: %d", __func__, ret);
+
+    ret = ia_cipr_psys_get_event_config(mEvent, &eventCfg);
+    CheckError((ret != css_err_none), UNKNOWN_ERROR, "%s, call get_event_config fail, ret: %d", __func__, ret);
+    // Ignore the error in event config since it's not a fatal error.
+    if (eventCfg.error) {
+        LOGW("%s, event config error: %d", __func__, eventCfg.error);
+    }
+
+    //ia_cipr_psys_destroy_event(mEvent);
+
+    return (eventCfg.error == 0) ? OK : UNKNOWN_ERROR;
+}
+
+int PGCommon::getCapability()
+{
+    ia_cipr_psys_capability_t cap;
+    int ret = OK;
+    css_err_t err = ia_cipr_psys_get_capabilities(mCtx, &cap);
+    CheckError((err != css_err_none), UNKNOWN_ERROR, "Call ia_cipr_psys_get_capabilities fail, ret:%d", ret);
+
+    LOG1("%s: capability.version:%d", __func__, cap.version);
+    LOG1("%s: capability.driver:%s", __func__, cap.driver);
+    LOG1("%s: capability.dev_model:%s", __func__, cap.dev_model);
+    LOG1("%s: capability.program_group_count:%d", __func__, cap.program_group_count);
+    mPGCount = cap.program_group_count;
+
+    if (strncmp((char *)cap.dev_model, "ipu4p", 5) == 0) {
+        mPlatform = IA_P2P_PLATFORM_CNL_B0;
+        LOG1("%s: cnl/icl/ksl shared the same p2p platform id", __func__);
+    } else if (strncmp((char *)cap.dev_model, "ipu4", 4) == 0) {
+        switch (cap.dev_model[13]) {
+            case 'B':
+                 mPlatform = IA_P2P_PLATFORM_BXT_B0;
+                 break;
+            default:
+                 LOGE("%s: unsupported psys device model :%s", __func__, cap.dev_model);
+                 ret = BAD_VALUE;
+                 break;
+        }
+    } else if (strncmp((char *)cap.dev_model, "ipu6", 4) == 0) {
+        mPlatform = IA_P2P_PLATFORM_IPU6;
+        mPPG = true;
+    } else {
+        LOGE("%s: unsupported psys device model : %s", __func__, cap.dev_model);
+        ret = BAD_VALUE;
+    }
+
+    return ret;
+}
+
+int PGCommon::getManifest(int pgId)
+{
+    int i = 0;
+
+    for (; i < mPGCount; i++) {
+        ia_cipr_buffer_t* manifestBuffer = nullptr;
+        int programCount = 0;
+        int terminalCount = 0;
+        int programGroupId = 0;
+        int manifestSize = 0;
+        ia_css_kernel_bitmap_t kernelBitmap = ia_css_kernel_bitmap_clear();
+        uint32_t size = 0;
+
+        css_err_t ret = ia_cipr_psys_get_manifest(mCtx, i, &size, nullptr);
+        if (ret != css_err_none) continue;
+        CheckError((size == 0), UNKNOWN_ERROR, "%s, the manifest size is 0", __func__);
+
+        manifestBuffer = createUserPtrCiprBuffer(size);
+        CheckError(!manifestBuffer, NO_MEMORY, "%s, call createUserPtrCiprBuffer fail", __func__);
+
+        void* manifest = getCiprBufferPtr(manifestBuffer);
+
+        ret = ia_cipr_psys_get_manifest(mCtx, i, &size, manifest);
+        if (ret != css_err_none) {
+            LOGE("%s, call ia_cipr_psys_get_manifest fail", __func__);
+            ia_cipr_buffer_destroy(manifestBuffer);
+            return UNKNOWN_ERROR;
+        }
+
+        LOG1("%s: pg index: %d, manifest size: %u", __func__, i, size);
+        const ia_css_program_group_manifest_t *mf = (const ia_css_program_group_manifest_t*)manifest;
+        programCount = ia_css_program_group_manifest_get_program_count(mf);
+        terminalCount = ia_css_program_group_manifest_get_terminal_count(mf);
+        programGroupId = ia_css_program_group_manifest_get_program_group_ID(mf);
+        manifestSize = ia_css_program_group_manifest_get_size(mf);
+        kernelBitmap = ia_css_program_group_manifest_get_kernel_bitmap(mf);
+
+        LOG1("%s: pgIndex: %d, programGroupId: %d, manifestSize: %d, programCount: %d, terminalCount: %d",
+             __func__, i, programGroupId, manifestSize, programCount, terminalCount);
+
+        if (pgId == programGroupId) {
+            mProgramCount = programCount;
+            mTerminalCount = terminalCount;
+            mManifestSize = manifestSize;
+            mKernelBitmap = kernelBitmap;
+            mManifestBuffer = manifestBuffer;
+            break;
+        }
+
+        ia_cipr_buffer_destroy(manifestBuffer);
+    }
+
+    CheckError((i == mPGCount), BAD_VALUE, "%s, Can't found available pg: %d", __func__, pgId);
+
+    return OK;
+}
+
+ia_cipr_buffer_t* PGCommon::createDMACiprBuffer(int size, int fd)
+{
+    uint32_t deviceFlags = IA_CIPR_MEMORY_HANDLE | IA_CIPR_MEMORY_NO_FLUSH;
+
+    ia_cipr_memory_t mem;
+    mem.size = size;
+    mem.flags = IA_CIPR_MEMORY_HANDLE | IA_CIPR_MEMORY_HW_ONLY;
+    mem.handle = fd;
+    mem.cpu_ptr = nullptr;
+    mem.anchor = nullptr;
+    ia_cipr_buffer_t* buf = ia_cipr_buffer_create(size, mem.flags | deviceFlags, &mem);
+    CheckError(!buf, nullptr, "%s, call ia_cipr_buffer_create fail", __func__);
+
+    css_err_t ret = ia_cipr_memory_device_migrate_buffer(mMemoryDevice, buf);
+    if (ret != css_err_none) {
+        LOGE("%s, call ia_cipr_memory_device_migrate_buffer fail", __func__);
+        ia_cipr_buffer_destroy(buf);
+        return nullptr;
+    }
+
+    return buf;
+}
+
+ia_cipr_buffer_t* PGCommon::createUserPtrCiprBuffer(int size, void* ptr)
+{
+    ia_cipr_buffer_t* buf = nullptr;
+    if (ptr == nullptr) {
+        buf = ia_cipr_buffer_create(size, IA_CIPR_MEMORY_ALLOCATE_CPU_PTR, nullptr);
+    } else {
+        ia_cipr_memory_t mem;
+        mem.size = size;
+        mem.flags = IA_CIPR_MEMORY_CPU_PTR;
+        mem.handle = 0;
+        mem.cpu_ptr = ptr;
+        mem.anchor = nullptr;
+        buf = ia_cipr_buffer_create(size, IA_CIPR_MEMORY_CPU_PTR, &mem);
+    }
+
+    CheckError(!buf, nullptr, "%s, call ia_cipr_buffer_create fail", __func__);
+
+    css_err_t ret = ia_cipr_memory_device_migrate_buffer(mMemoryDevice, buf);
+    if (ret != css_err_none) {
+        LOGE("%s, call ia_cipr_memory_device_migrate_buffer fail", __func__);
+        ia_cipr_buffer_destroy(buf);
+        return nullptr;
+    }
+
+    return buf;
+}
+
+void* PGCommon::getCiprBufferPtr(ia_cipr_buffer_t* buffer)
+{
+    CheckError(!buffer, nullptr, "%s, invalid cipr buffer", __func__);
+
+    ia_cipr_memory_t memory;
+
+    css_err_t ret = ia_cipr_buffer_get_memory(buffer, &memory);
+    CheckError((ret != css_err_none), nullptr, "%s, call ia_cipr_buffer_get_memory fail", __func__);
+
+    return memory.cpu_ptr;
+}
+
+int PGCommon::getCiprBufferSize(ia_cipr_buffer_t* buffer)
+{
+    CheckError(!buffer, BAD_VALUE, "%s, invalid cipr buffer", __func__);
+
+    ia_cipr_memory_t memory;
+
+    css_err_t ret = ia_cipr_buffer_get_memory(buffer, &memory);
+    CheckError((ret != css_err_none), NO_MEMORY, "%s, call ia_cipr_buffer_get_memory fail", __func__);
+
+    return memory.size;
+}
+
+ia_cipr_buffer_t* PGCommon::registerUserBuffer(int size, void* ptr)
+{
+    CheckError((size <= 0 || ptr == nullptr), nullptr, "Invalid parameter: size=%d, ptr=%p", size, ptr);
+
+    for (auto& item : mBuffers) {
+        if (ptr == item.userPtr) {
+            return item.ciprBuf;
+        }
+    }
+
+    ia_cipr_buffer_t* ciprBuf = createUserPtrCiprBuffer(size, ptr);
+    CheckError(!ciprBuf, nullptr, "Create cipr buffer for %p failed", ptr);
+
+    CiprBufferMapping bufMap;
+    bufMap.userPtr = ptr;
+    bufMap.ciprBuf = ciprBuf;
+    mBuffers.push_back(bufMap);
+
+    return ciprBuf;
+}
+
+ia_cipr_buffer_t* PGCommon::registerUserBuffer(int size, int fd)
+{
+    CheckError((size <= 0 || fd < 0), nullptr, "Invalid parameter: size: %d, fd: %d", size, fd);
+
+    for (auto& item : mBuffers) {
+        if (fd == item.userFd) {
+            return item.ciprBuf;
+        }
+    }
+
+    ia_cipr_buffer_t* ciprBuf = createDMACiprBuffer(size, fd);
+    CheckError(!ciprBuf, nullptr, "Create cipr buffer for fd %d failed", fd);
+
+    CiprBufferMapping bufMap;
+    bufMap.userFd = fd;
+    bufMap.ciprBuf = ciprBuf;
+    mBuffers.push_back(bufMap);
+
+    return ciprBuf;
+}
+
+void PGCommon::dumpTerminalPyldAndDesc(int pgId, long sequence, ia_css_process_group_t* pgGroup)
+{
+    if (!CameraDump::isDumpTypeEnable(DUMP_PSYS_PG)) return;
+
+    char fileName[MAX_NAME_LEN] = {'\0'};
+    uint32_t pgSize = ia_css_process_group_get_size(pgGroup);
+    snprintf(fileName, (MAX_NAME_LEN - 1), "hal_pg_%d_%ld.bin", pgId, sequence);
+
+    FILE *fp = fopen (fileName, "w+");
+    CheckError(fp == nullptr, VOID_VALUE, "open dump file %s failed", fileName);
+    const unsigned int* printPtr = (const unsigned int*)pgGroup;
+    fprintf(fp, "::pg dump size %d(0x%x)\n", pgSize, pgSize);
+    for (unsigned int i = 0; i < pgSize / sizeof(*printPtr); i++) {
+        fprintf(fp, "%08x\n", printPtr[i]);
+    }
+
+    int terminalCount = ia_css_process_group_get_terminal_count(pgGroup);
+    for (int i = 0; i < terminalCount; i++) {
+        ia_css_terminal_t *terminal = ia_css_process_group_get_terminal(pgGroup, i);
+        CheckError(!terminal, VOID_VALUE, "failed to get terminal");
+        if (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN
+            || terminal->terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) {
+            continue;
+        }
+
+        void* ptr = getCiprBufferPtr(mTerminalBuffers[terminal->tm_index]);
+        int size = getCiprBufferSize(mTerminalBuffers[terminal->tm_index]);
+        const char* typeStr = (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ? "DATA_IN"
+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) ? "DATA_OUT"
+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_STREAM) ? "PARAM_STREAM"
+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN) ? "CACHED_IN"
+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) ? "CACHED_OUT"
+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ? "SPATIAL_IN"
+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT) ? "SPATIAL_OUT"
+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN) ? "SLICED_IN"
+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT) ? "SLICED_OU"
+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_STATE_IN) ? "STATE_IN"
+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_STATE_OUT) ? "STATE_OUT"
+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM) ? "PROGRAM"
+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) ? "PROGRAM_CONTROL_INIT"
+                            :                                                             "UNKNOWN";
+        printPtr = (const unsigned int*)ptr;
+        fprintf(fp, "::terminal %d dump size %d(0x%x), line %d, type %s\n", terminal->tm_index, size, size, PAGE_ALIGN(size)/4, typeStr);
+        for (unsigned int i = 0; i < PAGE_ALIGN(size) / sizeof(*printPtr); i++) {
+            fprintf(fp, "%08x\n", printPtr[i]);
+        }
+    }
+
+    fclose (fp);
+}
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.h b/camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.h
new file mode 100644
index 000000000000..5cc588ece333
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.h
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+extern "C" {
+#include <ia_css_psys_program_group_manifest.h>
+#include <ia_css_psys_terminal_manifest.h>
+#include <ia_css_program_group_data.h>
+#include <ia_css_program_group_param.h>
+#include <ia_css_psys_process_group.h>
+#include <ia_css_psys_terminal.h>
+#include <ia_css_terminal_types.h>
+#include <ia_css_terminal_manifest_types.h>
+#include <ia_css_psysapi_fw_version.h>
+}
+
+#include <vector>
+
+#ifdef ENABLE_SANDBOXING
+#include "modules/sandboxing/client/IntelPGParam.h"
+#else
+#include "modules/algowrapper/IntelPGParam.h"
+#endif
+#include "IspParamAdaptor.h"
+#include "BufferQueue.h"
+#include "PGUtils.h"
+#include "modules/ia_cipr/include/ia_cipr_psys.h"
+#include "modules/ia_cipr/include/ia_cipr_alloc.h"
+#include "modules/ia_cipr/include/ia_cipr_memory.h"
+
+namespace icamera {
+
+typedef std::map<ia_uid, FrameInfo> TerminalFrameInfoMap;
+typedef std::map<ia_uid, std::shared_ptr<CameraBuffer>> CameraBufferMap;
+
+#define FRAGMENT_OVERLAP 64
+
+/**
+ * \class PGCommon
+ *
+ * \brief This is a version PG implementation which is used to config and run PG.
+ *
+ * The call sequence as follows:
+ * 1. init();
+ * 2. setInputInfo();setOutputInfo();
+ * 3. setDisabledTerminals();
+ * 4. prepare():
+ *          configTerminalFormat();
+ *          calcFragmentCount();
+ *          handlePGParams();
+ *          setKernelBitMap();
+ *          setTerminalParams();
+ *          allocatePGBuffer();
+ *          setPGAndPrepareProgram();
+ *          configureFragmentDesc();
+ * 5. loop frame: iterate():
+ *          encodeTerminals();
+ *          handleCmd();
+ *          handleEvent();
+ *          decode();
+ * 6. deInit();
+ */
+class PGCommon {
+public:
+    static int getFrameSize(int format, int width, int height,
+                            bool needAlignedHeight = false, bool needExtraSize = true, bool needCompression = false);
+
+    PGCommon(int pgId, const std::string& pgName, ia_uid terminalBaseUid = 0);
+    virtual ~PGCommon();
+
+    /**
+     * allocate memory for some variables.
+     */
+    int init();
+
+    /**
+     * recycle memory.
+     */
+    void deInit();
+
+    /**
+     * set the input buffers info for terminals.
+     * use ia_fourcc
+     */
+    virtual void setInputInfo(const TerminalFrameInfoMap& inputInfos);
+
+    /**
+     * set the output buffers info for terminals.
+     * use ia_fourcc
+     */
+    virtual void setOutputInfo(const TerminalFrameInfoMap& outputInfos);
+
+    /**
+     * set the disabled terminals. Called before prepare()
+     */
+    virtual void setDisabledTerminals(const std::vector<ia_uid>& disabledTerminals);
+
+    /**
+     * set routing bitmap. Called before prepare()
+     */
+    virtual void setRoutingBitmap(const void* rbm, uint32_t bytes);
+
+    /**
+     * config the data terminals, init, config and prepare p2p, create process group.
+     */
+    virtual int prepare(IspParamAdaptor* adaptor, int streamId = -1);
+
+    /**
+     * run p2p to encode the params terminals, execute the PG and run p2p to decode the statistic terminals.
+     */
+    virtual int iterate(CameraBufferMap &inBufs, CameraBufferMap &outBufs,
+                        ia_binary_data *statistics, const ia_binary_data *ipuParameters);
+
+    const char* getName() { return mName.c_str(); }
+private:
+    DISALLOW_COPY_AND_ASSIGN(PGCommon);
+
+protected:
+    int getCapability();
+    int getManifest(int pgId);
+
+    // PG parameters intialization, for prepare()
+    virtual int configTerminalFormat();
+    int initParamAdapt();
+    virtual int calcFragmentCount(int overlap = FRAGMENT_OVERLAP);
+    int handlePGParams(const ia_css_frame_format_type* frameFormatTypes);
+    int setKernelBitMap();
+    virtual int setTerminalParams(const ia_css_frame_format_type* frameFormatTypes);
+    virtual int configureFragmentDesc();
+    int configureTerminalFragmentDesc(int termIdx, const ia_p2p_fragment_desc* srcDesc);
+    ia_css_process_group_t* createPG(ia_cipr_buffer_t*& pgBuffer);
+    int createCommands();
+    int createCommand(ia_cipr_buffer_t* pg, ia_cipr_psys_command_t& cmd, ia_cipr_buffer_t*& extBuffer, int bufCount);
+    void destoryCommands();
+    int preparePayloadBuffers();
+
+    // For iteration
+    virtual int prepareTerminalBuffers(const ia_binary_data *ipuParameters,
+                                       const CameraBufferMap& inBufs,
+                                       const CameraBufferMap& outBufs);
+    int executePG();
+    int startPPG();
+    int stopPPG();
+    int handleCmd(ia_cipr_psys_command_t& cmd, ia_cipr_psys_command_config_t& cmdCfg);
+
+    // Memory helper
+    ia_cipr_buffer_t* createDMACiprBuffer(int size, int fd);
+    ia_cipr_buffer_t* createUserPtrCiprBuffer(int size, void* ptr = nullptr);
+    void* getCiprBufferPtr(ia_cipr_buffer_t* buffer);
+    ia_cipr_buffer_t* registerUserBuffer(int size, void* ptr);
+    ia_cipr_buffer_t* registerUserBuffer(int size, int fd);
+    int getCiprBufferSize(ia_cipr_buffer_t* buffer);
+    void dumpTerminalPyldAndDesc(int pgId, long sequence, ia_css_process_group_t* pgGroup);
+
+protected:
+    enum PPGCommandType {
+        PPG_CMD_TYPE_START = 0,
+        PPG_CMD_TYPE_STOP,
+        PPG_CMD_TYPE_COUNT
+    };
+
+    struct CiprBufferMapping {
+        CiprBufferMapping() {}
+        void* userPtr = nullptr;
+        int userFd = -1;
+        ia_cipr_buffer_t* baseCiprBuf = nullptr;
+        ia_cipr_buffer_t* ciprBuf = nullptr;
+    };
+
+    static const int kEventTimeout = 8000;
+
+    ia_cipr_psys_context_t mCtx;
+    ia_cipr_memory_device_t* mMemoryDevice;
+    ia_cipr_buffer_t* mManifestBuffer;
+    ia_cipr_buffer_t* mPGParamsBuffer;
+    std::unique_ptr<IntelPGParam> mPGParamAdapt;
+
+    int mPGId;
+    std::string mName;  // For debug
+    ia_uid mTerminalBaseUid;
+    int mPGCount;
+    ia_p2p_platform_t mPlatform;
+    int mProgramCount;
+    int mTerminalCount;
+    int mManifestSize;
+    ia_css_kernel_bitmap_t mKernelBitmap;
+    std::unique_ptr<ia_css_rbm_t> mRoutingBitmap;
+    int mFragmentCount;
+    std::unique_ptr<uint8_t[]> mPgTerminals; // save terminal num in PG for each terminal
+    std::unique_ptr<ia_css_frame_format_type[]> mFrameFormatType;
+    std::vector<int> mDisableDataTermials;
+
+    ia_binary_data __attribute__ ((aligned (PG_PAGE_SIZE))) mParamPayload[IPU_MAX_TERMINAL_COUNT];
+
+    ia_cipr_buffer_t* mPGBuffer;
+    ia_css_process_group_t* mProcessGroup;
+    ia_cipr_psys_command_t mCmd;
+    ia_cipr_buffer_t* mCmdExtBuffer;
+
+    bool mPPG;
+    bool mPPGStarted;
+    ia_cipr_buffer_t* mPPGBuffer;
+    ia_css_process_group_t* mPPGProcessGroup;
+    ia_cipr_psys_command_t mPPGCmd[PPG_CMD_TYPE_COUNT];
+    ia_cipr_buffer_t* mPPGCmdExtBuffer[PPG_CMD_TYPE_COUNT];
+    uint64_t mToken;
+
+    ia_cipr_psys_command_config_t mCmdCfg;
+    ia_cipr_psys_event_t mEvent;
+
+    ia_cipr_buffer_t** mTerminalBuffers;
+    std::map<int, FrameInfo> mTerminalFrameInfos; // valid for data terminals only
+    int mInputMainTerminal;
+    int mOutputMainTerminal;
+
+    std::vector<CiprBufferMapping> mBuffers;
+
+    TerminalPair mTnrTerminalPair;
+    uint8_t* mTnrBuffers[TNR_BUFFER_COUNT];
+
+    std::vector<TerminalPair> mDvsTerminalPairs;
+};
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.cpp b/camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.cpp
new file mode 100644
index 000000000000..eb34b1a3ab66
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.cpp
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "PGUtils"
+
+#include <stdint.h>
+
+#include <vector>
+
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+
+#include "PGUtils.h"
+
+namespace icamera {
+
+namespace PGUtils {
+
+/* ************************************************************
+ * Common definitions
+ * ***********************************************************/
+
+#define GET_FOURCC_FMT(a, b, c, d) ((uint32_t)(d) | ((uint32_t)(c) << 8) \
+                                 | ((uint32_t)(b) << 16) | ((uint32_t)(a) << 24))
+
+struct FormatMap {
+    int v4l2Fmt;
+    ia_css_frame_format_type cssFmt;
+
+    int cssBpp;
+};
+
+static const FormatMap sFormatMapping[] = {
+    { V4L2_PIX_FMT_YUYV,   IA_CSS_DATA_FORMAT_YUYV, 12 },
+    { V4L2_PIX_FMT_UYVY,   IA_CSS_DATA_FORMAT_UYVY, 12 },
+    { V4L2_PIX_FMT_YUV420, IA_CSS_DATA_FORMAT_YUV420, 16 },
+    { V4L2_PIX_FMT_NV12,   IA_CSS_DATA_FORMAT_NV12, 8 },
+    { V4L2_PIX_FMT_NV16,   IA_CSS_DATA_FORMAT_NV16, 12 },
+    { V4L2_PIX_FMT_RGB565, IA_CSS_DATA_FORMAT_RGB565, 16 },
+    { V4L2_PIX_FMT_RGB24,  IA_CSS_DATA_FORMAT_RGB888, 24 },
+    { V4L2_PIX_FMT_RGB32,  IA_CSS_DATA_FORMAT_RGBA888, 24 },
+    { V4L2_PIX_FMT_SGRBG12, IA_CSS_DATA_FORMAT_RAW, 16 },
+    { V4L2_PIX_FMT_SGRBG10, IA_CSS_DATA_FORMAT_RAW, 16 }, // IA_CSS_DATA_FORMAT_BAYER_GRBG or IA_CSS_DATA_FORMAT_RAW ?
+
+    { GET_FOURCC_FMT('Y', 'U', 'Y', 'V'), IA_CSS_DATA_FORMAT_YUYV, 12 },
+    { GET_FOURCC_FMT('U', 'Y', 'V', 'Y'), IA_CSS_DATA_FORMAT_UYVY, 12 },
+    { GET_FOURCC_FMT('Y', 'U', '1', '2'), IA_CSS_DATA_FORMAT_YUV420, 16 },
+    { GET_FOURCC_FMT('N', 'V', '1', '2'), IA_CSS_DATA_FORMAT_NV12, 8 },
+    { GET_FOURCC_FMT('N', 'V', '1', '6'), IA_CSS_DATA_FORMAT_NV16, 12 },
+    { GET_FOURCC_FMT('R', 'G', 'B', 'P'), IA_CSS_DATA_FORMAT_RGB565, 16 },
+    { GET_FOURCC_FMT('R', 'G', 'B', '3'), IA_CSS_DATA_FORMAT_RGB888, 24 },
+    { GET_FOURCC_FMT('R', 'G', 'B', '4'), IA_CSS_DATA_FORMAT_RGBA888, 24 },
+    { GET_FOURCC_FMT('B', 'A', '1', '2'), IA_CSS_DATA_FORMAT_RAW, 16 },
+    { GET_FOURCC_FMT('B', 'A', '1', '0'), IA_CSS_DATA_FORMAT_RAW, 16 }, // IA_CSS_DATA_FORMAT_BAYER_GRBG or IA_CSS_DATA_FORMAT_RAW ?
+    { GET_FOURCC_FMT('y', '0', '3', '2'), IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED, 16 },
+    { GET_FOURCC_FMT('V', '4', '2', '0'), IA_CSS_DATA_FORMAT_YUV420, 16 },
+    { GET_FOURCC_FMT('b','V','0','K'),    IA_CSS_DATA_FORMAT_BAYER_VECTORIZED, 16 },
+    { GET_FOURCC_FMT('C','S','L','6'),    IA_CSS_DATA_FORMAT_BAYER_LINE_INTERLEAVED, 16},
+    { GET_FOURCC_FMT('G','R','1','0'),    IA_CSS_DATA_FORMAT_BAYER_GRBG, 16 },
+    { GET_FOURCC_FMT('I','Y','U','V'),    IA_CSS_DATA_FORMAT_YUV420, 8 },
+};
+
+static int getStride(int cssFmt, int width);
+
+ia_css_frame_format_type getCssFmt(int v4l2Fmt) {
+    int size = ARRAY_SIZE(sFormatMapping);
+    for (int i = 0; i < size; i++) {
+        if (sFormatMapping[i].v4l2Fmt == v4l2Fmt) {
+            return sFormatMapping[i].cssFmt;
+        }
+    }
+
+    LOG2("%s: unsupported v4l2 pixel format: %s", __func__,
+         CameraUtils::format2string(v4l2Fmt).c_str());
+    return IA_CSS_N_FRAME_FORMAT_TYPES;
+}
+
+int getCssStride(int v4l2Fmt, int width) {
+    int stride = width;
+    ia_css_frame_format_type cssFmt = getCssFmt(v4l2Fmt);
+    switch (v4l2Fmt) {
+        case GET_FOURCC_FMT('I','Y','U','V'):
+            stride = width;
+            break;
+        default:
+            stride = getStride(cssFmt, width);
+            break;
+    }
+    return stride;
+}
+
+int getCssBpp(int v4l2Fmt) {
+    int size = ARRAY_SIZE(sFormatMapping);
+    for (int i = 0; i < size; i++) {
+        if (sFormatMapping[i].v4l2Fmt == v4l2Fmt) {
+            return sFormatMapping[i].cssBpp;
+        }
+    }
+
+    LOG2("%s: unsupported v4l2 pixel format: 0x%x", __func__, v4l2Fmt);
+    return 8;
+}
+
+int getStride(int cssFmt, int width) {
+    int stride = width;
+    switch (cssFmt) {
+        case IA_CSS_DATA_FORMAT_BAYER_GRBG: // GR10
+        case IA_CSS_DATA_FORMAT_RAW:        // BA10
+            stride = ALIGN_64(width * 2);
+            break;
+        case IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED: // y032
+            stride = width * 6;
+            break;
+        case IA_CSS_DATA_FORMAT_BAYER_VECTORIZED: // bv0k
+        case IA_CSS_DATA_FORMAT_BAYER_LINE_INTERLEAVED: // css_fourcc_grbg_12_li
+            stride = width * 4;
+            stride = ALIGN_64(stride);
+            break;
+        case IA_CSS_DATA_FORMAT_YUV420:
+            stride = width * 2;
+            stride = ALIGN_64(stride);
+            break;
+        case IA_CSS_DATA_FORMAT_NV12:
+            stride = width;
+            break;
+        default:
+            LOG2("TODO for format: %d", cssFmt);
+            break;
+    }
+    return stride;
+}
+
+/* ************************************************************
+ * Difference between PGs
+ * ***********************************************************/
+#define PG_PSYS_IPU6_ISA_LB 187
+#define PG_PSYS_IPU6_BB 189
+#define PG_PSYS_IPU6_ISL 198
+
+// the below terminals belong to PG_PSYS_IPU6_BB
+#define PG_BB_TERMINAL_ID_TNR_REF_IN 4 // data_terminal
+#define PG_BB_TERMINAL_ID_TNR_REF_OUT 6 // data_terminal
+
+// the below terminals belong to PG_PSYS_IPU6_ISA_LB
+#define ISA_LB_TERMINAL_ID_DVS_FE_IN_L0 21 // program_terminal
+#define ISA_LB_TERMINAL_ID_DVS_FE_IN_L1 22 // program_terminal
+#define ISA_LB_TERMINAL_ID_DVS_FE_IN_L2 23 // program_terminal
+#define ISA_LB_TERMINAL_ID_DVS_FE_OUT_L0 24 // param_terminal
+#define ISA_LB_TERMINAL_ID_DVS_FE_OUT_L1 25 // param_terminal
+#define ISA_LB_TERMINAL_ID_DVS_FE_OUT_L2 26 // param_terminal
+
+bool getTerminalPairs(int pgId, TERMINAL_PAIR_TYPE type, std::vector<TerminalPair>* pairs) {
+    LOG2("@%s, pgId:%d, type:%d, pairs:%p", __func__, pgId, type, pairs);
+    CheckError(!pairs, false, "@%s, pairs is nullptr", __func__);
+
+    struct TerminalPairs {
+        int pgId;
+        TERMINAL_PAIR_TYPE type;
+        std::vector<TerminalPair> pairs;
+    };
+    static const TerminalPairs tps[] = {
+        {PG_PSYS_IPU6_BB, TERMINAL_PAIR_TNR,
+         {{PG_BB_TERMINAL_ID_TNR_REF_IN, PG_BB_TERMINAL_ID_TNR_REF_OUT}}},
+        {PG_PSYS_IPU6_ISA_LB, TERMINAL_PAIR_DVS,
+         {{ISA_LB_TERMINAL_ID_DVS_FE_IN_L0, ISA_LB_TERMINAL_ID_DVS_FE_OUT_L0},
+          {ISA_LB_TERMINAL_ID_DVS_FE_IN_L1, ISA_LB_TERMINAL_ID_DVS_FE_OUT_L1},
+          {ISA_LB_TERMINAL_ID_DVS_FE_IN_L2, ISA_LB_TERMINAL_ID_DVS_FE_OUT_L2}}}
+    };
+
+    for (unsigned int i = 0; i < ARRAY_SIZE(tps); i++) {
+        if (tps[i].pgId == pgId && tps[i].type == type) {
+            *pairs = tps[i].pairs;
+            return true;
+        }
+    }
+
+    return false;
+}
+
+} // name space PGUtils
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.h b/camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.h
new file mode 100644
index 000000000000..7e8ccfce6b99
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.h
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+extern "C" {
+#include <ia_css_program_group_data.h>
+#include <ia_css_psys_program_group_manifest.h>
+#include <ia_css_psys_process_group.h>
+
+#include <ia_p2p.h>
+}
+
+#include <vector>
+
+namespace icamera {
+#define PG_PAGE_SIZE 4096
+#define PSYS_MAX_KERNELS_PER_PG IA_CSS_KERNEL_BITMAP_BITS
+#define IPU_MAX_TERMINAL_COUNT 40
+
+struct PgFrameDesc {
+    PgFrameDesc() {
+        width = 0;
+        height = 0;
+        bpe = 0;
+    }
+    int width;
+    int height;
+    int bpe;
+};
+
+struct PgConfiguration {
+    ia_css_program_group_manifest_t* pgManifest;
+    int pgManifestSize;
+    std::vector<int> disableDataTermials;
+    uint8_t fragmentCount;
+
+    // New API, for desc calculation by itself, instead of fragmentDesc
+    PgFrameDesc inputMainFrame;
+    PgFrameDesc outputMainFrame;
+};
+
+enum {
+    TNR_BUFFER_IN_INDEX = 0,
+    TNR_BUFFER_OUT_INDEX
+};
+#define TNR_BUFFER_COUNT (TNR_BUFFER_OUT_INDEX + 1)
+
+struct TerminalPair {
+    int inId;
+    int outId;
+};
+
+namespace PGUtils {
+/* ************************************************************
+ * Common definitions
+ * ***********************************************************/
+
+ia_css_frame_format_type getCssFmt(int v4l2Fmt);
+int getCssBpp(int v4l2Fmt);
+int getCssStride(int v4l2Fmt, int width);
+
+/* ************************************************************
+ * Difference between PGs
+ * ***********************************************************/
+enum TERMINAL_PAIR_TYPE {
+    TERMINAL_PAIR_TNR,
+    TERMINAL_PAIR_DVS
+};
+
+bool getTerminalPairs(int pgId, TERMINAL_PAIR_TYPE type, std::vector<TerminalPair>* pairs);
+} // name space PGUtils
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.cpp b/camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.cpp
new file mode 100644
index 000000000000..2dbd1429f521
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.cpp
@@ -0,0 +1,669 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "PSysDAG"
+
+#include <algorithm>
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+#include "PSysDAG.h"
+
+namespace icamera {
+PSysDAG::PSysDAG(int cameraId, PSysDagCallback* psysDagCB) :
+    mCameraId(cameraId),
+    mPSysDagCB(psysDagCB),
+    mConfigMode(CAMERA_STREAM_CONFIGURATION_MODE_AUTO),
+    mTuningMode(TUNING_MODE_MAX),
+    mDefaultMainInputPort(MAIN_PORT)
+{
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+
+    CLEAR(mOngoingSequence);
+    mPolicyManager = new PolicyManager(mCameraId);
+    mIspParamAdaptor = new IspParamAdaptor(mCameraId, PG_PARAM_PSYS_ISA);
+}
+
+PSysDAG::~PSysDAG()
+{
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+
+    releasePipeExecutors();
+
+    mIspParamAdaptor->deinit();
+    delete mIspParamAdaptor;
+    delete mPolicyManager;
+}
+
+void PSysDAG::setFrameInfo(const std::map<Port, stream_t>& inputInfo,
+                           const std::map<Port, stream_t>& outputInfo) {
+    mInputFrameInfo = inputInfo;
+    mOutputFrameInfo = outputInfo;
+
+    mDefaultMainInputPort = inputInfo.begin()->first;
+    // Select default main input port in priority
+    Port availablePorts[] = {MAIN_PORT, SECOND_PORT, THIRD_PORT, FORTH_PORT, INVALID_PORT};
+    for (unsigned int i = 0; i < ARRAY_SIZE(availablePorts); i++) {
+        if (mInputFrameInfo.find(availablePorts[i]) != mInputFrameInfo.end()) {
+            mDefaultMainInputPort = availablePorts[i];
+            break;
+        }
+    }
+}
+
+void PSysDAG::releasePipeExecutors()
+{
+    for (auto &executor : mExecutorsPool) {
+        delete executor;
+    }
+    mExecutorsPool.clear();
+    mExecutorStreamIds.clear();
+}
+
+/*
+ * According to the policy config to create the executors,
+ * and use the graph config data to configure the executors.
+ */
+int PSysDAG::createPipeExecutors()
+{
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+
+    releasePipeExecutors();
+
+    // initialize the sequence list to -1
+    for (int i = 0; i < MAX_BUFFER_COUNT; i++) {
+        mOngoingSequence[i] = -1;
+    }
+
+    IGraphConfigManager *GCM = IGraphConfigManager::getInstance(mCameraId);
+    CheckError(!GCM, UNKNOWN_ERROR, "Failed to get GC manager in PSysDAG!");
+
+    std::shared_ptr<IGraphConfig> gc = GCM->getGraphConfig(mConfigMode);
+    CheckError(!gc, UNKNOWN_ERROR, "Failed to get GraphConfig in PSysDAG!");
+
+    int graphId = gc->getGraphId();
+    PolicyConfig* cfg = PlatformData::getExecutorPolicyConfig(graphId);
+    CheckError(!cfg, UNKNOWN_ERROR, "Failed to get PolicyConfig in PSysDAG!");
+
+    std::vector<std::string> pgNames;
+    gc->getPgNames(&pgNames);
+    bool hasVideoPipe = false, hasStillPipe = false;
+
+    for (auto &item : cfg->pipeExecutorVec) {
+        int streamId = -1;
+        bool pgFound = true;
+
+        // Not support multiple streamId in one executor,
+        // so need to the check the streamId of pgList.
+        for (auto &pgName : item.pgList) {
+            if (std::find(pgNames.begin(), pgNames.end(), pgName.c_str()) == pgNames.end()) {
+                pgFound = false;
+                break;
+            }
+            int tmpId = gc->getStreamIdByPgName(pgName);
+            CheckError(tmpId == -1, BAD_VALUE, "Cannot get streamId for %s", pgName.c_str());
+            CheckError(((streamId != -1) && (tmpId != streamId)), BAD_VALUE,
+                    "the streamId: %d for pgName(%s) is different with previous: %d",
+                    tmpId, pgName.c_str(), streamId);
+            streamId = tmpId;
+            LOG1("%s executor:%s pg name:%s streamId: %d",
+                  __func__, item.exeName.c_str(), pgName.c_str(), streamId);
+        }
+        if (!pgFound)
+            continue;
+
+        if (!hasVideoPipe)
+            hasVideoPipe = (streamId == VIDEO_STREAM_ID);
+        if (!hasStillPipe)
+            hasStillPipe = (streamId == STILL_STREAM_ID);
+
+        PipeExecutor *executor = new PipeExecutor(mCameraId, item, cfg->exclusivePgs, this, gc);
+        executor->setIspParamAdaptor(mIspParamAdaptor);
+        executor->setStreamId(streamId);
+        executor->setPolicyManager(mPolicyManager);
+        executor->setNotifyPolicy(item.notifyPolicy);
+
+        int ret = executor->initPipe();
+        if (ret != OK) {
+            LOGE("Failed to create pipe for executor:%s", executor->getName());
+            delete executor;
+            return ret;
+        }
+
+        mExecutorsPool.push_back(executor);
+        mExecutorStreamIds[executor] = streamId;
+    }
+
+    LOG2("%s, hasVideoPipe: %d, hasStillPipe: %d, enableBundleInSdv: %d",
+         __func__, hasVideoPipe, hasStillPipe, cfg->enableBundleInSdv);
+    if (hasStillPipe && hasVideoPipe && !cfg->enableBundleInSdv) return OK;
+
+    for (auto &bundle : cfg->bundledExecutorDepths) {
+        bool foundExecutor = true;
+        for (auto &executor : bundle.bundledExecutors) {
+            std::vector<PipeExecutor*>::iterator it = std::find_if(mExecutorsPool.begin(),
+                    mExecutorsPool.end(), [executor](PipeExecutor* exec) {
+                        return exec->getName() == executor;
+                    });
+            if (it == mExecutorsPool.end()) {
+                foundExecutor = false;
+                break;
+            }
+        }
+
+        if (foundExecutor)
+            mPolicyManager->addExecutorBundle(bundle.bundledExecutors, bundle.depths);
+    }
+
+    return OK;
+}
+
+int PSysDAG::linkAndConfigExecutors()
+{
+    for (auto& consumer : mExecutorsPool) {
+        std::map<ia_uid, Port> input;
+
+        if (consumer->isInputEdge()) {
+            // Use its own input info due to no executor as producer
+            consumer->getInputTerminalPorts(input);
+        } else {
+            PipeExecutor* producer = findExecutorProducer(consumer);
+            CheckError(producer == nullptr, BAD_VALUE, "no producer for executor %s!", consumer->getName());
+            producer->getOutputTerminalPorts(input);
+
+            consumer->setBufferProducer(producer);
+            LOG1("%s: link consumer %s to %s", __func__, consumer->getName(), producer->getName());
+        }
+
+        // Link producer (output) to consumer (input) by terminal
+        consumer->setInputTerminals(input);
+
+        std::vector<ConfigMode> configModes;
+        configModes.push_back(mConfigMode);
+        consumer->configure(configModes);
+    }
+
+    return OK;
+}
+
+PipeExecutor* PSysDAG::findExecutorProducer(PipeExecutor* consumer)
+{
+    std::map<ia_uid, Port> inputTerminals;
+    consumer->getInputTerminalPorts(inputTerminals);
+
+    for (auto& executor : mExecutorsPool) {
+        if (executor == consumer) {
+            continue;
+        }
+
+        for (auto& inputTerminal : inputTerminals) {
+            // Return if one is matched, because only one producer is supported now.
+            if (executor->hasOutputTerminal(inputTerminal.first)) {
+                return executor;
+            }
+        }
+    }
+
+    return nullptr;
+}
+
+/**
+ * Bind the port between DAG and its edge executors.
+ * After the binding we'll know where the task buffer should be queued to.
+ */
+int PSysDAG::bindExternalPortsToExecutor()
+{
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+
+    mInputMaps.clear();
+    mOutputMaps.clear();
+
+   std::map<Port, stream_t> outputInfo;
+   std::map<Port, stream_t> inputInfo;
+
+    // Bind the input ports first.
+    LOG2("%s, start to bind the input port", __func__);
+    for (auto& executor : mExecutorsPool) {
+        if (!executor->isInputEdge()) {
+            continue;
+        }
+        executor->getFrameInfo(inputInfo, outputInfo);
+
+        for (auto& frameInfo : mInputFrameInfo) {
+            for (auto& portInfo : inputInfo) {
+                // Check if it has been cleared (bound already).
+                if (!portInfo.second.format) {
+                    continue;
+                }
+                if (executor->isSameStreamConfig(portInfo.second, frameInfo.second, mConfigMode, false)) {
+                    PortMapping portMap;
+                    portMap.mExecutor = executor;
+                    portMap.mDagPort = frameInfo.first;
+                    portMap.mExecutorPort = portInfo.first;
+                    mInputMaps.push_back(portMap);
+                    // Clear the stream of executor to avoid binding it again.
+                    CLEAR(portInfo.second);
+                    LOG2("%s, inputMap executor %p, dagPort %d, execPort %d", __func__,
+                        executor, frameInfo.first, portInfo.first);
+                    break;
+                }
+            }
+        }
+    }
+
+    // Then bind the output ports.
+    LOG2("%s, start to bind the output port", __func__);
+    for (auto& executor : mExecutorsPool) {
+        if (!executor->isOutputEdge()) {
+            continue;
+        }
+
+        executor->getFrameInfo(inputInfo, outputInfo);
+        for (auto& frameInfo : mOutputFrameInfo) {
+            for (auto& portInfo : outputInfo) {
+                // Check if it has been cleared (bound already).
+                if (!portInfo.second.format) {
+                    continue;
+                }
+                if (executor->isSameStreamConfig(portInfo.second, frameInfo.second, mConfigMode, true)) {
+                    PortMapping portMap;
+                    portMap.mExecutor = executor;
+                    portMap.mDagPort = frameInfo.first;
+                    portMap.mExecutorPort = portInfo.first;
+                    mOutputMaps.push_back(portMap);
+                    // Clear the stream of executor to avoid binding it again.
+                    CLEAR(portInfo.second);
+                    break;
+                }
+            }
+        }
+    }
+
+    // Each required port must be mapped to one of (edge) executor's port.
+    // One input port may be mapped to more of (edge) executor's ports.
+    CheckError(mInputMaps.size() < mInputFrameInfo.size(), BAD_VALUE, "Failed to bind input ports");
+    CheckError(mOutputMaps.size() != mOutputFrameInfo.size(), BAD_VALUE, "Failed to bind output ports");
+
+    return OK;
+}
+
+int PSysDAG::registerUserOutputBufs(Port port, const std::shared_ptr<CameraBuffer> &camBuffer)
+{
+    for (auto& outputMap : mOutputMaps) {
+        if (port == outputMap.mDagPort) {
+            outputMap.mExecutor->registerOutBuffers(outputMap.mExecutorPort, camBuffer);
+            break;
+        }
+    }
+
+    return OK;
+}
+
+int PSysDAG::registerInternalBufs(std::map<Port, CameraBufVector> &internalBufs)
+{
+    for (auto& portToBuffers : internalBufs) {
+        for (auto& inputMap : mInputMaps) {
+            if (inputMap.mDagPort == portToBuffers.first) {
+                for (auto& inputBuf : portToBuffers.second) {
+                    inputMap.mExecutor->registerInBuffers(inputMap.mExecutorPort, inputBuf);
+                }
+                break;
+            }
+        }
+    }
+
+    return OK;
+}
+
+/**
+ * Queue the buffers in PSysTaskData to the cooresponding executors.
+ */
+int PSysDAG::queueBuffers(const PSysTaskData& task)
+{
+    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
+
+    // Provide the input buffers for the input edge executor.
+    for (auto& inputFrame : task.mInputBuffers) {
+        for (auto& inputMap : mInputMaps) {
+            if (inputMap.mDagPort == inputFrame.first) {
+                inputMap.mExecutor->onFrameAvailable(inputMap.mExecutorPort, inputFrame.second);
+                LOG2("%s, executorPort %d, exec %p", __func__,
+                    inputMap.mExecutorPort, inputMap.mExecutor);
+            }
+        }
+    }
+
+    // Provide the output buffers for the output edge executor.
+    for (auto& outputFrame : task.mOutputBuffers) {
+        for (auto& outputMap : mOutputMaps) {
+            if (outputMap.mDagPort == outputFrame.first) {
+                outputMap.mExecutor->qbuf(outputMap.mExecutorPort, outputFrame.second);
+                break;
+            }
+        }
+    }
+
+    return OK;
+}
+
+int PSysDAG::configure(ConfigMode configMode, TuningMode tuningMode)
+{
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+
+    mConfigMode = configMode;
+    mTuningMode = tuningMode;
+
+    // Configure IspParamAdaptor
+    int ret = mIspParamAdaptor->init();
+    CheckError(ret != OK, ret, "Init isp Adaptor failed, tuningMode %d", mTuningMode);
+
+    ret = mIspParamAdaptor->configure(mInputFrameInfo[mDefaultMainInputPort], mConfigMode, mTuningMode);
+    CheckError(ret != OK, ret, "Configure isp Adaptor failed, tuningMode %d", mTuningMode);
+
+    ret = createPipeExecutors();
+    CheckError(ret != OK, ret, "@%s, create psys executors failed", __func__);
+
+    ret = linkAndConfigExecutors();
+    CheckError(ret != OK, ret, "Link executors failed");
+
+    ret = bindExternalPortsToExecutor();
+    CheckError(ret != OK, ret, "Bind ports failed");
+
+    return OK;
+}
+
+int PSysDAG::start()
+{
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+
+    mPolicyManager->setActive(true);
+
+    for (auto& executors : mExecutorsPool) {
+        executors->start();
+    }
+    return OK;
+}
+
+int PSysDAG::stop()
+{
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+
+    mPolicyManager->setActive(false);
+
+    for (auto& executors : mExecutorsPool) {
+        executors->notifyStop();
+    }
+
+    for (auto& executors : mExecutorsPool) {
+        executors->stop();
+    }
+    return OK;
+}
+
+int PSysDAG::resume()
+{
+    mPolicyManager->setActive(true);
+    return OK;
+}
+
+int PSysDAG::pause()
+{
+    mPolicyManager->setActive(false);
+    return OK;
+}
+
+void PSysDAG::addTask(PSysTaskData taskParam)
+{
+    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
+
+    if (taskParam.mTuningMode != mTuningMode) {
+        tuningReconfig(taskParam.mTuningMode);
+    }
+
+    // It's too early to runIspAdapt here, and the ipu parameters
+    // may be incorrect when runPipe.
+    // TODO: remove this condition when 4k ULL pipe run faster
+    bool runIspAdaptor = true;
+    if (runIspAdaptor) {
+        std::map<int32_t, bool> activeStreamIds;
+        for (auto& outputFrame : taskParam.mOutputBuffers) {
+            if (outputFrame.second.get() == nullptr)
+                continue;
+            for (auto& outputMap : mOutputMaps) {
+                if (outputMap.mDagPort == outputFrame.first &&
+                    mExecutorStreamIds.find(outputMap.mExecutor) != mExecutorStreamIds.end()) {
+                    activeStreamIds[mExecutorStreamIds[outputMap.mExecutor]] = true;
+                }
+            }
+        }
+        for (auto& id : activeStreamIds) {
+            mIspParamAdaptor->runIspAdapt(&taskParam.mIspSettings,
+                              taskParam.mInputBuffers.at(mDefaultMainInputPort)->getSequence(),
+                              id.first);
+        }
+    }
+
+    {
+        // Save the task data into mOngoingTasks
+        TaskInfo task;
+        task.mTaskData = taskParam;
+        // Count how many valid output buffers need to be returned.
+        for (auto& outBuf : taskParam.mOutputBuffers) {
+            if (outBuf.second) {
+                task.mNumOfValidBuffers++;
+            }
+        }
+        LOG2("%s:Id:%d push task with %d output buffers, sequence: %ld",
+                __func__, mCameraId, task.mNumOfValidBuffers,
+                taskParam.mInputBuffers.at(mDefaultMainInputPort)->getSequence());
+        AutoMutex taskLock(mTaskLock);
+        mOngoingTasks.push_back(task);
+    }
+
+    queueBuffers(taskParam);
+}
+
+int PSysDAG::getParameters(Parameters& param)
+{
+    return mIspParamAdaptor->getParameters(param);
+}
+
+TuningMode PSysDAG::getTuningMode(long sequence)
+{
+    AutoMutex taskLock(mTaskLock);
+
+    TuningMode taskTuningMode = mTuningMode;
+    bool taskTuningModeFound = false;
+
+    for (auto const& task : mOngoingTasks) {
+        if (sequence == task.mTaskData.mInputBuffers.at(mDefaultMainInputPort)->getSequence()) {
+            taskTuningMode = task.mTaskData.mTuningMode;
+            taskTuningModeFound = true;
+            break;
+        }
+    }
+
+    if (!taskTuningModeFound) {
+        LOGW("No task tuning mode found for sequence:%ld, use current DAG tuning mode.", sequence);
+    }
+
+    return taskTuningMode;
+}
+
+/**
+ * Use to handle the frame done event from the executors.
+ *
+ * This is for returning output buffers to PSysDAG. And it'll check if all the valid
+ * output buffer returned, if so, then it'll return the whole corresponding task data to
+ * PSysProcessor.
+ */
+int PSysDAG::onFrameDone(Port port, const std::shared_ptr<CameraBuffer>& buffer)
+{
+    LOG2("@%s, mCameraId:%d buffer=%p", __func__, mCameraId, buffer.get());
+
+    if (!buffer) return OK; // No need to handle if the buffer is nullptr.
+
+    long sequence = buffer->getSequence();
+    bool needReturn = false;
+    PSysTaskData result;
+
+    {
+        // Remove the sequence when finish to process it
+        AutoMutex   l(mSequenceLock);
+        for (int i = 0; i < MAX_BUFFER_COUNT; i++) {
+            if (mOngoingSequence[i] == sequence) {
+                mOngoingSequence[i] = -1;
+                break;
+            }
+        }
+    }
+
+    {
+        AutoMutex taskLock(mTaskLock);
+        for (auto it = mOngoingTasks.begin(); it != mOngoingTasks.end(); it++) {
+            // Check if the returned buffer belong to the task.
+            if (sequence != it->mTaskData.mInputBuffers.at(mDefaultMainInputPort)->getSequence()) {
+                continue;
+            }
+
+            it->mNumOfReturnedBuffers++;
+            if (it->mNumOfReturnedBuffers >= it->mNumOfValidBuffers) {
+                result = it->mTaskData;
+                needReturn = true;
+                LOG2("%s:Id:%d finish task with %d returned output buffers, sequence: %ld", __func__,
+                        mCameraId, it->mNumOfReturnedBuffers, sequence);
+                // Remove the task data from mOngoingTasks since it's already processed.
+                mOngoingTasks.erase(it);
+            }
+            // No need check other if other tasks are matched with the returned buffer since
+            // we already found one.
+            break;
+        }
+    }
+
+    if (needReturn) {
+        returnBuffers(result);
+    }
+
+    return OK;
+}
+
+int PSysDAG::prepareIpuParams(long sequence, bool forceUpdate)
+{
+    // Make sure the AIC is executed once.
+    if (!forceUpdate) {
+        AutoMutex   l(mSequenceLock);
+
+        for (int i = 0; i < MAX_BUFFER_COUNT; i++) {
+            // This means aic for the sequence has been executed.
+            if (mOngoingSequence[i] == sequence) {
+                return OK;
+            }
+        }
+
+        // Store the new sequence.
+        for (int i = 0; i < MAX_BUFFER_COUNT; i++) {
+            if (mOngoingSequence[i] == -1) {
+                mOngoingSequence[i] = sequence;
+                break;
+            }
+        }
+    }
+
+    const IspSettings* ispSettings = nullptr;
+    {
+        AutoMutex taskLock(mTaskLock);
+        for (auto const& task : mOngoingTasks) {
+            if (sequence == task.mTaskData.mInputBuffers.at(mDefaultMainInputPort)->getSequence()) {
+                ispSettings = &task.mTaskData.mIspSettings;
+                break;
+            }
+        }
+    }
+
+    if (ispSettings == nullptr) {
+        LOGW("Run ISP adaptor with ispSettings is nullptr. This should never happen.");
+    }
+    LOG2("%s, Run AIC for sequence: %ld", __func__, sequence);
+
+    return mIspParamAdaptor->runIspAdapt(ispSettings, sequence);
+}
+
+int PSysDAG::returnBuffers(PSysTaskData& result)
+{
+    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
+
+    CheckError(!mPSysDagCB, INVALID_OPERATION, "Invalid PSysProcessor");
+
+    mPSysDagCB->onFrameDone(result);
+    return OK;
+}
+
+void PSysDAG::registerListener(EventType eventType, EventListener* eventListener)
+{
+    //Pass through event registration to PipeExecutor
+    for (auto const& executor : mExecutorsPool) {
+        executor->registerListener(eventType, eventListener);
+    }
+}
+
+void PSysDAG::removeListener(EventType eventType, EventListener* eventListener)
+{
+    //Pass through event unregistration to PipeExecutor
+    for (auto const& executor : mExecutorsPool) {
+        executor->removeListener(eventType, eventListener);
+    }
+}
+
+void PSysDAG::tuningReconfig(TuningMode newTuningMode)
+{
+    LOG1("@%s ", __func__);
+
+    if (mIspParamAdaptor) {
+        mIspParamAdaptor->deinit();
+    } else {
+        mIspParamAdaptor = new IspParamAdaptor(mCameraId, PG_PARAM_PSYS_ISA);
+    }
+
+    int ret = mIspParamAdaptor->init();
+    CheckError(ret != OK, VOID_VALUE, "Init isp Adaptor failed, tuningMode %d", newTuningMode);
+
+    ret = mIspParamAdaptor->configure(mInputFrameInfo[mDefaultMainInputPort], mConfigMode, newTuningMode);
+    CheckError(ret != OK, VOID_VALUE, "Failed to reconfig isp Adaptor.");
+
+    mTuningMode = newTuningMode;
+}
+
+void PSysDAG::dumpExternalPortMap()
+{
+    for (auto& inputMap : mInputMaps) {
+        if (inputMap.mExecutor) {
+            LOG2("@%s: Input port %d, executor: %s:%d", __func__, inputMap.mDagPort,
+                 inputMap.mExecutor->getName(), inputMap.mExecutorPort);
+        } else {
+            LOGE("%s: no executro for input port %d!", __func__, inputMap.mDagPort);
+        }
+    }
+    for (auto& outputMap : mOutputMaps) {
+        if (outputMap.mExecutor) {
+            LOG2("@%s: Output port %d, executor: %s:%d", __func__, outputMap.mDagPort,
+                 outputMap.mExecutor->getName(), outputMap.mExecutorPort);
+        } else {
+            LOGE("%s: no executro for output port %d!", __func__, outputMap.mDagPort);
+        }
+    }
+}
+
+}
diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.h b/camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.h
new file mode 100644
index 000000000000..274303d05a14
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.h
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "Parameters.h"
+#include "PlatformData.h"
+#include "CameraBuffer.h"
+#include "IspParamAdaptor.h"
+#ifdef USE_PG_LITE_PIPE
+#include "PipeLiteExecutor.h"
+#else
+#include "PipeExecutor.h"
+#endif
+#include "PolicyManager.h"
+
+/*************************************************
+ * TODO: currently only consider video stream,
+ *       will also consider still stream later.
+ *************************************************/
+#define VIDEO_STREAM_ID 60001
+
+namespace icamera {
+
+/**
+ * Encapsulation of all parameters needed by PSysExecutor to run PSYS pipeline.
+ */
+struct PSysTaskData {
+    IspSettings mIspSettings;
+    TuningMode mTuningMode;
+
+    CameraBufferPortMap mInputBuffers;
+    CameraBufferPortMap mOutputBuffers;
+    PSysTaskData() { mTuningMode = TUNING_MODE_MAX; };
+};
+
+class PSysDagCallback {
+public:
+    PSysDagCallback() {};
+    virtual ~PSysDagCallback() {};
+    virtual void onFrameDone(const PSysTaskData& result) {};
+};
+
+class PSysDAG {
+
+public:
+    PSysDAG(int cameraId, PSysDagCallback* psysDagCB);
+    virtual ~PSysDAG();
+    void setFrameInfo(const std::map<Port, stream_t>& inputInfo,
+                      const std::map<Port, stream_t>& outputInfo);
+    int configure(ConfigMode configMode, TuningMode tuningMode);
+    int start();
+    int stop();
+
+    int resume();
+    int pause();
+
+    int registerInternalBufs(std::map<Port, CameraBufVector> &internalBufs);
+    int registerUserOutputBufs(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
+
+    void addTask(PSysTaskData taskParam);
+    int getParameters(Parameters& param);
+
+    void registerListener(EventType eventType, EventListener* eventListener);
+    void removeListener(EventType eventType, EventListener* eventListener);
+
+    TuningMode getTuningMode(long sequence);
+    int prepareIpuParams(long sequence, bool forceUpdate = false);
+
+    /**
+     * Use to handle the frame done event from the executors.
+     */
+    int onFrameDone(Port port, const std::shared_ptr<CameraBuffer>& buffer);
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(PSysDAG);
+
+    void tuningReconfig(TuningMode newTuningMode);
+
+    int createPipeExecutors();
+    int linkAndConfigExecutors();
+    int bindExternalPortsToExecutor();
+    void releasePipeExecutors();
+
+    PipeExecutor* findExecutorProducer(PipeExecutor* consumer);
+
+    int queueBuffers(const PSysTaskData& task);
+    int returnBuffers(PSysTaskData& result);
+
+    void dumpExternalPortMap();
+
+private:
+    int mCameraId;
+    PSysDagCallback* mPSysDagCB; //Used to callback notify frame done handling
+    PolicyManager* mPolicyManager;
+    ConfigMode mConfigMode; //It is actually real config mode.
+    TuningMode mTuningMode;
+    IspParamAdaptor* mIspParamAdaptor;
+
+    std::map<Port, stream_t> mInputFrameInfo;
+    std::map<Port, stream_t> mOutputFrameInfo;
+    Port mDefaultMainInputPort;
+
+    std::vector<PipeExecutor*> mExecutorsPool;
+    std::map<PipeExecutor*, int32_t> mExecutorStreamIds;
+
+    // A lock for protecting task data from being accessed by different threads.
+    Mutex mTaskLock;
+    // Used to save all on-processing tasks.
+    struct TaskInfo {
+        TaskInfo() : mNumOfValidBuffers(0), mNumOfReturnedBuffers(0) {}
+        PSysTaskData mTaskData;
+        int mNumOfValidBuffers;
+        int mNumOfReturnedBuffers;
+    };
+    std::vector<TaskInfo> mOngoingTasks;
+
+    long mOngoingSequence[MAX_BUFFER_COUNT];
+    Mutex mSequenceLock;
+
+    /**
+     * The relationship mapping between DAG's port and executors port.
+     */
+    struct PortMapping {
+        PortMapping() : mExecutor(nullptr), mDagPort(INVALID_PORT), mExecutorPort(INVALID_PORT) {}
+        PipeExecutor* mExecutor;
+        Port mDagPort;
+        Port mExecutorPort;
+    };
+
+    std::vector<PortMapping> mInputMaps;
+    std::vector<PortMapping> mOutputMaps;
+};
+}
diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.cpp b/camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.cpp
new file mode 100644
index 000000000000..c434ebff1af4
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.cpp
@@ -0,0 +1,1116 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "PipeLiteExecutor"
+
+#include <algorithm>
+
+#include "PipeLiteExecutor.h"
+#include "PSysDAG.h"
+
+#include "FormatUtils.h"
+#include "iutils/CameraDump.h"
+#include "SyncManager.h"
+
+// CIPF backends
+extern "C" {
+#include <ia_cipf_css/ia_cipf_css.h>
+#include <ia_pal_types_isp_ids_autogen.h>
+}
+
+using std::vector;
+using std::string;
+using std::map;
+using std::shared_ptr;
+
+namespace icamera {
+
+static const int32_t sStatKernels[] = {
+    ia_pal_uuid_isp_bxt_awbstatistics,
+    ia_pal_uuid_isp_awbstatistics_2_0,
+    ia_pal_uuid_isp_bxt_dvsstatistics
+};
+
+static const int32_t sSisKernels[] = {
+    ia_pal_uuid_isp_sis_1_0_a
+};
+
+PipeLiteExecutor::PipeLiteExecutor(int cameraId, const ExecutorPolicy &policy,
+                                   vector<string> exclusivePGs, PSysDAG *psysDag,
+                                   shared_ptr<IGraphConfig> gc)
+      : mCameraId(cameraId),
+        mStreamId(-1),
+        mName(policy.exeName),
+        mPGNames(policy.pgList),
+        mOpModes(policy.opModeList),
+        mGraphConfig(gc),
+        mIsInputEdge(false),
+        mIsOutputEdge(false),
+        mNotifyPolicy(POLICY_FRAME_FIRST),
+        mAdaptor(nullptr),
+        mPolicyManager(nullptr),
+        mLastStatsSequence(-1),
+        mExclusivePGs(exclusivePGs),
+        mPSysDag(psysDag),
+        mkernelsCountWithStats(0)
+{
+    mProcessThread = new ProcessThread(this);
+}
+
+PipeLiteExecutor::~PipeLiteExecutor()
+{
+    while (!mPGExecutors.empty()) {
+        ExecutorUnit& unit = mPGExecutors.back();
+        if (unit.pg.get()) {
+            unit.pg->deInit();
+        }
+        mPGExecutors.pop_back();
+    }
+
+    releaseBuffers();
+    delete mProcessThread;
+}
+
+int PipeLiteExecutor::initPipe()
+{
+    LOG1("@%s:%s", __func__, getName());
+    CheckError(mGraphConfig == nullptr, BAD_VALUE, "%s, the graph config is NULL, BUG!", __func__);
+
+    NodesPtrVector programGroups;
+    vector<IGraphType::PipelineConnection> connVector;
+
+    int ret = mGraphConfig->pipelineGetConnections(mPGNames, &connVector);
+    CheckError(connVector.empty(), ret, "Failed to get connections for executor:%s", mName.c_str());
+
+    ret = createPGs();
+    CheckError(ret != OK, ret, "Failed to create PGs for executor: %s", ret, mName.c_str());
+
+    ret = analyzeConnections(connVector);
+    CheckError(ret != OK, ret, "Failed to analyze connections for executor: %s", ret, mName.c_str());
+
+    ret = configurePGs();
+    CheckError(ret != OK, ret, "Failed to configure connections for executor: %s", ret, mName.c_str());
+
+    assignDefaultPortsForTerminals();
+    return OK;
+}
+
+int PipeLiteExecutor::analyzeConnections(const vector<IGraphType::PipelineConnection>& connVector)
+{
+    ia_uid firstStageId = mPGExecutors.front().stageId;
+    ia_uid lastStageId = mPGExecutors.back().stageId;
+
+    for (auto const& connection : connVector) {
+        LOG2("%s: terminal %d (%d): %dx%d, 0x%x", getName(),
+             connection.portFormatSettings.terminalId, connection.portFormatSettings.enabled,
+             connection.portFormatSettings.width, connection.portFormatSettings.height,
+             connection.portFormatSettings.fourcc);
+        LOG2("%s:     connection source %d, %d, %d, has edge %d", getName(),
+             connection.connectionConfig.mSourceStage, connection.connectionConfig.mSourceTerminal,
+             connection.connectionConfig.mSourceIteration, connection.hasEdgePort);
+        LOG2("%s:     connection sink %d, %d, %d, type %d", getName(),
+             connection.connectionConfig.mSinkStage, connection.connectionConfig.mSinkTerminal,
+             connection.connectionConfig.mSinkIteration, connection.connectionConfig.mConnectionType);
+
+        storeTerminalInfo(connection);
+
+        if (connection.portFormatSettings.enabled == 0) {
+            // No actions are needed for the disabled connections.
+            continue;
+        }
+
+        // If the connection's sink stage is same as the first stage/pg id in this executor,
+        // then it means the connection belongs to input terminal pairs.
+        if (connection.connectionConfig.mSinkStage == firstStageId && connection.hasEdgePort) {
+            mIsInputEdge = true;
+        }
+
+        // If the connection's source stage is same as the last stage/pg id in this executor,
+        // then it means the connection belongs to output terminal pairs.
+        // SIS is output terminal but it doesn't belong to any stream, so it is not real edge output.
+        if (connection.connectionConfig.mSourceStage == lastStageId
+            && connection.hasEdgePort
+            && connection.connectionConfig.mSourceTerminal != connection.connectionConfig.mSinkTerminal) {
+            mIsOutputEdge = true;
+        }
+    }
+
+    return OK;
+}
+
+int PipeLiteExecutor::storeTerminalInfo(const IGraphType::PipelineConnection& connection)
+{
+    FrameInfo info;
+    info.mWidth = connection.portFormatSettings.width;
+    info.mHeight = connection.portFormatSettings.height;
+    info.mFormat = connection.portFormatSettings.fourcc;
+
+    ia_uid curTerminal    = connection.portFormatSettings.terminalId;
+    ia_uid sinkTerminal   = connection.connectionConfig.mSinkTerminal;
+    ia_uid sourceTerminal = connection.connectionConfig.mSourceTerminal;
+    ia_uid sinkStage      = connection.connectionConfig.mSinkStage;
+    ia_uid sourceStage    = connection.connectionConfig.mSourceStage;
+
+    TerminalDescriptor desc;
+    desc.terminal       = 0;
+    desc.stageId        = 0;
+    desc.sinkTerminal   = sinkTerminal;
+    desc.sourceTerminal = sourceTerminal;
+    desc.sinkStage      = sinkStage;
+    desc.sourceStage    = sourceStage;
+    desc.frameDesc      = info;
+    desc.enabled        = true;
+    desc.hasConnection  = true;
+    desc.assignedPort   = INVALID_PORT;
+    desc.usrStreamId   = connection.stream ? connection.stream->streamId() : -1;
+
+    if (connection.portFormatSettings.enabled) {
+        mConnectionMap[sinkTerminal]= sourceTerminal;
+    }
+
+    // Check if there is new input terminal
+    if (sinkStage && mTerminalsDesc.find(sinkTerminal) == mTerminalsDesc.end()) {
+        ExecutorUnit* unit = findPGExecutor(sinkStage);
+        if (unit) {
+            desc.terminal = sinkTerminal;
+            desc.stageId = sinkStage;
+            mTerminalsDesc[desc.terminal] = desc;
+            unit->inputTerminals.push_back(desc.terminal);
+        }
+    }
+    // Check if there is new output terminal
+    if (sourceStage && mTerminalsDesc.find(sourceTerminal) == mTerminalsDesc.end()) {
+        ExecutorUnit* unit = findPGExecutor(sourceStage);
+        if (unit) {
+            desc.terminal = sourceTerminal;
+            desc.stageId = sourceStage;
+            desc.hasConnection = (sinkTerminal != sourceTerminal);
+            mTerminalsDesc[desc.terminal] = desc;
+            unit->outputTerminals.push_back(desc.terminal);
+        }
+    }
+
+    if (mTerminalsDesc.find(curTerminal) != mTerminalsDesc.end()) {
+        mTerminalsDesc[curTerminal].enabled = connection.portFormatSettings.enabled;
+    }
+
+    return OK;
+}
+
+int PipeLiteExecutor::createPGs()
+{
+    for (auto const& pgName : mPGNames) {
+        int pgId = mGraphConfig->getPgIdByPgName(pgName);
+        CheckError(pgId == -1, BAD_VALUE, "Cannot get PG ID for %s", pgName.c_str());
+
+        ExecutorUnit pgUnit;
+        pgUnit.pgId = pgId;
+        pgUnit.stageId = psys_2600_pg_uid(pgId);
+        pgUnit.pg = std::shared_ptr<PGCommon>(new PGCommon(pgId, pgName, pgUnit.stageId + 1));
+        // Please refer to ia_cipf_css.h for terminalBaseUid
+        mPGExecutors.push_back(pgUnit);
+        int ret = pgUnit.pg->init();
+        CheckError(ret != OK, UNKNOWN_ERROR, "create PG %d error", pgId);
+    }
+    return OK;
+}
+
+int PipeLiteExecutor::configurePGs()
+{
+    mkernelsCountWithStats = 0;
+    for (auto &unit : mPGExecutors) {
+        map<ia_uid, FrameInfo> inputInfos;
+        map<ia_uid, FrameInfo> outputInfos;
+        vector<ia_uid> disabledTerminals;
+
+        getTerminalFrameInfos(unit.inputTerminals, inputInfos);
+        getTerminalFrameInfos(unit.outputTerminals, outputInfos);
+        getDisabledTerminalsForPG(unit.stageId, disabledTerminals);
+
+        unit.pg->setInputInfo(inputInfos);
+        unit.pg->setOutputInfo(outputInfos);
+        unit.pg->setDisabledTerminals(disabledTerminals);
+
+        IGraphType::StageAttr stageAttr;
+        if (mGraphConfig->getPgRbmValue(unit.pg->getName(), &stageAttr) == OK) {
+            LOG1("%s: Set rbm for pgId %d, pgName: %s bytes %d",
+                 __func__, unit.pgId, unit.pg->getName(), stageAttr.rbm_bytes);
+            unit.pg->setRoutingBitmap(stageAttr.rbm, stageAttr.rbm_bytes);
+        }
+        unit.pg->prepare(mAdaptor, mStreamId);
+
+        int statsCount = getStatKernels(unit.pgId, unit.statKernelUids);
+        mkernelsCountWithStats += statsCount;
+
+        statsCount = getSisKernels(unit.pgId, unit.sisKernelUids);
+        mkernelsCountWithStats += statsCount;
+    }
+
+    return OK;
+}
+
+/**
+ * Assign ports for terminals as internal default value
+ * Input ports may be overwritten with output ports of producer in setInputTerminals()
+ */
+int PipeLiteExecutor::assignDefaultPortsForTerminals()
+{
+    Port portTable[] = {MAIN_PORT, SECOND_PORT, THIRD_PORT, FORTH_PORT, INVALID_PORT};
+    for (auto &unit : mPGExecutors) {
+        int outPortIndex = 0;
+        for (auto terminal : unit.outputTerminals) {
+            TerminalDescriptor& termDesc = mTerminalsDesc[terminal];
+            if (termDesc.enabled && termDesc.hasConnection) {
+                CheckError(portTable[outPortIndex] == INVALID_PORT, BAD_VALUE,
+                    "Port unavailable for output term %d:%d", unit.pgId, terminal);
+                termDesc.assignedPort = portTable[outPortIndex];
+                outPortIndex++;
+            }
+        }
+
+        int inPortIndex = 0;
+        for (auto terminal : unit.inputTerminals) {
+            TerminalDescriptor& termDesc = mTerminalsDesc[terminal];
+            if (termDesc.enabled && termDesc.hasConnection) {
+                CheckError(portTable[inPortIndex] == INVALID_PORT, BAD_VALUE,
+                    "Port unavailable for input term %d", terminal);
+                termDesc.assignedPort = portTable[inPortIndex];
+                inPortIndex++;
+            }
+        }
+    }
+
+    return OK;
+}
+
+void PipeLiteExecutor::getOutputTerminalPorts(std::map<ia_uid, Port>& terminals) const
+{
+    getTerminalPorts(mPGExecutors.back().outputTerminals, terminals);
+}
+
+void PipeLiteExecutor::getInputTerminalPorts(std::map<ia_uid, Port>& terminals) const
+{
+    getTerminalPorts(mPGExecutors.front().inputTerminals, terminals);
+}
+
+int PipeLiteExecutor::setInputTerminals(const std::map<ia_uid, Port>& sourceTerminals)
+{
+    // In edge PGs accepts input ports arrangement from external
+    ExecutorUnit& inUnit = mPGExecutors.front();
+    for (auto sinkTerminal : inUnit.inputTerminals) {
+        if (mConnectionMap.find(sinkTerminal) == mConnectionMap.end()) {
+            continue;
+        }
+
+        ia_uid sourceTerminal = mConnectionMap[sinkTerminal];
+        if (sourceTerminals.find(sourceTerminal) != sourceTerminals.end()) {
+            mTerminalsDesc[sinkTerminal].assignedPort = sourceTerminals.at(sourceTerminal);
+            LOG2("pg %s get external %d -> input %d, port %d", getName(),
+                 sourceTerminal, sinkTerminal, mTerminalsDesc[sinkTerminal].assignedPort);
+        }
+    }
+
+    // Link internal PGs (sink PG accepts input ports arrangement from source PG (output ports)
+    // source PG(output ports) -> (input ports)sink PG
+    for (unsigned int i = 1; i < mPGExecutors.size(); i++) {
+        for (auto sinkTerminal : mPGExecutors[i].inputTerminals) {
+            if (!mTerminalsDesc[sinkTerminal].enabled) {
+                continue;
+            }
+            if (mConnectionMap.find(sinkTerminal) != mConnectionMap.end()) {
+                ia_uid sourceTerminal = mConnectionMap[sinkTerminal];
+                mTerminalsDesc[sinkTerminal].assignedPort = mTerminalsDesc[sourceTerminal].assignedPort;
+            }
+        }
+    }
+
+    // Set frame info to BufferQueue
+    map<Port, stream_t> inputInfo;
+    map<Port, stream_t> outputInfo;
+    ExecutorUnit& outUnit = mPGExecutors.back();
+    for (auto terminal : inUnit.inputTerminals) {
+        if (mTerminalsDesc[terminal].assignedPort == INVALID_PORT) {
+            continue;
+        }
+
+        stream_t inputConfig;
+        CLEAR(inputConfig);
+        inputConfig.width = mTerminalsDesc[terminal].frameDesc.mWidth;
+        inputConfig.height = mTerminalsDesc[terminal].frameDesc.mHeight;
+        inputConfig.format = mTerminalsDesc[terminal].frameDesc.mFormat;
+        inputConfig.id = mTerminalsDesc[terminal].usrStreamId;
+        inputInfo[mTerminalsDesc[terminal].assignedPort] = inputConfig;
+    }
+    for (auto terminal : outUnit.outputTerminals) {
+        if (mTerminalsDesc[terminal].assignedPort == INVALID_PORT) {
+            continue;
+        }
+
+        stream_t outputConfig;
+        CLEAR(outputConfig);
+        outputConfig.width = mTerminalsDesc[terminal].frameDesc.mWidth;
+        outputConfig.height = mTerminalsDesc[terminal].frameDesc.mHeight;
+        outputConfig.format = mTerminalsDesc[terminal].frameDesc.mFormat;
+        outputConfig.id = mTerminalsDesc[terminal].usrStreamId;
+        outputInfo[mTerminalsDesc[terminal].assignedPort] = outputConfig;
+    }
+    BufferQueue::setFrameInfo(inputInfo, outputInfo);
+
+    return OK;
+}
+
+int PipeLiteExecutor::start()
+{
+    LOG1("%s executor:%s", __func__, mName.c_str());
+    AutoMutex   l(mBufferQueueLock);
+
+    allocBuffers();
+    dumpPGs();
+
+    mLastStatsSequence = -1;
+
+    mThreadRunning = true;
+    mProcessThread->run(mName.c_str(), PRIORITY_NORMAL);
+
+    return OK;
+}
+
+void PipeLiteExecutor::stop()
+{
+    LOG1("%s executor:%s", __func__, mName.c_str());
+
+    mProcessThread->requestExitAndWait();
+
+    // Thread is not running. It is safe to clear the Queue
+    clearBufferQueues();
+}
+
+void PipeLiteExecutor::notifyStop()
+{
+    LOG1("%s executor:%s", __func__, mName.c_str());
+
+    mProcessThread->requestExit();
+    {
+        AutoMutex l(mBufferQueueLock);
+        mThreadRunning = false;
+        // Wakeup the thread to exit
+        mFrameAvailableSignal.signal();
+        mOutputAvailableSignal.signal();
+    }
+}
+
+int PipeLiteExecutor::releaseStatsBuffer(const shared_ptr<CameraBuffer> &statsBuf)
+{
+    LOG3A("%s executor:%s", __func__, mName.c_str());
+    AutoMutex lock(mStatsBuffersLock);
+
+    mStatsBuffers.push(statsBuf);
+
+    return OK;
+}
+
+bool PipeLiteExecutor::hasOutputTerminal(ia_uid sinkTerminal)
+{
+    if (mConnectionMap.find(sinkTerminal) == mConnectionMap.end()) {
+        return false;
+    }
+
+    ExecutorUnit& unit = mPGExecutors.back();
+    for (auto sourceTerminal : unit.outputTerminals) {
+        if (mConnectionMap[sinkTerminal] == sourceTerminal) {
+            return true;
+        }
+    }
+    return false;
+}
+
+int PipeLiteExecutor::getStatKernels(int pgId, vector<ia_uid>& kernels)
+{
+    kernels.clear();
+    for (unsigned int i = 0; i < ARRAY_SIZE(sStatKernels); i++) {
+        int pgIdOfKernel = -1;
+        int status = mGraphConfig->getPgIdForKernel(mStreamId, sStatKernels[i], &pgIdOfKernel);
+        if (status == OK && pgIdOfKernel == pgId) {
+             kernels.push_back(sStatKernels[i]);
+        }
+    }
+
+    LOG1("pg %d has %d stat kernels", pgId, kernels.size());
+    return kernels.size();
+}
+
+int PipeLiteExecutor::getSisKernels(int pgId, vector<ia_uid>& kernels)
+{
+    kernels.clear();
+    for (unsigned int i = 0; i < ARRAY_SIZE(sSisKernels); i++) {
+        int pgIdOfKernel = -1;
+        int status = mGraphConfig->getPgIdForKernel(mStreamId, sSisKernels[i], &pgIdOfKernel);
+        if (status == OK && pgIdOfKernel == pgId) {
+             kernels.push_back(sSisKernels[i]);
+        }
+    }
+
+    LOG1("pg %d has %d sis kernels", pgId, kernels.size());
+    return kernels.size();
+}
+
+bool PipeLiteExecutor::isSameStreamConfig(const stream_t& internal, const stream_t& external,
+                                          ConfigMode configMode, bool checkStreamId) const
+{
+    // The internal format is ia_fourcc based format, so need to convert it to V4L2 format.
+    int internalFormat = graphconfig::utils::getV4L2Format(internal.format);
+    int internalStride = CameraUtils::getStride(internalFormat, internal.width);
+    int externalStride = CameraUtils::getStride(external.format, external.width);
+
+    LOG1("%s: %s, id:%d, internal: %s(%dx%d: %d)(id %d), external: %s(%dx%d: %d) (id %d) usage:%d",
+          __func__, mName.c_str(), mStreamId,
+          CameraUtils::format2string(internalFormat).c_str(),
+          internal.width, internal.height, internalStride, internal.id,
+          CameraUtils::format2string(external.format).c_str(),
+          external.width, external.height, externalStride, external.id, external.usage);
+
+    if (checkStreamId && internal.id >= 0) {
+        return internal.id == external.id;
+    }
+
+    /*
+     * WA: PG accept GRBG format but actual input data is of RGGB format,
+     *     PG use its kernel to crop to GRBG
+     */
+    if ((internalFormat == V4L2_PIX_FMT_SGRBG10 || internalFormat == V4L2_PIX_FMT_SGRBG12)
+         && (external.format == V4L2_PIX_FMT_SRGGB10 || external.format == V4L2_PIX_FMT_SRGGB12)) {
+         return true;
+    }
+
+    bool sameHeight = internal.height == external.height ||
+                      internal.height == ALIGN_32(external.height);
+    if (internalFormat == external.format && sameHeight &&
+        (internal.width == external.width || internalStride == externalStride)) {
+        return true;
+    }
+
+    return false;
+}
+
+/**
+ * Check if there is any valid buffer(not null) in the given port/buffer pairs.
+ *
+ * return true if there is at least one not null buffer.
+ */
+bool PipeLiteExecutor::hasValidBuffers(const CameraBufferPortMap& buffers)
+{
+    for (const auto& item : buffers) {
+        if (item.second) return true;
+    }
+
+    return false;
+}
+
+int PipeLiteExecutor::processNewFrame()
+{
+    PERF_CAMERA_ATRACE();
+
+    int ret = OK;
+    CameraBufferPortMap inBuffers, outBuffers;
+    // Wait frame buffers.
+    {
+        ConditionLock lock(mBufferQueueLock);
+        ret = waitFreeBuffersInQueue(lock, inBuffers, outBuffers);
+        // Already stopped
+        if (!mThreadRunning) return -1;
+
+        if (ret != OK) return OK; // Wait frame buffer error should not involve thread exit.
+
+        CheckError(inBuffers.empty() || outBuffers.empty(),
+              UNKNOWN_ERROR, "Failed to get input or output buffers.");
+
+        for (auto& output: mOutputQueue) {
+            output.second.pop();
+        }
+
+        for (auto& input: mInputQueue) {
+            input.second.pop();
+        }
+    }
+
+    // Check if the executor needs to run the actual pipeline.
+    // It only needs to run when there is at least one valid output buffer.
+    if (!hasValidBuffers(outBuffers)) {
+        // Return buffers if the executor is NOT an input edge.
+        if (!mIsInputEdge) {
+            for (const auto& item : inBuffers) {
+                mBufferProducer->qbuf(item.first, item.second);
+            }
+        }
+        return OK;
+    }
+
+    // Fill real buffer to run pipe
+    for (auto &item : outBuffers) {
+        if (item.second.get() == nullptr) {
+            item.second = mInternalOutputBuffers[item.first];
+        }
+    }
+
+    vector<shared_ptr<CameraBuffer>> outStatsBuffers;
+    vector<EventType> eventType;
+    // Should find first not none input buffer instead of always use the first one.
+    shared_ptr<CameraBuffer> inBuf = inBuffers.begin()->second;
+    CheckError(!inBuf, UNKNOWN_ERROR, "@%s: no valid input buffer", __func__);
+    long inBufSequence = inBuf->getSequence();
+    v4l2_buffer_t inV4l2Buf = *inBuf->getV4L2Buffer().Get();
+    TuningMode tuningMode = mPSysDag->getTuningMode(inBufSequence);
+
+    // Enable RAW DUMP to get the MakerNote from jpeg
+    if (CameraDump::isDumpTypeEnable(DUMP_JPEG_BUFFER)) {
+        if (mName.find("still") != std::string::npos) {
+            CameraDump::dumpImage(mCameraId, inBuffers[MAIN_PORT], M_PSYS, MAIN_PORT);
+        }
+    }
+
+    LOG2("%s:Id:%d run pipe start for buffer:%ld", mName.c_str(), mCameraId, inBufSequence);
+
+    if (PlatformData::isEnableFrameSyncCheck(mCameraId)) {
+        shared_ptr<CameraBuffer> cInBuffer = inBuffers[MAIN_PORT];
+        int vc = cInBuffer->getVirtualChannel();
+
+        while ((!SyncManager::getInstance()->vcSynced(vc)) && mThreadRunning)
+            usleep(1);
+
+        if (gLogLevel & CAMERA_DEBUG_LOG_VC_SYNC) {
+            int seq = cInBuffer->getSequence();
+            SyncManager::getInstance()->printVcSyncCount();
+            LOGVCSYNC("[start runPipe], CPU-timestamp:%lu, sequence:%d, vc:%d, kernel-timestamp:%.3lfms, endl",
+                      CameraUtils::systemTime(),
+                      seq,
+                      cInBuffer->getVirtualChannel(),
+                      cInBuffer->getTimestamp().tv_sec*1000.0 + cInBuffer->getTimestamp().tv_usec/1000.0);
+        }
+
+        SyncManager::getInstance()->updateVcSyncCount(vc);
+
+        // Run pipe with buffers
+        ret = runPipe(inBuffers, outBuffers, outStatsBuffers, eventType);
+        LOGVCSYNC("[done runPipe], CPU-timestamp:%lu, sequence:%ld, vc:%d, kernel-timestamp:%.3lfms, endl",
+                  CameraUtils::systemTime(),
+                  cInBuffer->getSequence(),
+                  cInBuffer->getVirtualChannel(),
+                  cInBuffer->getTimestamp().tv_sec*1000.0 + cInBuffer->getTimestamp().tv_usec/1000.0);
+    } else {
+        // Run pipe with buffers
+        ret = runPipe(inBuffers, outBuffers, outStatsBuffers, eventType);
+    }
+    CheckError((ret != OK), UNKNOWN_ERROR, "@%s: failed to run pipe", __func__);
+    LOG2("%s:Id:%d run pipe end for buffer:%ld", mName.c_str(), mCameraId, inBufSequence);
+
+    // Remove internal output buffers
+    for (auto &item : outBuffers) {
+        if (item.second.get() == mInternalOutputBuffers[item.first].get()) {
+            item.second = nullptr;
+        }
+    }
+
+    if (mNotifyPolicy == POLICY_FRAME_FIRST) {
+        // For general case, notify frame prior to stats to make sure its consumers can get
+        // the frame buffers as early as possible.
+        notifyFrameDone(inV4l2Buf, outBuffers);
+        notifyStatsDone(tuningMode, inV4l2Buf, outStatsBuffers, eventType);
+    } else if (mNotifyPolicy == POLICY_STATS_FIRST) {
+        // Notify stats first and then handle frame buffers to make sure the next executor
+        // can get this executor's IQ result.
+        notifyStatsDone(tuningMode, inV4l2Buf, outStatsBuffers, eventType);
+
+        // After the stats notified, we need to update the IPU parameters as well to get the
+        // latest AIQ result.
+        mPSysDag->prepareIpuParams(inBufSequence, true);
+
+        notifyFrameDone(inV4l2Buf, outBuffers);
+    } else {
+        LOGW("Invalid notify policy:%d, should never happen.", mNotifyPolicy);
+    }
+
+    // Return buffers for the executor which is NOT an input edge
+    if (!mIsInputEdge) {
+        for (auto const& portBufferPair : inBuffers) {
+            // Queue buffer to producer
+            mBufferProducer->qbuf(portBufferPair.first, portBufferPair.second);
+        }
+    }
+
+    return OK;
+}
+
+int PipeLiteExecutor::registerInBuffers(Port port, const shared_ptr<CameraBuffer> &inBuf)
+{
+    return OK;
+}
+
+int PipeLiteExecutor::registerOutBuffers(Port port, const shared_ptr<CameraBuffer> &camBuffer)
+{
+    return OK;
+}
+
+int PipeLiteExecutor::runPipe(map<Port, shared_ptr<CameraBuffer> > &inBuffers,
+                              map<Port, shared_ptr<CameraBuffer> > &outBuffers,
+                              vector<shared_ptr<CameraBuffer> > &outStatsBuffers,
+                              vector<EventType> &eventType)
+{
+    PERF_CAMERA_ATRACE();
+
+    CheckError((inBuffers.empty() || outBuffers.empty()), BAD_VALUE,
+        "Error in pipe iteration input/output bufs");
+
+    int ret = OK;
+    if (mPolicyManager) {
+        // Check if need to wait other executors.
+        ret = mPolicyManager->wait(mName);
+    }
+
+    // Accept external buffers for in/out edge PGs
+    getTerminalBuffersFromExternal(mPGExecutors.front().inputTerminals, inBuffers,
+                                   mPGExecutors.front().inputBuffers);
+    getTerminalBuffersFromExternal(mPGExecutors.back().outputTerminals, outBuffers,
+                                   mPGExecutors.back().outputBuffers);
+
+    // Get ISP parameters
+    const ia_binary_data *ipuParameters = nullptr;
+    long sequence = inBuffers.begin()->second ? inBuffers.begin()->second->getSequence() : -1;
+    if (mAdaptor) {
+        ipuParameters = mAdaptor->getIpuParameter(sequence, mStreamId);
+    }
+
+    LOG2("%s: Executor %s run with input: %zu, output: %zu, sequence: %ld",
+         __func__, mName.c_str(), inBuffers.size(), outBuffers.size(), sequence);
+
+    outStatsBuffers.clear();
+    eventType.clear();
+    int statTotalNum = 0;
+    for (unsigned int pgIndex = 0; pgIndex < mPGExecutors.size(); pgIndex++) {
+        ExecutorUnit& unit = mPGExecutors[pgIndex];
+
+        // Prepare stats buffers for 3A/sis
+        vector<ia_binary_data*> pgStatsDatas;
+        // For 3A stats
+        unsigned int statsCount = unit.statKernelUids.size();
+        for (unsigned int counter = 0; counter < statsCount; counter++) {
+            if (mStatsBuffers.empty()) {
+                LOGW("No available stats buffer.");
+                break;
+            }
+            outStatsBuffers.push_back(mStatsBuffers.front());
+            eventType.push_back(EVENT_PSYS_STATS_BUF_READY);
+            ia_binary_data* buffer = (ia_binary_data*)mStatsBuffers.front()->getBufferAddr();
+            pgStatsDatas.push_back(buffer);
+            mStatsBuffers.pop();
+        }
+        unsigned int sisCount = unit.sisKernelUids.size();
+        for (unsigned int counter = 0; counter < sisCount; counter++) {
+            if (mStatsBuffers.empty()) {
+                LOGW("No available stats buffer.");
+                break;
+            }
+            outStatsBuffers.push_back(mStatsBuffers.front());
+            eventType.push_back(EVENT_PSYS_STATS_SIS_BUF_READY);
+            ia_binary_data* buffer = (ia_binary_data*)mStatsBuffers.front()->getBufferAddr();
+            pgStatsDatas.push_back(buffer);
+            mStatsBuffers.pop();
+        }
+
+        // Run PGs
+        ret = unit.pg->iterate(unit.inputBuffers,
+                               unit.outputBuffers,
+                               (statsCount > 0) ? pgStatsDatas[0] : nullptr, // Currently PG handles one stats buffer only
+                               ipuParameters);
+        CheckError((ret != OK), ret, "%s: error in pipe iteration with %d", mName.c_str(), ret);
+
+        statTotalNum += statsCount;
+        if (sisCount > 0) {
+            handleSisStats(unit.outputBuffers, outStatsBuffers[statTotalNum]); // Currently handle one sis output only
+        }
+        statTotalNum += sisCount;
+    }
+
+    return OK;
+}
+
+int PipeLiteExecutor::handleSisStats(map<ia_uid, shared_ptr<CameraBuffer>>& frameBuffers, const shared_ptr<CameraBuffer> &outStatsBuffers)
+{
+    LOG2("%s:", __func__);
+    ia_binary_data* statBuf = (ia_binary_data*)outStatsBuffers->getBufferAddr();
+    CheckError((statBuf == nullptr), BAD_VALUE, "Error getting buffer for sis a stats");
+    statBuf->data = nullptr;
+    statBuf->size = 0;
+
+    for (auto iterm : frameBuffers) {
+        ia_uid uid = iterm.first;
+        if (uid == psys_ipu6_isa_lb_output_sis_a_uid) {
+            statBuf->data = iterm.second->getBufferAddr();
+            statBuf->size = iterm.second->getBufferSize();
+            outStatsBuffers->setUserBufferInfo(-1, iterm.second->getWidth(), iterm.second->getHeight());
+            return OK;
+        }
+    }
+
+    return UNKNOWN_ERROR;
+}
+
+int PipeLiteExecutor::notifyFrameDone(const v4l2_buffer_t& inV4l2Buf, const CameraBufferPortMap& outBuf)
+{
+    PERF_CAMERA_ATRACE();
+    for (auto const& portBufferPair : outBuf) {
+        shared_ptr<CameraBuffer> outBuf = portBufferPair.second;
+        Port port = portBufferPair.first;
+        // If the output buffer is nullptr, that means user doesn't request that buffer,
+        // so it doesn't need to be handled here.
+        if (!outBuf) continue;
+
+        outBuf->updateV4l2Buffer(inV4l2Buf);
+
+        // If it's output edge, the buffer should be returned to PSysDag,
+        // otherwise they should be returned to its consumer.
+        if (mIsOutputEdge) {
+            mPSysDag->onFrameDone(port, outBuf);
+        } else {
+            for (auto &it : mBufferConsumerList) {
+                it->onFrameAvailable(port, outBuf);
+            }
+        }
+    }
+
+    return OK;
+}
+
+int PipeLiteExecutor::notifyStatsDone(TuningMode tuningMode,
+                                      const v4l2_buffer_t& inV4l2Buf,
+                                      const vector<shared_ptr<CameraBuffer>> &outStatsBuffers,
+                                      const vector<EventType> &eventType)
+{
+    PERF_CAMERA_ATRACE();
+
+    // The executor does not produce stats, so no need to notify.
+    if (outStatsBuffers.empty()) return OK;
+
+    /**
+     * Notice for EVENT_PSYS_STATS_BUF_READY:
+     * dvs stat & 3a stat come from different PG, and they are decoded separately
+     * in decodeStatsData().
+     * Fortunately stats data are stored in aiqResultStorage separately,
+     * and user will get them from storage instead of EventData.
+     * So here we can send one event after all stat buffers are decoded/stored/released.
+     */
+    int psysStatBufferCount = 0;
+    for (auto type : eventType) {
+        if (type == EVENT_PSYS_STATS_BUF_READY) {
+            psysStatBufferCount++;
+        }
+    }
+
+    int statsIndex = 0;
+    for (auto statsBuf : outStatsBuffers) {
+        if (!statsBuf) continue;
+
+        if (mStreamId == STILL_STREAM_ID) {
+            LOG2("%s: No statistics data for still pipe in buffer", __func__);
+            releaseStatsBuffer(statsBuf);
+            continue;
+        } else if (inV4l2Buf.sequence <= mLastStatsSequence) {
+            // Ignore old statistics for Raw reprocessing
+            LOG2("%s: new sequence %d is less than last sequence %ld", __func__,
+                 inV4l2Buf.sequence, mLastStatsSequence);
+            releaseStatsBuffer(statsBuf);
+            continue;
+        }
+
+        ia_binary_data *hwStatsData = (ia_binary_data *)(statsBuf->getBufferAddr());
+        if (hwStatsData->data == nullptr || hwStatsData->size == 0) {
+            LOGW("%s: No statistics data in buffer", __func__);
+            releaseStatsBuffer(statsBuf);
+            continue;
+        }
+
+        statsBuf->updateV4l2Buffer(inV4l2Buf);
+
+        // Decode the statistics data
+        if (eventType[statsIndex] == EVENT_PSYS_STATS_BUF_READY) {
+            mAdaptor->decodeStatsData(tuningMode, statsBuf, mGraphConfig);
+            psysStatBufferCount--;
+        }
+
+        // Notify listeners after all buffers done for type STATS_BUF_READY
+        // Notify immediately for other types
+        if (eventType[statsIndex] != EVENT_PSYS_STATS_BUF_READY
+            || !psysStatBufferCount) {
+            EventDataStatsReady statsReadyData;
+            statsReadyData.sequence = statsBuf->getSequence();
+            statsReadyData.timestamp.tv_sec = statsBuf->getTimestamp().tv_sec;
+            statsReadyData.timestamp.tv_usec = statsBuf->getTimestamp().tv_usec;
+            EventData eventData;
+            eventData.type = eventType[statsIndex];
+            eventData.buffer = statsBuf;
+            eventData.data.statsReady = statsReadyData;
+            notifyListeners(eventData);
+        }
+
+        releaseStatsBuffer(statsBuf);
+        statsIndex++;
+    }
+
+    if (mStreamId == VIDEO_STREAM_ID && inV4l2Buf.sequence > mLastStatsSequence) {
+        mLastStatsSequence = inV4l2Buf.sequence;
+    }
+
+    return OK;
+}
+
+int PipeLiteExecutor::allocBuffers()
+{
+    LOG1("%s executor:%s", __func__, mName.c_str());
+
+    releaseBuffers();
+
+    // Allocate buffer between PGs (internal)
+    for (auto const& item : mTerminalsDesc) {
+        const TerminalDescriptor& termDesc = item.second;
+        if (!termDesc.enabled) {
+            continue;
+        }
+
+        if (termDesc.assignedPort != INVALID_PORT
+            && !(findPGExecutor(termDesc.sinkStage) && findPGExecutor(termDesc.sourceStage))) {
+            // Don't allocate buffer here for external connection (has valid port)
+            continue;
+        }
+
+        // Allocated already
+        if (mPGBuffers.find(termDesc.terminal) != mPGBuffers.end()) {
+            continue;
+        }
+
+        int srcFmt = termDesc.frameDesc.mFormat;
+        int srcWidth = termDesc.frameDesc.mWidth;
+        int srcHeight = termDesc.frameDesc.mHeight;
+        int size = PGCommon::getFrameSize(srcFmt, srcWidth, srcHeight, true);
+        shared_ptr<CameraBuffer> buf = CameraBuffer::create(mCameraId,
+                     BUFFER_USAGE_PSYS_INPUT, V4L2_MEMORY_USERPTR, size, 0, srcFmt, srcWidth, srcHeight);
+        CheckError(!buf, NO_MEMORY, "@%s: Allocate producer buffer failed", __func__);
+        mPGBuffers[termDesc.sinkTerminal] = buf;
+        mPGBuffers[termDesc.sourceTerminal] = buf;
+    }
+
+    for (auto &unit : mPGExecutors) {
+        // Assign internal buffers for terminals of PGs according to connection
+        for (auto &terminal : unit.inputTerminals) {
+            if (mPGBuffers.find(terminal) != mPGBuffers.end()) {
+                unit.inputBuffers[terminal] = mPGBuffers[terminal];
+            }
+        }
+        for (auto &terminal : unit.outputTerminals) {
+            if (mPGBuffers.find(terminal) != mPGBuffers.end()) {
+                unit.outputBuffers[terminal] = mPGBuffers[terminal];
+            }
+        }
+
+        // Allocate stats buffers if needed.
+        unsigned int statsBufferCount = unit.statKernelUids.size();
+        if (!statsBufferCount) {
+            continue;
+        }
+        for (unsigned int i = 0; i < MAX_BUFFER_COUNT * statsBufferCount; i++) {
+            shared_ptr<CameraBuffer> statsBuf = CameraBuffer::create(mCameraId,
+                         BUFFER_USAGE_PSYS_STATS, V4L2_MEMORY_USERPTR, sizeof(ia_binary_data), i);
+            CheckError(!statsBuf, NO_MEMORY, "Executor %s: Allocate stats buffer failed", mName.c_str());
+
+            AutoMutex lock(mStatsBuffersLock);
+            mStatsBuffers.push(statsBuf);
+        }
+    }
+
+    // Allocate buffers for producer executor (external)
+    // Ignore input edge due to no producer
+    if (!mIsInputEdge) {
+        for (auto const& terminal : mPGExecutors.front().inputTerminals) {
+            Port inputPort = mTerminalsDesc[terminal].assignedPort;
+
+            int srcFmt = mTerminalsDesc[terminal].frameDesc.mFormat;
+            int srcWidth = mTerminalsDesc[terminal].frameDesc.mWidth;
+            int srcHeight = mTerminalsDesc[terminal].frameDesc.mHeight;
+            // Get frame size with aligned height taking in count for internal buffers.
+            // To garantee PSYS kernel like GDC always get enough buffer size to process.
+            int size = PGCommon::getFrameSize(srcFmt, srcWidth, srcHeight, true);
+            for (int i = 0; i < MAX_BUFFER_COUNT; i++) {
+                // Prepare internal frame buffer for its producer.
+                shared_ptr<CameraBuffer> buf = CameraBuffer::create(mCameraId,
+                             BUFFER_USAGE_PSYS_INPUT, V4L2_MEMORY_USERPTR, size, i, srcFmt, srcWidth, srcHeight);
+                CheckError(!buf, NO_MEMORY, "@%s: Allocate producer buffer failed", __func__);
+                mInternalBuffers[inputPort].push_back(buf);
+
+                mBufferProducer->qbuf(inputPort, buf);
+            }
+        }
+    }
+
+    // Allocate internal output buffers to support pipe execution without user output buffer
+    for (auto const &item : mOutputFrameInfo) {
+        int fmt = item.second.format;
+        int width = item.second.width;
+        int height = item.second.height;
+        int size = CameraUtils::getFrameSize(fmt, width, height, true);
+        shared_ptr<CameraBuffer> buf = CameraBuffer::create(mCameraId,
+                     BUFFER_USAGE_PSYS_INPUT, V4L2_MEMORY_USERPTR, size, 0, fmt, width, height);
+        CheckError(!buf, NO_MEMORY, "@%s: Allocate internal output buffer failed", __func__);
+        mInternalOutputBuffers[item.first]= buf;
+    }
+
+    return OK;
+}
+
+void PipeLiteExecutor::releaseBuffers()
+{
+    LOG1("%s executor:%s", __func__, mName.c_str());
+
+    // Release internel frame buffers
+    mInternalOutputBuffers.clear();
+    mInternalBuffers.clear();
+    mPGBuffers.clear();
+
+    // Release stats buffers
+    {
+        AutoMutex lock(mStatsBuffersLock);
+        while (!mStatsBuffers.empty()) mStatsBuffers.pop();
+    }
+}
+
+PipeLiteExecutor::ExecutorUnit* PipeLiteExecutor::findPGExecutor(ia_uid stageId)
+{
+    for (unsigned int i = 0; i < mPGExecutors.size(); i++) {
+        if (mPGExecutors[i].stageId == stageId) {
+            return &mPGExecutors[i];
+        }
+    }
+    return nullptr;
+}
+
+void PipeLiteExecutor::getTerminalPorts(const vector<ia_uid>& terminals,
+                                        map<ia_uid, Port>& terminalPortMap) const
+{
+    terminalPortMap.clear();
+    for (auto terminal : terminals) {
+        const TerminalDescriptor& termDesc = mTerminalsDesc.at(terminal);
+        if (termDesc.enabled && termDesc.assignedPort != INVALID_PORT) {
+            terminalPortMap[terminal] = termDesc.assignedPort;
+        }
+    }
+}
+
+void PipeLiteExecutor::getTerminalFrameInfos(const vector<ia_uid>& terminals,
+                                             map<ia_uid, FrameInfo>& infoMap) const
+{
+    infoMap.clear();
+    for (auto terminal : terminals) {
+        const TerminalDescriptor& termDesc = mTerminalsDesc.at(terminal);
+        if (termDesc.enabled) {
+            infoMap[terminal] = termDesc.frameDesc;
+        }
+    }
+}
+
+void PipeLiteExecutor::getDisabledTerminalsForPG(ia_uid stageId, vector<ia_uid>& terminals) const
+{
+    terminals.clear();
+    for (auto const item : mTerminalsDesc) {
+        const TerminalDescriptor& termDesc = item.second;
+        if (termDesc.stageId == stageId && !termDesc.enabled) {
+            terminals.push_back(termDesc.terminal);
+        }
+    }
+}
+
+void PipeLiteExecutor::getTerminalBuffersFromExternal(
+        const vector<ia_uid>& terminals,
+        const map<Port, shared_ptr<CameraBuffer> >& externals,
+        map<ia_uid, shared_ptr<CameraBuffer> >& internals) const
+{
+    for (auto &terminal : terminals) {
+        Port port = mTerminalsDesc.at(terminal).assignedPort;
+        if (externals.find(port) != externals.end()) {
+            internals[terminal] = externals.at(port);
+        }
+    }
+}
+
+void PipeLiteExecutor::dumpPGs() const
+{
+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_LEVEL2)) return;
+
+    LOG2("============= dump PGs for executor %s =================", getName());
+    if (mIsInputEdge) {
+        LOG2("This is input edge");
+    }
+    if (mIsOutputEdge) {
+        LOG2("This is output edge");
+    }
+    for (auto const &unit : mPGExecutors) {
+        ia_uid stageId = psys_2600_pg_uid(unit.pgId);
+        LOG2("    PG: %d: %s, stageId %d", unit.pgId, unit.pg->getName(), stageId);
+
+        LOG2("        InTerms: %zu", unit.inputTerminals.size());
+        for (auto const &term : unit.inputTerminals) {
+            shared_ptr<CameraBuffer> buffer= nullptr;
+            if (mPGBuffers.find(term) != mPGBuffers.end()) {
+                buffer = mPGBuffers.at(term);
+            }
+
+            const TerminalDescriptor& termDesc = mTerminalsDesc.at(term);
+            if (termDesc.enabled) {
+                LOG2("            %d: %dx%d, 0x%x, port %d, buf %p",
+                     termDesc.terminal - termDesc.stageId - 1,
+                     termDesc.frameDesc.mWidth, termDesc.frameDesc.mHeight,
+                     termDesc.frameDesc.mFormat,
+                     termDesc.assignedPort, buffer.get());
+            } else {
+                LOG2("            %d: %dx%d, 0x%x, disabled",
+                     termDesc.terminal - termDesc.stageId - 1,
+                     termDesc.frameDesc.mWidth, termDesc.frameDesc.mHeight,
+                     termDesc.frameDesc.mFormat);
+            }
+        }
+
+        LOG2("        OutTerms: %zu", unit.outputTerminals.size());
+        for (auto const &term : unit.outputTerminals) {
+            shared_ptr<CameraBuffer> buffer= nullptr;
+            if (mPGBuffers.find(term) != mPGBuffers.end()) {
+                buffer = mPGBuffers.at(term);
+            }
+
+            const TerminalDescriptor& termDesc = mTerminalsDesc.at(term);
+            if (termDesc.enabled) {
+                LOG2("            %d: %dx%d, 0x%x, port %d, buf %p",
+                     termDesc.terminal - termDesc.stageId - 1,
+                     termDesc.frameDesc.mWidth, termDesc.frameDesc.mHeight,
+                     termDesc.frameDesc.mFormat,
+                     termDesc.assignedPort, buffer.get());
+            } else {
+                LOG2("            %d: %dx%d, 0x%x, disabled",
+                     termDesc.terminal - termDesc.stageId - 1,
+                     termDesc.frameDesc.mWidth, termDesc.frameDesc.mHeight,
+                     termDesc.frameDesc.mFormat);
+            }
+        }
+    }
+    LOG2("============= dump done for %s =================", getName());
+}
+
+}
diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.h b/camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.h
new file mode 100644
index 000000000000..f6cd6df949c2
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.h
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <map>
+#include <vector>
+#include <memory>
+#include <string>
+#include <utility> // For std::pair, std::make_pair
+
+#include "Parameters.h"
+#include "CameraBuffer.h"
+#include "BufferQueue.h"
+#include "psysprocessor/PGCommon.h"
+#include "PolicyManager.h"
+#include "IspParamAdaptor.h"
+#include "GraphConfig.h"
+
+namespace icamera {
+
+class PSysDAG;
+
+typedef std::map<Port, std::shared_ptr<CameraBuffer>> CameraBufferPortMap;
+
+class PipeLiteExecutor : public BufferQueue {
+public:
+    PipeLiteExecutor(int cameraId, const ExecutorPolicy &policy,
+                     std::vector<std::string> exclusivePGs,
+                     PSysDAG *psysDag, std::shared_ptr<IGraphConfig> gc);
+    ~PipeLiteExecutor();
+
+    int start();
+    void stop();
+    int initPipe();
+    void notifyStop();
+
+    int releaseStatsBuffer(const std::shared_ptr<CameraBuffer> &statsBuf);
+
+    void setStreamId(int streamId) { mStreamId = streamId; }
+    void setIspParamAdaptor(IspParamAdaptor* adaptor) { mAdaptor = adaptor; }
+    void setPolicyManager(PolicyManager* policyManager) { mPolicyManager = policyManager; }
+    void setNotifyPolicy(ExecutorNotifyPolicy notifyPolicy) { mNotifyPolicy = notifyPolicy; }
+
+    void getOutputTerminalPorts(std::map<ia_uid, Port>& outputTerminals) const;
+    void getInputTerminalPorts(std::map<ia_uid, Port>& terminals) const;
+    bool hasOutputTerminal(ia_uid sinkTerminal);
+
+    // Link output terminals of producer to its input terminals
+    int setInputTerminals(const std::map<ia_uid, Port>& sourceTerminals);
+    int registerOutBuffers(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
+    int registerInBuffers(Port port, const std::shared_ptr<CameraBuffer> &inBuf);
+
+    /**
+     * Check if the two given stream configs are the same.
+     */
+    bool isSameStreamConfig(const stream_t& internal, const stream_t& external,
+                            ConfigMode configMode, bool checkStreamId) const;
+
+    bool isInputEdge() { return mIsInputEdge; }
+    bool isOutputEdge() { return mIsOutputEdge; }
+
+    const char* getName() const { return mName.c_str(); }
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(PipeLiteExecutor);
+
+private:
+    struct TerminalDescriptor{
+        ia_uid terminal;
+        ia_uid stageId;
+
+        ia_uid sourceTerminal;
+        ia_uid sinkTerminal;
+        ia_uid sourceStage;
+        ia_uid sinkStage;
+
+        FrameInfo frameDesc;
+
+        bool enabled;
+        bool hasConnection; // has related sink or source
+                            // expection: sis output, sink = source
+        Port assignedPort;  // INVALID_PORT for terminal without connection
+        int usrStreamId;
+    };
+
+    struct ExecutorUnit {
+        // Initialized during creation/configuration
+        int pgId;
+        ia_uid stageId;
+        std::shared_ptr<PGCommon> pg;
+        std::vector<ia_uid> statKernelUids;
+        std::vector<ia_uid> sisKernelUids;
+
+        // Initialized during connection analysis
+        std::vector<ia_uid> inputTerminals; // including disabled terminals
+        std::vector<ia_uid> outputTerminals;
+
+        // Initialized during buffer allocation
+        std::map<ia_uid, std::shared_ptr<CameraBuffer>> inputBuffers;
+        std::map<ia_uid, std::shared_ptr<CameraBuffer>> outputBuffers;
+    };
+
+private:
+    int processNewFrame();
+    int runPipe(std::map<Port, std::shared_ptr<CameraBuffer>> &inBuffers,
+                std::map<Port, std::shared_ptr<CameraBuffer>> &outBuffers,
+                std::vector<std::shared_ptr<CameraBuffer>> &outStatsBuffers,
+                std::vector<EventType> &eventType);
+
+    int notifyFrameDone(const v4l2_buffer_t& inV4l2Buf, const CameraBufferPortMap& outBuf);
+    int notifyStatsDone(TuningMode tuningMode, const v4l2_buffer_t& inV4l2Buf,
+                        const std::vector<std::shared_ptr<CameraBuffer>> &outStatsBuffers,
+                        const std::vector<EventType> &eventType);
+
+    int createPGs();
+    int analyzeConnections(const std::vector<IGraphType::PipelineConnection>& connVector);
+    int configurePGs();
+    int assignDefaultPortsForTerminals();
+    int storeTerminalInfo(const IGraphType::PipelineConnection& connection);
+
+    /**
+     * Check if there is any valid buffer(not null) in the given port/buffer pairs.
+     */
+    bool hasValidBuffers(const CameraBufferPortMap& buffers);
+
+    int allocBuffers();
+    void releaseBuffers();
+
+    int getStatKernels(int pgId, std::vector<ia_uid>& kernels);
+    int getSisKernels(int pgId, std::vector<ia_uid>& kernels);
+    ExecutorUnit* findPGExecutor(ia_uid stageId);
+    void getDisabledTerminalsForPG(ia_uid stageId, std::vector<ia_uid>& terminals) const;
+    void getTerminalFrameInfos(const std::vector<ia_uid>& terminals,
+                               std::map<ia_uid, FrameInfo>& infos) const;
+    void getTerminalPorts(const std::vector<ia_uid>& terminals,
+                          std:: map<ia_uid, Port>& terminalPortMap) const;
+    void getTerminalBuffersFromExternal(
+                        const std::vector<ia_uid>& terminals,
+                        const std::map<Port, std::shared_ptr<CameraBuffer> >& externals,
+                        std::map<ia_uid, std::shared_ptr<CameraBuffer> >& internals) const;
+
+    int handleSisStats(std::map<ia_uid, std::shared_ptr<CameraBuffer>>& frameBuffers,
+                       const std::shared_ptr<CameraBuffer> &outStatsBuffers);
+
+    void dumpPGs() const;
+
+private:
+    int mCameraId;
+    int mStreamId;
+    std::string mName;
+    std::vector<std::string> mPGNames;
+    std::vector<int> mOpModes;
+    std::shared_ptr<IGraphConfig> mGraphConfig;
+    bool mIsInputEdge;
+    bool mIsOutputEdge;
+    ExecutorNotifyPolicy mNotifyPolicy;
+
+    std::vector<ExecutorUnit> mPGExecutors;
+    IspParamAdaptor* mAdaptor;
+
+    PolicyManager* mPolicyManager;
+
+    // For internal connections (between PGs)
+    std::map<ia_uid, std::shared_ptr<CameraBuffer> > mPGBuffers; // Buffers between PGs
+    std::map<ia_uid, ia_uid> mConnectionMap; // <sink, source>
+    std::map<ia_uid, TerminalDescriptor> mTerminalsDesc;
+
+    int64_t mLastStatsSequence;
+    CameraBufQ mStatsBuffers;
+    Mutex mStatsBuffersLock;
+    std::vector<std::string> mExclusivePGs;
+    PSysDAG *mPSysDag;
+
+    CameraBufferPortMap mInternalOutputBuffers;
+    int mkernelsCountWithStats;
+};
+
+typedef PipeLiteExecutor PipeExecutor;
+}
diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.cpp b/camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.cpp
new file mode 100644
index 000000000000..e51d012daa76
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.cpp
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define LOG_TAG "Camera_PolicyManager"
+
+#include "PolicyManager.h"
+
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+
+using namespace std;
+
+namespace icamera {
+
+PolicyManager::PolicyManager(int cameraId) : mCameraId(cameraId), mIsActive(false)
+{
+    LOG1("@%s: camera id:%d", __func__, mCameraId);
+}
+
+PolicyManager::~PolicyManager()
+{
+    LOG1("@%s: camera id:%d", __func__, mCameraId);
+
+    releaseBundles();
+}
+
+void PolicyManager::releaseBundles()
+{
+    LOG1("@%s: camera id:%d", __func__, mCameraId);
+
+    for (const auto& bundle : mBundles) {
+        delete bundle;
+    }
+
+    mBundles.clear();
+}
+
+void PolicyManager::setActive(bool isActive)
+{
+    AutoMutex lock(mPolicyLock);
+
+    LOG1("@%s: camera id:%d update active mode from %d to %d",
+          __func__, mCameraId, mIsActive, isActive);
+
+    if (mIsActive == isActive) return; // No action is needed if the mode unchanged.
+
+    for (auto& bundle : mBundles) {
+        AutoMutex lock(bundle->mLock);
+
+        bundle->mWaitingCount = 0;
+        bundle->mIsActive = isActive;
+        for (auto& executorData : bundle->mExecutorData) {
+            executorData.second.mRunCount = 0;
+        }
+
+        // Wake up the executors who are waiting for other executors.
+        if (!bundle->mIsActive) {
+            bundle->mCondition.broadcast();
+        }
+    }
+
+    mIsActive = isActive;
+}
+
+int PolicyManager::addExecutorBundle(const vector<string>& executors, const vector<int>& depths)
+{
+    LOG1("@%s: camera id:%d", __func__, mCameraId);
+
+    AutoMutex lock(mPolicyLock);
+
+    uint8_t size = executors.size();
+    CheckError(size != depths.size(),
+          BAD_VALUE, "The size for executor and its depth not match");
+
+    int maxDepth = 0;
+    map<string, ExecutorData> executorData;
+
+    for (uint8_t i = 0; i < size; i++) {
+        executorData[executors[i]] = ExecutorData(depths[i]);
+        if (depths[i] > maxDepth) {
+            maxDepth = depths[i];
+        }
+        LOG1("%s, bundled executor name:%s, depth:%d)", __func__, executors[i].c_str(), depths[i]);
+    }
+
+    ExecutorBundle* bundle = new ExecutorBundle();
+    bundle->mExecutorData = executorData;
+    bundle->mExecutorNum = size;
+    bundle->mMaxDepth = maxDepth;
+    bundle->mWaitingCount = 0;
+    bundle->mIsActive = true;
+
+    mBundles.push_back(bundle);
+
+    return OK;
+}
+
+int PolicyManager::wait(string executorName)
+{
+    ExecutorBundle* bundle = nullptr;
+    {
+        AutoMutex lock(mPolicyLock);
+
+        // No need to wait when it's already inactive.
+        if (!mIsActive) return OK;
+
+        for (const auto& item : mBundles) {
+            if (item->mExecutorData.find(executorName) != item->mExecutorData.end()) {
+                bundle = item;
+                break;
+            }
+        }
+        // If the executor not in mBundles, it means it doesn't need to wait for others.
+        if (bundle == nullptr) return OK;
+    }
+
+    ConditionLock lock(bundle->mLock);
+
+    // If it's already inactive, there is no need to align the executors anymore.
+    if (!bundle->mIsActive) return OK;
+
+    ExecutorData& executorData = bundle->mExecutorData[executorName];
+    executorData.mRunCount++;
+
+    /**
+     * If an executor's run count plus its depth less than the max depth of all executors,
+     * it means the executor can run without checking other executors' status, since other
+     * may wait on this executor's output to reach the precondition of running together.
+     */
+    if (executorData.mRunCount + executorData.mDepth <= bundle->mMaxDepth) {
+        return OK;
+    }
+
+    bundle->mWaitingCount++;
+
+    /**
+     * If waiting count less than total executor number in the bundle, it means
+     * we need to wait for other executors to run with them together.
+     */
+    if (bundle->mWaitingCount < bundle->mExecutorNum) {
+        LOG2("%s: need wait for other executors.", executorName.c_str());
+        // the timeout value is 100ms * executor count
+        int64_t kWaitDuration = 100000000;
+        kWaitDuration *= bundle->mExecutorNum;
+        int ret = bundle->mCondition.waitRelative(lock, kWaitDuration * SLOWLY_MULTIPLIER);
+        CheckWarning(ret == TIMED_OUT, ret, "%s: wait executors timeout", executorName.c_str());
+    } else {
+        bundle->mWaitingCount = 0;
+        bundle->mCondition.broadcast();
+    }
+
+    return OK;
+}
+
+} // end of namespace icamera
+
diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.h b/camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.h
new file mode 100644
index 000000000000..3bef4a8421c3
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2017-2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <map>
+#include <vector>
+#include <string>
+
+#include "iutils/Utils.h"
+#include "iutils/Thread.h"
+
+namespace icamera {
+
+class PolicyManager {
+public:
+    PolicyManager(int cameraId);
+    ~PolicyManager();
+
+    /**
+     * Create a bundle for the given set of executors, and add the bundle into mBundles.
+     * These executors are guaranteed running at the same time.
+     */
+    int addExecutorBundle(const std::vector<std::string>& executors, const std::vector<int>& depths);
+
+    void setActive(bool isActive);
+
+    /**
+     * Check whether the given executor can run or not.
+     * If the executor cannot run then it'll wait for other executors in the same bundle.
+     * Once all executors are ready to run, then a broadcast will be sent out to wake all
+     * executors up and then run together.
+     */
+    int wait(std::string executorName);
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(PolicyManager);
+
+    void releaseBundles();
+
+private:
+    struct ExecutorData {
+        ExecutorData(int depth = 0) : mRunCount(0), mDepth(depth) {}
+        long mRunCount; // How many times the executor has run.
+        int mDepth;     // Indicates how many direct dependencies the executor has.
+    };
+
+    struct ExecutorBundle {
+        std::map<std::string, ExecutorData> mExecutorData; // The index of the map is executor name.
+        int mMaxDepth;     // The max depth among all executors.
+        int mExecutorNum;  // Indicates how many executors the bundle has.
+        int mWaitingCount; // How many executors have already waited.
+        bool mIsActive;
+        //Guard for the Bundle data
+        Mutex mLock;
+        Condition mCondition;
+    };
+
+    int mCameraId;
+    //Guard for the PolicyManager public API
+    Mutex mPolicyLock;
+    std::vector<ExecutorBundle*> mBundles;
+    bool mIsActive;
+};
+
+}
diff --git a/camera/hal/intel/ipu6/src/fd/FaceBase.h b/camera/hal/intel/ipu6/src/fd/FaceBase.h
new file mode 100644
index 000000000000..704090912336
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/fd/FaceBase.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#ifdef FACE_DETECTION
+#include <pvl_config.h>
+#include <pvl_eye_detection.h>
+#include <pvl_face_detection.h>
+#include <pvl_mouth_detection.h>
+#include <pvl_types.h>
+#endif
+
+namespace icamera {
+
+#define RECT_SIZE 4
+#define LM_SIZE 6
+#define MAX_STORE_FACE_DATA_BUF_NUM 3
+
+#define MAX_FACES_DETECTABLE 10
+#define MAX_FACE_FRAME_WIDTH 1920
+#define MAX_FACE_FRAME_HEIGHT 1280
+
+#define MAX_FACE_FRAME_SIZE (MAX_FACE_FRAME_WIDTH * MAX_FACE_FRAME_HEIGHT * 3 / 2)
+
+typedef enum {
+    FD_MODE_OFF,
+    FD_MODE_SIMPLE,  /**< Provide face area */
+    FD_MODE_FULL,    /**< Provide face area, eye and mouth coordinates */
+} face_detection_mode;
+
+/* Face Detection results */
+typedef struct CVFaceDetectionAbstractResult {
+    int faceNum;
+    int faceIds[MAX_FACES_DETECTABLE];
+    int faceLandmarks[LM_SIZE * MAX_FACES_DETECTABLE];
+    int faceRect[RECT_SIZE * MAX_FACES_DETECTABLE];
+    uint8_t faceScores[MAX_FACES_DETECTABLE];
+} CVFaceDetectionAbstractResult;
+
+struct FaceDetectionInitParams {
+    unsigned int max_face_num;
+};
+
+#ifdef FACE_DETECTION
+struct FaceDetectionResult {
+    int faceNum;
+    pvl_face_detection_result faceResults[MAX_FACES_DETECTABLE];
+    pvl_eye_detection_result eyeResults[MAX_FACES_DETECTABLE];
+    pvl_mouth_detection_result mouthResults[MAX_FACES_DETECTABLE];
+};
+
+struct FaceDetectionRunParams {
+    uint8_t data[MAX_FACE_FRAME_SIZE];
+    int32_t bufferHandle;
+    uint32_t size;
+    int32_t width;
+    int32_t height;
+    pvl_image_format format;
+    int32_t stride;
+    int32_t rotation;
+
+    FaceDetectionResult results;
+};
+#endif
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/fd/FaceDetection.cpp b/camera/hal/intel/ipu6/src/fd/FaceDetection.cpp
new file mode 100644
index 000000000000..34d45379484d
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/fd/FaceDetection.cpp
@@ -0,0 +1,529 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "FaceDetection"
+#include "src/fd/FaceDetection.h"
+
+#include <algorithm>
+#include <fstream>
+
+#include "AiqUtils.h"
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+#include "PlatformData.h"
+
+namespace icamera {
+std::unordered_map<int, FaceDetection*> FaceDetection::sInstances;
+Mutex FaceDetection::sLock;
+FaceDetection *FaceDetection::getInstance(int cameraId) {
+    LOG1("@%s, cameraId:%d", __func__, cameraId);
+    CheckError(cameraId < 0 || cameraId >= PlatformData::numberOfCameras(),
+               nullptr, "cameraId %d is error", cameraId);
+
+    if (sInstances.find(cameraId) == sInstances.end()) {
+        return nullptr;
+    }
+
+    return sInstances[cameraId];
+}
+
+FaceDetection *FaceDetection::createInstance(int cameraId,
+                                             unsigned int maxFaceNum, int32_t halStreamId) {
+    LOG1("@%s, cameraId:%d, maxFaceNum:%u, halStreamId:%u",
+         __func__, cameraId, maxFaceNum, halStreamId);
+    CheckError(maxFaceNum > MAX_FACES_DETECTABLE, nullptr,
+               "maxFaceNum %d is error", maxFaceNum);
+    CheckError(cameraId < 0 || cameraId >= PlatformData::numberOfCameras(),
+               nullptr, "cameraId %d is error", cameraId);
+
+    AutoMutex lock(sLock);
+    if (sInstances.find(cameraId) == sInstances.end()) {
+        sInstances[cameraId] = new FaceDetection(cameraId, maxFaceNum, halStreamId);
+    }
+
+    return sInstances[cameraId];
+}
+
+void FaceDetection::destoryInstance(int cameraId) {
+    LOG1("@%s, cameraId:%d", __func__, cameraId);
+    CheckError(cameraId < 0 || cameraId >= PlatformData::numberOfCameras(),
+               VOID_VALUE, "cameraId is error");
+
+    AutoMutex lock(sLock);
+    if (sInstances.find(cameraId) != sInstances.end()) {
+        delete sInstances[cameraId];
+        sInstances.erase(cameraId);
+    }
+}
+
+FaceDetection::FaceDetection(int cameraId, unsigned int maxFaceNum, int32_t halStreamId) :
+    mCameraId(cameraId),
+    mInitialized(false),
+    mHalStreamId(halStreamId),
+    mWidth(0),
+    mHeight(0) {
+    LOG1("@%s, cameraId:%d, maxFaceNum:%d", __func__, cameraId, maxFaceNum);
+    CLEAR(mResult);
+
+    /* TODO: we should add CameraOrientationDetector to change the camera orientation */
+    camera_info_t info;
+    PlatformData::getCameraInfo(mCameraId, info);
+    mSensorOrientation = info.orientation;
+
+    /* start face engine pthread */
+    int ret = run("FaceDetection" + std::to_string(cameraId), PRIORITY_NORMAL);
+    CheckError(ret != OK, VOID_VALUE, "Camera thread failed to start, ret %d", ret);
+
+    /* init IntelFaceDetection */
+    FaceDetectionInitParams params;
+    params.max_face_num = maxFaceNum;
+    mFace = std::unique_ptr<IntelFaceDetection>(new IntelFaceDetection());
+    ret = mFace->init(&params, sizeof(FaceDetectionInitParams));
+    CheckError(ret != OK, VOID_VALUE, "mFace.init fails, ret %d", ret);
+
+    for (int i = 0; i < MAX_STORE_FACE_DATA_BUF_NUM; i++) {
+        FaceDetectionRunParams *memRunBuf = mFace->prepareRunBuffer(i);
+        CheckError(!memRunBuf, VOID_VALUE, "prepareRunBuffer fails");
+        mMemRunPool.push(memRunBuf);
+    }
+
+    mInitialized = true;
+}
+
+FaceDetection::~FaceDetection() {
+    LOG1("@%s", __func__);
+    mFace->deinit();
+    requestExit();
+
+    AutoMutex l(mRunBufQueueLock);
+    mRunCondition.notify_one();
+}
+
+FaceDetectionRunParams *FaceDetection::acquireRunBuf() {
+    AutoMutex l(mMemRunPoolLock);
+    LOG2("@%s, mRunPool.size is %zu", __func__, mMemRunPool.size());
+
+    FaceDetectionRunParams *runBuffer = nullptr;
+    if (!mMemRunPool.empty()) {
+        runBuffer = mMemRunPool.front();
+        mMemRunPool.pop();
+        CLEAR(*runBuffer);
+    }
+    return runBuffer;
+}
+
+void FaceDetection::returnRunBuf(FaceDetectionRunParams *memRunBuf) {
+    LOG2("@%s, Push back run face engine buffer", __func__);
+
+    AutoMutex l(mMemRunPoolLock);
+    mMemRunPool.push(memRunBuf);
+}
+
+void FaceDetection::runFaceDetection(const camera_buffer_t &buffer) {
+    LOG1("@%s", __func__);
+    CheckError(mInitialized == false, VOID_VALUE, "mInitialized is false");
+
+    if (PlatformData::isFaceEngineSyncRunning(mCameraId)) {
+        runFaceDetectionBySync(buffer);
+    } else {
+        runFaceDetectionByAsync(buffer);
+    }
+}
+
+void FaceDetection::runFaceDetectionBySync(const camera_buffer_t &buffer) {
+    LOG1("@%s", __func__);
+    CheckError(mInitialized == false, VOID_VALUE, "mInitialized is false");
+
+    int size = buffer.s.size;
+    int width = buffer.s.width;
+    int height = buffer.s.height;
+    CheckError(size > MAX_FACE_FRAME_SIZE, VOID_VALUE,
+               "face frame buffer is too small!, w:%d,h:%d,size:%d", width, height, size);
+
+    FaceDetectionRunParams *params = acquireRunBuf();
+    CheckError(!params, VOID_VALUE, "Fail to acquire face engine buffer");
+
+    params->size = size;
+    params->width = width;
+    params->height = height;
+    /* TODO: image.rotation is (mSensorOrientation + mCamOriDetector->getOrientation()) % 360 */
+    params->rotation = mSensorOrientation % 360;
+    params->format = pvl_image_format_nv12;
+    params->stride = buffer.s.stride;
+    params->bufferHandle = -1;
+
+    nsecs_t startTime = CameraUtils::systemTime();
+
+#ifdef ENABLE_SANDBOXING
+    int ret = mFace->run(params, sizeof(FaceDetectionRunParams), buffer.dmafd);
+#else
+    int ret = mFace->run(params, sizeof(FaceDetectionRunParams), buffer.addr);
+#endif
+
+    LOG2("@%s: ret:%d, it takes need %ums", __func__, ret,
+         (unsigned)((CameraUtils::systemTime() - startTime) / 1000000));
+
+    {
+        AutoMutex l(mFaceResultLock);
+        if (ret == OK) {
+            mResult = params->results;
+        } else {
+            CLEAR(mResult);
+        }
+    }
+
+    returnRunBuf(params);
+}
+
+void FaceDetection::runFaceDetectionByAsync(const camera_buffer_t &buffer) {
+    LOG1("@%s", __func__);
+    CheckError(mInitialized == false, VOID_VALUE, "mInitialized is false");
+
+    int size = buffer.s.size;
+    mWidth = buffer.s.width;
+    mHeight = buffer.s.height;
+    CheckError(size > MAX_FACE_FRAME_SIZE, VOID_VALUE,
+               "face frame buffer is too small!, w:%d,h:%d,size:%d", mWidth, mHeight, size);
+
+    FaceDetectionRunParams *params = acquireRunBuf();
+    CheckError(!params, VOID_VALUE, "Fail to acquire face engine buffer");
+
+    params->size = size;
+    MEMCPY_S(params->data, MAX_FACE_FRAME_SIZE, buffer.addr, size);
+    params->width = mWidth;
+    params->height = mHeight;
+    /* TODO: image.rotation is (mSensorOrientation + mCamOriDetector->getOrientation()) % 360 */
+    params->rotation = mSensorOrientation % 360;
+    params->format = pvl_image_format_nv12;
+    params->stride = buffer.s.stride;
+    params->bufferHandle = -1;
+
+    AutoMutex l(mRunBufQueueLock);
+    mRunBufQueue.push(params);
+    mRunCondition.notify_one();
+}
+
+bool FaceDetection::threadLoop() {
+    LOG1("@%s", __func__);
+
+    FaceDetectionRunParams *faceParams = nullptr;
+
+    {
+        ConditionLock lock(mRunBufQueueLock);
+        if (mRunBufQueue.empty()) {
+            std::cv_status ret = mRunCondition.wait_for(
+                                     lock,
+                                     std::chrono::nanoseconds(kMaxDuration * SLOWLY_MULTIPLIER));
+            if (ret == std::cv_status::timeout) {
+                LOGW("@%s, wait request time out", __func__);
+            }
+
+            return true;
+        }
+        faceParams = mRunBufQueue.front();
+        mRunBufQueue.pop();
+    }
+
+    nsecs_t startTime = CameraUtils::systemTime();
+
+    int ret = mFace->run(faceParams, sizeof(FaceDetectionRunParams));
+    LOG2("@%s: ret:%d, it takes need %ums", __func__, ret,
+         (unsigned)((CameraUtils::systemTime() - startTime) / 1000000));
+
+    {
+        AutoMutex l(mFaceResultLock);
+        if (ret == OK) {
+            mResult = faceParams->results;
+        } else {
+            CLEAR(mResult);
+        }
+    }
+
+    returnRunBuf(faceParams);
+    return true;
+}
+
+int FaceDetection::getFaceNum() {
+    LOG2("@%s", __func__);
+    CheckError(mInitialized == false, 0, "mInitialized is false");
+
+    AutoMutex l(mFaceResultLock);
+    return mResult.faceNum;
+}
+
+/* The result is pvl's original reuslt */
+int FaceDetection::getFaceDetectionResult(FaceDetectionResult *result) {
+    LOG1("@%s", __func__);
+    CheckError(mInitialized == false, UNKNOWN_ERROR, "mInitialized is false");
+    CheckError(!result, UNKNOWN_ERROR, "mResult is nullptr");
+
+    AutoMutex l(mFaceResultLock);
+    MEMCPY_S(result, sizeof(FaceDetectionResult), &mResult, sizeof(FaceDetectionResult));
+    return OK;
+}
+
+/* Get current frame width and hight */
+void FaceDetection::getCurrentFrameWidthAndHight(int *frameWidth, int *frameHigth) {
+    LOG2("@%s", __func__);
+    CheckError(mInitialized == false, VOID_VALUE, "mInitialized is false");
+    CheckError(!frameWidth || !frameHigth, VOID_VALUE, "input paramter is error");
+
+    *frameWidth = mWidth;
+    *frameHigth = mHeight;
+}
+
+/* Get current hal stream id */
+void FaceDetection::getHalStreamId(int32_t *halStreamId) {
+    LOG2("@%s", __func__);
+    CheckError(mInitialized == false, VOID_VALUE, "mInitialized is false");
+    CheckError(!halStreamId, VOID_VALUE, "halStreamId is nullptr");
+
+    *halStreamId = mHalStreamId;
+}
+
+/* The result for 3A AE */
+int FaceDetection::getResult(int cameraId, ia_atbx_face_state *faceState) {
+    LOG1("@%s", __func__);
+    CheckError(!faceState, UNKNOWN_ERROR, "faceState is nullptr");
+    CheckError(cameraId < 0 || cameraId >= PlatformData::numberOfCameras(),
+               UNKNOWN_ERROR, "cameraId %d is error", cameraId);
+
+    int width = 0;
+    int height = 0;
+    int32_t halStreamId = 0;
+
+    FaceDetectionResult faceDetectionResult;
+    {
+        AutoMutex lock(sLock);
+        FaceDetection *fdInstance = FaceDetection::getInstance(cameraId);
+        CheckError(!fdInstance, UNKNOWN_ERROR, "Failed to get instance");
+
+        int ret = fdInstance->getFaceDetectionResult(&faceDetectionResult);
+        CheckError(ret != OK, UNKNOWN_ERROR, "Failed to get result, ret %d", ret);
+        fdInstance->getCurrentFrameWidthAndHight(&width, &height);
+        fdInstance->getHalStreamId(&halStreamId);
+    }
+
+    /*
+    face rectangle from face lib: (Ln, Tn, Rn, Bn)
+    3A statistics Surface: ((IA_COORDINATE_RIGHT - IA_COORDINATE_LEFT) *
+                            (IA_COORDINATE_BOTTOM - IA_COORDINATE_TOP))
+    target coordinate of face rectangle to the 3A lib: (LL, TT, RR, BB)
+    FOV ratio (which is <= 1): (fovRatioW * fovRatioH)
+
+    formular:
+    LL = Ln * fovRatioW + (1 - fovRatioW) / 2 * (IA_COORDINATE_RIGHT - IA_COORDINATE_LEFT)
+    TT = Tn * fovRatioH + (1 - fovRatioH) / 2 * (IA_COORDINATE_BOTTOM - IA_COORDINATE_TOP)
+    RR and BB are the similar.
+    */
+
+    float fovRatioW = 1;
+    float fovRatioH = 1;
+    int ret = PlatformData::getScalerInfo(cameraId, halStreamId, &fovRatioW, &fovRatioH);
+    LOG2("@%s, getScalerInfo ret:%d, fovRatioW:%f, fovRatioH:%f",
+         __func__, ret, fovRatioW, fovRatioH);
+
+    camera_coordinate_system_t activePixelArray = PlatformData::getActivePixelArray(cameraId);
+    float fovRatioWTmp = width / ((activePixelArray.right - activePixelArray.left) * fovRatioW);
+    float fovRatioHTmp = height / ((activePixelArray.bottom - activePixelArray.top) * fovRatioH);
+    float offsetW = (1.0 - fovRatioWTmp) / 2.0 * (IA_COORDINATE_RIGHT - IA_COORDINATE_LEFT);
+    float offsetH = (1.0 - fovRatioHTmp) / 2.0 * (IA_COORDINATE_BOTTOM - IA_COORDINATE_TOP);
+
+    LOG1("@%s, faceNum:%d, mHeight:%d, mWidth:%d", __func__,
+         faceDetectionResult.faceNum, height, width);
+
+    faceState->num_faces = faceDetectionResult.faceNum;
+
+    for (int i = 0; i < faceDetectionResult.faceNum; i++) {
+        CLEAR(faceState->faces[i]);
+        faceState->faces[i].face_area.left =
+         static_cast<int>(faceDetectionResult.faceResults[i].rect.left * fovRatioWTmp + offsetW);
+        faceState->faces[i].face_area.top =
+         static_cast<int>(faceDetectionResult.faceResults[i].rect.top * fovRatioHTmp + offsetH);
+        faceState->faces[i].face_area.bottom =
+         static_cast<int>(
+                         faceDetectionResult.faceResults[i].rect.bottom * fovRatioHTmp + offsetH);
+        faceState->faces[i].face_area.right =
+         static_cast<int>(
+                          faceDetectionResult.faceResults[i].rect.right * fovRatioWTmp + offsetW);
+        faceState->faces[i].rip_angle = faceDetectionResult.faceResults[i].rip_angle;
+        faceState->faces[i].rop_angle = faceDetectionResult.faceResults[i].rop_angle;
+        faceState->faces[i].tracking_id = faceDetectionResult.faceResults[i].tracking_id;
+        faceState->faces[i].confidence = faceDetectionResult.faceResults[i].confidence;
+        faceState->faces[i].person_id = -1;
+        faceState->faces[i].similarity = 0;
+        faceState->faces[i].best_ratio = 0;
+        faceState->faces[i].face_condition = 0;
+
+        faceState->faces[i].smile_state = 0;
+        faceState->faces[i].smile_score = 0;
+        faceState->faces[i].mouth.x =
+          static_cast<int>(faceDetectionResult.mouthResults[i].mouth.x * fovRatioWTmp + offsetW);
+         faceState->faces[i].mouth.y =
+          static_cast<int>(faceDetectionResult.mouthResults[i].mouth.y * fovRatioHTmp + offsetH);
+
+        faceState->faces[i].eye_validity = 0;
+    }
+
+    return OK;
+}
+
+/* The result for android statistics metadata */
+int FaceDetection::getResult(int cameraId, CVFaceDetectionAbstractResult *result) {
+    LOG1("@%s", __func__);
+    CheckError(!result, UNKNOWN_ERROR, "result is nullptr");
+    CheckError(cameraId < 0 || cameraId >= PlatformData::numberOfCameras(),
+               UNKNOWN_ERROR, "cameraId %d is error", cameraId);
+
+    int width = 0;
+    int height = 0;
+    FaceDetectionResult faceDetectionResult;
+    {
+        AutoMutex lock(sLock);
+        FaceDetection *fdInstance = FaceDetection::getInstance(cameraId);
+        CheckError(!fdInstance, UNKNOWN_ERROR, "Failed to get instance");
+
+        int ret = fdInstance->getFaceDetectionResult(&faceDetectionResult);
+        CheckError(ret != OK, UNKNOWN_ERROR, "Failed to get result");
+        fdInstance->getCurrentFrameWidthAndHight(&width, &height);
+    }
+
+    const camera_coordinate_system_t iaCoord = {IA_COORDINATE_LEFT, IA_COORDINATE_TOP,
+                                                IA_COORDINATE_RIGHT, IA_COORDINATE_BOTTOM};
+
+    // construct android coordinate based on active pixel array
+    camera_coordinate_system_t activePixelArray = PlatformData::getActivePixelArray(cameraId);
+
+    int activeHeight = activePixelArray.bottom - activePixelArray.top;
+    int activeWidth = activePixelArray.right - activePixelArray.left;
+    const camera_coordinate_system_t sysCoord = {0, 0,  activeWidth, activeHeight};
+    camera_coordinate_t srcCoord = {0, 0};
+    camera_coordinate_t destCoord = {0, 0};
+
+    int verticalCrop = 0, horizontalCrop = 0;
+    bool imageRotationUnchanged = true;
+
+    // do extra conversion if the image ratio is not the same ratio with the android coordinate.
+    if (height * activeWidth != width * activeHeight) {
+        imageRotationUnchanged = false;
+        int gap = (width * activeHeight / activeWidth) - height;
+
+        if (gap > 0) {
+            // vertical crop pixel
+            verticalCrop = gap;
+        } else if (gap < 0) {
+            // horizontal crop pixel
+            horizontalCrop = height * activeWidth / activeHeight - width;
+        }
+    }
+
+    const camera_coordinate_system_t fillFrameCoord = {0, 0,
+                                                       width + horizontalCrop,
+                                                       height + verticalCrop};
+    const camera_coordinate_system_t frameCoord = {0, 0, width, height};
+
+    CLEAR(*result);
+    for (int i = 0; i < faceDetectionResult.faceNum; i++) {
+        if (i == MAX_FACES_DETECTABLE)
+            break;
+
+        camera_coordinate_t pointCoord = {0, 0};
+        result->faceScores[i] = faceDetectionResult.faceResults[i].confidence;
+        result->faceIds[i] = faceDetectionResult.faceResults[i].tracking_id;
+
+        if (imageRotationUnchanged) {
+            srcCoord = {faceDetectionResult.faceResults[i].rect.left,
+                        faceDetectionResult.faceResults[i].rect.top};
+            destCoord = AiqUtils::convertCoordinateSystem(iaCoord, sysCoord, srcCoord);
+            result->faceRect[i * 4] = destCoord.x;  // rect.left
+            result->faceRect[i * 4 + 1] = destCoord.y;  // rect.top
+
+            srcCoord = {faceDetectionResult.faceResults[i].rect.right,
+                        faceDetectionResult.faceResults[i].rect.bottom};
+            destCoord = AiqUtils::convertCoordinateSystem(iaCoord, sysCoord, srcCoord);
+            result->faceRect[i * 4 + 2] = destCoord.x;  // rect.right
+            result->faceRect[i * 4 + 3] = destCoord.y;  // rect.bottom
+
+            srcCoord = {faceDetectionResult.eyeResults[i].left_eye.x,
+                        faceDetectionResult.eyeResults[i].left_eye.y};
+            destCoord = AiqUtils::convertCoordinateSystem(iaCoord, sysCoord, srcCoord);
+            result->faceLandmarks[i * 6] = destCoord.x;  // left_eye.x;
+            result->faceLandmarks[i * 6 + 1] = destCoord.y;  // left_eye.y;
+
+            srcCoord = {faceDetectionResult.eyeResults[i].right_eye.x,
+                        faceDetectionResult.eyeResults[i].right_eye.y};
+            destCoord = AiqUtils::convertCoordinateSystem(iaCoord, sysCoord, srcCoord);
+            result->faceLandmarks[i * 6 + 2] = destCoord.x;  // right_eye.x;
+            result->faceLandmarks[i * 6 + 3] = destCoord.y;  // right_eye.y;
+
+            srcCoord = {faceDetectionResult.mouthResults[i].mouth.x,
+                        faceDetectionResult.mouthResults[i].mouth.y};
+            destCoord = AiqUtils::convertCoordinateSystem(iaCoord, sysCoord, srcCoord);
+            result->faceLandmarks[i * 6 + 4] = destCoord.x;  // mouth.x;
+            result->faceLandmarks[i * 6 + 5] = destCoord.y;  // mouth.y;
+        } else {
+            srcCoord = {faceDetectionResult.faceResults[i].rect.left,
+                        faceDetectionResult.faceResults[i].rect.top};
+            pointCoord = AiqUtils::convertCoordinateSystem(iaCoord, frameCoord, srcCoord);
+            pointCoord.x += horizontalCrop / 2;
+            pointCoord.y += verticalCrop / 2;
+            destCoord = AiqUtils::convertCoordinateSystem(fillFrameCoord, sysCoord, pointCoord);
+            result->faceRect[i * 4] = destCoord.x;  // rect.left
+            result->faceRect[i * 4 + 1] = destCoord.y;  // rect.top
+
+            srcCoord = {faceDetectionResult.faceResults[i].rect.right,
+                        faceDetectionResult.faceResults[i].rect.bottom};
+            pointCoord = AiqUtils::convertCoordinateSystem(iaCoord, frameCoord, srcCoord);
+            pointCoord.x += horizontalCrop / 2;
+            pointCoord.y += verticalCrop / 2;
+            destCoord = AiqUtils::convertCoordinateSystem(fillFrameCoord, sysCoord, pointCoord);
+            result->faceRect[i * 4 + 2] = destCoord.x;  // rect.right
+            result->faceRect[i * 4 + 3] = destCoord.y;  // rect.bottom
+
+            srcCoord = {faceDetectionResult.eyeResults[i].left_eye.x,
+                        faceDetectionResult.eyeResults[i].left_eye.y};
+            pointCoord = AiqUtils::convertCoordinateSystem(iaCoord, frameCoord, srcCoord);
+            pointCoord.x += horizontalCrop / 2;
+            pointCoord.y += verticalCrop / 2;
+            destCoord = AiqUtils::convertCoordinateSystem(fillFrameCoord, sysCoord, pointCoord);
+            result->faceLandmarks[i * 6] = destCoord.x;  // left_eye.x;
+            result->faceLandmarks[i * 6 + 1] = destCoord.y;  // left_eye.y;
+
+            srcCoord = {faceDetectionResult.eyeResults[i].right_eye.x,
+                        faceDetectionResult.eyeResults[i].right_eye.y};
+            pointCoord = AiqUtils::convertCoordinateSystem(iaCoord, frameCoord, srcCoord);
+            pointCoord.x += horizontalCrop / 2;
+            pointCoord.y += verticalCrop / 2;
+            destCoord = AiqUtils::convertCoordinateSystem(fillFrameCoord, sysCoord, pointCoord);
+            result->faceLandmarks[i * 6 + 2] = destCoord.x;  // right_eye.x;
+            result->faceLandmarks[i * 6 + 3] = destCoord.y;  // right_eye.y;
+
+            srcCoord = {faceDetectionResult.mouthResults[i].mouth.x,
+                        faceDetectionResult.mouthResults[i].mouth.y};
+            pointCoord = AiqUtils::convertCoordinateSystem(iaCoord, frameCoord, srcCoord);
+            pointCoord.x += horizontalCrop / 2;
+            pointCoord.y += verticalCrop / 2;
+            destCoord = AiqUtils::convertCoordinateSystem(fillFrameCoord, sysCoord, pointCoord);
+            result->faceLandmarks[i * 6 + 4] = destCoord.x;  // mouth.x;
+            result->faceLandmarks[i * 6 + 5] = destCoord.y;  // mouth.y;
+        }
+    }
+    result->faceNum = (faceDetectionResult.faceNum < MAX_FACES_DETECTABLE ?
+                       faceDetectionResult.faceNum : MAX_FACES_DETECTABLE);
+    return OK;
+}
+}  // namespace icamera
+
diff --git a/camera/hal/intel/ipu6/src/fd/FaceDetection.h b/camera/hal/intel/ipu6/src/fd/FaceDetection.h
new file mode 100644
index 000000000000..958359409728
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/fd/FaceDetection.h
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#ifdef FACE_DETECTION
+#ifdef ENABLE_SANDBOXING
+#include "modules/sandboxing/client/IntelFaceDetection.h"
+#else
+#include "modules/algowrapper/IntelFaceDetection.h"
+#endif
+#include "iutils/Errors.h"
+#include "iutils/Thread.h"
+#endif
+
+#include <ia_types.h>
+#include <unordered_map>
+#include <memory>
+#include <queue>
+
+#include "iutils/Utils.h"
+#include "Parameters.h"
+#include "FaceBase.h"
+
+namespace icamera {
+
+#ifdef FACE_DETECTION
+class FaceDetection : public Thread {
+ public:
+    FaceDetection(int cameraId, unsigned int maxFaceNum, int32_t halStreamId);
+    ~FaceDetection();
+
+    static FaceDetection *createInstance(int cameraId,
+                                         unsigned int maxFaceNum, int32_t halStreamId);
+    static void destoryInstance(int cameraId);
+    static FaceDetection *getInstance(int cameraId);
+
+    void runFaceDetection(const camera_buffer_t &buffer);
+    void runFaceDetectionBySync(const camera_buffer_t &buffer);
+    void runFaceDetectionByAsync(const camera_buffer_t &buffer);
+    int getFaceNum();
+    virtual bool threadLoop();
+    static int getResult(int cameraId, ia_atbx_face_state *faceState);
+    static int getResult(int cameraId, CVFaceDetectionAbstractResult *result);
+
+ private:
+    int getFaceDetectionResult(FaceDetectionResult *mResult);
+    FaceDetectionRunParams *acquireRunBuf();
+    void returnRunBuf(FaceDetectionRunParams *memRunBuf);
+    void getCurrentFrameWidthAndHight(int *frameWidth, int *frameHigth);
+    void getHalStreamId(int32_t *halStreamId);
+
+    // Guard for face engine instance
+    static Mutex sLock;
+    static std::unordered_map<int, FaceDetection*> sInstances;
+
+    int mCameraId;
+    bool mInitialized;
+
+    // Guard for face detection result
+    std::mutex mFaceResultLock;
+    FaceDetectionResult mResult;
+
+    std::unique_ptr<IntelFaceDetection> mFace;
+
+    std::condition_variable mRunCondition;
+    // Guard for running buffer queue of thread
+    std::mutex mRunBufQueueLock;
+    std::queue<FaceDetectionRunParams *> mRunBufQueue;
+    const uint64_t kMaxDuration = 2000000000;  // 2000ms
+
+    // Guard for running buffer pool of face engine
+    std::mutex mMemRunPoolLock;
+    std::queue<FaceDetectionRunParams *> mMemRunPool;
+
+    int mSensorOrientation;
+
+    int32_t mHalStreamId;
+    int mWidth;
+    int mHeight;
+
+    DISALLOW_COPY_AND_ASSIGN(FaceDetection);
+};
+#else
+class FaceDetection {
+ public:
+    static int getResult(int cameraId, ia_atbx_face_state *faceState) {
+        faceState->num_faces = 0;
+        return 0;
+    }
+    static int getResult(int cameraId, CVFaceDetectionAbstractResult *result) {
+        CLEAR(*result);
+        return 0;
+    }
+    static FaceDetection *createInstance(int cameraId,
+                                         unsigned int maxFaceNum, int32_t halStreamId) {
+        return nullptr;
+    }
+    static void destoryInstance(int cameraId) {}
+    void runFaceDetection(const camera_buffer_t &buffer) {}
+    int getFaceNum() {return 0;}
+};
+#endif
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/hal/CameraHal.cpp b/camera/hal/intel/ipu6/src/hal/CameraHal.cpp
new file mode 100644
index 000000000000..35e5269eb520
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/hal/CameraHal.cpp
@@ -0,0 +1,270 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "CameraHal"
+
+#include <vector>
+
+#include "iutils/CameraLog.h"
+
+#include "ICamera.h"
+#include "PlatformData.h"
+#include "SyncManager.h"
+#include "CameraHal.h"
+#include "Parameters.h"
+
+namespace icamera {
+
+#define checkCameraDevice(device, err_code) \
+    do { \
+        if (mState == HAL_UNINIT) { \
+            LOGE("HAL is not init."); \
+            return err_code; \
+        } \
+        if (!(device)) { \
+            LOGE("device is not open."); \
+            return err_code; \
+        } \
+    } while (0)
+
+CameraHal::CameraHal() :
+    mInitTimes(0),
+    mState(HAL_UNINIT)
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("@%s", __func__);
+
+    CLEAR(mCameraDevices);
+}
+
+CameraHal::~CameraHal()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("@%s", __func__);
+    SyncManager::releaseInstance();
+    PlatformData::releaseInstance();
+}
+
+int CameraHal::init()
+{
+    LOG1("@%s", __func__);
+    AutoMutex lock(mLock);
+
+    if (mInitTimes++ > 0) {
+        LOGD("@%s, mInitTimes:%d, return without running", __func__, mInitTimes);
+        return OK;
+    }
+
+    MediaControl::getInstance()->initEntities();
+
+    mState = HAL_INIT;
+
+    return OK;
+}
+
+int CameraHal::deinit()
+{
+    LOG1("@%s", __func__);
+    AutoMutex l(mLock);
+
+    if (--mInitTimes > 0) {
+        LOGD("@%s, mInitTimes:%d, return without set state", __func__, mInitTimes);
+        return OK;
+    }
+
+    MediaControl::getInstance()->clearEntities();
+
+    // Because there are many static variables in singleton,
+    // so we have to release them before exiting the main function.
+    // Will remove the static variables and singleton in the future.
+    SyncManager::releaseInstance();
+    PlatformData::releaseInstance();
+
+    mState = HAL_UNINIT;
+
+    return OK;
+}
+
+int CameraHal::deviceOpen(int cameraId)
+{
+    LOG1("@%s, camera id:%d", __func__, cameraId);
+    PERF_CAMERA_ATRACE();
+
+    AutoMutex l(mLock);
+    CheckError(mState == HAL_UNINIT, NO_INIT,"HAL is not initialized");
+
+    //Create the camera device that will be freed in close
+    if (mCameraDevices[cameraId]) {
+        LOGD("@%s: open multi times", __func__);
+        return INVALID_OPERATION;
+    }
+
+    mCameraOpenNum++;
+    mCameraDevices[cameraId] = new CameraDevice(cameraId);
+
+    if (mCameraOpenNum == 1) {
+        MediaControl::getInstance()->resetAllLinks();
+    }
+
+    return mCameraDevices[cameraId]->init();
+}
+
+void CameraHal::deviceClose(int cameraId)
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("@%s, camera id:%d", __func__, cameraId);
+    AutoMutex l(mLock);
+
+    if (mCameraDevices[cameraId]) {
+        mCameraDevices[cameraId]->deinit();
+        delete mCameraDevices[cameraId];
+        mCameraDevices[cameraId] = nullptr;
+
+        mCameraOpenNum--;
+    }
+}
+
+void CameraHal::deviceCallbackRegister(int cameraId, const camera_callback_ops_t* callback)
+{
+    LOG1("@%s", __func__);
+    AutoMutex l(mLock);
+
+    CameraDevice *device = mCameraDevices[cameraId];
+    checkCameraDevice(device, VOID_VALUE);
+#ifdef ENABLE_SANDBOXING
+    PlatformData::getIntelAlgoClient()->registerErrorCallback(callback);
+#endif
+    device->callbackRegister(callback);
+}
+
+// Assume the inputConfig is already checked in upper layer
+int CameraHal::deviceConfigInput(int cameraId, const stream_t *inputConfig)
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("@%s, camera id:%d", __func__, cameraId);
+    AutoMutex lock(mLock);
+
+    CameraDevice *device = mCameraDevices[cameraId];
+    checkCameraDevice(device, BAD_VALUE);
+
+    device->configureInput(inputConfig);
+
+    return OK;
+}
+
+// Assume the streamList is already checked in upper layer
+int CameraHal::deviceConfigStreams(int cameraId, stream_config_t *streamList)
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("@%s, camera id:%d", __func__, cameraId);
+    AutoMutex lock(mLock);
+
+    CameraDevice *device = mCameraDevices[cameraId];
+    checkCameraDevice(device, BAD_VALUE);
+
+    int ret = device->configure(streamList);
+    if (ret != OK) {
+        LOGE("failed to config streams.");
+        return INVALID_OPERATION;
+    }
+
+    return ret;
+}
+
+int CameraHal::deviceStart(int cameraId)
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("@%s, cameraId is %d", __func__, cameraId);
+
+    ConditionLock lock(mLock);
+
+    CameraDevice *device = mCameraDevices[cameraId];
+    checkCameraDevice(device, BAD_VALUE);
+
+    return device->start();
+}
+
+int CameraHal::deviceStop(int cameraId)
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("@%s, cameraId is %d", __func__, cameraId);
+
+    AutoMutex lock(mLock);
+
+    CameraDevice *device = mCameraDevices[cameraId];
+    checkCameraDevice(device, BAD_VALUE);
+
+    return device->stop();
+}
+
+int CameraHal::deviceAllocateMemory(int cameraId, camera_buffer_t *ubuffer)
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("@%s, cameraId is %d", __func__, cameraId);
+
+    CameraDevice *device = mCameraDevices[cameraId];
+
+    checkCameraDevice(device, BAD_VALUE);
+
+    return device->allocateMemory(ubuffer);
+}
+
+int CameraHal::streamQbuf(int cameraId, camera_buffer_t **ubuffer,
+                          int bufferNum, const Parameters* settings)
+{
+    PERF_CAMERA_ATRACE();
+    LOG2("@%s, cameraId is %d, fd:%d", __func__, cameraId, (*ubuffer)->dmafd);
+
+    CameraDevice *device = mCameraDevices[cameraId];
+
+    checkCameraDevice(device, BAD_VALUE);
+
+    return device->qbuf(ubuffer, bufferNum, settings);
+}
+
+int CameraHal::streamDqbuf(int cameraId, int streamId, camera_buffer_t **ubuffer,
+                           Parameters* settings)
+{
+    PERF_CAMERA_ATRACE();
+    LOG2("@%s, cameraId is %d, streamId is %d", __func__, cameraId, streamId);
+
+    CameraDevice *device = mCameraDevices[cameraId];
+    checkCameraDevice(device, BAD_VALUE);
+
+    return device->dqbuf(streamId, ubuffer, settings);
+}
+
+int CameraHal::getParameters(int cameraId, Parameters& param)
+{
+    LOG1("@%s, cameraId is %d", __func__, cameraId);
+
+    CameraDevice *device = mCameraDevices[cameraId];
+    checkCameraDevice(device, BAD_VALUE);
+
+    return device->getParameters(param);
+}
+
+int CameraHal::setParameters(int cameraId, const Parameters& param)
+{
+    LOG1("@%s, cameraId is %d", __func__, cameraId);
+
+    CameraDevice *device = mCameraDevices[cameraId];
+    checkCameraDevice(device, BAD_VALUE);
+
+    return device->setParameters(param);
+}
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/hal/CameraHal.h b/camera/hal/intel/ipu6/src/hal/CameraHal.h
new file mode 100644
index 000000000000..512e337db16e
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/hal/CameraHal.h
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "CameraDevice.h"
+#include "Parameters.h"
+
+namespace icamera {
+
+/**
+ * CameraHal class is the real HAL API.
+ * There is only one instance of CameraHal which is created when HAL loading
+ * It creates the CameraDevice based on the camera ID to support multi-cameras.
+ *
+ * The main job of the Class is
+ * 1. Maintain a list of CameraDevice
+ * 2. Pass the Camera HAL API to the correct CameraDevice based on CameraId
+ *
+ * If open dual cameras in different process, the shared memory must be used to
+ * keep the account of the open times.
+ *
+ * The CameraHal create and maintains followings singleton instancs
+ * 1. MediaControl Instance
+ * 2. PlatformData Instance
+ */
+
+class CameraHal {
+//HAL API
+public:
+    CameraHal();
+    ~CameraHal();
+    int init();
+    int deinit();
+
+//Device API
+public:
+    int deviceOpen(int cameraId);
+    void deviceClose(int cameraId);
+
+    void deviceCallbackRegister(int cameraId, const camera_callback_ops_t* callback);
+    int deviceConfigInput(int cameraId, const stream_t *inputConfig);
+    int deviceConfigStreams(int cameraId, stream_config_t *streamList);
+    int deviceStart(int cameraId);
+    int deviceStop(int cameraId);
+    int deviceAllocateMemory(int cameraId, camera_buffer_t *ubuffer);
+//Stream API
+    int streamQbuf(int cameraId, camera_buffer_t **ubuffer,
+                   int bufferNum = 1, const Parameters* settings = nullptr);
+    int streamDqbuf(int cameraId, int streamId, camera_buffer_t **ubuffer,
+                    Parameters* settings = nullptr);
+    int setParameters(int cameraId, const Parameters& param);
+    int getParameters(int cameraId, Parameters& param);
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(CameraHal);
+
+private:
+    CameraDevice* mCameraDevices[MAX_CAMERA_NUMBER];
+    int mInitTimes;
+    // Guard for CameraHal public API.
+    Mutex mLock;
+
+    enum {
+        HAL_UNINIT,
+        HAL_INIT
+    } mState;
+
+    int mCameraOpenNum = 0;
+};
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/hal/ICamera.cpp b/camera/hal/intel/ipu6/src/hal/ICamera.cpp
new file mode 100644
index 000000000000..56bbd55058f1
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/hal/ICamera.cpp
@@ -0,0 +1,374 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "ICamera"
+
+#include "iutils/CameraDump.h"
+#include "iutils/CameraLog.h"
+
+#include "ICamera.h"
+#include "CameraHal.h"
+#include "PlatformData.h"
+
+/**
+ * This is the wrapper to the CameraHal Class to provide the HAL interface
+ * Main job of this file
+ * 1. Check the argument from user
+ * 2. Transfer HAL API to CameraHal class
+ * 3. Implement the HAL static function: get_number_of_cameras and get_camera_info
+ */
+namespace icamera {
+
+static CameraHal * gCameraHal = nullptr;
+
+#define CheckCameraId(camera_id, err_code) \
+    do { \
+        int max_cam = PlatformData::numberOfCameras(); \
+        if (((camera_id) < 0) || (camera_id) >= max_cam) { \
+            LOGE("camera index(%d) is invaild., max_cam:%d", camera_id, max_cam); \
+            return err_code; \
+        } \
+    } while (0)
+
+/**
+ * Return the numbers of camera
+ * This should be called before any other calls
+ *
+ * \return > 0  return camera numbers
+ * \return == 0 failed to get camera numbers
+ **/
+int get_number_of_cameras()
+{
+    PERF_CAMERA_ATRACE();
+    HAL_TRACE_CALL(1);
+
+    return PlatformData::numberOfCameras();
+}
+
+/**
+ * Get capability related camera info.
+ * Should be called after get_number_of_cameras
+ *
+ * \return error code
+ */
+int get_camera_info(int camera_id, camera_info_t& info)
+{
+    PERF_CAMERA_ATRACE();
+    HAL_TRACE_CALL(1);
+    CheckCameraId(camera_id, BAD_VALUE);
+
+    int ret = PlatformData::getCameraInfo(camera_id, info);
+
+    return ret;
+}
+
+/**
+ * Initialize camera hal
+ *
+ * \return error code
+ **/
+int camera_hal_init()
+{
+    PERF_CAMERA_ATRACE();
+    HAL_TRACE_CALL(1);
+
+    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
+    return gCameraHal->init();
+}
+
+/**
+ * De-initialize camera hal
+ *
+ * \return error code
+ **/
+int camera_hal_deinit()
+{
+    PERF_CAMERA_ATRACE();
+    HAL_TRACE_CALL(1);
+
+    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
+    return gCameraHal->deinit();
+}
+
+/**
+ * Register callback function
+ **/
+void camera_callback_register(int camera_id, const camera_callback_ops_t* callback)
+{
+    PERF_CAMERA_ATRACE();
+    HAL_TRACE_CALL(1);
+
+    CheckError(!gCameraHal, VOID_VALUE, "camera hal is NULL.");
+    gCameraHal->deviceCallbackRegister(camera_id, callback);
+}
+
+/**
+ * Open one camera device
+ *
+ * \param camera_id camera index
+ *
+ * \return error code
+ **/
+int camera_device_open(int camera_id)
+{
+    PERF_CAMERA_ATRACE();
+    HAL_TRACE_CALL(1);
+
+    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
+    CheckCameraId(camera_id, BAD_VALUE);
+
+    return gCameraHal->deviceOpen(camera_id);
+}
+
+/**
+ * Close camera device
+ *
+ * \param camera_id The ID that opened before
+ **/
+void camera_device_close(int camera_id)
+{
+    PERF_CAMERA_ATRACE();
+    HAL_TRACE_CALL(1);
+
+    CheckError(!gCameraHal, VOID_VALUE, "camera hal is NULL.");
+    CheckCameraId(camera_id,);
+
+    gCameraHal->deviceClose(camera_id);
+}
+
+/**
+ * Configure the sensor input of the device
+ *
+ * \param camera_id The camera ID that was opened
+ * \param input_config  sensor input configuration
+ *
+ * \return 0 succeed <0 error
+ **/
+int camera_device_config_sensor_input(int camera_id, const stream_t *input_config)
+{
+    PERF_CAMERA_ATRACE();
+    HAL_TRACE_CALL(1);
+
+    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
+    CheckError(!input_config, BAD_VALUE, "camera input_config is NULL.");
+    CheckCameraId(camera_id, BAD_VALUE);
+
+    return gCameraHal->deviceConfigInput(camera_id, input_config);
+}
+
+/**
+ * Add stream to device
+ *
+ * \param camera_id The camera ID that was opened
+ * \param stream_id
+ * \param stream_conf stream configuration
+ *
+ * \return 0 succeed <0 error
+ **/
+int camera_device_config_streams(int camera_id, stream_config_t *stream_list)
+{
+    PERF_CAMERA_ATRACE();
+    HAL_TRACE_CALL(1);
+
+    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
+    CheckError(!stream_list, BAD_VALUE, "camera stream is NULL.");
+    CheckCameraId(camera_id, BAD_VALUE);
+
+    if (stream_list->operation_mode == CAMERA_STREAM_CONFIGURATION_MODE_STILL_CAPTURE) {
+        for (int i = 0; i < stream_list->num_streams; i++) {
+            stream_list->streams[i].usage = CAMERA_STREAM_STILL_CAPTURE;
+        }
+    }
+
+    return gCameraHal->deviceConfigStreams(camera_id, stream_list);
+}
+
+/**
+ * Start device
+ *
+ * Start all streams in device.
+ *
+ * \param camera_id The Caemra ID that opened before
+ *
+ * \return error code
+ **/
+int camera_device_start(int camera_id)
+{
+    PERF_CAMERA_ATRACE();
+    HAL_TRACE_CALL(1);
+    CheckError(!gCameraHal, INVALID_OPERATION ,"camera hal is NULL.");
+    CheckCameraId(camera_id, BAD_VALUE);
+
+    return gCameraHal->deviceStart(camera_id);
+}
+
+/**
+ * Stop device
+ *
+ * Stop all streams in device.
+ *
+ * \param camera_id The Caemra ID that opened before
+ *
+ * \return error code
+ **/
+int camera_device_stop(int camera_id)
+{
+    PERF_CAMERA_ATRACE();
+    HAL_TRACE_CALL(1);
+    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
+    CheckCameraId(camera_id, BAD_VALUE);
+
+    return gCameraHal->deviceStop(camera_id);
+}
+
+/**
+ * Allocate memory for mmap & dma export io-mode
+ *
+ * \param camera_id The camera ID that opened before
+ * \param camera_buff stream buff
+ *
+ * \return error code
+ **/
+int camera_device_allocate_memory(int camera_id, camera_buffer_t *buffer)
+{
+    PERF_CAMERA_ATRACE();
+    HAL_TRACE_CALL(2);
+    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
+    CheckCameraId(camera_id, BAD_VALUE);
+    CheckError(!buffer, BAD_VALUE, "buffer is NULL.");
+    CheckError(buffer->s.memType != V4L2_MEMORY_MMAP, BAD_VALUE, "memory type %d is not supported.", buffer->s.memType);
+
+    return gCameraHal->deviceAllocateMemory(camera_id, buffer);
+}
+
+/**
+ * Queue a buffer to a stream (deprecated)
+ *
+ * \param camera_id The camera ID that opened before
+ * \param stream_id the stream ID that add to device before
+ * \param camera_buff stream buff
+ *
+ * \return error code
+ **/
+int camera_stream_qbuf(int camera_id, int stream_id, camera_buffer_t *buffer,
+                       int num_buffers, const Parameters* settings)
+{
+    PERF_CAMERA_ATRACE();
+    HAL_TRACE_CALL(2);
+    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
+    CheckCameraId(camera_id, BAD_VALUE);
+
+    LOGW("camera_stream_qbuf(cam_id, stream_id, *buffer, num_buffers, *settings) is deprecated and will be removed soon.");
+    LOGW("Please start to use camera_stream_qbuf(cam_id, **buffer, num_buffers, *settings)");
+
+    return gCameraHal->streamQbuf(camera_id, &buffer, num_buffers, settings);
+}
+
+/**
+ * Queue a buffer(or more buffers) to a stream
+ *
+ * \param camera_id The camera ID that opened before
+ * \param buffer The array of pointers to the camera_buffer_t
+ * \param num_buffers The number of buffers in the array
+ *
+ * \return error code
+ **/
+int camera_stream_qbuf(int camera_id, camera_buffer_t **buffer,
+                       int num_buffers, const Parameters* settings)
+{
+    PERF_CAMERA_ATRACE();
+    HAL_TRACE_CALL(2);
+    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
+    CheckCameraId(camera_id, BAD_VALUE);
+
+    return gCameraHal->streamQbuf(camera_id, buffer, num_buffers, settings);
+}
+
+/**
+ * Dequeue a buffer from a stream
+ *
+ * \param camera_id The camera ID that opened before
+ * \param stream_id the stream ID that add to device before
+ * \param camera_buff stream buff
+ *
+ * \return error code
+ **/
+int camera_stream_dqbuf(int camera_id, int stream_id, camera_buffer_t **buffer,
+                        Parameters* settings)
+{
+    PERF_CAMERA_ATRACE();
+    HAL_TRACE_CALL(2);
+    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
+    CheckCameraId(camera_id, BAD_VALUE);
+    CheckError(!buffer, BAD_VALUE, "camera stream buffer is null.");
+
+    return gCameraHal->streamDqbuf(camera_id, stream_id, buffer, settings);
+}
+
+int camera_set_parameters(int camera_id, const Parameters& param)
+{
+    HAL_TRACE_CALL(2);
+    CheckCameraId(camera_id, BAD_VALUE);
+    CheckError(!gCameraHal, INVALID_OPERATION, "camera device is not open before setting parameters.");
+
+    return gCameraHal->setParameters(camera_id, param);
+}
+
+int camera_get_parameters(int camera_id, Parameters& param)
+{
+    HAL_TRACE_CALL(2);
+    CheckCameraId(camera_id, BAD_VALUE);
+    CheckError(!gCameraHal, INVALID_OPERATION, "camera device is not open before getting parameters.");
+
+    return gCameraHal->getParameters(camera_id, param);
+}
+
+int get_frame_size(int camera_id, int format, int width, int height, int field, int *bpp)
+{
+    CheckError(width <= 0, BAD_VALUE, "width <=0");
+    CheckError(height <= 0, BAD_VALUE, "height <=0");
+    CheckError(field < 0, BAD_VALUE, "field <0");
+
+    int frameSize = 0;
+    bool isOFSCompression = PlatformData::getOFSCompression(camera_id);
+
+   *bpp = CameraUtils::getBpp(format);
+    if(isOFSCompression) {
+        frameSize = CameraUtils::getFrameSize(format, width, height, false, true, true);
+    } else {
+        frameSize = CameraUtils::getFrameSize(format, width, height);
+    }
+    LOG2("@%s: output compression frame: %d, frame size from HAL:%d\n",
+               __func__, isOFSCompression, frameSize);
+
+    return frameSize;
+}
+
+//Create the HAL instance from here
+__attribute__((constructor)) void initCameraHAL() {
+    Log::setDebugLevel();
+    CameraDump::setDumpLevel();
+    gCameraHal = new CameraHal();
+}
+
+__attribute__((destructor)) void deinitCameraHAL() {
+    if (gCameraHal) {
+        delete gCameraHal;
+        gCameraHal = nullptr;
+    }
+}
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/image_process/IImageProcessor.h b/camera/hal/intel/ipu6/src/image_process/IImageProcessor.h
new file mode 100644
index 000000000000..c4b2d2fb8603
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/image_process/IImageProcessor.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+#include "Camera3Buffer.h"
+#include "ProcessType.h"
+
+namespace icamera {
+
+class IImageProcessor {
+public:
+    IImageProcessor() {};
+    virtual ~IImageProcessor() {};
+
+    static std::unique_ptr<IImageProcessor> createImageProcessor();
+    static bool isProcessingTypeSupported(PostProcessType type);
+
+    virtual status_t cropFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
+                               std::shared_ptr<camera3::Camera3Buffer> &output) = 0;
+    virtual status_t scaleFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
+                                std::shared_ptr<camera3::Camera3Buffer> &output) = 0;
+    virtual status_t rotateFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
+                                 std::shared_ptr<camera3::Camera3Buffer> &output,
+                                 int angle, std::vector<uint8_t> &rotateBuf) = 0;
+    virtual status_t convertFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
+                                  std::shared_ptr<camera3::Camera3Buffer> &output) = 0;
+private:
+    DISALLOW_COPY_AND_ASSIGN(IImageProcessor);
+};
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/image_process/ImageConverter.cpp b/camera/hal/intel/ipu6/src/image_process/ImageConverter.cpp
new file mode 100644
index 000000000000..26e393eab7f7
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/image_process/ImageConverter.cpp
@@ -0,0 +1,798 @@
+/*
+ * Copyright (C) 2016-2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "ColorConverter"
+
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+#include <sys/types.h>
+#include "Errors.h"
+#include <linux/videodev2.h>
+#include "ImageConverter.h"
+
+namespace icamera {
+namespace ImageConverter {
+
+void YUV420ToRGB565(int width, int height, void *src, void *dst)
+{
+    int line, col, linewidth;
+    int y, u, v, yy, vr, ug, vg, ub;
+    int r, g, b;
+    const unsigned char *py, *pu, *pv;
+    unsigned short *rgbs = (unsigned short *) dst;
+
+    linewidth = width >> 1;
+    py = (unsigned char *) src;
+    pu = py + (width * height);
+    pv = pu + (width * height) / 4;
+
+    y = *py++;
+    yy = y << 8;
+    u = *pu - 128;
+    ug = 88 * u;
+    ub = 454 * u;
+    v = *pv - 128;
+    vg = 183 * v;
+    vr = 359 * v;
+
+    for (line = 0; line < height; line++) {
+        for (col = 0; col < width; col++) {
+            r = (yy + vr) >> 8;
+            g = (yy - ug - vg) >> 8;
+            b = (yy + ub ) >> 8;
+            if (r < 0) r = 0;
+            if (r > 255) r = 255;
+            if (g < 0) g = 0;
+            if (g > 255) g = 255;
+            if (b < 0) b = 0;
+            if (b > 255) b = 255;
+            *rgbs++ = (((unsigned short)r>>3)<<11) | (((unsigned short)g>>2)<<5)
+                   | (((unsigned short)b>>3)<<0);
+
+            y = *py++;
+            yy = y << 8;
+            if (col & 1) {
+                pu++;
+                pv++;
+                u = *pu - 128;
+                ug = 88 * u;
+                ub = 454 * u;
+                v = *pv - 128;
+                vg = 183 * v;
+                vr = 359 * v;
+            }
+        }
+        if ((line & 1) == 0) {
+            pu -= linewidth;
+            pv -= linewidth;
+        }
+    }
+}
+
+void trimConvertNV12ToRGB565(int width, int height, int srcStride, void *src, void *dst)
+{
+
+    unsigned char *yuvs = (unsigned char *) src;
+    unsigned char *rgbs = (unsigned char *) dst;
+
+    //the end of the luminance data
+    int lumEnd = srcStride * height;
+    int i = 0, j = 0;
+    for( i=0; i < height; i++) {
+        //points to the next luminance value pair
+        int lumPtr = i * srcStride;
+        //points to the next chromiance value pair
+        int chrPtr = i / 2 * srcStride + lumEnd;
+        for ( j=0; j < width; j+=2 ) {
+            //read the luminance and chromiance values
+            int Y1 = yuvs[lumPtr++] & 0xff;
+            int Y2 = yuvs[lumPtr++] & 0xff;
+            int Cb = (yuvs[chrPtr++] & 0xff) - 128;
+            int Cr = (yuvs[chrPtr++] & 0xff) - 128;
+            int R, G, B;
+
+            //generate first RGB components
+            B = Y1 + ((454 * Cb) >> 8);
+            if(B < 0) B = 0; else if(B > 255) B = 255;
+            G = Y1 - ((88 * Cb + 183 * Cr) >> 8);
+            if(G < 0) G = 0; else if(G > 255) G = 255;
+            R = Y1 + ((359 * Cr) >> 8);
+            if(R < 0) R = 0; else if(R > 255) R = 255;
+            //NOTE: this assume little-endian encoding
+            *rgbs++ = (unsigned char) (((G & 0x3c) << 3) | (B >> 3));
+            *rgbs++ = (unsigned char) ((R & 0xf8) | (G >> 5));
+
+            //generate second RGB components
+            B = Y2 + ((454 * Cb) >> 8);
+            if(B < 0) B = 0; else if(B > 255) B = 255;
+            G = Y2 - ((88 * Cb + 183 * Cr) >> 8);
+            if(G < 0) G = 0; else if(G > 255) G = 255;
+            R = Y2 + ((359 * Cr) >> 8);
+            if(R < 0) R = 0; else if(R > 255) R = 255;
+            //NOTE: this assume little-endian encoding
+            *rgbs++ = (unsigned char) (((G & 0x3c) << 3) | (B >> 3));
+            *rgbs++ = (unsigned char) ((R & 0xf8) | (G >> 5));
+        }
+    }
+}
+
+// covert YV12 (Y plane, V plane, U plane) to NV21 (Y plane, interlaced VU bytes)
+void convertYV12ToNV21(int width, int height, int srcStride, int dstStride, void *src, void *dst)
+{
+    const int cStride = srcStride>>1;
+    const int vuStride = dstStride;
+    const int hhalf = height>>1;
+    const int whalf = width>>1;
+
+    // copy the entire Y plane
+    unsigned char *srcPtr = (unsigned char *)src;
+    unsigned char *dstPtr = (unsigned char *)dst;
+    if (srcStride == dstStride) {
+        MEMCPY_S(dstPtr, dstStride*height, srcPtr, dstStride*height);
+    } else {
+        for (int i = 0; i < height; i++) {
+            MEMCPY_S(dstPtr, width, srcPtr, width);
+            srcPtr += srcStride;
+            dstPtr += dstStride;
+        }
+    }
+
+    // interlace the VU data
+    unsigned char *srcPtrV = (unsigned char *)src + height*srcStride;
+    unsigned char *srcPtrU = srcPtrV + cStride*hhalf;
+    dstPtr = (unsigned char *)dst + dstStride*height;
+    for (int i = 0; i < hhalf; ++i) {
+        unsigned char *pDstVU = dstPtr;
+        unsigned char *pSrcV = srcPtrV;
+        unsigned char *pSrcU = srcPtrU;
+        for (int j = 0; j < whalf; ++j) {
+            *pDstVU ++ = *pSrcV ++;
+            *pDstVU ++ = *pSrcU ++;
+        }
+        dstPtr += vuStride;
+        srcPtrV += cStride;
+        srcPtrU += cStride;
+    }
+}
+
+// copy YV12 to YV12 (Y plane, V plan, U plan) in case of different stride length
+void copyYV12ToYV12(int width, int height, int srcStride, int dstStride, void *src, void *dst)
+{
+    // copy the entire Y plane
+    if (srcStride == dstStride) {
+        MEMCPY_S(dst, dstStride * height, src, dstStride * height);
+    } else {
+        unsigned char *srcPtrY = (unsigned char *)src;
+        unsigned char *dstPtrY = (unsigned char *)dst;
+        for (int i = 0; i < height; i ++) {
+            MEMCPY_S(dstPtrY, width, srcPtrY, width);
+            srcPtrY += srcStride;
+            dstPtrY += dstStride;
+        }
+    }
+
+    // copy VU plane
+    const int scStride = srcStride >> 1;
+    const int dcStride = ALIGN_16(dstStride >> 1); // Android CTS required: U/V plane needs 16 bytes aligned!
+    if (dcStride == scStride) {
+        unsigned char *srcPtrVU = (unsigned char *)src + height * srcStride;
+        unsigned char *dstPtrVU = (unsigned char *)dst + height * dstStride;
+        MEMCPY_S(dstPtrVU, height * dcStride, srcPtrVU, height * dcStride);
+    } else {
+        const int wHalf = width >> 1;
+        const int hHalf = height >> 1;
+        unsigned char *srcPtrV = (unsigned char *)src + height * srcStride;
+        unsigned char *srcPtrU = srcPtrV + scStride * hHalf;
+        unsigned char *dstPtrV = (unsigned char *)dst + height * dstStride;
+        unsigned char *dstPtrU = dstPtrV + dcStride * hHalf;
+        for (int i = 0; i < hHalf; i ++) {
+            MEMCPY_S(dstPtrU, wHalf, srcPtrU, wHalf);
+            MEMCPY_S(dstPtrV, wHalf, srcPtrV, wHalf);
+            dstPtrU += dcStride, srcPtrU += scStride;
+            dstPtrV += dcStride, srcPtrV += scStride;
+        }
+    }
+}
+
+// covert NV12 (Y plane, interlaced UV bytes) to
+// NV21 (Y plane, interlaced VU bytes) and trim stride width to real width
+void trimConvertNV12ToNV21(int width, int height, int srcStride, void *src, void *dst)
+{
+    const int ysize = width * height;
+    unsigned const char *pSrc = (unsigned char *)src;
+    unsigned char *pDst = (unsigned char *)dst;
+
+    // Copy Y component
+    if (srcStride == width) {
+        MEMCPY_S(pDst, ysize, pSrc, ysize);
+    } else if (srcStride > width) {
+        int j = height;
+        while(j--) {
+            MEMCPY_S(pDst, width, pSrc, width);
+            pSrc += srcStride;
+            pDst += width;
+        }
+    } else {
+        ALOGE("bad stride value");
+        return;
+    }
+
+    // Convert UV to VU
+    pSrc = (unsigned char *)src + srcStride * height;
+    pDst = (unsigned char *)dst + width * height;
+    for (int j = 0; j < height / 2; j++) {
+        if (width >= 16) {
+            const uint32_t *ptr0 = (const uint32_t *)(pSrc);
+            uint32_t *ptr1 = (uint32_t *)(pDst);
+            int bNotLastLine = ((j+1) == (height/2)) ? 0 : 1;
+            int width_16 = (width + 15 * bNotLastLine) & ~0xf;
+            if ((((uint64_t)(pSrc)) & 0xf) == 0 && (((uint64_t)(pDst)) & 0xf) == 0) { // 16 bytes aligned for both src and dest
+                __asm__ volatile(\
+                                 "movl       %0,  %%eax      \n\t"
+                                 "movl       %1,  %%edx      \n\t"
+                                 "movl       %2,  %%ecx      \n\t"
+                                 "1:     \n\t"
+                                 "movdqa (%%eax), %%xmm1     \n\t"
+                                 "movdqa  %%xmm1, %%xmm0     \n\t"
+                                 "psllw       $8, %%xmm1     \n\t"
+                                 "psrlw       $8, %%xmm0     \n\t"
+                                 "por     %%xmm0, %%xmm1     \n\t"
+                                 "movdqa  %%xmm1, (%%edx)    \n\t"
+                                 "add        $16, %%eax      \n\t"
+                                 "add        $16, %%edx      \n\t"
+                                 "sub        $16, %%ecx      \n\t"
+                                 "jnz   1b \n\t"
+                                 : "+m"(ptr0), "+m"(ptr1), "+m"(width_16)
+                                 :
+                                 : "eax", "ecx", "edx", "xmm0", "xmm1"
+                                );
+            }
+            else { // either src or dest is not 16-bytes aligned
+                __asm__ volatile(\
+                                 "movl       %0,  %%eax      \n\t"
+                                 "movl       %1,  %%edx      \n\t"
+                                 "movl       %2,  %%ecx      \n\t"
+                                 "1:     \n\t"
+                                 "lddqu  (%%eax), %%xmm1     \n\t"
+                                 "movdqa  %%xmm1, %%xmm0     \n\t"
+                                 "psllw       $8, %%xmm1     \n\t"
+                                 "psrlw       $8, %%xmm0     \n\t"
+                                 "por     %%xmm0, %%xmm1     \n\t"
+                                 "movdqu  %%xmm1, (%%edx)    \n\t"
+                                 "add        $16, %%eax      \n\t"
+                                 "add        $16, %%edx      \n\t"
+                                 "sub        $16, %%ecx      \n\t"
+                                 "jnz   1b \n\t"
+                                 : "+m"(ptr0), "+m"(ptr1), "+m"(width_16)
+                                 :
+                                 : "eax", "ecx", "edx", "xmm0", "xmm1"
+                                );
+            }
+
+            // process remaining data of less than 16 bytes of last row
+            for (int i = width_16; i < width; i += 2) {
+                pDst[i] = pSrc[i + 1];
+                pDst[i + 1] = pSrc[i];
+            }
+        }
+        else if ((((uint64_t)(pSrc)) & 0x3) == 0 && (((uint64_t)(pDst)) & 0x3) == 0){  // 4 bytes aligned for both src and dest
+            const uint32_t *ptr0 = (const uint32_t *)(pSrc);
+            uint32_t *ptr1 = (uint32_t *)(pDst);
+            int width_4 = width & ~3;
+            for (int i = 0; i < width_4; i += 4) {
+                uint32_t data0 = *ptr0++;
+                uint32_t data1 = (data0 >> 8) & 0x00ff00ff;
+                uint32_t data2 = (data0 << 8) & 0xff00ff00;
+                *ptr1++ = data1 | data2;
+            }
+            // process remaining data of less than 4 bytes at end of each row
+            for (int i = width_4; i < width; i += 2) {
+                pDst[i] = pSrc[i + 1];
+                pDst[i + 1] = pSrc[i];
+            }
+        }
+        else {
+            unsigned const char *ptr0 = pSrc;
+            unsigned char *ptr1 = pDst;
+            for (int i = 0; i < width; i += 2) {
+                *ptr1++ = ptr0[1];
+                *ptr1++ = ptr0[0];
+                ptr0 += 2;
+            }
+        }
+        pDst += width;
+        pSrc += srcStride;
+    }
+}
+
+// convert NV12 (Y plane, interlaced UV bytes) to YV12 (Y plane, V plane, U plane)
+// without Y and C 16 bytes aligned
+void convertNV12ToYV12(int width, int height, int srcStride, void *src, void *dst)
+{
+    int yStride = width;
+    size_t ySize = yStride * height;
+    int cStride = yStride/2;
+    size_t cSize = cStride * height/2;
+
+    unsigned char *srcPtr = (unsigned char *) src;
+    unsigned char *dstPtr = (unsigned char *) dst;
+    unsigned char *dstPtrV = (unsigned char *) dst + ySize;
+    unsigned char *dstPtrU = (unsigned char *) dst + ySize + cSize;
+
+    // copy the entire Y plane
+    if (srcStride == yStride) {
+        MEMCPY_S(dstPtr, ySize, srcPtr, ySize);
+        srcPtr += ySize;
+    } else if (srcStride > width) {
+        for (int i = 0; i < height; i++) {
+            MEMCPY_S(dstPtr, width, srcPtr, width);
+            srcPtr += srcStride;
+            dstPtr += yStride;
+        }
+    } else {
+        ALOGE("bad src stride value");
+        return;
+    }
+
+    // deinterlace the UV data
+    int halfHeight = height / 2;
+    int halfWidth = width / 2;
+    for ( int i = 0; i < halfHeight; ++i) {
+        for ( int j = 0; j < halfWidth; ++j) {
+            dstPtrV[j] = srcPtr[j * 2 + 1];
+            dstPtrU[j] = srcPtr[j * 2];
+        }
+        srcPtr += srcStride;
+        dstPtrV += cStride;
+        dstPtrU += cStride;
+    }
+}
+
+// convert NV12 (Y plane, interlaced UV bytes) to YV12 (Y plane, V plane, U plane)
+// with Y and C 16 bytes aligned
+void align16ConvertNV12ToYV12(int width, int height, int srcStride, void *src, void *dst)
+{
+    int yStride = ALIGN_16(width);
+    size_t ySize = yStride * height;
+    int cStride = ALIGN_16(yStride/2);
+    size_t cSize = cStride * height/2;
+
+    unsigned char *srcPtr = (unsigned char *) src;
+    unsigned char *dstPtr = (unsigned char *) dst;
+    unsigned char *dstPtrV = (unsigned char *) dst + ySize;
+    unsigned char *dstPtrU = (unsigned char *) dst + ySize + cSize;
+
+    // copy the entire Y plane
+    if (srcStride == yStride) {
+        MEMCPY_S(dstPtr, ySize, srcPtr, ySize);
+        srcPtr += ySize;
+    } else if (srcStride > width) {
+        for (int i = 0; i < height; i++) {
+            MEMCPY_S(dstPtr, width, srcPtr, width);
+            srcPtr += srcStride;
+            dstPtr += yStride;
+        }
+    } else {
+        ALOGE("bad src stride value");
+        return;
+    }
+
+    // deinterlace the UV data
+    for ( int i = 0; i < height / 2; ++i) {
+        for ( int j = 0; j < width / 2; ++j) {
+            dstPtrV[j] = srcPtr[j * 2 + 1];
+            dstPtrU[j] = srcPtr[j * 2];
+        }
+        srcPtr += srcStride;
+        dstPtrV += cStride;
+        dstPtrU += cStride;
+    }
+}
+
+// P411's Y, U, V are seperated. But the YUY2's Y, U and V are interleaved.
+void YUY2ToP411(int width, int height, int stride, void *src, void *dst)
+{
+    int ySize = width * height;
+    int cSize = width * height / 4;
+    int wHalf = width >> 1;
+
+    unsigned char *srcPtr = (unsigned char *) src;
+    unsigned char *dstPtr = (unsigned char *) dst;
+    unsigned char *dstPtrU = (unsigned char *) dst + ySize;
+    unsigned char *dstPtrV = (unsigned char *) dst + ySize + cSize;
+
+    for (int i = 0; i < height; i++) {
+        //The first line of the source
+        //Copy first Y Plane first
+        for (int j=0; j < width; j++) {
+            dstPtr[j] = srcPtr[j*2];
+        }
+
+        if (i & 1) {
+            //Copy the V plane
+            for (int k = 0; k < wHalf; k++) {
+                dstPtrV[k] = srcPtr[k * 4 + 3];
+            }
+            dstPtrV = dstPtrV + wHalf;
+        } else {
+            //Copy the U plane
+            for (int k = 0; k< wHalf; k++) {
+                dstPtrU[k] = srcPtr[k * 4 + 1];
+            }
+            dstPtrU = dstPtrU + wHalf;
+        }
+
+        srcPtr = srcPtr + stride * 2;
+        dstPtr = dstPtr + width;
+    }
+}
+
+// P411's Y, U, V are separated. But the NV12's U and V are interleaved.
+void NV12ToP411Separate(int width, int height, int stride,
+                                void *srcY, void *srcUV, void *dst)
+{
+    int i, j, p, q;
+    unsigned char *psrcY = (unsigned char *) srcY;
+    unsigned char *pdstY = (unsigned char *) dst;
+    unsigned char *pdstU, *pdstV;
+    unsigned char *psrcUV;
+
+    // copy Y data
+    for (i = 0; i < height; i++) {
+        MEMCPY_S(pdstY, width, psrcY, width);
+        pdstY += width;
+        psrcY += stride;
+    }
+
+    // copy U data and V data
+    psrcUV = (unsigned char *)srcUV;
+    pdstU = (unsigned char *)dst + width * height;
+    pdstV = pdstU + width * height / 4;
+    p = q = 0;
+    for (i = 0; i < height / 2; i++) {
+        for (j = 0; j < width; j++) {
+            if (j % 2 == 0) {
+                pdstU[p] = (psrcUV[i * stride + j] & 0xFF);
+                p++;
+           } else {
+                pdstV[q] = (psrcUV[i * stride + j] & 0xFF);
+                q++;
+            }
+        }
+    }
+}
+
+// P411's Y, U, V are seperated. But the NV12's U and V are interleaved.
+void NV12ToP411(int width, int height, int stride, void *src, void *dst)
+{
+    NV12ToP411Separate(width, height, stride,
+                    src, (void *)((unsigned char *)src + width * height), dst);
+}
+
+// P411's Y, U, V are separated. But the NV21's U and V are interleaved.
+void NV21ToP411Separate(int width, int height, int stride,
+                        void *srcY, void *srcUV, void *dst)
+{
+    int i, j, p, q;
+    unsigned char *psrcY = (unsigned char *) srcY;
+    unsigned char *pdstY = (unsigned char *) dst;
+    unsigned char *pdstU, *pdstV;
+    unsigned char *psrcUV;
+
+    // copy Y data
+    for (i = 0; i < height; i++) {
+        MEMCPY_S(pdstY, width, psrcY, width);
+        pdstY += width;
+        psrcY += stride;
+    }
+
+    // copy U data and V data
+    psrcUV = (unsigned char *)srcUV;
+    pdstU = (unsigned char *)dst + width * height;
+    pdstV = pdstU + width * height / 4;
+    p = q = 0;
+    for (i = 0; i < height / 2; i++) {
+        for (j = 0; j < width; j++) {
+            if ((j & 1) == 0) {
+                pdstV[p] = (psrcUV[i * stride + j] & 0xFF);
+                p++;
+           } else {
+                pdstU[q] = (psrcUV[i * stride + j] & 0xFF);
+                q++;
+            }
+        }
+    }
+}
+
+// P411's Y, U, V are seperated. But the NV21's U and V are interleaved.
+void NV21ToP411(int width, int height, int stride, void *src, void *dst)
+{
+    NV21ToP411Separate(width, height, stride,
+                       src, (void *)((unsigned char *)src + width * height), dst);
+}
+
+// IMC3 Y, U, V are separated,the stride for U/V is the same as Y.
+// about IMC3 detail, please refer to http://www.fourcc.org/yuv.php
+// But the NV12's U and V are interleaved.
+void NV12ToIMC3(int width, int height, int stride, void *srcY, void *srcUV, void *dst)
+{
+    int i, j, p, q;
+    unsigned char *pdstU, *pdstV;
+    unsigned char *psrcUV;
+
+    // copy Y data even with stride
+    MEMCPY_S(dst, stride * height, srcY, stride * height);
+    // copy U data and V data
+    psrcUV = (unsigned char *)srcUV;
+    pdstU = (unsigned char *)dst + stride * height;
+    pdstV = pdstU + stride * height / 2;
+    p = q = 0;
+    for (i = 0; i < height / 2; i++) {
+        for (j = 0; j < width; j++) {
+            if (j % 2 == 0) {
+                pdstU[p]= (psrcUV[i * stride + j] & 0xFF) ;
+                p++;
+           } else {
+                pdstV[q]= (psrcUV[i * stride + j] & 0xFF);
+                q++;
+            }
+        }
+        p += stride - width/2;
+        q += stride - width/2;
+    }
+}
+
+// IMC1 Y, V,U are separated,the stride for U/V is the same as Y.
+// IMC's V is before U
+// But the NV12's U and V are interleaved.
+void NV12ToIMC1(int width, int height, int stride, void *srcY, void *srcUV, void *dst)
+{
+    int i, j, p, q;
+    unsigned char *pdstU, *pdstV;
+    unsigned char *psrcUV;
+
+    // copy Y data even with stride
+    MEMCPY_S(dst, stride * height, srcY, stride * height);
+    // copy U data and V data
+    psrcUV = (unsigned char *)srcUV;
+    pdstV = (unsigned char *)dst + stride * height;
+    pdstU = pdstV + stride * height / 2;
+    p = q = 0;
+    for (i = 0; i < height / 2; i++) {
+        for (j = 0; j < width; j++) {
+            if (j % 2 == 0) {
+                pdstU[p]= (psrcUV[i * stride + j] & 0xFF) ;
+                p++;
+           } else {
+                pdstV[q]= (psrcUV[i * stride + j] & 0xFF);
+                q++;
+            }
+        }
+        p += stride - width/2;
+        q += stride - width/2;
+    }
+}
+
+// Re-pad YUV420 format image, the format can be YV12, YU12 or YUV420 planar.
+// If buffer size: (height*dstStride*1.5) > (height*srcStride*1.5), src and dst
+// buffer start addresses are same, the re-padding can be done inplace.
+void repadYUV420(int width, int height, int srcStride, int dstStride, void *src, void *dst)
+{
+    unsigned char *dptr;
+    unsigned char *sptr;
+    void * (*myCopy)(void *dst, const void *src, size_t n);
+
+    const int whalf = width >> 1;
+    const int hhalf = height >> 1;
+    const int scStride = srcStride >> 1;
+    const int dcStride = dstStride >> 1;
+    const int sySize = height * srcStride;
+    const int dySize = height * dstStride;
+    const int scSize = hhalf * scStride;
+    const int dcSize = hhalf * dcStride;
+
+    // directly copy, if (srcStride == dstStride)
+    if (srcStride == dstStride) {
+        MEMCPY_S(dst, dySize + 2*dcSize, src, dySize + 2*dcSize);
+        return;
+    }
+
+    // copy V(YV12 case) or U(YU12 case) plane line by line
+    sptr = (unsigned char *)src + sySize + 2*scSize - scStride;
+    dptr = (unsigned char *)dst + dySize + 2*dcSize - dcStride;
+
+    // try to avoid overlapped memcpy()
+    myCopy = (abs(sptr -dptr) > dstStride) ? memcpy : memmove;
+
+    for (int i = 0; i < hhalf; i ++) {
+        myCopy(dptr, sptr, whalf);
+        sptr -= scStride;
+        dptr -= dcStride;
+    }
+
+    // copy  V(YV12 case) or U(YU12 case) U/V plane line by line
+    sptr = (unsigned char *)src + sySize + scSize - scStride;
+    dptr = (unsigned char *)dst + dySize + dcSize - dcStride;
+    for (int i = 0; i < hhalf; i ++) {
+        myCopy(dptr, sptr, whalf);
+        sptr -= scStride;
+        dptr -= dcStride;
+    }
+
+    // copy Y plane line by line
+    sptr = (unsigned char *)src + sySize - srcStride;
+    dptr = (unsigned char *)dst + dySize - dstStride;
+    for (int i = 0; i < height; i ++) {
+        myCopy(dptr, sptr, width);
+        sptr -= srcStride;
+        dptr -= dstStride;
+    }
+}
+
+// covert YUYV(YUY2, YUV422 format) to YV12 (Y plane, V plane, U plane)
+void convertYUYVToYV12(int width, int height, int srcStride, int dstStride, void *src, void *dst)
+{
+    int ySize = width * height;
+    int cSize = ALIGN_16(dstStride/2) * height / 2;
+    int wHalf = width >> 1;
+
+    unsigned char *srcPtr = (unsigned char *) src;
+    unsigned char *dstPtr = (unsigned char *) dst;
+    unsigned char *dstPtrV = (unsigned char *) dst + ySize;
+    unsigned char *dstPtrU = (unsigned char *) dst + ySize + cSize;
+
+    for (int i = 0; i < height; i++) {
+        //The first line of the source
+        //Copy first Y Plane first
+        for (int j=0; j < width; j++) {
+            dstPtr[j] = srcPtr[j*2];
+        }
+
+        if (i & 1) {
+            //Copy the V plane
+            for (int k = 0; k< wHalf; k++) {
+                dstPtrV[k] = srcPtr[k * 4 + 3];
+            }
+            dstPtrV = dstPtrV + ALIGN_16(dstStride>>1);
+        } else {
+            //Copy the U plane
+            for (int k = 0; k< wHalf; k++) {
+                dstPtrU[k] = srcPtr[k * 4 + 1];
+            }
+            dstPtrU = dstPtrU + ALIGN_16(dstStride>>1);
+        }
+
+        srcPtr = srcPtr + srcStride * 2;
+        dstPtr = dstPtr + width;
+    }
+}
+
+// covert YUYV(YUY2, YUV422 format) to NV21 (Y plane, interlaced VU bytes)
+void convertYUYVToNV21(int width, int height, int srcStride, void *src, void *dst)
+{
+    int ySize = width * height;
+    int u_counter=1, v_counter=0;
+
+    unsigned char *srcPtr = (unsigned char *) src;
+    unsigned char *dstPtr = (unsigned char *) dst;
+    unsigned char *dstPtrUV = (unsigned char *) dst + ySize;
+
+    for (int i=0; i < height; i++) {
+        //The first line of the source
+        //Copy first Y Plane first
+        for (int j=0; j < width * 2; j++) {
+            if (j % 2 == 0)
+                dstPtr[j/2] = srcPtr[j];
+            if (i%2) {
+                if (( j % 4 ) == 3) {
+                    dstPtrUV[v_counter] = srcPtr[j]; //V plane
+                    v_counter += 2;
+                }
+                if (( j % 4 ) == 1) {
+                    dstPtrUV[u_counter] = srcPtr[j]; //U plane
+                    u_counter += 2;
+                }
+            }
+        }
+
+        srcPtr = srcPtr + srcStride * 2;
+        dstPtr = dstPtr + width;
+    }
+}
+
+void convertNV12ToYUYV(int srcWidth, int srcHeight, int srcStride, int dstStride, const void *src, void *dst)
+{
+    int y_counter = 0, u_counter = 1, v_counter = 3, uv_counter = 0;
+    unsigned char *srcYPtr = (unsigned char *) src;
+    unsigned char *srcUVPtr = (unsigned char *)src + srcWidth * srcHeight;
+    unsigned char *dstPtr = (unsigned char *) dst;
+
+    for (int i = 0; i < srcHeight; i++) {
+        for (int k = 0; k < srcWidth; k++) {
+                dstPtr[y_counter] = srcYPtr[k];
+                y_counter += 2;
+                dstPtr[u_counter] = srcUVPtr[uv_counter];
+                u_counter += 4;
+                dstPtr[v_counter] = srcUVPtr[uv_counter + 1];
+                v_counter += 4;
+                uv_counter += 2;
+        }
+        if ((i % 2) == 0) {
+            srcUVPtr = srcUVPtr + srcStride;
+        }
+
+        dstPtr = dstPtr + 2 * dstStride;
+        srcYPtr = srcYPtr + srcStride;
+        u_counter = 1;
+        v_counter = 3;
+        y_counter = 0;
+        uv_counter = 0;
+    }
+}
+
+void convertBuftoYV12(int format, int width, int height, int srcStride,
+                      int dstStride, void *src, void *dst, bool align16)
+{
+    switch (format) {
+    case V4L2_PIX_FMT_NV12:
+        align16 ? align16ConvertNV12ToYV12(width, height, srcStride, src, dst)
+            : convertNV12ToYV12(width, height, srcStride, src, dst);
+        break;
+    case V4L2_PIX_FMT_YVU420:
+        copyYV12ToYV12(width, height, srcStride, dstStride, src, dst);
+        break;
+    case V4L2_PIX_FMT_YUYV:
+        convertYUYVToYV12(width, height, srcStride, dstStride, src, dst);
+        break;
+    default:
+        ALOGE("%s: unsupported format %d", __func__, format);
+        break;
+    }
+}
+
+void convertBuftoNV21(int format, int width, int height, int srcStride,
+                      int dstStride, void *src, void *dst)
+{
+    switch (format) {
+    case V4L2_PIX_FMT_NV12:
+        trimConvertNV12ToNV21(width, height, srcStride, src, dst);
+        break;
+    case V4L2_PIX_FMT_YVU420:
+        convertYV12ToNV21(width, height, srcStride, dstStride, src, dst);
+        break;
+    case V4L2_PIX_FMT_YUYV:
+        convertYUYVToNV21(width, height, srcStride, src, dst);
+        break;
+    default:
+        ALOGE("%s: unsupported format %d", __func__, format);
+        break;
+    }
+}
+
+void convertBuftoYUYV(int format, int width, int height, int srcStride,
+                      int dstStride, void *src, void *dst)
+{
+    switch (format) {
+    case V4L2_PIX_FMT_NV12:
+        convertNV12ToYUYV(width, height, srcStride, dstStride, src, dst);
+        break;
+    default:
+        LOGE("%s: unsupported format %d", __func__, format);
+        break;
+    }
+}
+} // namespace ImageConverter
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/image_process/ImageConverter.h b/camera/hal/intel/ipu6/src/image_process/ImageConverter.h
new file mode 100644
index 000000000000..f55479a57b63
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/image_process/ImageConverter.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2016-2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+namespace icamera {
+namespace ImageConverter {
+
+void YUV420ToRGB565(int width, int height, void *src, void *dst);
+
+void trimConvertNV12ToRGB565(int width, int height, int srcStride, void *src, void *dst);
+
+void convertYV12ToNV21(int width, int height, int srcStride, int dstStride, void *src, void *dst);
+void copyYV12ToYV12(int width, int height, int srcStride, int dstStride, void *src, void *dst);
+
+void trimConvertNV12ToNV21(int width, int height, int srcStride, void *src, void *dst);
+
+void convertNV12ToYV12(int width, int height, int srcStride, void *src, void *dst);
+void align16ConvertNV12ToYV12(int width, int height, int srcStride, void *src, void *dst);
+
+void NV12ToP411(int width, int height, int stride, void *src, void *dst);
+void NV21ToP411(int width, int height, int stride, void *src, void *dst);
+void NV12ToP411Separate(int width, int height, int stride,
+                                    void *srcY, void *srcUV, void *dst);
+void NV21ToP411Separate(int width, int height, int stride,
+                                    void *srcY, void *srcUV, void *dst);
+
+void YUY2ToP411(int width, int height, int stride, void *src, void *dst);
+void NV12ToIMC3(int width, int height, int stride,void *srcY, void *srcUV, void *dst);
+void NV12ToIMC1(int width, int height, int stride, void *srcY, void *srcUV, void *dst);
+void convertYUYVToYV12(int width, int height, int srcStride, int dstStride, void *src, void *dst);
+
+void convertYUYVToNV21(int width, int height, int srcStride, void *src, void *dst);
+void convertNV12ToYUYV(int srcWidth, int srcHeight, int srcStride, int dstStride, const void *src, void *dst);
+
+void convertBuftoYV12(int format, int width, int height, int srcStride,
+                      int dstStride, void *src, void *dst, bool align16 = true);
+void convertBuftoNV21(int format, int width, int height, int srcStride,
+                      int dstStride, void *src, void *dst);
+void convertBuftoYUYV(int format, int width, int height, int srcStride,
+                      int dstStride, void *src, void *dst);
+
+void repadYUV420(int width, int height, int srcStride, int dstStride, void *src, void *dst);
+
+} // namespace ImageConverter
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/image_process/PostProcessorBase.cpp b/camera/hal/intel/ipu6/src/image_process/PostProcessorBase.cpp
new file mode 100644
index 000000000000..5b419751a1f6
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/image_process/PostProcessorBase.cpp
@@ -0,0 +1,318 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define LOG_TAG "PostProcessorBase"
+
+#include <vector>
+#include <hardware/camera3.h>
+#include "stdlib.h"
+#include "PostProcessorBase.h"
+#include "iutils/CameraLog.h"
+
+using std::shared_ptr;
+
+namespace icamera {
+
+PostProcessorBase::PostProcessorBase(std::string processName) :
+    mName(processName),
+    mProcessor(nullptr)
+{
+    LOG1("@%s PostProcessorBase created", __func__);
+}
+
+PostProcessorBase::~PostProcessorBase()
+{
+    LOG1("@%s PostProcessorBase destory", __func__);
+}
+
+ScaleProcess::ScaleProcess() :
+    PostProcessorBase("Scaler")
+{
+    LOG1("@%s create scaler processor", __func__);
+    mProcessor = IImageProcessor::createImageProcessor();
+}
+
+status_t ScaleProcess::doPostProcessing(const shared_ptr<camera3::Camera3Buffer> &inBuf,
+                                        shared_ptr<camera3::Camera3Buffer> &outBuf)
+{
+    LOG1("@%s processor name: %s", __func__, mName.c_str());
+    CheckError(!inBuf, UNKNOWN_ERROR, "%s, the inBuf is nullptr", __func__);
+    CheckError(!outBuf, UNKNOWN_ERROR, "%s, the outBuf is nullptr", __func__);
+
+    int ret = mProcessor->scaleFrame(inBuf, outBuf);
+    CheckError(ret != OK, UNKNOWN_ERROR, "Failed to do post processing, name: %s", mName.c_str());
+
+    return OK;
+}
+
+RotateProcess::RotateProcess(int angle) :
+    PostProcessorBase("Rotate"),
+    mAngle(angle)
+{
+    LOG1("@%s create rotate processor, degree: %d", __func__, mAngle);
+    mProcessor = IImageProcessor::createImageProcessor();
+};
+
+status_t RotateProcess::doPostProcessing(const shared_ptr<camera3::Camera3Buffer> &inBuf,
+                                         shared_ptr<camera3::Camera3Buffer> &outBuf)
+{
+    LOG1("@%s processor name: %s", __func__, mName.c_str());
+    CheckError(!inBuf, UNKNOWN_ERROR, "%s, the inBuf is nullptr", __func__);
+    CheckError(!outBuf, UNKNOWN_ERROR, "%s, the outBuf is nullptr", __func__);
+    std::vector<uint8_t> rotateBuf;
+
+    int ret = mProcessor->rotateFrame(inBuf, outBuf, mAngle, rotateBuf);
+    CheckError(ret != OK, UNKNOWN_ERROR, "Failed to do post processing, name: %s", mName.c_str());
+
+    return OK;
+}
+
+CropProcess::CropProcess() :
+    PostProcessorBase("Crop")
+{
+    LOG1("@%s create crop processor", __func__);
+    mProcessor = IImageProcessor::createImageProcessor();
+};
+
+status_t CropProcess::doPostProcessing(const shared_ptr<camera3::Camera3Buffer> &inBuf,
+                                       shared_ptr<camera3::Camera3Buffer> &outBuf)
+{
+    LOG1("@%s processor name: %s", __func__, mName.c_str());
+    CheckError(!inBuf, UNKNOWN_ERROR, "%s, the inBuf is nullptr", __func__);
+    CheckError(!outBuf, UNKNOWN_ERROR, "%s, the outBuf is nullptr", __func__);
+
+    int ret = mProcessor->cropFrame(inBuf, outBuf);
+    CheckError(ret != OK, UNKNOWN_ERROR, "Failed to do post processing, name: %s", mName.c_str());
+
+    return OK;
+}
+
+ConvertProcess::ConvertProcess() :
+    PostProcessorBase("Convert")
+{
+    LOG1("@%s create convert processor", __func__);
+    mProcessor = IImageProcessor::createImageProcessor();
+};
+
+status_t ConvertProcess::doPostProcessing(const shared_ptr<camera3::Camera3Buffer> &inBuf,
+                                          shared_ptr<camera3::Camera3Buffer> &outBuf)
+{
+    LOG1("@%s processor name: %s", __func__, mName.c_str());
+    CheckError(!inBuf, UNKNOWN_ERROR, "%s, the inBuf is nullptr", __func__);
+    CheckError(!outBuf, UNKNOWN_ERROR, "%s, the outBuf is nullptr", __func__);
+
+    int ret = mProcessor->convertFrame(inBuf, outBuf);
+    CheckError(ret != OK, UNKNOWN_ERROR, "Failed to do post processing, name: %s", mName.c_str());
+
+    return OK;
+}
+
+JpegProcess::JpegProcess(int cameraId) :
+    PostProcessorBase("JpegEncode"),
+    mCameraId(cameraId),
+    mCropBuffer(nullptr),
+    mScaleBuffer(nullptr),
+    mThumbOutput(nullptr),
+    mExifData(nullptr)
+{
+    LOG1("@%s create jpeg encode processor", __func__);
+
+    mProcessor = IImageProcessor::createImageProcessor();
+    mJpegEncoder = IJpegEncoder::createJpegEncoder();
+    mJpegMaker = std::unique_ptr<JpegMaker>(new JpegMaker());
+};
+
+JpegProcess::~JpegProcess()
+{
+}
+
+void JpegProcess::attachJpegBlob(const EncodePackage &package)
+{
+    LOG2("@%s, encoded data size: %d, exif data size: %d",
+         __func__, package.encodedDataSize, package.exifDataSize);
+    uint8_t *resultPtr = static_cast<uint8_t*>(package.outputData) +
+                         package.outputSize - sizeof(struct camera3_jpeg_blob);
+
+    // save jpeg size at the end of file
+    auto *blob = reinterpret_cast<struct camera3_jpeg_blob*>(resultPtr);
+    blob->jpeg_blob_id = CAMERA3_JPEG_BLOB_ID;
+    blob->jpeg_size = package.encodedDataSize + package.exifDataSize;
+}
+
+std::shared_ptr<camera3::Camera3Buffer> JpegProcess::cropAndDownscaleThumbnail(int thumbWidth, int thumbHeight,
+                                                                               const shared_ptr<camera3::Camera3Buffer> &inBuf)
+{
+    LOG1("@%s, input size: %dx%d, thumbnail info: %dx%d",
+         __func__, inBuf->width(), inBuf->height(), thumbWidth, thumbHeight);
+
+    if (thumbWidth <= 0 || thumbHeight <= 0) {
+        LOGW("@%s, skip, thumbWidth:%d, thumbHeight:%d", __func__, thumbWidth, thumbHeight);
+        return nullptr;
+    }
+
+    int ret = OK;
+    shared_ptr<camera3::Camera3Buffer> tempBuffer = inBuf;
+
+    // Do crop first if needed
+    if (IImageProcessor::isProcessingTypeSupported(POST_PROCESS_CROP) &&
+        inBuf->width() * thumbHeight != inBuf->height() * thumbWidth) {
+        int width = 0, height = 0;
+        if (inBuf->width() * thumbHeight < inBuf->height() * thumbWidth) {
+            width = inBuf->width();
+            height = inBuf->width() * thumbHeight / thumbWidth;
+        } else {
+            width = inBuf->height() * thumbWidth / thumbHeight;
+            height = inBuf->height();
+        }
+
+        if (mCropBuffer && (mCropBuffer->width() != width || mCropBuffer->height() != height))
+            mCropBuffer.reset();
+        if (!mCropBuffer) {
+            int size = CameraUtils::getFrameSize(inBuf->v4l2Fmt(), width, height);
+            mCropBuffer = camera3::MemoryUtils::allocateHeapBuffer(width, height,
+                                                                   width, inBuf->v4l2Fmt(),
+                                                                   mCameraId, size);
+            CheckError(!mCropBuffer, nullptr, "%s, Failed to allocate the internal crop buffer", __func__);
+        }
+
+        LOG2("@%s, Crop the main buffer from %dx%d to %dx%d",
+             __func__, inBuf->width(), inBuf->height(), width, height);
+        ret = mProcessor->cropFrame(inBuf, mCropBuffer);
+        CheckError(ret != OK, nullptr, "%s, Failed to crop the frame", __func__);
+        tempBuffer = mCropBuffer;
+    }
+
+    if (IImageProcessor::isProcessingTypeSupported(POST_PROCESS_SCALING)) {
+        if (mScaleBuffer && (mScaleBuffer->width() != thumbWidth
+            || mScaleBuffer->height() != thumbHeight))
+            mScaleBuffer.reset();
+        if (!mScaleBuffer) {
+            int size = CameraUtils::getFrameSize(inBuf->v4l2Fmt(), thumbWidth, thumbHeight);
+            mScaleBuffer = camera3::MemoryUtils::allocateHeapBuffer(thumbWidth, thumbHeight,
+                                                                    thumbWidth, inBuf->v4l2Fmt(),
+                                                                    mCameraId, size);
+            CheckError(!mScaleBuffer, nullptr, "%s, Failed to allocate the internal scale buffer", __func__);
+        }
+
+        LOG2("@%s, Scale the buffer from %dx%d to %dx%d",
+              __func__, inBuf->width(), inBuf->height(), thumbWidth, thumbHeight);
+        ret = mProcessor->scaleFrame(tempBuffer, mScaleBuffer);
+        CheckError(ret != OK, nullptr, "%s, Failed to crop the frame", __func__);
+        tempBuffer = mScaleBuffer;
+    }
+
+    if (tempBuffer->width() != thumbWidth || tempBuffer->height() != thumbHeight) {
+        LOGE("%s, Failed to crop & downscale the main buffer to thumbnail buffer", __func__);
+        return nullptr;
+    }
+
+    return tempBuffer;
+}
+
+void JpegProcess::fillEncodeInfo(const shared_ptr<camera3::Camera3Buffer> &inBuf,
+                                 const shared_ptr<camera3::Camera3Buffer> &outBuf,
+                                 EncodePackage &package)
+{
+    package.inputWidth = inBuf->width();
+    package.inputHeight = inBuf->height();
+    package.inputStride = inBuf->stride();
+    package.inputFormat = inBuf->v4l2Fmt();
+    package.inputSize = inBuf->size();
+    package.inputBufferHandle = static_cast<void*>(inBuf->getBufferHandle());
+    package.inputData = inBuf->data();
+
+    package.outputWidth = outBuf->width();
+    package.outputHeight = outBuf->height();
+    package.outputSize = outBuf->size();
+    package.outputBufferHandle = static_cast<void*>(outBuf->getBufferHandle());
+    package.outputData = outBuf->data();
+}
+
+status_t JpegProcess::doPostProcessing(const shared_ptr<camera3::Camera3Buffer> &inBuf,
+                                       const icamera::Parameters &parameter,
+                                       shared_ptr<camera3::Camera3Buffer> &outBuf)
+{
+    LOG1("@%s", __func__);
+    bool isEncoded = false;
+
+    icamera::ExifMetaData exifMetadata;
+    status_t status = mJpegMaker->setupExifWithMetaData(inBuf->width(), inBuf->height(), parameter, &exifMetadata);
+    CheckError(status != OK, UNKNOWN_ERROR, "@%s, Setup exif metadata failed.", __func__);
+    LOG2("@%s: setting exif metadata done!", __func__);
+
+    std::shared_ptr<camera3::Camera3Buffer> thumbInput =
+        cropAndDownscaleThumbnail(exifMetadata.mJpegSetting.thumbWidth,
+                                  exifMetadata.mJpegSetting.thumbHeight,
+                                  inBuf);
+
+    EncodePackage thumbnailPackage;
+    if (thumbInput) {
+        if (mThumbOutput == nullptr ||
+            mThumbOutput->width() != exifMetadata.mJpegSetting.thumbWidth ||
+            mThumbOutput->height() != exifMetadata.mJpegSetting.thumbHeight ||
+            mThumbOutput->v4l2Fmt() != outBuf->v4l2Fmt()) {
+            mThumbOutput = camera3::MemoryUtils::allocateHeapBuffer(
+                               exifMetadata.mJpegSetting.thumbWidth, exifMetadata.mJpegSetting.thumbHeight,
+                               exifMetadata.mJpegSetting.thumbWidth, outBuf->v4l2Fmt(),
+                               mCameraId,
+                               exifMetadata.mJpegSetting.thumbWidth * exifMetadata.mJpegSetting.thumbHeight * 3 / 2);
+            CheckError(!mThumbOutput, NO_MEMORY, "%s, Failed to allocate the mThumbOutput", __func__);
+        }
+
+        // encode thumbnail image
+        fillEncodeInfo(thumbInput, mThumbOutput, thumbnailPackage);
+        thumbnailPackage.quality = exifMetadata.mJpegSetting.jpegThumbnailQuality;
+        // the exifDataSize should be 0 for encoding thumbnail
+        thumbnailPackage.exifData = nullptr;
+        thumbnailPackage.exifDataSize = 0;
+
+        do {
+            isEncoded = mJpegEncoder->doJpegEncode(thumbnailPackage);
+            thumbnailPackage.quality -= 5;
+        } while (thumbnailPackage.encodedDataSize > THUMBNAIL_SIZE_LIMITATION &&
+            thumbnailPackage.quality > 0);
+
+        if (!isEncoded || thumbnailPackage.quality < 0) {
+            LOGW("Failed to generate thumbnail, isEncoded: %d, encoded thumbnail size: %d, quality:%d",
+                 isEncoded, thumbnailPackage.encodedDataSize, thumbnailPackage.quality);
+        }
+    }
+
+    // save exif data
+    uint32_t exifBufSize = ENABLE_APP2_MARKER ? EXIF_SIZE_LIMITATION * 2 : EXIF_SIZE_LIMITATION;
+    if (mExifData == nullptr) {
+        mExifData = std::unique_ptr<unsigned char[]>(new unsigned char[exifBufSize]);
+    }
+    uint8_t* finalExifDataPtr = static_cast<uint8_t*>(mExifData.get());
+    uint32_t finalExifDataSize = 0;
+    status = mJpegMaker->getExif(thumbnailPackage, finalExifDataPtr, &finalExifDataSize);
+    CheckError(status != OK, status, "@%s, Failed to get Exif", __func__);
+    LOG2("%s, exifBufSize %d, finalExifDataSize %d", __func__, exifBufSize, finalExifDataSize);
+
+    // encode main image
+    EncodePackage finalEncodePackage;
+    fillEncodeInfo(inBuf, outBuf, finalEncodePackage);
+    finalEncodePackage.quality = exifMetadata.mJpegSetting.jpegQuality;
+    finalEncodePackage.exifData = finalExifDataPtr;
+    finalEncodePackage.exifDataSize = finalExifDataSize;
+    isEncoded = mJpegEncoder->doJpegEncode(finalEncodePackage);
+    CheckError(!isEncoded, UNKNOWN_ERROR, "@%s, Failed to encode main image", __func__);
+    mJpegMaker->writeExifData(finalEncodePackage);
+
+    attachJpegBlob(finalEncodePackage);
+
+    return OK;
+}
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/image_process/PostProcessorBase.h b/camera/hal/intel/ipu6/src/image_process/PostProcessorBase.h
new file mode 100644
index 000000000000..2039e38a0080
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/image_process/PostProcessorBase.h
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+#include "Parameters.h"
+#include "Camera3Buffer.h"
+#include "IImageProcessor.h"
+#include "EXIFMetaData.h"
+#include "IJpegEncoder.h"
+#include "JpegMaker.h"
+
+namespace icamera {
+
+class PostProcessorBase {
+public:
+    PostProcessorBase(std::string processName);
+    virtual ~PostProcessorBase();
+
+    std::string getName() { return mName; }
+    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
+                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf) { return OK; }
+
+    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
+                                      const Parameters &parameter,
+                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf) { return OK; }
+private:
+    DISALLOW_COPY_AND_ASSIGN(PostProcessorBase);
+
+protected:
+    std::string mName;
+    std::unique_ptr<IImageProcessor> mProcessor;
+};
+
+class ScaleProcess : public PostProcessorBase {
+public:
+    ScaleProcess();
+    ~ScaleProcess() {};
+
+    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
+                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf);
+};
+
+class RotateProcess : public PostProcessorBase {
+public:
+    RotateProcess(int angle);
+    ~RotateProcess() {};
+
+    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
+                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf);
+private:
+    int mAngle;
+};
+
+class CropProcess : public PostProcessorBase {
+public:
+    CropProcess();
+    ~CropProcess() {};
+
+    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
+                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf);
+};
+
+class ConvertProcess : public PostProcessorBase {
+public:
+    ConvertProcess();
+    ~ConvertProcess() {};
+
+    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
+                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf);
+};
+
+class JpegProcess : public PostProcessorBase {
+public:
+    JpegProcess(int cameraId);
+    ~JpegProcess();
+
+    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
+                                      const Parameters &parameter,
+                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf);
+private:
+    void attachJpegBlob(const EncodePackage &package);
+    std::shared_ptr<camera3::Camera3Buffer>
+    cropAndDownscaleThumbnail(int thumbWidth, int thumbHeight,
+                              const std::shared_ptr<camera3::Camera3Buffer> &inBuf);
+    void fillEncodeInfo(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
+                        const std::shared_ptr<camera3::Camera3Buffer> &outBuf,
+                        EncodePackage &package);
+
+private:
+    int mCameraId;
+
+    std::shared_ptr<camera3::Camera3Buffer> mCropBuffer;
+    std::shared_ptr<camera3::Camera3Buffer> mScaleBuffer;
+    std::shared_ptr<camera3::Camera3Buffer> mThumbOutput;
+
+    std::unique_ptr<JpegMaker> mJpegMaker;
+    std::unique_ptr<IJpegEncoder> mJpegEncoder;
+    std::unique_ptr<unsigned char[]> mExifData;
+};
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/image_process/PostProcessorCore.cpp b/camera/hal/intel/ipu6/src/image_process/PostProcessorCore.cpp
new file mode 100644
index 000000000000..ff1c3a2a2238
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/image_process/PostProcessorCore.cpp
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "PostProcessorCore"
+
+#include "iutils/CameraLog.h"
+#include "PostProcessorCore.h"
+
+using std::shared_ptr;
+
+namespace icamera {
+
+PostProcessorCore::PostProcessorCore(int cameraId) :
+    mCameraId(cameraId)
+{
+    LOG1("@%s, cameraId: %d", __func__, mCameraId);
+}
+
+PostProcessorCore::~PostProcessorCore()
+{
+    LOG1("@%s", __func__);
+}
+
+bool PostProcessorCore::isPostProcessTypeSupported(PostProcessType type)
+{
+    return IImageProcessor::isProcessingTypeSupported(type);
+}
+
+status_t PostProcessorCore::createProcessor()
+{
+    LOG2("@%s, cameraId: %d", __func__, mCameraId);
+
+    mProcessorVector.clear();
+    for (const auto &order : mProcessorsInfo) {
+        shared_ptr<PostProcessorBase> processor = nullptr;
+        switch (order.type) {
+        case POST_PROCESS_SCALING :
+            processor = std::make_shared<ScaleProcess>();
+            break;
+        case POST_PROCESS_ROTATE :
+            processor = std::make_shared<RotateProcess>(order.angle);
+            break;
+        case POST_PROCESS_CROP :
+            processor = std::make_shared<CropProcess>();
+            break;
+        case POST_PROCESS_CONVERT :
+            processor = std::make_shared<ConvertProcess>();
+            break;
+        case POST_PROCESS_JPEG_ENCODING :
+            processor = std::make_shared<JpegProcess>(mCameraId);
+            break;
+        case POST_PROCESS_NONE:
+            break;
+        default:
+            LOGE("%s, Doesn't support this kind of post-processor");
+            return UNKNOWN_ERROR;
+        }
+
+        CheckError(!processor, UNKNOWN_ERROR, "%s, Failed to create the post processor: 0x%x", __func__, order.type);
+        mProcessorVector.push_back(processor);
+    }
+
+    LOG2("%s, the number of post processor unit is %zu", __func__, mProcessorVector.size());
+    return OK;
+}
+
+status_t PostProcessorCore::allocateBuffers()
+{
+    LOG2("@%s,mProcessorVector.size: %zu cameraId: %d", __func__, mProcessorVector.size(), mCameraId);
+
+    mInterBuffers.clear();
+    for (size_t i = 0; i < mProcessorsInfo.size() - 1; i++) {
+        const stream_t &info = mProcessorsInfo[i].outputInfo;
+        shared_ptr<camera3::Camera3Buffer> buf = camera3::MemoryUtils::allocateHeapBuffer(info.width, info.height,
+                                                                                          info.stride, info.format,
+                                                                                          mCameraId, info.size);
+        CheckError(!buf, NO_MEMORY, "@%s: Failed to allocate internal buffer: processor: %s",
+              __func__, mProcessorVector[i]->getName().c_str());
+        mInterBuffers[mProcessorVector[i]] = buf;
+    }
+
+    return OK;
+}
+
+status_t PostProcessorCore::configure(const std::vector<PostProcessInfo> &processorOrder)
+{
+    if (processorOrder.empty())
+        return OK;
+
+    mProcessorsInfo = processorOrder;
+    int ret = createProcessor();
+    CheckError(ret != OK, ret, "%s, Failed to create the post processor", __func__);
+
+    ret = allocateBuffers();
+    CheckError(ret != OK, ret, "%s, Failed allocate the internal buffers", __func__);
+
+    return OK;
+}
+
+status_t PostProcessorCore::doPostProcessing(const shared_ptr<camera3::Camera3Buffer> &inBuf,
+                                             const Parameters &parameter,
+                                             shared_ptr<camera3::Camera3Buffer> &outBuf)
+{
+    CheckError(!inBuf, UNKNOWN_ERROR, "%s, the inBuf is nullptr", __func__);
+    CheckError(!outBuf, UNKNOWN_ERROR, "%s, the outBuf is nullptr", __func__);
+
+    shared_ptr<camera3::Camera3Buffer> input = inBuf;
+    shared_ptr<camera3::Camera3Buffer> output = nullptr;
+    for (size_t i = 0; i < mProcessorVector.size(); i++) {
+        if (i == (mProcessorVector.size() - 1)) {
+            output = outBuf;
+        } else {
+            output = mInterBuffers[mProcessorVector[i]];
+        }
+
+        int ret = OK;
+        if (mProcessorsInfo[i].type == POST_PROCESS_JPEG_ENCODING)
+            ret = mProcessorVector[i]->doPostProcessing(input, parameter, output);
+        else
+            ret = mProcessorVector[i]->doPostProcessing(input, output);
+        CheckError(ret != OK, ret, "%s, Failed to do post processing: %s", __func__, mProcessorVector[i]->getName().c_str());
+
+        input = output;
+    }
+
+    return OK;
+}
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/image_process/PostProcessorCore.h b/camera/hal/intel/ipu6/src/image_process/PostProcessorCore.h
new file mode 100644
index 000000000000..c686553d987c
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/image_process/PostProcessorCore.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <vector>
+#include <map>
+
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+#include "PostProcessorBase.h"
+#include "ProcessType.h"
+
+namespace icamera {
+
+struct PostProcessInfo {
+    stream_t inputInfo;
+    stream_t outputInfo;
+    PostProcessType type;
+    int angle;
+    PostProcessInfo() : type(POST_PROCESS_NONE),angle(0) { CLEAR(inputInfo); CLEAR(outputInfo); }
+};
+
+/**
+ * \class PostProcessorCore
+ *
+ * This class is used to encode JPEG and rotate image.
+ *
+ */
+class PostProcessorCore {
+
+public:
+    PostProcessorCore(int cameraId);
+    virtual ~PostProcessorCore();
+
+    bool isPostProcessTypeSupported(PostProcessType type);
+    status_t configure(const std::vector<PostProcessInfo> &processorOrder);
+    status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &mainBuf,
+                              const Parameters &parameter,
+                              std::shared_ptr<camera3::Camera3Buffer> &outBuf);
+private:
+    status_t createProcessor();
+    status_t allocateBuffers();
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(PostProcessorCore);
+
+private:
+    int mCameraId;
+    std::map<std::shared_ptr<PostProcessorBase>, std::shared_ptr<camera3::Camera3Buffer>>
+            mInterBuffers;
+    std::vector<PostProcessInfo> mProcessorsInfo;
+    std::vector<std::shared_ptr<PostProcessorBase>> mProcessorVector;
+};
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/image_process/ProcessType.h b/camera/hal/intel/ipu6/src/image_process/ProcessType.h
new file mode 100644
index 000000000000..d7354ddd1268
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/image_process/ProcessType.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+namespace icamera {
+
+enum PostProcessType {
+    POST_PROCESS_NONE = 0,
+    POST_PROCESS_ROTATE = 1 << 0,
+    POST_PROCESS_SCALING = 1 << 1,
+    POST_PROCESS_CROP = 1 << 2,
+    POST_PROCESS_CONVERT = 1 << 3,
+    POST_PROCESS_JPEG_ENCODING = 1 << 4
+};
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.cpp b/camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.cpp
new file mode 100644
index 000000000000..c3156ddca111
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.cpp
@@ -0,0 +1,234 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "ImageProcessorCore"
+
+#include <libyuv.h>
+#include "iutils/CameraLog.h"
+#include "ImageProcessorCore.h"
+#include "ImageConverter.h"
+
+namespace icamera {
+
+ImageProcessorCore::ImageProcessorCore()
+{
+    LOG2("enter %s", __func__);
+    mRotationMode = {
+        {0, libyuv::RotationMode::kRotate0},
+        {90, libyuv::RotationMode::kRotate90},
+        {180, libyuv::RotationMode::kRotate180},
+        {270, libyuv::RotationMode::kRotate270}
+    };
+}
+
+ImageProcessorCore::~ImageProcessorCore()
+{
+    LOG2("enter %s", __func__);
+}
+
+std::unique_ptr<IImageProcessor> IImageProcessor::createImageProcessor()
+{
+    return std::unique_ptr<ImageProcessorCore>(new ImageProcessorCore());
+}
+
+//If support this kind of post process type in current OS
+bool IImageProcessor::isProcessingTypeSupported(PostProcessType type)
+{
+    int supportedType = POST_PROCESS_ROTATE |
+                        POST_PROCESS_SCALING |
+                        POST_PROCESS_CROP |
+                        POST_PROCESS_CONVERT |
+                        POST_PROCESS_JPEG_ENCODING;
+
+    return supportedType & type;
+}
+
+status_t ImageProcessorCore::cropFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
+                                       std::shared_ptr<camera3::Camera3Buffer> &output)
+{
+    LOG2("%s: src: %dx%d,format 0x%x, dest: %dx%d format 0x%x",
+         __func__, input->width(), input->height(), input->v4l2Fmt(),
+         output->width(), output->height(), output->v4l2Fmt());
+
+    int srcW = input->stride();
+    int srcH = input->height();
+    int dstW = output->stride();
+    int dstH = output->height();
+
+    std::unique_ptr<uint8_t[]> srcI420Buf;
+    unsigned int srcI420BufSize = srcW * srcH * 3 / 2;
+    srcI420Buf.reset(new uint8_t[srcI420BufSize]);
+
+    const uint8_t* srcBufY = static_cast<uint8_t*>(input->data());
+    const uint8_t* srcBufUV = srcBufY + srcW * srcH;
+    uint8_t* srcI420BufY = static_cast<uint8_t*>(srcI420Buf.get());
+    uint8_t* srcI420BufU = srcI420BufY + srcW * srcH;
+    uint8_t* srcI420BufV = srcI420BufU + srcW * srcH / 4;
+    int ret = libyuv::NV12ToI420(srcBufY, srcW,
+                                 srcBufUV, srcW,
+                                 srcI420BufY, srcW,
+                                 srcI420BufU, srcW / 2,
+                                 srcI420BufV, srcW / 2,
+                                 srcW, srcH);
+    CheckError((ret != 0), UNKNOWN_ERROR, "@%s, NV12ToI420 fails", __func__);
+
+    std::unique_ptr<uint8_t[]> dstI420BufUV;
+    unsigned int dstI420BufUVSize = dstW * dstH / 2;
+    dstI420BufUV.reset(new uint8_t[dstI420BufUVSize]);
+
+    uint8_t* dstI420BufU = static_cast<uint8_t*>(dstI420BufUV.get());
+    uint8_t* dstI420BufV = dstI420BufU + dstW * dstH / 4;
+    ret = libyuv::ConvertToI420(static_cast<uint8_t*>(srcI420Buf.get()), srcI420BufSize,
+                                static_cast<uint8_t*>(output->data()), dstW,
+                                dstI420BufU, (dstW + 1) / 2,
+                                dstI420BufV, (dstW + 1) / 2,
+                                (srcW - dstW) / 2, (srcH - dstH) / 2,
+                                srcW, srcH, dstW, dstH,
+                                libyuv::RotationMode::kRotate0, libyuv::FourCC::FOURCC_I420);
+    CheckError(ret != 0, UNKNOWN_ERROR, "@%s, ConvertToI420 fails", __func__);
+
+    uint8_t* dstBufUV = static_cast<uint8_t*>(output->data()) + dstW * dstH;
+    libyuv::MergeUVPlane(dstI420BufU, (dstW + 1) / 2,
+                         dstI420BufV, (dstW + 1) / 2,
+                         dstBufUV, dstW,
+                         (dstW + 1) / 2, (dstH + 1) / 2);
+
+    return OK;
+}
+
+status_t ImageProcessorCore::scaleFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
+                                        std::shared_ptr<camera3::Camera3Buffer> &output)
+{
+    LOG2("%s: src: %dx%d,format 0x%x, dest: %dx%d format 0x%x",
+         __func__, input->width(), input->height(), input->v4l2Fmt(),
+         output->width(), output->height(), output->v4l2Fmt());
+
+    // Y plane
+    libyuv::ScalePlane(static_cast<uint8_t*>(input->data()),
+                       input->stride(),
+                       input->width(),
+                       input->height(),
+                       static_cast<uint8_t*>(output->data()),
+                       output->stride(),
+                       output->width(),
+                       output->height(),
+                       libyuv::kFilterNone);
+
+    // UV plane
+    int inUVOffsetByte = input->stride() * input->height();
+    int outUVOffsetByte = output->stride() * output->height();
+    libyuv::ScalePlane_16(static_cast<uint16_t*>(input->data()) + inUVOffsetByte / sizeof(uint16_t),
+                          input->stride() / 2,
+                          input->width() / 2,
+                          input->height() / 2,
+                          static_cast<uint16_t*>(output->data()) + outUVOffsetByte / sizeof(uint16_t),
+                          output->stride() / 2,
+                          output->width() / 2,
+                          output->height() / 2,
+                          libyuv::kFilterNone);
+
+    return OK;
+}
+
+status_t ImageProcessorCore::rotateFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
+                                         std::shared_ptr<camera3::Camera3Buffer> &output,
+                                         int angle, std::vector<uint8_t> &rotateBuf)
+{
+    LOG2("%s: src: %dx%d,format 0x%x, dest: %dx%d format 0x%x",
+         __func__, input->width(), input->height(), input->v4l2Fmt(),
+         output->width(), output->height(), output->v4l2Fmt());
+
+    CheckError(output->width() != input->height() || output->height() != input->width(),
+          BAD_VALUE, "output resolution mis-match [%d x %d] -> [%d x %d]",
+          input->width(), input->height(), output->width(), output->height());
+    CheckError((angle != 90 && angle != 270), BAD_VALUE, "angle value:%d is wrong", angle);
+
+    const uint8_t* inBuffer = static_cast<uint8_t*>(input->data());
+    uint8_t* outBuffer = static_cast<uint8_t*>(output->data());
+    int outW = output->width();
+    int outH = output->height();
+    int outStride = output->stride();
+    int inW = input->width();
+    int inH = input->height();
+    int inStride = input->stride();
+    if (rotateBuf.size() < input->size()) {
+        rotateBuf.resize(input->size());
+    }
+
+    // TODO: find a way to rotate NV12 directly.
+    uint8_t* I420Buffer = rotateBuf.data();
+
+    if (mRotationMode[angle] == libyuv::RotationMode::kRotate0) {
+        libyuv::CopyPlane(inBuffer, inStride, outBuffer, outStride, inW, inH);
+        libyuv::CopyPlane(inBuffer + inH * inStride, inStride,
+                          outBuffer + outH * outStride, outStride,
+                          inW, inH / 2);
+    } else {
+        int ret = libyuv::NV12ToI420Rotate(
+                      inBuffer, inStride, inBuffer + inH * inStride, inStride,
+                      I420Buffer, outW,
+                      I420Buffer + outW * outH, outW / 2,
+                      I420Buffer + outW * outH * 5 / 4, outW / 2,
+                      inW, inH, mRotationMode[angle]);
+        CheckError((ret < 0), UNKNOWN_ERROR, "@%s, rotate fail [%d]!", __func__, ret);
+
+        ret = libyuv::I420ToNV12(I420Buffer, outW,
+                                 I420Buffer + outW * outH, outW / 2,
+                                 I420Buffer + outW * outH * 5 / 4, outW / 2,
+                                 outBuffer, outStride,
+                                 outBuffer +  outStride * outH, outStride,
+                                 outW, outH);
+        CheckError((ret < 0), UNKNOWN_ERROR, "@%s, convert fail [%d]!", __func__, ret);
+    }
+
+    return OK;
+}
+
+status_t ImageProcessorCore::convertFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
+                                          std::shared_ptr<camera3::Camera3Buffer> &output)
+{
+    LOG2("%s: src: %dx%d,format 0x%x, dest: %dx%d format 0x%x",
+         __func__, input->width(), input->height(), input->v4l2Fmt(),
+         output->width(), output->height(), output->v4l2Fmt());
+
+    switch (output->v4l2Fmt()) {
+        case V4L2_PIX_FMT_YVU420:
+            // XXX -> YV12
+            ImageConverter::convertBuftoYV12(input->v4l2Fmt(), input->width(),
+                                             input->height(), input->stride(),
+                                             output->stride(), input->data(), output->data());
+            break;
+        case V4L2_PIX_FMT_NV21:
+            // XXX -> NV21
+            ImageConverter::convertBuftoNV21(input->v4l2Fmt(), input->width(),
+                                             input->height(), input->stride(),
+                                             output->stride(), input->data(), output->data());
+            break;
+        case V4L2_PIX_FMT_YUYV:
+            // XXX -> YUYV
+            ImageConverter::convertBuftoYUYV(input->v4l2Fmt(), input->width(),
+                                             input->height(), input->stride(),
+                                             output->stride(), input->data(), output->data());
+            break;
+        default:
+            LOGE("%s: not implement for color conversion 0x%x -> 0x%x!",
+                 __func__, input->v4l2Fmt(), output->v4l2Fmt());
+            return UNKNOWN_ERROR;
+    }
+
+    return OK;
+}
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.h b/camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.h
new file mode 100644
index 000000000000..d874f371a696
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <unordered_map>
+#include "IImageProcessor.h"
+
+namespace icamera {
+
+class ImageProcessorCore : public IImageProcessor {
+public:
+    ImageProcessorCore();
+    ~ImageProcessorCore();
+
+    virtual status_t cropFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
+                               std::shared_ptr<camera3::Camera3Buffer> &output);
+    virtual status_t scaleFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
+                                std::shared_ptr<camera3::Camera3Buffer> &output);
+    virtual status_t rotateFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
+                                 std::shared_ptr<camera3::Camera3Buffer> &output,
+                                 int angle, std::vector<uint8_t> &rotateBuf);
+    virtual status_t convertFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
+                                  std::shared_ptr<camera3::Camera3Buffer> &output);
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(ImageProcessorCore);
+
+    std::unordered_map<int, libyuv::RotationMode> mRotationMode;
+};
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/iutils/CameraDump.cpp b/camera/hal/intel/ipu6/src/iutils/CameraDump.cpp
new file mode 100644
index 000000000000..58676a31f0a7
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/iutils/CameraDump.cpp
@@ -0,0 +1,409 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "CameraDump"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <math.h>
+
+#include "PlatformData.h"
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+#include "iutils/CameraDump.h"
+
+#include "3a/AiqResult.h"
+#include "3a/AiqResultStorage.h"
+
+using std::string;
+using std::shared_ptr;
+
+namespace icamera {
+
+int  gDumpType = 0;
+int  gDumpFormat = 0;
+uint32_t gDumpSkipNum = 0;
+uint32_t gDumpRangeMin = 0;
+uint32_t gDumpRangeMax = 0;
+int  gDumpFrequency = 1;
+char gDumpPath[50];
+bool gDumpRangeEnabled = false;
+static const char *ModuleName[] = {
+    "na",     // not available
+    "sensor",
+    "isys",
+    "psys",
+    "de-inter",
+    "swip-op"
+}; // map to the ModuleType
+
+static const char *StreamUsage[] = {
+    "preview",
+    "video",
+    "still",
+    "app",
+}; // map to the StreamUsage
+
+void CameraDump::setDumpLevel(void)
+{
+    const char* PROP_CAMERA_HAL_DUMP      = "cameraDump";
+    const char* PROP_CAMERA_HAL_DUMP_FORMAT = "cameraDumpFormat";
+    const char* PROP_CAMERA_HAL_DUMP_PATH = "cameraDumpPath";
+    const char* PROP_CAMERA_HAL_DUMP_SKIP_NUM = "cameraDumpSkipNum";
+    const char* PROP_CAMERA_HAL_DUMP_RANGE = "cameraDumpRange";
+    const char* PROP_CAMERA_HAL_DUMP_FREQUENCY = "cameraDumpFrequency";
+
+    // dump, it's used to dump images or some parameters to a file.
+    char *dumpType = getenv(PROP_CAMERA_HAL_DUMP);
+    if (dumpType) {
+        gDumpType = strtoul(dumpType, nullptr, 0);
+        LOGD("Dump type is 0x%x", gDumpType);
+    }
+
+    char *dumpFormat = getenv(PROP_CAMERA_HAL_DUMP_FORMAT);
+    if (dumpFormat) {
+        gDumpFormat = strtoul(dumpFormat, nullptr, 0);
+        LOGD("Dump format is 0x%x", gDumpFormat);
+    }
+
+    char* cameraDumpPath = getenv(PROP_CAMERA_HAL_DUMP_PATH);
+    snprintf(gDumpPath, sizeof(gDumpPath), "%s", "./");
+    if (cameraDumpPath) {
+        snprintf(gDumpPath, sizeof(gDumpPath), "%s", cameraDumpPath);
+    }
+
+    char* cameraDumpSkipNum = getenv(PROP_CAMERA_HAL_DUMP_SKIP_NUM);
+    if (cameraDumpSkipNum) {
+        gDumpSkipNum = strtoul(cameraDumpSkipNum, nullptr, 0);
+        LOGD("Dump skip num is %d", gDumpSkipNum);
+    }
+
+    char* cameraDumpRange = getenv(PROP_CAMERA_HAL_DUMP_RANGE);
+    if (cameraDumpRange) {
+        int sz = strlen(cameraDumpRange);
+        char dumpRange[sz + 1];
+        char *savePtr = nullptr, *tablePtr = nullptr;
+        MEMCPY_S(dumpRange, sz, cameraDumpRange, sz);
+        dumpRange[sz] = '\0';
+
+        tablePtr = strtok_r(dumpRange, ",~-", &savePtr);
+        if (tablePtr)
+            gDumpRangeMin = strtoul(tablePtr, nullptr, 0);
+
+        tablePtr = strtok_r(nullptr, ",~-", &savePtr);
+        if (tablePtr)
+            gDumpRangeMax = strtoul(tablePtr, nullptr, 0);
+
+        gDumpRangeEnabled = true;
+        LOGD("Dump range is %d-%d", gDumpRangeMin, gDumpRangeMax);
+    }
+
+    char* cameraDumpFrequency = getenv(PROP_CAMERA_HAL_DUMP_FREQUENCY);
+    if (cameraDumpFrequency) {
+        gDumpFrequency = strtoul(cameraDumpFrequency, nullptr, 0);
+        if (gDumpFrequency == 0)
+            gDumpFrequency = 1;
+        LOGD("Dump frequency is %d", gDumpFrequency);
+    }
+
+    // the PG dump is implemented in libiacss
+    if (gDumpType & DUMP_PSYS_PG) {
+        const char* PROP_CAMERA_CSS_DEBUG     = "camera_css_debug";
+        const char* PROP_CAMERA_CSS_DUMP_PATH = "camera_css_debug_dump_path";
+
+        char newCssDebugEnv[16];
+        char *cssDebugEnv = getenv(PROP_CAMERA_CSS_DEBUG);
+        int  cssDebugType = cssDebugEnv ? strtoul(cssDebugEnv, nullptr, 0) : 0;
+        // defined in ia_log.h IA_CSS_LOG_LEVEL_DUMP = 64
+        const int IA_CSS_LOG_LEVEL_DUMP = 64;
+        snprintf(newCssDebugEnv, sizeof(newCssDebugEnv), "%d",
+                (cssDebugType | IA_CSS_LOG_LEVEL_DUMP));
+        // enable dump env in libiacss
+        if (setenv(PROP_CAMERA_CSS_DEBUG, newCssDebugEnv, 1)) {
+            LOGE("setenv error for %s, current value:%d\n", PROP_CAMERA_CSS_DEBUG,
+                    cssDebugType);
+        }
+
+        const char* cssDumpPath = getenv(PROP_CAMERA_CSS_DUMP_PATH);
+        // set dump path to hal dump path
+        if (setenv(PROP_CAMERA_CSS_DUMP_PATH, gDumpPath, 1)) {
+            LOGE("setenv error for %s, current path:%s\n", PROP_CAMERA_CSS_DUMP_PATH,
+                    cssDumpPath ? cssDumpPath : "null");
+        }
+    }
+}
+
+bool CameraDump::isDumpTypeEnable(int dumpType)
+{
+    return gDumpType & dumpType;
+}
+
+bool CameraDump::isDumpFormatEnable(int dumpFormat)
+{
+    return gDumpFormat & dumpFormat;
+}
+
+const char* CameraDump::getDumpPath(void)
+{
+    return gDumpPath;
+}
+
+void CameraDump::writeData(const void* data, int size, const char* fileName) {
+    CheckError((data == nullptr || size == 0 || fileName == nullptr), VOID_VALUE, "Nothing needs to be dumped");
+
+    FILE *fp = fopen (fileName, "w+");
+    CheckError(fp == nullptr, VOID_VALUE, "open dump file %s failed", fileName);
+
+    LOG1("Write data to file:%s", fileName);
+    if ((fwrite(data, size, 1, fp)) != 1)
+        LOGW("Error or short count writing %d bytes to %s", size, fileName);
+    fclose (fp);
+}
+
+static string getNamePrefix(int cameraId, ModuleType_t type, Port port, int sUsage = 0)
+{
+    const char* dumpPath   = CameraDump::getDumpPath();
+    const char* sensorName = PlatformData::getSensorName(cameraId);
+    char prefix[MAX_NAME_LEN] = {'\0'};
+
+    if ((sUsage >= static_cast<int>(ARRAY_SIZE(StreamUsage))) || (sUsage < 0)) {
+        sUsage = 0;
+    }
+
+    if (icamera::CameraDump::isDumpFormatEnable(DUMP_FORMAT_IQSTUDIO)) {
+        snprintf(prefix, (MAX_NAME_LEN - 1), "%s/name#%s_%s", dumpPath, sensorName, StreamUsage[sUsage]);
+    } else {
+        if (port == INVALID_PORT) {
+            snprintf(prefix, (MAX_NAME_LEN - 1), "%s/cam%d_%s_%s_%s", dumpPath, cameraId,
+                 sensorName, ModuleName[type], StreamUsage[sUsage]);
+        } else {
+            snprintf(prefix, (MAX_NAME_LEN - 1), "%s/cam%d_%s_%s_port%d_%s", dumpPath, cameraId,
+                 sensorName, ModuleName[type], port, StreamUsage[sUsage]);
+        }
+    }
+
+    return string(prefix);
+}
+
+static string getAiqSettingAppendix(int cameraId, long sequence)
+{
+    char settingAppendix[MAX_NAME_LEN] = {'\0'};
+
+    AiqResult* aiqResults = const_cast<AiqResult*>(AiqResultStorage::getInstance(cameraId)->getAiqResult(sequence));
+    if (aiqResults == nullptr) {
+        LOGW("%s: no result for sequence %ld! use the latest instead", __func__, sequence);
+        aiqResults = const_cast<AiqResult*>(AiqResultStorage::getInstance(cameraId)->getAiqResult());
+        CheckError((aiqResults == nullptr), string(settingAppendix), "Cannot find available aiq result.");
+    }
+
+    ia_aiq_exposure_sensor_parameters *sensorExposure =
+                                       aiqResults->mAeResults.exposures[0].sensor_exposure;
+    ia_aiq_exposure_parameters *exposure =
+                                       aiqResults->mAeResults.exposures[0].exposure;
+
+    CheckError((sensorExposure == nullptr || exposure == nullptr), string(settingAppendix), "Cannot find aiq exposures");
+
+    double ag = sensorExposure->analog_gain_code_global;
+    double dg = sensorExposure->digital_gain_global;
+    float ispDg = 1.0f;
+
+    LOG2("%s: original sensorExposure AG: %f, DG: %f, exposure: AG: %f, DG: %f",
+           __func__, ag, dg, exposure->analog_gain, exposure->digital_gain);
+
+    if (icamera::CameraDump::isDumpFormatEnable(DUMP_FORMAT_IQSTUDIO)) {
+
+        // Convert AG and DG per sensor for IQ Studio input.
+        const int nSteps = 256;
+        const char* sensorName = PlatformData::getSensorName(cameraId);
+        ispDg = sensorExposure->digital_gain_global;
+
+        if (strstr(sensorName, "imx185") != nullptr) {
+            LOG2("%s: AG and DG conversion made for %s.", __func__, sensorName);
+            if ((double)sensorExposure->analog_gain_code_global * 0.3 > 24) {
+                ag = 16.0 * nSteps;
+                // real gain should be  pwd(10, (db value / 20))
+                dg = nSteps * pow(10, ((double)sensorExposure->analog_gain_code_global * 0.3 - 24) / 20);
+            } else {
+                ag = nSteps * pow(10, ((double)sensorExposure->analog_gain_code_global * 0.3) / 20);
+                dg = 1.0 * nSteps;
+            }
+            LOG2("%s: converted AG: %f, DG: %f ispDG: %f for %s", __func__, ag, dg, ispDg, sensorName);
+        } else if (strstr(sensorName, "imx274") != nullptr) {
+            ag = nSteps * exposure->analog_gain;
+            dg = nSteps * PlatformData::getSensorDigitalGain(cameraId, exposure->digital_gain);
+            ispDg = nSteps * PlatformData::getIspDigitalGain(cameraId, exposure->digital_gain);
+            LOG2("%s: converted AG: %f, DG: %f ispDG: %f for %s", __func__, ag, dg, ispDg, sensorName);
+        }
+
+        if (aiqResults->mAeResults.num_exposures == 2) {
+            snprintf(settingAppendix, (MAX_NAME_LEN - 1), "~ag#%.0f~dg#%.0f~cmnt#ispdg_%.0f~exp#%d,%d",
+                ag, dg, ispDg, exposure->exposure_time_us,
+                aiqResults->mAeResults.exposures[1].exposure->exposure_time_us);
+        } else {
+            snprintf(settingAppendix, (MAX_NAME_LEN - 1), "~ag#%.0f~dg#%.0f~cmnt#ispdg_%.0f~exp#%d",
+                ag, dg, ispDg, exposure->exposure_time_us);
+        }
+    } else {
+
+        if (PlatformData::isUsingIspDigitalGain(cameraId)) {
+            dg = PlatformData::getSensorDigitalGain(cameraId, exposure->digital_gain);
+            ispDg = PlatformData::getIspDigitalGain(cameraId, exposure->digital_gain);
+        }
+
+        if (aiqResults->mAeResults.num_exposures == 2) {
+            snprintf(settingAppendix, (MAX_NAME_LEN - 1), "_ag#%.0f_dg#%.0f_ispdg#%.3f_exp#%d,%d",
+                ag, dg, ispDg, exposure->exposure_time_us,
+                aiqResults->mAeResults.exposures[1].exposure->exposure_time_us);
+        } else {
+            snprintf(settingAppendix, (MAX_NAME_LEN - 1), "_ag#%.0f_dg#%.0f_ispdg#%.3f_exp#%d",
+                ag, dg, ispDg, exposure->exposure_time_us);
+        }
+    }
+
+    return string(settingAppendix);
+}
+
+static string formatFrameFileName(const char *prefix,
+                                  const char *appendix,
+                                  const char *suffix,
+                                  long sequence,
+                                  int width, int height)
+{
+    char fileName[MAX_NAME_LEN] = {'\0'};
+
+    if (icamera::CameraDump::isDumpFormatEnable(DUMP_FORMAT_IQSTUDIO)) {
+
+        if (strstr(suffix, "GRBG") || strstr(suffix, "RGGB")
+            || strstr(suffix, "GBRG") || strstr(suffix, "BGGR")) {
+            snprintf(fileName, (MAX_NAME_LEN - 1), "%s~rev#v1~type#studio%s~msid#4442075~rep#%ld.raw",
+                prefix, appendix, sequence);
+        } else {
+            snprintf(fileName, (MAX_NAME_LEN - 1), "%s~rev#v1~type#studio%s~msid#4442075~rep#%ld.%s",
+                prefix, appendix, sequence, suffix);
+        }
+    } else {
+
+        snprintf(fileName, (MAX_NAME_LEN - 1), "%s_frame_%04ld_%dx%d%s.%s",
+             prefix, sequence, width, height, appendix, suffix);
+    }
+    return string(fileName);
+}
+
+static string formatBinFileName(int cameraId, const char *prefix, BinParam_t *binParam)
+{
+    char fileName[MAX_NAME_LEN] = {'\0'};
+    string appendix;
+
+    switch(binParam->bType) {
+    case BIN_TYPE_GENERAL:
+        snprintf(fileName, (MAX_NAME_LEN - 1), "%s_bin_%04ld_%s.bin",
+                 prefix, binParam->sequence, binParam->gParam.appendix);
+        break;
+    case BIN_TYPE_STATISTIC:
+        snprintf(fileName, (MAX_NAME_LEN - 1),
+                 "%s_stat_%04ld_grid%dx%d_%s.bin",
+                 prefix, binParam->sequence,
+                 binParam->sParam.gridWidth, binParam->sParam.gridHeight,
+                 binParam->sParam.appendix);
+        break;
+    case BIN_TYPE_SENSOR_METADATA:
+        snprintf(fileName, (MAX_NAME_LEN - 1),
+                 "%s_metadata_%04ld_%dx%d_plane%d.%s",
+                 prefix, binParam->sequence,
+                 binParam->mParam.width, binParam->mParam.height,
+                 binParam->mParam.planeIdx,
+                 CameraUtils::format2string(binParam->mParam.metaFormat).c_str());
+        break;
+    case BIN_TYPE_BUFFER:
+        appendix = getAiqSettingAppendix(cameraId, binParam->sequence);
+        return formatFrameFileName(prefix, appendix.c_str(),
+                                   CameraUtils::format2string(binParam->bParam.format).c_str(),
+                                   binParam->sequence,
+                                   binParam->bParam.width, binParam->bParam.height);
+
+    default:
+        LOGW("Unknow binary type:%d", binParam->bType);
+        break;
+    }
+
+    return string(fileName);
+}
+
+void CameraDump::dumpImage(int cameraId, const shared_ptr<CameraBuffer> &camBuffer,
+                           ModuleType_t type, Port port)
+{
+    CheckError(camBuffer == nullptr, VOID_VALUE, "invalid param");
+
+    if (camBuffer->getSequence() < gDumpSkipNum) return;
+
+    if (gDumpRangeEnabled &&
+        (camBuffer->getSequence() < gDumpRangeMin
+         || camBuffer->getSequence() > gDumpRangeMax)) {
+        return;
+    }
+
+    if (camBuffer->getSequence() % gDumpFrequency != 0) return;
+
+    string prefix   = getNamePrefix(cameraId, type, port, camBuffer->getUserBuffer()->s.usage);
+    string appendix = getAiqSettingAppendix(cameraId, camBuffer->getSequence());
+
+    string fileName = formatFrameFileName(prefix.c_str(), appendix.c_str(),
+                                          CameraUtils::format2string(camBuffer->getFormat()).c_str(),
+                                          camBuffer->getSequence(),
+                                          camBuffer->getWidth(), camBuffer->getHeight());
+
+    int fd = camBuffer->getFd();
+    int bufferSize = camBuffer->getBufferSize();
+    int memoryType = camBuffer->getMemory();
+    void* pBuf = (memoryType == V4L2_MEMORY_DMABUF)
+                    ? CameraBuffer::mapDmaBufferAddr(fd, bufferSize)
+                    : camBuffer->getBufferAddr();
+    LOGD("@%s, fd:%d, buffersize:%d, buf:%p, memoryType:%d, fileName:%s",
+            __func__, fd, bufferSize, pBuf, memoryType, fileName.c_str());
+    writeData(pBuf, bufferSize, fileName.c_str());
+    if (memoryType == V4L2_MEMORY_DMABUF) {
+        CameraBuffer::unmapDmaBufferAddr(pBuf, bufferSize);
+    }
+}
+
+void CameraDump::dumpBinary(int cameraId, const void *data, int size, BinParam_t *binParam)
+{
+    CheckError(binParam == nullptr, VOID_VALUE, "invalid param");
+
+    if (binParam->sequence < gDumpSkipNum) return;
+
+    if (gDumpRangeEnabled &&
+        (binParam->sequence < gDumpRangeMin
+         || binParam->sequence > gDumpRangeMax)) {
+        return;
+    }
+
+    if (binParam->sequence % gDumpFrequency != 0) return;
+
+    string prefix   = getNamePrefix(cameraId, binParam->mType, INVALID_PORT, binParam->sUsage);
+    string fileName = formatBinFileName(cameraId, prefix.c_str(), binParam);
+    LOG2("@%s, fileName:%s", __func__, fileName.c_str());
+    writeData(data, size, fileName.c_str());
+}
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/iutils/CameraDump.h b/camera/hal/intel/ipu6/src/iutils/CameraDump.h
new file mode 100644
index 000000000000..3b51c84468b9
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/iutils/CameraDump.h
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <string.h>
+#include <vector>
+#include <string>
+#include <linux/v4l2-subdev.h>
+
+#include "CameraTypes.h"
+#include "CameraBuffer.h"
+
+namespace icamera {
+
+/**
+ * global dump level
+ * This global variable is set from system properties
+ * It is used to control the type of frame dump
+ */
+extern int gDumpType;
+extern char gDumpPath[50];
+
+// Dump bit mask definition
+enum {
+    // ISYS Buffer dump (bit[0-3])
+    DUMP_ISYS_BUFFER =          1 << 0,
+    // Reserve bit[1-3] for detailed buffer dump control
+
+    DUMP_JPEG_BUFFER =          1 << 3, // JPEG buffer
+    // ISYS PG/PAL/Stats dump (bit[4-7])
+    DUMP_ISYS_PAL =             1 << 4, // ISP param binary
+    DUMP_ISYS_PG =              1 << 5, // ISYS whole PG dump assisted by libiacss
+    DUMP_ISYS_ENCODED_STAT =    1 << 6, // p2p encoded statistics
+    DUMP_ISYS_AIQ_STAT =        1 << 7, // rgbs_grid format stats for AIQ use
+
+    // PSYS dump (bit[8-11])
+    DUMP_PSYS_OUTPUT_BUFFER =   1 << 8,
+    DUMP_PSYS_INTERM_BUFFER =   1 << 9, // dump Psys intermediate buffers like PreGDC output
+    // Reserve bit[10-11] for detailed buffer dump control
+
+    DUMP_AIQ_DVS_RESULT =       1 << 10, // dump dvs result
+
+    // PSYS PG/PAL/Stats dump (bit[12-15])
+    DUMP_PSYS_PAL =             1 << 12, // ISP param binary
+    DUMP_PSYS_PG =              1 << 13, // PSYS whole PG dump assisted by libiacss
+    DUMP_PSYS_AIQ_STAT =        1 << 14, // rgbs_grid format stats for AIQ use
+    DUMP_PSYS_DECODED_STAT =    1 << 15, // p2p decoded statistics
+
+    // Other dump
+    DUMP_MIPI_BUFFER =          1 << 16, // e.g. export cameraDump=0x10000
+    DUMP_UT_BUFFER =            1 << 17, // e.g. export cameraDump=0x20000
+    DUMP_EMBEDDED_METADATA =    1 << 18,
+    DUMP_DEINTERLACED_BUFFER =  1 << 19, // 0x80000  Decimal val 524288
+    DUMP_SW_IMG_PROC_OUTPUT =   1 << 20, // 0x100000 Decimal val 1048576
+
+    // Pipe executors' dump
+    DUMP_EXECUTOR_OUTPUT =   1 << 21, // 0x200000 Decimal val 2097152
+
+    // LTM output's dump
+    DUMP_LTM_OUTPUT = 1 << 22, // 0x400000 Decimal val 4194304
+
+    DUMP_AAL_OUTPUT = 1 << 23, // 0x800000 Decimal val 8388608
+    DUMP_AAL_INPUT = 1 << 24, // 0x1000000 Decimal val 16777216
+};
+
+enum {
+    DUMP_FORMAT_NORMAL =          1 << 0,  // Normal format
+    DUMP_FORMAT_IQSTUDIO =        1 << 1,  // IQStudio format
+};
+
+const int MAX_NAME_LEN = 256;
+
+typedef enum {
+    M_NA,
+    M_SENSOR, // MIPI frame dump
+    M_ISYS,   // ISYS param, payload, frame dump
+    M_PSYS,   // PSYS param, payload, frame dump
+    M_DEINTR, // De-interlaced frame dump
+    M_SWIPOP, // Sw Image processor frame dump
+} ModuleType_t;
+
+typedef enum {
+    BIN_TYPE_GENERAL,
+    BIN_TYPE_STATISTIC,
+    BIN_TYPE_SENSOR_METADATA,
+    BIN_TYPE_BUFFER,
+} BinType_t;
+
+typedef struct {
+    const char* appendix;
+} GeneralParam_t;
+
+typedef struct {
+    int gridWidth;
+    int gridHeight;
+    const char* appendix;
+} StatParam_t;
+
+typedef struct {
+    int width;
+    int height;
+    int planeIdx;
+    int metaFormat;
+} SensorMetadataParam_t;
+
+typedef struct {
+    int width;
+    int height;
+    int format;
+} BufferParam_t;
+
+typedef struct {
+    BinType_t       bType;
+    ModuleType_t    mType;
+    long sequence;
+    union {
+        GeneralParam_t        gParam;
+        StatParam_t           sParam;
+        SensorMetadataParam_t mParam;
+        BufferParam_t         bParam;
+    };
+    int sUsage;
+} BinParam_t;
+
+/**
+ * Dump files with formated file name, put under getDumpPath()
+ * Supported dump type:
+ *   Image(RAW/YUV/RGB)
+ *   PAL bin
+ *   Decoded statistics
+ *   Sensor Metadata
+ * File name format example:
+ * Path/cameraId_sensorName_isys(psys)_
+ *      frame(pal/stats/)_sequence_resolution_appendix.suffix
+ */
+namespace CameraDump {
+    /**
+     * File dump control functions.
+     */
+    void setDumpLevel(void);
+    bool isDumpTypeEnable(int dumpType);
+    bool isDumpFormatEnable(int dumpFormat);
+    void writeData(const void* data, int size, const char* fileName);
+    const char* getDumpPath(void);
+    /**
+     * Dump image according to CameraBuffer properties
+     */
+    void dumpImage(int cameraId, const std::shared_ptr<CameraBuffer> &camBuffer,
+                   ModuleType_t mType = M_NA, Port port = INVALID_PORT);
+    /**
+     * Dump any buffer to binary file
+     */
+    void dumpBinary(int cameraId, const void *data, int size, BinParam_t *binParam);
+}
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/iutils/CameraLog.cpp b/camera/hal/intel/ipu6/src/iutils/CameraLog.cpp
new file mode 100644
index 000000000000..01f7d29c3e11
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/iutils/CameraLog.cpp
@@ -0,0 +1,270 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "CameraLog"
+
+#include <sys/time.h>
+#include <time.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "iutils/Utils.h"
+
+#include "CameraLog.h"
+#include "Trace.h"
+
+namespace icamera {
+int gLogLevel = 0;
+char *gLogModules = nullptr;
+int gPerfLevel = 0;
+int gEnforceDvs = 0;
+int gSlowlyRunRatio = 0;
+bool gIsDumpMediaTopo = false;
+bool gIsDumpMediaInfo = false;
+
+static void getLogTime(char *timeBuf, int bufLen)
+{
+    // The format of time is: 01-22 15:24:53.071
+    struct timeval tv;
+    gettimeofday(&tv, nullptr);
+    time_t nowtime = tv.tv_sec;
+    struct tm* nowtm = localtime(&nowtime);
+    if (nowtm) { // If nowtm is nullptr, simply print nothing for time info
+        char tmbuf[bufLen];
+        CLEAR(tmbuf);
+        strftime(tmbuf, bufLen, "%m-%d %H:%M:%S", nowtm);
+        snprintf(timeBuf, bufLen, "%s.%03ld", tmbuf, tv.tv_usec/1000);
+    }
+}
+
+__attribute__((__format__ (__printf__, 3, 0)))
+static void printLog(const char *module, const char *level, const char *fmt, va_list ap)
+{
+    // Add time into beginning of the log.
+    const int BUF_LEN = 64;
+    char timeBuf[BUF_LEN] = {'\0'};
+
+    getLogTime(timeBuf, BUF_LEN);
+
+    fprintf(stdout, "%s: [%s]: CamHAL_%s:", timeBuf, level, module);
+    vfprintf(stdout, fmt, ap);
+    fprintf(stdout, "\n");
+}
+
+namespace Log {
+
+void setDebugLevel(void)
+{
+    const char* PROP_CAMERA_HAL_DEBUG = "cameraDebug";
+    const char* PROP_CAMERA_HAL_MODULES = "cameraModules";
+    const char* PROP_CAMERA_HAL_PERF  = "cameraPerf";
+    const char* PROP_CAMERA_HAL_DVS = "cameraDvs";
+    const char* PROP_CAMERA_RUN_RATIO = "cameraRunRatio";
+
+    // debug
+    char *dbgLevel = getenv(PROP_CAMERA_HAL_DEBUG);
+    if (dbgLevel) {
+        gLogLevel = strtoul(dbgLevel, nullptr, 0);
+        LOG1("Debug level is 0x%x", gLogLevel);
+
+        // to enable both LOG1 and LOG2 traces
+        if (gLogLevel & CAMERA_DEBUG_LOG_LEVEL2)
+            gLogLevel |= CAMERA_DEBUG_LOG_LEVEL1;
+    }
+
+    char *slowlyRunRatio = getenv(PROP_CAMERA_RUN_RATIO);
+    if (slowlyRunRatio) {
+        gSlowlyRunRatio = strtoul(slowlyRunRatio, nullptr, 0);
+        LOG1("Slow run ratio is 0x%x", gSlowlyRunRatio);
+    }
+
+    //modules
+    gLogModules = getenv(PROP_CAMERA_HAL_MODULES);
+
+    // performance
+    char *perfLevel = getenv(PROP_CAMERA_HAL_PERF);
+    if (perfLevel) {
+        gPerfLevel = strtoul(perfLevel, nullptr, 0);
+        LOGD("Performance level is 0x%x", gPerfLevel);
+
+        // bitmask of tracing categories
+        if (gPerfLevel & CAMERA_DEBUG_LOG_PERF_TRACES) {
+            LOGD("Perf KPI start/end trace is not yet supported");
+        }
+        if (gPerfLevel & CAMERA_DEBUG_LOG_PERF_TRACES_BREAKDOWN) {
+            LOGD("Perf KPI breakdown trace is not yet supported");
+        }
+        if (gPerfLevel & CAMERA_DEBUG_LOG_PERF_IOCTL_BREAKDOWN) {
+            LOGD("Perf IOCTL breakdown trace is not yet supported");
+        }
+        if (gPerfLevel & CAMERA_DEBUG_LOG_PERF_MEMORY) {
+            LOGD("Perf memory breakdown trace is not yet supported");
+        }
+        if (gPerfLevel & CAMERA_DEBUG_LOG_MEDIA_TOPO_LEVEL) {
+            gIsDumpMediaTopo = true;
+        }
+        if (gPerfLevel & CAMERA_DEBUG_LOG_MEDIA_CONTROLLER_LEVEL) {
+            gIsDumpMediaInfo = true;
+        }
+        ScopedAtrace::setTraceLevel(gPerfLevel);
+    }
+
+    // Enforce DVS for debugging
+    char *dvs = getenv(PROP_CAMERA_HAL_DVS);
+    if (dvs) {
+        gEnforceDvs = strtoul(dvs, nullptr, 0);
+        LOGD("EnforceDvs level is 0x%x", gEnforceDvs);
+    }
+}
+
+bool isDebugLevelEnable(int level)
+{
+    return gLogLevel & level;
+}
+
+bool isModulePrintAble(const char *module)
+{
+    if (gLogModules == nullptr) {
+        return true;
+    } else if (strstr(gLogModules, module) != nullptr) {
+        return true;
+    } else {
+        return false;
+    }
+}
+
+bool isDumpMediaTopo(void)
+{
+    return gIsDumpMediaTopo;
+}
+
+bool isDumpMediaInfo(void)
+{
+    return gIsDumpMediaInfo;
+}
+
+__attribute__((__format__ (__printf__, 4, 0)))
+void print_log(bool enable, const char *module, const int level, const char *format, ...)
+{
+    if (!enable && (level != CAMERA_DEBUG_LOG_ERR))
+        return;
+
+    if (!isModulePrintAble(module)) {
+        return;
+    }
+
+    const char *levelStr = nullptr;
+    va_list arg;
+    va_start(arg, format);
+
+    switch(level) {
+        case CAMERA_DEBUG_LOG_LEVEL1:
+            levelStr = "LV1";
+        break;
+        case CAMERA_DEBUG_LOG_LEVEL2:
+            levelStr = "LV2";
+        break;
+        case CAMERA_DEBUG_LOG_REQ_STATE:
+            levelStr = "REQ";
+        break;
+        case CAMERA_DEBUG_LOG_AIQ:
+            levelStr = "AIQ";
+        break;
+        case CAMERA_DEBUG_LOG_XML:
+            levelStr = "XML";
+        break;
+        case CAMERA_DEBUG_LOG_DBG:
+            levelStr = "DBG";
+        break;
+        case CAMERA_DEBUG_LOG_INFO:
+            levelStr = "INF";
+        break;
+        case CAMERA_DEBUG_LOG_ERR:
+            levelStr = "ERR";
+        break;
+        case CAMERA_DEBUG_LOG_WARNING:
+            levelStr = "WAR";
+        break;
+        case CAMERA_DEBUG_LOG_VERBOSE:
+            levelStr = "VER";
+        break;
+        case CAMERA_DEBUG_LOG_VC_SYNC:
+            levelStr = "VCSYNC";
+        break;
+        case CAMERA_DEBUG_LOG_GRAPH:
+            levelStr = "GRAPH";
+        break;
+        default:
+            levelStr = "UKN";
+        break;
+    }
+
+    printLog(module, levelStr, format, arg);
+
+    va_end(arg);
+}
+
+__attribute__((__format__ (__printf__, 1, 0)))
+void ccaPrintError(const char *fmt, va_list ap)
+{
+    printLog("CCA_DEBUG", "ERROR", fmt, ap);
+}
+
+__attribute__((__format__ (__printf__, 1, 0)))
+void ccaPrintInfo(const char *fmt, va_list ap)
+{
+    if (gLogLevel & CAMERA_DEBUG_LOG_AIQ) {
+        printLog("CCA_DEBUG", "INFO", fmt, ap);
+    }
+}
+
+__attribute__((__format__ (__printf__, 1, 0)))
+void ccaPrintDebug(const char *fmt, va_list ap)
+{
+    if (gLogLevel & CAMERA_DEBUG_LOG_AIQ) {
+        printLog("CCA_DEBUG", "DBG", fmt, ap);
+    }
+}
+
+} // namespace Log
+
+#ifdef HAVE_ANDROID_OS
+
+void __camera_hal_log(bool condition, int prio, const char *tag,
+                      const char *fmt, ...)
+{
+    if (condition) {
+        va_list ap;
+        va_start(ap, fmt);
+        if (gLogLevel & CAMERA_DEBUG_LOG_PERSISTENT) {
+            int errnoCopy;
+            unsigned int maxTries = 20;
+            do {
+                errno = 0;
+                __android_log_vprint(prio, tag, fmt, ap);
+                errnoCopy = errno;
+                if (errnoCopy == EAGAIN)
+                    usleep(2000); /* sleep 2ms */
+            } while(errnoCopy == EAGAIN && maxTries--);
+        } else {
+            __android_log_vprint(prio, tag, fmt, ap);
+        }
+    }
+}
+
+#endif //HAVE_ANDROID_OS
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/iutils/CameraLog.h b/camera/hal/intel/ipu6/src/iutils/CameraLog.h
new file mode 100644
index 000000000000..d45cac77f093
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/iutils/CameraLog.h
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2015-2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <stdarg.h>
+
+#include "utils/ScopedAtrace.h"
+#ifdef HAVE_ANDROID_OS
+#include <log/log.h>
+#endif
+
+namespace icamera {
+/**
+ * global log level
+ * This global variable is set from system properties
+ * It is used to control the level of verbosity of the traces in logcat
+ * It is also used to store the status of certain RD features
+ */
+extern int gLogLevel;
+extern int gPerfLevel;
+extern int gEnforceDvs;
+extern int gSlowlyRunRatio;
+
+/**
+ * LOG levels
+ *
+ * LEVEL 1 is used to track events in the HAL that are relevant during
+ * the operation of the camera, but are not happening on a per frame basis.
+ * this ensures that the level of logging is not too verbose
+ *
+ * LEVEL 2 is used to track information on a per request basis
+ *
+ * REQ_STATE is used to track the state of each request. By state we mean a one
+ * of the following request properties:
+ *  - metadata result
+ *  - buffer
+ *  - shutter
+ *  - error
+ *
+ * PERF TRACES enable only traces that provide performance metrics on the opera
+ * tion of the HAL
+ *
+ * PERF TRACES BREAKDOWN provides further level of detail on the performance
+ * metrics
+ */
+enum  {
+    /* verbosity level of general traces */
+    CAMERA_DEBUG_LOG_LEVEL1 = 1,
+    CAMERA_DEBUG_LOG_LEVEL2 = 1 << 1,
+
+    /* Bitmask to enable a concrete set of traces */
+    CAMERA_DEBUG_LOG_REQ_STATE = 1 << 2,
+    CAMERA_DEBUG_LOG_AIQ = 1 << 3,
+    CAMERA_DEBUG_LOG_XML = 1 << 4,
+    CAMERA_DEBUG_LOG_VC_SYNC = 1 << 5,
+    CAMERA_DEBUG_LOG_FPS = 1 << 6,
+    CAMERA_DEBUG_LOG_KERNEL_TOGGLE = 1 << 8,
+    CAMERA_DEBUG_LOG_SANDBOXING = 1 << 9,
+
+    /* Make logs persistent, retrying if logcat is busy */
+    CAMERA_DEBUG_LOG_PERSISTENT = 1 << 12, /* 4096 */
+
+    /* reserved for any components */
+    CAMERA_DEBUG_LOG_GRAPH = 1 << 13,
+
+    CAMERA_DEBUG_LOG_DBG = 1 <<16,
+    CAMERA_DEBUG_LOG_INFO = 1 <<17,
+    CAMERA_DEBUG_LOG_ERR = 1 <<18,
+    CAMERA_DEBUG_LOG_WARNING = 1 <<19,
+    CAMERA_DEBUG_LOG_VERBOSE = 1 <<20
+};
+
+enum  {
+    /* Emit well-formed performance traces */
+    CAMERA_DEBUG_LOG_PERF_TRACES = 1,
+
+    /* Print out detailed timing analysis */
+    CAMERA_DEBUG_LOG_PERF_TRACES_BREAKDOWN = 2,
+
+    /* Print out detailed timing analysis for IOCTL */
+    CAMERA_DEBUG_LOG_PERF_IOCTL_BREAKDOWN = 1<<2,
+
+    /* Print out detailed memory information analysis for IOCTL */
+    CAMERA_DEBUG_LOG_PERF_MEMORY = 1<<3,
+
+    /*enable camera atrace level 0 for camtune-record*/
+    CAMERA_DEBUG_LOG_ATRACE_LEVEL0 = 1<<4,
+
+    /*enable media topology dump*/
+    CAMERA_DEBUG_LOG_MEDIA_TOPO_LEVEL = 1<<5,
+
+    /*enable media controller info dump*/
+    CAMERA_DEBUG_LOG_MEDIA_CONTROLLER_LEVEL = 1<<6,
+
+    /*enable camera imaging atrace level 1 for camtune-record*/
+    CAMERA_DEBUG_LOG_ATRACE_LEVEL1 = 1<<7,
+};
+
+enum {
+    CAMERA_POWERBREAKDOWN_DISABLE_PREVIEW = 1<<0,
+    CAMERA_POWERBREAKDOWN_DISABLE_FDFR = 1<<1,
+    CAMERA_POWERBREAKDOWN_DISABLE_3A = 1<<2,
+};
+
+namespace Log {
+void setDebugLevel(void);
+void print_log(bool enable, const char *module, const int level, const char *format, ...);
+bool isDebugLevelEnable(int level);
+bool isModulePrintAble(const char *module);
+bool isDumpMediaTopo(void);
+bool isDumpMediaInfo(void);
+void ccaPrintError(const char *fmt, va_list ap);
+void ccaPrintInfo(const char *fmt, va_list ap);
+void ccaPrintDebug(const char *fmt, va_list ap);
+};
+
+#define SLOWLY_MULTIPLIER (gSlowlyRunRatio ? gSlowlyRunRatio : 1)
+
+#ifdef HAVE_LINUX_OS //Linux OS
+#define LOG1(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_LEVEL1, LOG_TAG, CAMERA_DEBUG_LOG_LEVEL1, format, ##args)
+#define LOG2(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_LEVEL2, LOG_TAG, CAMERA_DEBUG_LOG_LEVEL2, format, ##args)
+#define LOGR(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_REQ_STATE, LOG_TAG, CAMERA_DEBUG_LOG_REQ_STATE, format, ##args)
+#define LOG3A(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_AIQ, LOG_TAG, CAMERA_DEBUG_LOG_AIQ, format, ##args)
+#define LOGXML(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_XML, LOG_TAG, CAMERA_DEBUG_LOG_XML, format, ##args)
+#define LOGVCSYNC(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_VC_SYNC, LOG_TAG, CAMERA_DEBUG_LOG_VC_SYNC, format, ##args)
+#define LOGG(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_GRAPH, LOG_TAG, CAMERA_DEBUG_LOG_GRAPH, format, ##args)
+#define LOGIPC(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_SANDBOXING, LOG_TAG, CAMERA_DEBUG_LOG_SANDBOXING, format, ##args)
+
+#define LOGD(format, args...) Log::print_log(true, LOG_TAG, CAMERA_DEBUG_LOG_DBG, format, ##args)
+#define LOGI(format, args...) Log::print_log(true, LOG_TAG, CAMERA_DEBUG_LOG_INFO, format, ##args)
+#define LOGE(format, args...) Log::print_log(true, LOG_TAG, CAMERA_DEBUG_LOG_ERR, format, ##args)
+#define LOGW(format, args...) Log::print_log(true, LOG_TAG, CAMERA_DEBUG_LOG_WARNING, format, ##args)
+#define LOGV(format, args...) Log::print_log(true, LOG_TAG, CAMERA_DEBUG_LOG_VERBOSE, format, ##args)
+
+#define ALOGE LOGE
+#define ALOGD LOGD
+#define ALOGI LOGI
+#define ALOGW LOGW
+#define ALOGV LOGV
+#define ALOGW_IF
+#define LOG_ALWAYS_FATAL_IF
+#define LOG_FATAL_IF
+
+#else //Android OS
+
+void __camera_hal_log(bool condition, int prio, const char *tag, const char *fmt, ...);
+
+#define LOG1(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_LEVEL1, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
+#define LOG2(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_LEVEL2, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
+#define LOGR(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_REQ_STATE, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
+#define LOG3A(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_AIQ, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
+#define LOGXML(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_XML, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
+#define LOGVCSYNC(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_VC_SYNC, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
+#define LOGG(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_GRAPH, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
+#define LOGIPC(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_SANDBOXING, LOG_TAG, CAMERA_DEBUG_LOG_SANDBOXING, format, ##args)
+
+#define LOGE(...) __camera_hal_log(true, ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
+#define LOGI(...) __camera_hal_log(true, ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
+#define LOGD(...) __camera_hal_log(true, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
+#define LOGW(...) __camera_hal_log(true, ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
+#define LOGV(...) __camera_hal_log(true, ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)
+
+#endif
+#define HAL_TRACE_NAME(level, name) ScopedTrace ___tracer(level, name )
+#define HAL_TRACE_CALL(level) HAL_TRACE_NAME(level, __PRETTY_FUNCTION__)
+
+class ScopedTrace {
+    public:
+        inline ScopedTrace(int level, const char* name) :
+            mLevel(level),
+            mName(name) {
+                if ((mLevel <= gLogLevel) && !(gLogLevel & CAMERA_DEBUG_LOG_VC_SYNC))
+                    LOGD("ENTER-%s",name);
+            }
+
+        inline ~ScopedTrace() {
+                if ((mLevel <= gLogLevel)  && !(gLogLevel & CAMERA_DEBUG_LOG_VC_SYNC))
+                    LOGD("EXIT-%s", mName);
+        }
+
+    private:
+        int mLevel;
+        const char* mName;
+};
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/iutils/Errors.h b/camera/hal/intel/ipu6/src/iutils/Errors.h
new file mode 100644
index 000000000000..8ef824f04fcc
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/iutils/Errors.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ * Copyright (C) 2015-2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <sys/types.h>
+#include <errno.h>
+
+namespace icamera {
+
+typedef int         status_t;
+
+/*
+ * Error codes.
+ * All error codes are negative values.
+ */
+
+enum {
+    OK                  = 0,    // Everything's swell.
+
+    UNKNOWN_ERROR       = (-2147483647-1), // INT32_MIN value
+
+    NO_MEMORY           = -ENOMEM,
+    INVALID_OPERATION   = -ENOSYS,
+    BAD_VALUE           = -EINVAL,
+    BAD_TYPE            = (UNKNOWN_ERROR + 1),
+    NAME_NOT_FOUND      = -ENOENT,
+    PERMISSION_DENIED   = -EPERM,
+    NO_INIT             = -ENODEV,
+    ALREADY_EXISTS      = -EEXIST,
+    DEAD_OBJECT         = -EPIPE,
+    FAILED_TRANSACTION  = (UNKNOWN_ERROR + 2),
+    JPARKS_BROKE_IT     = -EPIPE,
+#if !defined(HAVE_MS_C_RUNTIME)
+    BAD_INDEX           = -EOVERFLOW,
+    NOT_ENOUGH_DATA     = -ENODATA,
+    WOULD_BLOCK         = -EWOULDBLOCK,
+    TIMED_OUT           = -ETIMEDOUT,
+    UNKNOWN_TRANSACTION = -EBADMSG,
+#else
+    BAD_INDEX           = -E2BIG,
+    NOT_ENOUGH_DATA     = (UNKNOWN_ERROR + 3),
+    WOULD_BLOCK         = (UNKNOWN_ERROR + 4),
+    TIMED_OUT           = (UNKNOWN_ERROR + 5),
+    UNKNOWN_TRANSACTION = (UNKNOWN_ERROR + 6),
+#endif
+    FDS_NOT_ALLOWED     = (UNKNOWN_ERROR + 7),
+    NO_ENTRY            = (UNKNOWN_ERROR + 8),
+};
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/iutils/RWLock.h b/camera/hal/intel/ipu6/src/iutils/RWLock.h
new file mode 100644
index 000000000000..2082811ec9be
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/iutils/RWLock.h
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ * Copyright (C) 2015-2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "Errors.h"
+
+#if defined(HAVE_PTHREADS)
+#include <pthread.h>
+#endif
+
+// ---------------------------------------------------------------------------
+namespace icamera {
+// ---------------------------------------------------------------------------
+
+#if defined(HAVE_PTHREADS)
+
+/*
+ * Simple mutex class.  The implementation is system-dependent.
+ *
+ * The mutex must be unlocked by the thread that locked it.  They are not
+ * recursive, i.e. the same thread can't lock it multiple times.
+ */
+class RWLock {
+public:
+                RWLock() {};
+                ~RWLock();
+
+    status_t    readLock();
+    status_t    tryReadLock();
+    status_t    writeLock();
+    status_t    tryWriteLock();
+    void        unlock();
+
+    class AutoRLock {
+    public:
+        inline AutoRLock(RWLock& rwlock) : mLock(rwlock)  { mLock.readLock(); }
+        inline ~AutoRLock() { mLock.unlock(); }
+    private:
+        RWLock& mLock;
+    };
+
+    class AutoWLock {
+    public:
+        inline AutoWLock(RWLock& rwlock) : mLock(rwlock)  { mLock.writeLock(); }
+        inline ~AutoWLock() { mLock.unlock(); }
+    private:
+        RWLock& mLock;
+    };
+
+private:
+    // A RWLock cannot be copied
+                RWLock(const RWLock&);
+   RWLock&      operator = (const RWLock&);
+
+   pthread_rwlock_t mRWLock = PTHREAD_RWLOCK_INITIALIZER;
+};
+
+inline RWLock::~RWLock() {
+    pthread_rwlock_destroy(&mRWLock);
+}
+inline status_t RWLock::readLock() {
+    return -pthread_rwlock_rdlock(&mRWLock);
+}
+inline status_t RWLock::tryReadLock() {
+    return -pthread_rwlock_tryrdlock(&mRWLock);
+}
+inline status_t RWLock::writeLock() {
+    return -pthread_rwlock_wrlock(&mRWLock);
+}
+inline status_t RWLock::tryWriteLock() {
+    return -pthread_rwlock_trywrlock(&mRWLock);
+}
+inline void RWLock::unlock() {
+    pthread_rwlock_unlock(&mRWLock);
+}
+
+#endif // HAVE_PTHREADS
+typedef RWLock::AutoRLock AutoRMutex;
+typedef RWLock::AutoWLock AutoWMutex;
+
+// ---------------------------------------------------------------------------
+} // namespace icamera
+// ---------------------------------------------------------------------------
diff --git a/camera/hal/intel/ipu6/src/iutils/ScopedAtrace.cpp b/camera/hal/intel/ipu6/src/iutils/ScopedAtrace.cpp
new file mode 100644
index 000000000000..13533c7bc43d
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/iutils/ScopedAtrace.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2015-2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "utils/ScopedAtrace.h"
+#include "Trace.h"
+
+namespace icamera {
+
+const int ATRACE_LEN = 128;
+int gScopedAtraceLevel = 0;
+
+ScopedAtrace::ScopedAtrace(const int level, const char* func, const char* tag,
+                           const char* note, long value, const char* note2,
+                           int value2, const char* note3, int value3)
+{
+    mEnableAtraceEnd = false;
+    if(gScopedAtraceLevel & level) {
+        char buf[ATRACE_LEN];
+        if (value < 0 || note == nullptr) {
+            snprintf(buf, ATRACE_LEN, "<%s,%s>", func, tag);
+            atrace_begin(ATRACE_TAG, buf);
+        } else if (value2 < 0 || note2 == nullptr) {
+            snprintf(buf, ATRACE_LEN, "<%s,%s>:%s(%ld)", func, tag, note, value);
+            atrace_begin(ATRACE_TAG, buf);
+        } else if (value3 < 0 || note3 == nullptr) {
+            snprintf(buf, ATRACE_LEN, "<%s,%s>:%s(%ld) %s(%d)", func, tag, note,
+                     value, note2, value2);
+            atrace_begin(ATRACE_TAG, buf);
+        } else {
+            snprintf(buf, ATRACE_LEN, "<%s,%s>:%s(%ld) %s(%d) %s(%d)", func, tag,
+                     note, value, note2, value2, note3, value3);
+            atrace_begin(ATRACE_TAG, buf);
+        }
+        mEnableAtraceEnd = true;
+    }
+}
+
+ScopedAtrace::~ScopedAtrace()
+{
+    if(mEnableAtraceEnd) {
+        atrace_end(ATRACE_TAG);
+    }
+}
+
+void ScopedAtrace::setTraceLevel(int level)
+{
+    gScopedAtraceLevel = level;
+}
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/iutils/SwImageConverter.cpp b/camera/hal/intel/ipu6/src/iutils/SwImageConverter.cpp
new file mode 100644
index 000000000000..a6e63c6beffd
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/iutils/SwImageConverter.cpp
@@ -0,0 +1,406 @@
+/*
+ * Copyright (C) 2016-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "SwImageConverter"
+
+#include "Errors.h"
+#include "Utils.h"
+#include "CameraLog.h"
+#include "SwImageConverter.h"
+
+namespace icamera {
+
+void SwImageConverter::RGB2YUV(unsigned short R, unsigned short G, unsigned short B,
+     unsigned char *Y, unsigned char *U, unsigned char *V)
+{
+    int Rp, Gp, Bp;
+    int oY, oU, oV;
+    Rp = R; Gp = G; Bp = B;
+    oY = (257 * Rp + 504 * Gp + 98 * Bp) / 4000 + 16;
+    oU = (-148 * Rp - 291 * Gp + 439 * Bp) / 4000 + 128;
+    oV = (439 * Rp - 368 * Gp - 71 * Bp) / 4000 + 128;
+    if (oY > 255) oY = 255;
+    if (oY < 0) oY = 0;
+    if (oU > 255) oU = 255;
+    if (oU < 0) oU = 0;
+    if (oV > 255) oV = 255;
+    if (oV < 0) oV = 0;
+    *Y = (unsigned char)oY;
+    *U = (unsigned char)oU;
+    *V = (unsigned char)oV;
+}
+
+void SwImageConverter::YUV2RGB(unsigned char Y, unsigned char U, unsigned char V,
+    unsigned short *R, unsigned short *G, unsigned short *B)
+{
+    int Yp, Up, Vp, Ypp;
+    int oR, oG, oB;
+    Yp = Y - 16;
+    Up = (U - 128);
+    Vp = (V - 128);
+    Ypp = 9535 * Yp;
+
+    oB = (Ypp + 16531 * Up) >> 11;
+    oG = (Ypp - 6660 * Vp - 3203 * Up) >> 11;
+    oR = (Ypp + 13074 * Vp) >> 11;
+    if (oR > 1023) oR = 1023;
+    if (oR < 0) oR = 0;
+    if (oG > 1023) oG = 1023;
+    if (oG < 0) oG = 0;
+    if (oB > 1023) oB = 1023;
+    if (oB < 0) oB = 0;
+    *R = (unsigned short)oR;
+    *G = (unsigned short)oG;
+    *B = (unsigned short)oB;
+}
+
+void SwImageConverter::convertBayerBlock(unsigned int x, unsigned int y,
+    unsigned int width, unsigned int height,
+    unsigned short bayer_data[4], unsigned char *out_buf,
+    unsigned int src_fmt, unsigned int dst_fmt)
+{
+    unsigned char *Ybase;
+    unsigned char *UVbase;
+    unsigned char Y, U, V;
+    unsigned short R, Gr, Gb, B;
+    switch (src_fmt) {
+        case V4L2_PIX_FMT_SRGGB8: R = bayer_data[0] << 2; Gr = bayer_data[1] << 2; Gb = bayer_data[2] << 2; B = bayer_data[3] << 2; break;
+        case V4L2_PIX_FMT_SGRBG8: Gr = bayer_data[0] << 2; R = bayer_data[1] << 2; B = bayer_data[2] << 2; Gb = bayer_data[3] << 2; break;
+        case V4L2_PIX_FMT_SGBRG8: Gb = bayer_data[0] << 2; B = bayer_data[1] << 2; R = bayer_data[2] << 2; Gr = bayer_data[3] << 2; break;
+        case V4L2_PIX_FMT_SBGGR8: B = bayer_data[0] << 2; Gb = bayer_data[1] << 2; Gr = bayer_data[2] << 2; R = bayer_data[3] << 2; break;
+        case V4L2_PIX_FMT_SRGGB10: R = bayer_data[0]; Gr = bayer_data[1]; Gb = bayer_data[2]; B = bayer_data[3]; break;
+        case V4L2_PIX_FMT_SGRBG10: Gr = bayer_data[0]; R = bayer_data[1]; B = bayer_data[2]; Gb = bayer_data[3]; break;
+        case V4L2_PIX_FMT_SGBRG10: Gb = bayer_data[0]; B = bayer_data[1]; R = bayer_data[2]; Gr = bayer_data[3]; break;
+        case V4L2_PIX_FMT_SBGGR10: B = bayer_data[0]; Gb = bayer_data[1]; Gr = bayer_data[2]; R = bayer_data[3]; break;
+        case V4L2_PIX_FMT_SRGGB12: R = bayer_data[0] >> 2; Gr = bayer_data[1] >> 2; Gb = bayer_data[2] >> 2; B = bayer_data[3] >> 2; break;
+        case V4L2_PIX_FMT_SGRBG12: Gr = bayer_data[0] >> 2; R = bayer_data[1] >> 2; B = bayer_data[2] >> 2; Gb = bayer_data[3] >> 2; break;
+        case V4L2_PIX_FMT_SGBRG12: Gb = bayer_data[0] >> 2; B = bayer_data[1] >> 2; R = bayer_data[2] >> 2; Gr = bayer_data[3] >> 2; break;
+        case V4L2_PIX_FMT_SBGGR12: B = bayer_data[0] >> 2; Gb = bayer_data[1] >> 2; Gr = bayer_data[2] >> 2; R = bayer_data[3] >> 2; break;
+        default: return;
+    }
+
+    int dstStride = CameraUtils::getStride(dst_fmt, width);
+    switch(dst_fmt) {
+        case V4L2_PIX_FMT_SRGGB8:
+            out_buf[y * dstStride + x] = (R >> 2);
+            out_buf[y * dstStride + x + 1] = (Gr >> 2);
+            out_buf[(y + 1) * dstStride + x] = (Gb >> 2);
+            out_buf[(y + 1) * dstStride + x + 1] = (B >> 2);
+            break;
+        case V4L2_PIX_FMT_SGRBG8:
+            out_buf[y * dstStride + x] = (Gr >> 2);
+            out_buf[y * dstStride + x + 1] = (R >> 2);
+            out_buf[(y + 1) * dstStride + x] = (B >> 2);
+            out_buf[(y + 1) * dstStride + x + 1] = (Gb >> 2);
+            break;
+        case V4L2_PIX_FMT_SGBRG8:
+            out_buf[y * dstStride + x] = (Gb >> 2);
+            out_buf[y * dstStride + x + 1] = (B >> 2);
+            out_buf[(y + 1) * dstStride + x] = (R >> 2);
+            out_buf[(y + 1) * dstStride + x + 1] = (Gr >> 2);
+            break;
+        case V4L2_PIX_FMT_SBGGR8:
+            out_buf[y * dstStride + x] = (B >> 2);
+            out_buf[y * dstStride + x + 1] = (Gb >> 2);
+            out_buf[(y + 1) * dstStride + x] = (Gr >> 2);
+            out_buf[(y + 1) * dstStride + x + 1] = (R >> 2);
+            break;
+        case V4L2_PIX_FMT_SRGGB10:
+            *((unsigned short *) out_buf + y * dstStride + x) = R;
+            *((unsigned short *) out_buf + y * dstStride + x + 1) = Gr;
+            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = Gb;
+            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = B;
+            break;
+        case V4L2_PIX_FMT_SGRBG10:
+            *((unsigned short *) out_buf + y * dstStride + x) = Gr;
+            *((unsigned short *) out_buf + y * dstStride + x + 1) = R;
+            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = B;
+            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = Gb;
+            break;
+        case V4L2_PIX_FMT_SGBRG10:
+            *((unsigned short *) out_buf + y * dstStride + x) = Gb;
+            *((unsigned short *) out_buf + y * dstStride + x + 1) = B;
+            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = R;
+            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = Gr;
+            break;
+        case V4L2_PIX_FMT_SBGGR10:
+            *((unsigned short *) out_buf + y * dstStride + x) = B;
+            *((unsigned short *) out_buf + y * dstStride + x + 1) = Gb;
+            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = Gr;
+            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = R;
+            break;
+        case V4L2_PIX_FMT_NV12:
+            Ybase = out_buf;
+            UVbase = Ybase + dstStride * height;
+            RGB2YUV(R, (Gr + Gb) / 2, B, &Y, &U, &V);
+            Ybase[y * dstStride + x] = Ybase[y * dstStride + x + 1] =
+                Ybase[(y + 1) * dstStride + x] = Ybase[(y + 1) * dstStride + x + 1] = Y;
+            UVbase[y / 2 * dstStride + x / 2 * 2] = U;
+            UVbase[y / 2 * dstStride + x / 2 * 2 + 1] = V;
+            break;
+        case V4L2_PIX_FMT_UYVY:
+            RGB2YUV(R, (Gr + Gb) / 2, B, &Y, &U, &V);
+            out_buf[y * dstStride + x * 2] = U;
+            out_buf[y * dstStride + x * 2 + 1] = Y;
+            out_buf[y * dstStride + x * 2 + 2] = V;
+            out_buf[y * dstStride + x * 2 + 3] = Y;
+            out_buf[(y + 1) * dstStride + x * 2] = U;
+            out_buf[(y + 1) * dstStride + x * 2 + 1] = Y;
+            out_buf[(y + 1) * dstStride + x * 2 + 2] = V;
+            out_buf[(y + 1) * dstStride + x * 2 + 3] = Y;
+            break;
+        case V4L2_PIX_FMT_YUYV:
+            RGB2YUV(R, (Gr + Gb) / 2, B, &Y, &U, &V);
+            out_buf[y * dstStride + x * 2] = Y;
+            out_buf[y * dstStride + x * 2 + 1] = U;
+            out_buf[y * dstStride + x * 2 + 2] = Y;
+            out_buf[y * dstStride + x * 2 + 3] = V;
+            out_buf[(y + 1) * dstStride + x * 2] = Y;
+            out_buf[(y + 1) * dstStride + x * 2 + 1] = U;
+            out_buf[(y + 1) * dstStride + x * 2 + 2] = Y;
+            out_buf[(y + 1) * dstStride + x * 2 + 3] = V;
+            break;
+        case V4L2_PIX_FMT_YUV420:
+        {
+            RGB2YUV(R, (Gr + Gb) / 2, B, &Y, &U, &V);
+            Ybase = out_buf;
+            uint8_t* UBase = out_buf + dstStride * height;
+            uint8_t* VBase = out_buf + dstStride * (height + height / 4);
+            Ybase[y * dstStride + x] = Y;
+            Ybase[y * dstStride + x + 1] = Y;
+            Ybase[(y + 1) * dstStride + x] = Y;
+            Ybase[(y + 1) * dstStride + x + 1] = Y;
+            if (y % 4 == 0) {
+                UBase[y / 4 * dstStride + x / 2] = U;
+                VBase[y / 4 * dstStride + x / 2] = V;
+            } else {
+                UBase[y / 4 * dstStride + width / 2 + x / 2] = U;
+                VBase[y / 4 * dstStride + width / 2 + x / 2] = V;
+            }
+            break;
+        }
+        default:
+            break;
+    }
+}
+
+void SwImageConverter::convertYuvBlock(unsigned int x, unsigned int y,
+    unsigned int width, unsigned int height,
+    unsigned char *in_buf, unsigned char *out_buf,
+    unsigned int src_fmt, unsigned int dst_fmt)
+{
+    unsigned char *YBase;
+    unsigned char *UVBase;
+    unsigned char Y[4];
+    unsigned char U[4];
+    unsigned char V[4];
+    unsigned short R, G, B;
+    int srcStride = CameraUtils::getStride(src_fmt, width);
+
+    switch(src_fmt) {
+        case V4L2_PIX_FMT_NV12:
+            YBase = in_buf;
+            UVBase = in_buf + srcStride * height;
+            Y[0] = YBase[y * srcStride + x];
+            Y[1] = YBase[y * srcStride + x + 1];
+            Y[2] = YBase[(y + 1) * srcStride + x];
+            Y[3] = YBase[(y + 1) * srcStride + x + 1];
+            U[0] = U[1] = U[2] = U[3] = UVBase[y / 2 * srcStride + x / 2 * 2];
+            V[0] = V[1] = V[2] = V[3] = UVBase[y / 2 * srcStride + x / 2 * 2 + 1];
+            break;
+        case V4L2_PIX_FMT_UYVY:
+            Y[0] = in_buf[y * srcStride + x * 2 + 1];
+            Y[1] = in_buf[y * srcStride + x * 2 + 3];
+            Y[2] = in_buf[(y + 1) * srcStride + x * 2 + 1];
+            Y[3] = in_buf[(y + 1) * srcStride + x * 2 + 3];
+            U[0] = U[1] = in_buf[y * srcStride + x * 2];
+            U[2] = U[3] = in_buf[(y + 1) * srcStride + x * 2];
+            V[0] = V[1] = in_buf[y * srcStride + x * 2 + 2];
+            V[2] = V[3] = in_buf[(y + 1) * srcStride + x * 2 + 2];
+            break;
+        case V4L2_PIX_FMT_YUYV:
+            Y[0] = in_buf[y * srcStride + x * 2];
+            Y[1] = in_buf[y * srcStride + x * 2 + 2];
+            Y[2] = in_buf[(y + 1) * srcStride + x * 2];
+            Y[3] = in_buf[(y + 1) * srcStride + x * 2 + 2];
+            U[0] = U[1] = in_buf[y * srcStride + x * 2 + 1];
+            U[2] = U[3] = in_buf[(y + 1) * srcStride + x * 2 + 1];
+            V[0] = V[1] = in_buf[y * srcStride + x * 2 + 3];
+            V[2] = V[3] = in_buf[(y + 1) * srcStride + x * 2 + 3];
+            break;
+        default:
+            return;
+    }
+
+    int dstStride = CameraUtils::getStride(dst_fmt, width);
+    switch(dst_fmt) {
+        case V4L2_PIX_FMT_NV12:
+            YBase = out_buf;
+            UVBase = out_buf + dstStride * height;
+            YBase[y * dstStride + x] = Y[0];
+            YBase[y * dstStride + x + 1] = Y[1];
+            YBase[(y + 1) * dstStride + x] = Y[2];
+            YBase[(y + 1) * dstStride + x + 1] = Y[3];
+            UVBase[y / 2 * dstStride + x / 2 * 2] = U[0];
+            UVBase[y / 2 * dstStride + x / 2 * 2 + 1] = V[0];
+            break;
+        case V4L2_PIX_FMT_UYVY:
+            out_buf[y * dstStride + x * 2 + 1] = Y[0];
+            out_buf[y * dstStride + x * 2 + 3] = Y[1];
+            out_buf[(y + 1) * dstStride + x * 2 + 1] = Y[2];
+            out_buf[(y + 1) * dstStride + x * 2 + 3] = Y[3];
+            out_buf[y * dstStride + x * 2] = U[0];
+            out_buf[(y + 1) * dstStride + x * 2] = U[2];
+            out_buf[y * dstStride + x * 2 + 2] = V[0];
+            out_buf[(y + 1) * dstStride + x * 2 + 2] = V[2];
+            break;
+        case V4L2_PIX_FMT_YUYV:
+            out_buf[y * dstStride + x * 2] = Y[0];
+            out_buf[y * dstStride + x * 2 + 2] = Y[1];
+            out_buf[(y + 1) * dstStride + x * 2] = Y[2];
+            out_buf[(y + 1) * dstStride + x * 2 + 2] = Y[3];
+            out_buf[y * dstStride + x * 2 + 1] = U[0];
+            out_buf[(y + 1) * dstStride + x * 2 + 1] = U[2];
+            out_buf[y * dstStride + x * 2 + 3] = V[0];
+            out_buf[(y + 1) * dstStride + x * 2 + 3] = V[2];
+            break;
+        case V4L2_PIX_FMT_YUV420:
+        {
+            YBase = out_buf;
+            uint8_t* UBase = out_buf + dstStride * height;
+            uint8_t* VBase = out_buf + dstStride * (height + height / 4);
+            YBase[y * dstStride + x] = Y[0];
+            YBase[y * dstStride + x + 1] = Y[1];
+            YBase[(y + 1) * dstStride + x] = Y[2];
+            YBase[(y + 1) * dstStride + x + 1] = Y[3];
+            if (y % 4 == 0) {
+                UBase[y / 4 * dstStride + x / 2] = (U[0] + U[2]) / 2;
+                VBase[y / 4 * dstStride + x / 2] = (V[0] + V[2]) / 2;
+            } else {
+                UBase[y / 4 * dstStride + width / 2 + x / 2] = (U[0] + U[2]) / 2;
+                VBase[y / 4 * dstStride + width / 2 + x / 2] = (V[0] + V[2]) / 2;
+            }
+            break;
+        }
+        case V4L2_PIX_FMT_SRGGB8:
+            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
+            out_buf[y * dstStride + x] = (R >> 2);
+            out_buf[y * dstStride + x + 1] = (G >> 2);
+            out_buf[(y + 1) * dstStride + x] = (G >> 2);
+            out_buf[(y + 1) * dstStride + x + 1] = (B >> 2);
+            break;
+        case V4L2_PIX_FMT_SGRBG8:
+            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
+            out_buf[y * dstStride + x] = (G >> 2);
+            out_buf[y * dstStride + x + 1] = (R >> 2);
+            out_buf[(y + 1) * dstStride + x] = (B >> 2);
+            out_buf[(y + 1) * dstStride + x + 1] = (G >> 2);
+            break;
+        case V4L2_PIX_FMT_SGBRG8:
+            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
+            out_buf[y * dstStride + x] = (G >> 2);
+            out_buf[y * dstStride + x + 1] = (B >> 2);
+            out_buf[(y + 1) * dstStride + x] = (R >> 2);
+            out_buf[(y + 1) * dstStride + x + 1] = (G >> 2);
+            break;
+        case V4L2_PIX_FMT_SBGGR8:
+            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
+            out_buf[y * dstStride + x] = (B >> 2);
+            out_buf[y * dstStride + x + 1] = (G >> 2);
+            out_buf[(y + 1) * dstStride + x] = (G >> 2);
+            out_buf[(y + 1) * dstStride + x + 1] = (R >> 2);
+            break;
+        case V4L2_PIX_FMT_SRGGB10:
+            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
+            *((unsigned short *) out_buf + y * dstStride + x) = R;
+            *((unsigned short *) out_buf + y * dstStride + x + 1) = G;
+            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = G;
+            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = B;
+            break;
+        case V4L2_PIX_FMT_SGRBG10:
+            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
+            *((unsigned short *) out_buf + y * dstStride + x) = G;
+            *((unsigned short *) out_buf + y * dstStride + x + 1) = R;
+            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = B;
+            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = G;
+            break;
+        case V4L2_PIX_FMT_SGBRG10:
+            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
+            *((unsigned short *) out_buf + y * dstStride + x) = G;
+            *((unsigned short *) out_buf + y * dstStride + x + 1) = B;
+            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = R;
+            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = G;
+            break;
+        case V4L2_PIX_FMT_SBGGR10:
+            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
+            *((unsigned short *) out_buf + y * dstStride + x) = B;
+            *((unsigned short *) out_buf + y * dstStride + x + 1) = G;
+            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = G;
+            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = R;
+            break;
+        default:
+            return;
+    }
+}
+
+int SwImageConverter::convertFormat(unsigned int width, unsigned int height,
+                        unsigned char *inBuf, unsigned int inLength, unsigned int srcFmt,
+                        unsigned char *outBuf, unsigned int outLength, unsigned int dstFmt)
+{
+    CheckError((inBuf == nullptr || outBuf == nullptr), BAD_VALUE, "Invalid input(%p) or output buffer(%p)", inBuf, outBuf);
+
+    unsigned int x, y;
+    unsigned short bayer_data[4];
+
+    LOG2("%s srcFmt %s => dstFmt %s %dx%d", __func__,
+         CameraUtils::format2string(srcFmt).c_str(),
+         CameraUtils::format2string(dstFmt).c_str(), width, height);
+
+    if (dstFmt == srcFmt) {
+        // No need do format convertion.
+        LOG2("No conversion needed");
+        MEMCPY_S(outBuf, outLength, inBuf, inLength);
+        return 0;
+    }
+
+    // for not vector raw
+    int srcStride = CameraUtils::getStride(srcFmt, width);
+    for(y = 0; y < height; y += 2) {
+        for(x = 0; x < width; x += 2) {
+            if(CameraUtils::isRaw(srcFmt)) {
+                if(CameraUtils::getBpp(srcFmt) == 8) {
+                    bayer_data[0] = inBuf[y * srcStride + x];
+                    bayer_data[1] = inBuf[y * srcStride + x + 1];
+                    bayer_data[2] = inBuf[(y + 1) * srcStride + x];
+                    bayer_data[3] = inBuf[(y + 1) * srcStride + x + 1];
+                } else {
+                    int offset = srcStride / (CameraUtils::getBpp(srcFmt) / 8);
+                    bayer_data[0] = *((unsigned short *) inBuf + y * offset + x);
+                    bayer_data[1] = *((unsigned short *) inBuf + y * offset + x + 1);
+                    bayer_data[2] = *((unsigned short *) inBuf + (y + 1) * offset + x);
+                    bayer_data[3] =
+                        *((unsigned short *) inBuf + (y + 1) * offset + x + 1);
+                }
+                convertBayerBlock(x, y, width, height, bayer_data, outBuf, srcFmt, dstFmt);
+            } else {
+                convertYuvBlock(x, y, width, height, inBuf, outBuf, srcFmt, dstFmt);
+            }
+        }
+    }
+    return 0;
+}
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/iutils/SwImageConverter.h b/camera/hal/intel/ipu6/src/iutils/SwImageConverter.h
new file mode 100644
index 000000000000..591f5b4029a8
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/iutils/SwImageConverter.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2016-2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+namespace icamera {
+
+namespace SwImageConverter {
+    void RGB2YUV(unsigned short R, unsigned short G, unsigned short B,
+         unsigned char *Y, unsigned char *U, unsigned char *V);
+
+    void YUV2RGB(unsigned char Y, unsigned char U, unsigned char V,
+        unsigned short *R, unsigned short *G, unsigned short *B);
+
+    void convertBayerBlock(unsigned int x, unsigned int y,
+        unsigned int width, unsigned int height, unsigned short bayer_data[4],
+        unsigned char *out_buf, unsigned int src_fmt, unsigned int dst_fmt);
+
+    void convertYuvBlock(unsigned int x, unsigned int y,
+        unsigned int width, unsigned int height, unsigned char *in_buf,
+        unsigned char *out_buf, unsigned int src_fmt, unsigned int dst_fmt);
+
+    //convert the buffer from the src_fmt to the dst_fmt
+    int convertFormat(unsigned int width, unsigned int height,
+        unsigned char *inBuf, unsigned int inLength, unsigned int srcFmt,
+        unsigned char *outBuf, unsigned int outLength, unsigned int dstFmt);
+}
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/iutils/Thread.cpp b/camera/hal/intel/ipu6/src/iutils/Thread.cpp
new file mode 100644
index 000000000000..919f5a1cf6e0
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/iutils/Thread.cpp
@@ -0,0 +1,222 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "Thread"
+
+#include "Errors.h"
+#include "Thread.h"
+#include "CameraLog.h"
+
+namespace icamera {
+
+int Condition::waitRelative(ConditionLock& lock, int64_t reltime) {
+    std::cv_status ret = mCondition.wait_for(lock, std::chrono::nanoseconds(reltime));
+    return ret == std::cv_status::timeout ? TIMED_OUT : OK;
+}
+
+Thread::Thread() : mState(NOT_STARTED), mThread(nullptr), mPriority(PRIORITY_DEFAULT)
+{
+    LOG1("%s", __func__);
+}
+
+Thread::~Thread()
+{
+    LOG1("%s", __func__);
+
+    requestExitAndWait();
+
+    delete mThread;
+}
+
+int Thread::run(std::string name, int priority)
+{
+    LOG1("%s", __func__);
+
+    AutoMutex lock(mLock);
+
+    if (mState != NOT_STARTED && mState != EXITED) {
+        LOGW("Cannot start thread(%s) in state(%d).", name.c_str(), mState);
+        return INVALID_OPERATION;
+    }
+
+    // Thread can be restarted only if the previous one has exited.
+    // Release the previous thread first if it's created already.
+    delete mThread;
+
+    mThread = new std::thread(_threadLoop, this);
+    mThread->detach();
+    mId = mThread->get_id();
+    mName = name;
+    mPriority = priority;
+    mState = RUNNING;
+
+    mStartCondition.signal();
+
+    return OK;
+}
+
+void Thread::requestExit()
+{
+    LOG1("%s", __func__);
+
+    AutoMutex lock(mLock);
+
+    if (mState == RUNNING) {
+        mState = EXITING;
+    }
+}
+
+int Thread::requestExitAndWait()
+{
+    LOG1("%s", __func__);
+
+    ConditionLock lock(mLock);
+
+    // No need exit if it's not started.
+    if (mState == NOT_STARTED) {
+        return NO_INIT;
+    }
+
+    // The function cannot be called by same thread.
+    if (std::this_thread::get_id() == mId) {
+        LOGE("The thread itself cannot call its own requestExitAndWait function.");
+        return WOULD_BLOCK;
+    }
+
+    while (mState != EXITED) {
+        mState = EXITING;
+        mExitedCondition.wait(lock);
+    }
+
+    return OK;
+}
+
+int Thread::join()
+{
+    LOG1("%s", __func__);
+
+    ConditionLock lock(mLock);
+
+    // No need join if it's not started.
+    if (mState == NOT_STARTED) {
+        return NO_INIT;
+    }
+
+    // The function cannot be called by same thread.
+    if (std::this_thread::get_id() == mId) {
+        LOGE("The thread itself cannot call its own join function.");
+        return WOULD_BLOCK;
+    }
+
+    while (mState != EXITED) {
+        mExitedCondition.wait(lock);
+    }
+
+    return OK;
+}
+
+bool Thread::isRunning() const
+{
+    AutoMutex lock(mLock);
+    // A thread in EXITING also means it's still running, but it's going to exit.
+    return mState == RUNNING || mState == EXITING;
+}
+
+bool Thread::isExiting() const
+{
+    AutoMutex lock(mLock);
+    return mState == EXITING;
+}
+
+bool Thread::isExited() const
+{
+    AutoMutex lock(mLock);
+    return mState == EXITED;
+}
+
+void Thread::_threadLoop(Thread* self)
+{
+    {
+        // Wait for function "run" to finish.
+        // If the thread is going to exit, then no need to wait anymore.
+        ConditionLock lock(self->mLock);
+        while (self->mState != RUNNING && self->mState != EXITING) {
+            self->mStartCondition.wait(lock);
+        }
+
+        if (self->mState == EXITING) {
+            self->mState = EXITED;
+            self->mExitedCondition.broadcast();
+            return;
+        }
+
+        self->setProperty();
+    }
+
+    while (true) {
+        bool loopAgain = self->threadLoop();
+
+        AutoMutex lock(self->mLock);
+        if (!loopAgain || self->mState == EXITING) {
+            self->mState = EXITED;
+            self->mExitedCondition.broadcast();
+            return;
+        }
+    }
+}
+
+// Platform specific implementation.
+#ifdef HAVE_PTHREADS
+#include <pthread.h>
+#include <sys/resource.h>
+
+void Thread::setProperty()
+{
+    LOG1("%s, name:%s, priority:%d", __func__, mName.c_str(), mPriority);
+
+#if __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 12
+    // Set thread's name
+    std::string threadName = mName.empty() ? "NO_NAME" : mName;
+    if (mName.size() > MAX_THREAD_NAME_LEN) {
+        threadName = mName.substr(0, MAX_THREAD_NAME_LEN);
+        LOG2("The thread name(%s) is too long, modify it to %s", mName.c_str(), threadName.c_str());
+    }
+    pthread_setname_np(pthread_self(), threadName.c_str());
+#endif
+
+    // Set thread's priority
+    setpriority(PRIO_PROCESS, 0, mPriority);
+
+    const int policy = SCHED_OTHER;
+    int min = sched_get_priority_min(policy);
+    int max = sched_get_priority_max(policy);
+    LOG1("Priority range:(%d-%d)", min, max);
+
+    if (mPriority < min) mPriority = min;
+    if (mPriority > max) mPriority = max;
+
+    sched_param param;
+    param.sched_priority = mPriority;
+
+    int ret = pthread_setschedparam(pthread_self(), policy, &param);
+    LOG1("pthread_setschedparam ret:%d", ret);
+}
+#else
+#warning "Setting thread's property is not implemented yet on this platform."
+#endif
+
+} // namespace icamera
+
diff --git a/camera/hal/intel/ipu6/src/iutils/Thread.h b/camera/hal/intel/ipu6/src/iutils/Thread.h
new file mode 100644
index 000000000000..91623dca8b21
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/iutils/Thread.h
@@ -0,0 +1,198 @@
+/*
+ * Copyright (C) 2017-2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <string>
+#include <thread>
+#include <mutex>
+#include <condition_variable>
+
+namespace icamera {
+
+typedef std::mutex Mutex;
+typedef std::lock_guard<std::mutex> AutoMutex;
+typedef std::unique_lock<std::mutex> ConditionLock;
+
+enum {
+    PRIORITY_LOWEST = 19,
+    PRIORITY_BACKGROUND = 10,
+    PRIORITY_NORMAL = 0,
+    PRIORITY_FOREGROUND = -2,
+    PRIORITY_DISPLAY = -4,
+    PRIORITY_URGENT_DISPLAY = -8,
+    PRIORITY_AUDIO = -16,
+    PRIORITY_URGENT_AUDIO = -19,
+    PRIORITY_HIGHEST = -20,
+    PRIORITY_DEFAULT = 0,
+    PRIORITY_MORE_FAVORABLE = -1,
+    PRIORITY_LESS_FAVORABLE = 1,
+};
+
+class Condition {
+public:
+    Condition() {}
+    ~Condition() {}
+
+    /**
+     * Wait on the condition variable. MUST be locked with ConditionLock before being called.
+     *
+     * \param[in] lock: An object of type ConditionLock, which must be locked by the current thread.
+     */
+    void wait(ConditionLock& lock) {
+        mCondition.wait(lock);
+    }
+
+    /**
+     * Wait on the condition variable with a period of time.
+     *
+     * \param[in] lock: An object of type ConditionLock, which must be locked by the current thread.
+     * \param[in] reltime: The maximum time to spend waiting.
+     *
+     * \return TIMED_OUT if it's not notified to wake up within reltime, otherwise return OK.
+     */
+    int waitRelative(ConditionLock& lock, int64_t reltime);
+
+    /**
+     * Wake up one thread that is waiting on the condition variable.
+     */
+    void signal() { mCondition.notify_one(); }
+
+    /**
+     * Wake up all threads that are waiting on the condition variable.
+     */
+    void broadcast() { mCondition.notify_all(); }
+
+private:
+    Condition(const Condition& other) = delete;
+    Condition& operator=(const Condition&) = delete;
+
+    std::condition_variable mCondition;
+};
+
+/**
+ * Thread is a wrapper class to std::thread
+ *
+ * Thread helps manager the thread's state and make the std::thread is easier to used.
+ * Thread also hides the platform specific implementation details.
+ */
+class Thread {
+public:
+    Thread();
+    virtual ~Thread();
+
+    /**
+     * Start the thread.
+     */
+    virtual int run(std::string name = ("nameless"), int priority = PRIORITY_DEFAULT);
+
+    /**
+     * Ask this object's thread to exit. This function is asynchronous, so when it
+     * returns the thread might still be running.
+     */
+    virtual void requestExit();
+
+    /**
+     * Wait until this object's thread exits. Returns immediately if not yet running.
+     *
+     * join will not trigger the thread to exit, it just wait for the thread exits.
+     * Do not call it from this object's thread, will return WOULD_BLOCK in that case.
+     */
+    int join();
+
+    /**
+     * Ask this object's thread to exit. This function is synchronous, so when it
+     * returns the thread must exit already.
+     * It has same effect with calling requestExit and join combined.
+     *
+     * Do not call from this object's thread, will return WOULD_BLOCK in that case.
+     */
+    int requestExitAndWait();
+
+    /**
+     * Indicates whether this thread is running or not.
+     */
+    bool isRunning() const;
+
+    /**
+     * Indicates whether this thread is going to exit or not.
+     */
+    bool isExiting() const;
+
+    /**
+     * Indicates whether this thread exited or not.
+     */
+    bool isExited() const;
+
+private:
+
+    /**
+     * threadLoop is the function which is called by the thread.
+     * The derived class MUST override this function. The thread starts its life here.
+     *
+     * There are two ways of using the thread object:
+     * 1. loop: threadLoop will be called again as long as it returns true,
+     *          and requestExit() wasn't called.
+     * 2. once: If threadLoop() returns false, the thread will exit upon return.
+     *
+     * There are three ways of exiting the thread.
+     * 1. threadLoop return false.
+     * 2. requestExit is called.
+     * 3. requestExitAndWait is called.
+     */
+    virtual bool threadLoop() { return false; }
+
+private:
+    Thread(const Thread& other) = delete;
+    Thread& operator=(const Thread&) = delete;
+
+    /**
+     * The function which is used to create the std::thread.
+     */
+    static void _threadLoop(Thread* self);
+
+    /**
+     * Set thread's property such as thread's name or priority.
+     */
+    void setProperty();
+
+private:
+    enum {
+        NOT_STARTED,
+        RUNNING,
+        EXITING,
+        EXITED,
+    } mState;
+
+    // The max length for thread name is 15.
+    static const int MAX_THREAD_NAME_LEN = 15;
+    std::thread* mThread;
+    std::string mName;
+    std::thread::id mId;
+    int mPriority;
+
+    // A lock used to protect internal data and API accessing.
+    mutable Mutex mLock;
+
+    // To make sure the thread not dead before "run" not finish.
+    Condition mStartCondition;
+
+    // To make sure API like join be able to wait until thread exits.
+    Condition mExitedCondition;
+};
+
+} // namespace icamera
+
diff --git a/camera/hal/intel/ipu6/src/iutils/Trace.cpp b/camera/hal/intel/ipu6/src/iutils/Trace.cpp
new file mode 100644
index 000000000000..d50ab513eb2e
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/iutils/Trace.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2014-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "Trace"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <pthread.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include "Trace.h"
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+
+std::atomic<int>        atrace_is_ready(0);
+uint64_t                atrace_enabled_tags  = ATRACE_TAG_NOT_READY;
+int                     atrace_marker_fd     = -1;
+static pthread_once_t   atrace_once_control  = PTHREAD_ONCE_INIT;
+
+static void atrace_init_once()
+{
+    atrace_marker_fd = open("/sys/kernel/debug/tracing/trace_marker", O_WRONLY);
+    if (atrace_marker_fd == -1) {
+        ATRACE_LOGE("atrace %s open error: %s!\n", __func__, strerror(errno));
+        return;
+    }
+    atrace_enabled_tags = ATRACE_TAG_ALWAYS;
+    atrace_is_ready = 1;
+}
+
+void atrace_setup()
+{
+    pthread_once(&atrace_once_control, atrace_init_once);
+}
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/iutils/Trace.h b/camera/hal/intel/ipu6/src/iutils/Trace.h
new file mode 100644
index 000000000000..849a6f19106b
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/iutils/Trace.h
@@ -0,0 +1,241 @@
+/*
+ * Copyright (C) 2014-2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <atomic>
+
+#include <inttypes.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+
+namespace icamera {
+
+#ifndef ATRACE_NO_LOG
+#define ATRACE_LOGE(format, args...) printf(format, ##args)
+#else
+#define ATRACE_LOGE()
+#endif
+
+#define CAMERA_PRId32 "d"
+#define CAMERA_PRId64 "I64d"
+
+#define ATRACE_MESSAGE_LENGTH 1024
+#define PROPERTY_VALUE_MAX 1024
+/**
+ * The ATRACE_TAG macro can be defined before including this header to trace
+ * using one of the tags defined below.  It must be defined to one of the
+ * following ATRACE_TAG_* macros.  The trace tag is used to filter tracing in
+ * userland to avoid some of the runtime cost of tracing when it is not desired.
+ *
+ * Defining ATRACE_TAG to be ATRACE_TAG_ALWAYS will result in the tracing always
+ * being enabled - this should ONLY be done for debug code, as userland tracing
+ * has a performance cost even when the trace is not being recorded.  Defining
+ * ATRACE_TAG to be ATRACE_TAG_NEVER or leaving ATRACE_TAG undefined will result
+ * in the tracing always being disabled.
+ */
+#define ATRACE_TAG_NEVER            0       // This tag is never enabled.
+#define ATRACE_TAG_ALWAYS           (1<<0)  // This tag is always enabled.
+#define ATRACE_TAG_LAST             ATRACE_TAG_ALWAYS
+
+// Reserved for initialization.
+#define ATRACE_TAG_NOT_READY        (1LL<<63)
+
+#define ATRACE_TAG_VALID_MASK ((ATRACE_TAG_LAST - 1) | ATRACE_TAG_LAST)
+
+// define the ATRACE_TAG to ALWAYS for nestdemo.
+#define ATRACE_TAG ATRACE_TAG_ALWAYS
+
+/**
+ * Opens the trace file for writing and reads the property for initial tags.
+ * The atrace.tags.enableflags property sets the tags to trace.
+ * This function should not be explicitly called, the first call to any normal
+ * trace function will cause it to be run safely.
+ */
+void atrace_setup();
+
+/**
+ * Flag indicating whether setup has been completed, initialized to 0.
+ * Nonzero indicates setup has completed.
+ * Note: This does NOT indicate whether or not setup was successful.
+ */
+extern std::atomic<int> atrace_is_ready;
+
+/**
+ * Set of ATRACE_TAG flags to trace for, initialized to ATRACE_TAG_NOT_READY.
+ * A value of zero indicates setup has failed.
+ * Any other nonzero value indicates setup has succeeded, and tracing is on.
+ */
+extern uint64_t atrace_enabled_tags;
+
+/**
+ * Handle to the kernel's trace buffer, initialized to -1.
+ * Any other value indicates setup has succeeded, and is a valid fd for tracing.
+ */
+extern int atrace_marker_fd;
+
+/**
+ * atrace_init readies the process for tracing by opening the trace_marker file.
+ * Calling any trace function causes this to be run, so calling it is optional.
+ * This can be explicitly run to avoid setup delay on first trace function.
+ */
+#define ATRACE_INIT() atrace_init()
+static inline void atrace_init()
+{
+    if (!atrace_is_ready.load()) {
+        atrace_setup();
+    }
+}
+
+/**
+ * Get the mask of all tags currently enabled.
+ * It can be used as a guard condition around more expensive trace calculations.
+ * Every trace function calls this, which ensures atrace_init is run.
+ */
+#define ATRACE_GET_ENABLED_TAGS() atrace_get_enabled_tags()
+static inline uint64_t atrace_get_enabled_tags()
+{
+    atrace_init();
+    return atrace_enabled_tags;
+}
+
+/**
+ * Test if a given tag is currently enabled.
+ * Returns nonzero if the tag is enabled, otherwise zero.
+ * It can be used as a guard condition around more expensive trace calculations.
+ */
+#define ATRACE_ENABLED() atrace_is_tag_enabled(ATRACE_TAG)
+static inline uint64_t atrace_is_tag_enabled(uint64_t tag)
+{
+    return atrace_get_enabled_tags() & tag;
+}
+
+/**
+ * Trace the beginning of a context.  name is used to identify the context.
+ * This is often used to time function execution.
+ */
+#define ATRACE_BEGIN(name) atrace_begin(ATRACE_TAG, name)
+static inline void atrace_begin(uint64_t tag, const char* name)
+{
+    if (atrace_is_tag_enabled(tag)) {
+        char buf[ATRACE_MESSAGE_LENGTH];
+        ssize_t len;
+
+        len = snprintf(buf, ATRACE_MESSAGE_LENGTH, "B|%d|%s", static_cast<int>(getpid()), name);
+        if (write(atrace_marker_fd, buf, len) != len)
+            ATRACE_LOGE("atrace %s write %s error: %s!\n", __func__, buf, strerror(errno));
+    }
+}
+
+/**
+ * Trace the end of a context.
+ * This should match up (and occur after) a corresponding ATRACE_BEGIN.
+ */
+#define ATRACE_END() atrace_end(ATRACE_TAG)
+static inline void atrace_end(uint64_t tag)
+{
+    if (atrace_is_tag_enabled(tag)) {
+        char c = 'E';
+        if (write(atrace_marker_fd, &c, 1) !=1)
+            ATRACE_LOGE("atrace %s write error: %s!\n", __func__, strerror(errno));
+    }
+}
+
+/**
+ * Trace the beginning of an asynchronous event. Unlike ATRACE_BEGIN/ATRACE_END
+ * contexts, asynchronous events do not need to be nested. The name describes
+ * the event, and the cookie provides a unique identifier for distinguishing
+ * simultaneous events. The name and cookie used to begin an event must be
+ * used to end it.
+ */
+#define ATRACE_ASYNC_BEGIN(name, cookie) \
+    atrace_async_begin(ATRACE_TAG, name, cookie)
+static inline void atrace_async_begin(uint64_t tag, const char* name,
+        int32_t cookie)
+{
+    if (atrace_is_tag_enabled(tag)) {
+        char buf[ATRACE_MESSAGE_LENGTH];
+        ssize_t len;
+
+        len = snprintf(buf, ATRACE_MESSAGE_LENGTH, "S|%d|%s|%" CAMERA_PRId32,
+                       static_cast<int>(getpid()), name, cookie);
+        if (write(atrace_marker_fd, buf, len) != len)
+            ATRACE_LOGE("atrace %s write %s error: %s!\n", __func__, buf, strerror(errno));
+    }
+}
+
+/**
+ * Trace the end of an asynchronous event.
+ * This should have a corresponding ATRACE_ASYNC_BEGIN.
+ */
+#define ATRACE_ASYNC_END(name, cookie) atrace_async_end(ATRACE_TAG, name, cookie)
+static inline void atrace_async_end(uint64_t tag, const char* name,
+        int32_t cookie)
+{
+    if (atrace_is_tag_enabled(tag)) {
+        char buf[ATRACE_MESSAGE_LENGTH];
+        ssize_t len;
+
+        len = snprintf(buf, ATRACE_MESSAGE_LENGTH, "F|%d|%s|%" CAMERA_PRId32,
+                       static_cast<int>(getpid()), name, cookie);
+        if (write(atrace_marker_fd, buf, len) != len)
+            ATRACE_LOGE("atrace %s write %s error: %s!\n", __func__, buf, strerror(errno));
+    }
+}
+
+/**
+ * Traces an integer counter value.  name is used to identify the counter.
+ * This can be used to track how a value changes over time.
+ */
+#define ATRACE_INT(name, value) atrace_int(ATRACE_TAG, name, value)
+static inline void atrace_int(uint64_t tag, const char* name, int32_t value)
+{
+    if (atrace_is_tag_enabled(tag)) {
+        char buf[ATRACE_MESSAGE_LENGTH];
+        ssize_t len;
+
+        len = snprintf(buf, ATRACE_MESSAGE_LENGTH, "C|%d|%s|%" CAMERA_PRId32,
+                       static_cast<int>(getpid()), name, value);
+        if (write(atrace_marker_fd, buf, len) != len)
+            ATRACE_LOGE("atrace %s write %s error: %s!\n", __func__, buf, strerror(errno));
+    }
+}
+
+/**
+ * Traces a 64-bit integer counter value.  name is used to identify the
+ * counter. This can be used to track how a value changes over time.
+ */
+#define ATRACE_INT64(name, value) atrace_int64(ATRACE_TAG, name, value)
+static inline void atrace_int64(uint64_t tag, const char* name, int64_t value)
+{
+    if (atrace_is_tag_enabled(tag)) {
+        char buf[ATRACE_MESSAGE_LENGTH];
+        ssize_t len;
+
+        len = snprintf(buf, ATRACE_MESSAGE_LENGTH, "C|%d|%s|%" PRId64 " " CAMERA_PRId64,
+                       static_cast<int>(getpid()), name, value);
+        if (write(atrace_marker_fd, buf, len) != len)
+            ATRACE_LOGE("atrace %s write %s error: %s!\n", __func__, buf, strerror(errno));
+    }
+}
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/iutils/Utils.cpp b/camera/hal/intel/ipu6/src/iutils/Utils.cpp
new file mode 100644
index 000000000000..11dcdfc69e46
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/iutils/Utils.cpp
@@ -0,0 +1,740 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "Utils"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <dlfcn.h>
+#include <dirent.h>
+#include <iostream>
+#include <fstream>
+#include <sstream>
+
+#include "PlatformData.h"
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+#include "linux/media-bus-format.h"
+#include "linux/ipu-isys.h"
+
+using std::string;
+
+namespace icamera {
+
+int CameraUtils::getFileContent(const char* filename, char* buffer, int maxSize) {
+
+    std::ifstream stream(filename);
+
+    stream.seekg(0, std::ios::end);
+    long copyLength = stream.tellg();
+    stream.seekg(0, std::ios::beg);
+
+    if (copyLength > maxSize) {
+        copyLength = maxSize;
+    }
+
+    stream.read(buffer, copyLength);
+    return copyLength;
+}
+
+#define GET_FOURCC_FMT(a, b, c, d) ((uint32_t)(d) | ((uint32_t)(c) << 8) \
+                                   | ((uint32_t)(b) << 16) | ((uint32_t)(a) << 24))
+
+enum FormatType {
+    FORMAT_RAW,
+    FORMAT_RAW_VEC,
+    FORMAT_YUV,
+    FORMAT_YUV_VEC,
+    FORMAT_RGB,
+    FORMAT_MBUS,
+    FORMAT_JPEG,
+    FORMAT_FOURCC,
+};
+
+struct FormatInfo {
+    int pixelCode;
+    const char* fullName;
+    const char* shortName;
+    int bpp;
+    FormatType type;
+};
+
+static const FormatInfo gFormatMapping[] = {
+    { V4L2_PIX_FMT_GREY, "V4L2_PIX_FMT_GREY", "GREY", 8, FORMAT_RAW },
+
+    { V4L2_PIX_FMT_SBGGR8, "V4L2_PIX_FMT_SBGGR8", "BGGR8", 8, FORMAT_RAW },
+    { V4L2_PIX_FMT_SGBRG8, "V4L2_PIX_FMT_SGBRG8", "GBRG8", 8, FORMAT_RAW },
+    { V4L2_PIX_FMT_SGRBG8, "V4L2_PIX_FMT_SGRBG8", "GRBG8", 8, FORMAT_RAW },
+    { V4L2_PIX_FMT_SRGGB8, "V4L2_PIX_FMT_SRGGB8", "RGGB8", 8, FORMAT_RAW },
+
+    { V4L2_PIX_FMT_SBGGR10, "V4L2_PIX_FMT_SBGGR10", "BGGR10", 16, FORMAT_RAW },
+    { V4L2_PIX_FMT_SGBRG10, "V4L2_PIX_FMT_SGBRG10", "GBRG10", 16, FORMAT_RAW },
+    { V4L2_PIX_FMT_SGRBG10, "V4L2_PIX_FMT_SGRBG10", "GRBG10", 16, FORMAT_RAW },
+    { V4L2_PIX_FMT_SRGGB10, "V4L2_PIX_FMT_SRGGB10", "RGGB10", 16, FORMAT_RAW },
+
+    { V4L2_PIX_FMT_SBGGR12, "V4L2_PIX_FMT_SBGGR12", "BGGR12", 16, FORMAT_RAW },
+    { V4L2_PIX_FMT_SGBRG12, "V4L2_PIX_FMT_SGBRG12", "GBRG12", 16, FORMAT_RAW },
+    { V4L2_PIX_FMT_SGRBG12, "V4L2_PIX_FMT_SGRBG12", "GRBG12", 16, FORMAT_RAW },
+    { V4L2_PIX_FMT_SRGGB12, "V4L2_PIX_FMT_SRGGB12", "RGGB12", 16, FORMAT_RAW },
+
+    { V4L2_PIX_FMT_SBGGR10P, "V4L2_PIX_FMT_SBGGR10P", "BGGR10P", 10, FORMAT_RAW },
+    { V4L2_PIX_FMT_SGBRG10P, "V4L2_PIX_FMT_SGBRG10P", "GBRG10P", 10, FORMAT_RAW },
+    { V4L2_PIX_FMT_SGRBG10P, "V4L2_PIX_FMT_SGRBG10P", "GRBG10P", 10, FORMAT_RAW },
+    { V4L2_PIX_FMT_SRGGB10P, "V4L2_PIX_FMT_SRGGB10P", "RGGB10P", 10, FORMAT_RAW },
+
+    { V4L2_PIX_FMT_NV12, "V4L2_PIX_FMT_NV12", "NV12", 12, FORMAT_YUV },
+    { V4L2_PIX_FMT_NV21, "V4L2_PIX_FMT_NV21", "NV21", 12, FORMAT_YUV },
+    { V4L2_PIX_FMT_NV16, "V4L2_PIX_FMT_NV16", "NV16", 16, FORMAT_YUV },
+    { V4L2_PIX_FMT_YUYV, "V4L2_PIX_FMT_YUYV", "YUYV", 16, FORMAT_YUV },
+    { V4L2_PIX_FMT_UYVY, "V4L2_PIX_FMT_UYVY", "UYVY", 16, FORMAT_YUV },
+
+    { V4L2_PIX_FMT_YUV420, "V4L2_PIX_FMT_YUV420", "YUV420", 12, FORMAT_YUV },
+    { V4L2_PIX_FMT_YVU420, "V4L2_PIX_FMT_YVU420", "YVU420", 12, FORMAT_YUV },
+    { V4L2_PIX_FMT_YUV422P, "V4L2_PIX_FMT_YUV422P", "YUV422P", 16, FORMAT_YUV },
+
+    { V4L2_PIX_FMT_BGR24, "V4L2_PIX_FMT_BGR24", "BGR24", 24, FORMAT_RGB },
+    { V4L2_PIX_FMT_BGR32, "V4L2_PIX_FMT_BGR32", "BGR32", 32, FORMAT_RGB },
+    { V4L2_PIX_FMT_RGB24, "V4L2_PIX_FMT_RGB24", "RGB24", 24, FORMAT_RGB },
+    { V4L2_PIX_FMT_RGB32, "V4L2_PIX_FMT_RGB32", "RGB32", 32, FORMAT_RGB },
+    { V4L2_PIX_FMT_XBGR32, "V4L2_PIX_FMT_XBGR32", "XBGR32", 32, FORMAT_RGB },
+    { V4L2_PIX_FMT_XRGB32, "V4L2_PIX_FMT_XRGB32", "XRGB32", 32, FORMAT_RGB },
+    { V4L2_PIX_FMT_RGB565, "V4L2_PIX_FMT_RGB565", "RGB565", 16, FORMAT_RGB },
+
+    { V4L2_PIX_FMT_JPEG, "V4L2_PIX_FMT_JPEG", "JPG", 0, FORMAT_JPEG },
+
+    { V4L2_MBUS_FMT_SBGGR12_1X12, "V4L2_MBUS_FMT_SBGGR12_1X12", "SBGGR12_1X12", 12, FORMAT_MBUS },
+    { V4L2_MBUS_FMT_SGBRG12_1X12, "V4L2_MBUS_FMT_SGBRG12_1X12", "SGBRG12_1X12", 12, FORMAT_MBUS },
+    { V4L2_MBUS_FMT_SGRBG12_1X12, "V4L2_MBUS_FMT_SGRBG12_1X12", "SGRBG12_1X12", 12, FORMAT_MBUS },
+    { V4L2_MBUS_FMT_SRGGB12_1X12, "V4L2_MBUS_FMT_SRGGB12_1X12", "SRGGB12_1X12", 12, FORMAT_MBUS },
+
+    { V4L2_MBUS_FMT_SBGGR10_1X10, "V4L2_MBUS_FMT_SBGGR10_1X10", "SBGGR10_1X10", 10, FORMAT_MBUS },
+    { V4L2_MBUS_FMT_SGBRG10_1X10, "V4L2_MBUS_FMT_SGBRG10_1X10", "SGBRG10_1X10", 10, FORMAT_MBUS },
+    { V4L2_MBUS_FMT_SGRBG10_1X10, "V4L2_MBUS_FMT_SGRBG10_1X10", "SGRBG10_1X10", 10, FORMAT_MBUS },
+    { V4L2_MBUS_FMT_SRGGB10_1X10, "V4L2_MBUS_FMT_SRGGB10_1X10", "SRGGB10_1X10", 10, FORMAT_MBUS },
+
+    { V4L2_MBUS_FMT_SBGGR8_1X8, "V4L2_MBUS_FMT_SBGGR8_1X8", "SBGGR8_1X8", 8, FORMAT_MBUS },
+    { V4L2_MBUS_FMT_SGBRG8_1X8, "V4L2_MBUS_FMT_SGBRG8_1X8", "SGBRG8_1X8", 8, FORMAT_MBUS },
+    { V4L2_MBUS_FMT_SGRBG8_1X8, "V4L2_MBUS_FMT_SGRBG8_1X8", "SGRBG8_1X8", 8, FORMAT_MBUS },
+    { V4L2_MBUS_FMT_SRGGB8_1X8, "V4L2_MBUS_FMT_SRGGB8_1X8", "SRGGB8_1X8", 8, FORMAT_MBUS },
+
+    { V4L2_MBUS_FMT_UYVY8_1X16, "V4L2_MBUS_FMT_UYVY8_1X16", "UYVY8_1X16", 16, FORMAT_MBUS },
+    { V4L2_MBUS_FMT_YUYV8_1X16, "V4L2_MBUS_FMT_YUYV8_1X16", "YUYV8_1X16", 16, FORMAT_MBUS },
+    { V4L2_MBUS_FMT_UYVY8_2X8, "V4L2_MBUS_FMT_UYVY8_2X8","UYVY8_2X8", 8, FORMAT_MBUS},
+
+    { MEDIA_BUS_FMT_RGB888_1X24, "MEDIA_BUS_FMT_RGB888_1X24", "RGB888_1X24", 0, FORMAT_MBUS },
+    { MEDIA_BUS_FMT_RGB565_1X16, "MEDIA_BUS_FMT_RGB565_1X16", "RGB565_1X16", 0, FORMAT_MBUS },
+    { MEDIA_BUS_FMT_YUYV12_1X24, "MEDIA_BUS_FMT_YUYV12_1X24", "YUYV12_1X24", 0, FORMAT_MBUS },
+    { MEDIA_BUS_FMT_SGRBG10_1X10, "MEDIA_BUS_FMT_SGRBG10_1X10", "SGRBG10_1X10", 0, FORMAT_MBUS },
+
+    { MEDIA_BUS_FMT_RGB888_1X32_PADHI, "MEDIA_BUS_FMT_RGB888_1X32_PADHI", "RGB888_1X32_PADHI", 0, FORMAT_MBUS },
+
+    { V4L2_FMT_IPU_ISYS_META, "V4L2_FMT_IPU_ISYS_META", "META_DATA", 0, FORMAT_MBUS },
+
+    { GET_FOURCC_FMT('y','0','3','2'), "y032", "y032", 24, FORMAT_FOURCC },
+    { GET_FOURCC_FMT('N','V','1','2'), "YUV420_8_SP", "NV12", 12, FORMAT_FOURCC },
+    { GET_FOURCC_FMT('I','Y','U','V'), "IYUV", "IYUV", 12, FORMAT_FOURCC },
+    { GET_FOURCC_FMT('b','V','0','K'), "bV0K", "bV0K", 16, FORMAT_FOURCC },
+    { GET_FOURCC_FMT('b','V','0','G'), "bV0G", "bV0G", 16, FORMAT_FOURCC },
+    { GET_FOURCC_FMT('V','4','2','0'), "YUV420_10_PL", "V420", 24, FORMAT_FOURCC },
+    { GET_FOURCC_FMT('B','A','1','0'), "BA10", "BA10", 16, FORMAT_FOURCC },
+    { GET_FOURCC_FMT('B','A','1','2'), "BA12", "BA12", 16, FORMAT_FOURCC },
+    { GET_FOURCC_FMT('G','R','1','0'), "GR10", "GR10", 16, FORMAT_FOURCC },
+    { GET_FOURCC_FMT('C','S','L','6'), "GRBG_12_LI", "CSL6", 15, FORMAT_FOURCC },
+    { GET_FOURCC_FMT('P','0','1','0'), "P010", "P010", 24, FORMAT_FOURCC },
+    { GET_FOURCC_FMT('Y','U','Y','2'), "YUY2", "YUY2", 16, FORMAT_FOURCC },
+    { GET_FOURCC_FMT('G','R','B','G'), "GRBG", "GRBG", 8, FORMAT_FOURCC },
+};
+
+struct TuningModeStringInfo {
+    TuningMode mode;
+    const char *str;
+};
+
+static const TuningModeStringInfo TuningModeStringInfoTable[] = {
+    { TUNING_MODE_VIDEO,               "VIDEO" },
+    { TUNING_MODE_VIDEO_ULL,           "VIDEO-ULL" },
+    { TUNING_MODE_VIDEO_CUSTOM_AIC,    "VIDEO-CUSTOM_AIC" },
+    { TUNING_MODE_VIDEO_LL,            "VIDEO-LL" },
+    { TUNING_MODE_VIDEO_REAR_VIEW,     "VIDEO-REAR-VIEW" },
+    { TUNING_MODE_VIDEO_HITCH_VIEW,    "VIDEO-HITCH-VIEW" },
+    { TUNING_MODE_STILL_CAPTURE,       "STILL_CAPTURE" },
+};
+
+const char *CameraUtils::tuningMode2String(TuningMode mode)
+{
+    int size = ARRAY_SIZE(TuningModeStringInfoTable);
+    for (int i = 0; i < size; i++) {
+        if (TuningModeStringInfoTable[i].mode == mode) {
+            return TuningModeStringInfoTable[i].str;
+        }
+    }
+    LOGW("Invalid TuningMode %d, use string VIDEO as default", mode);
+    return TuningModeStringInfoTable[0].str;
+}
+
+TuningMode CameraUtils::string2TuningMode(const char *str)
+{
+    int size = ARRAY_SIZE(TuningModeStringInfoTable);
+    for (int i = 0; i < size; i++) {
+        if (strcmp(TuningModeStringInfoTable[i].str, str) == 0) {
+            return TuningModeStringInfoTable[i].mode;
+        }
+    }
+    LOGW("Invalid TuningMode string %s, use TUNING_MODE_VIDEO as default", str);
+    return TuningModeStringInfoTable[0].mode;
+}
+
+const char *CameraUtils::pixelCode2String(int code)
+{
+    int size = ARRAY_SIZE(gFormatMapping);
+    for (int i = 0; i < size; i++) {
+        if (gFormatMapping[i].pixelCode == code) {
+            return gFormatMapping[i].fullName;
+        }
+    }
+
+    LOGE("Invalid Pixel Format: %d", code);
+    return "INVALID FORMAT";
+}
+
+int CameraUtils::string2PixelCode(const char *code)
+{
+    CheckError(code == nullptr, -1, "Invalid null pixel format.");
+
+    int size = ARRAY_SIZE(gFormatMapping);
+    for (int i = 0; i < size; i++) {
+        if (strcmp(gFormatMapping[i].fullName, code) == 0) {
+            return gFormatMapping[i].pixelCode;
+        }
+    }
+
+    LOGE("Invalid Pixel Format: %s", code);
+    return -1;
+}
+
+int CameraUtils::string2IaFourccCode(const char *code)
+{
+    CheckError(code == nullptr, -1, "Invalid null pixel format.");
+
+    int size = ARRAY_SIZE(gFormatMapping);
+    for (int i = 0; i < size; i++) {
+        if (gFormatMapping[i].type == FORMAT_FOURCC){
+            if (!strcmp(gFormatMapping[i].fullName, code) ||
+                 !strcmp(gFormatMapping[i].shortName, code)) {
+                return gFormatMapping[i].pixelCode;
+            }
+        }
+    }
+
+    LOGE("Invalid Pixel Format: %s", code);
+    return -1;
+}
+
+const string CameraUtils::fourcc2String(int format4cc)
+{
+    char fourccBuf[5];
+    CLEAR(fourccBuf);
+    snprintf(fourccBuf, sizeof(fourccBuf), "%c%c%c%c", (format4cc >> 24) & 0xff,
+            (format4cc >> 16) & 0xff, (format4cc >> 8) & 0xff, format4cc & 0xff);
+
+    return string(fourccBuf);
+}
+
+std::string CameraUtils::format2string(int format)
+{
+    int size = ARRAY_SIZE(gFormatMapping);
+    for (int i = 0; i < size; i++) {
+        if (gFormatMapping[i].pixelCode == format) {
+            return std::string(gFormatMapping[i].shortName);
+        }
+    }
+
+    LOG2("%s, Not in our format list :%x", __func__, format);
+    return fourcc2String(format);
+}
+
+unsigned int CameraUtils::fourcc2UL(char *str4cc)
+{
+    CheckError(str4cc == nullptr, 0, "Invalid null string.");
+    CheckError(strlen(str4cc) != 4, 0, "Invalid string %s, should be 4cc.", str4cc);
+
+    return FOURCC_TO_UL(str4cc[0], str4cc[1], str4cc[2], str4cc[3]);
+}
+
+bool CameraUtils::isPlanarFormat(int format)
+{
+    return (format == V4L2_PIX_FMT_NV12 || format == V4L2_PIX_FMT_NV21
+         || format == V4L2_PIX_FMT_YUV420 || format == V4L2_PIX_FMT_YVU420
+         || format == V4L2_PIX_FMT_YUV422P || format == V4L2_PIX_FMT_NV16);
+}
+
+bool CameraUtils::isRaw(int format)
+{
+    int size = ARRAY_SIZE(gFormatMapping);
+    for (int i = 0; i < size; i++) {
+        if (gFormatMapping[i].pixelCode == format) {
+            // Both normal raw and vector raw treated as raw here.
+            return gFormatMapping[i].type == FORMAT_RAW_VEC || gFormatMapping[i].type == FORMAT_RAW;
+        }
+    }
+
+    return false;
+}
+
+int CameraUtils::getBpp(int format)
+{
+    int size = ARRAY_SIZE(gFormatMapping);
+    for (int i = 0; i < size; i++) {
+        if (gFormatMapping[i].pixelCode == format) {
+            return gFormatMapping[i].bpp;
+        }
+    }
+
+    LOGE("There is no bpp supplied for format %s", pixelCode2String(format));
+    return -1;
+}
+
+/**
+ * Get the stride which is also known as aligned bype per line in some context.
+ * Mainly used for locate the start of next line.
+ */
+int CameraUtils::getStride(int format, int width)
+{
+    int bpl = width * getBpp(format) / 8;
+    if (isPlanarFormat(format)) {
+        bpl = width;
+    }
+    return ALIGN_64(bpl);
+}
+
+/*
+ * Calc frame size for compression
+ */
+int CameraUtils::getCompressedFrameSize(int format, int width, int height)
+{
+   int alignedBpl = getStride(format, width);
+   int alignedHeight, imageBufferSize, frameSize;
+
+   switch (format) {
+       case V4L2_PIX_FMT_SBGGR8:
+       case V4L2_PIX_FMT_SGBRG8:
+       case V4L2_PIX_FMT_SGRBG8:
+       case V4L2_PIX_FMT_SRGGB8:
+       case V4L2_PIX_FMT_SBGGR10:
+       case V4L2_PIX_FMT_SGBRG10:
+       case V4L2_PIX_FMT_SGRBG10:
+       case V4L2_PIX_FMT_SRGGB10:
+       {
+           alignedBpl = ALIGN(alignedBpl, ISYS_COMPRESSION_STRIDE_ALIGNMENT_BYTES);
+           alignedHeight = ALIGN(height, ISYS_COMPRESSION_HEIGHT_ALIGNMENT);
+           imageBufferSize = ALIGN(alignedBpl * alignedHeight, ISYS_COMPRESSION_PAGE_SIZE);
+           int singlePlanarTileStatusSize = CAMHAL_CEIL_DIV(((alignedBpl * alignedHeight / ISYS_COMPRESSION_TILE_SIZE_BYTES) *
+                                                                                               ISYS_COMPRESSION_TILE_STATUS_BITS), 8);
+           int singleTileStatusSize = ALIGN(singlePlanarTileStatusSize, ISYS_COMPRESSION_PAGE_SIZE);
+           LOG1("@%s: format:%s, aligned stride:%d, buffer height:%d, pixel buffer size:%d, single planner TS size:%d",
+                __func__, pixelCode2String(format), alignedBpl, alignedHeight, imageBufferSize, singleTileStatusSize);
+           frameSize = imageBufferSize + singleTileStatusSize;
+           break;
+       }
+       case GET_FOURCC_FMT('V','4','2','0'):
+       case GET_FOURCC_FMT('I','Y','U','V'):
+       {
+           //alignedBpl needs accurate stride, not equivalent value from getStride()
+           alignedBpl = (format == GET_FOURCC_FMT('V','4','2','0')) ? width * 2 : width;
+           alignedBpl = ALIGN(alignedBpl, PSYS_COMPRESSION_PSA_Y_STRIDE_ALIGNMENT);
+           alignedHeight = ALIGN(height, PSYS_COMPRESSION_PSA_HEIGHT_ALIGNMENT);
+           int alignBplUV = ALIGN(alignedBpl / UV_STRIDE_DIVIDER, PSYS_COMPRESSION_PSA_UV_STRIDE_ALIGNMENT);
+           int alignHeightUV = ALIGN(alignedHeight / UV_HEIGHT_DIVIDER, PSYS_COMPRESSION_PSA_HEIGHT_ALIGNMENT);
+           imageBufferSize = ALIGN((alignedBpl * alignedHeight + alignBplUV * alignHeightUV * 2), PSYS_COMPRESSION_PAGE_SIZE);
+
+           int planarYTileStatus = CAMHAL_CEIL_DIV((alignedBpl * alignedHeight / TILE_SIZE_YUV420_Y) *
+                                                                                   TILE_STATUS_BITS_YUV420_Y, 8);
+           planarYTileStatus = ALIGN(planarYTileStatus, PSYS_COMPRESSION_PAGE_SIZE);
+           int planarUVTileStatus = CAMHAL_CEIL_DIV((alignBplUV * alignHeightUV / TILE_SIZE_YUV420_Y) *
+                                                                                   TILE_STATUS_BITS_YUV420_Y, 8);
+           planarUVTileStatus = ALIGN(planarUVTileStatus, PSYS_COMPRESSION_PAGE_SIZE);
+
+           LOG1("@%s: format:%s, stride:%d, height:%d, imageSize:%d, tile_status_Y:%d, two tile_status_UV:%d",
+                       __func__, pixelCode2String(format), alignedBpl, alignedHeight,
+                       imageBufferSize, planarYTileStatus, planarUVTileStatus*2);
+           frameSize = imageBufferSize + planarYTileStatus + planarUVTileStatus * 2;
+           break;
+       }
+       case V4L2_PIX_FMT_NV12:
+       {
+           int bpl = width;
+           alignedBpl = ALIGN(bpl, PSYS_COMPRESSION_OFS_STRIDE_ALIGNMENT);
+           alignedHeight = ALIGN(height, PSYS_COMPRESSION_OFS_LINEAR_HEIGHT_ALIGNMENT);
+           int alignedHeightUV = ALIGN(alignedHeight / UV_HEIGHT_DIVIDER, PSYS_COMPRESSION_OFS_LINEAR_HEIGHT_ALIGNMENT);
+           int imageBufferSize = ALIGN(alignedBpl * (alignedHeight + alignedHeightUV), PSYS_COMPRESSION_PAGE_SIZE);
+
+           int planarYTileStatus = CAMHAL_CEIL_DIV((alignedBpl *  alignedHeight / TILE_SIZE_OFS8_10_LINEAR) *
+                                                                                   TILE_STATUS_BITS_OFS8_10_LINEAR, 8);
+           planarYTileStatus = ALIGN(planarYTileStatus, PSYS_COMPRESSION_PAGE_SIZE);
+           int planarUVTileStatus = CAMHAL_CEIL_DIV((alignedBpl * alignedHeightUV / TILE_SIZE_OFS8_10_LINEAR) *
+                                                                                   TILE_STATUS_BITS_OFS8_10_LINEAR, 8);
+           planarUVTileStatus = ALIGN(planarUVTileStatus, PSYS_COMPRESSION_PAGE_SIZE);
+
+           LOG1("@%s: format: %s, stride:%d, height:%d, imageSize:%d, tile_status_Y:%d, tile_status_UV:%d",
+                    __func__, pixelCode2String(format), alignedBpl, alignedHeight, imageBufferSize, planarYTileStatus, planarUVTileStatus);
+           frameSize = imageBufferSize + planarYTileStatus + planarUVTileStatus;
+           break;
+       }
+       default:
+           LOGE("@%s: unexpected format 0x%x in string %s, unsupported compression format", __func__, format, pixelCode2String(format));
+           frameSize = 0;
+           break;
+    }
+
+    return frameSize;
+}
+
+/*
+ * Calc frame buffer size.
+ *
+ *  Why alignment is 64?
+ *  The IPU DMA unit must transimit at leat 64 bytes one time.
+ *
+ *  Why need extra size? It's due to a hardware issue: the DMA unit is a power of
+ *  two, and a line should be transferred as few units as possible.
+ *  The result is that up to line length more data than the image size
+ *  may be transferred to memory after the image.
+ *
+ *  Another limition is the GDA(Global Dynamic Allocator) allocation unit size(1024). For low
+ *  resolution it gives a bigger number. Use larger one to avoid
+ *  memory corruption.
+ *  for example: 320x480 UVVY, which bpl is 640, less than 1024, in this case, driver will
+ *  allocate 1024 bytes for the last line.
+ */
+int CameraUtils::getFrameSize(int format, int width, int height, bool needAlignedHeight, bool needExtraSize, bool needCompression)
+{
+    LOG1("@%s get buffer size for %s %dx%d", __func__, pixelCode2String(format), width, height);
+    LOG1("@%s needAlignedHeight:%d, needExtraSize:%d, needCompression: %d", __func__,
+              needAlignedHeight, needExtraSize, needCompression);
+
+    int alignedBpl = getStride(format, width);
+
+    // Get frame size with aligned height taking in count for internal buffers.
+    // To garantee PSYS kernel like GDC always get enough buffer size to process.
+    // This is to satisfy the PSYS kernel, like GDC, input alignment requirement.
+    if (needAlignedHeight) {
+        height = ALIGN_64(height);
+        LOG1("@%s buffer aligned height %d", __func__, height);
+    }
+    int bufferHeight = isPlanarFormat(format) ? (height * getBpp(format) / 8) : height;
+
+    if (!needExtraSize) {
+        LOG1("%s: no need extra size, frame size is %d", __func__, alignedBpl * bufferHeight);
+        return alignedBpl * bufferHeight;
+    }
+
+    if (needCompression) {
+        int compressedFrameSize = getCompressedFrameSize(format, width, height);
+        LOG1("%s: Compressed frame size %d for original format: %s",
+                   __func__, compressedFrameSize, pixelCode2String(format));
+        return compressedFrameSize;
+    }
+
+    // Extra size should be at least one alignedBpl
+    int extraSize = isPlanarFormat(format) ? alignedBpl * getBpp(format) / 8 : alignedBpl;
+    extraSize = std::max(extraSize , 1024);
+
+    return alignedBpl * bufferHeight + extraSize;
+}
+
+int CameraUtils::getNumOfPlanes(int format)
+{
+    switch(format) {
+        case V4L2_PIX_FMT_NV12:
+        case V4L2_PIX_FMT_SGRBG8:
+        case V4L2_FMT_IPU_ISYS_META:
+            return 1;
+        //Add more when needed...
+        default:
+            return 1;
+    }
+}
+
+void CameraUtils::getDeviceName(const char* entityName, string& deviceNodeName, bool isSubDev)
+{
+
+    const char *filePrefix = "video";
+    const char *dirPath = "/sys/class/video4linux/";
+    if (isSubDev)
+        filePrefix = "v4l-subdev";
+
+    DIR *dp = opendir(dirPath);
+    CheckError((dp == nullptr), VOID_VALUE, "@%s, Fail open : %s", __func__, dirPath);
+
+    struct dirent *dirp = nullptr;
+    while ((dirp = readdir(dp)) != nullptr) {
+        if ((dirp->d_type == DT_LNK) && (strncmp(dirp->d_name, filePrefix, strlen(filePrefix)) == 0)) {
+            string subDeviceName = dirPath;
+            subDeviceName += dirp->d_name;
+            subDeviceName += "/name";
+            int fd = open(subDeviceName.c_str(), O_RDONLY);
+            CheckError((fd < 0), VOID_VALUE, "@%s, open file %s failed. err: %s",
+                  __func__, subDeviceName.c_str(), strerror(errno));
+
+            char buf[128] = {'\0'};
+            int len = read(fd, buf, sizeof(buf));
+            close(fd);
+            len--; // remove "\n"
+            if (len == (int)strlen(entityName) && memcmp(buf, entityName, len) == 0) {
+                deviceNodeName = "/dev/";
+                deviceNodeName += dirp->d_name;
+                break;
+            }
+        }
+    }
+    closedir(dp);
+}
+
+void CameraUtils::getSubDeviceName(const char* entityName, string& deviceNodeName)
+{
+     getDeviceName(entityName, deviceNodeName, true);
+}
+
+int CameraUtils::getInterlaceHeight(int field, int height)
+{
+    if (SINGLE_FIELD(field))
+        return height/2;
+    else
+        return height;
+}
+
+bool CameraUtils::isMultiExposureCase(TuningMode tuningMode)
+{
+    LOG2("%s, tuningMode %d", __func__, tuningMode);
+
+    return false;
+}
+
+bool CameraUtils::isUllPsysPipe(TuningMode tuningMode)
+{
+    return (tuningMode == TUNING_MODE_VIDEO_ULL ||
+            tuningMode == TUNING_MODE_VIDEO_CUSTOM_AIC);
+}
+
+ConfigMode CameraUtils::getConfigModeByName(const char* ConfigName)
+{
+    ConfigMode configMode = CAMERA_STREAM_CONFIGURATION_MODE_END;
+
+    if (ConfigName == nullptr) {
+        LOGE("%s, the ConfigName is nullptr", __func__);
+    } else if (strcmp(ConfigName, "AUTO") == 0) {
+        configMode = CAMERA_STREAM_CONFIGURATION_MODE_AUTO;
+    } else if (strcmp(ConfigName, "ULL") == 0) {
+        configMode = CAMERA_STREAM_CONFIGURATION_MODE_ULL;
+    } else if (strcmp(ConfigName, "NORMAL") == 0) {
+        configMode = CAMERA_STREAM_CONFIGURATION_MODE_NORMAL;
+    } else if (strcmp(ConfigName, "HIGH_SPEED") == 0) {
+        configMode = CAMERA_STREAM_CONFIGURATION_MODE_CONSTRAINED_HIGH_SPEED;
+    } else if (strcmp(ConfigName, "CUSTOM_AIC") == 0) {
+        configMode = CAMERA_STREAM_CONFIGURATION_MODE_CUSTOM_AIC;
+    } else if (strcmp(ConfigName, "VIDEO_LL") == 0) {
+        configMode = CAMERA_STREAM_CONFIGURATION_MODE_VIDEO_LL;
+    } else if (strcmp(ConfigName, "STILL_CAPTURE") == 0) {
+        configMode = CAMERA_STREAM_CONFIGURATION_MODE_STILL_CAPTURE;
+    } else if (strcmp(ConfigName, "NONE") == 0) {
+        LOG1("%s, the detected internal 'NONE' ConfigName", __func__);
+    } else {
+        configMode = CAMERA_STREAM_CONFIGURATION_MODE_NORMAL;
+        LOG2("%s, the ConfigName %s is not supported, use normal as default", __func__, ConfigName);
+    }
+
+    LOG2("%s, configMode = %d", __func__, configMode);
+    return configMode;
+}
+
+void CameraUtils::getConfigModeFromString(string str, std::vector<ConfigMode> &cfgModes)
+{
+    bool split = true;
+    ConfigMode mode;
+    string resultStr, modeStr = str;
+
+    while(split) {
+        size_t pos = 0;
+        if ((pos = modeStr.find(",")) == string::npos) {
+            mode = getConfigModeByName(modeStr.c_str());
+            split = false;
+        } else {
+            resultStr = modeStr.substr(0, pos);
+            modeStr = modeStr.substr(pos + 1);
+            mode = getConfigModeByName(resultStr.c_str());
+        }
+        cfgModes.push_back(mode);
+    }
+}
+
+ConfigMode CameraUtils::getConfigModeBySceneMode(camera_scene_mode_t sceneMode)
+{
+    ConfigMode configMode = CAMERA_STREAM_CONFIGURATION_MODE_END;
+
+    switch(sceneMode) {
+        case SCENE_MODE_NORMAL:
+            configMode = CAMERA_STREAM_CONFIGURATION_MODE_NORMAL;
+            break;
+        case SCENE_MODE_ULL:
+            configMode = CAMERA_STREAM_CONFIGURATION_MODE_ULL;
+            break;
+        case SCENE_MODE_CUSTOM_AIC:
+            configMode = CAMERA_STREAM_CONFIGURATION_MODE_CUSTOM_AIC;
+            break;
+        case SCENE_MODE_VIDEO_LL:
+            configMode = CAMERA_STREAM_CONFIGURATION_MODE_VIDEO_LL;
+            break;
+        default:
+            // There is no corresponding ConfigMode for some scene.
+            LOG2("there is no corresponding ConfigMode for scene %d", sceneMode);
+            break;
+    }
+    return configMode;
+}
+
+camera_scene_mode_t CameraUtils::getSceneModeByName(const char* sceneName)
+{
+    if (sceneName == nullptr) return SCENE_MODE_MAX;
+    else if (strcmp(sceneName, "AUTO") == 0) return SCENE_MODE_AUTO;
+    else if (strcmp(sceneName, "ULL") == 0) return SCENE_MODE_ULL;
+    else if (strcmp(sceneName, "VIDEO_LL") == 0) return SCENE_MODE_VIDEO_LL;
+    else if (strcmp(sceneName, "NORMAL") == 0) return SCENE_MODE_NORMAL;
+    else if (strcmp(sceneName, "CUSTOM_AIC") == 0) return SCENE_MODE_CUSTOM_AIC;
+
+    return SCENE_MODE_MAX;
+}
+
+camera_awb_mode_t CameraUtils::getAwbModeByName(const char* awbName)
+{
+    if (awbName == nullptr) return AWB_MODE_MAX;
+    else if (strcmp(awbName, "AUTO") == 0) return AWB_MODE_AUTO;
+    else if (strcmp(awbName, "INCANDESCENT") == 0) return AWB_MODE_INCANDESCENT;
+    else if (strcmp(awbName, "FLUORESCENT") == 0) return AWB_MODE_FLUORESCENT;
+    else if (strcmp(awbName, "DAYLIGHT") == 0) return AWB_MODE_DAYLIGHT;
+    else if (strcmp(awbName, "FULL_OVERCAST") == 0) return AWB_MODE_FULL_OVERCAST;
+    else if (strcmp(awbName, "PARTLY_OVERCAST") == 0) return AWB_MODE_PARTLY_OVERCAST;
+    else if (strcmp(awbName, "SUNSET") == 0) return AWB_MODE_SUNSET;
+    else if (strcmp(awbName, "VIDEO_CONFERENCE") == 0) return AWB_MODE_VIDEO_CONFERENCE;
+    else if (strcmp(awbName, "MANUAL_CCT_RANGE") == 0) return AWB_MODE_MANUAL_CCT_RANGE;
+    else if (strcmp(awbName, "MANUAL_WHITE_POINT") == 0) return AWB_MODE_MANUAL_WHITE_POINT;
+    else if (strcmp(awbName, "MANUAL_GAIN") == 0) return AWB_MODE_MANUAL_GAIN;
+    else if (strcmp(awbName, "MANUAL_COLOR_TRANSFORM") == 0) return AWB_MODE_MANUAL_COLOR_TRANSFORM;
+
+    return AWB_MODE_MAX;
+}
+
+unsigned int CameraUtils::getMBusFormat(int cameraId, unsigned int isysFmt)
+{
+    unsigned int pixelCode = 0;
+
+    switch (isysFmt) {
+    case V4L2_PIX_FMT_UYVY:
+    case V4L2_PIX_FMT_NV16:
+        pixelCode = V4L2_MBUS_FMT_UYVY8_1X16;
+        break;
+    case V4L2_PIX_FMT_YUYV:
+        pixelCode = V4L2_MBUS_FMT_YUYV8_1X16;
+        break;
+    case V4L2_PIX_FMT_BGR24:
+    case V4L2_PIX_FMT_XBGR32:
+        pixelCode = MEDIA_BUS_FMT_RGB888_1X24;
+        break;
+    case V4L2_PIX_FMT_RGB565:
+    case V4L2_PIX_FMT_XRGB32:
+        pixelCode = MEDIA_BUS_FMT_RGB565_1X16;
+        break;
+    case V4L2_PIX_FMT_SGRBG8:
+        pixelCode = V4L2_MBUS_FMT_SGRBG8_1X8;
+        break;
+    default:
+        LOGE("No input format to match the output: %s", pixelCode2String(isysFmt));
+        break;
+    }
+
+    return pixelCode;
+}
+
+void* CameraUtils::dlopenLibrary(const char* name, int flags)
+{
+    CheckError((name == nullptr), nullptr, "%s, invalid parameters", __func__);
+
+    void* handle = dlopen(name, flags);
+
+    const char* lError = dlerror();
+    if (lError) {
+        if (handle == nullptr) {
+            LOGW("%s, handle is NULL", __func__);
+        }
+        LOGW("%s, dlopen Error: %s", __func__, lError);
+        return nullptr;
+    }
+
+    LOG1("%s, handle %p, name %s has been opened", __func__, handle, name);
+    return handle;
+}
+
+void* CameraUtils::dlsymLibrary(void* handle, const char* str)
+{
+    CheckError((handle == nullptr || str == nullptr), nullptr, "%s, invalid parameters", __func__);
+
+    void* sym = dlsym(handle, str);
+
+    const char* lError = dlerror();
+    if (lError) {
+        if (sym == nullptr) {
+            LOGW("%s, symbol is nullptr", __func__);
+        }
+        LOGW("%s, dlopen Error: %s", __func__, lError);
+        return nullptr;
+    }
+
+    LOG1("%s, handle %p, str %s has been found", __func__, handle, str);
+    return sym;
+}
+
+int CameraUtils::dlcloseLibrary(void* handle)
+{
+    CheckError((handle == nullptr), BAD_VALUE, "%s, invalid parameters", __func__);
+
+    dlclose(handle);
+    LOG1("%s, handle %p has been closed", __func__, handle);
+    return OK;
+}
+
+std::vector<string> CameraUtils::splitString(const char* srcStr, char delim)
+{
+    std::vector<string> tokens;
+    std::stringstream ss(srcStr);
+    string item;
+
+    for (size_t i = 0; std::getline(ss, item, delim); i++) {
+        tokens.push_back(item);
+    }
+
+    return tokens;
+}
+
+nsecs_t CameraUtils::systemTime()
+{
+    struct timespec t;
+    t.tv_sec = t.tv_nsec = 0;
+    clock_gettime(CLOCK_MONOTONIC, &t);
+    return nsecs_t(t.tv_sec)*1000000000LL + t.tv_nsec;
+}
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/iutils/Utils.h b/camera/hal/intel/ipu6/src/iutils/Utils.h
new file mode 100644
index 000000000000..0bae788fa802
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/iutils/Utils.h
@@ -0,0 +1,277 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <linux/videodev2.h>
+#include <v4l2_device.h>
+
+#include <string.h>
+#include <vector>
+#include <string>
+
+#include "CameraTypes.h"
+
+namespace icamera {
+
+typedef int64_t nsecs_t;
+
+typedef ::cros::V4L2DevicePoller V4L2DevicePoller;
+typedef ::cros::V4L2Device V4L2Device;
+typedef ::cros::V4L2VideoNode V4L2VideoNode;
+typedef ::cros::V4L2Subdevice V4L2Subdevice;
+typedef ::cros::V4L2Buffer V4L2Buffer;
+typedef ::cros::V4L2Format V4L2Format;
+
+#define ALIGN(val, alignment) (((val)+(alignment)-1) & ~((alignment)-1))
+#define ALIGN_64(val) ALIGN(val, 64)
+#define ALIGN_32(val) ALIGN(val, 32)
+#define ALIGN_16(val) ALIGN(val, 16)
+#define ALIGN_8(val)  ALIGN(val, 8)
+
+#define ARRAY_SIZE(array)    (sizeof(array) / sizeof((array)[0]))
+
+#define CLEAR(x) memset (&(x), 0, sizeof (x))
+
+// macro CLIP is used to clip the Number value to between the Min and Max
+#define CLIP(Number, Max, Min)    ((Number) > (Max) ? (Max) : ((Number) < (Min) ? (Min) : (Number)))
+
+#ifndef UNUSED
+#define UNUSED(param) (void)(param)
+#endif
+
+/**
+ * Align to page boundary
+ * \ingroup ia_tools
+ */
+#ifndef PAGE_ALIGN
+#define PAGE_SIZE_U (getpagesize())
+#define PAGE_ALIGN(x)  ALIGN(x, PAGE_SIZE_U)
+#endif
+
+/* Integer round-up division of a with b */
+#define CEIL_DIV(a, b)  ((b) ? (((a) + (b) - 1) / (b)) : 0)
+/* Align a to the upper multiple of b */
+#define CEIL_MUL(a, b)  CEIL_DIV(a, b) * (b)
+
+#define SINGLE_FIELD(field) ((field == V4L2_FIELD_TOP) || (field == V4L2_FIELD_BOTTOM) || \
+                             (field == V4L2_FIELD_ALTERNATE))
+/**
+ * Use to check input parameter and if failed, return err_code and print error message
+ */
+#define VOID_VALUE
+#define CheckError(condition, err_code, err_msg, args...) \
+            do { \
+                if (condition) { \
+                    LOGE(err_msg, ##args);\
+                    return err_code;\
+                }\
+            } while (0)
+
+#define CheckAndClean(condition, err_code, clean, err_msg, args...) \
+            do { \
+                if (condition) { \
+                    LOGE(err_msg, ##args);\
+                    clean;\
+                    return err_code;\
+                }\
+            } while (0)
+
+/**
+ * Use to check input parameter and if failed, return err_code and print warning message,
+ * this should be used for non-vital error checking.
+ */
+#define CheckWarning(condition, err_code, err_msg, args...) \
+            do { \
+                if (condition) { \
+                    LOGW(err_msg, ##args);\
+                    return err_code;\
+                }\
+            } while (0)
+
+// As above but no return.
+#define CheckWarningNoReturn(condition, err_msg, args...) \
+                            do { \
+                                if (condition) { \
+                                    LOGW(err_msg, ##args);\
+                                }\
+                            } while (0)
+
+// macro delete array and set it to null
+#define DELETE_ARRAY_AND_NULLIFY(var) \
+    do { \
+        delete[] (var); \
+        var = nullptr; \
+    } while(0)
+
+/**
+ *  \macro TIMEVAL2NSECS
+ *  Convert timeval struct to value in nanoseconds
+ *  Helper macro to convert timeval struct to nanosecond values stored in a
+ *  long long signed value (equivalent to int64_t)
+ */
+#define TIMEVAL2NSECS(x) (int64_t)((x).tv_sec*1000000000LL + (x).tv_usec*1000LL)
+
+/**
+ *  \macro TIMEVAL2USECS
+ *  Convert timeval struct to value in microseconds
+ *  Helper macro to convert timeval struct to microsecond values stored in a
+ *  long long signed value (equivalent to int64_t)
+ */
+#define TIMEVAL2USECS(x) (int64_t)(((x).tv_sec*1000000000LL + \
+                                    (x).tv_usec*1000LL)/1000LL)
+
+// macro for float comparaion with 0
+#define EPSILON 0.00001
+
+// macro for the MAX FILENAME
+#define MAX_SYS_NAME 64
+#define MAX_TARGET_NAME 256
+
+// A macro to disallow the copy constructor and operator= functions
+// This should be used in the private:declarations for a class
+#ifndef DISALLOW_COPY_AND_ASSIGN
+#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
+    TypeName(const TypeName&) = delete; \
+    TypeName& operator=(const TypeName&) = delete
+#endif
+
+/**
+ *  Maker note maximum sizes
+ *  Section 1 is used for Normal capture
+ *  Section 2 is used for RAW captures
+ */
+#define MAKERNOTE_SECTION1_SIZE 56000
+#define MAKERNOTE_SECTION2_SIZE 110592
+
+// macro for memcpy
+#ifndef MEMCPY_S
+#define MEMCPY_S(dest, dmax, src, smax) memcpy((dest), (src), std::min((size_t)(dmax), (size_t)(smax)))
+#endif
+
+#define STDCOPY(dst, src, size) std::copy((src), ((src) + (size)), (dst))
+
+// macro for isys compression width/height calculation
+#define ISYS_COMPRESSION_STRIDE_ALIGNMENT_BYTES 512
+#define ISYS_COMPRESSION_HEIGHT_ALIGNMENT 1
+#define ISYS_COMPRESSION_PAGE_SIZE 0x1000
+// macro for psys compression width/height calculation
+#define PSYS_COMPRESSION_PSA_Y_STRIDE_ALIGNMENT 256
+#define PSYS_COMPRESSION_PSA_UV_STRIDE_ALIGNMENT 256
+#define PSYS_COMPRESSION_PSA_HEIGHT_ALIGNMENT 2
+#define PSYS_COMPRESSION_OFS_STRIDE_ALIGNMENT 128
+#define PSYS_COMPRESSION_OFS_TILE_HEIGHT_ALIGNMENT 32
+#define PSYS_COMPRESSION_OFS_LINEAR_HEIGHT_ALIGNMENT 2
+#define PSYS_COMPRESSION_PAGE_SIZE 0x1000
+#define UV_STRIDE_DIVIDER 2
+#define UV_HEIGHT_DIVIDER 2
+// tile size definition
+#define ISYS_COMPRESSION_TILE_SIZE_BYTES 512
+#define TILE_SIZE_YUV420_Y 256
+#define TILE_SIZE_YUV420_UV 128
+#define TILE_SIZE_OFS10_12_TILEY 256
+#define TILE_SIZE_OFS8_TILEY 256
+#define TILE_SIZE_OFS8_10_LINEAR 128
+
+//tile status bits definition
+#define ISYS_COMPRESSION_TILE_STATUS_BITS 4
+#define TILE_STATUS_BITS_YUV420_Y 2
+#define TILE_STATUS_BITS_YUV420_UV 1
+#define TILE_STATUS_BITS_OFS_NV12_TILE_Y	 8
+#define TILE_STATUS_BITS_OFS_P010_TILE_Y 8
+#define TILE_STATUS_BITS_OFS8_10_LINEAR 1
+#define TILE_STATUS_BITS_TNR_NV12_LINEAR 4
+
+#define CAMHAL_CEIL_DIV(a,b)   (((a) + (b) - 1) / (b))
+
+#define FOURCC_TO_UL(a,b,c,d) \
+    ((uint32_t)(a) | ((uint32_t)(b)<<8) | ((uint32_t)(c)<<16) | ((uint32_t)(d)<<24))
+
+#define DEFAULT_JPEG_QUALITY   95
+#define DEFAULT_THUMBNAIL_QUALITY 0
+
+//Internal useful tool for format
+namespace CameraUtils {
+
+    int getFileContent(const char* filename, char* buffer, int maxSize);
+
+    const char *tuningMode2String(TuningMode mode);
+
+    TuningMode string2TuningMode(const char *str);
+
+    const char *pixelCode2String(int code);
+
+    int string2PixelCode(const char *code);
+
+    int string2IaFourccCode(const char *code);
+
+    std::string format2string (int format);
+
+    int string2format(const char *str);
+
+    const std::string fourcc2String(int format4cc);
+
+    unsigned int fourcc2UL(char *str4cc);
+
+    bool isPlanarFormat(int format);
+
+    bool isRaw(int format);
+
+    int getBpp(int format);
+
+    int getStride (int format, int width);
+
+    int getCompressedFrameSize(int format, int width, int height);
+
+    int getFrameSize(int format, int width, int height, bool needAlignedHeight = false, bool needExtraSize = true, bool needCompression = false);
+
+    int getNumOfPlanes(int format);
+
+    void getDeviceName(const char* entityName, std::string& deviceNodeName, bool isSubDev = false);
+
+    void getSubDeviceName(const char* entityName, std::string& deviceNodeName);
+
+    int getInterlaceHeight(int field, int height);
+
+    bool isMultiExposureCase(TuningMode tuningMode);
+
+    bool isUllPsysPipe(TuningMode tuningMode);
+
+    ConfigMode getConfigModeByName(const char* ConfigName);
+
+    ConfigMode getConfigModeBySceneMode(camera_scene_mode_t sceneMode);
+
+    void getConfigModeFromString(std::string str, std::vector<ConfigMode> &cfgModes);
+
+    camera_scene_mode_t getSceneModeByName(const char* sceneName);
+
+    camera_awb_mode_t getAwbModeByName(const char* awbName);
+
+    unsigned int getMBusFormat(int cameraId, unsigned int isysFmt);
+
+    void* dlopenLibrary(const char* name, int flags);
+    void* dlsymLibrary(void* handle, const char* str);
+    int dlcloseLibrary(void* handle);
+
+    /**
+     * Spit the given srcStr by delim into a vector of sub strings.
+     */
+    std::vector<std::string> splitString(const char* srcStr, char delim);
+
+    nsecs_t systemTime();
+}
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/jpeg/EXIFMaker.cpp b/camera/hal/intel/ipu6/src/jpeg/EXIFMaker.cpp
new file mode 100644
index 000000000000..259e69ed2b0a
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/jpeg/EXIFMaker.cpp
@@ -0,0 +1,540 @@
+/*
+ * Copyright (C) 2016-2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "EXIFMaker"
+
+#include <limits.h>
+
+#include "EXIFMaker.h"
+
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+#include "ParameterHelper.h"
+
+namespace icamera {
+
+#define DEFAULT_ISO_SPEED 100
+
+EXIFMaker::EXIFMaker() :
+    mExifSize(-1)
+    ,mInitialized(false)
+{
+    LOG1("@%s", __func__);
+    CLEAR(mExifAttributes);
+    mMakernoteSection = new unsigned char[MAKERNOTE_SECTION1_SIZE + MAKERNOTE_SECTION2_SIZE];
+}
+
+EXIFMaker::~EXIFMaker()
+{
+    LOG1("@%s", __func__);
+    delete [] mMakernoteSection;
+}
+
+/**
+ * Fills EXIF data after a picture has been taken to
+ * record the active sensor, 3A and ISP state to EXIF metadata.
+ *
+ * This function is intented to set EXIF tags belonging
+ * to the EXIF "Per Picture Camera Setting" group.
+ *
+ * @arg params active Android HAL parameters
+ */
+void EXIFMaker::pictureTaken(ExifMetaData *exifmetadata)
+{
+    LOG1("@%s", __func__);
+
+    // brightness, -99.99 to 99.99. FFFFFFFF.H means unknown.
+    float brightness;
+    // TODO: The check for getAeManualBrightness of 3A should be moved
+    //       to MetaData class, because the metadata collection happen
+    //       at capture time
+    brightness = 99;
+    mExifAttributes.brightness.num = static_cast<int>(brightness * 100);
+    mExifAttributes.brightness.den = 100;
+    LOG1("EXIF: brightness = %.2f", brightness);
+
+    mExifAttributes.contrast   = 0;
+    mExifAttributes.saturation = 0;
+    mExifAttributes.sharpness  = 0;
+    LOG1("EXIF: contrast=%d, saturation=%d, sharpness=%d (0:normal 1:low 2:high)",
+            mExifAttributes.contrast,
+            mExifAttributes.saturation,
+            mExifAttributes.sharpness);
+
+    mExifAttributes.exposure_program = EXIF_EXPOSURE_PROGRAM_NORMAL;
+    LOG1("EXIF: Exposure Program = Normal");
+    mExifAttributes.exposure_mode = EXIF_EXPOSURE_AUTO;
+    LOG1("EXIF: Exposure Mode = Auto");
+
+    mExifAttributes.iso_speed_rating = DEFAULT_ISO_SPEED;
+
+    LOG1("EXIF: ISO=%d", mExifAttributes.iso_speed_rating);
+    mExifAttributes.metering_mode = EXIF_METERING_AVERAGE;
+    mExifAttributes.white_balance = EXIF_WB_AUTO;
+
+    mExifAttributes.light_source = EXIF_LIGHT_SOURCE_UNKNOWN;
+
+    mExifAttributes.light_source  = EXIF_LIGHT_SOURCE_OTHER_LIGHT_SOURCE;
+
+    mExifAttributes.scene_capture_type = EXIF_SCENE_STANDARD;
+
+    int rotation = exifmetadata->mJpegSetting.orientation;
+    mExifAttributes.orientation = EXIF_ORIENTATION_UP;
+    if (0 == rotation)
+        mExifAttributes.orientation = EXIF_ORIENTATION_UP;
+    else if (90 == rotation)
+        mExifAttributes.orientation = EXIF_ORIENTATION_90;
+    else if (180 == rotation)
+        mExifAttributes.orientation = EXIF_ORIENTATION_180;
+    else if (270 == rotation)
+        mExifAttributes.orientation = EXIF_ORIENTATION_270;
+
+    // Platform has no HW rotation. No swap here
+    //if (rotation % 180 == 90)
+    //    swap(mExifAttributes.width, mExifAttributes.height);
+
+    mExifAttributes.zoom_ratio.num = exifmetadata->zoomRatio;
+    mExifAttributes.zoom_ratio.den = 100;
+    // the unit of subjectDistance is meter, focus distance from 3A is mm.
+    mExifAttributes.subject_distance.num = 0;
+    mExifAttributes.subject_distance.den = 1000;
+    mExifAttributes.custom_rendered = exifmetadata->hdr ?
+        EXIF_CUSTOM_RENDERED_HDR : EXIF_DEF_CUSTOM_RENDERED;
+    LOG2("subject_distance is %d", mExifAttributes.subject_distance.num);
+}
+
+/**
+ * Called when the the camera static configuration is known.
+ *
+ * @arg width: width of the main JPEG picture.
+ * @arg height: height of the main JPEG picture.
+ */
+void EXIFMaker::initialize(int width, int height)
+{
+    /* We clear the exif attributes, so we won't be using some old values
+     * from a previous EXIF generation.
+     */
+    clear();
+
+    // Initialize the mExifAttributes with specific values
+    // time information
+    time_t rawtime;
+    struct tm *timeinfo;
+    time(&rawtime);
+    timeinfo = localtime(&rawtime);
+    if (timeinfo) {
+        strftime((char *)mExifAttributes.date_time, sizeof(mExifAttributes.date_time), "%Y:%m:%d %H:%M:%S", timeinfo);
+        // fields: tm_sec, tm_min, tm_hour, tm_mday, tm_mon, tm_year, tm_wday, tm_yday, tm_isdst, tm_gmtoff, tm_zone
+    } else {
+        LOGW("nullptr timeinfo from localtime(), using defaults...");
+        struct tm tmpTime = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "UTC"};
+        strftime((char *)mExifAttributes.date_time, sizeof(mExifAttributes.date_time), "%Y:%m:%d %H:%M:%S", &tmpTime);
+    }
+
+    // set default subsec time to 1000
+    const char subsecTime[] = "1000";
+    MEMCPY_S((char *)mExifAttributes.subsec_time, sizeof(mExifAttributes.subsec_time), subsecTime, sizeof(subsecTime));
+
+    // conponents configuration.
+    // Default = 4 5 6 0(if RGB uncompressed), 1 2 3 0(other cases)
+    // 0 = does not exist; 1 = Y; 2 = Cb; 3 = Cr; 4 = R; 5 = G; 6 = B; other = reserved
+    mExifAttributes.components_configuration[0] = 1;
+    mExifAttributes.components_configuration[1] = 2;
+    mExifAttributes.components_configuration[2] = 3;
+    mExifAttributes.components_configuration[3] = 0;
+
+    // set default values for fnumber and focal length
+    // (see EXIFMaker::setDriverData() how to override these)
+    mExifAttributes.fnumber.num = EXIF_DEF_FNUMBER_NUM;
+    mExifAttributes.fnumber.den = EXIF_DEF_FNUMBER_DEN;
+    mExifAttributes.focal_length.num = EXIF_DEF_FOCAL_LEN_NUM;
+    mExifAttributes.focal_length.den = EXIF_DEF_FOCAL_LEN_DEN;
+
+    // TODO: should ISO be omitted if the value cannot be trusted?
+    mExifAttributes.iso_speed_rating = DEFAULT_ISO_SPEED;
+
+    mExifAttributes.aperture.den = EXIF_DEF_APEX_DEN;
+    mExifAttributes.aperture.num = EXIF_DEF_APEX_NUM;
+    // max aperture. the smallest F number of the lens. unit is APEX value.
+    mExifAttributes.max_aperture.num = mExifAttributes.aperture.num;
+    mExifAttributes.max_aperture.den = mExifAttributes.aperture.den;
+
+    // subject distance,    0 means distance unknown; (~0) means infinity.
+    mExifAttributes.subject_distance.num = EXIF_DEF_SUBJECT_DISTANCE_UNKNOWN;
+    mExifAttributes.subject_distance.den = 1;
+
+    // light source, 0 means light source unknown
+    mExifAttributes.light_source = 0;
+    // TODO: for awb mode
+
+    // gain control, 0 = none;
+    // 1 = low gain up; 2 = high gain up; 3 = low gain down; 4 = high gain down
+    mExifAttributes.gain_control = 0;
+
+    // contrast, 0 = normal; 1 = soft; 2 = hard; other = reserved
+    mExifAttributes.contrast = EXIF_CONTRAST_NORMAL;
+
+    // saturation, 0 = normal; 1 = Low saturation; 2 = High saturation; other = reserved
+    mExifAttributes.saturation = EXIF_SATURATION_NORMAL;
+
+    // sharpness, 0 = normal; 1 = soft; 2 = hard; other = reserved
+    mExifAttributes.sharpness = EXIF_SHARPNESS_NORMAL;
+
+    // the picture's width and height
+    mExifAttributes.width = width;
+    mExifAttributes.height = height;
+
+    mExifAttributes.orientation = 1;
+
+    mExifAttributes.custom_rendered = EXIF_DEF_CUSTOM_RENDERED;
+
+    // metering mode, 0 = normal; 1 = soft; 2 = hard; other = reserved
+    mExifAttributes.metering_mode = EXIF_METERING_UNKNOWN;
+    mInitialized = true;
+}
+
+void EXIFMaker::initializeLocation(ExifMetaData* metadata)
+{
+    LOG1("@%s", __func__);
+    // GIS information
+    bool gpsEnabled = false;
+    double latitude = metadata->mGpsSetting.latitude;
+    double longitude = metadata->mGpsSetting.longitude;
+    double altitude = metadata->mGpsSetting.altitude;
+    long timestamp = metadata->mGpsSetting.gpsTimeStamp;
+    char* pprocmethod = metadata->mGpsSetting.gpsProcessingMethod;
+
+    //todo: no intel extension for direction, support in future
+    /*
+    const char *pimgdirection = params.get(IntelCameraParameters::KEY_GPS_IMG_DIRECTION);
+    const char *pimgdirectionref = params.get(IntelCameraParameters::KEY_GPS_IMG_DIRECTION_REF);
+
+    double imgdirection = 0.0;
+    if (pimgdirection) {
+        imgdirection = atof(pimgdirection);
+        if ((pimgdirectionref == nullptr)
+            ||((strcmp(pimgdirectionref, IntelCameraParameters::GPS_IMG_DIRECTION_REF_TRUE) != 0)
+            && (strcmp(pimgdirectionref, IntelCameraParameters::GPS_IMG_DIRECTION_REF_MAGNETIC) != 0))
+            || (imgdirection < 0 || imgdirection > 359.99))
+            pimgdirection = nullptr;
+    }
+     */
+    // check whether the GIS Information is valid
+    if(!(latitude >= -EPSILON && latitude <= EPSILON) ||
+       !(longitude >= -EPSILON && longitude <= EPSILON) ||
+       !(altitude >= -EPSILON && altitude <= EPSILON) ||
+       (timestamp != 0) || (strlen(pprocmethod) != 0))
+        gpsEnabled = true;
+
+    mExifAttributes.enableGps = 0;
+    LOG1("EXIF: gpsEnabled: %d", gpsEnabled);
+
+    // the version is given as 2.2.0.0, it is mandatory when GPSInfo tag is present
+    if(gpsEnabled) {
+        const unsigned char gpsversion[4] = {0x02, 0x02, 0x00, 0x00};
+        MEMCPY_S(mExifAttributes.gps_version_id,
+             sizeof(mExifAttributes.gps_version_id),
+             gpsversion,
+             sizeof(gpsversion));
+    } else {
+        return;
+    }
+
+    // latitude, for example, 39.904214 degrees, N
+    if(latitude > 0)
+        MEMCPY_S(mExifAttributes.gps_latitude_ref, sizeof(mExifAttributes.gps_latitude_ref),
+                 "N", sizeof(mExifAttributes.gps_latitude_ref));
+    else
+        MEMCPY_S(mExifAttributes.gps_latitude_ref, sizeof(mExifAttributes.gps_latitude_ref),
+                 "S", sizeof(mExifAttributes.gps_latitude_ref));
+
+    latitude = fabs(latitude);
+    mExifAttributes.gps_latitude[0].num = (uint32_t)latitude;
+    mExifAttributes.gps_latitude[0].den = 1;
+    mExifAttributes.gps_latitude[1].num = (uint32_t)((latitude - mExifAttributes.gps_latitude[0].num) * 60);
+    mExifAttributes.gps_latitude[1].den = 1;
+    mExifAttributes.gps_latitude[2].num = (uint32_t)(((latitude - mExifAttributes.gps_latitude[0].num) * 60 - mExifAttributes.gps_latitude[1].num) * 60 * 100);
+    mExifAttributes.gps_latitude[2].den = 100;
+    mExifAttributes.enableGps |= EXIF_GPS_LATITUDE;
+    LOG1("EXIF: latitude, ref:%s, dd:%d, mm:%d, ss:%d",
+         mExifAttributes.gps_latitude_ref, mExifAttributes.gps_latitude[0].num,
+         mExifAttributes.gps_latitude[1].num, mExifAttributes.gps_latitude[2].num);
+
+    // longitude, for example, 116.407413 degrees, E
+    if(longitude > 0)
+        MEMCPY_S(mExifAttributes.gps_longitude_ref, sizeof(mExifAttributes.gps_longitude_ref),
+                 "E", sizeof(mExifAttributes.gps_longitude_ref));
+    else
+        MEMCPY_S(mExifAttributes.gps_longitude_ref, sizeof(mExifAttributes.gps_longitude_ref),
+                 "W", sizeof(mExifAttributes.gps_longitude_ref));
+    longitude = fabs(longitude);
+    mExifAttributes.gps_longitude[0].num = (uint32_t)longitude;
+    mExifAttributes.gps_longitude[0].den = 1;
+    mExifAttributes.gps_longitude[1].num = (uint32_t)((longitude - mExifAttributes.gps_longitude[0].num) * 60);
+    mExifAttributes.gps_longitude[1].den = 1;
+    mExifAttributes.gps_longitude[2].num = (uint32_t)(((longitude - mExifAttributes.gps_longitude[0].num) * 60 - mExifAttributes.gps_longitude[1].num) * 60 * 100);
+    mExifAttributes.gps_longitude[2].den = 100;
+    mExifAttributes.enableGps |= EXIF_GPS_LONGITUDE;
+    LOG1("EXIF: longitude, ref:%s, dd:%d, mm:%d, ss:%d",
+         mExifAttributes.gps_longitude_ref, mExifAttributes.gps_longitude[0].num,
+         mExifAttributes.gps_longitude[1].num, mExifAttributes.gps_longitude[2].num);
+
+    // altitude
+    // altitude, sea level or above sea level, set it to 0; below sea level, set it to 1
+    mExifAttributes.gps_altitude_ref = ((altitude > 0) ? 0 : 1);
+    altitude = fabs(altitude);
+    mExifAttributes.gps_altitude.num = (uint32_t)altitude;
+    mExifAttributes.gps_altitude.den = 1;
+    mExifAttributes.enableGps |= EXIF_GPS_ALTITUDE;
+    LOG1("EXIF: altitude, ref:%d, height:%d", mExifAttributes.gps_altitude_ref, mExifAttributes.gps_altitude.num);
+
+    // timestamp
+    if (timestamp >= LONG_MAX || timestamp <= LONG_MIN)
+    {
+        timestamp = 0;
+        LOGW("invalid timestamp was provided, defaulting to 0 (i.e. 1970)");
+    }
+    struct tm time;
+    gmtime_r(&timestamp, &time);
+    time.tm_year += 1900;
+    time.tm_mon += 1;
+    mExifAttributes.gps_timestamp[0].num = time.tm_hour;
+    mExifAttributes.gps_timestamp[0].den = 1;
+    mExifAttributes.gps_timestamp[1].num = time.tm_min;
+    mExifAttributes.gps_timestamp[1].den = 1;
+    mExifAttributes.gps_timestamp[2].num = time.tm_sec;
+    mExifAttributes.gps_timestamp[2].den = 1;
+    mExifAttributes.enableGps |= EXIF_GPS_TIMESTAMP;
+
+    snprintf((char *)mExifAttributes.gps_datestamp, sizeof(mExifAttributes.gps_datestamp), "%04d:%02d:%02d",
+                time.tm_year, time.tm_mon, time.tm_mday);
+
+    LOG1("EXIF: timestamp, year:%d,mon:%d,day:%d,hour:%d,min:%d,sec:%d",
+            time.tm_year, time.tm_mon, time.tm_mday, time.tm_hour, time.tm_min, time.tm_sec);
+
+    // processing method
+    MEMCPY_S(mExifAttributes.gps_processing_method,
+             sizeof(mExifAttributes.gps_processing_method),
+             metadata->mGpsSetting.gpsProcessingMethod,
+             sizeof(metadata->mGpsSetting.gpsProcessingMethod));
+    mExifAttributes.gps_processing_method[sizeof(mExifAttributes.gps_processing_method) - 1] = 0;
+
+    mExifAttributes.enableGps |= EXIF_GPS_PROCMETHOD;
+    LOG1("EXIF: GPS processing method:%s", mExifAttributes.gps_processing_method);
+
+    //todo: no intel extension for direction, support in future
+    /*
+    if (pimgdirection && pimgdirectionref)  {
+        if (strcmp(pimgdirectionref, IntelCameraParameters::GPS_IMG_DIRECTION_REF_TRUE) == 0)
+            memcpy(mExifAttributes.gps_img_direction_ref, "T", sizeof(mExifAttributes.gps_img_direction_ref));
+        else if (strcmp(pimgdirectionref, IntelCameraParameters::GPS_IMG_DIRECTION_REF_MAGNETIC) == 0)
+            memcpy(mExifAttributes.gps_img_direction_ref, "M", sizeof(mExifAttributes.gps_img_direction_ref));
+        mExifAttributes.gps_img_direction.num = (uint32_t)(imgdirection*100);
+        mExifAttributes.gps_img_direction.den = 100;
+        mExifAttributes.enableGps |= EXIF_GPS_IMG_DIRECTION;
+        LOG1("EXIF: GPS img direction ref:%s, img direction num:%d, den:%d",
+            mExifAttributes.gps_img_direction_ref,
+            mExifAttributes.gps_img_direction.num,
+            mExifAttributes.gps_img_direction.den);
+    }
+    */
+}
+
+void EXIFMaker::setSensorAeConfig()
+{
+    LOG1("@%s", __func__);
+
+    mExifAttributes.exposure_time.num = 0;
+    mExifAttributes.exposure_time.den = 1;
+    mExifAttributes.shutter_speed.num = 0;
+    mExifAttributes.shutter_speed.den = 1;
+    mExifAttributes.exposure_bias.num = 0;
+    mExifAttributes.exposure_bias.den = 100;
+}
+
+/*
+ * more secure attribute copy routine.
+ * \param dst pointer to dst buffer
+ * \param dstSize dst buffer size
+ * \param src pointer to src character buffer
+ * \param srcLength src buffer length in characters, not including null byte
+ */
+void EXIFMaker::copyAttribute(uint8_t *dst, size_t dstSize,
+                              const char *src, size_t srcLength)
+{
+    size_t dstMaxLength = dstSize - 1; // leave space for null
+    MEMCPY_S(dst, dstMaxLength, src, srcLength); // copy chars (not null)
+    // add null termination
+    size_t len = std::min(dstMaxLength, srcLength);
+    dst[len] = '\0';
+}
+
+void EXIFMaker::clear()
+{
+    LOG1("@%s", __func__);
+    // Reset all the attributes
+    CLEAR(mExifAttributes);
+    // Initialize the common values
+    mExifAttributes.enableThumb = false;
+    copyAttribute(mExifAttributes.image_description,
+                  sizeof(mExifAttributes.image_description),
+                  EXIF_DEF_IMAGE_DESCRIPTION,
+                  strlen(EXIF_DEF_IMAGE_DESCRIPTION));
+
+    copyAttribute(mExifAttributes.maker,
+                  sizeof(mExifAttributes.maker),
+                  "INTEL",
+                  strlen("INTEL"));
+
+    copyAttribute(mExifAttributes.model,
+                  sizeof(mExifAttributes.model),
+                  "Chrome",
+                  strlen("Chrome"));
+
+    copyAttribute(mExifAttributes.software,
+                  sizeof(mExifAttributes.software),
+                  EXIF_DEF_SOFTWARE,
+                  strlen(EXIF_DEF_SOFTWARE));
+
+    copyAttribute(mExifAttributes.exif_version,
+                  sizeof(mExifAttributes.exif_version),
+                  EXIF_DEF_EXIF_VERSION,
+                  strlen(EXIF_DEF_EXIF_VERSION));
+
+    copyAttribute(mExifAttributes.flashpix_version,
+                  sizeof(mExifAttributes.flashpix_version),
+                  EXIF_DEF_FLASHPIXVERSION,
+                  strlen(EXIF_DEF_FLASHPIXVERSION));
+
+    // initially, set default flash
+    mExifAttributes.flash = EXIF_DEF_FLASH;
+
+    // normally it is sRGB, 1 means sRGB. FFFF.H means uncalibrated
+    mExifAttributes.color_space = EXIF_DEF_COLOR_SPACE;
+
+    // the number of pixels per ResolutionUnit in the w or h direction
+    // 72 means the image resolution is unknown
+    mExifAttributes.x_resolution.num = EXIF_DEF_RESOLUTION_NUM;
+    mExifAttributes.x_resolution.den = EXIF_DEF_RESOLUTION_DEN;
+    mExifAttributes.y_resolution.num = mExifAttributes.x_resolution.num;
+    mExifAttributes.y_resolution.den = mExifAttributes.x_resolution.den;
+    // resolution unit, 2 means inch
+    mExifAttributes.resolution_unit = EXIF_DEF_RESOLUTION_UNIT;
+    // when thumbnail uses JPEG compression, this tag 103H's value is set to 6
+    mExifAttributes.compression_scheme = EXIF_DEF_COMPRESSION;
+
+    // the TIFF default is 1 (centered)
+    mExifAttributes.ycbcr_positioning = EXIF_DEF_YCBCR_POSITIONING;
+
+    // Clear the Intel 3A Makernote information
+    mExifAttributes.makerNoteData = mMakernoteSection;
+    mExifAttributes.makerNoteDataSize = 0;
+    mExifAttributes.makernoteToApp2 = ENABLE_APP2_MARKER;
+
+    mInitialized = false;
+}
+
+void EXIFMaker::enableFlash(bool enable, int8_t aeMode, int8_t flashMode)
+{
+
+    mExifAttributes.flash = EXIF_DEF_FLASH;
+
+}
+
+void EXIFMaker::setThumbnail(unsigned char *data, size_t size, int width, int height)
+{
+    LOG1("@%s: data = %p, size = %zu", __func__, data, size);
+    mExifAttributes.enableThumb = true;
+    mExifAttributes.widthThumb = width;
+    mExifAttributes.heightThumb = height;
+    if (mEncoder.setThumbData(data, size) != EXIF_SUCCESS) {
+        LOGE("Error in setting EXIF thumbnail");
+    }
+}
+
+bool EXIFMaker::isThumbnailSet() const {
+    LOG1("@%s", __func__);
+    return mEncoder.isThumbDataSet();
+}
+
+size_t EXIFMaker::makeExif(unsigned char *data)
+{
+    LOG1("@%s", __func__);
+    CheckError(!data, 0, "nullptr passed for EXIF. Cannot generate EXIF!");
+
+    if (mEncoder.makeExif(data, &mExifAttributes, &mExifSize) == EXIF_SUCCESS) {
+        LOG1("Generated EXIF (@%p) of size: %zu", data, mExifSize);
+        return mExifSize;
+    }
+    return 0;
+}
+
+void EXIFMaker::setMaker(const char *data)
+{
+    LOG1("@%s: data = %s", __func__, data);
+
+    snprintf((char*)mExifAttributes.maker, sizeof(mExifAttributes.maker), "%s", data);
+}
+
+void EXIFMaker::setModel(const char *data)
+{
+    LOG1("@%s: data = %s", __func__, data);
+
+    snprintf((char*)mExifAttributes.model, sizeof(mExifAttributes.model), "%s", data);
+}
+
+void EXIFMaker::setSoftware(const char *data)
+{
+    LOG1("@%s: data = %s", __func__, data);
+
+    snprintf((char*)mExifAttributes.software, sizeof(mExifAttributes.software), "%s", data);
+}
+
+void EXIFMaker::saveMakernote(const Parameters &params)
+{
+    unsigned int size = sizeof(unsigned char) * (MAKERNOTE_SECTION1_SIZE + MAKERNOTE_SECTION2_SIZE);
+    if (params.getMakernoteData(mMakernoteSection, &size) == OK) {
+        mExifAttributes.makerNoteDataSize = size;
+    }
+}
+
+void EXIFMaker::updateSensorInfo(const Parameters &params)
+{
+    float focal = 0.0;
+    params.getFocalLength(focal);
+
+    if (focal < EPSILON) {
+        // Focal length is not supported, set to default value
+        icamera::CameraMetadata meta;
+        icamera::ParameterHelper::copyMetadata(params, &meta);
+
+        icamera_metadata_entry entry = meta.find(CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
+        if (entry.count >= 1) {
+            focal = entry.data.f[0];
+        }
+    }
+
+    LOG2("focal length is %f", focal);
+    mExifAttributes.focal_length.num = focal * mExifAttributes.focal_length.den;
+    float aperture = 0.0;
+    params.getAperture(aperture);
+    mExifAttributes.aperture.num = aperture * mExifAttributes.aperture.den;
+
+    mExifAttributes.fnumber.num = aperture * mExifAttributes.aperture.den;
+    mExifAttributes.fnumber.den = mExifAttributes.aperture.den;
+}
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/jpeg/EXIFMaker.h b/camera/hal/intel/ipu6/src/jpeg/EXIFMaker.h
new file mode 100644
index 000000000000..8227f4b405c3
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/jpeg/EXIFMaker.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2016-2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "ExifCreater.h"
+#include "EXIFMetaData.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+
+/**
+ * \class EXIFMaker
+ *
+ */
+class EXIFMaker {
+
+public:
+    EXIFMaker();
+    ~EXIFMaker();
+
+    void initialize(int width, int height);
+    bool isInitialized() { return mInitialized; }
+    void initializeLocation(ExifMetaData* metadata);
+    uint32_t getMakerNoteDataSize() const;
+    void pictureTaken(ExifMetaData *exifmetadata);
+    void enableFlash(bool enable, int8_t aeMode, int8_t flashMode);
+    void setThumbnail(unsigned char *data, size_t size, int width, int height);
+    bool isThumbnailSet() const;
+    size_t makeExif(unsigned char *data);
+    void setMaker(const char *data);
+    void setModel(const char *data);
+    void setSoftware(const char *data);
+    void updateSensorInfo(const Parameters &params);
+    void saveMakernote(const Parameters &params);
+    void setSensorAeConfig();
+
+private: // member variables
+    ExifCreater mEncoder;
+    exif_attribute_t mExifAttributes;
+    size_t mExifSize;
+    bool mInitialized;
+    unsigned char *mMakernoteSection;
+
+private:
+    // prevent copy constructor and assignment operator
+    DISALLOW_COPY_AND_ASSIGN(EXIFMaker);
+
+private: // Methods
+    void copyAttribute(uint8_t *dst, size_t dstSize,
+                       const char *src, size_t srcLength);
+
+    void clear();
+};
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.cpp b/camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.cpp
new file mode 100644
index 000000000000..bc10d87454c9
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.cpp
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2016-2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "EXIFMetaData"
+
+#include "EXIFMetaData.h"
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+
+namespace icamera {
+
+#define DEFAULT_ISO_SPEED 100
+
+ExifMetaData::ExifMetaData():
+    effectMode(CAM_EFFECT_NONE)
+    , software(nullptr)
+    , hdr(false)
+    , flashFired(false)
+    , v3AeMode(BAD_VALUE)
+    , flashMode(BAD_VALUE)
+    , saveMirrored(false)
+    , cameraOrientation(0)
+    , currentOrientation(0)
+    , zoomRatio(1)
+{
+    ALOGI("@%s", __func__);
+    mJpegSetting.jpegQuality = 90;
+    mJpegSetting.jpegThumbnailQuality = 90;
+    mJpegSetting.orientation = 0;
+    mJpegSetting.thumbWidth = 320;
+    mJpegSetting.thumbHeight = 240;
+    mGpsSetting.latitude = 0.0;
+    mGpsSetting.longitude = 0.0;
+    mGpsSetting.altitude = 0.0;
+    CLEAR(mGpsSetting.gpsProcessingMethod);
+    mGpsSetting.gpsTimeStamp = 0;
+}
+
+ExifMetaData::~ExifMetaData()
+{
+
+}
+
+}// namespace icamera
diff --git a/camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.h b/camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.h
new file mode 100644
index 000000000000..f65e36db6a3b
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2016-2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "iutils/Errors.h"
+#include "Parameters.h"
+namespace icamera {
+
+#define MAX_NUM_GPS_PROCESSING_METHOD 64
+
+/**
+ * \class ExifMetaData
+ *
+ */
+class ExifMetaData {
+public:
+    ExifMetaData();
+    virtual ~ExifMetaData();
+
+    // jpeg info
+    struct JpegSetting{
+        uint8_t jpegQuality;
+        uint8_t jpegThumbnailQuality;
+        int thumbWidth;
+        int thumbHeight;
+        int orientation;
+    };
+    // GPS info
+    struct GpsSetting{
+        double latitude;
+        double longitude;
+        double altitude;
+        char gpsProcessingMethod[MAX_NUM_GPS_PROCESSING_METHOD];
+        long gpsTimeStamp;
+    };
+    // exif info
+    JpegSetting mJpegSetting;
+    GpsSetting mGpsSetting;
+    camera_effect_mode_t effectMode;
+    char *software;                            /*!< software string from HAL */
+    bool hdr;                                  /*!< whether hdr was used */
+    bool flashFired;                           /*!< whether flash was fired */
+    int8_t v3AeMode;                           /*!< v3 ae mode (e.g. for flash) */
+    int8_t flashMode;                          /*!< flash mode (e.g. TORCH,SINGLE,OFF) */
+    bool saveMirrored;                         /*!< whether to do mirroring */
+    int cameraOrientation;                     /*!< camera sensor orientation */
+    int currentOrientation;                    /*!< Current orientation of the device */
+    int zoomRatio;
+};
+
+}// namespace android
diff --git a/camera/hal/intel/ipu6/src/jpeg/Exif.h b/camera/hal/intel/ipu6/src/jpeg/Exif.h
new file mode 100644
index 000000000000..321ebe898a00
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/jpeg/Exif.h
@@ -0,0 +1,344 @@
+/*
+ * Copyright Samsung Electronics Co.,LTD.
+ * Copyright (C) 2010 The Android Open Source Project
+ * Copyright (C) 2016-2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <math.h>
+
+#define EXIF_LOG2(x)                    (log((double)(x)) / log(2.0))
+#define APEX_FNUM_TO_APERTURE(x)        (2 * (EXIF_LOG2((double)(x))))
+#define APEX_EXPOSURE_TO_SHUTTER(x)     (-1.0 * (EXIF_LOG2((double)(x))))
+#define APEX_ISO_TO_FILMSENSITIVITY(x)  ((int)(EXIF_LOG2((x) / 3.125) + 0.5))
+
+#define NUM_SIZE                    2
+#define IFD_SIZE                    12
+#define OFFSET_SIZE                 4
+
+#define NUM_0TH_IFD_TIFF            14
+#define NUM_0TH_IFD_EXIF            36
+#define NUM_0TH_IFD_GPS             12
+#define NUM_1TH_IFD_TIFF            9
+// For QVGA: 320 * 240 * 1.5
+#define EXIF_SIZE_LIMITATION        0x10000
+// Limite the thumbnail size to 32k, to make sure the whole exif size does
+// not exceed the exif size limitation. We guess the total size of all the
+// other fields is smaller than 32k. (Currently the size is about 26k.)
+#define THUMBNAIL_SIZE_LIMITATION   0x8000
+
+/* Type */
+#define EXIF_TYPE_BYTE              1
+#define EXIF_TYPE_ASCII             2
+#define EXIF_TYPE_SHORT             3
+#define EXIF_TYPE_LONG              4
+#define EXIF_TYPE_RATIONAL          5
+#define EXIF_TYPE_UNDEFINED         7
+#define EXIF_TYPE_SLONG             9
+#define EXIF_TYPE_SRATIONAL         10
+
+#define EXIF_FILE_SIZE              28800
+
+/* 0th IFD TIFF Tags */
+#define EXIF_TAG_IMAGE_WIDTH                    0x0100
+#define EXIF_TAG_IMAGE_HEIGHT                   0x0101
+#define EXIF_TAG_IMAGE_DESCRIPTION              0x010e
+#define EXIF_TAG_MAKE                           0x010f
+#define EXIF_TAG_MODEL                          0x0110
+#define EXIF_TAG_ORIENTATION                    0x0112
+#define EXIF_TAG_X_RESOLUTION                   0x011A
+#define EXIF_TAG_Y_RESOLUTION                   0x011B
+#define EXIF_TAG_RESOLUTION_UNIT                0x0128
+#define EXIF_TAG_SOFTWARE                       0x0131
+#define EXIF_TAG_DATE_TIME                      0x0132
+#define EXIF_TAG_YCBCR_POSITIONING              0x0213
+#define EXIF_TAG_EXIF_IFD_POINTER               0x8769
+#define EXIF_TAG_GPS_IFD_POINTER                0x8825
+
+/* 0th IFD Exif Private Tags */
+#define EXIF_TAG_EXPOSURE_TIME                  0x829A
+#define EXIF_TAG_FNUMBER                        0x829D
+#define EXIF_TAG_EXPOSURE_PROGRAM               0x8822
+#define EXIF_TAG_ISO_SPEED_RATING               0x8827
+#define EXIF_TAG_EXIF_VERSION                   0x9000
+#define EXIF_TAG_DATE_TIME_ORG                  0x9003
+#define EXIF_TAG_DATE_TIME_DIGITIZE             0x9004
+#define EXIF_TAG_COMPONENTS_CONFIGURATION       0x9101
+#define EXIF_TAG_SHUTTER_SPEED                  0x9201
+#define EXIF_TAG_APERTURE                       0x9202
+#define EXIF_TAG_BRIGHTNESS                     0x9203
+#define EXIF_TAG_EXPOSURE_BIAS                  0x9204
+#define EXIF_TAG_MAX_APERTURE                   0x9205
+#define EXIF_TAG_SUBJECT_DISTANCE               0x9206
+#define EXIF_TAG_METERING_MODE                  0x9207
+#define EXIF_TAG_LIGHT_SOURCE                   0x9208
+#define EXIF_TAG_FLASH                          0x9209
+#define EXIF_TAG_FOCAL_LENGTH                   0x920A
+#define EXIF_TAG_MAKER_NOTE                     0x927C
+#define EXIF_TAG_USER_COMMENT                   0x9286
+#define EXIF_TAG_SUBSEC_TIME                    0x9290
+#define EXIF_TAG_SUBSEC_TIME_ORIG               0x9291
+#define EXIF_TAG_SUBSEC_TIME_DIG                0x9292
+#define EXIF_TAG_FLASH_PIX_VERSION              0xA000
+#define EXIF_TAG_COLOR_SPACE                    0xA001
+#define EXIF_TAG_PIXEL_X_DIMENSION              0xA002
+#define EXIF_TAG_PIXEL_Y_DIMENSION              0xA003
+#define EXIF_TAG_CUSTOM_RENDERED                0xA401
+#define EXIF_TAG_EXPOSURE_MODE                  0xA402
+#define EXIF_TAG_WHITE_BALANCE                  0xA403
+#define EXIF_TAG_JPEG_ZOOM_RATIO                0XA404
+#define EXIF_TAG_SCENCE_CAPTURE_TYPE            0xA406
+#define EXIF_TAG_GAIN_CONTROL                   0xA407
+#define EXIF_TAG_CONTRAST                       0xA408
+#define EXIF_TAG_SATURATION                     0xA409
+#define EXIF_TAG_SHARPNESS                      0xA40A
+
+/* 0th IFD GPS Info Tags */
+#define EXIF_TAG_GPS_VERSION_ID                 0x0000
+#define EXIF_TAG_GPS_LATITUDE_REF               0x0001
+#define EXIF_TAG_GPS_LATITUDE                   0x0002
+#define EXIF_TAG_GPS_LONGITUDE_REF              0x0003
+#define EXIF_TAG_GPS_LONGITUDE                  0x0004
+#define EXIF_TAG_GPS_ALTITUDE_REF               0x0005
+#define EXIF_TAG_GPS_ALTITUDE                   0x0006
+#define EXIF_TAG_GPS_TIMESTAMP                  0x0007
+#define EXIF_TAG_GPS_IMG_DIRECTION_REF          0x0010
+#define EXIF_TAG_GPS_IMG_DIRECTION              0x0011
+#define EXIF_TAG_GPS_PROCESSING_METHOD          0x001B
+#define EXIF_TAG_GPS_DATESTAMP                  0x001D
+
+/* 1th IFD TIFF Tags */
+#define EXIF_TAG_COMPRESSION_SCHEME             0x0103
+/*
+#define EXIF_TAG_X_RESOLUTION                   0x011A
+#define EXIF_TAG_Y_RESOLUTION                   0x011B
+#define EXIF_TAG_RESOLUTION_UNIT                0x0128
+*/
+#define EXIF_TAG_JPEG_INTERCHANGE_FORMAT        0x0201
+#define EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LEN    0x0202
+
+typedef enum {
+    EXIF_ORIENTATION_UP     = 1,
+    EXIF_ORIENTATION_90     = 6,
+    EXIF_ORIENTATION_180    = 3,
+    EXIF_ORIENTATION_270    = 8,
+} ExifOrientationType;
+
+typedef enum {
+    EXIF_SCENE_STANDARD,
+    EXIF_SCENE_LANDSCAPE,
+    EXIF_SCENE_PORTRAIT,
+    EXIF_SCENE_NIGHT,
+} CamExifSceneCaptureType;
+
+typedef enum {
+    EXIF_METERING_UNKNOWN,
+    EXIF_METERING_AVERAGE,
+    EXIF_METERING_CENTER,
+    EXIF_METERING_SPOT,
+    EXIF_METERING_MULTISPOT,
+    EXIF_METERING_PATTERN,
+    EXIF_METERING_PARTIAL,
+    EXIF_METERING_OTHER     = 255,
+} CamExifMeteringModeType;
+
+typedef enum {
+    EXIF_EXPOSURE_AUTO,
+    EXIF_EXPOSURE_MANUAL,
+    EXIF_EXPOSURE_AUTO_BRACKET,
+} CamExifExposureModeType;
+
+typedef enum {
+    EXIF_WB_AUTO,
+    EXIF_WB_MANUAL,
+} CamExifWhiteBalanceType;
+
+typedef enum
+{
+    EXIF_LIGHT_SOURCE_UNKNOWN,
+    EXIF_LIGHT_SOURCE_DAYLIGHT,
+    EXIF_LIGHT_SOURCE_FLUORESCENT,
+    EXIF_LIGHT_SOURCE_TUNGSTEN,
+    EXIF_LIGHT_SOURCE_FLASH,
+    EXIF_LIGHT_SOURCE_FINE_WEATHER = 9,
+    EXIF_LIGHT_SOURCE_CLOUDY_WEATHER,
+    EXIF_LIGHT_SOURCE_SHADE,
+    EXIF_LIGHT_SOURCE_DAYLIGHT_FLUORESCENT,
+    EXIF_LIGHT_SOURCE_DAY_WHITE_FLUORESCENT,
+    EXIF_LIGHT_SOURCE_COOL_WHITE_FLUORESCENT,
+    EXIF_LIGHT_SOURCE_WHITE_FLUORESCENT,
+    EXIF_LIGHT_SOURCE_WARM_WHITE_FLUORESCENT, //value 16 is used in EXIF V2.3, not for EXIF V2.2
+    EXIF_LIGHT_SOURCE_STANDARD_LIGHT_A,
+    EXIF_LIGHT_SOURCE_STANDARD_LIGHT_B,
+    EXIF_LIGHT_SOURCE_STANDARD_LIGHT_C,
+    EXIF_LIGHT_SOURCE_D55,
+    EXIF_LIGHT_SOURCE_D65,
+    EXIF_LIGHT_SOURCE_D75,
+    EXIF_LIGHT_SOURCE_D50,
+    EXIF_LIGHT_SOURCE_ISO_STUDIO_TUNGSTEN,
+    EXIF_LIGHT_SOURCE_OTHER_LIGHT_SOURCE = 255,
+} CamExifLightSourceType;
+
+typedef enum {
+    EXIF_EXPOSURE_PROGRAM_MANUAL = 1,
+    EXIF_EXPOSURE_PROGRAM_NORMAL = 2,
+    EXIF_EXPOSURE_PROGRAM_APERTURE_PRIORITY = 3,
+    EXIF_EXPOSURE_PROGRAM_SHUTTER_PRIORITY = 4
+} CamExifExposureProgramType;
+
+typedef enum {
+    EXIF_CONTRAST_NORMAL = 0,
+    EXIF_CONTRAST_SOFT = 1,
+    EXIF_CONTRAST_HARD = 2,
+} CamExifContrastType;
+
+typedef enum {
+    EXIF_SATURATION_NORMAL = 0,
+    EXIF_SATURATION_LOW = 1,
+    EXIF_SATURATION_HIGH = 2,
+} CamExifSaturationType;
+
+typedef enum {
+    EXIF_SHARPNESS_NORMAL = 0,
+    EXIF_SHARPNESS_SOFT = 1,
+    EXIF_SHARPNESS_HARD = 2,
+} CamExifSharpnessType;
+
+/* define the flag of enable gps info */
+const uint8_t   EXIF_GPS_LATITUDE       = 0x01;
+const uint8_t   EXIF_GPS_LONGITUDE      = 0x02;
+const uint8_t   EXIF_GPS_ALTITUDE       = 0x04;
+const uint8_t   EXIF_GPS_TIMESTAMP      = 0x08;
+const uint8_t   EXIF_GPS_PROCMETHOD     = 0x10;
+const uint8_t   EXIF_GPS_IMG_DIRECTION  = 0x20;
+
+/* Values */
+#define EXIF_DEF_IMAGE_DESCRIPTION          "Jpeg"
+#define EXIF_DEF_SOFTWARE       "Android"
+#define EXIF_DEF_EXIF_VERSION   "0220"
+#define EXIF_DEF_USERCOMMENTS   "  "
+#define EXIF_DEF_FLASHPIXVERSION "0100" /* Flashpix Format Version 1.0 */
+
+#define EXIF_DEF_YCBCR_POSITIONING  1   /* centered */
+#define EXIF_DEF_FNUMBER_NUM        26  /* 2.6 */
+#define EXIF_DEF_FNUMBER_DEN        10
+#define EXIF_DEF_EXPOSURE_PROGRAM   3   /* aperture priority */
+#define EXIF_DEF_FOCAL_LEN_NUM      278 /* 2.78mm */
+#define EXIF_DEF_FOCAL_LEN_DEN      100
+#define EXIF_DEF_FLASH              0   /* O: off, 1: on*/
+#define EXIF_FLASH_FORCED_ON        1 << 3; /* mode description */
+#define EXIF_FLASH_FORCED_OFF       1 << 4; /* mode description */
+#define EXIF_FLASH_AUTO             1 << 3 | 1 << 4; /* mode description */
+#define EXIF_FLASH_ON               1   /* O: off, 1: on - fired or not*/
+#define EXIF_DEF_COLOR_SPACE        1
+#define EXIF_DEF_CUSTOM_RENDERED    0
+#define EXIF_CUSTOM_RENDERED_HDR    1
+#define EXIF_DEF_EXPOSURE_MODE      EXIF_EXPOSURE_AUTO
+#define EXIF_DEF_APEX_DEN           10
+#define EXIF_DEF_APEX_NUM           25
+#define EXIF_DEF_SUBJECT_DISTANCE_UNKNOWN   0
+
+#define EXIF_DEF_COMPRESSION        6
+#define EXIF_DEF_RESOLUTION_NUM     72
+#define EXIF_DEF_RESOLUTION_DEN     1
+#define EXIF_DEF_RESOLUTION_UNIT    2   /* inches */
+
+typedef struct {
+    uint32_t num;
+    uint32_t den;
+} rational_t;
+
+typedef struct {
+    int32_t num;
+    int32_t den;
+} srational_t;
+
+typedef struct {
+    bool enableThumb;
+
+    uint8_t image_description[32];
+    uint8_t flashpix_version[4];
+    uint8_t components_configuration[4];
+    uint8_t maker[32];
+    uint8_t model[32];
+    uint8_t software[32];
+    uint8_t exif_version[4];
+    uint8_t date_time[20];
+    uint8_t subsec_time[8];
+    uint8_t user_comment[150];
+
+    uint32_t width;
+    uint32_t height;
+    uint32_t widthThumb;
+    uint32_t heightThumb;
+
+    uint16_t orientation;
+    uint16_t ycbcr_positioning;
+    uint16_t exposure_program;
+    uint16_t iso_speed_rating;
+    uint16_t metering_mode;
+    uint16_t flash;
+    uint16_t color_space;
+    uint16_t custom_rendered;
+    uint16_t exposure_mode;
+    uint16_t white_balance;
+    rational_t zoom_ratio;
+    uint16_t scene_capture_type;
+    uint16_t light_source;
+    uint16_t gain_control;
+    uint16_t contrast;
+    uint16_t saturation;
+    uint16_t sharpness;
+
+    rational_t exposure_time;
+    rational_t fnumber;
+    rational_t aperture;
+    rational_t max_aperture;
+    rational_t focal_length;
+    rational_t subject_distance;
+
+    srational_t shutter_speed;
+    srational_t brightness;
+    srational_t exposure_bias;
+
+    //bit 0~4 indicate whether Gps items latitude, longitude, altitude, timestamp,
+    //datastamp exist or not.
+    uint8_t enableGps;
+    uint8_t gps_latitude_ref[2];
+    uint8_t gps_longitude_ref[2];
+
+    uint8_t gps_version_id[4];
+    uint8_t gps_altitude_ref;
+
+    rational_t gps_latitude[3];
+    rational_t gps_longitude[3];
+    rational_t gps_altitude;
+    rational_t gps_timestamp[3];
+    uint8_t gps_datestamp[11];
+    uint8_t gps_processing_method[100];
+
+    uint8_t gps_img_direction_ref[2];
+    rational_t gps_img_direction;
+
+    rational_t x_resolution;
+    rational_t y_resolution;
+    uint16_t resolution_unit;
+    uint16_t compression_scheme;
+
+    uint16_t makerNoteDataSize;
+    unsigned char *makerNoteData;
+    bool makernoteToApp2;
+} exif_attribute_t;
diff --git a/camera/hal/intel/ipu6/src/jpeg/ExifCreater.cpp b/camera/hal/intel/ipu6/src/jpeg/ExifCreater.cpp
new file mode 100644
index 000000000000..2cd5b18a3dda
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/jpeg/ExifCreater.cpp
@@ -0,0 +1,604 @@
+/*
+ * Copyright Samsung Electronics Co.,LTD.
+ * Copyright (C) 2010 The Android Open Source Project
+ * Copyright (C) 2016-2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * JPEG DRIVER MODULE (ExifCreater.cpp)
+ * Author  : ge.lee       -- initial version
+ * Date    : 03 June 2010
+ * Purpose : This file implements the JPEG encoder APIs as needed by Camera HAL
+ */
+
+#define LOG_TAG "ExifCreater"
+
+#include <sys/mman.h>
+#include <fcntl.h>
+#include "iutils/CameraLog.h"
+
+#include "ExifCreater.h"
+
+static const char ExifAsciiPrefix[] = { 0x41, 0x53, 0x43, 0x49, 0x49, 0x0, 0x0, 0x0 };
+
+namespace icamera {
+
+ExifCreater::ExifCreater()
+{
+    m_thumbBuf = nullptr;
+    m_thumbSize = 0;
+}
+
+ExifCreater::~ExifCreater()
+{
+}
+
+exif_status ExifCreater::setThumbData(const void *thumbBuf, unsigned int thumbSize)
+{
+    // TODO: Maybe we should take into account the rest of the EXIF data as well here,
+    // not just the thumbnail size.
+    if (thumbSize >= EXIF_SIZE_LIMITATION) {
+        LOGE("ERROR: Too big thumb size %d (limit: %d)", thumbSize, EXIF_SIZE_LIMITATION);
+        m_thumbBuf = nullptr;
+        m_thumbSize = 0;
+        return EXIF_FAIL;
+    }
+
+    m_thumbBuf = (unsigned char *)thumbBuf;
+    m_thumbSize = thumbSize;
+    return EXIF_SUCCESS;
+}
+
+bool ExifCreater::isThumbDataSet() const
+{
+    return m_thumbBuf != nullptr;
+}
+
+// if exif tags size + thumbnail size is > 64K, it will disable thumbnail
+exif_status ExifCreater::makeExif (void *exifOut,
+                                        exif_attribute_t *exifInfo,
+                                        size_t *size)
+{
+    LOG1("makeExif start");
+
+    unsigned char *pCur, *pApp1Start, *pIfdStart, *pGpsIfdPtr, *pNextIfdOffset;
+    unsigned int tmp, LongerTagOffset = 0, LongerTagOffsetWithoutThumbnail;
+    pApp1Start = pCur = (unsigned char *)exifOut;
+
+    // 2 Exif Identifier Code & TIFF Header
+    pCur += 4;  // Skip 4 Byte for APP1 marker and length
+    unsigned char ExifIdentifierCode[6] = { 0x45, 0x78, 0x69, 0x66, 0x00, 0x00 };
+    MEMCPY_S(pCur, sizeof(ExifIdentifierCode), ExifIdentifierCode, sizeof(ExifIdentifierCode));
+    pCur += 6;
+
+    /* Byte Order - little endian, Offset of IFD - 0x00000008.H */
+    unsigned char TiffHeader[8] = { 0x49, 0x49, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00 };
+    MEMCPY_S(pCur, sizeof(TiffHeader), TiffHeader, sizeof(TiffHeader));
+    pIfdStart = pCur;
+    pCur += 8;
+
+    // 2 0th IFD TIFF Tags
+    if (exifInfo->enableGps)
+        tmp = NUM_0TH_IFD_TIFF;
+    else
+        tmp = NUM_0TH_IFD_TIFF - 1;
+
+    MEMCPY_S(pCur, NUM_SIZE, (int8_t *) &tmp, NUM_SIZE);
+    pCur += NUM_SIZE;
+
+    LongerTagOffset += 8 + NUM_SIZE + tmp*IFD_SIZE + OFFSET_SIZE;
+
+    writeExifIfd(&pCur, EXIF_TAG_IMAGE_WIDTH, EXIF_TYPE_LONG,
+                 1, exifInfo->width);
+    writeExifIfd(&pCur, EXIF_TAG_IMAGE_HEIGHT, EXIF_TYPE_LONG,
+                 1, exifInfo->height);
+    writeExifIfd(&pCur, EXIF_TAG_IMAGE_DESCRIPTION, EXIF_TYPE_ASCII,
+                 strlen((char *)exifInfo->image_description) + 1, exifInfo->image_description, &LongerTagOffset, pIfdStart);
+    writeExifIfd(&pCur, EXIF_TAG_MAKE, EXIF_TYPE_ASCII,
+                 strlen((char *)exifInfo->maker) + 1, exifInfo->maker, &LongerTagOffset, pIfdStart);
+    writeExifIfd(&pCur, EXIF_TAG_MODEL, EXIF_TYPE_ASCII,
+                 strlen((char *)exifInfo->model) + 1, exifInfo->model, &LongerTagOffset, pIfdStart);
+    writeExifIfd(&pCur, EXIF_TAG_ORIENTATION, EXIF_TYPE_SHORT,
+                 1, exifInfo->orientation);
+    writeExifIfd(&pCur, EXIF_TAG_X_RESOLUTION, EXIF_TYPE_RATIONAL,
+                 1, &exifInfo->x_resolution, &LongerTagOffset, pIfdStart);
+    writeExifIfd(&pCur, EXIF_TAG_Y_RESOLUTION, EXIF_TYPE_RATIONAL,
+                 1, &exifInfo->y_resolution, &LongerTagOffset, pIfdStart);
+    writeExifIfd(&pCur, EXIF_TAG_RESOLUTION_UNIT, EXIF_TYPE_SHORT,
+                 1, exifInfo->resolution_unit);
+    writeExifIfd(&pCur, EXIF_TAG_SOFTWARE, EXIF_TYPE_ASCII,
+                 strlen((char *)exifInfo->software) + 1, exifInfo->software, &LongerTagOffset, pIfdStart);
+    writeExifIfd(&pCur, EXIF_TAG_DATE_TIME, EXIF_TYPE_ASCII,
+                 20, exifInfo->date_time, &LongerTagOffset, pIfdStart);
+    writeExifIfd(&pCur, EXIF_TAG_YCBCR_POSITIONING, EXIF_TYPE_SHORT,
+                 1, exifInfo->ycbcr_positioning);
+    writeExifIfd(&pCur, EXIF_TAG_EXIF_IFD_POINTER, EXIF_TYPE_LONG,
+                 1, LongerTagOffset);
+
+    pGpsIfdPtr = pCur;
+    if (exifInfo->enableGps) {
+        pCur += IFD_SIZE;   // Skip a ifd size for gps IFD pointer
+    }
+
+    pNextIfdOffset = pCur;  // Skip a offset size for next IFD offset
+    pCur += OFFSET_SIZE;
+
+    // 2 0th IFD Exif Private Tags
+    pCur = pIfdStart + LongerTagOffset;
+
+    int drop_num = 0;
+    if (exifInfo->exposure_time.den == 0)
+        drop_num++;
+    if (exifInfo->shutter_speed.den == 0)
+        drop_num++;
+    if (exifInfo->makerNoteDataSize == 0 || exifInfo->makernoteToApp2) {
+        // skip the makernote IFD in APP1, when we don't have any,
+        // or if we want it to APP2
+        drop_num++;
+    }
+    tmp = NUM_0TH_IFD_EXIF - drop_num;
+    MEMCPY_S(pCur, NUM_SIZE, &tmp, NUM_SIZE);
+    pCur += NUM_SIZE;
+
+    LongerTagOffset += NUM_SIZE + tmp * IFD_SIZE + OFFSET_SIZE;
+    if (exifInfo->exposure_time.den != 0) {
+        writeExifIfd(&pCur, EXIF_TAG_EXPOSURE_TIME, EXIF_TYPE_RATIONAL,
+                     1, &exifInfo->exposure_time, &LongerTagOffset, pIfdStart);
+    }
+    writeExifIfd(&pCur, EXIF_TAG_FNUMBER, EXIF_TYPE_RATIONAL,
+                 1, &exifInfo->fnumber, &LongerTagOffset, pIfdStart);
+    writeExifIfd(&pCur, EXIF_TAG_EXPOSURE_PROGRAM, EXIF_TYPE_SHORT,
+                 1, exifInfo->exposure_program);
+    writeExifIfd(&pCur, EXIF_TAG_ISO_SPEED_RATING, EXIF_TYPE_SHORT,
+                 1, exifInfo->iso_speed_rating);
+    writeExifIfd(&pCur, EXIF_TAG_EXIF_VERSION, EXIF_TYPE_UNDEFINED,
+                 4, exifInfo->exif_version);
+    writeExifIfd(&pCur, EXIF_TAG_DATE_TIME_ORG, EXIF_TYPE_ASCII,
+                 20, exifInfo->date_time, &LongerTagOffset, pIfdStart);
+    writeExifIfd(&pCur, EXIF_TAG_DATE_TIME_DIGITIZE, EXIF_TYPE_ASCII,
+                 20, exifInfo->date_time, &LongerTagOffset, pIfdStart);
+    writeExifIfd(&pCur, EXIF_TAG_COMPONENTS_CONFIGURATION, EXIF_TYPE_UNDEFINED,
+                 4, exifInfo->components_configuration);
+    if (exifInfo->shutter_speed.den != 0) {
+        writeExifIfd(&pCur, EXIF_TAG_SHUTTER_SPEED, EXIF_TYPE_SRATIONAL,
+                     1, (rational_t *)&exifInfo->shutter_speed, &LongerTagOffset, pIfdStart);
+    }
+    writeExifIfd(&pCur, EXIF_TAG_APERTURE, EXIF_TYPE_RATIONAL,
+                 1, &exifInfo->aperture, &LongerTagOffset, pIfdStart);
+    writeExifIfd(&pCur, EXIF_TAG_BRIGHTNESS, EXIF_TYPE_SRATIONAL,
+                 1, (rational_t *)&exifInfo->brightness, &LongerTagOffset, pIfdStart);
+    writeExifIfd(&pCur, EXIF_TAG_EXPOSURE_BIAS, EXIF_TYPE_SRATIONAL,
+                 1, (rational_t *)&exifInfo->exposure_bias, &LongerTagOffset, pIfdStart);
+    writeExifIfd(&pCur, EXIF_TAG_MAX_APERTURE, EXIF_TYPE_RATIONAL,
+                 1, &exifInfo->max_aperture, &LongerTagOffset, pIfdStart);
+    writeExifIfd(&pCur, EXIF_TAG_SUBJECT_DISTANCE, EXIF_TYPE_RATIONAL,
+                 1, &exifInfo->subject_distance, &LongerTagOffset, pIfdStart);
+    writeExifIfd(&pCur, EXIF_TAG_METERING_MODE, EXIF_TYPE_SHORT,
+                 1, exifInfo->metering_mode);
+    writeExifIfd(&pCur, EXIF_TAG_LIGHT_SOURCE, EXIF_TYPE_SHORT,
+                 1, exifInfo->light_source);
+    writeExifIfd(&pCur, EXIF_TAG_FLASH, EXIF_TYPE_SHORT,
+                 1, exifInfo->flash);
+    writeExifIfd(&pCur, EXIF_TAG_FOCAL_LENGTH, EXIF_TYPE_RATIONAL,
+                 1, &exifInfo->focal_length, &LongerTagOffset, pIfdStart);
+    char code[8] = { 0x41, 0x53, 0x43, 0x49, 0x49, 0x00, 0x00, 0x00 };
+    size_t commentsLen = strlen((char *)exifInfo->user_comment) + 1;
+    if(commentsLen > (sizeof(exifInfo->user_comment) - sizeof(code)))
+        return EXIF_FAIL;
+    memmove(exifInfo->user_comment + sizeof(code), exifInfo->user_comment, commentsLen);
+    MEMCPY_S(exifInfo->user_comment, sizeof(exifInfo->user_comment), code, sizeof(code));
+    writeExifIfd(&pCur, EXIF_TAG_USER_COMMENT, EXIF_TYPE_UNDEFINED,
+                 commentsLen + sizeof(code), exifInfo->user_comment, &LongerTagOffset, pIfdStart);
+    writeExifIfd(&pCur, EXIF_TAG_SUBSEC_TIME, EXIF_TYPE_ASCII,
+                 strlen((char *)exifInfo->subsec_time)+1, exifInfo->subsec_time, &LongerTagOffset, pIfdStart);
+    writeExifIfd(&pCur, EXIF_TAG_SUBSEC_TIME_ORIG, EXIF_TYPE_ASCII,
+                 strlen((char *)exifInfo->subsec_time)+1, exifInfo->subsec_time, &LongerTagOffset, pIfdStart);
+    writeExifIfd(&pCur, EXIF_TAG_SUBSEC_TIME_DIG, EXIF_TYPE_ASCII,
+                 strlen((char *)exifInfo->subsec_time)+1, exifInfo->subsec_time, &LongerTagOffset, pIfdStart);
+    writeExifIfd(&pCur, EXIF_TAG_FLASH_PIX_VERSION, EXIF_TYPE_UNDEFINED,
+                 4, exifInfo->flashpix_version);
+    writeExifIfd(&pCur, EXIF_TAG_COLOR_SPACE, EXIF_TYPE_SHORT,
+                 1, exifInfo->color_space);
+    writeExifIfd(&pCur, EXIF_TAG_PIXEL_X_DIMENSION, EXIF_TYPE_LONG,
+                 1, exifInfo->width);
+    writeExifIfd(&pCur, EXIF_TAG_PIXEL_Y_DIMENSION, EXIF_TYPE_LONG,
+                 1, exifInfo->height);
+    writeExifIfd(&pCur, EXIF_TAG_CUSTOM_RENDERED, EXIF_TYPE_SHORT,
+                 1, exifInfo->custom_rendered);
+    writeExifIfd(&pCur, EXIF_TAG_EXPOSURE_MODE, EXIF_TYPE_SHORT,
+                 1, exifInfo->exposure_mode);
+    writeExifIfd(&pCur, EXIF_TAG_WHITE_BALANCE, EXIF_TYPE_SHORT,
+                 1, exifInfo->white_balance);
+    writeExifIfd(&pCur, EXIF_TAG_JPEG_ZOOM_RATIO, EXIF_TYPE_RATIONAL,
+                1, &exifInfo->zoom_ratio, &LongerTagOffset, pIfdStart);
+    writeExifIfd(&pCur, EXIF_TAG_SCENCE_CAPTURE_TYPE, EXIF_TYPE_SHORT,
+                 1, exifInfo->scene_capture_type);
+    writeExifIfd(&pCur, EXIF_TAG_GAIN_CONTROL, EXIF_TYPE_SHORT,
+                 1, exifInfo->gain_control);
+    writeExifIfd(&pCur, EXIF_TAG_CONTRAST, EXIF_TYPE_SHORT,
+             1, exifInfo->contrast);
+    writeExifIfd(&pCur, EXIF_TAG_SATURATION, EXIF_TYPE_SHORT,
+             1, exifInfo->saturation);
+    writeExifIfd(&pCur, EXIF_TAG_SHARPNESS, EXIF_TYPE_SHORT,
+             1, exifInfo->sharpness);
+
+    // Save MakerNote data to APP1, unless we want it APP2
+    if (exifInfo->makerNoteDataSize > 0 && !exifInfo->makernoteToApp2) {
+        writeExifIfd(
+            &pCur,
+            EXIF_TAG_MAKER_NOTE,
+            EXIF_TYPE_UNDEFINED,
+            exifInfo->makerNoteDataSize,
+            (unsigned char *)exifInfo->makerNoteData,
+            &LongerTagOffset,
+            pIfdStart
+            );
+    }
+
+    tmp = 0;
+    MEMCPY_S(pCur, OFFSET_SIZE, (int8_t *) &tmp, OFFSET_SIZE); // next IFD offset
+    pCur += OFFSET_SIZE;
+
+    // 2 0th IFD GPS Info Tags
+    if (exifInfo->enableGps) {
+        writeExifIfd(&pGpsIfdPtr, EXIF_TAG_GPS_IFD_POINTER, EXIF_TYPE_LONG,
+                     1, LongerTagOffset); // GPS IFD pointer skipped on 0th IFD
+
+        pCur = pIfdStart + LongerTagOffset;
+
+        tmp = NUM_0TH_IFD_GPS;
+        if ((exifInfo->enableGps & EXIF_GPS_LATITUDE) == 0)
+            tmp -= 2;
+        if ((exifInfo->enableGps & EXIF_GPS_LONGITUDE) == 0)
+            tmp -= 2;
+        if ((exifInfo->enableGps & EXIF_GPS_ALTITUDE) == 0)
+            tmp -= 2;
+        if ((exifInfo->enableGps & EXIF_GPS_TIMESTAMP) == 0)
+            tmp -= 1;
+        if ((exifInfo->enableGps & EXIF_GPS_PROCMETHOD) == 0)
+            tmp -= 1;
+        if ((exifInfo->enableGps & EXIF_GPS_IMG_DIRECTION) == 0)
+            tmp -= 2;
+
+        MEMCPY_S(pCur, NUM_SIZE, (int8_t *) &tmp, NUM_SIZE);
+        pCur += NUM_SIZE;
+
+        LongerTagOffset += NUM_SIZE + tmp*IFD_SIZE + OFFSET_SIZE;
+
+        writeExifIfd(&pCur, EXIF_TAG_GPS_VERSION_ID, EXIF_TYPE_BYTE,
+                     4, exifInfo->gps_version_id);
+        if (exifInfo->enableGps & EXIF_GPS_LATITUDE) {
+            writeExifIfd(&pCur, EXIF_TAG_GPS_LATITUDE_REF, EXIF_TYPE_ASCII,
+                         2, exifInfo->gps_latitude_ref);
+            writeExifIfd(&pCur, EXIF_TAG_GPS_LATITUDE, EXIF_TYPE_RATIONAL,
+                         3, exifInfo->gps_latitude, &LongerTagOffset, pIfdStart);
+        }
+
+        if (exifInfo->enableGps & EXIF_GPS_LONGITUDE) {
+            writeExifIfd(&pCur, EXIF_TAG_GPS_LONGITUDE_REF, EXIF_TYPE_ASCII,
+                         2, exifInfo->gps_longitude_ref);
+            writeExifIfd(&pCur, EXIF_TAG_GPS_LONGITUDE, EXIF_TYPE_RATIONAL,
+                         3, exifInfo->gps_longitude, &LongerTagOffset, pIfdStart);
+        }
+
+        if (exifInfo->enableGps & EXIF_GPS_ALTITUDE) {
+            writeExifIfd(&pCur, EXIF_TAG_GPS_ALTITUDE_REF, EXIF_TYPE_BYTE,
+                         1, exifInfo->gps_altitude_ref);
+            writeExifIfd(&pCur, EXIF_TAG_GPS_ALTITUDE, EXIF_TYPE_RATIONAL,
+                         1, &exifInfo->gps_altitude, &LongerTagOffset, pIfdStart);
+        }
+
+        if (exifInfo->enableGps & EXIF_GPS_TIMESTAMP) {
+            writeExifIfd(&pCur, EXIF_TAG_GPS_TIMESTAMP, EXIF_TYPE_RATIONAL,
+                         3, exifInfo->gps_timestamp, &LongerTagOffset, pIfdStart);
+        }
+
+        if (exifInfo->enableGps & EXIF_GPS_IMG_DIRECTION) {
+            writeExifIfd(&pCur, EXIF_TAG_GPS_IMG_DIRECTION_REF, EXIF_TYPE_ASCII,
+                         2, exifInfo->gps_img_direction_ref);
+            writeExifIfd(&pCur, EXIF_TAG_GPS_IMG_DIRECTION, EXIF_TYPE_RATIONAL,
+                         1, &exifInfo->gps_img_direction, &LongerTagOffset, pIfdStart);
+        }
+
+        if (exifInfo->enableGps & EXIF_GPS_PROCMETHOD) {
+            tmp = strlen((char*)exifInfo->gps_processing_method);
+            if (tmp > 0) {
+                if (tmp > 100) {
+                    tmp = 100;
+                }
+                unsigned char tmp_buf[100+sizeof(ExifAsciiPrefix)];
+                MEMCPY_S(tmp_buf, sizeof(tmp_buf), ExifAsciiPrefix, sizeof(ExifAsciiPrefix));
+                MEMCPY_S(&tmp_buf[sizeof(ExifAsciiPrefix)], 100, exifInfo->gps_processing_method, tmp);
+                writeExifIfd(&pCur, EXIF_TAG_GPS_PROCESSING_METHOD, EXIF_TYPE_UNDEFINED,
+                             tmp+sizeof(ExifAsciiPrefix), tmp_buf, &LongerTagOffset, pIfdStart);
+            }
+        }
+        writeExifIfd(&pCur, EXIF_TAG_GPS_DATESTAMP, EXIF_TYPE_ASCII,
+                     11, exifInfo->gps_datestamp, &LongerTagOffset, pIfdStart);
+        tmp = 0;
+        MEMCPY_S(pCur, OFFSET_SIZE, (int8_t *) &tmp, OFFSET_SIZE); // next IFD offset
+        pCur += OFFSET_SIZE;
+    }
+
+    // backup LongerTagOffset, if the total exif size is > 64K, we will use it.
+    LongerTagOffsetWithoutThumbnail = LongerTagOffset;
+    if (LongerTagOffsetWithoutThumbnail >= EXIF_SIZE_LIMITATION) {
+        LOGE("line:%d, in the makeExif, the size exceeds 64K", __LINE__);
+        return EXIF_FAIL;
+    }
+
+    // 2 1th IFD TIFF Tags
+    if (exifInfo->enableThumb && (m_thumbBuf != nullptr) && (m_thumbSize > 0)) {
+        writeThumbData(pIfdStart, pNextIfdOffset, &LongerTagOffset, exifInfo);
+    } else {
+        tmp = 0;
+        MEMCPY_S(pNextIfdOffset, OFFSET_SIZE, (int8_t *) &tmp, OFFSET_SIZE);  // NEXT IFD offset skipped on 0th IFD
+    }
+
+    // fill APP1 maker
+    unsigned char App1Marker[2] = { 0xff, 0xe1 };
+    MEMCPY_S(pApp1Start, 2, App1Marker, 2);
+    pApp1Start += 2;
+
+    // calc and fill the APP1 segment total size, 2 is length; 6 is ExifIdentifierCode
+    *size = 2 + 6 + LongerTagOffset;
+
+    writeMarkerSizeToBuf(pApp1Start, *size);
+
+    unsigned app2StartOffset = *size;
+    *size += 2; // APP1 marker size
+
+    exif_status status = EXIF_SUCCESS;
+
+    if (exifInfo->makernoteToApp2) {
+        LOG1("Makernote goes to APP2 segment.");
+        status = makeApp2((pApp1Start + app2StartOffset), *size, exifInfo);
+    }
+
+    if (status != EXIF_SUCCESS)
+        LOGW("Failed to create EXIF APP2 section");
+
+    LOG1("makeExif End");
+
+    return EXIF_SUCCESS;
+}
+
+void ExifCreater::writeMarkerSizeToBuf(unsigned char *ptrTo, unsigned int size)
+{
+    unsigned char size_mm[2] = {
+        static_cast<unsigned char>((size >> 8) & 0xFF),
+        static_cast<unsigned char>(size & 0xFF) };
+
+    MEMCPY_S(ptrTo, 2, size_mm, 2);
+}
+
+/**
+ * makeApp2
+ *
+ * Write the makernote to APP2 segment. Use multiple APP2 segments if makernote
+ * size is more than one segment (64 kb)
+ *
+ * \param pStartApp2 [IN] APP2 start address
+ * \param exifInfo [IN] Data to be written
+ * \param writeId [IN] Whether to write the Intel Makernote ID string.
+ * \param size [OUT] Total size after APP2 is written
+ */
+exif_status ExifCreater::makeApp2(void* pStartApp2, size_t& size, exif_attribute_t *exifInfo, bool writeId)
+{
+    LOG1("@%s", __func__);
+
+    // APP2 marker will be written starting from the pos pointed to by
+    // pStartApp2
+
+    if (exifInfo->makerNoteDataSize <= 0)
+        return EXIF_SUCCESS;
+
+    int bytesLeftForSegment = EXIF_SIZE_LIMITATION;
+    int bytesToWrite = exifInfo->makerNoteDataSize;
+
+    unsigned char *pCur = nullptr, *pApp2Start = nullptr;
+    unsigned char App2Marker[SIZEOF_APP2_MARKER] = { 0xff, 0xe2 };
+    int writeCount = 0;
+    unsigned char *toWrite = exifInfo->makerNoteData;
+
+    pCur = static_cast<unsigned char*>(pStartApp2);
+
+    // Write Makernote up to ~64kB, then split to a new
+    // APP2 segment, if needed
+    while (bytesToWrite > 0) {
+        pApp2Start = pCur;
+        pCur += 4;  // Skip 4 bytes for APP2 marker and length
+
+        if (writeId) {
+            MEMCPY_S(pCur, sizeof(MAKERNOTE_ID), MAKERNOTE_ID, sizeof(MAKERNOTE_ID));
+            pCur += sizeof(MAKERNOTE_ID);
+            size += sizeof(MAKERNOTE_ID);
+            // ID overhead for one APP2 segment
+            bytesLeftForSegment -= sizeof(MAKERNOTE_ID);
+        }
+
+        // Overhead for one APP2 segment:
+        bytesLeftForSegment -= (sizeof(App2Marker) + SIZEOF_LENGTH_FIELD);
+
+        if (bytesToWrite > bytesLeftForSegment) {
+            // More data to write than what fits to one APP2 marker
+            writeCount = bytesLeftForSegment;
+        } else {
+            // All data fits to one APP2 segment
+            writeCount = bytesToWrite;
+        }
+
+        bytesToWrite -= writeCount;
+
+        MEMCPY_S(pCur, writeCount, toWrite, writeCount);
+        pCur += writeCount;
+        toWrite += writeCount;
+        size += writeCount;
+
+        // Last, put the APP2 marker to the beginning of the segment
+        MEMCPY_S(pApp2Start, sizeof(App2Marker), App2Marker, sizeof(App2Marker));
+        pApp2Start += sizeof(App2Marker);
+
+        // Length field goes after the APP2 marker
+        int app2SegmentSize = writeCount + SIZEOF_LENGTH_FIELD; // Raw data written + overhead
+        if (writeId)
+            app2SegmentSize += sizeof(MAKERNOTE_ID);
+
+        writeMarkerSizeToBuf(pApp2Start, app2SegmentSize);
+
+        // add the 2 bytes for both length field and APP2 marker, the caller has to know the total size
+        size += sizeof(App2Marker) + SIZEOF_LENGTH_FIELD;
+
+        // Reset byte counts for another APP2 segment, if needed
+        bytesLeftForSegment = EXIF_SIZE_LIMITATION;
+    }
+
+    return EXIF_SUCCESS;
+}
+
+void ExifCreater::writeThumbData(unsigned char *pIfdStart,
+                                        unsigned char *pNextIfdOffset,
+                                        unsigned int *LongerTagOffset,
+                                        exif_attribute_t *exifInfo)
+{
+    unsigned char *pCur;
+    unsigned int tmp;
+
+    // firstly calc the exif total size, if it's > 64K, we'll disable the thumbnail
+    tmp  = 4 + 6 + *LongerTagOffset;  // 4 is APP1 marker and length; 6 is ExifIdentifierCode
+    tmp += NUM_SIZE + NUM_1TH_IFD_TIFF*IFD_SIZE + OFFSET_SIZE;
+    tmp += sizeof(exifInfo->x_resolution) + sizeof(exifInfo->y_resolution);
+    tmp += m_thumbSize;
+
+    if(tmp > EXIF_SIZE_LIMITATION) {
+        LOGD("line:%d, in makeExif, exif total size(%d) > 64K, we'll disable thumbnail.", __LINE__, tmp);
+        m_thumbSize = 0;
+        m_thumbBuf = nullptr;
+        tmp = 0;
+        MEMCPY_S(pNextIfdOffset, OFFSET_SIZE, (int8_t *) &tmp, OFFSET_SIZE);  // NEXT IFD offset skipped on 0th IFD
+    } else {
+        tmp = *LongerTagOffset;
+        MEMCPY_S(pNextIfdOffset, OFFSET_SIZE, (int8_t *) &tmp, OFFSET_SIZE);  // NEXT IFD offset skipped on 0th IFD
+
+        pCur = pIfdStart + *LongerTagOffset;
+
+        tmp = NUM_1TH_IFD_TIFF;
+        MEMCPY_S(pCur, NUM_SIZE, (int8_t *) &tmp, NUM_SIZE);
+        pCur += NUM_SIZE;
+
+        *LongerTagOffset += NUM_SIZE + NUM_1TH_IFD_TIFF*IFD_SIZE + OFFSET_SIZE;
+
+        writeExifIfd(&pCur, EXIF_TAG_IMAGE_WIDTH, EXIF_TYPE_LONG,
+                     1, exifInfo->widthThumb);
+        writeExifIfd(&pCur, EXIF_TAG_IMAGE_HEIGHT, EXIF_TYPE_LONG,
+                     1, exifInfo->heightThumb);
+        writeExifIfd(&pCur, EXIF_TAG_COMPRESSION_SCHEME, EXIF_TYPE_SHORT,
+                     1, exifInfo->compression_scheme);
+        writeExifIfd(&pCur, EXIF_TAG_ORIENTATION, EXIF_TYPE_SHORT,
+                     1, exifInfo->orientation);
+        writeExifIfd(&pCur, EXIF_TAG_X_RESOLUTION, EXIF_TYPE_RATIONAL,
+                     1, &exifInfo->x_resolution, LongerTagOffset, pIfdStart);
+        writeExifIfd(&pCur, EXIF_TAG_Y_RESOLUTION, EXIF_TYPE_RATIONAL,
+                     1, &exifInfo->y_resolution, LongerTagOffset, pIfdStart);
+        writeExifIfd(&pCur, EXIF_TAG_RESOLUTION_UNIT, EXIF_TYPE_SHORT,
+                     1, exifInfo->resolution_unit);
+        writeExifIfd(&pCur, EXIF_TAG_JPEG_INTERCHANGE_FORMAT, EXIF_TYPE_LONG,
+                     1, *LongerTagOffset);
+        writeExifIfd(&pCur, EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LEN, EXIF_TYPE_LONG,
+                     1, m_thumbSize);
+
+        tmp = 0;
+        MEMCPY_S(pCur, OFFSET_SIZE, (int8_t *) &tmp, OFFSET_SIZE); // next IFD offset
+        //pCur += OFFSET_SIZE;
+
+        MEMCPY_S(pIfdStart + *LongerTagOffset, m_thumbSize, m_thumbBuf, m_thumbSize);
+        *LongerTagOffset += m_thumbSize;
+    }
+}
+
+void ExifCreater::writeExifIfd(unsigned char **pCur,
+                                         unsigned short tag,
+                                         unsigned short type,
+                                         unsigned int count,
+                                         uint32_t value)
+{
+    MEMCPY_S(*pCur, 2, (int8_t *) &tag, 2);
+    *pCur += 2;
+    MEMCPY_S(*pCur, 2, (int8_t *) &type, 2);
+    *pCur += 2;
+    MEMCPY_S(*pCur, 4, (int8_t *) &count, 4);
+    *pCur += 4;
+    MEMCPY_S(*pCur, 4, (int8_t *) &value, 4);
+    *pCur += 4;
+}
+
+void ExifCreater::writeExifIfd(unsigned char **pCur,
+                                         unsigned short tag,
+                                         unsigned short type,
+                                         unsigned int count,
+                                         unsigned char *pValue)
+{
+    char buf[4] = { 0,};
+
+    MEMCPY_S(buf, count, pValue, count);
+    MEMCPY_S(*pCur, 2, (int8_t *) &tag, 2);
+    *pCur += 2;
+    MEMCPY_S(*pCur, 2, (int8_t *) &type, 2);
+    *pCur += 2;
+    MEMCPY_S(*pCur, 4, (int8_t *) &count, 4);
+    *pCur += 4;
+    MEMCPY_S(*pCur, 4, (int8_t *) buf, 4);
+    *pCur += 4;
+}
+
+void ExifCreater::writeExifIfd(unsigned char **pCur,
+                                         unsigned short tag,
+                                         unsigned short type,
+                                         unsigned int count,
+                                         unsigned char *pValue,
+                                         unsigned int *offset,
+                                         unsigned char *start)
+{
+    MEMCPY_S(*pCur, 2, (int8_t *) &tag, 2);
+    *pCur += 2;
+    MEMCPY_S(*pCur, 2, (int8_t *) &type, 2);
+    *pCur += 2;
+    MEMCPY_S(*pCur, 4, (int8_t *) &count, 4);
+    *pCur += 4;
+    MEMCPY_S(*pCur, 4, (int8_t *) offset, 4);
+    *pCur += 4;
+    MEMCPY_S(start + *offset, count, pValue, count);
+    *offset += count;
+}
+
+void ExifCreater::writeExifIfd(unsigned char **pCur,
+                                         unsigned short tag,
+                                         unsigned short type,
+                                         unsigned int count,
+                                         rational_t *pValue,
+                                         unsigned int *offset,
+                                         unsigned char *start)
+{
+    MEMCPY_S(*pCur, 2, (int8_t *) &tag, 2);
+    *pCur += 2;
+    MEMCPY_S(*pCur, 2, (int8_t *) &type, 2);
+    *pCur += 2;
+    MEMCPY_S(*pCur, 4, (int8_t *) &count, 4);
+    *pCur += 4;
+    MEMCPY_S(*pCur, 4, (int8_t *) offset, 4);
+    *pCur += 4;
+    MEMCPY_S(start + *offset, 8 * count, (int8_t *) pValue, 8 * count);
+    *offset += 8 * count;
+}
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/jpeg/ExifCreater.h b/camera/hal/intel/ipu6/src/jpeg/ExifCreater.h
new file mode 100644
index 000000000000..406cbffdc8b4
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/jpeg/ExifCreater.h
@@ -0,0 +1,141 @@
+/*
+ * Copyright Samsung Electronics Co.,LTD.
+ * Copyright (C) 2010 The Android Open Source Project
+ * Copyright (C) 2016-2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * JPEG DRIVER MODULE (JpegEncoder.h)
+ * Author  : ge.lee       -- initial version
+ * Date    : 03 June 2010
+ * Purpose : This file implements the JPEG encoder APIs as needed by Camera HAL
+ */
+
+#pragma once
+
+#include <stdint.h>
+#include <sys/ioctl.h>
+
+#include "Exif.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+
+#define MAX_JPG_WIDTH                   4352
+#define MAX_JPG_HEIGHT                  3264
+#define MAX_JPG_RESOLUTION              (MAX_JPG_WIDTH * MAX_JPG_HEIGHT)
+
+#define MAX_JPG_THUMBNAIL_WIDTH         640
+#define MAX_JPG_THUMBNAIL_HEIGHT        480
+#define MAX_JPG_THUMBNAIL_RESOLUTION    (MAX_JPG_THUMBNAIL_WIDTH *  \
+                                            MAX_JPG_THUMBNAIL_HEIGHT)
+
+#define MAX_RGB_WIDTH                   800
+#define MAX_RGB_HEIGHT                  480
+#define MAX_RGB_RESOLUTION              (MAX_RGB_WIDTH * MAX_RGB_HEIGHT)
+
+/*******************************************************************************/
+/* define JPG & image memory */
+/* memory area is 4k(PAGE_SIZE) aligned because of VirtualCopyEx() */
+#define JPG_STREAM_BUF_SIZE     \
+        ((MAX_JPG_RESOLUTION / PAGE_SIZE + 1) * PAGE_SIZE)
+#define JPG_STREAM_THUMB_BUF_SIZE   \
+        ((MAX_JPG_THUMBNAIL_RESOLUTION / PAGE_SIZE + 1) * PAGE_SIZE)
+#define JPG_FRAME_BUF_SIZE  \
+        (((MAX_JPG_RESOLUTION * 3) / PAGE_SIZE + 1) * PAGE_SIZE)
+#define JPG_FRAME_THUMB_BUF_SIZE    \
+        (((MAX_JPG_THUMBNAIL_RESOLUTION * 3) / PAGE_SIZE + 1) * PAGE_SIZE)
+#define JPG_RGB_BUF_SIZE    \
+        (((MAX_RGB_RESOLUTION * 4) / PAGE_SIZE + 1) * PAGE_SIZE)
+
+#define JPG_TOTAL_BUF_SIZE  (JPG_STREAM_BUF_SIZE + \
+                             JPG_STREAM_THUMB_BUF_SIZE + \
+                             JPG_FRAME_BUF_SIZE + \
+                             JPG_FRAME_THUMB_BUF_SIZE + \
+                             JPG_RGB_BUF_SIZE)
+
+#define JPG_MAIN_START      0x00
+#define JPG_THUMB_START     JPG_STREAM_BUF_SIZE
+#define IMG_MAIN_START      (JPG_STREAM_BUF_SIZE + JPG_STREAM_THUMB_BUF_SIZE)
+#define IMG_THUMB_START     (IMG_MAIN_START + JPG_FRAME_BUF_SIZE)
+/*******************************************************************************/
+
+const char MAKERNOTE_ID[] = { 0x49, 0x6e, 0x74, 0x65, 0x6c, 0x4d,
+                              0x6b, 0x6e, 0x6f, 0x74, 0x65, 0x0 /* "IntelMknote\0" */ };
+
+const unsigned SIZEOF_LENGTH_FIELD = 2;
+const unsigned SIZEOF_APP2_MARKER = 2;
+const unsigned SIZEOF_APP2_OVERHEAD = sizeof(MAKERNOTE_ID) + SIZEOF_APP2_MARKER + SIZEOF_LENGTH_FIELD;
+const bool ENABLE_APP2_MARKER = true;
+typedef enum {
+    EXIF_FAIL = -1,
+    EXIF_SUCCESS = 0
+} exif_status;
+
+class ExifCreater {
+public:
+    ExifCreater();
+    virtual ~ExifCreater();
+
+    exif_status setThumbData(const void *thumbBuf, unsigned int thumbSize);
+
+    bool isThumbDataSet() const;
+
+    exif_status makeExif(void *exifOut,
+                               exif_attribute_t *exifInfo,
+                               size_t *size);
+
+private:
+    exif_status makeApp2(void* pStartApp2, size_t& size, exif_attribute_t *exifInfo, bool writeId = true);
+    void writeMarkerSizeToBuf(unsigned char *ptrTo, unsigned int size);
+    /*
+        Every IFD has 12Bytes.
+        Tag ID, 2B; Type, 2B; Count, 4B; Value/Offset, 4B;
+        If it is Value, please use the first two functions.
+        If it is Offset, please use the last two functions
+        and store the data in the rear.
+    */
+    void writeExifIfd(unsigned char **pCur,
+                                 unsigned short tag,
+                                 unsigned short type,
+                                 unsigned int count,
+                                 uint32_t value);
+    void writeExifIfd(unsigned char **pCur,
+                                 unsigned short tag,
+                                 unsigned short type,
+                                 unsigned int count,
+                                 unsigned char *pValue);
+    void writeExifIfd(unsigned char **pCur,
+                                 unsigned short tag,
+                                 unsigned short type,
+                                 unsigned int count,
+                                 rational_t *pValue,
+                                 unsigned int *offset,
+                                 unsigned char *start);
+    void writeExifIfd(unsigned char **pCur,
+                                 unsigned short tag,
+                                 unsigned short type,
+                                 unsigned int count,
+                                 unsigned char *pValue,
+                                 unsigned int *offset,
+                                 unsigned char *start);
+    void writeThumbData(unsigned char *pIfdStart,
+                                 unsigned char *pNextIfdOffset,
+                                 unsigned int *LongerTagOffset,
+                                 exif_attribute_t *exifInfo);
+
+    unsigned char * m_thumbBuf; // MAP: Added to set thumbnail from external data
+    unsigned int m_thumbSize; // MAP: Added to set thumbnail from external data
+};
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/jpeg/IJpegEncoder.h b/camera/hal/intel/ipu6/src/jpeg/IJpegEncoder.h
new file mode 100644
index 000000000000..5f76d307052c
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/jpeg/IJpegEncoder.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+namespace icamera {
+
+#define DEFAULT_JPEG_QUALITY 95
+static const unsigned char mJpegMarkerSOI[2] = {0xFF, 0xD8};
+
+struct EncodePackage {
+    EncodePackage():
+        inputWidth(0),
+        inputHeight(0),
+        inputStride(0),
+        inputFormat(0),
+        inputSize(0),
+        inputBufferHandle(nullptr),
+        inputData(nullptr),
+        outputWidth(0),
+        outputHeight(0),
+        outputSize(0),
+        outputBufferHandle(nullptr),
+        outputData(nullptr),
+        quality(0),
+        encodedDataSize(0),
+        exifData(nullptr),
+        exifDataSize(0) {}
+
+    /* input buffer info */
+    int inputWidth;
+    int inputHeight;
+    int inputStride;
+    int inputFormat;
+    unsigned int inputSize;
+    void *inputBufferHandle;
+    void *inputData;
+
+    /* output buffer info */
+    int outputWidth;
+    int outputHeight;
+    unsigned int outputSize;
+    void *outputBufferHandle;
+    void *outputData;
+
+    int quality;
+    uint32_t encodedDataSize;
+    uint8_t *exifData;
+    uint32_t exifDataSize;
+};
+
+class IJpegEncoder {
+
+public:
+    IJpegEncoder() {};
+    virtual ~IJpegEncoder() {};
+
+    static std::unique_ptr<IJpegEncoder> createJpegEncoder();
+    virtual bool doJpegEncode(EncodePackage& package) = 0;
+private:
+    DISALLOW_COPY_AND_ASSIGN(IJpegEncoder);
+};
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/jpeg/JpegMaker.cpp b/camera/hal/intel/ipu6/src/jpeg/JpegMaker.cpp
new file mode 100644
index 000000000000..117e15716d30
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/jpeg/JpegMaker.cpp
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2016-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "JpegMaker"
+
+#include "JpegMaker.h"
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+
+JpegMaker::JpegMaker()
+{
+    LOG2("@%s", __func__);
+    mExifMaker = std::unique_ptr<EXIFMaker>(new EXIFMaker());
+}
+
+JpegMaker::~JpegMaker()
+{
+    LOG2("@%s", __func__);
+}
+
+status_t JpegMaker::setupExifWithMetaData(int bufWidth, int bufHeight,
+                                          const Parameters &parameter,
+                                          ExifMetaData *metaData)
+{
+    LOG2("@%s", __func__);
+
+    status_t status = OK;
+
+    status = processJpegSettings(parameter, metaData);
+    CheckError(status != OK, status, "@%s: Process settngs for JPEG failed!", __func__);
+
+    mExifMaker->initialize(bufWidth, bufHeight);
+    mExifMaker->pictureTaken(metaData);
+
+    mExifMaker->enableFlash(metaData->flashFired, metaData->v3AeMode, metaData->flashMode);
+    mExifMaker->updateSensorInfo(parameter);
+    mExifMaker->saveMakernote(parameter);
+
+    status = processExifSettings(parameter, metaData);
+    if (status != OK) {
+        LOGE("@%s: Process settngs for Exif! %d", __func__, status);
+        return status;
+    }
+
+    mExifMaker->initializeLocation(metaData);
+    mExifMaker->setSensorAeConfig();
+
+    if (metaData->software)
+        mExifMaker->setSoftware(metaData->software);
+
+    return status;
+}
+
+status_t JpegMaker::getExif(const EncodePackage &thumbnailPackage, uint8_t *exifPtr, uint32_t *exifSize)
+{
+    if (thumbnailPackage.encodedDataSize > 0 && thumbnailPackage.quality > 0) {
+        mExifMaker->setThumbnail(static_cast<unsigned char*>(thumbnailPackage.outputData),
+                                 thumbnailPackage.encodedDataSize,
+                                 thumbnailPackage.outputWidth, thumbnailPackage.outputHeight);
+    }
+    *exifSize = mExifMaker->makeExif(exifPtr);
+    return *exifSize > 0 ? OK : UNKNOWN_ERROR;
+}
+
+status_t JpegMaker::processExifSettings(const Parameters &params,
+                                        ExifMetaData *metaData)
+{
+    LOG2("@%s:", __func__);
+    status_t status = OK;
+
+    status = processGpsSettings(params, metaData);
+    status |= processColoreffectSettings(params, metaData);
+    status |= processScalerCropSettings(params, metaData);
+    status |= processEvCompensationSettings(params, metaData);
+
+    return status;
+}
+
+/* copy exif data into output buffer */
+void JpegMaker::writeExifData(EncodePackage &package)
+{
+    if (package.exifDataSize == 0)
+        return;
+
+    CheckError(!package.outputData, VOID_VALUE, "@%s, outputData is nullptr", __func__);
+    CheckError(!package.exifData, VOID_VALUE, "@%s, exifData is nullptr", __func__);
+
+    unsigned int jSOISize = sizeof(mJpegMarkerSOI);
+    unsigned char *jpegOut = reinterpret_cast<unsigned char*>(package.outputData);
+    MEMCPY_S(jpegOut, jSOISize, mJpegMarkerSOI, jSOISize);
+    jpegOut += jSOISize;
+
+    MEMCPY_S(jpegOut, package.exifDataSize,
+             reinterpret_cast<unsigned char*>(package.exifData), package.exifDataSize);
+}
+
+/**
+ * processJpegSettings
+ *
+ * Store JPEG settings to the exif metadata
+ *
+ * \param [IN] jpeg parameters
+ * \ metaData [out] metadata of the request
+ *
+ */
+status_t JpegMaker::processJpegSettings(const Parameters &params,
+                                        ExifMetaData *metaData)
+{
+    LOG2("@%s:", __func__);
+    status_t status = OK;
+
+    CheckError(!metaData, UNKNOWN_ERROR, "MetaData struct not intialized");
+
+    // make jpeg with thumbnail or not
+    camera_resolution_t thumbSize = {0};
+    params.getJpegThumbnailSize(thumbSize);
+    LOG2("%s request thumbname size %dx%d", __func__, thumbSize.width, thumbSize.height);
+
+    uint8_t new_jpeg_quality = DEFAULT_JPEG_QUALITY;
+    int ret = params.getJpegQuality(&new_jpeg_quality);
+    if (ret != icamera::OK) {
+        LOGW("cannot find jpeg quality, use default");
+    }
+    metaData->mJpegSetting.jpegQuality = new_jpeg_quality;
+
+    uint8_t new_jpeg_thumb_quality = DEFAULT_JPEG_QUALITY;
+    params.getJpegThumbnailQuality(&new_jpeg_thumb_quality);
+    metaData->mJpegSetting.jpegThumbnailQuality = new_jpeg_thumb_quality;
+    metaData->mJpegSetting.thumbWidth = thumbSize.width;
+    metaData->mJpegSetting.thumbHeight = thumbSize.height;
+
+    int new_rotation = 0;
+    params.getJpegRotation(new_rotation);
+    metaData->mJpegSetting.orientation = new_rotation;
+
+    LOG1("jpegQuality=%d,thumbQuality=%d,thumbW=%d,thumbH=%d,orientation=%d",
+         metaData->mJpegSetting.jpegQuality,
+         metaData->mJpegSetting.jpegThumbnailQuality,
+         metaData->mJpegSetting.thumbWidth,
+         metaData->mJpegSetting.thumbHeight,
+         metaData->mJpegSetting.orientation);
+
+    return status;
+}
+
+/**
+ * This function will get GPS metadata from request setting
+ *
+ * \param[in] settings The Anroid metadata to process GPS settings from
+ * \param[out] metadata The EXIF data where the GPS setting are written to
+ */
+status_t JpegMaker::processGpsSettings(const Parameters &param,
+                                       ExifMetaData *metadata)
+{
+    LOG2("@%s:", __func__);
+    status_t status = OK;
+
+    // gps latitude
+    double new_gps_latitude = 0.0;
+    param.getJpegGpsLatitude(new_gps_latitude);
+    metadata->mGpsSetting.latitude = new_gps_latitude;
+
+    double new_gps_longitude = 0.0;
+    param.getJpegGpsLongitude(new_gps_longitude);
+    metadata->mGpsSetting.longitude = new_gps_longitude;
+
+    double new_gps_altitude = 0.0;
+    param.getJpegGpsAltitude(new_gps_altitude);
+    metadata->mGpsSetting.altitude = new_gps_altitude;
+
+    // gps timestamp
+    int64_t new_gps_timestamp = 0;
+    param.getJpegGpsTimeStamp(new_gps_timestamp);
+    metadata->mGpsSetting.gpsTimeStamp = new_gps_timestamp;
+
+    // gps processing method
+    char new_gps_processing_method[MAX_NUM_GPS_PROCESSING_METHOD + 1];
+    CLEAR(new_gps_processing_method);
+    param.getJpegGpsProcessingMethod(MAX_NUM_GPS_PROCESSING_METHOD, new_gps_processing_method);
+    if (strlen(new_gps_processing_method) != 0) {
+        snprintf(metadata->mGpsSetting.gpsProcessingMethod,
+                 sizeof(metadata->mGpsSetting.gpsProcessingMethod),
+                 "%s", new_gps_processing_method);
+    }
+
+    return status;
+}
+
+status_t JpegMaker::processColoreffectSettings(const Parameters &param, ExifMetaData *metaData)
+{
+    LOG2("@%s:", __func__);
+    status_t status = OK;
+
+    camera_effect_mode_t  new_image_effect = CAM_EFFECT_NONE;
+    param.getImageEffect(new_image_effect);
+    metaData->effectMode = new_image_effect;
+    LOG2("effect mode=%d", metaData->effectMode);
+
+    return status;
+}
+
+status_t JpegMaker::processScalerCropSettings(const Parameters &param, ExifMetaData *metaData)
+{
+    LOG2("@%s:", __func__);
+    status_t status = OK;
+
+    return status;
+}
+
+status_t JpegMaker::processEvCompensationSettings(const Parameters &param, ExifMetaData *metaData)
+{
+    LOG2("@%s:", __func__);
+    status_t status = OK;
+
+    return status;
+}
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/jpeg/JpegMaker.h b/camera/hal/intel/ipu6/src/jpeg/JpegMaker.h
new file mode 100644
index 000000000000..e19991c12d69
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/jpeg/JpegMaker.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2016-2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+
+#include "EXIFMaker.h"
+#include "EXIFMetaData.h"
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+#include "IJpegEncoder.h"
+
+namespace icamera {
+
+/**
+ * \class JpegMaker
+ * Does the EXIF header creation and appending to the provided jpeg buffer
+ *
+ */
+class JpegMaker {
+public: /* Methods */
+    explicit JpegMaker();
+    virtual ~JpegMaker();
+    status_t setupExifWithMetaData(int bufWidth, int bufHeight,
+                                   const Parameters &parameter,
+                                   ExifMetaData *metaData);
+    status_t getExif(const EncodePackage &thumbnailPackage, uint8_t *exifPtr, uint32_t *exifSize);
+    void writeExifData(EncodePackage &package);
+
+private: /* Methods */
+    // prevent copy constructor and assignment operator
+    DISALLOW_COPY_AND_ASSIGN(JpegMaker);
+
+    status_t processExifSettings(const Parameters &params, ExifMetaData *metaData);
+    status_t processJpegSettings(const Parameters &params, ExifMetaData *metaData);
+    status_t processGpsSettings(const Parameters &params, ExifMetaData *metadata);
+    status_t processColoreffectSettings(const Parameters &params, ExifMetaData *metaData);
+    status_t processScalerCropSettings(const Parameters &params, ExifMetaData *metaData);
+    status_t processEvCompensationSettings(const Parameters &params, ExifMetaData *metaData);
+
+private:  /* Members */
+    std::unique_ptr<EXIFMaker> mExifMaker;
+};
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.cpp b/camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.cpp
new file mode 100644
index 000000000000..fc619f2bde6d
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.cpp
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "JpegEncoderCore"
+
+#include "JpegEncoderCore.h"
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+#include <linux/videodev2.h>
+#include <cros-camera/camera_buffer_manager.h>
+
+namespace icamera {
+
+JpegEncoderCore::JpegEncoderCore()
+{
+    LOG1("@%s", __func__);
+}
+
+JpegEncoderCore::~JpegEncoderCore()
+{
+    LOG1("@%s", __func__);
+}
+
+std::unique_ptr<IJpegEncoder> IJpegEncoder::createJpegEncoder()
+{
+    return std::unique_ptr<JpegEncoderCore>(new JpegEncoderCore());
+}
+
+/**
+ * doJpegEncode
+ *
+ * Do HW / SW JPEG encoding for the main buffer
+ * Do SW JPEG encoding for the thumbnail buffer
+ *
+ * \param package [IN] Information that should be encoded
+ */
+bool JpegEncoderCore::doJpegEncode(EncodePackage& package)
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
+
+    CheckError(package.inputWidth != package.outputWidth || package.inputHeight != package.outputHeight,
+          false, "@%s, ImgEncoder::encodeSync failed: input size != output size", __func__);
+    CheckError(package.inputWidth <= 0 || package.outputWidth <= 0 || package.inputHeight <= 0 || package.outputHeight <= 0,
+          false, "@%s, inputWidth:%d, outputWidth:%d, inputHeight:%d, outputHeight:%d",
+          __func__, package.inputWidth, package.outputWidth, package.inputHeight, package.outputHeight);
+
+    nsecs_t startTime = CameraUtils::systemTime();
+    bool ret = mJpegCompressor->CompressImage(*(reinterpret_cast<buffer_handle_t*>(package.inputBufferHandle)),
+                                              package.inputData,
+                                              V4L2_PIX_FMT_NV12,
+                                              *(reinterpret_cast<buffer_handle_t*>(package.outputBufferHandle)),
+                                              package.outputData,
+                                              package.outputSize,
+                                              package.inputWidth, package.inputHeight,
+                                              package.quality, package.exifData,
+                                              package.exifDataSize, &package.encodedDataSize);
+    LOGE("@%s: encoding ret:%d, %dx%d need % ms, jpeg size %u, quality %d)", __func__,
+         ret, package.outputWidth, package.outputHeight, (CameraUtils::systemTime() - startTime) / 1000000,
+         package.encodedDataSize, package.quality);
+    return ret && package.encodedDataSize > 0;
+}
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.h b/camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.h
new file mode 100644
index 000000000000..50fa39ff738e
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "iutils/Utils.h"
+#include "IJpegEncoder.h"
+#include <memory>
+#include <mutex>
+#include <cros-camera/jpeg_compressor.h>
+
+namespace icamera {
+
+class JpegEncoderCore : public IJpegEncoder {
+
+public:
+    JpegEncoderCore();
+    ~JpegEncoderCore();
+
+    virtual bool doJpegEncode(EncodePackage& package);
+private:
+    DISALLOW_COPY_AND_ASSIGN(JpegEncoderCore);
+
+    std::unique_ptr<cros::JpegCompressor> mJpegCompressor;
+};
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.cpp b/camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.cpp
new file mode 100644
index 000000000000..21ea1e81e4a2
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.cpp
@@ -0,0 +1,772 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2016-2020 Intel Corporation. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define LOG_TAG "SWJpegEncoder"
+
+#include "SWJpegEncoder.h"
+#include "ImageConverter.h"
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+#include <string>
+
+#define RESOLUTION_1_3MP_WIDTH    1280
+#define RESOLUTION_1_3MP_HEIGHT   960
+
+namespace icamera {
+
+SWJpegEncoder::SWJpegEncoder() :
+    mJpegSize(-1)
+    ,mTotalWidth(0)
+    ,mTotalHeight(0)
+    ,mDstBuf(nullptr)
+    ,mCPUCoresNum(1)
+{
+    LOG2("@%s, line:%d", __func__, __LINE__);
+}
+
+SWJpegEncoder::~SWJpegEncoder()
+{
+    LOG2("@%s, line:%d", __func__, __LINE__);
+}
+
+std::unique_ptr<IJpegEncoder> IJpegEncoder::createJpegEncoder()
+{
+    return std::unique_ptr<SWJpegEncoder>(new SWJpegEncoder());
+}
+
+/**
+ * \param package: encode package for either thumbnail or main image
+ * \return true if encoding succeeds
+ * \return false if encoding fails
+ */
+bool SWJpegEncoder::doJpegEncode(EncodePackage& package)
+{
+    int status = 0;
+    nsecs_t startTime = CameraUtils::systemTime();
+
+    LOG2("@%s:\n\t IN  = {buf:%p, w:%u, h:%u, sz:%u, stride:%d, fmt:%s}" \
+         "\n\t OUT = {buf:%p, w:%u, h:%u, sz:%u, q:%d}",
+         __func__,
+         package.inputData, package.inputWidth, package.inputHeight,
+         package.inputSize, package.inputStride,
+         icamera::CameraUtils::format2string(package.inputFormat).c_str(),
+         package.outputData, package.outputWidth, package.outputHeight,
+         package.outputSize, package.quality);
+
+    if (package.inputWidth == 0 || package.inputHeight== 0 || package.inputFormat == 0) {
+        ALOGE("Invalid input received!");
+        mJpegSize = -1;
+        goto exit;
+    }
+
+    mTotalWidth = package.inputWidth;
+    mTotalHeight = package.inputHeight;
+
+    /*
+     * For encoding main buffer, need to skip the exif data and SOI header.
+     * Because the SOI(jpeg maker) is written in the beginning of jpeg data when
+     * do encode, so only skip the exif data size here, and the SOI will be moved
+     * to the head of output buffer
+     */
+    mDstBuf = reinterpret_cast<unsigned char*>(package.outputData) + package.exifDataSize;
+
+    if (useMultiThreadEncoding(package.inputWidth, package.inputHeight))
+        status = swEncodeMultiThread(package);
+    else
+        status = swEncode(package);
+
+    if (status < 0)
+        goto exit;
+
+    package.encodedDataSize = mJpegSize;
+
+    LOG2("@%s encode, total consume:%ums, encoded jpeg size: %d",
+         __func__, (unsigned)((CameraUtils::systemTime() - startTime) / 1000000), mJpegSize);
+
+    return mJpegSize > 0 ? true : false;
+exit:
+    return false;
+}
+
+/**
+ *  This function will decide if we need to enable the multi thread jpeg encoding.
+ *  currently, we have two conditions to use the old single jpeg encoding.
+ *  one is that the resolution is smaller than the 1.3M
+ *  the other is that the CPU number is 1
+ *
+ *  \param width: the Jpeg width
+ *  \param height: the Jpeg height
+ *
+ *  \return false if we don't need multi thread Jpeg encoding
+ *  \return true if we need multi thread Jpeg encoding
+ */
+bool SWJpegEncoder::useMultiThreadEncoding(int width, int height)
+{
+    LOG2("@%s, line:%d, width:%d, height:%d", __func__, __LINE__, width, height);
+    bool ret = false;
+
+    /* more conditions could be added to here by according to the request */
+    if ((width < RESOLUTION_1_3MP_WIDTH && height < RESOLUTION_1_3MP_HEIGHT))
+        ret = false;
+    else if (width & 0xf)
+        ret = false;
+    else
+        ret = true;
+
+    LOG2("@%s, line:%d, ret:%d", __func__, __LINE__, ret);
+    return ret;
+}
+
+/**
+ * encode jpeg by calling the SWJpegEncoder which is the libjpeg wrapper
+ * single thread.
+ *
+ * \param package: jpeg encode package
+ * \return 0 if encoding was successful
+ * \return -1 if encoding failed
+ */
+int SWJpegEncoder::swEncode(const EncodePackage& package)
+{
+    LOG2("@%s, line:%d, use the libjpeg to do sw jpeg encoding", __func__, __LINE__);
+    int status = 0;
+    Codec encoder;
+
+    encoder.init();
+    encoder.setJpegQuality(package.quality);
+    status = encoder.configEncoding(package.inputWidth, package.inputHeight,
+                                    package.inputStride,
+                                    static_cast<JSAMPLE *>(mDstBuf),
+                                    (package.outputSize - package.exifDataSize));
+    const void *uv_buf = static_cast<unsigned char*>(package.inputData) + package.inputStride * package.inputHeight;
+
+    if (status)
+        goto exit;
+
+    status = encoder.doJpegEncoding(package.inputData, uv_buf, package.inputFormat);
+    if (status)
+        goto exit;
+
+exit:
+    if (status)
+        mJpegSize = -1;
+    else
+        encoder.getJpegSize(&mJpegSize);
+
+    encoder.deInit();
+
+    return (status ? -1 : 0);
+}
+
+/**
+ * encode jpeg by calling the SWJpegEncoder which is the libjpeg wrapper
+ * multi thread.
+ * the thread number depends on the CPU number.
+ *
+ * \param package: jpeg encode package
+ * \return 0 if encoding was successful
+ * \return -1 if encoding failed
+ */
+int SWJpegEncoder::swEncodeMultiThread(const EncodePackage &package)
+{
+    LOG2("@%s, line:%d, use the libjpeg to do sw jpeg encoding", __func__, __LINE__);
+    int status = 0;
+
+    init(mCPUCoresNum);
+    config(package);
+
+    status = doJpegEncodingMultiThread();
+    if (status)
+        goto exit;
+
+exit:
+    mJpegSize = status ? -1 : mergeJpeg();
+    deInit();
+
+    return (status ? -1 : 0);
+}
+
+/**
+ * Initialize for the multi thread jpeg encoding
+ *
+ * it will create n CodecWorkerThread by according to the thread number.
+ */
+void SWJpegEncoder::init(unsigned int threadNum)
+{
+    unsigned int num = CLIP(threadNum, MAX_THREAD_NUM, MIN_THREAD_NUM);
+    LOG2("@%s, line:%d, thread number, pass:%d, real:%d", __func__, __LINE__, threadNum, num);
+
+    for (unsigned int i = 0; i < num; i++) {
+        std::shared_ptr<CodecWorkerThread> codecWorkerThread(new CodecWorkerThread);
+        mSwJpegEncoder.push_back(codecWorkerThread);
+    }
+}
+
+/**
+ * deInit for the multi thread jpeg encoding
+ *
+ * it will release all n CodecWorkerThread
+ */
+void SWJpegEncoder::deInit(void)
+{
+    LOG2("@%s, line:%d", __func__, __LINE__);
+    for (auto& encoder : mSwJpegEncoder) {
+        encoder.reset();
+    }
+
+    mSwJpegEncoder.clear();
+}
+
+/**
+ * configue every thread for multi thread jpeg
+ *
+ * \param package: jpeg encode package
+ */
+void SWJpegEncoder::config(const EncodePackage &package)
+{
+    LOG2("@%s, line:%d", __func__, __LINE__);
+    std::shared_ptr<CodecWorkerThread> encThread;
+    CodecWorkerThread::CodecConfig cfg;
+
+    for (unsigned int i = 0; i < mSwJpegEncoder.size(); i++) {
+        cfg.width = package.inputWidth;
+        /*
+            for example, there are 4 threads.
+            the first 3 threads must align to 16 which is NV12_MCU_SIZE
+            but for the last thread, it doesn't have this request.
+        */
+        cfg.height = ALIGN_16(package.inputHeight / mSwJpegEncoder.size());
+        cfg.stride = package.inputStride;
+        /*
+         * For NV12 format, Y and UV data are independent, total size is width*height*1.5;
+         * For YUYV format, Y and UV data are crossing, total size is width*height*2;
+         * So the inBufY and inBufUV should be distinguished base on format.
+         */
+        cfg.fourcc = package.inputFormat;
+        cfg.inBufY = (cfg.fourcc == V4L2_PIX_FMT_YUYV)
+            ? static_cast<unsigned char*>(package.inputData) + cfg.stride * cfg.height * 2 * i
+            : static_cast<unsigned char*>(package.inputData) + cfg.stride * cfg.height * i;
+        cfg.inBufUV = (cfg.fourcc == V4L2_PIX_FMT_NV12 || cfg.fourcc == V4L2_PIX_FMT_NV21)
+            ? (static_cast<unsigned char*>(package.inputData) + package.inputStride * package.inputHeight + cfg.stride * cfg.height * i / 2)
+            : nullptr;
+        cfg.quality = package.quality;
+        cfg.outBufSize = (package.outputSize - package.exifDataSize - DEST_BUF_OFFSET) / package.inputHeight * cfg.height;
+        cfg.outBuf = static_cast<unsigned char*>(mDstBuf) + DEST_BUF_OFFSET + cfg.outBufSize * i;
+        /* update the last thread's height */
+        if (i == mSwJpegEncoder.size() - 1) {
+            cfg.height = package.inputHeight - cfg.height * (mSwJpegEncoder.size() - 1);
+            cfg.outBufSize = package.outputSize - package.exifDataSize - DEST_BUF_OFFSET - cfg.outBufSize * (mSwJpegEncoder.size() - 1);
+        }
+
+        encThread = mSwJpegEncoder[i];
+        encThread->setConfig(cfg);
+        LOG2("@%s, line:%d, the %d picture thread cfg", __func__, __LINE__, i);
+        LOG2("@%s, line:%d, cfg.width:%d, cfg.height:%d", __func__, __LINE__, cfg.width, cfg.height);
+        LOG2("@%s, line:%d, cfg.fourcc:%d, cfg.quality:%d", __func__, __LINE__, cfg.fourcc, cfg.quality);
+        LOG2("@%s, line:%d, cfg.inBufY:%p, cfg.inBufUV:%p", __func__, __LINE__, cfg.inBufY, cfg.inBufUV);
+        LOG2("@%s, line:%d, cfg.outBuf:%p, cfg.outBufSize:%d", __func__, __LINE__, cfg.outBuf, cfg.outBufSize);
+    }
+}
+
+/**
+ * the function will trigger the multi jpeg encoding
+ *
+ * \return 0 if encoding was successful
+ * \return -1 if encoding failed
+ */
+int SWJpegEncoder::doJpegEncodingMultiThread(void)
+{
+    LOG2("@%s, line:%d", __func__, __LINE__);
+    std::shared_ptr<CodecWorkerThread> encThread;
+    status_t status = OK;
+    std::string threadName("CamHAL_SWEncodeMultiThread");
+
+    /* run all threads */
+    for (unsigned int i = 0; i <mSwJpegEncoder.size(); i++) {
+        threadName = threadName + ":" + std::to_string(i);
+        LOG2("@%s, new sw jpeg thread name:%s", __func__, threadName.c_str());
+        encThread = mSwJpegEncoder[i];
+        status = encThread->runThread(threadName.c_str());
+        if (status != OK) {
+            ALOGE("@%s, line:%d, start jpeg thread fail, thread name:%s", __func__, __LINE__, threadName.c_str());
+            return status;
+        }
+    }
+
+    /* wait all threads to finish */
+    for (unsigned int i = 0; i < mSwJpegEncoder.size(); i++) {
+        LOG2("@%s, the %d sw jpeg encoder thread before join!", __func__, i);
+        encThread = mSwJpegEncoder[i];
+        encThread->waitThreadFinish();
+        if (encThread->getJpegDataSize() == -1)
+            status = UNKNOWN_ERROR;
+        }
+
+    return status;
+}
+
+/**
+ * the function will merge all jpeg pictures which are generated in multi threads
+ * to one jpeg picture
+ *
+ * \return int the merged jpeg size
+ */
+int SWJpegEncoder::mergeJpeg(void)
+{
+#define HEADER_TOTAL_LEN 623
+#define HEADER_SOS_LEN 14
+#define HEADER_EOI_LEN 2
+#define HEADER_HEIGHT_POS 163
+#define HEADER_WIDTH_POS 165
+#define NV12_MCU_SIZE 16
+    LOG2("@%s, line:%d", __func__, __LINE__);
+    int size = HEADER_TOTAL_LEN - HEADER_SOS_LEN;
+    CodecWorkerThread::CodecConfig cfg;
+    nsecs_t startTime;
+    std::shared_ptr<CodecWorkerThread> encThread = mSwJpegEncoder.at(0);
+    if (encThread == nullptr) {
+        ALOGE("encThread is nullptr");
+        return -1;
+    }
+    encThread->getConfig(&cfg);
+
+    /* Write the JPEG header */
+    MEMCPY_S(mDstBuf, size, cfg.outBuf, size);
+
+    /* Update the width and height info */
+    mDstBuf[HEADER_HEIGHT_POS] = (mTotalHeight >> 8) & 0xFF;
+    mDstBuf[HEADER_HEIGHT_POS+1] = mTotalHeight & 0xFF;
+    mDstBuf[HEADER_WIDTH_POS] = (mTotalWidth >> 8) & 0xFF;
+    mDstBuf[HEADER_WIDTH_POS+1] = mTotalWidth & 0xFF;
+
+    /* Write the restarting interval */
+    if (mSwJpegEncoder.size() > 1) {
+        unsigned int MCUs = (cfg.height / NV12_MCU_SIZE) * (cfg.width / NV12_MCU_SIZE);
+        mDstBuf[size++] = 0xFF;
+        mDstBuf[size++] = 0xDD;
+        mDstBuf[size++] = 0;
+        mDstBuf[size++] = 4;
+        mDstBuf[size++] = (MCUs >> 8) & 0xFF;
+        mDstBuf[size++] = MCUs & 0xFF;
+    }
+
+    /* Write the SOS */
+    MEMCPY_S((void *)((unsigned long)mDstBuf + size),
+            HEADER_SOS_LEN,
+            (void *)((unsigned long)cfg.outBuf + HEADER_TOTAL_LEN - HEADER_SOS_LEN),
+            HEADER_SOS_LEN);
+    size += HEADER_SOS_LEN;
+
+    /* Write coded segments */
+    for (unsigned int i = 0; i <mSwJpegEncoder.size(); i++) {
+        encThread = mSwJpegEncoder[i];
+        startTime = CameraUtils::systemTime();
+        encThread->getConfig(&cfg);
+        memmove((void *)((unsigned long)mDstBuf + size),
+               (void *)((unsigned long)cfg.outBuf + HEADER_TOTAL_LEN),
+               (encThread->getJpegDataSize() - HEADER_TOTAL_LEN - HEADER_EOI_LEN));
+        LOG2("@%s, wr %d segments, size:%d, consume:%ums", __func__, i,
+             (encThread->getJpegDataSize()- HEADER_TOTAL_LEN - HEADER_EOI_LEN),
+             (unsigned)((CameraUtils::systemTime() - startTime) / 1000000));
+        size += (encThread->getJpegDataSize() - HEADER_TOTAL_LEN - HEADER_EOI_LEN);
+
+        if (i != (mSwJpegEncoder.size() - 1)) {
+            mDstBuf[size++] = 0xFF;
+            mDstBuf[size++] = (i & 0x7) | 0xD0;
+        }
+    }
+
+    /* Write EOI */
+    mDstBuf[size++]= 0xFF;
+    mDstBuf[size++]= 0xD9;
+
+    return size;
+}
+
+SWJpegEncoder::CodecWorkerThread::CodecWorkerThread() :
+    mDataSize(-1)
+{
+    LOG2("@%s, line:%d", __func__, __LINE__);
+    CLEAR(mCfg);
+}
+
+SWJpegEncoder::CodecWorkerThread::~CodecWorkerThread()
+{
+    LOG2("@%s, line:%d", __func__, __LINE__);
+}
+
+/**
+ * run one thread for multi thread jpeg encoding
+ *
+ * \param name: the thread name
+ */
+status_t SWJpegEncoder::CodecWorkerThread::runThread(const char *name)
+{
+    LOG2("@%s, line:%d", __func__, __LINE__);
+    return this->run(name);
+}
+
+/**
+ * wait one thread until it has finished
+ *
+ */
+void SWJpegEncoder::CodecWorkerThread::waitThreadFinish(void)
+{
+    LOG2("@%s, line:%d", __func__, __LINE__);
+    this->join();
+    this->requestExitAndWait();
+}
+
+/**
+ * get jpeg size which is done in one thread
+ *
+ * \return int the coded jpeg size
+ */
+int SWJpegEncoder::CodecWorkerThread::getJpegDataSize(void)
+{
+    LOG2("@%s, line:%d", __func__, __LINE__);
+    return mDataSize;
+}
+
+/**
+ * the thread exe function for one jpeg thread
+ * when the encoding has been done, it will return false to terminate the thread
+ *
+ * \return false
+ */
+bool SWJpegEncoder::CodecWorkerThread::threadLoop()
+{
+    LOG2("@%s, line:%d, in CodecWorkerThread", __func__, __LINE__);
+    nsecs_t startTime = CameraUtils::systemTime();
+    int ret = swEncode();
+    LOG2("@%s one swEncode done!, consume:%ums, ret:%d", __func__,
+         (unsigned)((CameraUtils::systemTime() - startTime) / 1000000), ret);
+
+    return false;
+}
+
+/**
+ * this function will call the SWJpegEncoder to encode one jpeg.
+ * it's the main function of the threadLoop
+ *
+ * \return 0 if encoding was successful
+ * \return -1 if encoding failed
+ */
+int SWJpegEncoder::CodecWorkerThread::swEncode(void)
+{
+    LOG2("@%s, line:%d, in CodecWorkerThread", __func__, __LINE__);
+    int status = 0;
+    Codec encoder;
+
+    encoder.init();
+    encoder.setJpegQuality(mCfg.quality);
+    status = encoder.configEncoding(mCfg.width, mCfg.height, mCfg.stride,
+                            (JSAMPLE *)mCfg.outBuf, mCfg.outBufSize);
+    if (status)
+        goto exit;
+
+    status = encoder.doJpegEncoding(mCfg.inBufY, mCfg.inBufUV, mCfg.fourcc);
+    if (status)
+        goto exit;
+
+exit:
+    if (status)
+        mDataSize = -1;
+    else
+        encoder.getJpegSize(&mDataSize);
+
+    encoder.deInit();
+
+    return (status ? -1 : 0);
+}
+
+SWJpegEncoder::Codec::Codec() :
+    mStride(-1),
+    mJpegQuality(DEFAULT_JPEG_QUALITY)
+{
+    LOG2("@%s", __func__);
+    CLEAR(mCInfo);
+    CLEAR(mJErr);
+}
+
+SWJpegEncoder::Codec::~Codec()
+{
+    LOG2("@%s", __func__);
+}
+
+/**
+ * Init the SW jpeg encoder
+ *
+ * It will init the libjpeg library
+ */
+void SWJpegEncoder::Codec::init(void)
+{
+    LOG2("@%s", __func__);
+    CLEAR(mCInfo);
+    mCInfo.err = jpeg_std_error(&mJErr);
+    jpeg_create_compress(&mCInfo);
+}
+
+/**
+ * deInit the SW jpeg encoder
+ *
+ * It will deinit the libjpeg library
+ */
+void SWJpegEncoder::Codec::deInit(void)
+{
+    LOG2("@%s", __func__);
+    jpeg_destroy_compress(&mCInfo);
+}
+
+/**
+ * Set the jpeg quality
+ *
+ * \param quality: one value from 0 to 100
+ *
+ */
+void SWJpegEncoder::Codec::setJpegQuality(int quality)
+{
+    LOG2("@%s, quality:%d", __func__, quality);
+    mJpegQuality = CLIP(quality, 100, 1);
+}
+
+/**
+ * Config the SW jpeg encoder.
+ *
+ * mainly, it will set the destination buffer manager, color space, quality.
+ *
+ * \param width: the width of the jpeg dimentions.
+ * \param height: the height of the jpeg dimentions.
+ * \param jpegBuf: the dest buffer to store the jpeg data
+ * \param jpegBufSize: the size of jpegBuf buffer
+ *
+ * \return 0 if the configuration is right.
+ * \return -1 if the configuration fails.
+*/
+int SWJpegEncoder::Codec::
+configEncoding(int width, int height, int stride, void *jpegBuf, int jpegBufSize)
+{
+    LOG2("@%s", __func__);
+
+    mStride = stride;
+    mCInfo.input_components = 3;
+    mCInfo.in_color_space = (J_COLOR_SPACE)SUPPORTED_FORMAT;
+    mCInfo.image_width = width;
+    mCInfo.image_height = height;
+
+    if(setupJpegDestMgr(&mCInfo, (JSAMPLE *)jpegBuf, jpegBufSize) < 0) {
+        ALOGE("@%s, line:%d, setupJpegDestMgr fail", __func__, __LINE__);
+        return -1;
+    }
+
+    jpeg_set_defaults(&mCInfo);
+    jpeg_set_colorspace(&mCInfo, (J_COLOR_SPACE)SUPPORTED_FORMAT);
+    jpeg_set_quality(&mCInfo, mJpegQuality, TRUE);
+    mCInfo.raw_data_in = TRUE;
+    mCInfo.dct_method = JDCT_ISLOW;
+    mCInfo.comp_info[0].h_samp_factor = 2;
+    mCInfo.comp_info[0].v_samp_factor = 2;
+    mCInfo.comp_info[1].h_samp_factor = 1;
+    mCInfo.comp_info[1].v_samp_factor = 1;
+    mCInfo.comp_info[2].h_samp_factor = 1;
+    mCInfo.comp_info[2].v_samp_factor = 1;
+    jpeg_start_compress(&mCInfo, TRUE);
+
+    return 0;
+}
+
+/**
+ * Do the SW jpeg encoding.
+ *
+ * it will convert the YUV data to P411 and then do jpeg encoding.
+ *
+ * \param y_buf: the source buffer for Y data
+ * \param uv_buf: the source buffer for UV data,
+ * \it could be nullptr if fourcc is V4L2_PIX_FMT_YUYV
+ * \return 0 if the encoding is successful.
+ * \return -1 if the encoding fails.
+ */
+int SWJpegEncoder::Codec::
+doJpegEncoding(const void *y_buf, const void *uv_buf, int fourcc)
+{
+    LOG2("@%s", __func__);
+
+    unsigned char *srcY = nullptr;
+    unsigned char *srcUV = nullptr;
+    unsigned char *p411 = nullptr;
+    JSAMPROW y[16],u[16],v[16];
+    JSAMPARRAY data[3];
+    int i, j, width, height;
+
+    width = mCInfo.image_width;
+    height = mCInfo.image_height;
+    srcY = (unsigned char*)y_buf;
+    srcUV = (unsigned char*)uv_buf;
+    p411 = new unsigned char[width * height * 3 / 2];
+
+    switch (fourcc) {
+    case V4L2_PIX_FMT_YUYV:
+        ImageConverter::YUY2ToP411(width, height, mStride, srcY, p411);
+        break;
+    case V4L2_PIX_FMT_NV12:
+        ImageConverter::NV12ToP411Separate(width, height, mStride, srcY, srcUV, p411);
+        break;
+    case V4L2_PIX_FMT_NV21:
+        ImageConverter::NV21ToP411Separate(width, height, mStride, srcY, srcUV, p411);
+        break;
+    default:
+        ALOGE("%s Unsupported fourcc %d", __func__, fourcc);
+        delete [] p411;
+        return -1;
+    }
+
+    data[0] = y;
+    data[1] = u;
+    data[2] = v;
+    for (i = 0; i < height; i += 16) {
+        for (j = 0; j < 16 && (i + j) < height; j++) {
+            y[j] = p411 + width * (j + i);
+            if (j % 2 == 0) {
+                u[j / 2] = p411 + width * height + width / 2 * ((j + i) / 2);
+                v[j / 2] = p411 + width * height + width * height / 4 + width / 2 * ((j + i) / 2);
+            }
+        }
+        jpeg_write_raw_data(&mCInfo, data, 16);
+    }
+
+    jpeg_finish_compress(&mCInfo);
+
+    delete [] p411;
+    p411 = nullptr;
+
+    return 0;
+}
+
+/**
+ * Get the jpeg size.
+ *
+ * \param jpegSize: get the real jpeg size, it will be -1, if encoding fails
+ */
+void SWJpegEncoder::Codec::getJpegSize(int *jpegSize)
+{
+    LOG2("@%s", __func__);
+
+    JpegDestMgrPtr dest = (JpegDestMgrPtr)mCInfo.dest;
+
+    *jpegSize = (false == dest->encodeSuccess) ? -1 : dest->codedSize;
+}
+
+/**
+ * Setup the jpeg destination buffer manager
+ *
+ * it will convert the YUV data to P411 and then do jpeg encoding.
+ *
+ * \param cInfo: the compress pointer
+ * \param jpegBuf: the buffer pointer for jpeg data
+ * \param jpegBufSize: the jpegBuf buffer's size
+ * \return 0 if it's successful.
+ * \return -1 if it fails.
+ */
+int SWJpegEncoder::Codec::
+setupJpegDestMgr(j_compress_ptr cInfo, JSAMPLE *jpegBuf, int jpegBufSize)
+{
+    LOG2("@%s", __func__);
+    JpegDestMgrPtr dest;
+
+    if (nullptr == jpegBuf || jpegBufSize <= 0) {
+        ALOGE("@%s, line:%d, jpegBuf:%p, jpegBufSize:%d", __func__, __LINE__, jpegBuf, jpegBufSize);
+        return -1;
+    }
+
+    if (cInfo->dest == nullptr) {
+        cInfo->dest = (struct jpeg_destination_mgr *)
+                        (*cInfo->mem->alloc_small)((j_common_ptr)cInfo,
+                            JPOOL_PERMANENT, sizeof(JpegDestMgr));
+        CLEAR(*cInfo->dest);
+    }
+    dest = (JpegDestMgrPtr)cInfo->dest;
+
+    dest->pub.init_destination = initDestination;
+    dest->pub.empty_output_buffer = emptyOutputBuffer;
+    dest->pub.term_destination = termDestination;
+    dest->outJpegBuf = jpegBuf;
+    dest->outJpegBufSize = jpegBufSize;
+
+    return 0;
+}
+
+/**
+ * Init the destination
+ *
+ * It's the first function which be called
+ * among initDestination, emptyOutputBuffer and termDestination
+ *
+ * \param cInfo: the compress pointer
+ */
+void SWJpegEncoder::Codec::initDestination(j_compress_ptr cInfo)
+{
+    LOG2("@%s", __func__);
+    JpegDestMgrPtr dest = (JpegDestMgrPtr)cInfo->dest;
+
+    dest->pub.next_output_byte = dest->outJpegBuf;
+    dest->pub.free_in_buffer = dest->outJpegBufSize;
+    dest->encodeSuccess = true;
+}
+
+/**
+ * Empty the output buffer
+ *
+ * The function should not be called,
+ * because we should allocate enough memory for the jpeg destination buffer
+ * If we return FALSE, the libjpeg will terminate, so return TRUE always.
+ * But when the function is called, the encoding failing will be recorded.
+ *
+ * \param cInfo: the compress pointer
+ * \return TRUE if it is successful.
+ * \return FALSE if something is wrong
+ */
+boolean SWJpegEncoder::Codec::emptyOutputBuffer(j_compress_ptr cInfo)
+{
+    LOG2("@%s", __func__);
+    ALOGE("@%s, line:%d, buffer overflow!", __func__, __LINE__);
+    JpegDestMgrPtr dest = (JpegDestMgrPtr)cInfo->dest;
+
+    /* re-cfg the buffer info */
+    dest->pub.next_output_byte = dest->outJpegBuf;
+    dest->pub.free_in_buffer = dest->outJpegBufSize;
+    dest->encodeSuccess = false;
+
+    return TRUE; /* if return FALSE, the total taking picture will fail */
+}
+
+/**
+ * Terminate the destination
+ *
+ * The function will be called as the last function,
+ * among initDestination, emptyOutputBuffer and termDestination.
+ * We can get the encoded jpeg size from it.
+ *
+ * \param cInfo: the compress pointer
+ */
+void SWJpegEncoder::Codec::termDestination(j_compress_ptr cInfo)
+{
+    LOG2("@%s", __func__);
+    JpegDestMgrPtr dest = (JpegDestMgrPtr)cInfo->dest;
+
+    dest->codedSize = dest->outJpegBufSize - dest->pub.free_in_buffer;
+    LOG2("@%s, line:%d, codedSize:%d", __func__, __LINE__, dest->codedSize);
+}
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.h b/camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.h
new file mode 100644
index 000000000000..f666a7b71da0
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.h
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2016-2019 Intel Corporation. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ *\file SWJpegEncoder.h
+ *
+ * Abstracts the SW jpeg encoder
+ *
+ * This class calls the libjpeg ditectly. And libskia's performance is poor.
+ * The SW jpeg encoder is used for the thumbnail encoding mainly.
+ * But When the HW jpeg encoding fails, it will use the SW jpeg encoder also.
+ *
+ */
+
+#pragma once
+
+#include <stdio.h>
+#include <vector>
+
+#include <linux/videodev2.h>
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+#include "iutils/Thread.h"
+#include "IJpegEncoder.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "jpeglib.h"
+#ifdef __cplusplus
+}
+#endif
+
+namespace icamera {
+
+/**
+ * \class SWJpegEncoder
+ *
+ * This class is used for sw jpeg encoder.
+ * It will use single or multi thread to do the sw jpeg encoding
+ * It just support NV12 input currently.
+ */
+class SWJpegEncoder : public IJpegEncoder {
+public:
+    SWJpegEncoder();
+    ~SWJpegEncoder();
+
+    virtual bool doJpegEncode(EncodePackage &package);
+
+private:
+    // prevent copy constructor and assignment operator
+    DISALLOW_COPY_AND_ASSIGN(SWJpegEncoder);
+
+private:
+    bool useMultiThreadEncoding(int width, int height);
+    int swEncode(const EncodePackage& package);
+    int swEncodeMultiThread(const EncodePackage &package);
+
+    int mJpegSize; /*!< it's used to store jpeg size */
+    int mTotalWidth;  /*!< the final jpeg width */
+    int mTotalHeight;  /*!< the final jpeg height */
+    unsigned char *mDstBuf; /*!< the dest buffer to store the final jpeg */
+    unsigned int mCPUCoresNum;  /*!< use to remember the CPU Cores number */
+
+private:
+    /**
+     * \class CodecWorkerThread
+     *
+     * This class will create one thread to do one sw jpeg encoder.
+     * It will call the SWJpegEncoderWrapper directly.
+     */
+    class CodecWorkerThread : public Thread {
+    public:
+        struct CodecConfig {
+            // input buffer configuration
+            int width;
+            int height;
+            int stride;
+            int fourcc;
+            void *inBufY;
+            void *inBufUV;
+            // output buffer configuration
+            int quality;
+            void *outBuf;
+            int outBufSize;
+        };
+
+        CodecWorkerThread();
+        ~CodecWorkerThread();
+
+        void setConfig(CodecConfig &cfg) {mCfg = cfg;}
+        void getConfig(CodecConfig *cfg){*cfg = mCfg;}
+        status_t runThread(const char *name);
+        void waitThreadFinish(void);
+        int getJpegDataSize(void);
+    private:
+        int mDataSize;  /*!< the jpeg data size in one thread */
+        CodecConfig mCfg;  /*!< the cfg in one thread */
+    private:
+        virtual bool threadLoop();
+        int swEncode(void);
+    };
+
+private:
+    void init(unsigned int threadNum = 1);
+    void deInit(void);
+    void config(const EncodePackage &package);
+    int doJpegEncodingMultiThread(void);
+    int mergeJpeg(void);
+
+    std::vector<std::shared_ptr<CodecWorkerThread> > mSwJpegEncoder;
+    static const unsigned int MAX_THREAD_NUM = 8; /*!< the same as max jpeg restart time */
+    static const unsigned int MIN_THREAD_NUM = 1;
+
+    /*!< it's used to use one buffer to merge the multi jpeg data to one jpeg data */
+    static const unsigned int DEST_BUF_OFFSET = 1024;
+
+private:
+    /**
+     * \class Codec
+     *
+     * This class is used for sw jpeg encoder.
+     * It will call the libjpeg directly.
+     * It just support NV12 input currently.
+     */
+    class Codec {
+    public:
+        Codec();
+        ~Codec();
+
+        void init(void);
+        void deInit(void);
+        void setJpegQuality(int quality);
+        int configEncoding(int width, int height, int stride,
+                                    void *jpegBuf, int jpegBufSize);
+        /*
+            if fourcc is V4L2_PIX_FMT_NV12, y_buf and uv_buf must be passed
+            if fourcc is V4L2_PIX_FMT_YUYV, y_buf must be passed, uv_buf could be nullptr
+        */
+        int doJpegEncoding(const void* y_buf, const void* uv_buf = nullptr, int fourcc = V4L2_PIX_FMT_NV12);
+        void getJpegSize(int *jpegSize);
+
+    private:
+        // prevent copy constructor and assignment operator
+        DISALLOW_COPY_AND_ASSIGN(Codec);
+
+    private:
+        typedef struct {
+            struct jpeg_destination_mgr pub;
+            JSAMPLE *outJpegBuf;  /*!< jpeg output buffer */
+            int outJpegBufSize;  /*!< jpeg output buffer size */
+            int codedSize;  /*!< the final encoded out jpeg size */
+            bool encodeSuccess;  /*!< if buffer overflow, it will be set to false */
+        } JpegDestMgr, *JpegDestMgrPtr;
+
+        int mStride;
+        struct jpeg_compress_struct mCInfo;
+        struct jpeg_error_mgr mJErr;
+        int mJpegQuality;
+        static const unsigned int SUPPORTED_FORMAT = JCS_YCbCr;
+
+        int setupJpegDestMgr(j_compress_ptr cInfo, JSAMPLE *jpegBuf, int jpegBufSize);
+        // the below three functions are for the dest buffer manager.
+        static void initDestination(j_compress_ptr cInfo);
+        static boolean emptyOutputBuffer(j_compress_ptr cInfo);
+        static void termDestination(j_compress_ptr cInfo);
+    };
+};
+
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/metadata/CameraMetadata.cpp b/camera/hal/intel/ipu6/src/metadata/CameraMetadata.cpp
new file mode 100644
index 000000000000..9aa26c9ca706
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/metadata/CameraMetadata.cpp
@@ -0,0 +1,435 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2015-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "CameraMetadata"
+
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+
+#include "CameraMetadata.h"
+
+namespace icamera {
+
+CameraMetadata::CameraMetadata() :
+        mBuffer(NULL), mLocked(false) {
+}
+
+CameraMetadata::CameraMetadata(size_t entryCapacity, size_t dataCapacity) :
+        mLocked(false)
+{
+    mBuffer = allocate_icamera_metadata(entryCapacity, dataCapacity);
+}
+
+CameraMetadata::CameraMetadata(const CameraMetadata &other) :
+        mLocked(false) {
+    mBuffer = clone_icamera_metadata(other.mBuffer);
+}
+
+CameraMetadata::CameraMetadata(icamera_metadata_t *buffer) :
+        mBuffer(NULL), mLocked(false) {
+    acquire(buffer);
+}
+
+CameraMetadata &CameraMetadata::operator=(const CameraMetadata &other) {
+    return operator=(other.mBuffer);
+}
+
+CameraMetadata &CameraMetadata::operator=(const icamera_metadata_t *buffer) {
+    if (mLocked) {
+        LOGE("%s: Assignment to a locked CameraMetadata!", __func__);
+        return *this;
+    }
+
+    if (buffer != mBuffer) {
+        icamera_metadata_t *newBuffer = clone_icamera_metadata(buffer);
+        clear();
+        mBuffer = newBuffer;
+    }
+    return *this;
+}
+
+CameraMetadata::~CameraMetadata() {
+    mLocked = false;
+    clear();
+}
+
+const icamera_metadata_t* CameraMetadata::getAndLock() {
+    mLocked = true;
+    return mBuffer;
+}
+
+status_t CameraMetadata::unlock(const icamera_metadata_t *buffer) {
+    if (!mLocked) {
+        LOGE("%s: Can't unlock a non-locked CameraMetadata!", __func__);
+        return INVALID_OPERATION;
+    }
+    if (buffer != mBuffer) {
+        LOGE("%s: Can't unlock CameraMetadata with wrong pointer!",
+                __func__);
+        return BAD_VALUE;
+    }
+    mLocked = false;
+    return OK;
+}
+
+icamera_metadata_t* CameraMetadata::release() {
+    if (mLocked) {
+        LOGE("%s: CameraMetadata is locked", __func__);
+        return NULL;
+    }
+    icamera_metadata_t *released = mBuffer;
+    mBuffer = NULL;
+    return released;
+}
+
+void CameraMetadata::clear() {
+    if (mLocked) {
+        LOGE("%s: CameraMetadata is locked", __func__);
+        return;
+    }
+    if (mBuffer) {
+        free_icamera_metadata(mBuffer);
+        mBuffer = NULL;
+    }
+}
+
+void CameraMetadata::acquire(icamera_metadata_t *buffer) {
+    if (mLocked) {
+        LOGE("%s: CameraMetadata is locked", __func__);
+        return;
+    }
+    clear();
+    mBuffer = buffer;
+
+    if (validate_icamera_metadata_structure(mBuffer, /*size*/NULL) != OK) {
+        LOGE("%s: Failed to validate metadata structure %p",
+                 __func__, buffer);
+    }
+}
+
+void CameraMetadata::acquire(CameraMetadata &other) {
+    if (mLocked) {
+        LOGE("%s: CameraMetadata is locked", __func__);
+        return;
+    }
+    acquire(other.release());
+}
+
+status_t CameraMetadata::append(const CameraMetadata &other) {
+    return append(other.mBuffer);
+}
+
+status_t CameraMetadata::append(const icamera_metadata_t* other) {
+    if (mLocked) {
+        LOGE("%s: CameraMetadata is locked", __func__);
+        return INVALID_OPERATION;
+    }
+    size_t extraEntries = get_icamera_metadata_entry_count(other);
+    size_t extraData = get_icamera_metadata_data_count(other);
+    resizeIfNeeded(extraEntries, extraData);
+
+    return append_icamera_metadata(mBuffer, other);
+}
+
+size_t CameraMetadata::entryCount() const {
+    return (mBuffer == NULL) ? 0 :
+            get_icamera_metadata_entry_count(mBuffer);
+}
+
+bool CameraMetadata::isEmpty() const {
+    return entryCount() == 0;
+}
+
+status_t CameraMetadata::sort() {
+    if (mLocked) {
+        LOGE("%s: CameraMetadata is locked", __func__);
+        return INVALID_OPERATION;
+    }
+    return sort_icamera_metadata(mBuffer);
+}
+
+status_t CameraMetadata::checkType(uint32_t tag, uint8_t expectedType) {
+    int tagType = get_icamera_metadata_tag_type(tag);
+    if (tagType == -1 || tagType >= ICAMERA_NUM_TYPES) {
+        LOGE("Update metadata entry: Unknown tag %d type=%d", tag, tagType);
+        return INVALID_OPERATION;
+    }
+    if (tagType != expectedType) {
+        LOGE("Mismatched tag type when updating entry %s (%d) of type %s; "
+                "got type %s data instead ",
+                get_icamera_metadata_tag_name(tag), tag,
+                icamera_metadata_type_names[tagType],
+                icamera_metadata_type_names[expectedType]);
+        return INVALID_OPERATION;
+    }
+    return OK;
+}
+
+status_t CameraMetadata::update(uint32_t tag,
+        const int32_t *data, size_t data_count) {
+    status_t res;
+    if (mLocked) {
+        LOGE("%s: CameraMetadata is locked", __func__);
+        return INVALID_OPERATION;
+    }
+    if ( (res = checkType(tag, ICAMERA_TYPE_INT32)) != OK) {
+        return res;
+    }
+    return updateImpl(tag, (const void*)data, data_count);
+}
+
+status_t CameraMetadata::update(uint32_t tag,
+        const uint8_t *data, size_t data_count) {
+    status_t res;
+    if (mLocked) {
+        LOGE("%s: CameraMetadata is locked", __func__);
+        return INVALID_OPERATION;
+    }
+    if ( (res = checkType(tag, ICAMERA_TYPE_BYTE)) != OK) {
+        return res;
+    }
+    return updateImpl(tag, (const void*)data, data_count);
+}
+
+status_t CameraMetadata::update(uint32_t tag,
+        const float *data, size_t data_count) {
+    status_t res;
+    if (mLocked) {
+        LOGE("%s: CameraMetadata is locked", __func__);
+        return INVALID_OPERATION;
+    }
+    if ( (res = checkType(tag, ICAMERA_TYPE_FLOAT)) != OK) {
+        return res;
+    }
+    return updateImpl(tag, (const void*)data, data_count);
+}
+
+status_t CameraMetadata::update(uint32_t tag,
+        const int64_t *data, size_t data_count) {
+    status_t res;
+    if (mLocked) {
+        LOGE("%s: CameraMetadata is locked", __func__);
+        return INVALID_OPERATION;
+    }
+    if ( (res = checkType(tag, ICAMERA_TYPE_INT64)) != OK) {
+        return res;
+    }
+    return updateImpl(tag, (const void*)data, data_count);
+}
+
+status_t CameraMetadata::update(uint32_t tag,
+        const double *data, size_t data_count) {
+    status_t res;
+    if (mLocked) {
+        LOGE("%s: CameraMetadata is locked", __func__);
+        return INVALID_OPERATION;
+    }
+    if ( (res = checkType(tag, ICAMERA_TYPE_DOUBLE)) != OK) {
+        return res;
+    }
+    return updateImpl(tag, (const void*)data, data_count);
+}
+
+status_t CameraMetadata::update(uint32_t tag,
+        const icamera_metadata_rational_t *data, size_t data_count) {
+    status_t res;
+    if (mLocked) {
+        LOGE("%s: CameraMetadata is locked", __func__);
+        return INVALID_OPERATION;
+    }
+    if ( (res = checkType(tag, ICAMERA_TYPE_RATIONAL)) != OK) {
+        return res;
+    }
+    return updateImpl(tag, (const void*)data, data_count);
+}
+
+status_t CameraMetadata::update(uint32_t tag,
+        const std::string &string) {
+    status_t res;
+    if (mLocked) {
+        LOGE("%s: CameraMetadata is locked", __func__);
+        return INVALID_OPERATION;
+    }
+    if ( (res = checkType(tag, ICAMERA_TYPE_BYTE)) != OK) {
+        return res;
+    }
+    // string.size() doesn't count the null termination character.
+    return updateImpl(tag, (const void*)string.c_str(), string.size() + 1);
+}
+
+status_t CameraMetadata::updateImpl(uint32_t tag, const void *data,
+        size_t data_count) {
+    status_t res;
+    if (mLocked) {
+        LOGE("%s: CameraMetadata is locked", __func__);
+        return INVALID_OPERATION;
+    }
+    int type = get_icamera_metadata_tag_type(tag);
+    if (type == -1) {
+        LOGE("%s: Tag %d not found", __func__, tag);
+        return BAD_VALUE;
+    }
+    size_t data_size = calculate_icamera_metadata_entry_data_size(type,
+            data_count);
+
+    res = resizeIfNeeded(1, data_size);
+
+    if (res == OK) {
+        icamera_metadata_entry_t entry;
+        res = find_icamera_metadata_entry(mBuffer, tag, &entry);
+        if (res == NAME_NOT_FOUND) {
+            res = add_icamera_metadata_entry(mBuffer,
+                    tag, data, data_count);
+        } else if (res == OK) {
+            res = update_icamera_metadata_entry(mBuffer,
+                    entry.index, data, data_count, NULL);
+        }
+    }
+
+    if (res != OK) {
+        LOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)",
+                __func__, get_icamera_metadata_section_name(tag),
+                get_icamera_metadata_tag_name(tag), tag, strerror(-res), res);
+    }
+
+    if(validate_icamera_metadata_structure(mBuffer, /*size*/NULL) != OK) {
+             LOGE("%s: Failed to validate metadata structure after update %p",
+             __func__, mBuffer);
+    }
+
+    return res;
+}
+
+bool CameraMetadata::exists(uint32_t tag) const {
+    icamera_metadata_ro_entry entry;
+    return find_icamera_metadata_ro_entry(mBuffer, tag, &entry) == 0;
+}
+
+icamera_metadata_entry_t CameraMetadata::find(uint32_t tag) {
+    status_t res;
+    icamera_metadata_entry entry;
+    CLEAR(entry);
+    if (mLocked) {
+        LOGE("%s: CameraMetadata is locked", __func__);
+        entry.count = 0;
+        return entry;
+    }
+    res = find_icamera_metadata_entry(mBuffer, tag, &entry);
+    if (res != OK) {
+        entry.count = 0;
+        entry.data.u8 = NULL;
+    }
+    return entry;
+}
+
+icamera_metadata_ro_entry_t CameraMetadata::find(uint32_t tag) const {
+    status_t res;
+    icamera_metadata_ro_entry entry;
+    res = find_icamera_metadata_ro_entry(mBuffer, tag, &entry);
+    if (res != OK) {
+        entry.count = 0;
+        entry.data.u8 = NULL;
+    }
+    return entry;
+}
+
+status_t CameraMetadata::erase(uint32_t tag) {
+    icamera_metadata_entry_t entry;
+    status_t res;
+    if (mLocked) {
+        LOGE("%s: CameraMetadata is locked", __func__);
+        return INVALID_OPERATION;
+    }
+    res = find_icamera_metadata_entry(mBuffer, tag, &entry);
+    if (res == NAME_NOT_FOUND) {
+        return OK;
+    } else if (res != OK) {
+        LOGE("%s: Error looking for entry %s.%s (%x): %s %d",
+                __func__,
+                get_icamera_metadata_section_name(tag),
+                get_icamera_metadata_tag_name(tag), tag, strerror(-res), res);
+        return res;
+    }
+    res = delete_icamera_metadata_entry(mBuffer, entry.index);
+    if (res != OK) {
+        LOGE("%s: Error deleting entry %s.%s (%x): %s %d",
+                __func__,
+                get_icamera_metadata_section_name(tag),
+                get_icamera_metadata_tag_name(tag), tag, strerror(-res), res);
+    }
+    return res;
+}
+
+void CameraMetadata::dump(int fd, int verbosity, int indentation) const {
+    dump_indented_icamera_metadata(mBuffer, fd, verbosity, indentation);
+}
+
+status_t CameraMetadata::resizeIfNeeded(size_t extraEntries, size_t extraData) {
+    if (mBuffer == NULL) {
+        mBuffer = allocate_icamera_metadata(extraEntries * 2, extraData * 2);
+        if (mBuffer == NULL) {
+            LOGE("%s: Can't allocate larger metadata buffer", __func__);
+            return NO_MEMORY;
+        }
+    } else {
+        size_t currentEntryCount = get_icamera_metadata_entry_count(mBuffer);
+        size_t currentEntryCap = get_icamera_metadata_entry_capacity(mBuffer);
+        size_t newEntryCount = currentEntryCount +
+                extraEntries;
+        newEntryCount = (newEntryCount > currentEntryCap) ?
+                newEntryCount * 2 : currentEntryCap;
+
+        size_t currentDataCount = get_icamera_metadata_data_count(mBuffer);
+        size_t currentDataCap = get_icamera_metadata_data_capacity(mBuffer);
+        size_t newDataCount = currentDataCount +
+                extraData;
+        newDataCount = (newDataCount > currentDataCap) ?
+                newDataCount * 2 : currentDataCap;
+
+        if (newEntryCount > currentEntryCap ||
+                newDataCount > currentDataCap) {
+            icamera_metadata_t *oldBuffer = mBuffer;
+            mBuffer = allocate_icamera_metadata(newEntryCount,
+                    newDataCount);
+            if (mBuffer == NULL) {
+                LOGE("%s: Can't allocate larger metadata buffer", __func__);
+                return NO_MEMORY;
+            }
+            append_icamera_metadata(mBuffer, oldBuffer);
+            free_icamera_metadata(oldBuffer);
+        }
+    }
+    return OK;
+}
+
+void CameraMetadata::swap(CameraMetadata& other) {
+    if (mLocked) {
+        LOGE("%s: CameraMetadata is locked", __func__);
+        return;
+    } else if (other.mLocked) {
+        LOGE("%s: Other CameraMetadata is locked", __func__);
+        return;
+    }
+
+    icamera_metadata* thisBuf = mBuffer;
+    icamera_metadata* otherBuf = other.mBuffer;
+
+    other.mBuffer = thisBuf;
+    mBuffer = otherBuf;
+}
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/metadata/CameraMetadata.h b/camera/hal/intel/ipu6/src/metadata/CameraMetadata.h
new file mode 100644
index 000000000000..6acf03e91989
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/metadata/CameraMetadata.h
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2015-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <string>
+
+#include "icamera_metadata_base.h"
+#include "iutils/Errors.h"
+
+namespace icamera {
+
+/**
+ * A convenience wrapper around the C-based icamera_metadata_t library.
+ */
+class CameraMetadata {
+  public:
+    /** Creates an empty object; best used when expecting to acquire contents
+     * from elsewhere */
+    CameraMetadata();
+    /** Creates an object with space for entryCapacity entries, with
+     * dataCapacity extra storage */
+    CameraMetadata(size_t entryCapacity, size_t dataCapacity = 10);
+
+    ~CameraMetadata();
+
+    /** Takes ownership of passed-in buffer */
+    CameraMetadata(icamera_metadata_t *buffer);
+    /** Clones the metadata */
+    CameraMetadata(const CameraMetadata &other);
+
+    /**
+     * Assignment clones metadata buffer.
+     */
+    CameraMetadata &operator=(const CameraMetadata &other);
+    CameraMetadata &operator=(const icamera_metadata_t *buffer);
+
+    /**
+     * Get reference to the underlying metadata buffer. Ownership remains with
+     * the CameraMetadata object, but non-const CameraMetadata methods will not
+     * work until unlock() is called. Note that the lock has nothing to do with
+     * thread-safety, it simply prevents the icamera_metadata_t pointer returned
+     * here from being accidentally invalidated by CameraMetadata operations.
+     */
+    const icamera_metadata_t* getAndLock();
+
+    /**
+     * Unlock the CameraMetadata for use again. After this unlock, the pointer
+     * given from getAndLock() may no longer be used. The pointer passed out
+     * from getAndLock must be provided to guarantee that the right object is
+     * being unlocked.
+     */
+    status_t unlock(const icamera_metadata_t *buffer);
+
+    /**
+     * Release a raw metadata buffer to the caller. After this call,
+     * CameraMetadata no longer references the buffer, and the caller takes
+     * responsibility for freeing the raw metadata buffer (using
+     * free_camera_metadata()), or for handing it to another CameraMetadata
+     * instance.
+     */
+    icamera_metadata_t* release();
+
+    /**
+     * Clear the metadata buffer and free all storage used by it
+     */
+    void clear();
+
+    /**
+     * Acquire a raw metadata buffer from the caller. After this call,
+     * the caller no longer owns the raw buffer, and must not free or manipulate it.
+     * If CameraMetadata already contains metadata, it is freed.
+     */
+    void acquire(icamera_metadata_t* buffer);
+
+    /**
+     * Acquires raw buffer from other CameraMetadata object. After the call, the argument
+     * object no longer has any metadata.
+     */
+    void acquire(CameraMetadata &other);
+
+    /**
+     * Append metadata from another CameraMetadata object.
+     */
+    status_t append(const CameraMetadata &other);
+
+    /**
+     * Append metadata from a raw camera_metadata buffer
+     */
+    status_t append(const icamera_metadata* other);
+
+    /**
+     * Number of metadata entries.
+     */
+    size_t entryCount() const;
+
+    /**
+     * Is the buffer empty (no entires)
+     */
+    bool isEmpty() const;
+
+    /**
+     * Sort metadata buffer for faster find
+     */
+    status_t sort();
+
+    /**
+     * Update metadata entry. Will create entry if it doesn't exist already, and
+     * will reallocate the buffer if insufficient space exists. Overloaded for
+     * the various types of valid data.
+     */
+    status_t update(uint32_t tag,
+            const uint8_t *data, size_t data_count);
+    status_t update(uint32_t tag,
+            const int32_t *data, size_t data_count);
+    status_t update(uint32_t tag,
+            const float *data, size_t data_count);
+    status_t update(uint32_t tag,
+            const int64_t *data, size_t data_count);
+    status_t update(uint32_t tag,
+            const double *data, size_t data_count);
+    status_t update(uint32_t tag,
+            const icamera_metadata_rational_t *data, size_t data_count);
+    status_t update(uint32_t tag,
+            const std::string &string);
+
+    /**
+     * Check if a metadata entry exists for a given tag id
+     *
+     */
+    bool exists(uint32_t tag) const;
+
+    /**
+     * Get metadata entry by tag id
+     */
+    icamera_metadata_entry find(uint32_t tag);
+
+    /**
+     * Get metadata entry by tag id, with no editing
+     */
+    icamera_metadata_ro_entry find(uint32_t tag) const;
+
+    /**
+     * Delete metadata entry by tag
+     */
+    status_t erase(uint32_t tag);
+
+    /**
+     * Swap the underlying camera metadata between this and the other
+     * metadata object.
+     */
+    void swap(CameraMetadata &other);
+
+    /**
+     * Dump contents into FD for debugging. The verbosity levels are
+     * 0: Tag entry information only, no data values
+     * 1: Level 0 plus at most 16 data values per entry
+     * 2: All information
+     *
+     * The indentation parameter sets the number of spaces to add to the start
+     * each line of output.
+     */
+    void dump(int fd, int verbosity = 1, int indentation = 0) const;
+
+  private:
+    icamera_metadata_t *mBuffer;
+    bool               mLocked;
+
+    /**
+     * Check if tag has a given type
+     */
+    status_t checkType(uint32_t tag, uint8_t expectedType);
+
+    /**
+     * Base update entry method
+     */
+    status_t updateImpl(uint32_t tag, const void *data, size_t data_count);
+
+    /**
+     * Resize metadata buffer if needed by reallocating it and copying it over.
+     */
+    status_t resizeIfNeeded(size_t extraEntries, size_t extraData);
+
+};
+
+} // namespace android
diff --git a/camera/hal/intel/ipu6/src/metadata/ParameterGenerator.cpp b/camera/hal/intel/ipu6/src/metadata/ParameterGenerator.cpp
new file mode 100644
index 000000000000..926540f32be5
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/metadata/ParameterGenerator.cpp
@@ -0,0 +1,313 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "ParameterGenerator"
+
+#include <math.h>
+#include <memory>
+
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+
+#include "MakerNote.h"
+#include "AiqResultStorage.h"
+#include "AiqUtils.h"
+#include "ParameterGenerator.h"
+
+namespace icamera {
+
+#define CHECK_REQUEST_ID(id) CheckError((id < 0), UNKNOWN_ERROR, "%s: error request id %ld!", __func__, id);
+#define CHECK_SEQUENCE(id) CheckError((id < 0), UNKNOWN_ERROR, "%s: error sequence %ld!", __func__, id);
+
+ParameterGenerator::ParameterGenerator(int cameraId) :
+    mCameraId(cameraId),
+    mLastSequence(-1),
+    mTonemapMaxCurvePoints(0)
+{
+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
+    reset();
+
+    camera_info_t info;
+    CLEAR(info);
+    PlatformData::getCameraInfo(mCameraId, info);
+    info.capability->getTonemapMaxCurvePoints(mTonemapMaxCurvePoints);
+    if (mTonemapMaxCurvePoints) {
+        mTonemapCurveRed = std::unique_ptr<float[]>(new float[mTonemapMaxCurvePoints * 2]);
+        mTonemapCurveBlue = std::unique_ptr<float[]>(new float[mTonemapMaxCurvePoints * 2]);
+        mTonemapCurveGreen = std::unique_ptr<float[]>(new float[mTonemapMaxCurvePoints * 2]);
+    }
+}
+
+ParameterGenerator::~ParameterGenerator()
+{
+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
+}
+
+int ParameterGenerator::reset()
+{
+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
+    AutoMutex l(mParamsLock);
+    for (int i = 0; i < kStorageSize; i++) {
+        mRequestParams[i].reset();
+    }
+
+    mLastSequence = -1;
+    return OK;
+}
+
+int ParameterGenerator::saveParameters(long sequence, long requestId, const Parameters* param)
+{
+    CHECK_REQUEST_ID(requestId);
+    CHECK_SEQUENCE(sequence);
+
+    long index = sequence % kStorageSize;
+
+    AutoMutex l(mParamsLock);
+    mLastSequence = sequence;
+    if (param)
+        mLastParam = *param;
+
+    LOG2("%s, sequence %ld", __func__, sequence);
+    mRequestParams[index].sequence = sequence;
+    mRequestParams[index].requestId = requestId;
+    mRequestParams[index].param = mLastParam;
+    return OK;
+}
+
+void ParameterGenerator::updateParameters(long sequence, const Parameters *param)
+{
+    CheckError(!param, VOID_VALUE, "The param is nullptr!");
+
+    LOG2("%s, sequence %ld", __func__, sequence);
+    long index = sequence % kStorageSize;
+
+    AutoMutex l(mParamsLock);
+    // Update Jpeg related settings
+    int rotation = 0;
+    int ret = param->getJpegRotation(rotation);
+    if (ret == OK) {
+        mRequestParams[index].param.setJpegRotation(rotation);
+    }
+    camera_resolution_t res;
+    ret = param->getJpegThumbnailSize(res);
+    if (ret == OK) {
+        mRequestParams[index].param.setJpegThumbnailSize(res);
+    }
+}
+
+int ParameterGenerator::getParameters(long sequence, Parameters *param, bool resultOnly, bool still)
+{
+    CheckError((param == nullptr), UNKNOWN_ERROR, "nullptr to get param!");
+
+    if (!resultOnly && sequence < 0) {
+        *param = mLastParam;
+    } else if (!resultOnly) {
+        long pos = -1;
+        for (long seq = sequence; (seq > (sequence - kStorageSize)) && (seq >= 0); seq--) {
+            long index = seq % kStorageSize;
+            if (seq == mRequestParams[index].sequence) {
+                pos = index;
+                break;
+            }
+        }
+
+        if (pos >= 0) {
+            *param = mRequestParams[pos].param;
+        } else {
+            LOGE("Can't find settings for seq %ld", sequence);
+        }
+    }
+
+    if (still) {
+        MakerNote::getInstance(mCameraId)->acquireMakernoteData(sequence, param);
+    }
+    generateParametersL(sequence, param);
+    return OK;
+}
+
+int ParameterGenerator::getRequestId(long sequence, long& requestId)
+{
+    CHECK_SEQUENCE(sequence);
+    requestId = -1;
+    long index = sequence % kStorageSize;
+
+    AutoMutex l(mParamsLock);
+    CheckError((sequence != mRequestParams[index].sequence), UNKNOWN_ERROR,
+        "Can't find requestId for seq %ld, saved %ld:%ld",
+        sequence, mRequestParams[index].requestId, mRequestParams[index].sequence);
+
+    requestId = mRequestParams[index].requestId;
+    return OK;
+}
+
+int ParameterGenerator::generateParametersL(long sequence, Parameters *params)
+{
+    if (PlatformData::isEnableAIQ(mCameraId)) {
+        updateWithAiqResultsL(sequence, params);
+        updateTonemapCurve(sequence, params);
+    }
+    return OK;
+}
+
+int ParameterGenerator::updateWithAiqResultsL(long sequence, Parameters *params)
+{
+    const AiqResult *aiqResult = AiqResultStorage::getInstance(mCameraId)->getAiqResult(sequence);
+    CheckError((aiqResult == nullptr), UNKNOWN_ERROR,
+           "%s Aiq result of sequence %ld does not exist", __func__, sequence);
+
+    // Update AE related parameters
+    camera_ae_state_t aeState = aiqResult->mAeResults.exposures[0].converged ?
+            AE_STATE_CONVERGED : AE_STATE_NOT_CONVERGED;
+    params->setAeState(aeState);
+
+    if (CameraUtils::isMultiExposureCase(aiqResult->mTuningMode) &&
+        aiqResult->mAeResults.num_exposures > 1 && aiqResult->mAeResults.exposures[1].exposure) {
+        params->setExposureTime(aiqResult->mAeResults.exposures[1].exposure->exposure_time_us);
+    } else {
+        params->setExposureTime(aiqResult->mAeResults.exposures[0].exposure->exposure_time_us);
+    }
+    params->setSensitivityGain(log10(aiqResult->mAeResults.exposures[0].exposure->analog_gain)*20.0);
+
+    // Update AWB related parameters
+    updateAwbGainsL(params, aiqResult->mAwbResults);
+    camera_color_transform_t ccm;
+    MEMCPY_S(ccm.color_transform, sizeof(ccm.color_transform),
+             aiqResult->mPaResults.color_conversion_matrix,
+             sizeof(aiqResult->mPaResults.color_conversion_matrix));
+    params->setColorTransform(ccm);
+
+    camera_color_gains_t colorGains;
+    colorGains.color_gains_rggb[0] = aiqResult->mPaResults.color_gains.r;
+    colorGains.color_gains_rggb[1] = aiqResult->mPaResults.color_gains.gr;
+    colorGains.color_gains_rggb[2] = aiqResult->mPaResults.color_gains.gb;
+    colorGains.color_gains_rggb[3] = aiqResult->mPaResults.color_gains.b;
+    params->setColorGains(colorGains);
+
+    camera_awb_state_t awbState = (fabs(aiqResult->mAwbResults.distance_from_convergence) < 0.001) ?
+            AWB_STATE_CONVERGED : AWB_STATE_NOT_CONVERGED;
+    params->setAwbState(awbState);
+
+    // Update AF related parameters
+    camera_af_state_t afState = \
+            (aiqResult->mAfResults.status == ia_aiq_af_status_local_search) ? AF_STATE_LOCAL_SEARCH
+          : (aiqResult->mAfResults.status == ia_aiq_af_status_extended_search) ? AF_STATE_EXTENDED_SEARCH
+          : (aiqResult->mAfResults.status == ia_aiq_af_status_success) ? AF_STATE_SUCCESS
+          : (aiqResult->mAfResults.status == ia_aiq_af_status_fail) ? AF_STATE_FAIL
+          : AF_STATE_IDLE;
+    params->setAfState(afState);
+    params->setFocusDistance(aiqResult->mAfDistanceDiopters);
+    params->setFocusRange(aiqResult->mFocusRange);
+
+    bool lensMoving = false;
+    if (afState == AF_STATE_LOCAL_SEARCH || afState == AF_STATE_EXTENDED_SEARCH) {
+        lensMoving = (aiqResult->mAfResults.final_lens_position_reached == false);
+    } else if (aiqResult->mAiqParam.afMode == AF_MODE_OFF) {
+        lensMoving = (aiqResult->mAfResults.lens_driver_action ? true : false);
+    }
+    params->setLensState(lensMoving);
+
+    // Update scene mode
+    camera_scene_mode_t sceneMode = SCENE_MODE_AUTO;
+    params->getSceneMode(sceneMode);
+
+    /* Use direct AE result to update sceneMode to reflect the actual mode AE want to have,
+     * Besides needed by full pipe auto-switch, this is also necessary when user want to
+     * switch pipe in user app according to AE result.
+     */
+    if (sceneMode == SCENE_MODE_AUTO) {
+        if (aiqResult->mAeResults.multiframe== ia_aiq_bracket_mode_hdr) {
+            sceneMode = SCENE_MODE_HDR;
+        } else if (aiqResult->mAeResults.multiframe == ia_aiq_bracket_mode_ull) {
+            sceneMode = SCENE_MODE_ULL;
+        }
+    }
+    LOG2("%s, sceneMode:%d", __func__, sceneMode);
+    params->setSceneMode(sceneMode);
+
+    camera_lens_shading_map_mode_type_t lensShadingMapMode = LENS_SHADING_MAP_MODE_OFF;
+    params->getLensShadingMapMode(lensShadingMapMode);
+    if (lensShadingMapMode == LENS_SHADING_MAP_MODE_ON) {
+        size_t size = aiqResult->mAiqParam.lensShadingMapSize.x *
+                      aiqResult->mAiqParam.lensShadingMapSize.y * 4;
+        params->setLensShadingMap(aiqResult->mAiqParam.lensShadingMap, size);
+    }
+
+    return OK;
+}
+
+int ParameterGenerator::updateAwbGainsL(Parameters *params, const ia_aiq_awb_results &result)
+{
+    camera_awb_gains_t awbGains;
+    CLEAR(awbGains);
+    float normalizedR, normalizedG, normalizedB;
+
+    if (params->getAwbGains(awbGains) == OK) {
+        // User manual AWB gains
+        awbGains.g_gain = CLIP(awbGains.g_gain, AWB_GAIN_MAX, AWB_GAIN_MIN);
+        normalizedG = AiqUtils::normalizeAwbGain(awbGains.g_gain);
+    } else {
+        // non-manual AWB gains, try to find a proper G that makes R/G/B all in the gain range.
+        normalizedG = sqrt((AWB_GAIN_NORMALIZED_START * AWB_GAIN_NORMALIZED_END) / \
+                           (result.accurate_r_per_g * result.accurate_b_per_g));
+        awbGains.g_gain = AiqUtils::convertToUserAwbGain(normalizedG);
+    }
+
+    normalizedR = result.accurate_r_per_g * normalizedG;
+    normalizedB = result.accurate_b_per_g * normalizedG;
+
+    awbGains.r_gain = AiqUtils::convertToUserAwbGain(normalizedR);
+    awbGains.b_gain = AiqUtils::convertToUserAwbGain(normalizedB);
+
+    LOG2("awbGains [r, g, b] = [%d, %d, %d]", awbGains.r_gain, awbGains.g_gain, awbGains.b_gain);
+    params->setAwbGains(awbGains);
+
+    // Update the AWB result
+    camera_awb_result_t awbResult;
+    awbResult.r_per_g = result.accurate_r_per_g;
+    awbResult.b_per_g = result.accurate_b_per_g;
+    LOG2("awb result: %f, %f", awbResult.r_per_g, awbResult.b_per_g);
+    params->setAwbResult(&awbResult);
+
+    return OK;
+}
+
+int ParameterGenerator::updateTonemapCurve(long sequence, Parameters *params)
+{
+    if (!mTonemapMaxCurvePoints)
+        return OK;
+
+    const AiqResult *aiqResult = AiqResultStorage::getInstance(mCameraId)->getAiqResult(sequence);
+    CheckError((aiqResult == nullptr), UNKNOWN_ERROR,
+               "%s Aiq result of sequence %ld does not exist", __func__, sequence);
+    const ia_aiq_gbce_results &gbceResults = aiqResult->mGbceResults;
+
+    int multiplier = gbceResults.gamma_lut_size / mTonemapMaxCurvePoints;
+    for (int32_t i=0; i < mTonemapMaxCurvePoints; i++) {
+        mTonemapCurveRed[i * 2 + 1] = gbceResults.r_gamma_lut[i * multiplier];
+        mTonemapCurveBlue[i * 2 + 1] = gbceResults.g_gamma_lut[i * multiplier];
+        mTonemapCurveGreen[i * 2 + 1] = gbceResults.b_gamma_lut[i * multiplier];
+    }
+
+    int count = mTonemapMaxCurvePoints * 2;
+    camera_tonemap_curves_t curves =
+            {count, count, count,
+             mTonemapCurveRed.get(), mTonemapCurveBlue.get(), mTonemapCurveGreen.get()};
+    params->setTonemapCurves(curves);
+    return OK;
+}
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/metadata/ParameterGenerator.h b/camera/hal/intel/ipu6/src/metadata/ParameterGenerator.h
new file mode 100644
index 000000000000..bb06c2e05a20
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/metadata/ParameterGenerator.h
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+
+#include "iutils/Thread.h"
+#include "Parameters.h"
+
+namespace icamera {
+
+/*
+ * \class ParameterGenerator
+ * This class is used to generator parameter results. It updates the parameters
+ * with AIQ results, sensor embedded metadata and 3A statistics.
+ * The parameter results are stored with the frame sequence indicating on which
+ * frame the parameters are active.
+ */
+class ParameterGenerator {
+public:
+    ParameterGenerator(int cameraId);
+    ~ParameterGenerator();
+
+    /**
+     * \brief reset the parameters data.
+     */
+    int reset();
+
+    /**
+     * \brief Save parameters with sequence id indicating the active frame.
+     *           And update the aiq result parameters as well.
+     */
+    int saveParameters(long predictSequence, long requestId, const Parameters *param = nullptr);
+
+    /**
+     * \brief Update parameters per sequence id.
+     */
+    void updateParameters(long sequence, const Parameters *param);
+
+    /**
+     * \brief Get the parameters for the frame indicated by the sequence id.
+     */
+    int getParameters(long sequence, Parameters *param, bool mergeResultOnly = true, bool still = false);
+    int getRequestId(long predictSequence, long& requestId);
+
+private:
+    ParameterGenerator(const ParameterGenerator& other);
+    ParameterGenerator& operator=(const ParameterGenerator& other);
+
+    int generateParametersL(long sequence, Parameters *params);
+    int updateWithAiqResultsL(long sequence, Parameters *params);
+    int updateAwbGainsL(Parameters *params, const ia_aiq_awb_results &result);
+    int updateTonemapCurve(long sequence, Parameters *params);
+
+private:
+    typedef enum {
+        RESULT_TYPE_AIQ = 1,
+        RESULT_TYPE_SENSOR_EMD = 1 << 1,
+        RESULT_TYPE_STATISTICS = 1 << 2
+    } ResultType;
+
+    class RequestParam {
+    public:
+        RequestParam() : sequence(-1), requestId(-1) {}
+
+        ~RequestParam() {}
+
+        void reset() {
+            sequence = -1;
+            requestId = -1;
+        }
+
+        long sequence;
+        long requestId;
+        Parameters param;
+
+    private:
+        RequestParam(const RequestParam& other);
+        RequestParam& operator=(const RequestParam& other);
+    };
+
+private:
+    int mCameraId;
+    static const int kStorageSize = MAX_SETTING_COUNT;
+
+    // Guard for ParameterGenerator public API.
+    Mutex mParamsLock;
+    RequestParam mRequestParams[kStorageSize];
+    long mLastSequence;
+    Parameters mLastParam;
+
+    std::unique_ptr<float[]> mTonemapCurveRed;
+    std::unique_ptr<float[]> mTonemapCurveBlue;
+    std::unique_ptr<float[]> mTonemapCurveGreen;
+    int32_t mTonemapMaxCurvePoints;
+};
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/metadata/ParameterHelper.cpp b/camera/hal/intel/ipu6/src/metadata/ParameterHelper.cpp
new file mode 100644
index 000000000000..578557f5caca
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/metadata/ParameterHelper.cpp
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2017-2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "ParameterHelper"
+
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+
+#include "Parameters.h"
+#include "ParameterHelper.h"
+
+namespace icamera {
+
+void ParameterHelper::merge(const Parameters& src, Parameters* dst)
+{
+    AutoRLock rl(src.mData);
+    merge(getMetadata(src.mData), dst);
+}
+
+void ParameterHelper::merge(const CameraMetadata& metadata, Parameters* dst)
+{
+    if (metadata.isEmpty()) {
+        // Nothing needs to be merged
+        return;
+    }
+
+    AutoWLock wl(dst->mData);
+    const icamera_metadata_t* src = const_cast<CameraMetadata*>(&metadata)->getAndLock();
+    size_t count = metadata.entryCount();
+    icamera_metadata_ro_entry_t entry;
+    for (size_t i = 0; i < count; i++) {
+        CLEAR(entry);
+        if (get_icamera_metadata_ro_entry(src, i, &entry) != OK) {
+            continue;
+        }
+        switch (entry.type) {
+        case ICAMERA_TYPE_BYTE:
+            getMetadata(dst->mData).update(entry.tag, entry.data.u8, entry.count);
+            break;
+        case ICAMERA_TYPE_INT32:
+            getMetadata(dst->mData).update(entry.tag, entry.data.i32, entry.count);
+            break;
+        case ICAMERA_TYPE_FLOAT:
+            getMetadata(dst->mData).update(entry.tag, entry.data.f, entry.count);
+            break;
+        case ICAMERA_TYPE_INT64:
+            getMetadata(dst->mData).update(entry.tag, entry.data.i64, entry.count);
+            break;
+        case ICAMERA_TYPE_DOUBLE:
+            getMetadata(dst->mData).update(entry.tag, entry.data.d, entry.count);
+            break;
+        case ICAMERA_TYPE_RATIONAL:
+            getMetadata(dst->mData).update(entry.tag, entry.data.r, entry.count);
+            break;
+        default:
+            LOGW("Invalid entry type, should never happen");
+            break;
+        }
+    }
+    const_cast<CameraMetadata*>(&metadata)->unlock(src);
+}
+
+void ParameterHelper::copyMetadata(const Parameters& source, CameraMetadata* metadata)
+{
+    CheckError((!metadata), VOID_VALUE, "null metadata to be updated!");
+
+    AutoRLock rl(source.mData);
+    *metadata = getMetadata(source.mData);
+}
+
+} // end of namespace icamera
diff --git a/camera/hal/intel/ipu6/src/metadata/ParameterHelper.h b/camera/hal/intel/ipu6/src/metadata/ParameterHelper.h
new file mode 100644
index 000000000000..8e5cf6e25f81
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/metadata/ParameterHelper.h
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2017-2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "iutils/RWLock.h"
+#include "CameraMetadata.h"
+
+namespace icamera {
+
+class Parameters;
+
+/**
+ * \class ParameterHelper
+ *
+ * There are two main purposes of this class:
+ * 1. Provide some wrapper functions for the implementation of Parameters.
+ * 2. Provide some interface for HAL to access and modify Parameters internal data.
+ */
+class ParameterHelper {
+public:
+    /**
+     * \brief Merge and update dst parameter buffer with another parameter instance.
+     *
+     * \param[in] Parameters src: the source parameter.
+     * \param[out] Parameters dst: the parameter to be updated.
+     *
+     * \return void
+     */
+    static void merge(const Parameters& src, Parameters* dst);
+
+    /**
+     * \brief Merge and update dst parameter buffer by using metadata.
+     *
+     * \param[in] CameraMetadata metadata: the source metadata.
+     * \param[out] Parameters dst: the parameter to be updated.
+     *
+     * \return void
+     */
+    static void merge(const CameraMetadata& metadata, Parameters* dst);
+
+    /**
+     * \brief Copy metadata from parameter buffer.
+     *
+     * Some HAL V3 style parameters are not returned in the getParameter()
+     * because it is not used inside the HAL.
+     * Provide this function to assist upperlayer to return metadata
+     * to applications.
+     *
+     * \param[in] Parameters source: the parameter to provide metadata.
+     * \param[out] CameraMetadata metadata: the metadata to be updated.
+     *
+     * \return void
+     */
+    static void copyMetadata(const Parameters& source, CameraMetadata* metadata);
+
+private:
+    // The definitions and interfaces in this private section are only for Parameters internal
+    // use, HAL other code shouldn't and cannot access them.
+    friend class Parameters;
+
+    /**
+     * \class ParameterData
+     *
+     * \brief The definition of Parameters' internal data structure used to hide implementation
+     *        details of Parameters.
+     */
+    class ParameterData {
+    public:
+        ParameterData() {}
+        ~ParameterData() {}
+
+        ParameterData(const ParameterData& other) : mMetadata(other.mMetadata) {}
+        ParameterData& operator=(const ParameterData& other) {
+            mMetadata = other.mMetadata;
+            return *this;
+        }
+
+        CameraMetadata mMetadata; // The data structure to save all of the parameters.
+        RWLock mRwLock;           // Read-write lock to make Parameters class thread-safe
+    };
+
+    // Customized wrappers of RWLock to make the implementation of Parameters much cleaner.
+    class AutoRLock {
+    public:
+        AutoRLock(void* data) : mLock(getInternalData(data).mRwLock) { mLock.readLock(); }
+        ~AutoRLock() { mLock.unlock(); }
+    private:
+        RWLock& mLock;
+    };
+
+    class AutoWLock {
+    public:
+        AutoWLock(void* data) : mLock(getInternalData(data).mRwLock) { mLock.writeLock(); }
+        ~AutoWLock() { mLock.unlock(); }
+    private:
+        RWLock& mLock;
+    };
+
+    static ParameterData& getInternalData(void* data) {
+        return *reinterpret_cast<ParameterData*>(data);
+    }
+
+    static void* createParameterData() {
+        return new ParameterData();
+    }
+
+    static void* createParameterData(void* data) {
+        return new ParameterData(getInternalData(data));
+    }
+
+    static void releaseParameterData(void* data) {
+        delete &getInternalData(data);
+    }
+
+    static void deepCopy(void* srcData, void* dstData) {
+        getInternalData(dstData) = getInternalData(srcData);
+    }
+
+    static CameraMetadata& getMetadata(void* data) {
+        return getInternalData(data).mMetadata;
+    }
+
+    static icamera_metadata_ro_entry_t getMetadataEntry(void* data, uint32_t tag) {
+        return const_cast<const CameraMetadata*>(&getMetadata(data))->find(tag);
+    }
+};
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/metadata/Parameters.cpp b/camera/hal/intel/ipu6/src/metadata/Parameters.cpp
new file mode 100644
index 000000000000..3e76c0f9a799
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/metadata/Parameters.cpp
@@ -0,0 +1,1931 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "Parameters"
+
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.h"
+#include "iutils/CameraDump.h"
+#include "iutils/Utils.h"
+
+#include "PlatformData.h"
+#include "Parameters.h"
+#include "ParameterHelper.h"
+
+using std::vector;
+
+namespace icamera {
+
+Parameters::Parameters() : mData(ParameterHelper::createParameterData()) {}
+
+Parameters::Parameters(const Parameters& other) :
+        mData(ParameterHelper::createParameterData(other.mData)) {}
+
+Parameters& Parameters::operator=(const Parameters& other)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    ParameterHelper::deepCopy(other.mData, mData);
+    return *this;
+}
+
+Parameters::~Parameters()
+{
+    ParameterHelper::releaseParameterData(mData);
+    mData = nullptr;
+}
+
+void Parameters::merge(const Parameters& other)
+{
+    ParameterHelper::merge(other, this);
+}
+
+int Parameters::setAeMode(camera_ae_mode_t aeMode)
+{
+    uint8_t mode = aeMode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_AE_MODE, &mode, 1);
+}
+
+int Parameters::getAeMode(camera_ae_mode_t& aeMode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    aeMode = (camera_ae_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setAeState(camera_ae_state_t aeState)
+{
+    uint8_t state = aeState;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_AE_STATE, &state, 1);
+}
+
+int Parameters::getAeState(camera_ae_state_t& aeState) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_STATE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    aeState = (camera_ae_state_t)entry.data.u8[0];
+    return OK;
+}
+
+static int setRegions(CameraMetadata& metadata, camera_window_list_t regions, int tag)
+{
+    if (regions.empty()) {
+        // Nothing to do with an empty parameter.
+        return INVALID_OPERATION;
+    }
+
+    const int ELEM_NUM = sizeof(camera_window_t) / sizeof(int);
+    int values[regions.size() * ELEM_NUM];
+    for (size_t i = 0; i < regions.size(); i++) {
+        values[i * ELEM_NUM] = regions[i].left;
+        values[i * ELEM_NUM + 1] = regions[i].top;
+        values[i * ELEM_NUM + 2] = regions[i].right;
+        values[i * ELEM_NUM + 3] = regions[i].bottom;
+        values[i * ELEM_NUM + 4] = regions[i].weight;
+    }
+
+    return metadata.update(tag, values, ARRAY_SIZE(values));
+}
+
+static int getRegions(icamera_metadata_ro_entry_t entry, camera_window_list_t& regions)
+{
+    regions.clear();
+    const int ELEM_NUM = sizeof(camera_window_t) / sizeof(int);
+    if (entry.count == 0 || entry.count % ELEM_NUM != 0) {
+        return NAME_NOT_FOUND;
+    }
+
+    camera_window_t w;
+    for (size_t i = 0; i < entry.count; i += ELEM_NUM) {
+        w.left = entry.data.i32[i];
+        w.top = entry.data.i32[i + 1];
+        w.right = entry.data.i32[i + 2];
+        w.bottom = entry.data.i32[i + 3];
+        w.weight = entry.data.i32[i + 4];
+        regions.push_back(w);
+    }
+
+    return OK;
+}
+
+int Parameters::setAeRegions(camera_window_list_t aeRegions)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return setRegions(ParameterHelper::getMetadata(mData), aeRegions, CAMERA_AE_REGIONS);
+}
+
+int Parameters::getAeRegions(camera_window_list_t& aeRegions) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    return getRegions(ParameterHelper::getMetadataEntry(mData, CAMERA_AE_REGIONS), aeRegions);
+}
+
+int Parameters::setAeLock(bool lock)
+{
+    uint8_t lockValue = lock ? 1 : 0;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_AE_LOCK, &lockValue, 1);
+}
+
+int Parameters::getAeLock(bool& lock) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_LOCK);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    lock = entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setExposureTime(int64_t exposureTime)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_SENSOR_EXPOSURE_TIME, &exposureTime, 1);
+}
+
+int Parameters::getExposureTime(int64_t& exposureTime) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SENSOR_EXPOSURE_TIME);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    exposureTime = entry.data.i64[0];
+    return OK;
+}
+
+int Parameters::setSensitivityGain(float gain)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_SENSITIVITY_GAIN, &gain, 1);
+}
+
+int Parameters::getSensitivityGain(float& gain) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_SENSITIVITY_GAIN);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    gain = entry.data.f[0];
+    return OK;
+}
+
+int Parameters::setAeCompensation(int ev)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_AE_COMPENSATION, &ev, 1);
+}
+
+int Parameters::getAeCompensation(int& ev) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_COMPENSATION);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    ev = entry.data.i32[0];
+    return OK;
+}
+
+int Parameters::setFrameRate(float fps)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_FRAME_RATE, &fps, 1);
+}
+
+int Parameters::getFrameRate(float& fps) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_FRAME_RATE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    fps = entry.data.f[0];
+    return OK;
+}
+
+int Parameters::setAntiBandingMode(camera_antibanding_mode_t bandingMode)
+{
+    uint8_t mode = bandingMode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_AE_ANTIBANDING_MODE, &mode, 1);
+}
+
+int Parameters::getAntiBandingMode(camera_antibanding_mode_t& bandingMode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_ANTIBANDING_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    bandingMode = (camera_antibanding_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setAwbMode(camera_awb_mode_t awbMode)
+{
+    uint8_t mode = awbMode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_MODE, &mode, 1);
+}
+
+int Parameters::getAwbMode(camera_awb_mode_t& awbMode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    awbMode = (camera_awb_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setAwbState(camera_awb_state_t awbState)
+{
+    uint8_t state = awbState;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_STATE, &state, 1);
+}
+
+int Parameters::getAwbState(camera_awb_state_t& awbState) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_STATE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    awbState = (camera_awb_state_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setAwbLock(bool lock)
+{
+    uint8_t lockValue = lock ? 1 : 0;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_LOCK, &lockValue, 1);
+}
+
+int Parameters::getAwbLock(bool& lock) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_LOCK);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    lock = entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setAwbCctRange(camera_range_t cct)
+{
+    int range[] = {(int)cct.min, (int)cct.max};
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_CCT_RANGE, range, ARRAY_SIZE(range));
+}
+
+int Parameters::getAwbCctRange(camera_range_t& cct) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_CCT_RANGE);
+    const size_t ELEM_NUM = sizeof(camera_range_t) / sizeof(int);
+    if (entry.count != ELEM_NUM) {
+        return NAME_NOT_FOUND;
+    }
+    cct.min = entry.data.i32[0];
+    cct.max = entry.data.i32[1];
+    return OK;
+}
+
+int Parameters::setAwbGains(camera_awb_gains_t awbGains)
+{
+    int values[] = {awbGains.r_gain, awbGains.g_gain, awbGains.b_gain};
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_GAINS, values, ARRAY_SIZE(values));
+}
+
+int Parameters::getAwbGains(camera_awb_gains_t& awbGains) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_GAINS);
+    const size_t ELEM_NUM = sizeof(camera_awb_gains_t) / sizeof(int);
+    if (entry.count != ELEM_NUM) {
+        return NAME_NOT_FOUND;
+    }
+    awbGains.r_gain = entry.data.i32[0];
+    awbGains.g_gain = entry.data.i32[1];
+    awbGains.b_gain = entry.data.i32[2];
+    return OK;
+}
+
+int Parameters::setAwbResult(void* data)
+{
+    uint32_t size = sizeof(camera_awb_result_t);
+    uint32_t tag = CAMERA_AWB_RESULT;
+    ParameterHelper::AutoWLock wl(mData);
+
+    if (data == NULL) {
+        return ParameterHelper::getMetadata(mData).erase(tag);
+    }
+    return ParameterHelper::getMetadata(mData).update(tag, (uint8_t*)data, size);
+}
+
+int Parameters::getAwbResult(void* data) const
+{
+    if (data == NULL) {
+        return BAD_VALUE;
+    }
+
+    uint32_t size = sizeof(camera_awb_result_t);
+    uint32_t tag = CAMERA_AWB_RESULT;
+    ParameterHelper::AutoRLock rl(mData);
+
+    auto entry = ParameterHelper::getMetadataEntry(mData, tag);
+    if (entry.count != size) {
+        return NAME_NOT_FOUND;
+    }
+
+    MEMCPY_S(data, size, entry.data.u8, size);
+
+    return OK;
+}
+
+int Parameters::setAwbGainShift(camera_awb_gains_t awbGainShift)
+{
+    int values[] = {awbGainShift.r_gain, awbGainShift.g_gain, awbGainShift.b_gain};
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_GAIN_SHIFT, values, ARRAY_SIZE(values));
+}
+
+int Parameters::getAwbGainShift(camera_awb_gains_t& awbGainShift) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_GAIN_SHIFT);
+    const size_t ELEM_NUM = sizeof(camera_awb_gains_t) / sizeof(int);
+    if (entry.count != ELEM_NUM) {
+        return NAME_NOT_FOUND;
+    }
+    awbGainShift.r_gain = entry.data.i32[0];
+    awbGainShift.g_gain = entry.data.i32[1];
+    awbGainShift.b_gain = entry.data.i32[2];
+    return OK;
+}
+
+int Parameters::setAwbWhitePoint(camera_coordinate_t whitePoint)
+{
+    int values[] = {whitePoint.x, whitePoint.y};
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_WHITE_POINT, values, ARRAY_SIZE(values));
+}
+
+int Parameters::getAwbWhitePoint(camera_coordinate_t& whitePoint) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_WHITE_POINT);
+    const size_t ELEM_NUM = sizeof(camera_coordinate_t) / sizeof(int);
+    if (entry.count != ELEM_NUM) {
+        return NAME_NOT_FOUND;
+    }
+
+    whitePoint.x = entry.data.i32[0];
+    whitePoint.y = entry.data.i32[1];
+
+    return OK;
+}
+
+int Parameters::setColorTransform(camera_color_transform_t colorTransform)
+{
+    float* transform = (float*)colorTransform.color_transform;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_COLOR_TRANSFORM, transform, 3 * 3);
+}
+
+int Parameters::getColorTransform(camera_color_transform_t& colorTransform) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_COLOR_TRANSFORM);
+    const size_t ELEM_NUM = 3 * 3;
+    if (entry.count != ELEM_NUM) {
+        return NAME_NOT_FOUND;
+    }
+    for (size_t i = 0; i < ELEM_NUM; i++) {
+        colorTransform.color_transform[i / 3][i % 3] = entry.data.f[i];
+    }
+
+    return OK;
+}
+
+int Parameters::setColorGains(camera_color_gains_t colorGains)
+{
+    float* gains = colorGains.color_gains_rggb;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_COLOR_GAINS, gains, 4);
+}
+
+int Parameters::getColorGains(camera_color_gains_t& colorGains) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    icamera_metadata_ro_entry_t entry =
+        ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_COLOR_GAINS);
+    const size_t ELEM_NUM = 4;
+    if (entry.count != ELEM_NUM) {
+        return NAME_NOT_FOUND;
+    }
+    for (size_t i = 0; i < ELEM_NUM; i++) {
+        colorGains.color_gains_rggb[i] = entry.data.f[i];
+    }
+    return OK;
+}
+
+int Parameters::setAwbRegions(camera_window_list_t awbRegions)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return setRegions(ParameterHelper::getMetadata(mData), awbRegions, CAMERA_AWB_REGIONS);
+}
+
+int Parameters::getAwbRegions(camera_window_list_t& awbRegions) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    return getRegions(ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_REGIONS), awbRegions);
+}
+
+int Parameters::setNrMode(camera_nr_mode_t nrMode)
+{
+    uint8_t mode = nrMode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_NR_MODE, &mode, 1);
+}
+
+int Parameters::getNrMode(camera_nr_mode_t& nrMode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_NR_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    nrMode = (camera_nr_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setNrLevel(camera_nr_level_t level)
+{
+    int values [] = {level.overall, level.spatial, level.temporal};
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_NR_LEVEL, values, ARRAY_SIZE(values));
+}
+
+int Parameters::getNrLevel(camera_nr_level_t& level) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_NR_LEVEL);
+    const size_t ELEM_NUM = sizeof(camera_nr_level_t) / sizeof(int);
+    if (entry.count != ELEM_NUM) {
+        return NAME_NOT_FOUND;
+    }
+    level.overall = entry.data.i32[0];
+    level.spatial = entry.data.i32[1];
+    level.temporal = entry.data.i32[2];
+    return OK;
+}
+
+int Parameters::setIrisMode(camera_iris_mode_t irisMode)
+{
+    uint8_t mode = irisMode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_IRIS_MODE, &mode, 1);
+}
+
+int Parameters::getIrisMode(camera_iris_mode_t& irisMode)
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_IRIS_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    irisMode = (camera_iris_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setIrisLevel(int level)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_IRIS_LEVEL, &level, 1);
+}
+
+int Parameters::getIrisLevel(int& level)
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_IRIS_LEVEL);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    level = entry.data.i32[0];
+    return OK;
+}
+
+int Parameters::setWdrLevel(uint8_t level)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_WDR_LEVEL, &level, 1);
+}
+
+int Parameters::getWdrLevel(uint8_t& level) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_WDR_LEVEL);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    level = entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setEffectSceneMode(camera_scene_mode_t sceneMode)
+{
+    uint8_t mode = sceneMode;
+    LOGW("Effect scene mode is deprecated. Please use setSceneMode() instead.");
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_SCENE_MODE, &mode, 1);
+}
+
+int Parameters::getEffectSceneMode(camera_scene_mode_t& sceneMode) const
+{
+    LOGW("Effect scene mode is deprecated. Please use getSceneMode() instead.");
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_SCENE_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    sceneMode = (camera_scene_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setSceneMode(camera_scene_mode_t sceneMode)
+{
+    uint8_t mode = sceneMode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_SCENE_MODE, &mode, 1);
+}
+
+int Parameters::getSceneMode(camera_scene_mode_t& sceneMode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_SCENE_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    sceneMode = (camera_scene_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setWeightGridMode(camera_weight_grid_mode_t weightGridMode)
+{
+    uint8_t mode = (uint8_t)weightGridMode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_WEIGHT_GRID_MODE, &mode, 1);
+}
+
+int Parameters::getWeightGridMode(camera_weight_grid_mode_t& weightGridMode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_WEIGHT_GRID_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    weightGridMode = (camera_weight_grid_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setBlcAreaMode(camera_blc_area_mode_t blcAreaMode)
+{
+    uint8_t mode = blcAreaMode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_BLC_AREA_MODE, &mode, 1);
+}
+
+int Parameters::getBlcAreaMode(camera_blc_area_mode_t& blcAreaMode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_BLC_AREA_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    blcAreaMode = (camera_blc_area_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setFpsRange(camera_range_t fpsRange)
+{
+    float range[] = {fpsRange.min, fpsRange.max};
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_AE_TARGET_FPS_RANGE, range, ARRAY_SIZE(range));
+}
+
+int Parameters::getFpsRange(camera_range_t& fpsRange) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_TARGET_FPS_RANGE);
+    const size_t ELEM_NUM = sizeof(camera_range_t) / sizeof(float);
+    if (entry.count != ELEM_NUM) {
+        return NAME_NOT_FOUND;
+    }
+    fpsRange.min = entry.data.f[0];
+    fpsRange.max = entry.data.f[1];
+    return OK;
+}
+
+int Parameters::setImageEnhancement(camera_image_enhancement_t effects)
+{
+    int values[] = {effects.sharpness, effects.brightness, effects.contrast, effects.hue, effects.saturation};
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_IMAGE_ENHANCEMENT, values, ARRAY_SIZE(values));
+}
+
+int Parameters::getImageEnhancement(camera_image_enhancement_t& effects) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_IMAGE_ENHANCEMENT);
+    size_t number_of_effects = sizeof(camera_image_enhancement_t) / sizeof(int);
+    if (entry.count != number_of_effects) {
+        return NAME_NOT_FOUND;
+    }
+    effects.sharpness = entry.data.i32[0];
+    effects.brightness = entry.data.i32[1];
+    effects.contrast = entry.data.i32[2];
+    effects.hue = entry.data.i32[3];
+    effects.saturation = entry.data.i32[4];
+
+    return OK;
+}
+
+int Parameters::setDeinterlaceMode(camera_deinterlace_mode_t deinterlaceMode)
+{
+    uint8_t mode = deinterlaceMode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_DEINTERLACE_MODE, &mode, 1);
+}
+
+int Parameters::getDeinterlaceMode(camera_deinterlace_mode_t &deinterlaceMode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_DEINTERLACE_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    deinterlaceMode = (camera_deinterlace_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::getSupportedVideoStabilizationMode(camera_video_stabilization_list_t &supportedModes) const
+{
+    supportedModes.clear();
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
+    for (size_t i = 0; i < entry.count; i++) {
+        supportedModes.push_back((camera_video_stabilization_mode_t)entry.data.u8[i]);
+    }
+
+    return OK;
+}
+
+int Parameters::getSupportedAeMode(vector <camera_ae_mode_t> &supportedAeModes) const
+{
+    supportedAeModes.clear();
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_AVAILABLE_MODES);
+    for (size_t i = 0; i < entry.count; i++) {
+        supportedAeModes.push_back((camera_ae_mode_t)entry.data.u8[i]);
+    }
+
+    return OK;
+}
+
+int Parameters::getSupportedAwbMode(vector <camera_awb_mode_t> &supportedAwbModes) const
+{
+    supportedAwbModes.clear();
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_AVAILABLE_MODES);
+    for (size_t i = 0; i < entry.count; i++) {
+        supportedAwbModes.push_back((camera_awb_mode_t)entry.data.u8[i]);
+    }
+
+    return OK;
+}
+
+int Parameters::getSupportedAfMode(vector <camera_af_mode_t> &supportedAfModes) const
+{
+    supportedAfModes.clear();
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AF_AVAILABLE_MODES);
+    for (size_t i = 0; i < entry.count; i++) {
+        supportedAfModes.push_back((camera_af_mode_t)entry.data.u8[i]);
+    }
+
+    return OK;
+}
+
+int Parameters::getSupportedSceneMode(vector <camera_scene_mode_t> &supportedSceneModes) const
+{
+    supportedSceneModes.clear();
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_CONTROL_AVAILABLE_SCENE_MODES);
+    for (size_t i = 0; i < entry.count; i++) {
+        supportedSceneModes.push_back((camera_scene_mode_t)entry.data.u8[i]);
+    }
+
+    return OK;
+}
+
+int Parameters::getSupportedAntibandingMode(vector <camera_antibanding_mode_t> &supportedAntibindingModes) const
+{
+    supportedAntibindingModes.clear();
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_AVAILABLE_ANTIBANDING_MODES);
+    for (size_t i = 0; i < entry.count; i++) {
+        supportedAntibindingModes.push_back((camera_antibanding_mode_t)entry.data.u8[i]);
+    }
+
+    return OK;
+}
+
+int Parameters::getSupportedFpsRange(camera_range_array_t& ranges) const
+{
+    ranges.clear();
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_AVAILABLE_TARGET_FPS_RANGES);
+    if (entry.count == 0 || entry.count % 2 != 0) {
+        return NAME_NOT_FOUND;
+    }
+
+    camera_range_t fps;
+    for (size_t i = 0; i < entry.count; i += 2) {
+        fps.min = entry.data.f[i];
+        fps.max = entry.data.f[i + 1];
+        ranges.push_back(fps);
+    }
+
+    return OK;
+}
+
+int Parameters::getSupportedStreamConfig(supported_stream_config_array_t& config) const
+{
+    config.clear();
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS);
+    const int streamConfMemberNum = sizeof(supported_stream_config_t) / sizeof(int);
+    if (entry.count == 0 || entry.count % streamConfMemberNum != 0) {
+        return NAME_NOT_FOUND;
+    }
+
+    supported_stream_config_t cfg;
+    CLEAR(cfg);
+
+    for (size_t i = 0; i < entry.count; i += streamConfMemberNum) {
+        MEMCPY_S(&cfg, sizeof(supported_stream_config_t), &entry.data.i32[i], sizeof(supported_stream_config_t));
+        cfg.stride = CameraUtils::getStride(cfg.format, cfg.width);
+        cfg.size   = CameraUtils::getFrameSize(cfg.format, cfg.width, cfg.height);
+        config.push_back(cfg);
+    }
+    return OK;
+}
+
+int Parameters::getSupportedSensorExposureTimeRange(camera_range_t& range) const
+{
+    CLEAR(range);
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE);
+    if (entry.count != 2) {
+        return NAME_NOT_FOUND;
+    }
+
+    range.min = (float)(entry.data.i64[0]);
+    range.max = (float)(entry.data.i64[1]);
+    return OK;
+}
+
+int Parameters::getSupportedSensorSensitivityRange(camera_range_t& range) const
+{
+    CLEAR(range);
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SENSOR_INFO_SENSITIVITY_RANGE);
+    if (entry.count != 2) {
+        return NAME_NOT_FOUND;
+    }
+
+    range.min = entry.data.i32[0];
+    range.max = entry.data.i32[1];
+    return OK;
+}
+
+int Parameters::getSupportedFeatures(camera_features_list_t& features) const
+{
+    features.clear();
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_INFO_AVAILABLE_FEATURES);
+    for (size_t i = 0; i < entry.count; i++) {
+        features.push_back((camera_features)entry.data.u8[i]);
+    }
+    return OK;
+}
+
+int Parameters::getAeCompensationRange(camera_range_t& evRange) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_COMPENSATION_RANGE);
+    const size_t ELEM_NUM = sizeof(camera_range_t) / sizeof(int);
+    if (entry.count != ELEM_NUM) {
+        return NAME_NOT_FOUND;
+    }
+
+    evRange.min = entry.data.i32[0];
+    evRange.max = entry.data.i32[1];
+    return OK;
+}
+
+int Parameters::getAeCompensationStep(camera_rational_t& evStep) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_COMPENSATION_STEP);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+
+    evStep.numerator = entry.data.r[0].numerator;
+    evStep.denominator = entry.data.r[0].denominator;
+    return OK;
+}
+
+int Parameters::getSupportedAeExposureTimeRange(std::vector<camera_ae_exposure_time_range_t> & etRanges) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+
+    const int MEMBER_COUNT = 3;
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_INFO_AE_EXPOSURE_TIME_RANGE);
+    if (entry.count == 0 || entry.count % MEMBER_COUNT != 0) {
+        return NAME_NOT_FOUND;
+    }
+
+    camera_ae_exposure_time_range_t range;
+    CLEAR(range);
+
+    for (size_t i = 0; i < entry.count; i += MEMBER_COUNT) {
+        range.scene_mode = (camera_scene_mode_t)entry.data.i32[i];
+        range.et_range.min = entry.data.i32[i + 1];
+        range.et_range.max = entry.data.i32[i + 2];
+        etRanges.push_back(range);
+    }
+    return OK;
+}
+
+int Parameters::getSupportedAeGainRange(std::vector<camera_ae_gain_range_t>& gainRanges) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+
+    const int MEMBER_COUNT = 3;
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_INFO_AE_GAIN_RANGE);
+    if (entry.count == 0 || entry.count % MEMBER_COUNT != 0) {
+        return NAME_NOT_FOUND;
+    }
+
+    camera_ae_gain_range_t range;
+    CLEAR(range);
+
+    for (size_t i = 0; i < entry.count; i += MEMBER_COUNT) {
+        range.scene_mode = (camera_scene_mode_t)entry.data.i32[i];
+        // Since we use int to store float, before storing it we multiply min and max by 100,
+        // so we need to divide 100 when giving them outside.
+        range.gain_range.min = (float)entry.data.i32[i + 1] / 100.0;
+        range.gain_range.max = (float)entry.data.i32[i + 2] / 100.0;
+        gainRanges.push_back(range);
+    }
+    return OK;
+}
+
+bool Parameters::getAeLockAvailable() const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_LOCK_AVAILABLE);
+    if (entry.count != 1) {
+        return false;
+    }
+
+    return (entry.data.u8[0] == CAMERA_AE_LOCK_AVAILABLE_TRUE);
+}
+
+bool Parameters::getAwbLockAvailable() const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_LOCK_AVAILABLE);
+    if (entry.count != 1) {
+        return false;
+    }
+
+    return (entry.data.u8[0] == CAMERA_AWB_LOCK_AVAILABLE_TRUE);
+}
+
+int Parameters::setExposureTimeRange(camera_range_t exposureTimeRange)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    const int MEMBER_COUNT = 2;
+    int values[MEMBER_COUNT] = {(int)exposureTimeRange.min, (int)exposureTimeRange.max};
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_EXPOSURE_TIME_RANGE, values, MEMBER_COUNT);
+}
+
+int Parameters::getExposureTimeRange(camera_range_t& exposureTimeRange) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+
+    const int MEMBER_COUNT = 2;
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_EXPOSURE_TIME_RANGE);
+    if (entry.count == 0 || entry.count != MEMBER_COUNT) {
+        return NAME_NOT_FOUND;
+    }
+
+    exposureTimeRange.min = entry.data.i32[0];
+    exposureTimeRange.max = entry.data.i32[1];
+    return OK;
+}
+
+int Parameters::setSensitivityGainRange(camera_range_t sensitivityGainRange)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    float values[] = {sensitivityGainRange.min, sensitivityGainRange.max};
+
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_SENSITIVITY_GAIN_RANGE, values, ARRAY_SIZE(values));
+}
+
+int Parameters::getSensitivityGainRange(camera_range_t& sensitivityGainRange) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+
+    const int MEMBER_COUNT = 2;
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_SENSITIVITY_GAIN_RANGE);
+    if (entry.count == 0 || entry.count != MEMBER_COUNT) {
+        return NAME_NOT_FOUND;
+    }
+
+    sensitivityGainRange.min = entry.data.f[0];
+    sensitivityGainRange.max = entry.data.f[1];
+    return OK;
+}
+
+int Parameters::setAeConvergeSpeed(camera_converge_speed_t speed)
+{
+    uint8_t aeSpeed = speed;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_AE_CONVERGE_SPEED, &aeSpeed, 1);
+}
+
+int Parameters::getAeConvergeSpeed(camera_converge_speed_t& speed) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_AE_CONVERGE_SPEED);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+
+    speed = (camera_converge_speed_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setAwbConvergeSpeed(camera_converge_speed_t speed)
+{
+    uint8_t awbSpeed = speed;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_CONVERGE_SPEED, &awbSpeed, 1);
+}
+
+int Parameters::getAwbConvergeSpeed(camera_converge_speed_t& speed) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_CONVERGE_SPEED);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+
+    speed = (camera_converge_speed_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setAeConvergeSpeedMode(camera_converge_speed_mode_t mode)
+{
+    uint8_t speedMode = mode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_AE_CONVERGE_SPEED_MODE, &speedMode, 1);
+}
+
+int Parameters::getAeConvergeSpeedMode(camera_converge_speed_mode_t& mode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_AE_CONVERGE_SPEED_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+
+    mode = (camera_converge_speed_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setAwbConvergeSpeedMode(camera_converge_speed_mode_t mode)
+{
+    uint8_t speedMode = mode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_CONVERGE_SPEED_MODE, &speedMode, 1);
+}
+
+int Parameters::getAwbConvergeSpeedMode(camera_converge_speed_mode_t& mode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_CONVERGE_SPEED_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+
+    mode = (camera_converge_speed_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setMakernoteData(const void* data, unsigned int size)
+{
+    CheckError(!data || size == 0, BAD_VALUE, "%s, invalid parameters", __func__);
+    ParameterHelper::AutoWLock wl(mData);
+
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_MAKERNOTE_DATA, (uint8_t*)data, size);
+}
+
+int Parameters::getMakernoteData(void* data, unsigned int* size) const
+{
+    CheckError(!data || !size, BAD_VALUE, "%s, invalid parameters", __func__);
+    ParameterHelper::AutoRLock rl(mData);
+
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_MAKERNOTE_DATA);
+    if (entry.count > 0) {
+        MEMCPY_S(data, *size, entry.data.u8, entry.count);
+        *size = entry.count;
+    } else {
+        return NAME_NOT_FOUND;
+    }
+
+    return OK;
+}
+
+int Parameters::setCustomAicParam(const void* data, unsigned int length)
+{
+    CheckError(!data, BAD_VALUE, "%s, invalid parameters", __func__);
+    ParameterHelper::AutoWLock wl(mData);
+
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_CUSTOM_AIC_PARAM, (uint8_t*)data, length);
+}
+
+int Parameters::getCustomAicParam(void* data, unsigned int* length) const
+{
+    CheckError(!data || !length, BAD_VALUE, "%s, invalid parameters", __func__);
+    ParameterHelper::AutoRLock rl(mData);
+
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_CUSTOM_AIC_PARAM);
+    if (entry.count > 0) {
+        MEMCPY_S(data, *length, entry.data.u8, entry.count);
+        *length = entry.count;
+    } else {
+        return NAME_NOT_FOUND;
+    }
+
+    return OK;
+}
+
+int Parameters::setMakernoteMode(camera_makernote_mode_t mode)
+{
+    uint8_t mknMode = mode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_MAKERNOTE_MODE, &mknMode, 1);
+}
+
+int Parameters::getMakernoteMode(camera_makernote_mode_t &mode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_MAKERNOTE_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+
+    mode = (camera_makernote_mode_t)entry.data.u8[0];
+
+    return OK;
+}
+
+int Parameters::setDigitalZoomRatio(float ratio)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_DIGITAL_ZOOM_RATIO, &ratio, 1);
+}
+
+int Parameters::getDigitalZoomRatio(float& ratio) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_DIGITAL_ZOOM_RATIO);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    ratio = entry.data.f[0];
+    return OK;
+}
+
+int Parameters::setLdcMode(camera_ldc_mode_t mode)
+{
+    uint8_t ldcMode = mode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_LDC_MODE, &ldcMode, 1);
+}
+
+int Parameters::getLdcMode(camera_ldc_mode_t &mode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_LDC_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    mode = (camera_ldc_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setRscMode(camera_rsc_mode_t mode)
+{
+    uint8_t rscMode = mode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_RSC_MODE, &rscMode, 1);
+}
+
+int Parameters::getRscMode(camera_rsc_mode_t &mode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_RSC_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    mode = (camera_rsc_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setFlipMode(camera_flip_mode_t mode)
+{
+    uint8_t flipMode = mode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_FLIP_MODE, &flipMode, 1);
+}
+
+int Parameters::getFlipMode(camera_flip_mode_t &mode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_FLIP_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    mode = (camera_flip_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setMonoDsMode(camera_mono_downscale_mode_t mode)
+{
+    uint8_t monoDsMode = mode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_MONO_DOWNSCALE, &monoDsMode, 1);
+}
+
+int Parameters::getMonoDsMode(camera_mono_downscale_mode_t &mode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_MONO_DOWNSCALE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    mode = (camera_mono_downscale_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setRun3ACadence(int cadence)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_RUN3_A_CADENCE, &cadence, 1);
+}
+
+int Parameters::getRun3ACadence(int &cadence) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_RUN3_A_CADENCE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    cadence = entry.data.i32[0];
+    return OK;
+}
+
+int Parameters::setFisheyeDewarpingMode(camera_fisheye_dewarping_mode_t mode)
+{
+    uint8_t dewarpingMode = mode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_FISHEYE_DEWARPING_MODE, &dewarpingMode, 1);
+}
+
+int Parameters::getFisheyeDewarpingMode(camera_fisheye_dewarping_mode_t &mode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_FISHEYE_DEWARPING_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    mode = (camera_fisheye_dewarping_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setAeDistributionPriority(camera_ae_distribution_priority_t priority)
+{
+    uint8_t distributionPriority = priority;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY, &distributionPriority, 1);
+}
+
+int Parameters::getAeDistributionPriority(camera_ae_distribution_priority_t& priority) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+
+    priority = (camera_ae_distribution_priority_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setYuvColorRangeMode(camera_yuv_color_range_mode_t colorRange)
+{
+    uint8_t mode = colorRange;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_YUV_COLOR_RANGE, &mode, 1);
+}
+
+int Parameters::getYuvColorRangeMode(camera_yuv_color_range_mode_t& colorRange) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_YUV_COLOR_RANGE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+
+    colorRange = (camera_yuv_color_range_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setJpegQuality(uint8_t quality)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_QUALITY, &quality, 1);
+}
+
+int Parameters::getJpegQuality(uint8_t *quality) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_QUALITY);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    *quality = entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setJpegThumbnailQuality(uint8_t quality)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_THUMBNAIL_QUALITY, &quality, 1);
+}
+
+int Parameters::getJpegThumbnailQuality(uint8_t *quality) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_THUMBNAIL_QUALITY);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    *quality = entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setJpegThumbnailSize(const camera_resolution_t& res)
+{
+    int size[2] = {res.width, res.height};
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_THUMBNAIL_SIZE, size, 2);
+}
+
+int Parameters::getJpegThumbnailSize(camera_resolution_t& res) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_THUMBNAIL_SIZE);
+    if (entry.count != 2) {
+        return NAME_NOT_FOUND;
+    }
+    res.width  = entry.data.i32[0];
+    res.height = entry.data.i32[1];
+    return OK;
+}
+
+int Parameters::setJpegRotation(int rotation)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_ORIENTATION, &rotation, 1);
+}
+
+int Parameters::getJpegRotation(int &rotation) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_ORIENTATION);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    rotation = entry.data.i32[0];
+    return OK;
+}
+
+int Parameters::setJpegGpsCoordinates(const double *coordinates)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_GPS_COORDINATES, coordinates, 3);
+}
+
+int Parameters::getJpegGpsLatitude(double &latitude) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_GPS_COORDINATES);
+    if (entry.count != 3) {
+        return NAME_NOT_FOUND;
+    }
+    latitude = entry.data.d[0];
+    return OK;
+}
+
+int Parameters::getJpegGpsLongitude(double &longitude) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_GPS_COORDINATES);
+    if (entry.count != 3) {
+        return NAME_NOT_FOUND;
+    }
+    longitude = entry.data.d[1];
+    return OK;
+}
+
+int Parameters::getJpegGpsAltitude(double &altitude) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_GPS_COORDINATES);
+    if (entry.count != 3) {
+        return NAME_NOT_FOUND;
+    }
+    altitude = entry.data.d[2];
+    return OK;
+}
+
+int Parameters::setJpegGpsTimeStamp(int64_t  timestamp)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_GPS_TIMESTAMP, &timestamp, 1);
+}
+
+int Parameters::getJpegGpsTimeStamp(int64_t &timestamp) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_GPS_TIMESTAMP);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    timestamp = entry.data.i32[0];
+    return OK;
+}
+
+int Parameters::setJpegGpsProcessingMethod(int processMethod)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_GPS_PROCESSING_METHOD, &processMethod, 1);
+}
+
+int Parameters::getJpegGpsProcessingMethod(int &processMethod) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_GPS_PROCESSING_METHOD);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    processMethod = entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setJpegGpsProcessingMethod(const char* processMethod)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_GPS_PROCESSING_METHOD, (const uint8_t*)processMethod, strlen(processMethod) + 1);
+}
+
+int Parameters::getJpegGpsProcessingMethod(int size, char* processMethod) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_GPS_PROCESSING_METHOD);
+    if (entry.count <= 0) {
+        return NAME_NOT_FOUND;
+    }
+    MEMCPY_S(processMethod, size, entry.data.u8, entry.count);
+    return OK;
+}
+
+int Parameters::setImageEffect(camera_effect_mode_t  effect)
+{
+    uint8_t effectmode = effect;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_CONTROL_EFFECT_MODE, &effectmode, 1);
+}
+
+int Parameters::getImageEffect(camera_effect_mode_t &effect) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_CONTROL_EFFECT_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    effect = (camera_effect_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setVideoStabilizationMode(camera_video_stabilization_mode_t mode)
+{
+    uint8_t dvsMode = mode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_CONTROL_VIDEO_STABILIZATION_MODE, &dvsMode, 1);
+}
+
+int Parameters::getVideoStabilizationMode(camera_video_stabilization_mode_t &mode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_CONTROL_VIDEO_STABILIZATION_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    mode = (camera_video_stabilization_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::getFocalLength(float &focal) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_FOCAL_LENGTH);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    focal = (float)entry.data.f[0];
+    return OK;
+}
+
+int Parameters::setFocalLength(float focal)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_LENS_FOCAL_LENGTH, &focal, 1);
+}
+
+int Parameters::getAperture(float &aperture) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_APERTURE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    aperture = entry.data.f[0];
+    return OK;
+}
+
+int Parameters::setAperture(float aperture)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_LENS_APERTURE, &aperture, 1);
+}
+
+int Parameters::getFocusDistance(float &distance) const {
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_FOCUS_DISTANCE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    distance = entry.data.f[0];
+    return OK;
+}
+
+int Parameters::setFocusDistance(float distance) {
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_LENS_FOCUS_DISTANCE, &distance, 1);
+}
+
+int Parameters::setFocusRange(const camera_range_t &focusRange)
+{
+    float range[] = {focusRange.min, focusRange.max};
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_LENS_FOCUS_RANGE,
+                                                      range, ARRAY_SIZE(range));
+}
+
+int Parameters::getFocusRange(camera_range_t& focusRange) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_FOCUS_RANGE);
+    if (entry.count != (sizeof(camera_range_t) / sizeof(float))) {
+        return NAME_NOT_FOUND;
+    }
+    focusRange.min = entry.data.f[0];
+    focusRange.max = entry.data.f[1];
+    return OK;
+}
+
+int Parameters::setAfMode(camera_af_mode_t afMode)
+{
+    uint8_t mode = afMode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_AF_MODE, &mode, 1);
+}
+
+int Parameters::getAfMode(camera_af_mode_t& afMode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AF_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    afMode = (camera_af_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setAfTrigger(camera_af_trigger_t afTrigger)
+{
+    uint8_t trigger = afTrigger;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_AF_TRIGGER, &trigger, 1);
+}
+
+int Parameters::getAfTrigger(camera_af_trigger_t& afTrigger) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AF_TRIGGER);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    afTrigger = (camera_af_trigger_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setAfRegions(camera_window_list_t afRegions)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return setRegions(ParameterHelper::getMetadata(mData), afRegions, CAMERA_AF_REGIONS);
+}
+
+int Parameters::getAfRegions(camera_window_list_t& afRegions) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    return getRegions(ParameterHelper::getMetadataEntry(mData, CAMERA_AF_REGIONS), afRegions);
+}
+
+int Parameters::setAfState(camera_af_state_t afState)
+{
+    uint8_t state = afState;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_AF_STATE, &state, 1);
+}
+
+int Parameters::getAfState(camera_af_state_t& afState) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AF_STATE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    afState = (camera_af_state_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setLensState(bool lensMoving)
+{
+    uint8_t state = (lensMoving) ? 1 : 0;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_LENS_STATE, &state, 1);
+}
+
+int Parameters::getLensState(bool& lensMoving) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_STATE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    lensMoving = (entry.data.u8[0] > 0);
+    return OK;
+}
+
+int Parameters::getSensorMountType(camera_mount_type_t& sensorMountType) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_INFO_SENSOR_MOUNT_TYPE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+
+    sensorMountType = (camera_mount_type_t)entry.data.u8[0];
+    return OK;
+}
+
+// User can set envrionment and then call api to update the debug level.
+int Parameters::updateDebugLevel()
+{
+    Log::setDebugLevel();
+    CameraDump::setDumpLevel();
+    return OK;
+}
+
+int Parameters::setTestPatternMode(camera_test_pattern_mode_t mode)
+{
+    int32_t testPatterMode = mode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_SENSOR_TEST_PATTERN_MODE, &testPatterMode, 1);
+}
+
+int Parameters::getTestPatternMode(camera_test_pattern_mode_t& mode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SENSOR_TEST_PATTERN_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    mode = (camera_test_pattern_mode_t)entry.data.i32[0];
+    return OK;
+}
+
+int Parameters::setCropRegion(camera_crop_region_t cropRegion)
+{
+    int values[] = {cropRegion.flag, cropRegion.x, cropRegion.y};
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_SCALER_CROP_REGION, values, ARRAY_SIZE(values));
+}
+
+int Parameters::getCropRegion(camera_crop_region_t& cropRegion) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SCALER_CROP_REGION);
+    if (entry.count <= 0) {
+        return NAME_NOT_FOUND;
+    }
+    cropRegion.flag = entry.data.i32[0];
+    cropRegion.x = entry.data.i32[1];
+    cropRegion.y = entry.data.i32[2];
+    return OK;
+}
+
+int Parameters::setControlSceneMode(uint8_t sceneModeValue)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_CONTROL_SCENE_MODE, &sceneModeValue, 1);
+}
+
+int Parameters::setFaceDetectMode(uint8_t faceDetectMode)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_STATISTICS_FACE_DETECT_MODE, &faceDetectMode, 1);
+}
+
+int Parameters::getFaceDetectMode(uint8_t& faceDetectMode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_STATISTICS_FACE_DETECT_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    faceDetectMode = entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setFaceIds(int *faceIds, int faceNum)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_STATISTICS_FACE_IDS, faceIds, faceNum);
+}
+
+int Parameters::getSensorActiveArraySize(camera_coordinate_system_t& arraySize) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SENSOR_INFO_ACTIVE_ARRAY_SIZE);
+    if (entry.count <= 0) {
+        return NAME_NOT_FOUND;
+    }
+    arraySize.left = entry.data.i32[0];
+    arraySize.top = entry.data.i32[1];
+    arraySize.right = arraySize.left + entry.data.i32[2]; //width
+    arraySize.bottom = arraySize.top + entry.data.i32[3]; //height
+    return OK;
+}
+
+int Parameters::setShadingMode(camera_shading_mode_t shadingMode)
+{
+    uint8_t mode = shadingMode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_SHADING_MODE, &mode, 1);
+}
+
+int Parameters::getShadingMode(camera_shading_mode_t& shadingMode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SHADING_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    shadingMode = (camera_shading_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setLensShadingMapMode(camera_lens_shading_map_mode_type_t lensShadingMapMode)
+{
+    uint8_t mode = lensShadingMapMode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_STATISTICS_LENS_SHADING_MAP_MODE,
+                                                      &mode, 1);
+}
+
+int Parameters::getLensShadingMapMode(
+                                  camera_lens_shading_map_mode_type_t &lensShadingMapMode) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_STATISTICS_LENS_SHADING_MAP_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    lensShadingMapMode = (camera_lens_shading_map_mode_type_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setLensShadingMap(const float *lensShadingMap, size_t lensShadingMapSize)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_STATISTICS_LENS_SHADING_MAP,
+                                                      lensShadingMap, lensShadingMapSize);
+}
+
+int Parameters::getLensShadingMap(float *lensShadingMap, size_t &lensShadingMapSize) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_STATISTICS_LENS_SHADING_MAP);
+
+    camera_coordinate_t shadingMapSize;
+    getLensInfoShadingMapSize(shadingMapSize);
+    const size_t lsmSize = shadingMapSize.x * shadingMapSize.y * 4;
+    if (entry.count < lsmSize) {
+        return NAME_NOT_FOUND;
+    }
+
+    for (size_t i = 0; i < lsmSize; i++) {
+        lensShadingMap[i] = entry.data.f[i];
+    }
+
+    lensShadingMapSize = lsmSize;
+    return OK;
+}
+
+int Parameters::getLensInfoShadingMapSize(camera_coordinate_t &shadingMapSize) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_INFO_SHADING_MAP_SIZE);
+    if (entry.count <= 0) {
+        return NAME_NOT_FOUND;
+    }
+
+    shadingMapSize.x = entry.data.i32[0];  // width
+    shadingMapSize.y = entry.data.i32[1];  // height
+    return OK;
+}
+
+int Parameters::setTonemapMode(camera_tonemap_mode_t mode) {
+    uint8_t tMode = mode;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_TONEMAP_MODE, &tMode, 1);
+}
+
+int Parameters::getTonemapMode(camera_tonemap_mode_t& mode) const {
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_MODE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    mode = (camera_tonemap_mode_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::getSupportedTonemapMode(vector<camera_tonemap_mode_t>& tonemapModes) const {
+    ParameterHelper::AutoRLock rl(mData);
+
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_AVAILABLE_TONE_MAP_MODES);
+    for (size_t i = 0; i < entry.count; i++) {
+        tonemapModes.push_back((camera_tonemap_mode_t)entry.data.u8[i]);
+    }
+    return OK;
+}
+
+int Parameters::setTonemapPresetCurve(camera_tonemap_preset_curve_t type) {
+    uint8_t cType = type;
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_TONEMAP_PRESET_CURVE, &cType, 1);
+}
+
+int Parameters::getTonemapPresetCurve(camera_tonemap_preset_curve_t& type) const {
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_PRESET_CURVE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    type = (camera_tonemap_preset_curve_t)entry.data.u8[0];
+    return OK;
+}
+
+int Parameters::setTonemapGamma(float gamma) {
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_TONEMAP_GAMMA, &gamma, 1);
+}
+
+int Parameters::getTonemapGamma(float& gamma) const {
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_GAMMA);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    gamma = entry.data.f[0];
+    return OK;
+}
+
+int Parameters::getTonemapMaxCurvePoints(int32_t& number) const {
+    ParameterHelper::AutoRLock rl(mData);
+
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_MAX_CURVE_POINTS);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    number = entry.data.i32[0];
+    return OK;
+}
+
+int Parameters::setTonemapCurves(const camera_tonemap_curves_t& curves) {
+    ParameterHelper::AutoWLock wl(mData);
+    int ret = ParameterHelper::getMetadata(mData).update(CAMERA_TONEMAP_CURVE_RED,
+                                                         curves.rCurve, curves.rSize);
+    ret |= ParameterHelper::getMetadata(mData).update(CAMERA_TONEMAP_CURVE_BLUE,
+                                                      curves.bCurve, curves.bSize);
+    ret |= ParameterHelper::getMetadata(mData).update(CAMERA_TONEMAP_CURVE_GREEN,
+                                                      curves.gCurve, curves.gSize);
+    return ret;
+}
+
+int Parameters::getTonemapCurves(camera_tonemap_curves_t& curves) const {
+    curves.rSize = 0;
+    curves.bSize = 0;
+    curves.gSize = 0;
+
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_CURVE_RED);
+    if (entry.count > 0) {
+        curves.rSize = entry.count;
+        curves.rCurve = entry.data.f;
+    }
+    entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_CURVE_BLUE);
+    if (entry.count > 0) {
+        curves.bSize = entry.count;
+        curves.bCurve = entry.data.f;
+    }
+    entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_CURVE_GREEN);
+    if (entry.count > 0) {
+        curves.gSize = entry.count;
+        curves.gCurve = entry.data.f;
+    }
+    return (curves.rSize && curves.bSize && curves.gSize) ? OK : NAME_NOT_FOUND;
+}
+
+} // end of namespace icamera
diff --git a/camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.cpp b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.cpp
new file mode 100644
index 000000000000..52ffd86ded71
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.cpp
@@ -0,0 +1,976 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2015-2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "camera_metadata"
+
+#include <inttypes.h>
+#include "icamera_metadata_base.h"
+#include "iutils/Utils.h"
+#include <assert.h>
+#include <stdlib.h>
+#include <errno.h>
+
+// TODO need to find out the correct print function
+#include <stdio.h>
+#define ALOGE printf
+
+#define OK         0
+#define ERROR      1
+#define NOT_FOUND (-ENOENT)
+
+/**
+ * A single metadata entry, storing an array of values of a given type. If the
+ * array is no larger than 4 bytes in size, it is stored in the data.value[]
+ * array; otherwise, it can found in the parent's data array at index
+ * data.offset.
+ */
+#define ENTRY_ALIGNMENT ((size_t) 4)
+typedef struct camera_metadata_buffer_entry {
+    uint32_t tag;
+    uint32_t count;
+    union {
+        uint32_t offset;
+        uint8_t  value[4];
+    } data;
+    uint8_t  type;
+    uint8_t  reserved[3];
+} camera_metadata_buffer_entry_t;
+
+typedef uint32_t metadata_uptrdiff_t;
+typedef uint32_t metadata_size_t;
+
+/**
+ * A packet of metadata. This is a list of entries, each of which may point to
+ * its values stored at an offset in data.
+ *
+ * It is assumed by the utility functions that the memory layout of the packet
+ * is as follows:
+ *
+ *   |-----------------------------------------------|
+ *   | icamera_metadata_t                             |
+ *   |                                               |
+ *   |-----------------------------------------------|
+ *   | reserved for future expansion                 |
+ *   |-----------------------------------------------|
+ *   | camera_metadata_buffer_entry_t #0             |
+ *   |-----------------------------------------------|
+ *   | ....                                          |
+ *   |-----------------------------------------------|
+ *   | camera_metadata_buffer_entry_t #entry_count-1 |
+ *   |-----------------------------------------------|
+ *   | free space for                                |
+ *   | (entry_capacity-entry_count) entries          |
+ *   |-----------------------------------------------|
+ *   | start of camera_metadata.data                 |
+ *   |                                               |
+ *   |-----------------------------------------------|
+ *   | free space for                                |
+ *   | (data_capacity-data_count) bytes              |
+ *   |-----------------------------------------------|
+ *
+ * With the total length of the whole packet being camera_metadata.size bytes.
+ *
+ * In short, the entries and data are contiguous in memory after the metadata
+ * header.
+ */
+#define METADATA_ALIGNMENT ((size_t) 4)
+struct icamera_metadata {
+    metadata_size_t          size;
+    uint32_t                 version;
+    uint32_t                 flags;
+    metadata_size_t          entry_count;
+    metadata_size_t          entry_capacity;
+    metadata_uptrdiff_t      entries_start; // Offset from camera_metadata
+    metadata_size_t          data_count;
+    metadata_size_t          data_capacity;
+    metadata_uptrdiff_t      data_start; // Offset from camera_metadata
+    uint8_t                  reserved[];
+};
+
+/**
+ * A datum of metadata. This corresponds to icamera_metadata_entry_t::data
+ * with the difference that each element is not a pointer. We need to have a
+ * non-pointer type description in order to figure out the largest alignment
+ * requirement for data (DATA_ALIGNMENT).
+ */
+#define DATA_ALIGNMENT ((size_t) 8)
+typedef union camera_metadata_data {
+    uint8_t u8;
+    int32_t i32;
+    float   f;
+    int64_t i64;
+    double  d;
+    icamera_metadata_rational_t r;
+} camera_metadata_data_t;
+
+/**
+ * The preferred alignment of a packet of camera metadata. In general,
+ * this is the lowest common multiple of the constituents of a metadata
+ * package, i.e, of DATA_ALIGNMENT and ENTRY_ALIGNMENT.
+ */
+#define MAX_ALIGNMENT(A, B) (((A) > (B)) ? (A) : (B))
+#define METADATA_PACKET_ALIGNMENT \
+    MAX_ALIGNMENT(MAX_ALIGNMENT(DATA_ALIGNMENT, METADATA_ALIGNMENT), ENTRY_ALIGNMENT);
+
+/** Versioning information */
+#define CURRENT_METADATA_VERSION 1
+
+/** Flag definitions */
+#define FLAG_SORTED 0x00000001
+
+/** Tag information */
+
+typedef struct tag_info {
+    const char *tag_name;
+    uint8_t     tag_type;
+} tag_info_t;
+
+#include "icamera_metadata_tag_info.c"
+
+const size_t icamera_metadata_type_size[ICAMERA_NUM_TYPES] = {
+    sizeof(uint8_t),                    // ICAMERA_TYPE_BYTE
+    sizeof(int32_t),                    // ICAMERA_TYPE_INT32
+    sizeof(float),                      // ICAMERA_TYPE_FLOAT
+    sizeof(int64_t),                    // ICAMERA_TYPE_INT64
+    sizeof(double),                     // ICAMERA_TYPE_DOUBLE
+    sizeof(icamera_metadata_rational_t) // ICAMERA_TYPE_RATIONAL
+};
+
+const char *icamera_metadata_type_names[ICAMERA_NUM_TYPES] = {
+    "byte",                             // ICAMERA_TYPE_BYTE
+    "int32",                            // ICAMERA_TYPE_INT32
+    "float",                            // ICAMERA_TYPE_FLOAT
+    "int64",                            // ICAMERA_TYPE_INT64
+    "double",                           // ICAMERA_TYPE_DOUBLE
+    "rational"                          // ICAMERA_TYPE_RATIONAL
+};
+
+static camera_metadata_buffer_entry_t *get_entries(
+        const icamera_metadata_t *metadata) {
+    return (camera_metadata_buffer_entry_t*)
+            ((uint8_t*)metadata + metadata->entries_start);
+}
+
+static uint8_t *get_data(const icamera_metadata_t *metadata) {
+    return (uint8_t*)metadata + metadata->data_start;
+}
+
+size_t get_icamera_metadata_alignment() {
+    return METADATA_PACKET_ALIGNMENT;
+}
+
+icamera_metadata_t *allocate_copy_icamera_metadata_checked(
+        const icamera_metadata_t *src,
+        size_t src_size) {
+
+    if (src == NULL) {
+        return NULL;
+    }
+
+    void *buffer = malloc(src_size);
+    MEMCPY_S(buffer, src_size, src, src_size);
+
+    icamera_metadata_t *metadata = (icamera_metadata_t*) buffer;
+    if (validate_icamera_metadata_structure(metadata, &src_size) != OK) {
+        free(buffer);
+        return NULL;
+    }
+
+    return metadata;
+}
+
+icamera_metadata_t *allocate_icamera_metadata(size_t entry_capacity,
+                                              size_t data_capacity) {
+
+    size_t memory_needed = calculate_icamera_metadata_size(entry_capacity,
+                                                          data_capacity);
+    void *buffer = malloc(memory_needed);
+    return place_icamera_metadata(buffer, memory_needed,
+                                 entry_capacity,
+                                 data_capacity);
+}
+
+icamera_metadata_t *place_icamera_metadata(void *dst,
+                                           size_t dst_size,
+                                           size_t entry_capacity,
+                                           size_t data_capacity) {
+    if (dst == NULL) return NULL;
+
+    size_t memory_needed = calculate_icamera_metadata_size(entry_capacity,
+                                                          data_capacity);
+    if (memory_needed > dst_size) return NULL;
+
+    icamera_metadata_t *metadata = (icamera_metadata_t*)dst;
+    metadata->version = CURRENT_METADATA_VERSION;
+    metadata->flags = 0;
+    metadata->entry_count = 0;
+    metadata->entry_capacity = entry_capacity;
+    metadata->entries_start =
+            ALIGN_TO(sizeof(icamera_metadata_t), ENTRY_ALIGNMENT);
+    metadata->data_count = 0;
+    metadata->data_capacity = data_capacity;
+    metadata->size = memory_needed;
+    size_t data_unaligned = (uint8_t*)(get_entries(metadata) +
+            metadata->entry_capacity) - (uint8_t*)metadata;
+    metadata->data_start = ALIGN_TO(data_unaligned, DATA_ALIGNMENT);
+
+    assert(validate_icamera_metadata_structure(metadata, NULL) == OK);
+    return metadata;
+}
+void free_icamera_metadata(icamera_metadata_t *metadata) {
+    free(metadata);
+}
+
+size_t calculate_icamera_metadata_size(size_t entry_count,
+                                       size_t data_count) {
+    size_t memory_needed = sizeof(icamera_metadata_t);
+    // Start entry list at aligned boundary
+    memory_needed = ALIGN_TO(memory_needed, ENTRY_ALIGNMENT);
+    memory_needed += sizeof(camera_metadata_buffer_entry_t[entry_count]);
+    // Start buffer list at aligned boundary
+    memory_needed = ALIGN_TO(memory_needed, DATA_ALIGNMENT);
+    memory_needed += sizeof(uint8_t[data_count]);
+    return memory_needed;
+}
+
+size_t get_icamera_metadata_size(const icamera_metadata_t *metadata) {
+    if (metadata == NULL) return ERROR;
+
+    return metadata->size;
+}
+
+size_t get_icamera_metadata_compact_size(const icamera_metadata_t *metadata) {
+    if (metadata == NULL) return ERROR;
+
+    return calculate_icamera_metadata_size(metadata->entry_count,
+                                          metadata->data_count);
+}
+
+size_t get_icamera_metadata_entry_count(const icamera_metadata_t *metadata) {
+    return metadata->entry_count;
+}
+
+size_t get_icamera_metadata_entry_capacity(const icamera_metadata_t *metadata) {
+    return metadata->entry_capacity;
+}
+
+size_t get_icamera_metadata_data_count(const icamera_metadata_t *metadata) {
+    return metadata->data_count;
+}
+
+size_t get_icamera_metadata_data_capacity(const icamera_metadata_t *metadata) {
+    return metadata->data_capacity;
+}
+
+icamera_metadata_t* copy_icamera_metadata(void *dst, size_t dst_size,
+        const icamera_metadata_t *src) {
+    size_t memory_needed = get_icamera_metadata_compact_size(src);
+
+    if (dst == NULL) return NULL;
+    if (dst_size < memory_needed) return NULL;
+
+    icamera_metadata_t *metadata =
+        place_icamera_metadata(dst, dst_size, src->entry_count, src->data_count);
+
+    if (metadata == NULL) {
+        ALOGE("%s: metadata is null!", __func__);
+        return NULL;
+    }
+    metadata->flags = src->flags;
+    metadata->entry_count = src->entry_count;
+    metadata->data_count = src->data_count;
+
+    MEMCPY_S(get_entries(metadata),sizeof(camera_metadata_buffer_entry_t[metadata->entry_count]),
+             get_entries(src), sizeof(camera_metadata_buffer_entry_t[metadata->entry_count]));
+    MEMCPY_S(get_data(metadata), sizeof(uint8_t[metadata->data_count]),
+             get_data(src), sizeof(uint8_t[metadata->data_count]));
+
+    assert(validate_icamera_metadata_structure(metadata, NULL) == OK);
+    return metadata;
+}
+
+int validate_icamera_metadata_structure(const icamera_metadata_t *metadata,
+                                        const size_t *expected_size) {
+
+    if (metadata == NULL) {
+        ALOGE("%s: metadata is null!", __func__);
+        return ERROR;
+    }
+
+    // Check that the metadata pointer is well-aligned first.
+    {
+        static const struct {
+            const char *name;
+            size_t alignment;
+        } alignments[] = {
+            {
+                .name = "icamera_metadata",
+                .alignment = METADATA_ALIGNMENT
+            },
+            {
+                .name = "camera_metadata_buffer_entry",
+                .alignment = ENTRY_ALIGNMENT
+            },
+            {
+                .name = "camera_metadata_data",
+                .alignment = DATA_ALIGNMENT
+            },
+        };
+
+        size_t i = 0;
+        for (i = 0; i < sizeof(alignments)/sizeof(alignments[0]); ++i) {
+            uintptr_t aligned_ptr = ALIGN_TO(metadata, alignments[i].alignment);
+
+            if ((uintptr_t)metadata != aligned_ptr) {
+                ALOGE("%s: Metadata pointer is not aligned (actual %p, "
+                      "expected %p) to type %s",
+                      __func__, metadata,
+                      (void*)aligned_ptr, alignments[i].name);
+                return ERROR;
+            }
+        }
+    }
+
+    /**
+     * Check that the metadata contents are correct
+     */
+
+    if (expected_size != NULL && metadata->size > *expected_size) {
+        ALOGE("%s: Metadata size (%" PRIu32 ") should be <= expected size (%zu)",
+              __func__, metadata->size, *expected_size);
+        return ERROR;
+    }
+
+    if (metadata->entry_count > metadata->entry_capacity) {
+        ALOGE("%s: Entry count (%" PRIu32 ") should be <= entry capacity "
+              "(%" PRIu32 ")",
+              __func__, metadata->entry_count, metadata->entry_capacity);
+        return ERROR;
+    }
+
+    const metadata_uptrdiff_t entries_end =
+        metadata->entries_start + metadata->entry_capacity;
+    if (entries_end < metadata->entries_start || // overflow check
+        entries_end > metadata->data_start) {
+
+        ALOGE("%s: Entry start + capacity (%" PRIu32 ") should be <= data start "
+              "(%" PRIu32 ")",
+               __func__,
+              (metadata->entries_start + metadata->entry_capacity),
+              metadata->data_start);
+        return ERROR;
+    }
+
+    const metadata_uptrdiff_t data_end =
+        metadata->data_start + metadata->data_capacity;
+    if (data_end < metadata->data_start || // overflow check
+        data_end > metadata->size) {
+
+        ALOGE("%s: Data start + capacity (%" PRIu32 ") should be <= total size "
+              "(%" PRIu32 ")",
+               __func__,
+              (metadata->data_start + metadata->data_capacity),
+              metadata->size);
+        return ERROR;
+    }
+
+    // Validate each entry
+    const metadata_size_t entry_count = metadata->entry_count;
+    camera_metadata_buffer_entry_t *entries = get_entries(metadata);
+
+    size_t i = 0;
+    for (i = 0; i < entry_count; ++i) {
+
+        if ((uintptr_t)&entries[i] != ALIGN_TO(&entries[i], ENTRY_ALIGNMENT)) {
+            ALOGE("%s: Entry index %zu had bad alignment (address %p),"
+                  " expected alignment %zu",
+                  __func__, i, &entries[i], ENTRY_ALIGNMENT);
+            return ERROR;
+        }
+
+        camera_metadata_buffer_entry_t entry = entries[i];
+
+        if (entry.type >= ICAMERA_NUM_TYPES) {
+            ALOGE("%s: Entry index %zu had a bad type %d",
+                  __func__, i, entry.type);
+            return ERROR;
+        }
+
+        int tag_type = get_icamera_metadata_tag_type(entry.tag);
+        if (tag_type != (int)entry.type) {
+            ALOGE("%s: Entry index %zu had tag type %d, but the type was %d",
+                  __func__, i, tag_type, entry.type);
+            return ERROR;
+        }
+
+        size_t data_size =
+                calculate_icamera_metadata_entry_data_size(entry.type,
+                                                          entry.count);
+
+        if (data_size != 0) {
+            camera_metadata_data_t *data =
+                    (camera_metadata_data_t*) (get_data(metadata) +
+                                               entry.data.offset);
+
+            if ((uintptr_t)data != ALIGN_TO(data, DATA_ALIGNMENT)) {
+                ALOGE("%s: Entry index %zu had bad data alignment (address %p),"
+                      " expected align %zu, (tag name %s, data size %zu)",
+                      __func__, i, data, DATA_ALIGNMENT,
+                      get_icamera_metadata_tag_name(entry.tag) ?: "unknown",
+                      data_size);
+                return ERROR;
+            }
+
+            size_t data_entry_end = entry.data.offset + data_size;
+            if (data_entry_end < entry.data.offset || // overflow check
+                data_entry_end > metadata->data_capacity) {
+
+                ALOGE("%s: Entry index %zu data ends (%zu) beyond the capacity "
+                      "%" PRIu32, __func__, i, data_entry_end,
+                      metadata->data_capacity);
+                return ERROR;
+            }
+
+        } else if (entry.count == 0) {
+            if (entry.data.offset != 0) {
+                ALOGE("%s: Entry index %zu had 0 items, but offset was non-0 "
+                     "(%" PRIu32 "), tag name: %s", __func__, i, entry.data.offset,
+                        get_icamera_metadata_tag_name(entry.tag) ?: "unknown");
+                return ERROR;
+            }
+        } // else data stored inline, so we look at value which can be anything.
+    }
+
+    return OK;
+}
+
+int append_icamera_metadata(icamera_metadata_t *dst,
+        const icamera_metadata_t *src) {
+    if (dst == NULL || src == NULL ) return ERROR;
+
+    if (dst->entry_capacity < src->entry_count + dst->entry_count) return ERROR;
+    if (dst->data_capacity < src->data_count + dst->data_count) return ERROR;
+
+    if (dst->entry_capacity - dst->entry_count < src->entry_count) {
+        ALOGE("%s: Dst available buffer size for entry is smaller than src needed.", __func__);
+    }
+    MEMCPY_S(get_entries(dst) + dst->entry_count,
+             sizeof(camera_metadata_buffer_entry_t) * (dst->entry_capacity - dst->entry_count),
+             get_entries(src), sizeof(camera_metadata_buffer_entry_t[src->entry_count]));
+
+    if (dst->data_capacity - dst->data_count < src->data_count) {
+        ALOGE("%s: Dst available buffer size for data is smaller than src needed.", __func__);
+    }
+    MEMCPY_S(get_data(dst) + dst->data_count, sizeof(uint8_t[dst->data_capacity - dst->data_count]),
+             get_data(src), sizeof(uint8_t[src->data_count]));
+    if (dst->data_count != 0) {
+        camera_metadata_buffer_entry_t *entry = get_entries(dst) + dst->entry_count;
+        size_t i = 0;
+        for (i = 0; i < src->entry_count; i++, entry++) {
+            if ( calculate_icamera_metadata_entry_data_size(entry->type,
+                            entry->count) > 0 ) {
+                entry->data.offset += dst->data_count;
+            }
+        }
+    }
+    if (dst->entry_count == 0) {
+        // Appending onto empty buffer, keep sorted state
+        dst->flags |= src->flags & FLAG_SORTED;
+    } else if (src->entry_count != 0) {
+        // Both src, dst are nonempty, cannot assume sort remains
+        dst->flags &= ~FLAG_SORTED;
+    } else {
+        // Src is empty, keep dst sorted state
+    }
+    dst->entry_count += src->entry_count;
+    dst->data_count += src->data_count;
+
+    assert(validate_icamera_metadata_structure(dst, NULL) == OK);
+    return OK;
+}
+
+icamera_metadata_t *clone_icamera_metadata(const icamera_metadata_t *src) {
+    if (src == NULL) return NULL;
+    icamera_metadata_t *clone = allocate_icamera_metadata(
+        get_icamera_metadata_entry_count(src),
+        get_icamera_metadata_data_count(src));
+    if (clone != NULL) {
+        int res = append_icamera_metadata(clone, src);
+        if (res != OK) {
+            free_icamera_metadata(clone);
+            clone = NULL;
+        }
+    }
+    assert(validate_icamera_metadata_structure(clone, NULL) == OK);
+    return clone;
+}
+
+size_t calculate_icamera_metadata_entry_data_size(uint8_t type,
+        size_t data_count) {
+    if (type >= ICAMERA_NUM_TYPES) return 0;
+    size_t data_bytes = data_count *
+            icamera_metadata_type_size[type];
+    return data_bytes <= 4 ? 0 : ALIGN_TO(data_bytes, DATA_ALIGNMENT);
+}
+
+static int add_camera_metadata_entry_raw(icamera_metadata_t *dst,
+        uint32_t tag,
+        uint8_t  type,
+        const void *data,
+        size_t data_count) {
+
+    if (dst == NULL) return ERROR;
+    if (dst->entry_count == dst->entry_capacity) return ERROR;
+    if (data == NULL) return ERROR;
+
+    size_t data_bytes =
+            calculate_icamera_metadata_entry_data_size(type, data_count);
+    if (data_bytes + dst->data_count > dst->data_capacity) return ERROR;
+
+    if (type >= ICAMERA_NUM_TYPES) {
+        ALOGE("%s: Bad type %d", __func__, type);
+        return ERROR;
+    }
+    size_t data_payload_bytes =
+            data_count * icamera_metadata_type_size[type];
+    camera_metadata_buffer_entry_t *entry = get_entries(dst) + dst->entry_count;
+    memset(entry, 0, sizeof(camera_metadata_buffer_entry_t));
+    entry->tag = tag;
+    entry->type = type;
+    entry->count = data_count;
+
+    if (data_bytes == 0) {
+        MEMCPY_S(entry->data.value, data_payload_bytes, data, data_payload_bytes);
+    } else {
+        entry->data.offset = dst->data_count;
+        MEMCPY_S(get_data(dst) + entry->data.offset, data_payload_bytes, data, data_payload_bytes);
+        dst->data_count += data_bytes;
+    }
+    dst->entry_count++;
+    dst->flags &= ~FLAG_SORTED;
+    assert(validate_icamera_metadata_structure(dst, NULL) == OK);
+    return OK;
+}
+
+int add_icamera_metadata_entry(icamera_metadata_t *dst,
+        uint32_t tag,
+        const void *data,
+        size_t data_count) {
+
+    int type = get_icamera_metadata_tag_type(tag);
+    if (type == -1) {
+        ALOGE("%s: Unknown tag %04x.", __func__, tag);
+        return ERROR;
+    }
+
+    return add_camera_metadata_entry_raw(dst,
+            tag,
+            type,
+            data,
+            data_count);
+}
+
+static int compare_entry_tags(const void *p1, const void *p2) {
+    uint32_t tag1 = ((camera_metadata_buffer_entry_t*)p1)->tag;
+    uint32_t tag2 = ((camera_metadata_buffer_entry_t*)p2)->tag;
+    return  tag1 < tag2 ? -1 :
+            tag1 == tag2 ? 0 :
+            1;
+}
+
+int sort_icamera_metadata(icamera_metadata_t *dst) {
+    if (dst == NULL) return ERROR;
+    if (dst->flags & FLAG_SORTED) return OK;
+
+    qsort(get_entries(dst), dst->entry_count,
+            sizeof(camera_metadata_buffer_entry_t),
+            compare_entry_tags);
+    dst->flags |= FLAG_SORTED;
+
+    assert(validate_icamera_metadata_structure(dst, NULL) == OK);
+    return OK;
+}
+
+int get_icamera_metadata_entry(icamera_metadata_t *src,
+        size_t index,
+        icamera_metadata_entry_t *entry) {
+    if (src == NULL || entry == NULL) return ERROR;
+    if (index >= src->entry_count) return ERROR;
+
+    camera_metadata_buffer_entry_t *buffer_entry = get_entries(src) + index;
+
+    entry->index = index;
+    entry->tag = buffer_entry->tag;
+    entry->type = buffer_entry->type;
+    entry->count = buffer_entry->count;
+    if (buffer_entry->count *
+            icamera_metadata_type_size[buffer_entry->type] > 4) {
+        entry->data.u8 = get_data(src) + buffer_entry->data.offset;
+    } else {
+        entry->data.u8 = buffer_entry->data.value;
+    }
+    return OK;
+}
+
+int get_icamera_metadata_ro_entry(const icamera_metadata_t *src,
+        size_t index,
+        icamera_metadata_ro_entry_t *entry) {
+    return get_icamera_metadata_entry((icamera_metadata_t*)src, index,
+            (icamera_metadata_entry_t*)entry);
+}
+
+int find_icamera_metadata_entry(icamera_metadata_t *src,
+        uint32_t tag,
+        icamera_metadata_entry_t *entry) {
+    if (src == NULL) return ERROR;
+
+    uint32_t index;
+    if (src->flags & FLAG_SORTED) {
+        // Sorted entries, do a binary search
+        camera_metadata_buffer_entry_t *search_entry = NULL;
+        camera_metadata_buffer_entry_t key;
+        key.tag = tag;
+        search_entry = (camera_metadata_buffer_entry_t *)bsearch(&key,
+                get_entries(src),
+                src->entry_count,
+                sizeof(camera_metadata_buffer_entry_t),
+                compare_entry_tags);
+        if (search_entry == NULL) return NOT_FOUND;
+        index = search_entry - get_entries(src);
+    } else {
+        // Not sorted, linear search
+        camera_metadata_buffer_entry_t *search_entry = get_entries(src);
+        for (index = 0; index < src->entry_count; index++, search_entry++) {
+            if (search_entry->tag == tag) {
+                break;
+            }
+        }
+        if (index == src->entry_count) return NOT_FOUND;
+    }
+
+    return get_icamera_metadata_entry(src, index,
+            entry);
+}
+
+int find_icamera_metadata_ro_entry(const icamera_metadata_t *src,
+        uint32_t tag,
+        icamera_metadata_ro_entry_t *entry) {
+    return find_icamera_metadata_entry((icamera_metadata_t*)src, tag,
+            (icamera_metadata_entry_t*)entry);
+}
+
+int delete_icamera_metadata_entry(icamera_metadata_t *dst,
+        size_t index) {
+    if (dst == NULL) return ERROR;
+    if (index >= dst->entry_count) return ERROR;
+
+    camera_metadata_buffer_entry_t *entry = get_entries(dst) + index;
+    size_t data_bytes = calculate_icamera_metadata_entry_data_size(entry->type,
+            entry->count);
+
+    if (data_bytes > 0) {
+        // Shift data buffer to overwrite deleted data
+        uint8_t *start = get_data(dst) + entry->data.offset;
+        uint8_t *end = start + data_bytes;
+        size_t length = dst->data_count - entry->data.offset - data_bytes;
+        memmove(start, end, length);
+
+        // Update all entry indices to account for shift
+        camera_metadata_buffer_entry_t *e = get_entries(dst);
+        size_t i;
+        for (i = 0; i < dst->entry_count; i++) {
+            if (calculate_icamera_metadata_entry_data_size(
+                    e->type, e->count) > 0 &&
+                    e->data.offset > entry->data.offset) {
+                e->data.offset -= data_bytes;
+            }
+            ++e;
+        }
+        dst->data_count -= data_bytes;
+    }
+    // Shift entry array
+    memmove(entry, entry + 1,
+            sizeof(camera_metadata_buffer_entry_t) *
+            (dst->entry_count - index - 1) );
+    dst->entry_count -= 1;
+
+    assert(validate_icamera_metadata_structure(dst, NULL) == OK);
+    return OK;
+}
+
+int update_icamera_metadata_entry(icamera_metadata_t *dst,
+        size_t index,
+        const void *data,
+        size_t data_count,
+        icamera_metadata_entry_t *updated_entry) {
+    if (dst == NULL) return ERROR;
+    if (index >= dst->entry_count) return ERROR;
+
+    camera_metadata_buffer_entry_t *entry = get_entries(dst) + index;
+    if (entry->type >= ICAMERA_NUM_TYPES) return ERROR;
+
+    size_t data_bytes =
+            calculate_icamera_metadata_entry_data_size(entry->type,
+                    data_count);
+    size_t data_payload_bytes =
+            data_count * icamera_metadata_type_size[entry->type];
+
+    size_t entry_bytes =
+            calculate_icamera_metadata_entry_data_size(entry->type,
+                    entry->count);
+    if (data_bytes != entry_bytes) {
+        // May need to shift/add to data array
+        if (dst->data_capacity < dst->data_count + data_bytes - entry_bytes) {
+            // No room
+            return ERROR;
+        }
+        if (entry_bytes != 0) {
+            // Remove old data
+            uint8_t *start = get_data(dst) + entry->data.offset;
+            uint8_t *end = start + entry_bytes;
+            size_t length = dst->data_count - entry->data.offset - entry_bytes;
+            memmove(start, end, length);
+            dst->data_count -= entry_bytes;
+
+            // Update all entry indices to account for shift
+            camera_metadata_buffer_entry_t *e = get_entries(dst);
+            size_t i;
+            for (i = 0; i < dst->entry_count; i++) {
+                if (calculate_icamera_metadata_entry_data_size(
+                        e->type, e->count) > 0 &&
+                        e->data.offset > entry->data.offset) {
+                    e->data.offset -= entry_bytes;
+                }
+                ++e;
+            }
+        }
+
+        if (data_bytes != 0) {
+            // Append new data
+            entry->data.offset = dst->data_count;
+
+            MEMCPY_S(get_data(dst) + entry->data.offset, data_payload_bytes, data, data_payload_bytes);
+            dst->data_count += data_bytes;
+        }
+    } else if (data_bytes != 0) {
+        // data size unchanged, reuse same data location
+        MEMCPY_S(get_data(dst) + entry->data.offset, data_payload_bytes, data, data_payload_bytes);
+    }
+
+    if (data_bytes == 0) {
+        // Data fits into entry
+        MEMCPY_S(entry->data.value, data_payload_bytes, data, data_payload_bytes);
+    }
+
+    entry->count = data_count;
+
+    if (updated_entry != NULL) {
+        get_icamera_metadata_entry(dst,
+                index,
+                updated_entry);
+    }
+
+    assert(validate_icamera_metadata_structure(dst, NULL) == OK);
+    return OK;
+}
+
+const char *get_icamera_metadata_section_name(uint32_t tag) {
+    uint32_t tag_section = tag >> 16;
+    if (tag_section >= CAMERA_SECTION_COUNT) {
+        return NULL;
+    }
+    return icamera_metadata_section_names[tag_section];
+}
+
+const char *get_icamera_metadata_tag_name(uint32_t tag) {
+    uint32_t tag_section = tag >> 16;
+    if (tag_section >= CAMERA_SECTION_COUNT ||
+        tag >= icamera_metadata_section_bounds[tag_section][1] ) {
+        return NULL;
+    }
+    uint32_t tag_index = tag & 0xFFFF;
+    return icamera_tag_info[tag_section][tag_index].tag_name;
+}
+
+int get_icamera_metadata_tag_type(uint32_t tag) {
+    uint32_t tag_section = tag >> 16;
+    if (tag_section >= CAMERA_SECTION_COUNT ||
+            tag >= icamera_metadata_section_bounds[tag_section][1] ) {
+        return -1;
+    }
+    uint32_t tag_index = tag & 0xFFFF;
+    return icamera_tag_info[tag_section][tag_index].tag_type;
+}
+
+static void print_data(int fd, const uint8_t *data_ptr, uint32_t tag, int type,
+        int count,
+        int indentation);
+
+void dump_icamera_metadata(const icamera_metadata_t *metadata,
+        int fd,
+        int verbosity) {
+    dump_indented_icamera_metadata(metadata, fd, verbosity, 0);
+}
+
+void dump_indented_icamera_metadata(const icamera_metadata_t *metadata,
+        int fd,
+        int verbosity,
+        int indentation) {
+    if (metadata == NULL) {
+        dprintf(fd, "%*sDumping camera metadata array: Not allocated\n",
+                indentation, "");
+        return;
+    }
+    unsigned int i;
+    dprintf(fd,
+            "%*sDumping camera metadata array: %" PRIu32 " / %" PRIu32 " entries, "
+            "%" PRIu32 " / %" PRIu32 " bytes of extra data.\n", indentation, "",
+            metadata->entry_count, metadata->entry_capacity,
+            metadata->data_count, metadata->data_capacity);
+    dprintf(fd, "%*sVersion: %d, Flags: %08x\n",
+            indentation + 2, "",
+            metadata->version, metadata->flags);
+    camera_metadata_buffer_entry_t *entry = get_entries(metadata);
+    for (i=0; i < metadata->entry_count; i++, entry++) {
+
+        const char *tag_name, *tag_section;
+        tag_section = get_icamera_metadata_section_name(entry->tag);
+        if (tag_section == NULL) {
+            tag_section = "unknownSection";
+        }
+        tag_name = get_icamera_metadata_tag_name(entry->tag);
+        if (tag_name == NULL) {
+            tag_name = "unknownTag";
+        }
+        const char *type_name;
+        if (entry->type >= ICAMERA_NUM_TYPES) {
+            type_name = "unknown";
+        } else {
+            type_name = icamera_metadata_type_names[entry->type];
+        }
+        dprintf(fd, "%*s%s.%s (%05x): %s[%" PRIu32 "]\n",
+             indentation + 2, "",
+             tag_section,
+             tag_name,
+             entry->tag,
+             type_name,
+             entry->count);
+
+        if (verbosity < 1) continue;
+
+        if (entry->type >= ICAMERA_NUM_TYPES) continue;
+
+        size_t type_size = icamera_metadata_type_size[entry->type];
+        uint8_t *data_ptr;
+        if ( type_size * entry->count > 4 ) {
+            if (entry->data.offset >= metadata->data_count) {
+                ALOGE("%s: Malformed entry data offset: %" PRIu32 " (max %" PRIu32 ")",
+                        __func__,
+                        entry->data.offset,
+                        metadata->data_count);
+                continue;
+            }
+            data_ptr = get_data(metadata) + entry->data.offset;
+        } else {
+            data_ptr = entry->data.value;
+        }
+        int count = entry->count;
+        if (verbosity < 2 && count > 16) count = 16;
+
+        print_data(fd, data_ptr, entry->tag, entry->type, count, indentation);
+    }
+}
+
+static void print_data(int fd, const uint8_t *data_ptr, uint32_t tag,
+        int type, int count, int indentation) {
+    static int values_per_line[ICAMERA_NUM_TYPES] = {
+        16,                   // ICAMERA_TYPE_BYTE
+        4,                    // ICAMERA_TYPE_INT32
+        8,                    // ICAMERA_TYPE_FLOAT
+        2,                    // ICAMERA_TYPE_INT64
+        4,                    // ICAMERA_TYPE_DOUBLE
+        2,                    // ICAMERA_TYPE_RATIONAL
+    };
+    size_t type_size = icamera_metadata_type_size[type];
+    char value_string_tmp[ICAMERA_METADATA_ENUM_STRING_MAX_SIZE];
+    int32_t value;
+
+    int lines = count / values_per_line[type];
+    if (count % values_per_line[type] != 0) lines++;
+
+    int index = 0;
+    int j, k;
+    for (j = 0; j < lines; j++) {
+        dprintf(fd, "%*s[", indentation + 4, "");
+        for (k = 0;
+             k < values_per_line[type] && count > 0;
+             k++, count--, index += type_size) {
+
+            switch (type) {
+                case ICAMERA_TYPE_BYTE:
+                    value = *(data_ptr + index);
+                    if (icamera_metadata_enum_snprint(tag,
+                                                      value,
+                                                      value_string_tmp,
+                                                      sizeof(value_string_tmp))
+                        == OK) {
+                        dprintf(fd, "%s ", value_string_tmp);
+                    } else {
+                        dprintf(fd, "%hhu ",
+                                *(data_ptr + index));
+                    }
+                    break;
+                case ICAMERA_TYPE_INT32:
+                    value =
+                            *(int32_t*)(data_ptr + index);
+                    if (icamera_metadata_enum_snprint(tag,
+                                                      value,
+                                                      value_string_tmp,
+                                                      sizeof(value_string_tmp))
+                        == OK) {
+                        dprintf(fd, "%s ", value_string_tmp);
+                    } else {
+                        dprintf(fd, "%" PRId32 " ",
+                                *(int32_t*)(data_ptr + index));
+                    }
+                    break;
+                case ICAMERA_TYPE_FLOAT:
+                    dprintf(fd, "%0.8f ",
+                            *(float*)(data_ptr + index));
+                    break;
+                case ICAMERA_TYPE_INT64:
+                    dprintf(fd, "%" PRId64 " ",
+                            *(int64_t*)(data_ptr + index));
+                    break;
+                case ICAMERA_TYPE_DOUBLE:
+                    dprintf(fd, "%0.8f ",
+                            *(double*)(data_ptr + index));
+                    break;
+                case ICAMERA_TYPE_RATIONAL: {
+                    int32_t numerator = *(int32_t*)(data_ptr + index);
+                    int32_t denominator = *(int32_t*)(data_ptr + index + 4);
+                    dprintf(fd, "(%d / %d) ",
+                            numerator, denominator);
+                    break;
+                }
+                default:
+                    dprintf(fd, "??? ");
+            }
+        }
+        dprintf(fd, "]\n");
+    }
+}
diff --git a/camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.h b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.h
new file mode 100644
index 000000000000..77f02d0ae038
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.h
@@ -0,0 +1,445 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2015-2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <string.h>
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ALIGN_TO(val, alignment) \
+    (((uintptr_t)(val) + ((alignment) - 1)) & ~((alignment) - 1))
+
+/**
+ * Tag hierarchy and enum definitions for camera_metadata_entry
+ * =============================================================================
+ */
+
+/**
+ * Main enum definitions are in a separate file to make it easy to
+ * maintain
+ */
+#include "icamera_metadata_tags.h"
+
+/**
+ * Enum range for each top-level category
+ */
+
+extern unsigned int icamera_metadata_section_bounds[CAMERA_SECTION_COUNT][2];
+
+extern const char *icamera_metadata_section_names[CAMERA_SECTION_COUNT];
+
+/**
+ * Type definitions for camera_metadata_entry
+ * =============================================================================
+ */
+enum {
+    // Unsigned 8-bit integer (uint8_t)
+    ICAMERA_TYPE_BYTE = 0,
+    // Signed 32-bit integer (int32_t)
+    ICAMERA_TYPE_INT32 = 1,
+    // 32-bit float (float)
+    ICAMERA_TYPE_FLOAT = 2,
+    // Signed 64-bit integer (int64_t)
+    ICAMERA_TYPE_INT64 = 3,
+    // 64-bit float (double)
+    ICAMERA_TYPE_DOUBLE = 4,
+    // A 64-bit fraction (camera_metadata_rational_t)
+    ICAMERA_TYPE_RATIONAL = 5,
+    // Number of type fields
+    ICAMERA_NUM_TYPES
+};
+
+typedef struct icamera_metadata_rational {
+    int32_t numerator;
+    int32_t denominator;
+} icamera_metadata_rational_t;
+
+/**
+ * A reference to a metadata entry in a buffer.
+ *
+ * The data union pointers point to the real data in the buffer, and can be
+ * modified in-place if the count does not need to change. The count is the
+ * number of entries in data of the entry's type, not a count of bytes.
+ */
+typedef struct icamera_metadata_entry {
+    size_t   index;
+    uint32_t tag;
+    uint8_t  type;
+    size_t   count;
+    union {
+        uint8_t *u8;
+        int32_t *i32;
+        float   *f;
+        int64_t *i64;
+        double  *d;
+        icamera_metadata_rational_t *r;
+    } data;
+} icamera_metadata_entry_t;
+
+/**
+ * A read-only reference to a metadata entry in a buffer. Identical to
+ * camera_metadata_entry in layout
+ */
+typedef struct icamera_metadata_ro_entry {
+    size_t   index;
+    uint32_t tag;
+    uint8_t  type;
+    size_t   count;
+    union {
+        const uint8_t *u8;
+        const int32_t *i32;
+        const float   *f;
+        const int64_t *i64;
+        const double  *d;
+        const icamera_metadata_rational_t *r;
+    } data;
+} icamera_metadata_ro_entry_t;
+
+/**
+ * Size in bytes of each entry type
+ */
+extern const size_t icamera_metadata_type_size[ICAMERA_NUM_TYPES];
+
+/**
+ * Human-readable name of each entry type
+ */
+extern const char* icamera_metadata_type_names[ICAMERA_NUM_TYPES];
+
+/**
+ * Main definitions for the metadata entry and array structures
+ * =============================================================================
+ */
+
+/**
+ * A packet of metadata. This is a list of metadata entries, each of which has
+ * an integer tag to identify its meaning, 'type' and 'count' field, and the
+ * data, which contains a 'count' number of entries of type 'type'. The packet
+ * has a fixed capacity for entries and for extra data.  A new entry uses up one
+ * entry slot, and possibly some amount of data capacity; the function
+ * calculate_camera_metadata_entry_data_size() provides the amount of data
+ * capacity that would be used up by an entry.
+ *
+ * Entries are not sorted by default, and are not forced to be unique - multiple
+ * entries with the same tag are allowed. The packet will not dynamically resize
+ * when full.
+ *
+ * The packet is contiguous in memory, with size in bytes given by
+ * get_camera_metadata_size(). Therefore, it can be copied safely with memcpy()
+ * to a buffer of sufficient size. The copy_camera_metadata() function is
+ * intended for eliminating unused capacity in the destination packet.
+ */
+struct icamera_metadata;
+typedef struct icamera_metadata icamera_metadata_t;
+
+/**
+ * Functions for manipulating camera metadata
+ * =============================================================================
+ *
+ * NOTE: Unless otherwise specified, functions that return type "int"
+ * return 0 on success, and non-0 value on error.
+ */
+
+/**
+ * Allocate a new camera_metadata structure, with some initial space for entries
+ * and extra data. The entry_capacity is measured in entry counts, and
+ * data_capacity in bytes. The resulting structure is all contiguous in memory,
+ * and can be freed with free_camera_metadata().
+ */
+icamera_metadata_t *allocate_icamera_metadata(size_t entry_capacity,
+        size_t data_capacity);
+
+/**
+ * Get the required alignment of a packet of camera metadata, which is the
+ * maximal alignment of the embedded camera_metadata, camera_metadata_buffer_entry,
+ * and camera_metadata_data.
+ */
+size_t get_icamera_metadata_alignment();
+
+/**
+ * Allocate a new camera_metadata structure of size src_size. Copy the data,
+ * ignoring alignment, and then attempt validation. If validation
+ * fails, free the memory and return NULL. Otherwise return the pointer.
+ *
+ * The resulting pointer can be freed with free_camera_metadata().
+ */
+icamera_metadata_t *allocate_copy_icamera_metadata_checked(
+        const icamera_metadata_t *src,
+        size_t src_size);
+
+/**
+ * Place a camera metadata structure into an existing buffer. Returns NULL if
+ * the buffer is too small for the requested number of reserved entries and
+ * bytes of data. The entry_capacity is measured in entry counts, and
+ * data_capacity in bytes. If the buffer is larger than the required space,
+ * unused space will be left at the end. If successful, returns a pointer to the
+ * metadata header placed at the start of the buffer. It is the caller's
+ * responsibility to free the original buffer; do not call
+ * free_camera_metadata() with the returned pointer.
+ */
+icamera_metadata_t *place_icamera_metadata(void *dst, size_t dst_size,
+        size_t entry_capacity,
+        size_t data_capacity);
+
+/**
+ * Free a camera_metadata structure. Should only be used with structures
+ * allocated with allocate_camera_metadata().
+ */
+void free_icamera_metadata(icamera_metadata_t *metadata);
+
+/**
+ * Calculate the buffer size needed for a metadata structure of entry_count
+ * metadata entries, needing a total of data_count bytes of extra data storage.
+ */
+size_t calculate_icamera_metadata_size(size_t entry_count,
+        size_t data_count);
+
+/**
+ * Get current size of entire metadata structure in bytes, including reserved
+ * but unused space.
+ */
+size_t get_icamera_metadata_size(const icamera_metadata_t *metadata);
+
+/**
+ * Get size of entire metadata buffer in bytes, not including reserved but
+ * unused space. This is the amount of space needed by copy_camera_metadata for
+ * its dst buffer.
+ */
+size_t get_icamera_metadata_compact_size(const icamera_metadata_t *metadata);
+
+/**
+ * Get the current number of entries in the metadata packet.
+ *
+ * metadata packet must be valid, which can be checked before the call with
+ * validate_camera_metadata_structure().
+ */
+size_t get_icamera_metadata_entry_count(const icamera_metadata_t *metadata);
+
+/**
+ * Get the maximum number of entries that could fit in the metadata packet.
+ */
+size_t get_icamera_metadata_entry_capacity(const icamera_metadata_t *metadata);
+
+/**
+ * Get the current count of bytes used for value storage in the metadata packet.
+ */
+size_t get_icamera_metadata_data_count(const icamera_metadata_t *metadata);
+
+/**
+ * Get the maximum count of bytes that could be used for value storage in the
+ * metadata packet.
+ */
+size_t get_icamera_metadata_data_capacity(const icamera_metadata_t *metadata);
+
+/**
+ * Copy a metadata structure to a memory buffer, compacting it along the
+ * way. That is, in the copied structure, entry_count == entry_capacity, and
+ * data_count == data_capacity.
+ *
+ * If dst_size > get_camera_metadata_compact_size(), the unused bytes are at the
+ * end of the buffer. If dst_size < get_camera_metadata_compact_size(), returns
+ * NULL. Otherwise returns a pointer to the metadata structure header placed at
+ * the start of dst.
+ *
+ * Since the buffer was not allocated by allocate_camera_metadata, the caller is
+ * responsible for freeing the underlying buffer when needed; do not call
+ * free_camera_metadata.
+ */
+icamera_metadata_t *copy_icamera_metadata(void *dst, size_t dst_size,
+        const icamera_metadata_t *src);
+
+/**
+ * Validate that a metadata is structurally sane. That is, its internal
+ * state is such that we won't get buffer overflows or run into other
+ * 'impossible' issues when calling the other API functions.
+ *
+ * This is useful in particular after copying the binary metadata blob
+ * from an untrusted source, since passing this check means the data is at least
+ * consistent.
+ *
+ * The expected_size argument is optional.
+ *
+ * Returns 0 on success. A non-0 value is returned on error.
+ */
+int validate_icamera_metadata_structure(const icamera_metadata_t *metadata,
+                                        const size_t *expected_size);
+
+/**
+ * Append camera metadata in src to an existing metadata structure in dst.  This
+ * does not resize the destination structure, so if it is too small, a non-zero
+ * value is returned. On success, 0 is returned. Appending onto a sorted
+ * structure results in a non-sorted combined structure.
+ */
+int append_icamera_metadata(icamera_metadata_t *dst, const icamera_metadata_t *src);
+
+/**
+ * Clone an existing metadata buffer, compacting along the way. This is
+ * equivalent to allocating a new buffer of the minimum needed size, then
+ * appending the buffer to be cloned into the new buffer. The resulting buffer
+ * can be freed with free_camera_metadata(). Returns NULL if cloning failed.
+ */
+
+icamera_metadata_t *clone_icamera_metadata(const icamera_metadata_t *src);
+/**
+ * Calculate the number of bytes of extra data a given metadata entry will take
+ * up. That is, if entry of 'type' with a payload of 'data_count' values is
+ * added, how much will the value returned by get_camera_metadata_data_count()
+ * be increased? This value may be zero, if no extra data storage is needed.
+ */
+size_t calculate_icamera_metadata_entry_data_size(uint8_t type,
+        size_t data_count);
+
+/**
+ * Add a metadata entry to a metadata structure. Returns 0 if the addition
+ * succeeded. Returns a non-zero value if there is insufficient reserved space
+ * left to add the entry, or if the tag is unknown.  data_count is the number of
+ * entries in the data array of the tag's type, not a count of
+ * bytes. Entries are always added to the end of the structure (highest index),
+ * so after addition, a previously-sorted array will be marked as unsorted.
+ *
+ * Returns 0 on success. A non-0 value is returned on error.
+ */
+int add_icamera_metadata_entry(icamera_metadata_t *dst,
+        uint32_t tag,
+        const void *data,
+        size_t data_count);
+
+/**
+ * Sort the metadata buffer for fast searching. If already marked as sorted,
+ * does nothing. Adding or appending entries to the buffer will place the buffer
+ * back into an unsorted state.
+ *
+ * Returns 0 on success. A non-0 value is returned on error.
+ */
+int sort_icamera_metadata(icamera_metadata_t *dst);
+
+/**
+ * Get metadata entry at position index in the metadata buffer.
+ * Index must be less than entry count, which is returned by
+ * get_icamera_metadata_entry_count().
+ *
+ * src and index are inputs; the passed-in entry is updated with the details of
+ * the entry. The data pointer points to the real data in the buffer, and can be
+ * updated as long as the data count does not change.
+ *
+ * Returns 0 on success. A non-0 value is returned on error.
+ */
+int get_icamera_metadata_entry(icamera_metadata_t *src,
+        size_t index,
+        icamera_metadata_entry_t *entry);
+
+/**
+ * Get metadata entry at position index, but disallow editing the data.
+ */
+int get_icamera_metadata_ro_entry(const icamera_metadata_t *src,
+        size_t index,
+        icamera_metadata_ro_entry_t *entry);
+
+/**
+ * Find an entry with given tag value. If not found, returns -ENOENT. Otherwise,
+ * returns entry contents like get_camera_metadata_entry.
+ *
+ * If multiple entries with the same tag exist, does not have any guarantees on
+ * which is returned. To speed up searching for tags, sort the metadata
+ * structure first by calling sort_camera_metadata().
+ */
+int find_icamera_metadata_entry(icamera_metadata_t *src,
+        uint32_t tag,
+        icamera_metadata_entry_t *entry);
+
+/**
+ * Find an entry with given tag value, but disallow editing the data
+ */
+int find_icamera_metadata_ro_entry(const icamera_metadata_t *src,
+        uint32_t tag,
+        icamera_metadata_ro_entry_t *entry);
+
+/**
+ * Delete an entry at given index. This is an expensive operation, since it
+ * requires repacking entries and possibly entry data. This also invalidates any
+ * existing camera_metadata_entry.data pointers to this buffer. Sorting is
+ * maintained.
+ */
+int delete_icamera_metadata_entry(icamera_metadata_t *dst,
+        size_t index);
+
+/**
+ * Updates a metadata entry with new data. If the data size is changing, may
+ * need to adjust the data array, making this an O(N) operation. If the data
+ * size is the same or still fits in the entry space, this is O(1). Maintains
+ * sorting, but invalidates camera_metadata_entry instances that point to the
+ * updated entry. If a non-NULL value is passed in to entry, the entry structure
+ * is updated to match the new buffer state.  Returns a non-zero value if there
+ * is no room for the new data in the buffer.
+ */
+int update_icamera_metadata_entry(icamera_metadata_t *dst,
+        size_t index,
+        const void *data,
+        size_t data_count,
+        icamera_metadata_entry_t *updated_entry);
+
+/**
+ * Retrieve human-readable name of section the tag is in. Returns NULL if
+ * no such tag is defined.
+ */
+const char *get_icamera_metadata_section_name(uint32_t tag);
+
+/**
+ * Retrieve human-readable name of tag (not including section). Returns NULL if
+ * no such tag is defined.
+ */
+const char *get_icamera_metadata_tag_name(uint32_t tag);
+
+/**
+ * Retrieve the type of a tag. Returns -1 if no such tag is defined.
+ */
+int get_icamera_metadata_tag_type(uint32_t tag);
+
+/**
+ * Print fields in the metadata to the log.
+ * verbosity = 0: Only tag entry information
+ * verbosity = 1: Tag entry information plus at most 16 data values
+ * verbosity = 2: All information
+ */
+void dump_icamera_metadata(const icamera_metadata_t *metadata,
+        int fd,
+        int verbosity);
+
+/**
+ * Print fields in the metadata to the log; adds indentation parameter, which
+ * specifies the number of spaces to insert before each line of the dump
+ */
+void dump_indented_icamera_metadata(const icamera_metadata_t *metadata,
+        int fd,
+        int verbosity,
+        int indentation);
+
+/**
+ * Prints the specified tag value as a string. Only works for enum tags.
+ * Returns 0 on success, -1 on failure.
+ */
+int icamera_metadata_enum_snprint(uint32_t tag,
+                                  int32_t value,
+                                  char *dst,
+                                  size_t size);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/camera/hal/intel/ipu6/src/metadata/icamera_metadata_tag_info.c b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_tag_info.c
new file mode 100644
index 000000000000..3b9b7e8e2b8c
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_tag_info.c
@@ -0,0 +1,2630 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2015-2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * !! Do not reference this file directly !!
+ *
+ * It is logically a part of camera_metadata_base.cpp.  It is broken out for
+ * ease of maintaining the tag info.
+ *
+ * Array assignments are done using specified-index syntax to keep things in
+ * sync with icamera_metadata_tags.h
+ */
+
+/**
+ * ! Do not edit this file directly !
+ *
+ * Generated automatically from icamera_metadata_tag_info.mako
+ */
+
+const char *icamera_metadata_section_names[CAMERA_SECTION_COUNT] = {
+    "camera.ae", /* [CAMERA_AE] */
+    "camera.awb", /* [CAMERA_AWB] */
+    "camera.af", /* [CAMERA_AF] */
+    "camera.control", /* [CAMERA_CONTROL] */
+    "camera.demosaic", /* [CAMERA_DEMOSAIC] */
+    "camera.edge", /* [CAMERA_EDGE] */
+    "camera.flash", /* [CAMERA_FLASH] */
+    "camera.flash.info", /* [CAMERA_FLASH_INFO] */
+    "camera.hotPixel", /* [CAMERA_HOT_PIXEL] */
+    "camera.jpeg", /* [CAMERA_JPEG] */
+    "camera.lens", /* [CAMERA_LENS] */
+    "camera.lens.info", /* [CAMERA_LENS_INFO] */
+    "camera.noiseReduction", /* [CAMERA_NOISE_REDUCTION] */
+    "camera.request", /* [CAMERA_REQUEST] */
+    "camera.scaler", /* [CAMERA_SCALER] */
+    "camera.sensor", /* [CAMERA_SENSOR] */
+    "camera.sensor.info", /* [CAMERA_SENSOR_INFO] */
+    "camera.shading", /* [CAMERA_SHADING] */
+    "camera.statistics", /* [CAMERA_STATISTICS] */
+    "camera.statistics.info", /* [CAMERA_STATISTICS_INFO] */
+    "camera.tonemap", /* [CAMERA_TONEMAP] */
+    "camera.led", /* [CAMERA_LED] */
+    "camera.info", /* [CAMERA_INFO] */
+    "camera.blackLevel", /* [CAMERA_BLACK_LEVEL] */
+    "camera.sync", /* [CAMERA_SYNC] */
+    "camera.reprocess", /* [CAMERA_REPROCESS] */
+    "intel.info", /* [INTEL_INFO] */
+    "intel.control", /* [INTEL_CONTROL] */
+    "intel.control_isp", /* [INTEL_CONTROL_ISP] */
+};
+
+unsigned int icamera_metadata_section_bounds[CAMERA_SECTION_COUNT][2] = {
+    /* [CAMERA_AE] */
+    { CAMERA_AE_START, CAMERA_AE_END },
+    /* [CAMERA_AWB] */
+    { CAMERA_AWB_START, CAMERA_AWB_END },
+    /* [CAMERA_AF] */
+    { CAMERA_AF_START, CAMERA_AF_END },
+    /* [CAMERA_CONTROL] */
+    { CAMERA_CONTROL_START, CAMERA_CONTROL_END },
+    /* [CAMERA_DEMOSAIC] */
+    { CAMERA_DEMOSAIC_START, CAMERA_DEMOSAIC_END },
+    /* [CAMERA_EDGE] */
+    { CAMERA_EDGE_START, CAMERA_EDGE_END },
+    /* [CAMERA_FLASH] */
+    { CAMERA_FLASH_START, CAMERA_FLASH_END },
+    /* [CAMERA_FLASH_INFO] */
+    { CAMERA_FLASH_INFO_START, CAMERA_FLASH_INFO_END },
+    /* [CAMERA_HOT_PIXEL] */
+    { CAMERA_HOT_PIXEL_START, CAMERA_HOT_PIXEL_END },
+    /* [CAMERA_JPEG] */
+    { CAMERA_JPEG_START, CAMERA_JPEG_END },
+    /* [CAMERA_LENS] */
+    { CAMERA_LENS_START, CAMERA_LENS_END },
+    /* [CAMERA_LENS_INFO] */
+    { CAMERA_LENS_INFO_START, CAMERA_LENS_INFO_END },
+    /* [CAMERA_NOISE_REDUCTION] */
+    { CAMERA_NOISE_REDUCTION_START, CAMERA_NOISE_REDUCTION_END },
+    /* [CAMERA_REQUEST] */
+    { CAMERA_REQUEST_START, CAMERA_REQUEST_END },
+    /* [CAMERA_SCALER] */
+    { CAMERA_SCALER_START, CAMERA_SCALER_END },
+    /* [CAMERA_SENSOR] */
+    { CAMERA_SENSOR_START, CAMERA_SENSOR_END },
+    /* [CAMERA_SENSOR_INFO] */
+    { CAMERA_SENSOR_INFO_START, CAMERA_SENSOR_INFO_END },
+    /* [CAMERA_SHADING] */
+    { CAMERA_SHADING_START, CAMERA_SHADING_END },
+    /* [CAMERA_STATISTICS] */
+    { CAMERA_STATISTICS_START, CAMERA_STATISTICS_END },
+    /* [CAMERA_STATISTICS_INFO] */
+    { CAMERA_STATISTICS_INFO_START, CAMERA_STATISTICS_INFO_END },
+    /* [CAMERA_TONEMAP] */
+    { CAMERA_TONEMAP_START, CAMERA_TONEMAP_END },
+    /* [CAMERA_LED] */
+    { CAMERA_LED_START, CAMERA_LED_END },
+    /* [CAMERA_INFO] */
+    { CAMERA_INFO_START, CAMERA_INFO_END },
+    /* [CAMERA_BLACK_LEVEL] */
+    { CAMERA_BLACK_LEVEL_START, CAMERA_BLACK_LEVEL_END },
+    /* [CAMERA_SYNC] */
+    { CAMERA_SYNC_START, CAMERA_SYNC_END },
+    /* [CAMERA_REPROCESS] */
+    { CAMERA_REPROCESS_START, CAMERA_REPROCESS_END },
+    /* [INTEL_INFO] */
+    { INTEL_INFO_START, INTEL_INFO_END },
+    /* [INTEL_CONTROL] */
+    { INTEL_CONTROL_START, INTEL_CONTROL_END },
+    /* [INTEL_CONTROL_ISP] */
+    { INTEL_CONTROL_ISP_START, INTEL_CONTROL_ISP_END },
+};
+
+static tag_info_t camera_ae[CAMERA_AE_END -
+        CAMERA_AE_START] = {
+    { "mode",                          ICAMERA_TYPE_BYTE   },
+    { "lock",                          ICAMERA_TYPE_BYTE   },
+    { "regions",                       ICAMERA_TYPE_INT32  },
+    { "antibandingMode",               ICAMERA_TYPE_BYTE   },
+    { "compensation",                  ICAMERA_TYPE_INT32  },
+    { "targetFpsRange",                ICAMERA_TYPE_FLOAT  },
+    { "precaptureTrigger",             ICAMERA_TYPE_BYTE   },
+    { "state",                         ICAMERA_TYPE_BYTE   },
+    { "availableModes",                ICAMERA_TYPE_BYTE   },
+    { "availableAntibandingModes",     ICAMERA_TYPE_BYTE   },
+    { "compensationStep",              ICAMERA_TYPE_RATIONAL
+                        },
+    { "compensationRange",             ICAMERA_TYPE_INT32  },
+    { "availableTargetFpsRanges",      ICAMERA_TYPE_FLOAT  },
+    { "lockAvailable",                 ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t camera_awb[CAMERA_AWB_END -
+        CAMERA_AWB_START] = {
+    { "mode",                          ICAMERA_TYPE_BYTE   },
+    { "colorTransform",                ICAMERA_TYPE_FLOAT  },
+    { "colorGains",                    ICAMERA_TYPE_FLOAT  },
+    { "lock",                          ICAMERA_TYPE_BYTE   },
+    { "regions",                       ICAMERA_TYPE_INT32  },
+    { "cctRange",                      ICAMERA_TYPE_INT32  },
+    { "gains",                         ICAMERA_TYPE_INT32  },
+    { "gainShift",                     ICAMERA_TYPE_INT32  },
+    { "whitePoint",                    ICAMERA_TYPE_INT32  },
+    { "convergeSpeed",                 ICAMERA_TYPE_BYTE   },
+    { "convergeSpeedMode",             ICAMERA_TYPE_BYTE   },
+    { "state",                         ICAMERA_TYPE_BYTE   },
+    { "result",                        ICAMERA_TYPE_BYTE   },
+    { "availableModes",                ICAMERA_TYPE_BYTE   },
+    { "lockAvailable",                 ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t camera_af[CAMERA_AF_END -
+        CAMERA_AF_START] = {
+    { "mode",                          ICAMERA_TYPE_BYTE   },
+    { "regions",                       ICAMERA_TYPE_INT32  },
+    { "trigger",                       ICAMERA_TYPE_BYTE   },
+    { "availableModes",                ICAMERA_TYPE_BYTE   },
+    { "state",                         ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t camera_control[CAMERA_CONTROL_END -
+        CAMERA_CONTROL_START] = {
+    { "effectMode",                    ICAMERA_TYPE_BYTE   },
+    { "mode",                          ICAMERA_TYPE_BYTE   },
+    { "sceneMode",                     ICAMERA_TYPE_BYTE   },
+    { "videoStabilizationMode",        ICAMERA_TYPE_BYTE   },
+    { "availableEffects",              ICAMERA_TYPE_BYTE   },
+    { "availableModes",                ICAMERA_TYPE_BYTE   },
+    { "availableSceneModes",           ICAMERA_TYPE_BYTE   },
+    { "availableVideoStabilizationModes",
+                                        ICAMERA_TYPE_BYTE   },
+    { "maxRegions",                    ICAMERA_TYPE_INT32  },
+    { "sceneModeOverrides",            ICAMERA_TYPE_BYTE   },
+    { "availableHighSpeedVideoConfigurations",
+                                        ICAMERA_TYPE_INT32  },
+};
+
+static tag_info_t camera_demosaic[CAMERA_DEMOSAIC_END -
+        CAMERA_DEMOSAIC_START] = {
+    { "mode",                          ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t camera_edge[CAMERA_EDGE_END -
+        CAMERA_EDGE_START] = {
+    { "mode",                          ICAMERA_TYPE_BYTE   },
+    { "strength",                      ICAMERA_TYPE_BYTE   },
+    { "availableEdgeModes",            ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t camera_flash[CAMERA_FLASH_END -
+        CAMERA_FLASH_START] = {
+    { "firingPower",                   ICAMERA_TYPE_BYTE   },
+    { "firingTime",                    ICAMERA_TYPE_INT64  },
+    { "mode",                          ICAMERA_TYPE_BYTE   },
+    { "colorTemperature",              ICAMERA_TYPE_BYTE   },
+    { "maxEnergy",                     ICAMERA_TYPE_BYTE   },
+    { "state",                         ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t camera_flash_info[CAMERA_FLASH_INFO_END -
+        CAMERA_FLASH_INFO_START] = {
+    { "available",                     ICAMERA_TYPE_BYTE   },
+    { "chargeDuration",                ICAMERA_TYPE_INT64  },
+};
+
+static tag_info_t camera_hot_pixel[CAMERA_HOT_PIXEL_END -
+        CAMERA_HOT_PIXEL_START] = {
+    { "mode",                          ICAMERA_TYPE_BYTE   },
+    { "availableHotPixelModes",        ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t camera_jpeg[CAMERA_JPEG_END -
+        CAMERA_JPEG_START] = {
+    { "gpsCoordinates",                ICAMERA_TYPE_DOUBLE },
+    { "gpsProcessingMethod",           ICAMERA_TYPE_BYTE   },
+    { "gpsTimestamp",                  ICAMERA_TYPE_INT64  },
+    { "orientation",                   ICAMERA_TYPE_INT32  },
+    { "quality",                       ICAMERA_TYPE_BYTE   },
+    { "thumbnailQuality",              ICAMERA_TYPE_BYTE   },
+    { "thumbnailSize",                 ICAMERA_TYPE_INT32  },
+    { "availableThumbnailSizes",       ICAMERA_TYPE_INT32  },
+    { "maxSize",                       ICAMERA_TYPE_INT32  },
+    { "size",                          ICAMERA_TYPE_INT32  },
+};
+
+static tag_info_t camera_lens[CAMERA_LENS_END -
+        CAMERA_LENS_START] = {
+    { "aperture",                      ICAMERA_TYPE_FLOAT  },
+    { "filterDensity",                 ICAMERA_TYPE_FLOAT  },
+    { "focalLength",                   ICAMERA_TYPE_FLOAT  },
+    { "focusDistance",                 ICAMERA_TYPE_FLOAT  },
+    { "opticalStabilizationMode",      ICAMERA_TYPE_BYTE   },
+    { "facing",                        ICAMERA_TYPE_BYTE   },
+    { "focusRange",                    ICAMERA_TYPE_FLOAT  },
+    { "state",                         ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t camera_lens_info[CAMERA_LENS_INFO_END -
+        CAMERA_LENS_INFO_START] = {
+    { "availableApertures",            ICAMERA_TYPE_FLOAT  },
+    { "availableFilterDensities",      ICAMERA_TYPE_FLOAT  },
+    { "availableFocalLengths",         ICAMERA_TYPE_FLOAT  },
+    { "availableOpticalStabilization", ICAMERA_TYPE_BYTE   },
+    { "hyperfocalDistance",            ICAMERA_TYPE_FLOAT  },
+    { "minimumFocusDistance",          ICAMERA_TYPE_FLOAT  },
+    { "shadingMapSize",                ICAMERA_TYPE_INT32  },
+    { "focusDistanceCalibration",      ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t camera_noise_reduction[CAMERA_NOISE_REDUCTION_END -
+        CAMERA_NOISE_REDUCTION_START] = {
+    { "mode",                          ICAMERA_TYPE_BYTE   },
+    { "strength",                      ICAMERA_TYPE_BYTE   },
+    { "availableNoiseReductionModes",  ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t camera_request[CAMERA_REQUEST_END -
+        CAMERA_REQUEST_START] = {
+    { "id",                            ICAMERA_TYPE_INT32  },
+    { "metadataMode",                  ICAMERA_TYPE_BYTE   },
+    { "maxNumOutputStreams",           ICAMERA_TYPE_INT32  },
+    { "maxNumInputStreams",            ICAMERA_TYPE_INT32  },
+    { "pipelineDepth",                 ICAMERA_TYPE_BYTE   },
+    { "pipelineMaxDepth",              ICAMERA_TYPE_BYTE   },
+    { "partialResultCount",            ICAMERA_TYPE_INT32  },
+    { "availableCapabilities",         ICAMERA_TYPE_BYTE   },
+    { "availableRequestKeys",          ICAMERA_TYPE_INT32  },
+    { "availableResultKeys",           ICAMERA_TYPE_INT32  },
+    { "availableCharacteristicsKeys",  ICAMERA_TYPE_INT32  },
+};
+
+static tag_info_t camera_scaler[CAMERA_SCALER_END -
+        CAMERA_SCALER_START] = {
+    { "cropRegion",                    ICAMERA_TYPE_INT32  },
+    { "availableJpegSizes",            ICAMERA_TYPE_INT32  },
+    { "availableMaxDigitalZoom",       ICAMERA_TYPE_FLOAT  },
+    { "availableInputOutputFormatsMap",
+                                        ICAMERA_TYPE_INT32  },
+    { "availableStreamConfigurations", ICAMERA_TYPE_INT32  },
+    { "availableMinFrameDurations",    ICAMERA_TYPE_INT64  },
+    { "croppingType",                  ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t camera_sensor[CAMERA_SENSOR_END -
+        CAMERA_SENSOR_START] = {
+    { "exposureTime",                  ICAMERA_TYPE_INT64  },
+    { "frameDuration",                 ICAMERA_TYPE_INT64  },
+    { "sensitivity",                   ICAMERA_TYPE_INT32  },
+    { "referenceIlluminant1",          ICAMERA_TYPE_BYTE   },
+    { "referenceIlluminant2",          ICAMERA_TYPE_BYTE   },
+    { "calibrationTransform1",         ICAMERA_TYPE_RATIONAL
+                        },
+    { "calibrationTransform2",         ICAMERA_TYPE_RATIONAL
+                        },
+    { "colorTransform1",               ICAMERA_TYPE_RATIONAL
+                        },
+    { "colorTransform2",               ICAMERA_TYPE_RATIONAL
+                        },
+    { "forwardMatrix1",                ICAMERA_TYPE_RATIONAL
+                        },
+    { "forwardMatrix2",                ICAMERA_TYPE_RATIONAL
+                        },
+    { "baseGainFactor",                ICAMERA_TYPE_RATIONAL
+                        },
+    { "blackLevelPattern",             ICAMERA_TYPE_INT32  },
+    { "maxAnalogSensitivity",          ICAMERA_TYPE_INT32  },
+    { "orientation",                   ICAMERA_TYPE_INT32  },
+    { "profileHueSatMapDimensions",    ICAMERA_TYPE_INT32  },
+    { "timestamp",                     ICAMERA_TYPE_INT64  },
+    { "temperature",                   ICAMERA_TYPE_FLOAT  },
+    { "neutralColorPoint",             ICAMERA_TYPE_RATIONAL
+                        },
+    { "noiseProfile",                  ICAMERA_TYPE_DOUBLE },
+    { "profileHueSatMap",              ICAMERA_TYPE_FLOAT  },
+    { "profileToneCurve",              ICAMERA_TYPE_FLOAT  },
+    { "greenSplit",                    ICAMERA_TYPE_FLOAT  },
+    { "testPatternData",               ICAMERA_TYPE_INT32  },
+    { "testPatternMode",               ICAMERA_TYPE_INT32  },
+    { "availableTestPatternModes",     ICAMERA_TYPE_INT32  },
+    { "opaqueRawSize",                 ICAMERA_TYPE_INT32  },
+    { "rollingShutterSkew",            ICAMERA_TYPE_INT64  },
+};
+
+static tag_info_t camera_sensor_info[CAMERA_SENSOR_INFO_END -
+        CAMERA_SENSOR_INFO_START] = {
+    { "activeArraySize",               ICAMERA_TYPE_INT32  },
+    { "sensitivityRange",              ICAMERA_TYPE_INT32  },
+    { "colorFilterArrangement",        ICAMERA_TYPE_BYTE   },
+    { "exposureTimeRange",             ICAMERA_TYPE_INT64  },
+    { "maxFrameDuration",              ICAMERA_TYPE_INT64  },
+    { "physicalSize",                  ICAMERA_TYPE_FLOAT  },
+    { "pixelArraySize",                ICAMERA_TYPE_INT32  },
+    { "whiteLevel",                    ICAMERA_TYPE_INT32  },
+    { "timestampSource",               ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t camera_shading[CAMERA_SHADING_END -
+        CAMERA_SHADING_START] = {
+    { "mode",                          ICAMERA_TYPE_BYTE   },
+    { "strength",                      ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t camera_statistics[CAMERA_STATISTICS_END -
+        CAMERA_STATISTICS_START] = {
+    { "faceDetectMode",                ICAMERA_TYPE_BYTE   },
+    { "histogramMode",                 ICAMERA_TYPE_BYTE   },
+    { "sharpnessMapMode",              ICAMERA_TYPE_BYTE   },
+    { "hotPixelMapMode",               ICAMERA_TYPE_BYTE   },
+    { "faceIds",                       ICAMERA_TYPE_INT32  },
+    { "faceLandmarks",                 ICAMERA_TYPE_INT32  },
+    { "faceRectangles",                ICAMERA_TYPE_INT32  },
+    { "faceScores",                    ICAMERA_TYPE_BYTE   },
+    { "histogram",                     ICAMERA_TYPE_INT32  },
+    { "sharpnessMap",                  ICAMERA_TYPE_INT32  },
+    { "lensShadingCorrectionMap",      ICAMERA_TYPE_BYTE   },
+    { "lensShadingMap",                ICAMERA_TYPE_FLOAT  },
+    { "predictedColorGains",           ICAMERA_TYPE_FLOAT  },
+    { "predictedColorTransform",       ICAMERA_TYPE_RATIONAL
+                        },
+    { "sceneFlicker",                  ICAMERA_TYPE_BYTE   },
+    { "hotPixelMap",                   ICAMERA_TYPE_INT32  },
+    { "lensShadingMapMode",            ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t camera_statistics_info[CAMERA_STATISTICS_INFO_END -
+        CAMERA_STATISTICS_INFO_START] = {
+    { "availableFaceDetectModes",      ICAMERA_TYPE_BYTE   },
+    { "histogramBucketCount",          ICAMERA_TYPE_INT32  },
+    { "maxFaceCount",                  ICAMERA_TYPE_INT32  },
+    { "maxHistogramCount",             ICAMERA_TYPE_INT32  },
+    { "maxSharpnessMapValue",          ICAMERA_TYPE_INT32  },
+    { "sharpnessMapSize",              ICAMERA_TYPE_INT32  },
+    { "availableHotPixelMapModes",     ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t camera_tonemap[CAMERA_TONEMAP_END -
+        CAMERA_TONEMAP_START] = {
+    { "curveBlue",                     ICAMERA_TYPE_FLOAT  },
+    { "curveGreen",                    ICAMERA_TYPE_FLOAT  },
+    { "curveRed",                      ICAMERA_TYPE_FLOAT  },
+    { "mode",                          ICAMERA_TYPE_BYTE   },
+    { "maxCurvePoints",                ICAMERA_TYPE_INT32  },
+    { "availableToneMapModes",         ICAMERA_TYPE_BYTE   },
+    { "gamma",                         ICAMERA_TYPE_FLOAT  },
+    { "presetCurve",                   ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t camera_led[CAMERA_LED_END -
+        CAMERA_LED_START] = {
+    { "transmit",                      ICAMERA_TYPE_BYTE   },
+    { "availableLeds",                 ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t camera_info[CAMERA_INFO_END -
+        CAMERA_INFO_START] = {
+    { "supportedHardwareLevel",        ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t camera_black_level[CAMERA_BLACK_LEVEL_END -
+        CAMERA_BLACK_LEVEL_START] = {
+    { "lock",                          ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t camera_sync[CAMERA_SYNC_END -
+        CAMERA_SYNC_START] = {
+    { "frameNumber",                   ICAMERA_TYPE_INT64  },
+    { "maxLatency",                    ICAMERA_TYPE_INT32  },
+};
+
+static tag_info_t camera_reprocess[CAMERA_REPROCESS_END -
+        CAMERA_REPROCESS_START] = {
+    { "maxCaptureStall",               ICAMERA_TYPE_INT32  },
+};
+
+static tag_info_t intel_info[INTEL_INFO_END -
+        INTEL_INFO_START] = {
+    { "availableFeatures",             ICAMERA_TYPE_BYTE   },
+    { "aeExposureTimeRange",           ICAMERA_TYPE_INT32  },
+    { "aeGainRange",                   ICAMERA_TYPE_INT32  },
+    { "wfov",                          ICAMERA_TYPE_BYTE   },
+    { "sensorMountType",               ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t intel_control[INTEL_CONTROL_END -
+        INTEL_CONTROL_START] = {
+    { "imageEnhancement",              ICAMERA_TYPE_INT32  },
+    { "sensitivityGain",               ICAMERA_TYPE_FLOAT  },
+    { "frameRate",                     ICAMERA_TYPE_FLOAT  },
+    { "aeConvergeSpeed",               ICAMERA_TYPE_BYTE   },
+    { "nrMode",                        ICAMERA_TYPE_BYTE   },
+    { "nrLevel",                       ICAMERA_TYPE_INT32  },
+    { "irisMode",                      ICAMERA_TYPE_BYTE   },
+    { "aeDistributionPriority",        ICAMERA_TYPE_BYTE   },
+    { "irisLevel",                     ICAMERA_TYPE_INT32  },
+    { "wdrMode",                       ICAMERA_TYPE_BYTE   },
+    { "wdrLevel",                      ICAMERA_TYPE_BYTE   },
+    { "blcAreaMode",                   ICAMERA_TYPE_BYTE   },
+    { "sceneMode",                     ICAMERA_TYPE_BYTE   },
+    { "weightGridMode",                ICAMERA_TYPE_BYTE   },
+    { "aeConvergeSpeedMode",           ICAMERA_TYPE_BYTE   },
+    { "deinterlaceMode",               ICAMERA_TYPE_BYTE   },
+    { "makernoteData",                 ICAMERA_TYPE_BYTE   },
+    { "customAicParam",                ICAMERA_TYPE_BYTE   },
+    { "makernoteMode",                 ICAMERA_TYPE_BYTE   },
+    { "yuvColorRange",                 ICAMERA_TYPE_BYTE   },
+    { "sensitivityGainRange",          ICAMERA_TYPE_FLOAT  },
+    { "exposureTimeRange",             ICAMERA_TYPE_INT32  },
+    { "fisheyeDewarpingMode",          ICAMERA_TYPE_BYTE   },
+    { "ltmTuningData",                 ICAMERA_TYPE_BYTE   },
+    { "digitalZoomRatio",              ICAMERA_TYPE_FLOAT  },
+    { "ldcMode",                       ICAMERA_TYPE_BYTE   },
+    { "rscMode",                       ICAMERA_TYPE_BYTE   },
+    { "flipMode",                      ICAMERA_TYPE_BYTE   },
+    { "monoDownscale",                 ICAMERA_TYPE_BYTE   },
+    { "run3ACadence",                  ICAMERA_TYPE_INT32  },
+    { "viewProjection",                ICAMERA_TYPE_BYTE   },
+    { "viewRotation",                  ICAMERA_TYPE_BYTE   },
+    { "viewFineAdjustments",           ICAMERA_TYPE_BYTE   },
+    { "cameraRotation",                ICAMERA_TYPE_BYTE   },
+};
+
+static tag_info_t intel_control_isp[INTEL_CONTROL_ISP_END -
+        INTEL_CONTROL_ISP_START] = {
+    { "supportedCtrlIds",              ICAMERA_TYPE_INT32  },
+    { "enabledCtrlIds",                ICAMERA_TYPE_INT32  },
+    { "wb_gains",                      ICAMERA_TYPE_BYTE   },
+    { "color_correction_matrix",       ICAMERA_TYPE_BYTE   },
+    { "advanced_color_correction_matrix",
+                                        ICAMERA_TYPE_BYTE   },
+    { "bxt_csc",                       ICAMERA_TYPE_BYTE   },
+    { "bxt_demosaic",                  ICAMERA_TYPE_BYTE   },
+    { "sc_iefd",                       ICAMERA_TYPE_BYTE   },
+    { "see",                           ICAMERA_TYPE_BYTE   },
+    { "bnlm",                          ICAMERA_TYPE_BYTE   },
+    { "tnr5_21",                       ICAMERA_TYPE_BYTE   },
+    { "xnr_dss",                       ICAMERA_TYPE_BYTE   },
+    { "gamma_tone_map",                ICAMERA_TYPE_BYTE   },
+    { "tnr5_22",                       ICAMERA_TYPE_BYTE   },
+    { "tnr5_25",                       ICAMERA_TYPE_BYTE   },
+};
+
+tag_info_t *icamera_tag_info[CAMERA_SECTION_COUNT] = {
+    camera_ae,
+    camera_awb,
+    camera_af,
+    camera_control,
+    camera_demosaic,
+    camera_edge,
+    camera_flash,
+    camera_flash_info,
+    camera_hot_pixel,
+    camera_jpeg,
+    camera_lens,
+    camera_lens_info,
+    camera_noise_reduction,
+    camera_request,
+    camera_scaler,
+    camera_sensor,
+    camera_sensor_info,
+    camera_shading,
+    camera_statistics,
+    camera_statistics_info,
+    camera_tonemap,
+    camera_led,
+    camera_info,
+    camera_black_level,
+    camera_sync,
+    camera_reprocess,
+    intel_info,
+    intel_control,
+    intel_control_isp,
+};
+
+int icamera_metadata_enum_snprint(uint32_t tag,
+                                  int32_t value,
+                                  char *dst,
+                                  size_t size) {
+    const char *msg = "error: not an enum";
+    int ret = -1;
+
+    switch(tag) {
+        case CAMERA_AE_MODE: {
+            switch (value) {
+                case CAMERA_AE_MODE_MANUAL:
+                    msg = "MANUAL";
+                    ret = 0;
+                    break;
+                case CAMERA_AE_MODE_AUTO:
+                    msg = "AUTO";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_AE_LOCK: {
+            switch (value) {
+                case CAMERA_AE_LOCK_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case CAMERA_AE_LOCK_ON:
+                    msg = "ON";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_AE_REGIONS: {
+            break;
+        }
+        case CAMERA_AE_ANTIBANDING_MODE: {
+            switch (value) {
+                case CAMERA_AE_ANTIBANDING_MODE_AUTO:
+                    msg = "AUTO";
+                    ret = 0;
+                    break;
+                case CAMERA_AE_ANTIBANDING_MODE_50HZ:
+                    msg = "50HZ";
+                    ret = 0;
+                    break;
+                case CAMERA_AE_ANTIBANDING_MODE_60HZ:
+                    msg = "60HZ";
+                    ret = 0;
+                    break;
+                case CAMERA_AE_ANTIBANDING_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_AE_COMPENSATION: {
+            break;
+        }
+        case CAMERA_AE_TARGET_FPS_RANGE: {
+            break;
+        }
+        case CAMERA_AE_PRECAPTURE_TRIGGER: {
+            switch (value) {
+                case CAMERA_AE_PRECAPTURE_TRIGGER_IDLE:
+                    msg = "IDLE";
+                    ret = 0;
+                    break;
+                case CAMERA_AE_PRECAPTURE_TRIGGER_START:
+                    msg = "START";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_AE_STATE: {
+            switch (value) {
+                case CAMERA_AE_STATE_INACTIVE:
+                    msg = "INACTIVE";
+                    ret = 0;
+                    break;
+                case CAMERA_AE_STATE_SEARCHING:
+                    msg = "SEARCHING";
+                    ret = 0;
+                    break;
+                case CAMERA_AE_STATE_CONVERGED:
+                    msg = "CONVERGED";
+                    ret = 0;
+                    break;
+                case CAMERA_AE_STATE_LOCKED:
+                    msg = "LOCKED";
+                    ret = 0;
+                    break;
+                case CAMERA_AE_STATE_FLASH_REQUIRED:
+                    msg = "FLASH_REQUIRED";
+                    ret = 0;
+                    break;
+                case CAMERA_AE_STATE_PRECAPTURE:
+                    msg = "PRECAPTURE";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_AE_AVAILABLE_MODES: {
+            break;
+        }
+        case CAMERA_AE_AVAILABLE_ANTIBANDING_MODES: {
+            break;
+        }
+        case CAMERA_AE_COMPENSATION_STEP: {
+            break;
+        }
+        case CAMERA_AE_COMPENSATION_RANGE: {
+            break;
+        }
+        case CAMERA_AE_AVAILABLE_TARGET_FPS_RANGES: {
+            break;
+        }
+        case CAMERA_AE_LOCK_AVAILABLE: {
+            switch (value) {
+                case CAMERA_AE_LOCK_AVAILABLE_FALSE:
+                    msg = "FALSE";
+                    ret = 0;
+                    break;
+                case CAMERA_AE_LOCK_AVAILABLE_TRUE:
+                    msg = "TRUE";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+
+        case CAMERA_AWB_MODE: {
+            switch (value) {
+                case CAMERA_AWB_MODE_AUTO:
+                    msg = "AUTO";
+                    ret = 0;
+                    break;
+                case CAMERA_AWB_MODE_INCANDESCENT:
+                    msg = "INCANDESCENT";
+                    ret = 0;
+                    break;
+                case CAMERA_AWB_MODE_FLUORESCENT:
+                    msg = "FLUORESCENT";
+                    ret = 0;
+                    break;
+                case CAMERA_AWB_MODE_DAYLIGHT:
+                    msg = "DAYLIGHT";
+                    ret = 0;
+                    break;
+                case CAMERA_AWB_MODE_FULL_OVERCAST:
+                    msg = "FULL_OVERCAST";
+                    ret = 0;
+                    break;
+                case CAMERA_AWB_MODE_PARTLY_OVERCAST:
+                    msg = "PARTLY_OVERCAST";
+                    ret = 0;
+                    break;
+                case CAMERA_AWB_MODE_SUNSET:
+                    msg = "SUNSET";
+                    ret = 0;
+                    break;
+                case CAMERA_AWB_MODE_VIDEO_CONFERENCE:
+                    msg = "VIDEO_CONFERENCE";
+                    ret = 0;
+                    break;
+                case CAMERA_AWB_MODE_MANUAL_CCT_RANGE:
+                    msg = "MANUAL_CCT_RANGE";
+                    ret = 0;
+                    break;
+                case CAMERA_AWB_MODE_MANUAL_WHITE_POINT:
+                    msg = "MANUAL_WHITE_POINT";
+                    ret = 0;
+                    break;
+                case CAMERA_AWB_MODE_MANUAL_GAIN:
+                    msg = "MANUAL_GAIN";
+                    ret = 0;
+                    break;
+                case CAMERA_AWB_MODE_MANUAL_COLOR_TRANSFORM:
+                    msg = "MANUAL_COLOR_TRANSFORM";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_AWB_COLOR_TRANSFORM: {
+            break;
+        }
+        case CAMERA_AWB_COLOR_GAINS: {
+            break;
+        }
+        case CAMERA_AWB_LOCK: {
+            switch (value) {
+                case CAMERA_AWB_LOCK_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case CAMERA_AWB_LOCK_ON:
+                    msg = "ON";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_AWB_REGIONS: {
+            break;
+        }
+        case CAMERA_AWB_CCT_RANGE: {
+            break;
+        }
+        case CAMERA_AWB_GAINS: {
+            break;
+        }
+        case CAMERA_AWB_GAIN_SHIFT: {
+            break;
+        }
+        case CAMERA_AWB_WHITE_POINT: {
+            break;
+        }
+        case CAMERA_AWB_CONVERGE_SPEED: {
+            switch (value) {
+                case CAMERA_AWB_CONVERGE_SPEED_NORMAL:
+                    msg = "NORMAL";
+                    ret = 0;
+                    break;
+                case CAMERA_AWB_CONVERGE_SPEED_MID:
+                    msg = "MID";
+                    ret = 0;
+                    break;
+                case CAMERA_AWB_CONVERGE_SPEED_LOW:
+                    msg = "LOW";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_AWB_CONVERGE_SPEED_MODE: {
+            switch (value) {
+                case CAMERA_AWB_CONVERGE_SPEED_MODE_HAL:
+                    msg = "HAL";
+                    ret = 0;
+                    break;
+                case CAMERA_AWB_CONVERGE_SPEED_MODE_AIQ:
+                    msg = "AIQ";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_AWB_STATE: {
+            switch (value) {
+                case CAMERA_AWB_STATE_INACTIVE:
+                    msg = "INACTIVE";
+                    ret = 0;
+                    break;
+                case CAMERA_AWB_STATE_SEARCHING:
+                    msg = "SEARCHING";
+                    ret = 0;
+                    break;
+                case CAMERA_AWB_STATE_CONVERGED:
+                    msg = "CONVERGED";
+                    ret = 0;
+                    break;
+                case CAMERA_AWB_STATE_LOCKED:
+                    msg = "LOCKED";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_AWB_RESULT: {
+            break;
+        }
+        case CAMERA_AWB_AVAILABLE_MODES: {
+            break;
+        }
+        case CAMERA_AWB_LOCK_AVAILABLE: {
+            switch (value) {
+                case CAMERA_AWB_LOCK_AVAILABLE_FALSE:
+                    msg = "FALSE";
+                    ret = 0;
+                    break;
+                case CAMERA_AWB_LOCK_AVAILABLE_TRUE:
+                    msg = "TRUE";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+
+        case CAMERA_AF_MODE: {
+            switch (value) {
+                case CAMERA_AF_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case CAMERA_AF_MODE_AUTO:
+                    msg = "AUTO";
+                    ret = 0;
+                    break;
+                case CAMERA_AF_MODE_MACRO:
+                    msg = "MACRO";
+                    ret = 0;
+                    break;
+                case CAMERA_AF_MODE_CONTINUOUS_VIDEO:
+                    msg = "CONTINUOUS_VIDEO";
+                    ret = 0;
+                    break;
+                case CAMERA_AF_MODE_CONTINUOUS_PICTURE:
+                    msg = "CONTINUOUS_PICTURE";
+                    ret = 0;
+                    break;
+                case CAMERA_AF_MODE_EDOF:
+                    msg = "EDOF";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_AF_REGIONS: {
+            break;
+        }
+        case CAMERA_AF_TRIGGER: {
+            switch (value) {
+                case CAMERA_AF_TRIGGER_IDLE:
+                    msg = "IDLE";
+                    ret = 0;
+                    break;
+                case CAMERA_AF_TRIGGER_START:
+                    msg = "START";
+                    ret = 0;
+                    break;
+                case CAMERA_AF_TRIGGER_CANCEL:
+                    msg = "CANCEL";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_AF_AVAILABLE_MODES: {
+            break;
+        }
+        case CAMERA_AF_STATE: {
+            switch (value) {
+                case CAMERA_AF_STATE_INACTIVE:
+                    msg = "INACTIVE";
+                    ret = 0;
+                    break;
+                case CAMERA_AF_STATE_PASSIVE_SCAN:
+                    msg = "PASSIVE_SCAN";
+                    ret = 0;
+                    break;
+                case CAMERA_AF_STATE_PASSIVE_FOCUSED:
+                    msg = "PASSIVE_FOCUSED";
+                    ret = 0;
+                    break;
+                case CAMERA_AF_STATE_ACTIVE_SCAN:
+                    msg = "ACTIVE_SCAN";
+                    ret = 0;
+                    break;
+                case CAMERA_AF_STATE_FOCUSED_LOCKED:
+                    msg = "FOCUSED_LOCKED";
+                    ret = 0;
+                    break;
+                case CAMERA_AF_STATE_NOT_FOCUSED_LOCKED:
+                    msg = "NOT_FOCUSED_LOCKED";
+                    ret = 0;
+                    break;
+                case CAMERA_AF_STATE_PASSIVE_UNFOCUSED:
+                    msg = "PASSIVE_UNFOCUSED";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+
+        case CAMERA_CONTROL_EFFECT_MODE: {
+            switch (value) {
+                case CAMERA_CONTROL_EFFECT_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_EFFECT_MODE_MONO:
+                    msg = "MONO";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_EFFECT_MODE_NEGATIVE:
+                    msg = "NEGATIVE";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_EFFECT_MODE_SOLARIZE:
+                    msg = "SOLARIZE";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_EFFECT_MODE_SEPIA:
+                    msg = "SEPIA";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_EFFECT_MODE_POSTERIZE:
+                    msg = "POSTERIZE";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_EFFECT_MODE_WHITEBOARD:
+                    msg = "WHITEBOARD";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_EFFECT_MODE_BLACKBOARD:
+                    msg = "BLACKBOARD";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_EFFECT_MODE_AQUA:
+                    msg = "AQUA";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_CONTROL_MODE: {
+            switch (value) {
+                case CAMERA_CONTROL_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_MODE_AUTO:
+                    msg = "AUTO";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_MODE_USE_SCENE_MODE:
+                    msg = "USE_SCENE_MODE";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_MODE_OFF_KEEP_STATE:
+                    msg = "OFF_KEEP_STATE";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_CONTROL_SCENE_MODE: {
+            switch (value) {
+                case CAMERA_CONTROL_SCENE_MODE_DISABLED:
+                    msg = "DISABLED";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_SCENE_MODE_FACE_PRIORITY:
+                    msg = "FACE_PRIORITY";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_SCENE_MODE_ACTION:
+                    msg = "ACTION";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_SCENE_MODE_PORTRAIT:
+                    msg = "PORTRAIT";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_SCENE_MODE_LANDSCAPE:
+                    msg = "LANDSCAPE";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_SCENE_MODE_NIGHT:
+                    msg = "NIGHT";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
+                    msg = "NIGHT_PORTRAIT";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_SCENE_MODE_THEATRE:
+                    msg = "THEATRE";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_SCENE_MODE_BEACH:
+                    msg = "BEACH";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_SCENE_MODE_SNOW:
+                    msg = "SNOW";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_SCENE_MODE_SUNSET:
+                    msg = "SUNSET";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_SCENE_MODE_STEADYPHOTO:
+                    msg = "STEADYPHOTO";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_SCENE_MODE_FIREWORKS:
+                    msg = "FIREWORKS";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_SCENE_MODE_SPORTS:
+                    msg = "SPORTS";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_SCENE_MODE_PARTY:
+                    msg = "PARTY";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_SCENE_MODE_CANDLELIGHT:
+                    msg = "CANDLELIGHT";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_SCENE_MODE_BARCODE:
+                    msg = "BARCODE";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO:
+                    msg = "HIGH_SPEED_VIDEO";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_SCENE_MODE_HDR:
+                    msg = "HDR";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_CONTROL_VIDEO_STABILIZATION_MODE: {
+            switch (value) {
+                case CAMERA_CONTROL_VIDEO_STABILIZATION_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case CAMERA_CONTROL_VIDEO_STABILIZATION_MODE_ON:
+                    msg = "ON";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_CONTROL_AVAILABLE_EFFECTS: {
+            break;
+        }
+        case CAMERA_CONTROL_AVAILABLE_MODES: {
+            break;
+        }
+        case CAMERA_CONTROL_AVAILABLE_SCENE_MODES: {
+            break;
+        }
+        case CAMERA_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES: {
+            break;
+        }
+        case CAMERA_CONTROL_MAX_REGIONS: {
+            break;
+        }
+        case CAMERA_CONTROL_SCENE_MODE_OVERRIDES: {
+            break;
+        }
+        case CAMERA_CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS: {
+            break;
+        }
+
+        case CAMERA_DEMOSAIC_MODE: {
+            switch (value) {
+                case CAMERA_DEMOSAIC_MODE_FAST:
+                    msg = "FAST";
+                    ret = 0;
+                    break;
+                case CAMERA_DEMOSAIC_MODE_HIGH_QUALITY:
+                    msg = "HIGH_QUALITY";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+
+        case CAMERA_EDGE_MODE: {
+            switch (value) {
+                case CAMERA_EDGE_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case CAMERA_EDGE_MODE_FAST:
+                    msg = "FAST";
+                    ret = 0;
+                    break;
+                case CAMERA_EDGE_MODE_HIGH_QUALITY:
+                    msg = "HIGH_QUALITY";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_EDGE_STRENGTH: {
+            break;
+        }
+        case CAMERA_EDGE_AVAILABLE_EDGE_MODES: {
+            break;
+        }
+
+        case CAMERA_FLASH_FIRING_POWER: {
+            break;
+        }
+        case CAMERA_FLASH_FIRING_TIME: {
+            break;
+        }
+        case CAMERA_FLASH_MODE: {
+            switch (value) {
+                case CAMERA_FLASH_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case CAMERA_FLASH_MODE_SINGLE:
+                    msg = "SINGLE";
+                    ret = 0;
+                    break;
+                case CAMERA_FLASH_MODE_TORCH:
+                    msg = "TORCH";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_FLASH_COLOR_TEMPERATURE: {
+            break;
+        }
+        case CAMERA_FLASH_MAX_ENERGY: {
+            break;
+        }
+        case CAMERA_FLASH_STATE: {
+            switch (value) {
+                case CAMERA_FLASH_STATE_UNAVAILABLE:
+                    msg = "UNAVAILABLE";
+                    ret = 0;
+                    break;
+                case CAMERA_FLASH_STATE_CHARGING:
+                    msg = "CHARGING";
+                    ret = 0;
+                    break;
+                case CAMERA_FLASH_STATE_READY:
+                    msg = "READY";
+                    ret = 0;
+                    break;
+                case CAMERA_FLASH_STATE_FIRED:
+                    msg = "FIRED";
+                    ret = 0;
+                    break;
+                case CAMERA_FLASH_STATE_PARTIAL:
+                    msg = "PARTIAL";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+
+        case CAMERA_FLASH_INFO_AVAILABLE: {
+            switch (value) {
+                case CAMERA_FLASH_INFO_AVAILABLE_FALSE:
+                    msg = "FALSE";
+                    ret = 0;
+                    break;
+                case CAMERA_FLASH_INFO_AVAILABLE_TRUE:
+                    msg = "TRUE";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_FLASH_INFO_CHARGE_DURATION: {
+            break;
+        }
+
+        case CAMERA_HOT_PIXEL_MODE: {
+            switch (value) {
+                case CAMERA_HOT_PIXEL_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case CAMERA_HOT_PIXEL_MODE_FAST:
+                    msg = "FAST";
+                    ret = 0;
+                    break;
+                case CAMERA_HOT_PIXEL_MODE_HIGH_QUALITY:
+                    msg = "HIGH_QUALITY";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES: {
+            break;
+        }
+
+        case CAMERA_JPEG_GPS_COORDINATES: {
+            break;
+        }
+        case CAMERA_JPEG_GPS_PROCESSING_METHOD: {
+            break;
+        }
+        case CAMERA_JPEG_GPS_TIMESTAMP: {
+            break;
+        }
+        case CAMERA_JPEG_ORIENTATION: {
+            break;
+        }
+        case CAMERA_JPEG_QUALITY: {
+            break;
+        }
+        case CAMERA_JPEG_THUMBNAIL_QUALITY: {
+            break;
+        }
+        case CAMERA_JPEG_THUMBNAIL_SIZE: {
+            break;
+        }
+        case CAMERA_JPEG_AVAILABLE_THUMBNAIL_SIZES: {
+            break;
+        }
+        case CAMERA_JPEG_MAX_SIZE: {
+            break;
+        }
+        case CAMERA_JPEG_SIZE: {
+            break;
+        }
+
+        case CAMERA_LENS_APERTURE: {
+            break;
+        }
+        case CAMERA_LENS_FILTER_DENSITY: {
+            break;
+        }
+        case CAMERA_LENS_FOCAL_LENGTH: {
+            break;
+        }
+        case CAMERA_LENS_FOCUS_DISTANCE: {
+            break;
+        }
+        case CAMERA_LENS_OPTICAL_STABILIZATION_MODE: {
+            switch (value) {
+                case CAMERA_LENS_OPTICAL_STABILIZATION_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case CAMERA_LENS_OPTICAL_STABILIZATION_MODE_ON:
+                    msg = "ON";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_LENS_FACING: {
+            switch (value) {
+                case CAMERA_LENS_FACING_FRONT:
+                    msg = "FRONT";
+                    ret = 0;
+                    break;
+                case CAMERA_LENS_FACING_BACK:
+                    msg = "BACK";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_LENS_FOCUS_RANGE: {
+            break;
+        }
+        case CAMERA_LENS_STATE: {
+            switch (value) {
+                case CAMERA_LENS_STATE_STATIONARY:
+                    msg = "STATIONARY";
+                    ret = 0;
+                    break;
+                case CAMERA_LENS_STATE_MOVING:
+                    msg = "MOVING";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+
+        case CAMERA_LENS_INFO_AVAILABLE_APERTURES: {
+            break;
+        }
+        case CAMERA_LENS_INFO_AVAILABLE_FILTER_DENSITIES: {
+            break;
+        }
+        case CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS: {
+            break;
+        }
+        case CAMERA_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION: {
+            break;
+        }
+        case CAMERA_LENS_INFO_HYPERFOCAL_DISTANCE: {
+            break;
+        }
+        case CAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE: {
+            break;
+        }
+        case CAMERA_LENS_INFO_SHADING_MAP_SIZE: {
+            break;
+        }
+        case CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION: {
+            switch (value) {
+                case CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED:
+                    msg = "UNCALIBRATED";
+                    ret = 0;
+                    break;
+                case CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE:
+                    msg = "APPROXIMATE";
+                    ret = 0;
+                    break;
+                case CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED:
+                    msg = "CALIBRATED";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+
+        case CAMERA_NOISE_REDUCTION_MODE: {
+            switch (value) {
+                case CAMERA_NOISE_REDUCTION_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case CAMERA_NOISE_REDUCTION_MODE_FAST:
+                    msg = "FAST";
+                    ret = 0;
+                    break;
+                case CAMERA_NOISE_REDUCTION_MODE_HIGH_QUALITY:
+                    msg = "HIGH_QUALITY";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_NOISE_REDUCTION_STRENGTH: {
+            break;
+        }
+        case CAMERA_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES: {
+            break;
+        }
+
+        case CAMERA_REQUEST_ID: {
+            break;
+        }
+        case CAMERA_REQUEST_METADATA_MODE: {
+            switch (value) {
+                case CAMERA_REQUEST_METADATA_MODE_NONE:
+                    msg = "NONE";
+                    ret = 0;
+                    break;
+                case CAMERA_REQUEST_METADATA_MODE_FULL:
+                    msg = "FULL";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_REQUEST_MAX_NUM_OUTPUT_STREAMS: {
+            break;
+        }
+        case CAMERA_REQUEST_MAX_NUM_INPUT_STREAMS: {
+            break;
+        }
+        case CAMERA_REQUEST_PIPELINE_DEPTH: {
+            break;
+        }
+        case CAMERA_REQUEST_PIPELINE_MAX_DEPTH: {
+            break;
+        }
+        case CAMERA_REQUEST_PARTIAL_RESULT_COUNT: {
+            break;
+        }
+        case CAMERA_REQUEST_AVAILABLE_CAPABILITIES: {
+            switch (value) {
+                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE:
+                    msg = "BACKWARD_COMPATIBLE";
+                    ret = 0;
+                    break;
+                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR:
+                    msg = "MANUAL_SENSOR";
+                    ret = 0;
+                    break;
+                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING:
+                    msg = "MANUAL_POST_PROCESSING";
+                    ret = 0;
+                    break;
+                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_RAW:
+                    msg = "RAW";
+                    ret = 0;
+                    break;
+                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_ZSL:
+                    msg = "ZSL";
+                    ret = 0;
+                    break;
+                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS:
+                    msg = "READ_SENSOR_SETTINGS";
+                    ret = 0;
+                    break;
+                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE:
+                    msg = "BURST_CAPTURE";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_REQUEST_AVAILABLE_REQUEST_KEYS: {
+            break;
+        }
+        case CAMERA_REQUEST_AVAILABLE_RESULT_KEYS: {
+            break;
+        }
+        case CAMERA_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS: {
+            break;
+        }
+
+        case CAMERA_SCALER_CROP_REGION: {
+            break;
+        }
+        case CAMERA_SCALER_AVAILABLE_JPEG_SIZES: {
+            break;
+        }
+        case CAMERA_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM: {
+            break;
+        }
+        case CAMERA_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP: {
+            break;
+        }
+        case CAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS: {
+            break;
+        }
+        case CAMERA_SCALER_AVAILABLE_MIN_FRAME_DURATIONS: {
+            break;
+        }
+        case CAMERA_SCALER_CROPPING_TYPE: {
+            switch (value) {
+                case CAMERA_SCALER_CROPPING_TYPE_CENTER_ONLY:
+                    msg = "CENTER_ONLY";
+                    ret = 0;
+                    break;
+                case CAMERA_SCALER_CROPPING_TYPE_FREEFORM:
+                    msg = "FREEFORM";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+
+        case CAMERA_SENSOR_EXPOSURE_TIME: {
+            break;
+        }
+        case CAMERA_SENSOR_FRAME_DURATION: {
+            break;
+        }
+        case CAMERA_SENSOR_SENSITIVITY: {
+            break;
+        }
+        case CAMERA_SENSOR_REFERENCE_ILLUMINANT1: {
+            switch (value) {
+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT:
+                    msg = "DAYLIGHT";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_FLUORESCENT:
+                    msg = "FLUORESCENT";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_TUNGSTEN:
+                    msg = "TUNGSTEN";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_FLASH:
+                    msg = "FLASH";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_FINE_WEATHER:
+                    msg = "FINE_WEATHER";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_CLOUDY_WEATHER:
+                    msg = "CLOUDY_WEATHER";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_SHADE:
+                    msg = "SHADE";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT_FLUORESCENT:
+                    msg = "DAYLIGHT_FLUORESCENT";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAY_WHITE_FLUORESCENT:
+                    msg = "DAY_WHITE_FLUORESCENT";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_COOL_WHITE_FLUORESCENT:
+                    msg = "COOL_WHITE_FLUORESCENT";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_WHITE_FLUORESCENT:
+                    msg = "WHITE_FLUORESCENT";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_A:
+                    msg = "STANDARD_A";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_B:
+                    msg = "STANDARD_B";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_C:
+                    msg = "STANDARD_C";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D55:
+                    msg = "D55";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D65:
+                    msg = "D65";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D75:
+                    msg = "D75";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D50:
+                    msg = "D50";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN:
+                    msg = "ISO_STUDIO_TUNGSTEN";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_SENSOR_REFERENCE_ILLUMINANT2: {
+            break;
+        }
+        case CAMERA_SENSOR_CALIBRATION_TRANSFORM1: {
+            break;
+        }
+        case CAMERA_SENSOR_CALIBRATION_TRANSFORM2: {
+            break;
+        }
+        case CAMERA_SENSOR_COLOR_TRANSFORM1: {
+            break;
+        }
+        case CAMERA_SENSOR_COLOR_TRANSFORM2: {
+            break;
+        }
+        case CAMERA_SENSOR_FORWARD_MATRIX1: {
+            break;
+        }
+        case CAMERA_SENSOR_FORWARD_MATRIX2: {
+            break;
+        }
+        case CAMERA_SENSOR_BASE_GAIN_FACTOR: {
+            break;
+        }
+        case CAMERA_SENSOR_BLACK_LEVEL_PATTERN: {
+            break;
+        }
+        case CAMERA_SENSOR_MAX_ANALOG_SENSITIVITY: {
+            break;
+        }
+        case CAMERA_SENSOR_ORIENTATION: {
+            break;
+        }
+        case CAMERA_SENSOR_PROFILE_HUE_SAT_MAP_DIMENSIONS: {
+            break;
+        }
+        case CAMERA_SENSOR_TIMESTAMP: {
+            break;
+        }
+        case CAMERA_SENSOR_TEMPERATURE: {
+            break;
+        }
+        case CAMERA_SENSOR_NEUTRAL_COLOR_POINT: {
+            break;
+        }
+        case CAMERA_SENSOR_NOISE_PROFILE: {
+            break;
+        }
+        case CAMERA_SENSOR_PROFILE_HUE_SAT_MAP: {
+            break;
+        }
+        case CAMERA_SENSOR_PROFILE_TONE_CURVE: {
+            break;
+        }
+        case CAMERA_SENSOR_GREEN_SPLIT: {
+            break;
+        }
+        case CAMERA_SENSOR_TEST_PATTERN_DATA: {
+            break;
+        }
+        case CAMERA_SENSOR_TEST_PATTERN_MODE: {
+            switch (value) {
+                case CAMERA_SENSOR_TEST_PATTERN_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_TEST_PATTERN_MODE_SOLID_COLOR:
+                    msg = "SOLID_COLOR";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_TEST_PATTERN_MODE_COLOR_BARS:
+                    msg = "COLOR_BARS";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY:
+                    msg = "COLOR_BARS_FADE_TO_GRAY";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_TEST_PATTERN_MODE_PN9:
+                    msg = "PN9";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_TEST_PATTERN_MODE_CUSTOM1:
+                    msg = "CUSTOM1";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_SENSOR_AVAILABLE_TEST_PATTERN_MODES: {
+            break;
+        }
+        case CAMERA_SENSOR_OPAQUE_RAW_SIZE: {
+            break;
+        }
+        case CAMERA_SENSOR_ROLLING_SHUTTER_SKEW: {
+            break;
+        }
+
+        case CAMERA_SENSOR_INFO_ACTIVE_ARRAY_SIZE: {
+            break;
+        }
+        case CAMERA_SENSOR_INFO_SENSITIVITY_RANGE: {
+            break;
+        }
+        case CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT: {
+            switch (value) {
+                case CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGGB:
+                    msg = "RGGB";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GRBG:
+                    msg = "GRBG";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GBRG:
+                    msg = "GBRG";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_BGGR:
+                    msg = "BGGR";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGB:
+                    msg = "RGB";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE: {
+            break;
+        }
+        case CAMERA_SENSOR_INFO_MAX_FRAME_DURATION: {
+            break;
+        }
+        case CAMERA_SENSOR_INFO_PHYSICAL_SIZE: {
+            break;
+        }
+        case CAMERA_SENSOR_INFO_PIXEL_ARRAY_SIZE: {
+            break;
+        }
+        case CAMERA_SENSOR_INFO_WHITE_LEVEL: {
+            break;
+        }
+        case CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE: {
+            switch (value) {
+                case CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN:
+                    msg = "UNKNOWN";
+                    ret = 0;
+                    break;
+                case CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME:
+                    msg = "REALTIME";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+
+        case CAMERA_SHADING_MODE: {
+            switch (value) {
+                case CAMERA_SHADING_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case CAMERA_SHADING_MODE_FAST:
+                    msg = "FAST";
+                    ret = 0;
+                    break;
+                case CAMERA_SHADING_MODE_HIGH_QUALITY:
+                    msg = "HIGH_QUALITY";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_SHADING_STRENGTH: {
+            break;
+        }
+
+        case CAMERA_STATISTICS_FACE_DETECT_MODE: {
+            switch (value) {
+                case CAMERA_STATISTICS_FACE_DETECT_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case CAMERA_STATISTICS_FACE_DETECT_MODE_SIMPLE:
+                    msg = "SIMPLE";
+                    ret = 0;
+                    break;
+                case CAMERA_STATISTICS_FACE_DETECT_MODE_FULL:
+                    msg = "FULL";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_STATISTICS_HISTOGRAM_MODE: {
+            switch (value) {
+                case CAMERA_STATISTICS_HISTOGRAM_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case CAMERA_STATISTICS_HISTOGRAM_MODE_ON:
+                    msg = "ON";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_STATISTICS_SHARPNESS_MAP_MODE: {
+            switch (value) {
+                case CAMERA_STATISTICS_SHARPNESS_MAP_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case CAMERA_STATISTICS_SHARPNESS_MAP_MODE_ON:
+                    msg = "ON";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE: {
+            switch (value) {
+                case CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE_ON:
+                    msg = "ON";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_STATISTICS_FACE_IDS: {
+            break;
+        }
+        case CAMERA_STATISTICS_FACE_LANDMARKS: {
+            break;
+        }
+        case CAMERA_STATISTICS_FACE_RECTANGLES: {
+            break;
+        }
+        case CAMERA_STATISTICS_FACE_SCORES: {
+            break;
+        }
+        case CAMERA_STATISTICS_HISTOGRAM: {
+            break;
+        }
+        case CAMERA_STATISTICS_SHARPNESS_MAP: {
+            break;
+        }
+        case CAMERA_STATISTICS_LENS_SHADING_CORRECTION_MAP: {
+            break;
+        }
+        case CAMERA_STATISTICS_LENS_SHADING_MAP: {
+            break;
+        }
+        case CAMERA_STATISTICS_PREDICTED_COLOR_GAINS: {
+            break;
+        }
+        case CAMERA_STATISTICS_PREDICTED_COLOR_TRANSFORM: {
+            break;
+        }
+        case CAMERA_STATISTICS_SCENE_FLICKER: {
+            switch (value) {
+                case CAMERA_STATISTICS_SCENE_FLICKER_NONE:
+                    msg = "NONE";
+                    ret = 0;
+                    break;
+                case CAMERA_STATISTICS_SCENE_FLICKER_50HZ:
+                    msg = "50HZ";
+                    ret = 0;
+                    break;
+                case CAMERA_STATISTICS_SCENE_FLICKER_60HZ:
+                    msg = "60HZ";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_STATISTICS_HOT_PIXEL_MAP: {
+            break;
+        }
+        case CAMERA_STATISTICS_LENS_SHADING_MAP_MODE: {
+            switch (value) {
+                case CAMERA_STATISTICS_LENS_SHADING_MAP_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case CAMERA_STATISTICS_LENS_SHADING_MAP_MODE_ON:
+                    msg = "ON";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+
+        case CAMERA_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES: {
+            break;
+        }
+        case CAMERA_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT: {
+            break;
+        }
+        case CAMERA_STATISTICS_INFO_MAX_FACE_COUNT: {
+            break;
+        }
+        case CAMERA_STATISTICS_INFO_MAX_HISTOGRAM_COUNT: {
+            break;
+        }
+        case CAMERA_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE: {
+            break;
+        }
+        case CAMERA_STATISTICS_INFO_SHARPNESS_MAP_SIZE: {
+            break;
+        }
+        case CAMERA_STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES: {
+            break;
+        }
+
+        case CAMERA_TONEMAP_CURVE_BLUE: {
+            break;
+        }
+        case CAMERA_TONEMAP_CURVE_GREEN: {
+            break;
+        }
+        case CAMERA_TONEMAP_CURVE_RED: {
+            break;
+        }
+        case CAMERA_TONEMAP_MODE: {
+            switch (value) {
+                case CAMERA_TONEMAP_MODE_CONTRAST_CURVE:
+                    msg = "CONTRAST_CURVE";
+                    ret = 0;
+                    break;
+                case CAMERA_TONEMAP_MODE_FAST:
+                    msg = "FAST";
+                    ret = 0;
+                    break;
+                case CAMERA_TONEMAP_MODE_HIGH_QUALITY:
+                    msg = "HIGH_QUALITY";
+                    ret = 0;
+                    break;
+                case CAMERA_TONEMAP_MODE_GAMMA_VALUE:
+                    msg = "GAMMA_VALUE";
+                    ret = 0;
+                    break;
+                case CAMERA_TONEMAP_MODE_PRESET_CURVE:
+                    msg = "PRESET_CURVE";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_TONEMAP_MAX_CURVE_POINTS: {
+            break;
+        }
+        case CAMERA_TONEMAP_AVAILABLE_TONE_MAP_MODES: {
+            break;
+        }
+        case CAMERA_TONEMAP_GAMMA: {
+            break;
+        }
+        case CAMERA_TONEMAP_PRESET_CURVE: {
+            switch (value) {
+                case CAMERA_TONEMAP_PRESET_CURVE_SRGB:
+                    msg = "SRGB";
+                    ret = 0;
+                    break;
+                case CAMERA_TONEMAP_PRESET_CURVE_REC709:
+                    msg = "REC709";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+
+        case CAMERA_LED_TRANSMIT: {
+            switch (value) {
+                case CAMERA_LED_TRANSMIT_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case CAMERA_LED_TRANSMIT_ON:
+                    msg = "ON";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_LED_AVAILABLE_LEDS: {
+            switch (value) {
+                case CAMERA_LED_AVAILABLE_LEDS_TRANSMIT:
+                    msg = "TRANSMIT";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+
+        case CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL: {
+            switch (value) {
+                case CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED:
+                    msg = "LIMITED";
+                    ret = 0;
+                    break;
+                case CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL_FULL:
+                    msg = "FULL";
+                    ret = 0;
+                    break;
+                case CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY:
+                    msg = "LEGACY";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+
+        case CAMERA_BLACK_LEVEL_LOCK: {
+            switch (value) {
+                case CAMERA_BLACK_LEVEL_LOCK_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case CAMERA_BLACK_LEVEL_LOCK_ON:
+                    msg = "ON";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+
+        case CAMERA_SYNC_FRAME_NUMBER: {
+            switch (value) {
+                case CAMERA_SYNC_FRAME_NUMBER_CONVERGING:
+                    msg = "CONVERGING";
+                    ret = 0;
+                    break;
+                case CAMERA_SYNC_FRAME_NUMBER_UNKNOWN:
+                    msg = "UNKNOWN";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case CAMERA_SYNC_MAX_LATENCY: {
+            switch (value) {
+                case CAMERA_SYNC_MAX_LATENCY_PER_FRAME_CONTROL:
+                    msg = "PER_FRAME_CONTROL";
+                    ret = 0;
+                    break;
+                case CAMERA_SYNC_MAX_LATENCY_UNKNOWN:
+                    msg = "UNKNOWN";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+
+        case CAMERA_REPROCESS_MAX_CAPTURE_STALL: {
+            break;
+        }
+
+        case INTEL_INFO_AVAILABLE_FEATURES: {
+            switch (value) {
+                case INTEL_INFO_AVAILABLE_FEATURES_MANUAL_EXPOSURE:
+                    msg = "MANUAL_EXPOSURE";
+                    ret = 0;
+                    break;
+                case INTEL_INFO_AVAILABLE_FEATURES_MANUAL_WHITE_BALANCE:
+                    msg = "MANUAL_WHITE_BALANCE";
+                    ret = 0;
+                    break;
+                case INTEL_INFO_AVAILABLE_FEATURES_IMAGE_ENHANCEMENT:
+                    msg = "IMAGE_ENHANCEMENT";
+                    ret = 0;
+                    break;
+                case INTEL_INFO_AVAILABLE_FEATURES_NOISE_REDUCTION:
+                    msg = "NOISE_REDUCTION";
+                    ret = 0;
+                    break;
+                case INTEL_INFO_AVAILABLE_FEATURES_SCENE_MODE:
+                    msg = "SCENE_MODE";
+                    ret = 0;
+                    break;
+                case INTEL_INFO_AVAILABLE_FEATURES_WEIGHT_GRID_MODE:
+                    msg = "WEIGHT_GRID_MODE";
+                    ret = 0;
+                    break;
+                case INTEL_INFO_AVAILABLE_FEATURES_PER_FRAME_CONTROL:
+                    msg = "PER_FRAME_CONTROL";
+                    ret = 0;
+                    break;
+                case INTEL_INFO_AVAILABLE_FEATURES_ISP_CONTROL:
+                    msg = "ISP_CONTROL";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case INTEL_INFO_AE_EXPOSURE_TIME_RANGE: {
+            break;
+        }
+        case INTEL_INFO_AE_GAIN_RANGE: {
+            break;
+        }
+        case INTEL_INFO_WFOV: {
+            switch (value) {
+                case INTEL_INFO_WFOV_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case INTEL_INFO_WFOV_ON:
+                    msg = "ON";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case INTEL_INFO_SENSOR_MOUNT_TYPE: {
+            switch (value) {
+                case INTEL_INFO_SENSOR_MOUNT_TYPE_WALL_MOUNTED:
+                    msg = "WALL_MOUNTED";
+                    ret = 0;
+                    break;
+                case INTEL_INFO_SENSOR_MOUNT_TYPE_CEILING_MOUNTER:
+                    msg = "CEILING_MOUNTER";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+
+        case INTEL_CONTROL_IMAGE_ENHANCEMENT: {
+            break;
+        }
+        case INTEL_CONTROL_SENSITIVITY_GAIN: {
+            break;
+        }
+        case INTEL_CONTROL_FRAME_RATE: {
+            break;
+        }
+        case INTEL_CONTROL_AE_CONVERGE_SPEED: {
+            switch (value) {
+                case INTEL_CONTROL_AE_CONVERGE_SPEED_NORMAL:
+                    msg = "NORMAL";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_AE_CONVERGE_SPEED_MID:
+                    msg = "MID";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_AE_CONVERGE_SPEED_LOW:
+                    msg = "LOW";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case INTEL_CONTROL_NR_MODE: {
+            switch (value) {
+                case INTEL_CONTROL_NR_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_NR_MODE_AUTO:
+                    msg = "AUTO";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_NR_MODE_MANUAL_NORMAL:
+                    msg = "MANUAL_NORMAL";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_NR_MODE_MANUAL_EXPERT:
+                    msg = "MANUAL_EXPERT";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case INTEL_CONTROL_NR_LEVEL: {
+            break;
+        }
+        case INTEL_CONTROL_IRIS_MODE: {
+            switch (value) {
+                case INTEL_CONTROL_IRIS_MODE_AUTO:
+                    msg = "AUTO";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_IRIS_MODE_MANUAL:
+                    msg = "MANUAL";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_IRIS_MODE_CUSTOMIZED:
+                    msg = "CUSTOMIZED";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY: {
+            switch (value) {
+                case INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_AUTO:
+                    msg = "AUTO";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_SHUTTER:
+                    msg = "SHUTTER";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_ISO:
+                    msg = "ISO";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_APERTURE:
+                    msg = "APERTURE";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case INTEL_CONTROL_IRIS_LEVEL: {
+            break;
+        }
+        case INTEL_CONTROL_WDR_MODE: {
+            switch (value) {
+                case INTEL_CONTROL_WDR_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_WDR_MODE_ON:
+                    msg = "ON";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_WDR_MODE_AUTO:
+                    msg = "AUTO";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case INTEL_CONTROL_WDR_LEVEL: {
+            break;
+        }
+        case INTEL_CONTROL_BLC_AREA_MODE: {
+            switch (value) {
+                case INTEL_CONTROL_BLC_AREA_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_BLC_AREA_MODE_ON:
+                    msg = "ON";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case INTEL_CONTROL_SCENE_MODE: {
+            switch (value) {
+                case INTEL_CONTROL_SCENE_MODE_AUTO:
+                    msg = "AUTO";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_SCENE_MODE_HDR:
+                    msg = "HDR";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_SCENE_MODE_ULL:
+                    msg = "ULL";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_SCENE_MODE_VIDEO_LL:
+                    msg = "VIDEO_LL";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_SCENE_MODE_HDR2:
+                    msg = "HDR2";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case INTEL_CONTROL_WEIGHT_GRID_MODE: {
+            switch (value) {
+                case INTEL_CONTROL_WEIGHT_GRID_MODE_AUTO:
+                    msg = "AUTO";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_WEIGHT_GRID_MODE_CUSTOM_WEIGHT_GRID1:
+                    msg = "CUSTOM_WEIGHT_GRID1";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_WEIGHT_GRID_MODE_CUSTOM_WEIGHT_GRID2:
+                    msg = "CUSTOM_WEIGHT_GRID2";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_WEIGHT_GRID_MODE_CUSTOM_WEIGHT_GRID3:
+                    msg = "CUSTOM_WEIGHT_GRID3";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case INTEL_CONTROL_AE_CONVERGE_SPEED_MODE: {
+            switch (value) {
+                case INTEL_CONTROL_AE_CONVERGE_SPEED_MODE_HAL:
+                    msg = "HAL";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_AE_CONVERGE_SPEED_MODE_AIQ:
+                    msg = "AIQ";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case INTEL_CONTROL_DEINTERLACE_MODE: {
+            switch (value) {
+                case INTEL_CONTROL_DEINTERLACE_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_DEINTERLACE_MODE_WEAVING:
+                    msg = "WEAVING";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case INTEL_CONTROL_MAKERNOTE_DATA: {
+            break;
+        }
+        case INTEL_CONTROL_CUSTOM_AIC_PARAM: {
+            break;
+        }
+        case INTEL_CONTROL_MAKERNOTE_MODE: {
+            switch (value) {
+                case INTEL_CONTROL_MAKERNOTE_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_MAKERNOTE_MODE_JPEG:
+                    msg = "JPEG";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_MAKERNOTE_MODE_RAW:
+                    msg = "RAW";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case INTEL_CONTROL_YUV_COLOR_RANGE: {
+            switch (value) {
+                case INTEL_CONTROL_YUV_COLOR_RANGE_FULL:
+                    msg = "FULL";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_YUV_COLOR_RANGE_REDUCED:
+                    msg = "REDUCED";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case INTEL_CONTROL_SENSITIVITY_GAIN_RANGE: {
+            break;
+        }
+        case INTEL_CONTROL_EXPOSURE_TIME_RANGE: {
+            break;
+        }
+        case INTEL_CONTROL_FISHEYE_DEWARPING_MODE: {
+            switch (value) {
+                case INTEL_CONTROL_FISHEYE_DEWARPING_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_FISHEYE_DEWARPING_MODE_REARVIEW:
+                    msg = "REARVIEW";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_FISHEYE_DEWARPING_MODE_HITCHVIEW:
+                    msg = "HITCHVIEW";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case INTEL_CONTROL_LTM_TUNING_DATA: {
+            break;
+        }
+        case INTEL_CONTROL_DIGITAL_ZOOM_RATIO: {
+            break;
+        }
+        case INTEL_CONTROL_LDC_MODE: {
+            switch (value) {
+                case INTEL_CONTROL_LDC_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_LDC_MODE_ON:
+                    msg = "ON";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case INTEL_CONTROL_RSC_MODE: {
+            switch (value) {
+                case INTEL_CONTROL_RSC_MODE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_RSC_MODE_ON:
+                    msg = "ON";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case INTEL_CONTROL_FLIP_MODE: {
+            switch (value) {
+                case INTEL_CONTROL_FLIP_MODE_NONE:
+                    msg = "NONE";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_FLIP_MODE_VFLIP:
+                    msg = "VFLIP";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_FLIP_MODE_HFLIP:
+                    msg = "HFLIP";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_FLIP_MODE_VHFLIP:
+                    msg = "VHFLIP";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case INTEL_CONTROL_MONO_DOWNSCALE: {
+            switch (value) {
+                case INTEL_CONTROL_MONO_DOWNSCALE_OFF:
+                    msg = "OFF";
+                    ret = 0;
+                    break;
+                case INTEL_CONTROL_MONO_DOWNSCALE_ON:
+                    msg = "ON";
+                    ret = 0;
+                    break;
+                default:
+                    msg = "error: enum value out of range";
+            }
+            break;
+        }
+        case INTEL_CONTROL_RUN3_A_CADENCE: {
+            break;
+        }
+        case INTEL_CONTROL_VIEW_PROJECTION: {
+            break;
+        }
+        case INTEL_CONTROL_VIEW_ROTATION: {
+            break;
+        }
+        case INTEL_CONTROL_VIEW_FINE_ADJUSTMENTS: {
+            break;
+        }
+        case INTEL_CONTROL_CAMERA_ROTATION: {
+            break;
+        }
+
+        case INTEL_CONTROL_ISP_SUPPORTED_CTRL_IDS: {
+            break;
+        }
+        case INTEL_CONTROL_ISP_ENABLED_CTRL_IDS: {
+            break;
+        }
+        case INTEL_CONTROL_ISP_WB_GAINS: {
+            break;
+        }
+        case INTEL_CONTROL_ISP_COLOR_CORRECTION_MATRIX: {
+            break;
+        }
+        case INTEL_CONTROL_ISP_ADVANCED_COLOR_CORRECTION_MATRIX: {
+            break;
+        }
+        case INTEL_CONTROL_ISP_BXT_CSC: {
+            break;
+        }
+        case INTEL_CONTROL_ISP_BXT_DEMOSAIC: {
+            break;
+        }
+        case INTEL_CONTROL_ISP_SC_IEFD: {
+            break;
+        }
+        case INTEL_CONTROL_ISP_SEE: {
+            break;
+        }
+        case INTEL_CONTROL_ISP_BNLM: {
+            break;
+        }
+        case INTEL_CONTROL_ISP_TNR5_21: {
+            break;
+        }
+        case INTEL_CONTROL_ISP_XNR_DSS: {
+            break;
+        }
+        case INTEL_CONTROL_ISP_GAMMA_TONE_MAP: {
+            break;
+        }
+        case INTEL_CONTROL_ISP_TNR5_22: {
+            break;
+        }
+        case INTEL_CONTROL_ISP_TNR5_25: {
+            break;
+        }
+
+    }
+
+    snprintf(dst, size, "%s", msg);
+    dst[size - 1] = '\0';
+
+    return ret;
+}
+
+#define ICAMERA_METADATA_ENUM_STRING_MAX_SIZE 24
diff --git a/camera/hal/intel/ipu6/src/metadata/icamera_metadata_tags.h b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_tags.h
new file mode 100644
index 000000000000..76f0c49b8a8a
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_tags.h
@@ -0,0 +1,999 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2015-2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * !! Do not include this file directly !!
+ *
+ * Include icamera_metadata_base.h instead.
+ */
+
+/**
+ * ! Do not edit this file directly !
+ *
+ * Generated automatically from icamera_metadata_tags.mako
+ */
+
+/**
+ * Top level hierarchy definitions for camera metadata. *_INFO sections are for
+ * the static metadata that can be retrived without opening the camera device.
+ * New sections must be added right before CAMERA_SECTION_COUNT to maintain
+ * existing enumerations.
+ */
+typedef enum icamera_metadata_section {
+    CAMERA_AE,
+    CAMERA_AWB,
+    CAMERA_AF,
+    CAMERA_CONTROL,
+    CAMERA_DEMOSAIC,
+    CAMERA_EDGE,
+    CAMERA_FLASH,
+    CAMERA_FLASH_INFO,
+    CAMERA_HOT_PIXEL,
+    CAMERA_JPEG,
+    CAMERA_LENS,
+    CAMERA_LENS_INFO,
+    CAMERA_NOISE_REDUCTION,
+    CAMERA_REQUEST,
+    CAMERA_SCALER,
+    CAMERA_SENSOR,
+    CAMERA_SENSOR_INFO,
+    CAMERA_SHADING,
+    CAMERA_STATISTICS,
+    CAMERA_STATISTICS_INFO,
+    CAMERA_TONEMAP,
+    CAMERA_LED,
+    CAMERA_INFO,
+    CAMERA_BLACK_LEVEL,
+    CAMERA_SYNC,
+    CAMERA_REPROCESS,
+    INTEL_INFO,
+    INTEL_CONTROL,
+    INTEL_CONTROL_ISP,
+    CAMERA_SECTION_COUNT
+} icamera_metadata_section_t;
+
+/**
+ * Hierarchy positions in enum space.
+ */
+typedef enum icamera_metadata_section_start {
+    CAMERA_AE_START                = CAMERA_AE                 << 16,
+    CAMERA_AWB_START               = CAMERA_AWB                << 16,
+    CAMERA_AF_START                = CAMERA_AF                 << 16,
+    CAMERA_CONTROL_START           = CAMERA_CONTROL            << 16,
+    CAMERA_DEMOSAIC_START          = CAMERA_DEMOSAIC           << 16,
+    CAMERA_EDGE_START              = CAMERA_EDGE               << 16,
+    CAMERA_FLASH_START             = CAMERA_FLASH              << 16,
+    CAMERA_FLASH_INFO_START        = CAMERA_FLASH_INFO         << 16,
+    CAMERA_HOT_PIXEL_START         = CAMERA_HOT_PIXEL          << 16,
+    CAMERA_JPEG_START              = CAMERA_JPEG               << 16,
+    CAMERA_LENS_START              = CAMERA_LENS               << 16,
+    CAMERA_LENS_INFO_START         = CAMERA_LENS_INFO          << 16,
+    CAMERA_NOISE_REDUCTION_START   = CAMERA_NOISE_REDUCTION    << 16,
+    CAMERA_REQUEST_START           = CAMERA_REQUEST            << 16,
+    CAMERA_SCALER_START            = CAMERA_SCALER             << 16,
+    CAMERA_SENSOR_START            = CAMERA_SENSOR             << 16,
+    CAMERA_SENSOR_INFO_START       = CAMERA_SENSOR_INFO        << 16,
+    CAMERA_SHADING_START           = CAMERA_SHADING            << 16,
+    CAMERA_STATISTICS_START        = CAMERA_STATISTICS         << 16,
+    CAMERA_STATISTICS_INFO_START   = CAMERA_STATISTICS_INFO    << 16,
+    CAMERA_TONEMAP_START           = CAMERA_TONEMAP            << 16,
+    CAMERA_LED_START               = CAMERA_LED                << 16,
+    CAMERA_INFO_START              = CAMERA_INFO               << 16,
+    CAMERA_BLACK_LEVEL_START       = CAMERA_BLACK_LEVEL        << 16,
+    CAMERA_SYNC_START              = CAMERA_SYNC               << 16,
+    CAMERA_REPROCESS_START         = CAMERA_REPROCESS          << 16,
+    INTEL_INFO_START               = INTEL_INFO                << 16,
+    INTEL_CONTROL_START            = INTEL_CONTROL             << 16,
+    INTEL_CONTROL_ISP_START        = INTEL_CONTROL_ISP         << 16,
+} icamera_metadata_section_start_t;
+
+/**
+ * Main enum for defining camera metadata tags.  New entries must always go
+ * before the section _END tag to preserve existing enumeration values.  In
+ * addition, the name and type of the tag needs to be added to
+ * src/metadata/icamera_metadata_tag_info.c
+ */
+typedef enum icamera_metadata_tag {
+    CAMERA_AE_MODE =                                  // enum         | public
+            CAMERA_AE_START,
+    CAMERA_AE_LOCK,                                   // enum         | public
+    CAMERA_AE_REGIONS,                                // int32[]      | public
+    CAMERA_AE_ANTIBANDING_MODE,                       // enum         | public
+    CAMERA_AE_COMPENSATION,                           // int32        | public
+    CAMERA_AE_TARGET_FPS_RANGE,                       // float[]      | public
+    CAMERA_AE_PRECAPTURE_TRIGGER,                     // enum         | public
+    CAMERA_AE_STATE,                                  // enum         | public
+    CAMERA_AE_AVAILABLE_MODES,                        // byte[]       | public
+    CAMERA_AE_AVAILABLE_ANTIBANDING_MODES,            // byte[]       | public
+    CAMERA_AE_COMPENSATION_STEP,                      // rational     | public
+    CAMERA_AE_COMPENSATION_RANGE,                     // int32[]      | public
+    CAMERA_AE_AVAILABLE_TARGET_FPS_RANGES,            // float[]      | public
+    CAMERA_AE_LOCK_AVAILABLE,                         // enum         | public
+    CAMERA_AE_END,
+
+    CAMERA_AWB_MODE =                                 // enum         | public
+            CAMERA_AWB_START,
+    CAMERA_AWB_COLOR_TRANSFORM,                       // float[]      | public
+    CAMERA_AWB_COLOR_GAINS,                           // float[]      | public
+    CAMERA_AWB_LOCK,                                  // enum         | public
+    CAMERA_AWB_REGIONS,                               // int32[]      | public
+    CAMERA_AWB_CCT_RANGE,                             // int32[]      | public
+    CAMERA_AWB_GAINS,                                 // int32[]      | public
+    CAMERA_AWB_GAIN_SHIFT,                            // int32[]      | public
+    CAMERA_AWB_WHITE_POINT,                           // int32[]      | public
+    CAMERA_AWB_CONVERGE_SPEED,                        // enum         | public
+    CAMERA_AWB_CONVERGE_SPEED_MODE,                   // enum         | public
+    CAMERA_AWB_STATE,                                 // enum         | public
+    CAMERA_AWB_RESULT,                                // byte[]       | public
+    CAMERA_AWB_AVAILABLE_MODES,                       // byte[]       | public
+    CAMERA_AWB_LOCK_AVAILABLE,                        // enum         | public
+    CAMERA_AWB_END,
+
+    CAMERA_AF_MODE =                                  // enum         | public
+            CAMERA_AF_START,
+    CAMERA_AF_REGIONS,                                // int32[]      | public
+    CAMERA_AF_TRIGGER,                                // enum         | public
+    CAMERA_AF_AVAILABLE_MODES,                        // byte[]       | public
+    CAMERA_AF_STATE,                                  // enum         | public
+    CAMERA_AF_END,
+
+    CAMERA_CONTROL_EFFECT_MODE =                      // enum         | public
+            CAMERA_CONTROL_START,
+    CAMERA_CONTROL_MODE,                              // enum         | public
+    CAMERA_CONTROL_SCENE_MODE,                        // enum         | public
+    CAMERA_CONTROL_VIDEO_STABILIZATION_MODE,          // enum         | public
+    CAMERA_CONTROL_AVAILABLE_EFFECTS,                 // byte[]       | public
+    CAMERA_CONTROL_AVAILABLE_MODES,                   // byte[]       | public
+    CAMERA_CONTROL_AVAILABLE_SCENE_MODES,             // byte[]       | public
+    CAMERA_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
+                                                      // byte[]       | public
+    CAMERA_CONTROL_MAX_REGIONS,                       // int32[]      | hidden
+    CAMERA_CONTROL_SCENE_MODE_OVERRIDES,              // byte[]       | system
+    CAMERA_CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS,
+                                                      // int32[]      | hidden
+    CAMERA_CONTROL_END,
+
+    CAMERA_DEMOSAIC_MODE =                            // enum         | system
+            CAMERA_DEMOSAIC_START,
+    CAMERA_DEMOSAIC_END,
+
+    CAMERA_EDGE_MODE =                                // enum         | public
+            CAMERA_EDGE_START,
+    CAMERA_EDGE_STRENGTH,                             // byte         | system
+    CAMERA_EDGE_AVAILABLE_EDGE_MODES,                 // byte[]       | public
+    CAMERA_EDGE_END,
+
+    CAMERA_FLASH_FIRING_POWER =                       // byte         | system
+            CAMERA_FLASH_START,
+    CAMERA_FLASH_FIRING_TIME,                         // int64        | system
+    CAMERA_FLASH_MODE,                                // enum         | public
+    CAMERA_FLASH_COLOR_TEMPERATURE,                   // byte         | system
+    CAMERA_FLASH_MAX_ENERGY,                          // byte         | system
+    CAMERA_FLASH_STATE,                               // enum         | public
+    CAMERA_FLASH_END,
+
+    CAMERA_FLASH_INFO_AVAILABLE =                     // enum         | public
+            CAMERA_FLASH_INFO_START,
+    CAMERA_FLASH_INFO_CHARGE_DURATION,                // int64        | system
+    CAMERA_FLASH_INFO_END,
+
+    CAMERA_HOT_PIXEL_MODE =                           // enum         | public
+            CAMERA_HOT_PIXEL_START,
+    CAMERA_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES,       // byte[]       | public
+    CAMERA_HOT_PIXEL_END,
+
+    CAMERA_JPEG_GPS_COORDINATES =                     // double[]     | hidden
+            CAMERA_JPEG_START,
+    CAMERA_JPEG_GPS_PROCESSING_METHOD,                // byte         | hidden
+    CAMERA_JPEG_GPS_TIMESTAMP,                        // int64        | hidden
+    CAMERA_JPEG_ORIENTATION,                          // int32        | public
+    CAMERA_JPEG_QUALITY,                              // byte         | public
+    CAMERA_JPEG_THUMBNAIL_QUALITY,                    // byte         | public
+    CAMERA_JPEG_THUMBNAIL_SIZE,                       // int32[]      | public
+    CAMERA_JPEG_AVAILABLE_THUMBNAIL_SIZES,            // int32[]      | public
+    CAMERA_JPEG_MAX_SIZE,                             // int32        | system
+    CAMERA_JPEG_SIZE,                                 // int32        | system
+    CAMERA_JPEG_END,
+
+    CAMERA_LENS_APERTURE =                            // float        | public
+            CAMERA_LENS_START,
+    CAMERA_LENS_FILTER_DENSITY,                       // float        | public
+    CAMERA_LENS_FOCAL_LENGTH,                         // float        | public
+    CAMERA_LENS_FOCUS_DISTANCE,                       // float        | public
+    CAMERA_LENS_OPTICAL_STABILIZATION_MODE,           // enum         | public
+    CAMERA_LENS_FACING,                               // enum         | public
+    CAMERA_LENS_FOCUS_RANGE,                          // float[]      | public
+    CAMERA_LENS_STATE,                                // enum         | public
+    CAMERA_LENS_END,
+
+    CAMERA_LENS_INFO_AVAILABLE_APERTURES =            // float[]      | public
+            CAMERA_LENS_INFO_START,
+    CAMERA_LENS_INFO_AVAILABLE_FILTER_DENSITIES,      // float[]      | public
+    CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,         // float[]      | public
+    CAMERA_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, // byte[]       | public
+    CAMERA_LENS_INFO_HYPERFOCAL_DISTANCE,             // float        | public
+    CAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE,          // float        | public
+    CAMERA_LENS_INFO_SHADING_MAP_SIZE,                // int32[]      | hidden
+    CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION,      // enum         | public
+    CAMERA_LENS_INFO_END,
+
+    CAMERA_NOISE_REDUCTION_MODE =                     // enum         | public
+            CAMERA_NOISE_REDUCTION_START,
+    CAMERA_NOISE_REDUCTION_STRENGTH,                  // byte         | system
+    CAMERA_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES,
+                                                      // byte[]       | public
+    CAMERA_NOISE_REDUCTION_END,
+
+    CAMERA_REQUEST_ID =                               // int32        | hidden
+            CAMERA_REQUEST_START,
+    CAMERA_REQUEST_METADATA_MODE,                     // enum         | system
+    CAMERA_REQUEST_MAX_NUM_OUTPUT_STREAMS,            // int32[]      | hidden
+    CAMERA_REQUEST_MAX_NUM_INPUT_STREAMS,             // int32        | hidden
+    CAMERA_REQUEST_PIPELINE_DEPTH,                    // byte         | public
+    CAMERA_REQUEST_PIPELINE_MAX_DEPTH,                // byte         | public
+    CAMERA_REQUEST_PARTIAL_RESULT_COUNT,              // int32        | public
+    CAMERA_REQUEST_AVAILABLE_CAPABILITIES,            // enum[]       | public
+    CAMERA_REQUEST_AVAILABLE_REQUEST_KEYS,            // int32[]      | hidden
+    CAMERA_REQUEST_AVAILABLE_RESULT_KEYS,             // int32[]      | hidden
+    CAMERA_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS,    // int32[]      | hidden
+    CAMERA_REQUEST_END,
+
+    CAMERA_SCALER_CROP_REGION =                       // int32[]      | public
+            CAMERA_SCALER_START,
+    CAMERA_SCALER_AVAILABLE_JPEG_SIZES,               // int32[]      | hidden
+    CAMERA_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,         // float        | public
+    CAMERA_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP, // int32[]      | hidden
+    CAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,    // int32[]      | hidden
+    CAMERA_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,      // int64[]      | hidden
+    CAMERA_SCALER_CROPPING_TYPE,                      // enum         | public
+    CAMERA_SCALER_END,
+
+    CAMERA_SENSOR_EXPOSURE_TIME =                     // int64        | public
+            CAMERA_SENSOR_START,
+    CAMERA_SENSOR_FRAME_DURATION,                     // int64        | public
+    CAMERA_SENSOR_SENSITIVITY,                        // int32        | public
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1,              // enum         | public
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT2,              // byte         | public
+    CAMERA_SENSOR_CALIBRATION_TRANSFORM1,             // rational[]   | public
+    CAMERA_SENSOR_CALIBRATION_TRANSFORM2,             // rational[]   | public
+    CAMERA_SENSOR_COLOR_TRANSFORM1,                   // rational[]   | public
+    CAMERA_SENSOR_COLOR_TRANSFORM2,                   // rational[]   | public
+    CAMERA_SENSOR_FORWARD_MATRIX1,                    // rational[]   | public
+    CAMERA_SENSOR_FORWARD_MATRIX2,                    // rational[]   | public
+    CAMERA_SENSOR_BASE_GAIN_FACTOR,                   // rational     | system
+    CAMERA_SENSOR_BLACK_LEVEL_PATTERN,                // int32[]      | public
+    CAMERA_SENSOR_MAX_ANALOG_SENSITIVITY,             // int32        | public
+    CAMERA_SENSOR_ORIENTATION,                        // int32        | public
+    CAMERA_SENSOR_PROFILE_HUE_SAT_MAP_DIMENSIONS,     // int32[]      | system
+    CAMERA_SENSOR_TIMESTAMP,                          // int64        | public
+    CAMERA_SENSOR_TEMPERATURE,                        // float        | system
+    CAMERA_SENSOR_NEUTRAL_COLOR_POINT,                // rational[]   | public
+    CAMERA_SENSOR_NOISE_PROFILE,                      // double[]     | public
+    CAMERA_SENSOR_PROFILE_HUE_SAT_MAP,                // float[]      | system
+    CAMERA_SENSOR_PROFILE_TONE_CURVE,                 // float[]      | system
+    CAMERA_SENSOR_GREEN_SPLIT,                        // float        | public
+    CAMERA_SENSOR_TEST_PATTERN_DATA,                  // int32[]      | public
+    CAMERA_SENSOR_TEST_PATTERN_MODE,                  // enum         | public
+    CAMERA_SENSOR_AVAILABLE_TEST_PATTERN_MODES,       // int32[]      | public
+    CAMERA_SENSOR_OPAQUE_RAW_SIZE,                    // int32[]      | system
+    CAMERA_SENSOR_ROLLING_SHUTTER_SKEW,               // int64        | public
+    CAMERA_SENSOR_END,
+
+    CAMERA_SENSOR_INFO_ACTIVE_ARRAY_SIZE =            // int32[]      | public
+            CAMERA_SENSOR_INFO_START,
+    CAMERA_SENSOR_INFO_SENSITIVITY_RANGE,             // int32[]      | public
+    CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,      // enum         | public
+    CAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE,           // int64[]      | public
+    CAMERA_SENSOR_INFO_MAX_FRAME_DURATION,            // int64        | public
+    CAMERA_SENSOR_INFO_PHYSICAL_SIZE,                 // float[]      | public
+    CAMERA_SENSOR_INFO_PIXEL_ARRAY_SIZE,              // int32[]      | public
+    CAMERA_SENSOR_INFO_WHITE_LEVEL,                   // int32        | public
+    CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE,              // enum         | public
+    CAMERA_SENSOR_INFO_END,
+
+    CAMERA_SHADING_MODE =                             // enum         | public
+            CAMERA_SHADING_START,
+    CAMERA_SHADING_STRENGTH,                          // byte         | system
+    CAMERA_SHADING_END,
+
+    CAMERA_STATISTICS_FACE_DETECT_MODE =              // enum         | public
+            CAMERA_STATISTICS_START,
+    CAMERA_STATISTICS_HISTOGRAM_MODE,                 // enum         | system
+    CAMERA_STATISTICS_SHARPNESS_MAP_MODE,             // enum         | system
+    CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE,             // enum         | public
+    CAMERA_STATISTICS_FACE_IDS,                       // int32[]      | hidden
+    CAMERA_STATISTICS_FACE_LANDMARKS,                 // int32[]      | hidden
+    CAMERA_STATISTICS_FACE_RECTANGLES,                // int32[]      | hidden
+    CAMERA_STATISTICS_FACE_SCORES,                    // byte[]       | hidden
+    CAMERA_STATISTICS_HISTOGRAM,                      // int32[]      | system
+    CAMERA_STATISTICS_SHARPNESS_MAP,                  // int32[]      | system
+    CAMERA_STATISTICS_LENS_SHADING_CORRECTION_MAP,    // byte         | public
+    CAMERA_STATISTICS_LENS_SHADING_MAP,               // float[]      | hidden
+    CAMERA_STATISTICS_PREDICTED_COLOR_GAINS,          // float[]      | hidden
+    CAMERA_STATISTICS_PREDICTED_COLOR_TRANSFORM,      // rational[]   | hidden
+    CAMERA_STATISTICS_SCENE_FLICKER,                  // enum         | public
+    CAMERA_STATISTICS_HOT_PIXEL_MAP,                  // int32[]      | public
+    CAMERA_STATISTICS_LENS_SHADING_MAP_MODE,          // enum         | public
+    CAMERA_STATISTICS_END,
+
+    CAMERA_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES = 
+                                                      // byte[]       | public
+            CAMERA_STATISTICS_INFO_START,
+    CAMERA_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,    // int32        | system
+    CAMERA_STATISTICS_INFO_MAX_FACE_COUNT,            // int32        | public
+    CAMERA_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,       // int32        | system
+    CAMERA_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,   // int32        | system
+    CAMERA_STATISTICS_INFO_SHARPNESS_MAP_SIZE,        // int32[]      | system
+    CAMERA_STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES,
+                                                      // byte[]       | public
+    CAMERA_STATISTICS_INFO_END,
+
+    CAMERA_TONEMAP_CURVE_BLUE =                       // float[]      | public
+            CAMERA_TONEMAP_START,
+    CAMERA_TONEMAP_CURVE_GREEN,                       // float[]      | public
+    CAMERA_TONEMAP_CURVE_RED,                         // float[]      | public
+    CAMERA_TONEMAP_MODE,                              // enum         | public
+    CAMERA_TONEMAP_MAX_CURVE_POINTS,                  // int32        | public
+    CAMERA_TONEMAP_AVAILABLE_TONE_MAP_MODES,          // byte[]       | public
+    CAMERA_TONEMAP_GAMMA,                             // float        | public
+    CAMERA_TONEMAP_PRESET_CURVE,                      // enum         | public
+    CAMERA_TONEMAP_END,
+
+    CAMERA_LED_TRANSMIT =                             // enum         | hidden
+            CAMERA_LED_START,
+    CAMERA_LED_AVAILABLE_LEDS,                        // enum[]       | hidden
+    CAMERA_LED_END,
+
+    CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL =            // enum         | public
+            CAMERA_INFO_START,
+    CAMERA_INFO_END,
+
+    CAMERA_BLACK_LEVEL_LOCK =                         // enum         | public
+            CAMERA_BLACK_LEVEL_START,
+    CAMERA_BLACK_LEVEL_END,
+
+    CAMERA_SYNC_FRAME_NUMBER =                        // enum         | hidden
+            CAMERA_SYNC_START,
+    CAMERA_SYNC_MAX_LATENCY,                          // enum         | public
+    CAMERA_SYNC_END,
+
+    CAMERA_REPROCESS_MAX_CAPTURE_STALL =              // int32        | public
+            CAMERA_REPROCESS_START,
+    CAMERA_REPROCESS_END,
+
+    INTEL_INFO_AVAILABLE_FEATURES =                   // enum[]       | public
+            INTEL_INFO_START,
+    INTEL_INFO_AE_EXPOSURE_TIME_RANGE,                // int32[]      | public
+    INTEL_INFO_AE_GAIN_RANGE,                         // int32[]      | public
+    INTEL_INFO_WFOV,                                  // enum         | public
+    INTEL_INFO_SENSOR_MOUNT_TYPE,                     // enum         | public
+    INTEL_INFO_END,
+
+    INTEL_CONTROL_IMAGE_ENHANCEMENT =                 // int32        | public
+            INTEL_CONTROL_START,
+    INTEL_CONTROL_SENSITIVITY_GAIN,                   // float        | public
+    INTEL_CONTROL_FRAME_RATE,                         // float        | public
+    INTEL_CONTROL_AE_CONVERGE_SPEED,                  // enum         | public
+    INTEL_CONTROL_NR_MODE,                            // enum         | public
+    INTEL_CONTROL_NR_LEVEL,                           // int32[]      | public
+    INTEL_CONTROL_IRIS_MODE,                          // enum         | public
+    INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY,           // enum         | public
+    INTEL_CONTROL_IRIS_LEVEL,                         // int32        | public
+    INTEL_CONTROL_WDR_MODE,                           // enum         | public
+    INTEL_CONTROL_WDR_LEVEL,                          // byte         | public
+    INTEL_CONTROL_BLC_AREA_MODE,                      // enum         | public
+    INTEL_CONTROL_SCENE_MODE,                         // enum         | public
+    INTEL_CONTROL_WEIGHT_GRID_MODE,                   // enum         | public
+    INTEL_CONTROL_AE_CONVERGE_SPEED_MODE,             // enum         | public
+    INTEL_CONTROL_DEINTERLACE_MODE,                   // enum         | public
+    INTEL_CONTROL_MAKERNOTE_DATA,                     // byte         | public
+    INTEL_CONTROL_CUSTOM_AIC_PARAM,                   // byte         | public
+    INTEL_CONTROL_MAKERNOTE_MODE,                     // enum         | public
+    INTEL_CONTROL_YUV_COLOR_RANGE,                    // enum         | public
+    INTEL_CONTROL_SENSITIVITY_GAIN_RANGE,             // float[]      | public
+    INTEL_CONTROL_EXPOSURE_TIME_RANGE,                // int32[]      | public
+    INTEL_CONTROL_FISHEYE_DEWARPING_MODE,             // enum         | public
+    INTEL_CONTROL_LTM_TUNING_DATA,                    // byte[]       | public
+    INTEL_CONTROL_DIGITAL_ZOOM_RATIO,                 // float        | public
+    INTEL_CONTROL_LDC_MODE,                           // enum         | public
+    INTEL_CONTROL_RSC_MODE,                           // enum         | public
+    INTEL_CONTROL_FLIP_MODE,                          // enum         | public
+    INTEL_CONTROL_MONO_DOWNSCALE,                     // enum         | public
+    INTEL_CONTROL_RUN3_A_CADENCE,                     // int32        | public
+    INTEL_CONTROL_VIEW_PROJECTION,                    // byte[]       | public
+    INTEL_CONTROL_VIEW_ROTATION,                      // byte[]       | public
+    INTEL_CONTROL_VIEW_FINE_ADJUSTMENTS,              // byte[]       | public
+    INTEL_CONTROL_CAMERA_ROTATION,                    // byte[]       | public
+    INTEL_CONTROL_END,
+
+    INTEL_CONTROL_ISP_SUPPORTED_CTRL_IDS =            // int32[]      | public
+            INTEL_CONTROL_ISP_START,
+    INTEL_CONTROL_ISP_ENABLED_CTRL_IDS,               // int32[]      | public
+    INTEL_CONTROL_ISP_WB_GAINS,                       // byte[]       | public
+    INTEL_CONTROL_ISP_COLOR_CORRECTION_MATRIX,        // byte[]       | public
+    INTEL_CONTROL_ISP_ADVANCED_COLOR_CORRECTION_MATRIX,
+                                                      // byte[]       | public
+    INTEL_CONTROL_ISP_BXT_CSC,                        // byte[]       | public
+    INTEL_CONTROL_ISP_BXT_DEMOSAIC,                   // byte[]       | public
+    INTEL_CONTROL_ISP_SC_IEFD,                        // byte[]       | public
+    INTEL_CONTROL_ISP_SEE,                            // byte[]       | public
+    INTEL_CONTROL_ISP_BNLM,                           // byte[]       | public
+    INTEL_CONTROL_ISP_TNR5_21,                        // byte[]       | public
+    INTEL_CONTROL_ISP_XNR_DSS,                        // byte[]       | public
+    INTEL_CONTROL_ISP_GAMMA_TONE_MAP,                 // byte[]       | public
+    INTEL_CONTROL_ISP_TNR5_22,                        // byte[]       | public
+    INTEL_CONTROL_ISP_TNR5_25,                        // byte[]       | public
+    INTEL_CONTROL_ISP_END,
+
+} icamera_metadata_tag_t;
+
+/**
+ * Enumeration definitions for the various entries that need them
+ */
+
+// CAMERA_AE_MODE
+typedef enum icamera_metadata_enum_camera_ae_mode {
+    CAMERA_AE_MODE_MANUAL,
+    CAMERA_AE_MODE_AUTO,
+} icamera_metadata_enum_camera_ae_mode_t;
+
+// CAMERA_AE_LOCK
+typedef enum icamera_metadata_enum_camera_ae_lock {
+    CAMERA_AE_LOCK_OFF,
+    CAMERA_AE_LOCK_ON,
+} icamera_metadata_enum_camera_ae_lock_t;
+
+// CAMERA_AE_ANTIBANDING_MODE
+typedef enum icamera_metadata_enum_camera_ae_antibanding_mode {
+    CAMERA_AE_ANTIBANDING_MODE_AUTO,
+    CAMERA_AE_ANTIBANDING_MODE_50HZ,
+    CAMERA_AE_ANTIBANDING_MODE_60HZ,
+    CAMERA_AE_ANTIBANDING_MODE_OFF,
+} icamera_metadata_enum_camera_ae_antibanding_mode_t;
+
+// CAMERA_AE_PRECAPTURE_TRIGGER
+typedef enum icamera_metadata_enum_camera_ae_precapture_trigger {
+    CAMERA_AE_PRECAPTURE_TRIGGER_IDLE,
+    CAMERA_AE_PRECAPTURE_TRIGGER_START,
+} icamera_metadata_enum_camera_ae_precapture_trigger_t;
+
+// CAMERA_AE_STATE
+typedef enum icamera_metadata_enum_camera_ae_state {
+    CAMERA_AE_STATE_INACTIVE,
+    CAMERA_AE_STATE_SEARCHING,
+    CAMERA_AE_STATE_CONVERGED,
+    CAMERA_AE_STATE_LOCKED,
+    CAMERA_AE_STATE_FLASH_REQUIRED,
+    CAMERA_AE_STATE_PRECAPTURE,
+} icamera_metadata_enum_camera_ae_state_t;
+
+// CAMERA_AE_LOCK_AVAILABLE
+typedef enum icamera_metadata_enum_camera_ae_lock_available {
+    CAMERA_AE_LOCK_AVAILABLE_FALSE,
+    CAMERA_AE_LOCK_AVAILABLE_TRUE,
+} icamera_metadata_enum_camera_ae_lock_available_t;
+
+// CAMERA_AWB_MODE
+typedef enum icamera_metadata_enum_camera_awb_mode {
+    CAMERA_AWB_MODE_AUTO,
+    CAMERA_AWB_MODE_INCANDESCENT,
+    CAMERA_AWB_MODE_FLUORESCENT,
+    CAMERA_AWB_MODE_DAYLIGHT,
+    CAMERA_AWB_MODE_FULL_OVERCAST,
+    CAMERA_AWB_MODE_PARTLY_OVERCAST,
+    CAMERA_AWB_MODE_SUNSET,
+    CAMERA_AWB_MODE_VIDEO_CONFERENCE,
+    CAMERA_AWB_MODE_MANUAL_CCT_RANGE,
+    CAMERA_AWB_MODE_MANUAL_WHITE_POINT,
+    CAMERA_AWB_MODE_MANUAL_GAIN,
+    CAMERA_AWB_MODE_MANUAL_COLOR_TRANSFORM,
+} icamera_metadata_enum_camera_awb_mode_t;
+
+// CAMERA_AWB_LOCK
+typedef enum icamera_metadata_enum_camera_awb_lock {
+    CAMERA_AWB_LOCK_OFF,
+    CAMERA_AWB_LOCK_ON,
+} icamera_metadata_enum_camera_awb_lock_t;
+
+// CAMERA_AWB_CONVERGE_SPEED
+typedef enum icamera_metadata_enum_camera_awb_converge_speed {
+    CAMERA_AWB_CONVERGE_SPEED_NORMAL,
+    CAMERA_AWB_CONVERGE_SPEED_MID,
+    CAMERA_AWB_CONVERGE_SPEED_LOW,
+} icamera_metadata_enum_camera_awb_converge_speed_t;
+
+// CAMERA_AWB_CONVERGE_SPEED_MODE
+typedef enum icamera_metadata_enum_camera_awb_converge_speed_mode {
+    CAMERA_AWB_CONVERGE_SPEED_MODE_HAL,
+    CAMERA_AWB_CONVERGE_SPEED_MODE_AIQ,
+} icamera_metadata_enum_camera_awb_converge_speed_mode_t;
+
+// CAMERA_AWB_STATE
+typedef enum icamera_metadata_enum_camera_awb_state {
+    CAMERA_AWB_STATE_INACTIVE,
+    CAMERA_AWB_STATE_SEARCHING,
+    CAMERA_AWB_STATE_CONVERGED,
+    CAMERA_AWB_STATE_LOCKED,
+} icamera_metadata_enum_camera_awb_state_t;
+
+// CAMERA_AWB_LOCK_AVAILABLE
+typedef enum icamera_metadata_enum_camera_awb_lock_available {
+    CAMERA_AWB_LOCK_AVAILABLE_FALSE,
+    CAMERA_AWB_LOCK_AVAILABLE_TRUE,
+} icamera_metadata_enum_camera_awb_lock_available_t;
+
+// CAMERA_AF_MODE
+typedef enum icamera_metadata_enum_camera_af_mode {
+    CAMERA_AF_MODE_OFF,
+    CAMERA_AF_MODE_AUTO,
+    CAMERA_AF_MODE_MACRO,
+    CAMERA_AF_MODE_CONTINUOUS_VIDEO,
+    CAMERA_AF_MODE_CONTINUOUS_PICTURE,
+    CAMERA_AF_MODE_EDOF,
+} icamera_metadata_enum_camera_af_mode_t;
+
+// CAMERA_AF_TRIGGER
+typedef enum icamera_metadata_enum_camera_af_trigger {
+    CAMERA_AF_TRIGGER_IDLE,
+    CAMERA_AF_TRIGGER_START,
+    CAMERA_AF_TRIGGER_CANCEL,
+} icamera_metadata_enum_camera_af_trigger_t;
+
+// CAMERA_AF_STATE
+typedef enum icamera_metadata_enum_camera_af_state {
+    CAMERA_AF_STATE_INACTIVE,
+    CAMERA_AF_STATE_PASSIVE_SCAN,
+    CAMERA_AF_STATE_PASSIVE_FOCUSED,
+    CAMERA_AF_STATE_ACTIVE_SCAN,
+    CAMERA_AF_STATE_FOCUSED_LOCKED,
+    CAMERA_AF_STATE_NOT_FOCUSED_LOCKED,
+    CAMERA_AF_STATE_PASSIVE_UNFOCUSED,
+} icamera_metadata_enum_camera_af_state_t;
+
+// CAMERA_CONTROL_EFFECT_MODE
+typedef enum icamera_metadata_enum_camera_control_effect_mode {
+    CAMERA_CONTROL_EFFECT_MODE_OFF,
+    CAMERA_CONTROL_EFFECT_MODE_MONO,
+    CAMERA_CONTROL_EFFECT_MODE_NEGATIVE,
+    CAMERA_CONTROL_EFFECT_MODE_SOLARIZE,
+    CAMERA_CONTROL_EFFECT_MODE_SEPIA,
+    CAMERA_CONTROL_EFFECT_MODE_POSTERIZE,
+    CAMERA_CONTROL_EFFECT_MODE_WHITEBOARD,
+    CAMERA_CONTROL_EFFECT_MODE_BLACKBOARD,
+    CAMERA_CONTROL_EFFECT_MODE_AQUA,
+} icamera_metadata_enum_camera_control_effect_mode_t;
+
+// CAMERA_CONTROL_MODE
+typedef enum icamera_metadata_enum_camera_control_mode {
+    CAMERA_CONTROL_MODE_OFF,
+    CAMERA_CONTROL_MODE_AUTO,
+    CAMERA_CONTROL_MODE_USE_SCENE_MODE,
+    CAMERA_CONTROL_MODE_OFF_KEEP_STATE,
+} icamera_metadata_enum_camera_control_mode_t;
+
+// CAMERA_CONTROL_SCENE_MODE
+typedef enum icamera_metadata_enum_camera_control_scene_mode {
+    CAMERA_CONTROL_SCENE_MODE_DISABLED                          = 0,
+    CAMERA_CONTROL_SCENE_MODE_FACE_PRIORITY,
+    CAMERA_CONTROL_SCENE_MODE_ACTION,
+    CAMERA_CONTROL_SCENE_MODE_PORTRAIT,
+    CAMERA_CONTROL_SCENE_MODE_LANDSCAPE,
+    CAMERA_CONTROL_SCENE_MODE_NIGHT,
+    CAMERA_CONTROL_SCENE_MODE_NIGHT_PORTRAIT,
+    CAMERA_CONTROL_SCENE_MODE_THEATRE,
+    CAMERA_CONTROL_SCENE_MODE_BEACH,
+    CAMERA_CONTROL_SCENE_MODE_SNOW,
+    CAMERA_CONTROL_SCENE_MODE_SUNSET,
+    CAMERA_CONTROL_SCENE_MODE_STEADYPHOTO,
+    CAMERA_CONTROL_SCENE_MODE_FIREWORKS,
+    CAMERA_CONTROL_SCENE_MODE_SPORTS,
+    CAMERA_CONTROL_SCENE_MODE_PARTY,
+    CAMERA_CONTROL_SCENE_MODE_CANDLELIGHT,
+    CAMERA_CONTROL_SCENE_MODE_BARCODE,
+    CAMERA_CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO,
+    CAMERA_CONTROL_SCENE_MODE_HDR,
+} icamera_metadata_enum_camera_control_scene_mode_t;
+
+// CAMERA_CONTROL_VIDEO_STABILIZATION_MODE
+typedef enum icamera_metadata_enum_camera_control_video_stabilization_mode {
+    CAMERA_CONTROL_VIDEO_STABILIZATION_MODE_OFF,
+    CAMERA_CONTROL_VIDEO_STABILIZATION_MODE_ON,
+} icamera_metadata_enum_camera_control_video_stabilization_mode_t;
+
+// CAMERA_DEMOSAIC_MODE
+typedef enum icamera_metadata_enum_camera_demosaic_mode {
+    CAMERA_DEMOSAIC_MODE_FAST,
+    CAMERA_DEMOSAIC_MODE_HIGH_QUALITY,
+} icamera_metadata_enum_camera_demosaic_mode_t;
+
+// CAMERA_EDGE_MODE
+typedef enum icamera_metadata_enum_camera_edge_mode {
+    CAMERA_EDGE_MODE_OFF,
+    CAMERA_EDGE_MODE_FAST,
+    CAMERA_EDGE_MODE_HIGH_QUALITY,
+} icamera_metadata_enum_camera_edge_mode_t;
+
+// CAMERA_FLASH_MODE
+typedef enum icamera_metadata_enum_camera_flash_mode {
+    CAMERA_FLASH_MODE_OFF,
+    CAMERA_FLASH_MODE_SINGLE,
+    CAMERA_FLASH_MODE_TORCH,
+} icamera_metadata_enum_camera_flash_mode_t;
+
+// CAMERA_FLASH_STATE
+typedef enum icamera_metadata_enum_camera_flash_state {
+    CAMERA_FLASH_STATE_UNAVAILABLE,
+    CAMERA_FLASH_STATE_CHARGING,
+    CAMERA_FLASH_STATE_READY,
+    CAMERA_FLASH_STATE_FIRED,
+    CAMERA_FLASH_STATE_PARTIAL,
+} icamera_metadata_enum_camera_flash_state_t;
+
+// CAMERA_FLASH_INFO_AVAILABLE
+typedef enum icamera_metadata_enum_camera_flash_info_available {
+    CAMERA_FLASH_INFO_AVAILABLE_FALSE,
+    CAMERA_FLASH_INFO_AVAILABLE_TRUE,
+} icamera_metadata_enum_camera_flash_info_available_t;
+
+// CAMERA_HOT_PIXEL_MODE
+typedef enum icamera_metadata_enum_camera_hot_pixel_mode {
+    CAMERA_HOT_PIXEL_MODE_OFF,
+    CAMERA_HOT_PIXEL_MODE_FAST,
+    CAMERA_HOT_PIXEL_MODE_HIGH_QUALITY,
+} icamera_metadata_enum_camera_hot_pixel_mode_t;
+
+// CAMERA_LENS_OPTICAL_STABILIZATION_MODE
+typedef enum icamera_metadata_enum_camera_lens_optical_stabilization_mode {
+    CAMERA_LENS_OPTICAL_STABILIZATION_MODE_OFF,
+    CAMERA_LENS_OPTICAL_STABILIZATION_MODE_ON,
+} icamera_metadata_enum_camera_lens_optical_stabilization_mode_t;
+
+// CAMERA_LENS_FACING
+typedef enum icamera_metadata_enum_camera_lens_facing {
+    CAMERA_LENS_FACING_FRONT,
+    CAMERA_LENS_FACING_BACK,
+} icamera_metadata_enum_camera_lens_facing_t;
+
+// CAMERA_LENS_STATE
+typedef enum icamera_metadata_enum_camera_lens_state {
+    CAMERA_LENS_STATE_STATIONARY,
+    CAMERA_LENS_STATE_MOVING,
+} icamera_metadata_enum_camera_lens_state_t;
+
+// CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION
+typedef enum icamera_metadata_enum_camera_lens_info_focus_distance_calibration {
+    CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED,
+    CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE,
+    CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED,
+} icamera_metadata_enum_camera_lens_info_focus_distance_calibration_t;
+
+// CAMERA_NOISE_REDUCTION_MODE
+typedef enum icamera_metadata_enum_camera_noise_reduction_mode {
+    CAMERA_NOISE_REDUCTION_MODE_OFF,
+    CAMERA_NOISE_REDUCTION_MODE_FAST,
+    CAMERA_NOISE_REDUCTION_MODE_HIGH_QUALITY,
+} icamera_metadata_enum_camera_noise_reduction_mode_t;
+
+// CAMERA_REQUEST_METADATA_MODE
+typedef enum icamera_metadata_enum_camera_request_metadata_mode {
+    CAMERA_REQUEST_METADATA_MODE_NONE,
+    CAMERA_REQUEST_METADATA_MODE_FULL,
+} icamera_metadata_enum_camera_request_metadata_mode_t;
+
+// CAMERA_REQUEST_AVAILABLE_CAPABILITIES
+typedef enum icamera_metadata_enum_camera_request_available_capabilities {
+    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE,
+    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR,
+    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING,
+    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_RAW,
+    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_ZSL,
+    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS,
+    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE,
+} icamera_metadata_enum_camera_request_available_capabilities_t;
+
+// CAMERA_SCALER_CROPPING_TYPE
+typedef enum icamera_metadata_enum_camera_scaler_cropping_type {
+    CAMERA_SCALER_CROPPING_TYPE_CENTER_ONLY,
+    CAMERA_SCALER_CROPPING_TYPE_FREEFORM,
+} icamera_metadata_enum_camera_scaler_cropping_type_t;
+
+// CAMERA_SENSOR_REFERENCE_ILLUMINANT1
+typedef enum icamera_metadata_enum_camera_sensor_reference_illuminant1 {
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT                = 1,
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_FLUORESCENT             = 2,
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_TUNGSTEN                = 3,
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_FLASH                   = 4,
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_FINE_WEATHER            = 9,
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_CLOUDY_WEATHER          = 10,
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_SHADE                   = 11,
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT_FLUORESCENT    = 12,
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAY_WHITE_FLUORESCENT   = 13,
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_COOL_WHITE_FLUORESCENT  = 14,
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_WHITE_FLUORESCENT       = 15,
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_A              = 17,
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_B              = 18,
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_C              = 19,
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D55                     = 20,
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D65                     = 21,
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D75                     = 22,
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D50                     = 23,
+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN     = 24,
+} icamera_metadata_enum_camera_sensor_reference_illuminant1_t;
+
+// CAMERA_SENSOR_TEST_PATTERN_MODE
+typedef enum icamera_metadata_enum_camera_sensor_test_pattern_mode {
+    CAMERA_SENSOR_TEST_PATTERN_MODE_OFF,
+    CAMERA_SENSOR_TEST_PATTERN_MODE_SOLID_COLOR,
+    CAMERA_SENSOR_TEST_PATTERN_MODE_COLOR_BARS,
+    CAMERA_SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY,
+    CAMERA_SENSOR_TEST_PATTERN_MODE_PN9,
+    CAMERA_SENSOR_TEST_PATTERN_MODE_CUSTOM1                     = 256,
+} icamera_metadata_enum_camera_sensor_test_pattern_mode_t;
+
+// CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT
+typedef enum icamera_metadata_enum_camera_sensor_info_color_filter_arrangement {
+    CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGGB,
+    CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GRBG,
+    CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GBRG,
+    CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_BGGR,
+    CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGB,
+} icamera_metadata_enum_camera_sensor_info_color_filter_arrangement_t;
+
+// CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE
+typedef enum icamera_metadata_enum_camera_sensor_info_timestamp_source {
+    CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN,
+    CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME,
+} icamera_metadata_enum_camera_sensor_info_timestamp_source_t;
+
+// CAMERA_SHADING_MODE
+typedef enum icamera_metadata_enum_camera_shading_mode {
+    CAMERA_SHADING_MODE_OFF,
+    CAMERA_SHADING_MODE_FAST,
+    CAMERA_SHADING_MODE_HIGH_QUALITY,
+} icamera_metadata_enum_camera_shading_mode_t;
+
+// CAMERA_STATISTICS_FACE_DETECT_MODE
+typedef enum icamera_metadata_enum_camera_statistics_face_detect_mode {
+    CAMERA_STATISTICS_FACE_DETECT_MODE_OFF,
+    CAMERA_STATISTICS_FACE_DETECT_MODE_SIMPLE,
+    CAMERA_STATISTICS_FACE_DETECT_MODE_FULL,
+} icamera_metadata_enum_camera_statistics_face_detect_mode_t;
+
+// CAMERA_STATISTICS_HISTOGRAM_MODE
+typedef enum icamera_metadata_enum_camera_statistics_histogram_mode {
+    CAMERA_STATISTICS_HISTOGRAM_MODE_OFF,
+    CAMERA_STATISTICS_HISTOGRAM_MODE_ON,
+} icamera_metadata_enum_camera_statistics_histogram_mode_t;
+
+// CAMERA_STATISTICS_SHARPNESS_MAP_MODE
+typedef enum icamera_metadata_enum_camera_statistics_sharpness_map_mode {
+    CAMERA_STATISTICS_SHARPNESS_MAP_MODE_OFF,
+    CAMERA_STATISTICS_SHARPNESS_MAP_MODE_ON,
+} icamera_metadata_enum_camera_statistics_sharpness_map_mode_t;
+
+// CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE
+typedef enum icamera_metadata_enum_camera_statistics_hot_pixel_map_mode {
+    CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE_OFF,
+    CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE_ON,
+} icamera_metadata_enum_camera_statistics_hot_pixel_map_mode_t;
+
+// CAMERA_STATISTICS_SCENE_FLICKER
+typedef enum icamera_metadata_enum_camera_statistics_scene_flicker {
+    CAMERA_STATISTICS_SCENE_FLICKER_NONE,
+    CAMERA_STATISTICS_SCENE_FLICKER_50HZ,
+    CAMERA_STATISTICS_SCENE_FLICKER_60HZ,
+} icamera_metadata_enum_camera_statistics_scene_flicker_t;
+
+// CAMERA_STATISTICS_LENS_SHADING_MAP_MODE
+typedef enum icamera_metadata_enum_camera_statistics_lens_shading_map_mode {
+    CAMERA_STATISTICS_LENS_SHADING_MAP_MODE_OFF,
+    CAMERA_STATISTICS_LENS_SHADING_MAP_MODE_ON,
+} icamera_metadata_enum_camera_statistics_lens_shading_map_mode_t;
+
+// CAMERA_TONEMAP_MODE
+typedef enum icamera_metadata_enum_camera_tonemap_mode {
+    CAMERA_TONEMAP_MODE_CONTRAST_CURVE,
+    CAMERA_TONEMAP_MODE_FAST,
+    CAMERA_TONEMAP_MODE_HIGH_QUALITY,
+    CAMERA_TONEMAP_MODE_GAMMA_VALUE,
+    CAMERA_TONEMAP_MODE_PRESET_CURVE,
+} icamera_metadata_enum_camera_tonemap_mode_t;
+
+// CAMERA_TONEMAP_PRESET_CURVE
+typedef enum icamera_metadata_enum_camera_tonemap_preset_curve {
+    CAMERA_TONEMAP_PRESET_CURVE_SRGB,
+    CAMERA_TONEMAP_PRESET_CURVE_REC709,
+} icamera_metadata_enum_camera_tonemap_preset_curve_t;
+
+// CAMERA_LED_TRANSMIT
+typedef enum icamera_metadata_enum_camera_led_transmit {
+    CAMERA_LED_TRANSMIT_OFF,
+    CAMERA_LED_TRANSMIT_ON,
+} icamera_metadata_enum_camera_led_transmit_t;
+
+// CAMERA_LED_AVAILABLE_LEDS
+typedef enum icamera_metadata_enum_camera_led_available_leds {
+    CAMERA_LED_AVAILABLE_LEDS_TRANSMIT,
+} icamera_metadata_enum_camera_led_available_leds_t;
+
+// CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL
+typedef enum icamera_metadata_enum_camera_info_supported_hardware_level {
+    CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED,
+    CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL_FULL,
+    CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY,
+} icamera_metadata_enum_camera_info_supported_hardware_level_t;
+
+// CAMERA_BLACK_LEVEL_LOCK
+typedef enum icamera_metadata_enum_camera_black_level_lock {
+    CAMERA_BLACK_LEVEL_LOCK_OFF,
+    CAMERA_BLACK_LEVEL_LOCK_ON,
+} icamera_metadata_enum_camera_black_level_lock_t;
+
+// CAMERA_SYNC_FRAME_NUMBER
+typedef enum icamera_metadata_enum_camera_sync_frame_number {
+    CAMERA_SYNC_FRAME_NUMBER_CONVERGING                         = -1,
+    CAMERA_SYNC_FRAME_NUMBER_UNKNOWN                            = -2,
+} icamera_metadata_enum_camera_sync_frame_number_t;
+
+// CAMERA_SYNC_MAX_LATENCY
+typedef enum icamera_metadata_enum_camera_sync_max_latency {
+    CAMERA_SYNC_MAX_LATENCY_PER_FRAME_CONTROL                   = 0,
+    CAMERA_SYNC_MAX_LATENCY_UNKNOWN                             = -1,
+} icamera_metadata_enum_camera_sync_max_latency_t;
+
+// INTEL_INFO_AVAILABLE_FEATURES
+typedef enum icamera_metadata_enum_intel_info_available_features {
+    INTEL_INFO_AVAILABLE_FEATURES_MANUAL_EXPOSURE               = 0,
+    INTEL_INFO_AVAILABLE_FEATURES_MANUAL_WHITE_BALANCE          = 1,
+    INTEL_INFO_AVAILABLE_FEATURES_IMAGE_ENHANCEMENT             = 2,
+    INTEL_INFO_AVAILABLE_FEATURES_NOISE_REDUCTION               = 3,
+    INTEL_INFO_AVAILABLE_FEATURES_SCENE_MODE                    = 4,
+    INTEL_INFO_AVAILABLE_FEATURES_WEIGHT_GRID_MODE              = 5,
+    INTEL_INFO_AVAILABLE_FEATURES_PER_FRAME_CONTROL             = 6,
+    INTEL_INFO_AVAILABLE_FEATURES_ISP_CONTROL                   = 7,
+} icamera_metadata_enum_intel_info_available_features_t;
+
+// INTEL_INFO_WFOV
+typedef enum icamera_metadata_enum_intel_info_wfov {
+    INTEL_INFO_WFOV_OFF,
+    INTEL_INFO_WFOV_ON,
+} icamera_metadata_enum_intel_info_wfov_t;
+
+// INTEL_INFO_SENSOR_MOUNT_TYPE
+typedef enum icamera_metadata_enum_intel_info_sensor_mount_type {
+    INTEL_INFO_SENSOR_MOUNT_TYPE_WALL_MOUNTED,
+    INTEL_INFO_SENSOR_MOUNT_TYPE_CEILING_MOUNTER,
+} icamera_metadata_enum_intel_info_sensor_mount_type_t;
+
+// INTEL_CONTROL_AE_CONVERGE_SPEED
+typedef enum icamera_metadata_enum_intel_control_ae_converge_speed {
+    INTEL_CONTROL_AE_CONVERGE_SPEED_NORMAL,
+    INTEL_CONTROL_AE_CONVERGE_SPEED_MID,
+    INTEL_CONTROL_AE_CONVERGE_SPEED_LOW,
+} icamera_metadata_enum_intel_control_ae_converge_speed_t;
+
+// INTEL_CONTROL_NR_MODE
+typedef enum icamera_metadata_enum_intel_control_nr_mode {
+    INTEL_CONTROL_NR_MODE_OFF,
+    INTEL_CONTROL_NR_MODE_AUTO,
+    INTEL_CONTROL_NR_MODE_MANUAL_NORMAL,
+    INTEL_CONTROL_NR_MODE_MANUAL_EXPERT,
+} icamera_metadata_enum_intel_control_nr_mode_t;
+
+// INTEL_CONTROL_IRIS_MODE
+typedef enum icamera_metadata_enum_intel_control_iris_mode {
+    INTEL_CONTROL_IRIS_MODE_AUTO,
+    INTEL_CONTROL_IRIS_MODE_MANUAL,
+    INTEL_CONTROL_IRIS_MODE_CUSTOMIZED,
+} icamera_metadata_enum_intel_control_iris_mode_t;
+
+// INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY
+typedef enum icamera_metadata_enum_intel_control_ae_distribution_priority {
+    INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_AUTO,
+    INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_SHUTTER,
+    INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_ISO,
+    INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_APERTURE,
+} icamera_metadata_enum_intel_control_ae_distribution_priority_t;
+
+// INTEL_CONTROL_WDR_MODE
+typedef enum icamera_metadata_enum_intel_control_wdr_mode {
+    INTEL_CONTROL_WDR_MODE_OFF,
+    INTEL_CONTROL_WDR_MODE_ON,
+    INTEL_CONTROL_WDR_MODE_AUTO,
+} icamera_metadata_enum_intel_control_wdr_mode_t;
+
+// INTEL_CONTROL_BLC_AREA_MODE
+typedef enum icamera_metadata_enum_intel_control_blc_area_mode {
+    INTEL_CONTROL_BLC_AREA_MODE_OFF,
+    INTEL_CONTROL_BLC_AREA_MODE_ON,
+} icamera_metadata_enum_intel_control_blc_area_mode_t;
+
+// INTEL_CONTROL_SCENE_MODE
+typedef enum icamera_metadata_enum_intel_control_scene_mode {
+    INTEL_CONTROL_SCENE_MODE_AUTO,
+    INTEL_CONTROL_SCENE_MODE_HDR,
+    INTEL_CONTROL_SCENE_MODE_ULL,
+    INTEL_CONTROL_SCENE_MODE_VIDEO_LL,
+    INTEL_CONTROL_SCENE_MODE_HDR2,
+} icamera_metadata_enum_intel_control_scene_mode_t;
+
+// INTEL_CONTROL_WEIGHT_GRID_MODE
+typedef enum icamera_metadata_enum_intel_control_weight_grid_mode {
+    INTEL_CONTROL_WEIGHT_GRID_MODE_AUTO,
+    INTEL_CONTROL_WEIGHT_GRID_MODE_CUSTOM_WEIGHT_GRID1,
+    INTEL_CONTROL_WEIGHT_GRID_MODE_CUSTOM_WEIGHT_GRID2,
+    INTEL_CONTROL_WEIGHT_GRID_MODE_CUSTOM_WEIGHT_GRID3,
+} icamera_metadata_enum_intel_control_weight_grid_mode_t;
+
+// INTEL_CONTROL_AE_CONVERGE_SPEED_MODE
+typedef enum icamera_metadata_enum_intel_control_ae_converge_speed_mode {
+    INTEL_CONTROL_AE_CONVERGE_SPEED_MODE_HAL,
+    INTEL_CONTROL_AE_CONVERGE_SPEED_MODE_AIQ,
+} icamera_metadata_enum_intel_control_ae_converge_speed_mode_t;
+
+// INTEL_CONTROL_DEINTERLACE_MODE
+typedef enum icamera_metadata_enum_intel_control_deinterlace_mode {
+    INTEL_CONTROL_DEINTERLACE_MODE_OFF,
+    INTEL_CONTROL_DEINTERLACE_MODE_WEAVING,
+} icamera_metadata_enum_intel_control_deinterlace_mode_t;
+
+// INTEL_CONTROL_MAKERNOTE_MODE
+typedef enum icamera_metadata_enum_intel_control_makernote_mode {
+    INTEL_CONTROL_MAKERNOTE_MODE_OFF,
+    INTEL_CONTROL_MAKERNOTE_MODE_JPEG,
+    INTEL_CONTROL_MAKERNOTE_MODE_RAW,
+} icamera_metadata_enum_intel_control_makernote_mode_t;
+
+// INTEL_CONTROL_YUV_COLOR_RANGE
+typedef enum icamera_metadata_enum_intel_control_yuv_color_range {
+    INTEL_CONTROL_YUV_COLOR_RANGE_FULL,
+    INTEL_CONTROL_YUV_COLOR_RANGE_REDUCED,
+} icamera_metadata_enum_intel_control_yuv_color_range_t;
+
+// INTEL_CONTROL_FISHEYE_DEWARPING_MODE
+typedef enum icamera_metadata_enum_intel_control_fisheye_dewarping_mode {
+    INTEL_CONTROL_FISHEYE_DEWARPING_MODE_OFF,
+    INTEL_CONTROL_FISHEYE_DEWARPING_MODE_REARVIEW,
+    INTEL_CONTROL_FISHEYE_DEWARPING_MODE_HITCHVIEW,
+} icamera_metadata_enum_intel_control_fisheye_dewarping_mode_t;
+
+// INTEL_CONTROL_LDC_MODE
+typedef enum icamera_metadata_enum_intel_control_ldc_mode {
+    INTEL_CONTROL_LDC_MODE_OFF,
+    INTEL_CONTROL_LDC_MODE_ON,
+} icamera_metadata_enum_intel_control_ldc_mode_t;
+
+// INTEL_CONTROL_RSC_MODE
+typedef enum icamera_metadata_enum_intel_control_rsc_mode {
+    INTEL_CONTROL_RSC_MODE_OFF,
+    INTEL_CONTROL_RSC_MODE_ON,
+} icamera_metadata_enum_intel_control_rsc_mode_t;
+
+// INTEL_CONTROL_FLIP_MODE
+typedef enum icamera_metadata_enum_intel_control_flip_mode {
+    INTEL_CONTROL_FLIP_MODE_NONE,
+    INTEL_CONTROL_FLIP_MODE_VFLIP,
+    INTEL_CONTROL_FLIP_MODE_HFLIP,
+    INTEL_CONTROL_FLIP_MODE_VHFLIP,
+} icamera_metadata_enum_intel_control_flip_mode_t;
+
+// INTEL_CONTROL_MONO_DOWNSCALE
+typedef enum icamera_metadata_enum_intel_control_mono_downscale {
+    INTEL_CONTROL_MONO_DOWNSCALE_OFF,
+    INTEL_CONTROL_MONO_DOWNSCALE_ON,
+} icamera_metadata_enum_intel_control_mono_downscale_t;
+
diff --git a/camera/hal/intel/ipu6/src/platformdata/AiqInitData.cpp b/camera/hal/intel/ipu6/src/platformdata/AiqInitData.cpp
new file mode 100644
index 000000000000..4bcf74710e98
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/AiqInitData.cpp
@@ -0,0 +1,524 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "AiqInitData"
+
+#include <sys/stat.h>
+
+#include "iutils/CameraLog.h"
+#include "AiqInitData.h"
+#include "PlatformData.h"
+#include "ia_types.h"
+
+using std::string;
+
+namespace icamera {
+
+AiqdData::AiqdData(TuningMode tuningMode, const string& sensorName) :
+    mDataPtr(nullptr)
+{
+    CLEAR(mBinaryData);
+
+    mAiqdFileName.append(CAMERA_CACHE_DIR);
+    mAiqdFileName.append(sensorName);
+    mAiqdFileName.append("_");
+    mAiqdFileName.append(CameraUtils::tuningMode2String(tuningMode));
+    mAiqdFileName.append(".aiqd");
+
+    LOG1("%s, aiqd file name %s", __func__, mAiqdFileName.c_str());
+    loadAiqdFromFile();
+};
+
+AiqdData::~AiqdData()
+{
+    LOG1("%s, aiqd file name %s", __func__, mAiqdFileName.c_str());
+}
+
+ia_binary_data* AiqdData::getAiqdData()
+{
+    if (mDataPtr != nullptr) {
+        return &mBinaryData;
+    }
+    return nullptr;
+}
+
+void AiqdData::saveAiqdData(const ia_binary_data* inData)
+{
+    LOG1("%s", __func__);
+    CheckError(inData == nullptr, VOID_VALUE, "inData is nullptr");
+
+    if (mDataPtr == nullptr || inData->size != mBinaryData.size) {
+        mDataPtr.reset(new char[inData->size]);
+        mBinaryData.size = inData->size;
+        mBinaryData.data = mDataPtr.get();
+    }
+    MEMCPY_S(mBinaryData.data, mBinaryData.size, inData->data, inData->size);
+
+    saveAiqdToFile();
+}
+
+void AiqdData::loadAiqdFromFile()
+{
+    LOG1("%s", __func__);
+
+    // Get file size
+    struct stat fileStat;
+    CLEAR(fileStat);
+    int ret = stat(mAiqdFileName.c_str(), &fileStat);
+    if (ret != 0) {
+        LOG1("There is no aiqd file %s", mAiqdFileName.c_str());
+        return;
+    }
+
+    // Opem aiqd file
+    FILE* fp = fopen(mAiqdFileName.c_str(), "rb");
+    CheckWarning(fp == nullptr, VOID_VALUE, "Failed to open aiqd file %s, error %s",
+                 mAiqdFileName.c_str(), strerror(errno));
+
+    std::unique_ptr<char[]> dataPtr(new char[fileStat.st_size]);
+
+    // Read aiqd data
+    size_t readSize = fread(dataPtr.get(), sizeof(char), fileStat.st_size, fp);
+    fclose(fp);
+
+    CheckWarning(readSize != (size_t)fileStat.st_size, VOID_VALUE,
+                 "Failed to read aiqd %s, error %s",
+                 mAiqdFileName.c_str(), strerror(errno));
+
+    mDataPtr = move(dataPtr);
+    mBinaryData.data = mDataPtr.get();
+    mBinaryData.size = fileStat.st_size;
+    LOG1("%s, aiqd file %s, size %d", __func__, mAiqdFileName.c_str(), mBinaryData.size);
+}
+
+void AiqdData::saveAiqdToFile()
+{
+    LOG1("%s", __func__);
+
+    // Open aiqd file
+    FILE* fp = fopen(mAiqdFileName.c_str(), "wb");
+    CheckWarning(fp == nullptr, VOID_VALUE, "Failed to open aiqd file %s, error %s",
+                 mAiqdFileName.c_str(), strerror(errno));
+
+    // Write aiqd data to file
+    size_t writeSize = fwrite(mBinaryData.data, 1, mBinaryData.size, fp);
+    if (writeSize != mBinaryData.size) {
+        LOGW("Failed to write aiqd data %s, error %s", mAiqdFileName.c_str(), strerror(errno));
+        fclose(fp);
+        return;
+    }
+
+    fflush(fp);
+    fclose(fp);
+
+    LOG1("%s, aiqd file %s, size %d", __func__, mAiqdFileName.c_str(), mBinaryData.size);
+}
+
+CpfConf::CpfConf()
+{
+    mLard = new IntelLard();
+    mCmc = std::unique_ptr<IntelCmc>(new IntelCmc());
+    CLEAR(mAiq);
+    CLEAR(mIsp);
+    CLEAR(mOthers);
+}
+
+CpfConf::~CpfConf()
+{
+    delete mLard;
+    LOG1("@%s", __func__);
+}
+
+int CpfConf::init(int cameraId, ia_binary_data cpfData, TuningMode mode)
+{
+    LOG1("@%s", __func__);
+
+    CheckWarning(mCmc->getCmc(), OK, "cmc has already been init before!");
+    CheckError((cpfData.data == nullptr), BAD_VALUE, "Error Initializing CPF configure");
+
+    bool cmcRet = false;
+    ia_lard *iaLard = mLard->init(&cpfData);
+    if (iaLard != nullptr) {
+        LOG1("AIQB file supported by lard.");
+        ia_lard_input_params lardInputParams;
+        initLardInputParam(cameraId, iaLard, mode, &lardInputParams);
+
+        ia_lard_results* lardResults;
+        // Run ia_lard, result is nullptr if aiqb file is not supported
+        ia_err iaErr = mLard->run(iaLard, &lardInputParams, &lardResults);
+        if (lardResults != nullptr) {
+            LOG1("ia_lard_run success, using lard to get cmc mode and tuning.");
+            cmcRet = mCmc->init(&lardResults->aiqb_cmc_data, nullptr);
+            mAiq = lardResults->aiqb_aiq_data;
+            mIsp = lardResults->aiqb_isp_data;
+            mOthers = lardResults->aiqb_other_data;
+        } else {
+            LOGE("Fail to run ia_lard, iaErr = %d", iaErr);
+        }
+        mLard->deinit(iaLard);
+    } else {
+        LOG1("Lard not supported. The AIQB file may be in old CPF format");
+        cmcRet = mCmc->init(&cpfData, nullptr);
+        mAiq = cpfData;
+        mIsp = cpfData;
+        mOthers = cpfData;
+    }
+    CheckError(!cmcRet, FAILED_TRANSACTION, "Error cmc parser init!");
+
+    return OK;
+}
+
+ia_cmc_t* CpfConf::getCmc() const
+{
+    return mCmc->getCmc();
+}
+
+uintptr_t CpfConf::getCmcHandle() const
+{
+    return mCmc->getCmcHandle();
+}
+
+void CpfConf::getIspData(ia_binary_data *ispData)
+{
+    ispData->data = mIsp.data;
+    ispData->size = mIsp.size;
+}
+
+void CpfConf::getAiqData(ia_binary_data *aiqData)
+{
+    aiqData->data = mAiq.data;
+    aiqData->size = mAiq.size;
+}
+
+void CpfConf::getOtherData(ia_binary_data *otherData)
+{
+    otherData->data = mOthers.data;
+    otherData->size = mOthers.size;
+}
+
+void CpfConf::deinit()
+{
+    mCmc->deinit();
+}
+
+void CpfConf::initLardInputParam(int cameraId, ia_lard *iaLard, TuningMode mode, ia_lard_input_params *lardInputParam)
+{
+    LardTagConfig lardTags;
+    int ret = PlatformData::getLardTagsByTuningMode(cameraId, mode, lardTags);
+    if (ret != OK) {
+        lardInputParam->cmc_mode_tag = FOURCC_TO_UL('D','F','L','T');
+        lardInputParam->aiq_mode_tag = FOURCC_TO_UL('D','F','L','T');
+        lardInputParam->isp_mode_index = FOURCC_TO_UL('D','F','L','T');
+        lardInputParam->others_mode_tag = FOURCC_TO_UL('D','F','L','T');
+        return;
+    }
+
+    unsigned int count = 0;
+    const unsigned int *tags = nullptr;
+
+    mLard->getTagList(iaLard, FOURCC_TO_UL('L','C','M','C'), &count, &tags);
+    lardInputParam->cmc_mode_tag = isTagValid(lardTags.cmcTag, count, tags) ? \
+                                   lardTags.cmcTag : FOURCC_TO_UL('D','F','L','T');
+
+    mLard->getTagList(iaLard, FOURCC_TO_UL('L','A','I','Q'), &count, &tags);
+    lardInputParam->aiq_mode_tag = isTagValid(lardTags.aiqTag, count, tags) ? \
+                                   lardTags.aiqTag : FOURCC_TO_UL('D','F','L','T');
+
+    mLard->getTagList(iaLard, FOURCC_TO_UL('L','I','S','P'), &count, &tags);
+    lardInputParam->isp_mode_index = isTagValid(lardTags.ispTag, count, tags) ? \
+                                     lardTags.ispTag : FOURCC_TO_UL('D','F','L','T');
+
+    mLard->getTagList(iaLard, FOURCC_TO_UL('L','T','H','R'), &count, &tags);
+    lardInputParam->others_mode_tag = isTagValid(lardTags.othersTag, count, tags) ? \
+                                      lardTags.othersTag : FOURCC_TO_UL('D','F','L','T');
+
+    LOG1("@%s: The lard tags are: aiq-0x%x, isp-0x%x, cmc-0x%x, others-0x%x", __func__,
+        lardInputParam->aiq_mode_tag, lardInputParam->isp_mode_index,
+        lardInputParam->cmc_mode_tag, lardInputParam->others_mode_tag);
+}
+
+bool CpfConf::isTagValid(unsigned int tag, unsigned int count, const unsigned int *tags)
+{
+    if (tags != nullptr) {
+        for (unsigned int i = 0; i < count; i++) {
+            if (tags[i] == tag) return true;
+        }
+    }
+    LOG1("@%s: Tag 0x%x is not valid. Will use DFLT instead.", __func__, tag);
+    return false;
+}
+
+CpfStore::CpfStore(int cameraId, string sensorName)
+{
+    LOG1("@%s:Sensor Name = %s", __func__, sensorName.c_str());
+
+    CLEAR(mCpfConfig);
+    std::vector <TuningConfig> configs;
+
+    PlatformData::getSupportedTuningConfig(cameraId, configs);
+
+    for (auto &cfg : configs) {
+        if (mCpfConfig[cfg.tuningMode] != nullptr) {
+            continue;
+        }
+
+        if (cfg.aiqbName.empty()) {
+            LOGE("aiqb name is empty, sensor name %s", sensorName.c_str());
+            continue;
+        }
+
+        if (mCpfData.find(cfg.aiqbName) == mCpfData.end()) {
+            // Obtain the configurations
+            if (loadConf(cfg.aiqbName) != OK) {
+                LOGE("load file %s failed, sensor %s", cfg.aiqbName.c_str(), sensorName.c_str());
+                continue;
+            }
+        }
+
+        mCpfConfig[cfg.tuningMode] = new CpfConf();
+        mCpfConfig[cfg.tuningMode]->init(cameraId, mCpfData[cfg.aiqbName], cfg.tuningMode);
+    }
+}
+
+CpfStore::~CpfStore()
+{
+    LOG1("@%s", __func__);
+    for (int mode=0; mode<TUNING_MODE_MAX; mode++) {
+        if (mCpfConfig[mode]) {
+            mCpfConfig[mode]->deinit();
+            delete mCpfConfig[mode];
+        }
+    }
+    for (auto &cpfData : mCpfData) {
+        if (cpfData.second.data) {
+            free(cpfData.second.data);
+        }
+    }
+    mCpfData.clear();
+}
+
+/**
+ * findConfigFile
+ *
+ * Search the path where CPF files are stored
+*/
+int CpfStore::findConfigFile(string& cpfPathName)
+{
+    LOG1("@%s", __func__);
+    std::vector<string> configFilePath;
+    configFilePath.push_back("./");
+    configFilePath.push_back(PlatformData::getCameraCfgPath());
+    int configFileCount = configFilePath.size();
+
+    string cpfFile;
+    for (int i = 0; i < configFileCount; i++) {
+        cpfFile.append(configFilePath.at(i));
+        cpfFile.append(cpfPathName);
+        struct stat st;
+        if (!stat(cpfFile.c_str(), &st))
+            break;
+        cpfFile.clear();
+    }
+
+    if (cpfFile.empty()) {//CPF file not found
+        LOG1("@%s:No CPF file found for %s", __func__,cpfPathName.c_str());
+        return NAME_NOT_FOUND;
+    }
+
+    cpfPathName = cpfFile;
+    LOG1("@%s:CPF file found %s", __func__,cpfPathName.c_str());
+    return OK;
+}
+
+/**
+ * loadConf
+ *
+ * load the CPF file
+*/
+int CpfStore::loadConf(string aiqbName)
+{
+    LOG1("@%s", __func__);
+    int ret = OK;
+    const char *suffix = ".aiqb";
+
+    string cpfPathName = aiqbName;
+    cpfPathName.append(suffix);
+    LOG1("aiqb file name %s", cpfPathName.c_str());
+
+    if (findConfigFile(cpfPathName) != OK) {
+        LOGE("CpfStore no aiqb file:%s", aiqbName.c_str());
+        return NAME_NOT_FOUND;
+    }
+
+    LOG1("Opening CPF file \"%s\"", cpfPathName.c_str());
+    FILE *file = fopen(cpfPathName.c_str(), "rb");
+    CheckError((file == nullptr), NAME_NOT_FOUND, "ERROR in opening CPF file \"%s\": %s!", cpfPathName.c_str(), strerror(errno));
+    do {
+        int fileSize;
+        if ((fseek(file, 0, SEEK_END) < 0) || ((fileSize = ftell(file)) < 0) || (fseek(file, 0, SEEK_SET) < 0)) {
+            LOGE("ERROR querying properties of CPF file \"%s\": %s!", cpfPathName.c_str(), strerror(errno));
+            ret = BAD_VALUE;
+            break;
+        }
+
+        mCpfData[aiqbName].data = malloc(fileSize);
+        if (!mCpfData[aiqbName].data) {
+            LOGE("ERROR no memory in %s!", __func__);
+            ret = NO_MEMORY;
+            break;
+        }
+
+        if (fread(mCpfData[aiqbName].data, fileSize, 1, file) < 1) {
+            LOGE("ERROR reading CPF file \"%s\"!", cpfPathName.c_str());
+            ret = INVALID_OPERATION;
+            break;
+        }
+        mCpfData[aiqbName].size = fileSize;
+    } while (0);
+
+    if (fclose(file)) {
+        LOGE("ERROR in closing CPF file \"%s\": %s!", cpfPathName.c_str(), strerror(errno));
+    }
+
+    return ret;
+}
+
+/**
+ * convenience getter for Isp data, Aiq data, cmc data and other data.
+ */
+int CpfStore::getDataAndCmc(ia_binary_data *ispData,
+                            ia_binary_data *aiqData,
+                            ia_binary_data *otherData,
+                            uintptr_t *cmcHandle,
+                            TuningMode mode,
+                            ia_cmc_t **cmcData)
+{
+    LOG1("@%s mode = %d", __func__, mode);
+    CheckError((mCpfConfig[mode] == nullptr), NO_INIT, "@%s, No aiqb init, mode = %d", __func__, mode);
+    if (ispData != nullptr)
+        mCpfConfig[mode]->getIspData(ispData);
+    if (aiqData != nullptr)
+        mCpfConfig[mode]->getAiqData(aiqData);
+    if (otherData != nullptr)
+        mCpfConfig[mode]->getOtherData(otherData);
+    if (cmcData) {
+        *cmcData = mCpfConfig[mode]->getCmc();
+    }
+    if (cmcHandle) {
+        *cmcHandle = mCpfConfig[mode]->getCmcHandle();
+    }
+
+    if (mode == TUNING_MODE_VIDEO_ULL) {
+        LOG2("@%s ULL mode, ULL cpf file is used", __func__);
+    } else if (mode == TUNING_MODE_VIDEO_CUSTOM_AIC) {
+        LOG2("@%s CUSTOM AIC mode, CUSTOM AIC cpf file is used", __func__);
+    } else if (mode == TUNING_MODE_VIDEO_LL) {
+        LOG2("@%s VIDEO LL mode, VIDEO LL cpf file is used", __func__);
+    } else if (mode == TUNING_MODE_VIDEO_REAR_VIEW) {
+        LOG2("@%s VIDEO Rear View mode, VIDEO REAR VIEW cpf file is used", __func__);
+    } else if (mode == TUNING_MODE_VIDEO_HITCH_VIEW) {
+        LOG2("@%s VIDEO Hitch View mode, VIDEO HITCH VIEW cpf file is used", __func__);
+    } else {
+        LOG2("@%s VIDEO mode, default cpf file is used", __func__);
+    }
+
+    return OK;
+}
+
+AiqInitData::AiqInitData() :
+    mCpfStore(nullptr),
+    mNvmDataBuf(nullptr)
+{
+    CLEAR(mNvmData);
+}
+
+AiqInitData::~AiqInitData()
+{
+    delete mCpfStore;
+    for (auto aiqd : mAiqdDataMap) {
+        delete aiqd.second;
+    }
+}
+
+CpfStore* AiqInitData::getCpfStore(int cameraId, const string& sensorName)
+{
+    if (mCpfStore == nullptr) {
+        mCpfStore = new CpfStore(cameraId, sensorName);
+    }
+    return mCpfStore;
+}
+
+status_t AiqInitData::loadNvmData(int cameraId)
+{
+    LOG1("@%s, cameraId: %d", __func__, cameraId);
+
+    string nvmDirectory = PlatformData::getNvmDirectory(cameraId);
+    if (nvmDirectory.length() == 0) {
+        LOG1("NVM dirctory from config is null");
+        return UNKNOWN_ERROR;
+    }
+
+    string nvmDataPath(NVM_DATA_PATH);
+    if (nvmDataPath.back() != '/')
+        nvmDataPath.append("/");
+
+    nvmDataPath.append(nvmDirectory);
+    if (nvmDataPath.back() != '/')
+        nvmDataPath.append("/");
+
+    nvmDataPath.append("eeprom");
+    string sensorName = PlatformData::getSensorName(cameraId);
+    LOG2("NVM data for %s is located in %s", sensorName.c_str(), nvmDataPath.c_str());
+
+    FILE *nvmFile = fopen(nvmDataPath.c_str(), "rb");
+    CheckError(!nvmFile, UNKNOWN_ERROR, "Failed to open NVM file: %s", nvmDataPath.c_str());
+
+    fseek(nvmFile, 0, SEEK_END);
+    int nvmDataSize = std::min(static_cast<int>(ftell(nvmFile)),
+                               PlatformData::getMaxNvmDataSize(cameraId));
+    fseek(nvmFile, 0, SEEK_SET);
+
+    std::unique_ptr<char[]> nvmData(new char[nvmDataSize]);
+    LOG2("NVM data size: %d bytes", nvmDataSize);
+
+    int ret = fread(nvmData.get(), nvmDataSize, 1, nvmFile);
+    fclose(nvmFile);
+    CheckError(ret == 0, UNKNOWN_ERROR, "Cannot read nvm data");
+
+    mNvmDataBuf = std::move(nvmData);
+    mNvmData.data = mNvmDataBuf.get();
+    mNvmData.size = nvmDataSize;
+
+    return OK;
+}
+
+void* AiqInitData::getNvmData(int cameraId)
+{
+    if (!mNvmData.data || mNvmData.size == 0)
+        loadNvmData(cameraId);
+
+    return mNvmData.data ? static_cast<void *>(&mNvmData) : nullptr;
+}
+
+AiqdData* AiqInitData::getAiqdData(TuningMode tuningMode, const string& sensorName)
+{
+    if (mAiqdDataMap.find(tuningMode) == mAiqdDataMap.end()) {
+        mAiqdDataMap[tuningMode] = new AiqdData(tuningMode, sensorName);
+    }
+    return mAiqdDataMap[tuningMode];
+}
+
+}
diff --git a/camera/hal/intel/ipu6/src/platformdata/AiqInitData.h b/camera/hal/intel/ipu6/src/platformdata/AiqInitData.h
new file mode 100644
index 000000000000..cb06edfe09fb
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/AiqInitData.h
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+#include <string>
+#include <map>
+
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+
+#ifdef ENABLE_SANDBOXING
+#include "modules/sandboxing/client/IntelLard.h"
+#include "modules/sandboxing/client/IntelCmc.h"
+#else
+#include "modules/algowrapper/IntelLard.h"
+#include "modules/algowrapper/IntelCmc.h"
+#endif
+
+namespace icamera {
+
+#define NVM_DATA_PATH "/sys/bus/i2c/devices/"
+
+/**
+ * This class is intended to save/load AIQD data.
+ */
+class AiqdData
+{
+public:
+    AiqdData(TuningMode tuningMode, const std::string& sensorName);
+    ~AiqdData();
+
+    ia_binary_data* getAiqdData();
+    void saveAiqdData(const ia_binary_data* inData);
+
+private:
+    void loadAiqdFromFile();
+    void saveAiqdToFile();
+
+private:
+    std::string mAiqdFileName;
+    ia_binary_data mBinaryData;
+    std::unique_ptr<char[]> mDataPtr;
+};
+
+/**
+  * The IA data stored
+*/
+class CpfConf
+{
+public:
+    CpfConf();
+    virtual ~CpfConf();
+
+    /**
+     * \brief get CMC pointer
+     *
+     */
+    ia_cmc_t* getCmc() const;
+
+    /**
+     * \brief get CMC uintptr_t
+     *
+     */
+    uintptr_t getCmcHandle() const;
+
+    /**
+     * \brief get ISP data from CPF file
+     *
+     * \param[out] ia_binary_data *IspData: ISP data
+     */
+    void getIspData(ia_binary_data *IspData);
+
+    /**
+     * \brief get AIQ data from CPF file
+     *
+     * \param[out] ia_binary_data *AiqData: AIQ data
+     */
+    void getAiqData(ia_binary_data *AiqData);
+
+    /**
+     * \brief get others data from CPF file, including LTM data
+     *
+     * \param[out] ia_binary_data *otherData: others data
+     */
+    void getOtherData(ia_binary_data *otherData);
+
+    /**
+     * \brief parse CMC/ISP/AIQ/Others from the CPF data
+     *
+     * Parse the CMC/ISP/AIQ/Others data according to the tuning mode, and init
+     * the CMC handler.
+     *
+     * \param[in] int cameraId: camera id
+     * \param[in] ia_binary_data cpfData: CPF data loaded from the AIQB file
+     * \param[in] int mode: Tuning mode
+     *
+     * \return OK if init successfully; otherwise non-0 value is returned.
+     */
+    int init(int cameraId, ia_binary_data cpfData, TuningMode mode);
+
+    /**
+      * \brief deinit CMC handler.
+    */
+    void deinit();
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(CpfConf);
+
+    void initLardInputParam(int cameraId, ia_lard *iaLard, TuningMode mode, ia_lard_input_params *lardInputParam);
+    bool isTagValid(unsigned int tag, unsigned int count, const unsigned int *tags);
+
+private:
+    IntelLard* mLard;
+    std::unique_ptr<IntelCmc> mCmc;
+    ia_binary_data mAiq;
+    ia_binary_data mIsp;
+    ia_binary_data mOthers;
+};//end CpfConf
+
+/**
+  * CPF file operation class
+*/
+class CpfStore
+{
+public:
+    CpfStore(int cameraId, std::string sensorName);
+    virtual ~CpfStore();
+
+    /**
+     * get Isp and Aiq data info
+     *
+     * \param ispData: return isp data of struct ia_binary_data
+     * \param aiqData: return aiq data of struct ia_binary_data
+     * \param otherData: return other data of struct ia_binary_data, such as tuning data for LTM
+     * \param cmcHandle: return cmc uintptr_t
+     * \param mode: Camera Mode
+     * \param cmcData: return cmc pointer
+     * \return NO_INIT if data not found, return OK if success.
+     */
+    int getDataAndCmc(ia_binary_data *ispData,
+                      ia_binary_data *aiqData,
+                      ia_binary_data *otherData,
+                      uintptr_t *cmcHandle,
+                      TuningMode mode = TUNING_MODE_VIDEO,
+                      ia_cmc_t **cmcData = nullptr);
+private:
+    DISALLOW_COPY_AND_ASSIGN(CpfStore);
+
+    int findConfigFile(std::string& cpfPathName);
+    int loadConf(std::string aiqbName);
+
+public:
+    CpfConf* mCpfConfig[TUNING_MODE_MAX];
+    std::map<std::string, ia_binary_data> mCpfData;
+
+};//end CpfStore
+
+/**
+ * This class ia a wrapper class which includes CPF data, AIQD data and NVM data.
+ */
+class AiqInitData
+{
+public:
+    AiqInitData();
+    ~AiqInitData();
+
+    CpfStore* getCpfStore(int cameraId, const std::string& sensorName);
+    void* getNvmData(int cameraId);
+    AiqdData* getAiqdData(TuningMode tuningMode, const std::string& sensorName);
+
+private:
+    status_t loadNvmData(int cameraId);
+
+private:
+    CpfStore* mCpfStore;
+
+    // NVM data
+    std::unique_ptr <char[]> mNvmDataBuf;
+    ia_binary_data mNvmData;
+
+    std::map<TuningMode, AiqdData*> mAiqdDataMap;
+};
+
+}
diff --git a/camera/hal/intel/ipu6/src/platformdata/CameraParser.cpp b/camera/hal/intel/ipu6/src/platformdata/CameraParser.cpp
new file mode 100644
index 000000000000..9c3878af640d
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/CameraParser.cpp
@@ -0,0 +1,1939 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation
+ * Copyright 2008-2017, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define LOG_TAG "CameraParser"
+
+#include <string.h>
+#include <expat.h>
+#include <memory>
+
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+#include "metadata/ParameterHelper.h"
+
+#include "PlatformData.h"
+#include "CameraParser.h"
+
+#include "gc/GraphConfig.h"
+
+using std::string;
+using std::vector;
+
+#include "v4l2/NodeInfo.h"
+
+namespace icamera {
+#define  LIBCAMHAL_PROFILE_NAME "libcamhal_profile.xml"
+CameraParser::CameraParser(MediaControl *mc, PlatformData::StaticCfg *cfg) :
+    mStaticCfg(cfg),
+    mCurrentDataField(FIELD_INVALID),
+    mSensorNum(0),
+    mCurrentSensor(0),
+    pCurrentCam(nullptr),
+    mInMediaCtlCfg(false),
+    mInStaticMetadata(false),
+    mMC(mc),
+    mMetadataCache(nullptr) {
+    LOGXML("@%s", __func__);
+    CheckError(mc == nullptr || cfg == nullptr, VOID_VALUE,
+               "@%s, passed parameters are wrong, mc:%p, data:%p", __func__, mc, cfg);
+
+    mMetadataCache = new long[mMetadataCacheSize];
+    getProfileDataFromXmlFile();
+    getGraphConfigFromXmlFile();
+
+    if(gLogLevel & CAMERA_DEBUG_LOG_LEVEL2)
+        dumpSensorInfo();
+}
+
+CameraParser::~CameraParser()
+{
+    delete []mMetadataCache;
+}
+
+/**
+ * Replacing $I2CBUS with the real mI2CBus if the value contains the string "$I2CBUS"
+ * one example: "imx319 $I2CBUS"
+ * Replacing $CSI_PORT with the real mCsiPort if the value contains the string "$CSI_PORT"
+ * one example: "Intel IPU6 CSI-2 $CSI_PORT"
+ *
+ * \param profiles: the pointer of the CameraParser.
+ * \param value: camera information.
+ * \return: if the value contains the string, it will be replaced.
+ */
+string CameraParser::replaceStringInXml(CameraParser *profiles, const char *value)
+{
+    string valueTmp;
+    CheckError(value == nullptr, valueTmp, "value is nullptr");
+
+    valueTmp = value;
+    string::size_type found = string::npos;
+    if ((found = valueTmp.find("$I2CBUS")) != string::npos) {
+        valueTmp.replace(found, sizeof("$I2CBUS"), profiles->mI2CBus);
+        LOGXML("@%s, sensor full name is %s", __func__, valueTmp.c_str());
+    } else if ((found = valueTmp.find("$CSI_PORT")) != string::npos) {
+        valueTmp.replace(found, sizeof("$CSI_PORT"), profiles->mCsiPort);
+        LOGXML("@%s, csi entity full name is %s", __func__, valueTmp.c_str());
+    }
+
+    return valueTmp;
+}
+
+/**
+ * This function will check which field that the parser parses to.
+ *
+ * The field is set to 3 types.
+ * FIELD_INVALID FIELD_SENSOR and FIELD_COMMON
+ *
+ * \param profiles: the pointer of the CameraParser.
+ * \param name: the element's name.
+ * \param atts: the element's attribute.
+ */
+void CameraParser::checkField(CameraParser *profiles, const char *name, const char **atts)
+{
+    LOGXML("@%s, name:%s", __func__, name);
+    if (strcmp(name, "CameraSettings") == 0) {
+        profiles->mCurrentDataField = FIELD_INVALID;
+        return;
+    } else if (strcmp(name, "Sensor") == 0) {
+        profiles->mSensorNum++;
+        profiles->mCurrentSensor = profiles->mSensorNum - 1;
+        if (profiles->mCurrentSensor >= 0 && profiles->mCurrentSensor < MAX_CAMERA_NUMBER) {
+            profiles->pCurrentCam = new PlatformData::StaticCfg::CameraInfo;
+
+            int idx = 0;
+            string sensorEntityName;
+            string sinkEntityName;
+            while (atts[idx]) {
+                const char* key = atts[idx];
+                const char* val = atts[idx + 1];
+                LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
+                if (strcmp(key, "name") == 0) {
+                    profiles->pCurrentCam->sensorName = val;
+                } else if (strcmp(key, "description") == 0) {
+                    profiles->pCurrentCam->sensorDescription = val;
+                }
+                idx += 2;
+            }
+
+            if (!profiles->pCurrentCam->sensorName.empty() &&
+                (profiles->mAvailableSensor.find(profiles->pCurrentCam->sensorName) !=
+                 profiles->mAvailableSensor.end())) {
+                /* parameters information format example:
+                   sinkEntityName is "Intel IPU6 CSI-2 1"
+                   profiles->pCurrentCam->sensorName is "ov8856-wf"
+                   sensorName is "ov8856"
+                */
+                string sinkEntityName = profiles->mAvailableSensor[profiles->pCurrentCam->sensorName];
+                profiles->mCsiPort = sinkEntityName.substr(sinkEntityName.find_last_of(' ') + 1);
+                string sensorName = profiles->pCurrentCam->sensorName;
+                sensorName = sensorName.substr(0, (sensorName.find_last_of('-')));
+                profiles->mMC->getI2CBusAddress(sensorName, sinkEntityName, &profiles->mI2CBus);
+
+                LOGXML("@%s, mI2CBus:%s, cisPort:%s", __func__,
+                       profiles->mI2CBus.c_str(), profiles->mCsiPort.c_str());
+             }
+
+            profiles->mMetadata.clear();
+            profiles->mCurrentDataField = FIELD_SENSOR;
+
+            return;
+        }
+    } else if (strcmp(name, "Common") == 0) {
+        profiles->mCurrentDataField = FIELD_COMMON;
+        return;
+    }
+
+    LOGE("@%s, name:%s, atts[0]:%s, xml format wrong", __func__, name, atts[0]);
+    return;
+}
+
+/**
+ * This function will handle all the common related elements.
+ *
+ * It will be called in the function startElement
+ *
+ * \param profiles: the pointer of the CameraParser.
+ * \param name: the element's name.
+ * \param atts: the element's attribute.
+ */
+void CameraParser::handleCommon(CameraParser *profiles, const char *name, const char **atts)
+{
+    CheckError(strcmp(atts[0], "value") != 0 || (atts[1] == nullptr), VOID_VALUE
+         ,"@%s, name:%s, atts[0]:%s or atts[1] is nullptr, xml format wrong", __func__, name, atts[0]);
+
+    LOGXML("@%s, name:%s, atts[0]:%s, atts[1]: %s", __func__, name, atts[0], atts[1]);
+    CommonConfig *cfg = &profiles->mStaticCfg->mCommonConfig;
+    if (strcmp(name, "version") == 0) {
+        cfg->xmlVersion = atof(atts[1]);
+    } else if (strcmp(name, "platform") == 0) {
+        cfg->ipuName = atts[1];
+    } else if (strcmp(name, "availableSensors") == 0) {
+        parseXmlConvertStrings(atts[1], cfg->availableSensors, convertCharToString);
+    }
+}
+
+/**
+ * This function will handle all the sensor related elements.
+ *
+ * It will be called in the function startElement
+ *
+ * \param profiles: the pointer of the CameraParser.
+ * \param name: the element's name.
+ * \param atts: the element's attribute.
+ */
+void CameraParser::handleSensor(CameraParser *profiles, const char *name, const char **atts)
+{
+    LOGXML("@%s, name:%s, profiles->mCurrentSensor:%d", __func__, name, profiles->mCurrentSensor);
+    CheckError(strcmp(atts[0], "value") != 0 || (atts[1] == nullptr), VOID_VALUE
+        ,"@%s, name:%s, atts[0]:%s or atts[1] is nullptr, xml format wrong", __func__, name, atts[0]);
+
+    LOGXML("@%s, name:%s, atts[0]:%s, atts[1]:%s", __func__, name, atts[0], atts[1]);
+    if (strcmp(name, "supportedISysSizes") == 0) {
+        parseSizesList(atts[1], pCurrentCam->mSupportedISysSizes);
+        for (const auto &s : pCurrentCam->mSupportedISysSizes)
+            LOGXML("@%s, mSupportedISysSizes: width:%d, height:%d", __func__,
+                s.width, s.height);
+    } else if (strcmp(name, "supportedISysFormat") == 0) {
+        getSupportedFormat(atts[1], pCurrentCam->mSupportedISysFormat);
+    } else if (strcmp(name, "iSysRawFormat") == 0) {
+        pCurrentCam->mISysRawFormat = CameraUtils::string2PixelCode(atts[1]);
+    } else if (strcmp(name, "configModeToStreamId") == 0) {
+        char* srcDup = strdup(atts[1]);
+        CheckError(!srcDup, VOID_VALUE, "Create a copy of source string failed.");
+
+        char* endPtr = (char*)strchr(srcDup, ',');
+        if (endPtr) {
+            *endPtr = 0;
+            ConfigMode configMode = CameraUtils::getConfigModeByName(srcDup);
+            int streamId = atoi(endPtr + 1);
+            pCurrentCam->mConfigModeToStreamId[configMode] = streamId;
+        }
+        free(srcDup);
+    } else if (strcmp(name, "pSysFormat") == 0) {
+        getSupportedFormat(atts[1], pCurrentCam->mPSysFormat);
+    } else if (strcmp(name, "enableAIQ") == 0) {
+        pCurrentCam->mEnableAIQ = strcmp(atts[1], "true") == 0;
+    } else if (strcmp(name, "useCrlModule") == 0) {
+        pCurrentCam->mUseCrlModule = strcmp(atts[1], "true") == 0;
+    } else if (strcmp(name, "skipFrameV4L2Error") == 0) {
+        pCurrentCam->mSkipFrameV4L2Error = strcmp(atts[1], "true") == 0;
+    } else if (strcmp(name, "useSensorDigitalGain") == 0) {
+        pCurrentCam->mUseSensorDigitalGain = strcmp(atts[1], "true") == 0;
+    } else if (strcmp(name, "useIspDigitalGain") == 0) {
+        pCurrentCam->mUseIspDigitalGain = strcmp(atts[1], "true") == 0;
+    } else if (strcmp(name, "preRegisterBuffer") == 0) {
+        pCurrentCam->mNeedPreRegisterBuffers = strcmp(atts[1], "true") == 0;
+    } else if (strcmp(name, "enableFrameSyncCheck") == 0) {
+        pCurrentCam->mFrameSyncCheckEnabled = strcmp(atts[1], "true") == 0;
+    } else if (strcmp(name, "lensName") == 0) {
+        profiles->mMC->getVCMI2CAddr(atts[1], &pCurrentCam->mLensName);
+    } else if (strcmp(name, "lensHwType") == 0) {
+        if (strcmp(atts[1], "LENS_VCM_HW") == 0) {
+            pCurrentCam->mLensHwType = LENS_VCM_HW;
+        } else {
+            LOGE("unknown Lens HW type %s, set to LENS_NONE_HW", atts[1]);
+            pCurrentCam->mLensHwType = LENS_NONE_HW;
+        }
+    } else if (strcmp(name, "autoSwitchType") == 0) {
+        if (strcmp(atts[1], "full") == 0) {
+            pCurrentCam->mAutoSwitchType = AUTO_SWITCH_FULL;
+        } else {
+            pCurrentCam->mAutoSwitchType = AUTO_SWITCH_PSYS;
+        }
+    } else if (strcmp(name, "lensCloseCode") == 0) {
+        pCurrentCam->mLensCloseCode = atoi(atts[1]);
+    } else if (strcmp(name, "cITMaxMargin") == 0) {
+        pCurrentCam->mCITMaxMargin = atoi(atts[1]);
+    } else if (strcmp(name, "ltmGainLag") == 0) {
+        pCurrentCam->mLtmGainLag = atoi(atts[1]);
+    } else if (strcmp(name, "enableLtmThread") == 0) {
+        pCurrentCam->mEnableLtmThread = strcmp(atts[1], "true") == 0;
+    } else if (strcmp(name, "enableLtmDefog") == 0) {
+        pCurrentCam->mEnableLtmDefog = strcmp(atts[1], "true") == 0;
+    } else if (strcmp(name, "maxSensorDg") == 0) {
+        pCurrentCam->mMaxSensorDigitalGain = atoi(atts[1]);
+    } else if (strcmp(name, "sensorDgType") == 0) {
+        if (strcmp(atts[1], "type_2_x") == 0) {
+            pCurrentCam->mSensorDgType = SENSOR_DG_TYPE_2_X;
+        } else if (strcmp(atts[1], "type_x") == 0) {
+            pCurrentCam->mSensorDgType = SENSOR_DG_TYPE_X;
+        } else {
+            LOGE("unknown sensor digital gain type:%s, set to SENSOR_DG_TYPE_NONE", atts[1]);
+            pCurrentCam->mSensorDgType = SENSOR_DG_TYPE_NONE;
+        }
+    } else if (strcmp(name, "exposureLag") == 0) {
+        pCurrentCam->mExposureLag = atoi(atts[1]);
+    } else if (strcmp(name, "graphSettingsFile") == 0) {
+        pCurrentCam->mGraphSettingsFile = atts[1];
+    } else if (strcmp(name, "graphSettingsType") == 0) {
+        if (strcmp(atts[1], "coupled") == 0) {
+            pCurrentCam->mGraphSettingsType = COUPLED;
+        } else if (strcmp(atts[1], "dispersed") == 0) {
+            pCurrentCam->mGraphSettingsType = DISPERSED;
+        } else {
+            LOGW("unknown graph settings type %s, set to COUPLED", atts[1]);
+            pCurrentCam->mGraphSettingsType = COUPLED;
+        }
+    } else if (strcmp(name, "gainLag") == 0) {
+        pCurrentCam->mGainLag = atoi(atts[1]);
+    } else if (strcmp(name, "customAicLibraryName") == 0) {
+        pCurrentCam->mCustomAicLibraryName = atts[1];
+    } else if (strcmp(name, "custom3ALibraryName") == 0){
+        pCurrentCam->mCustom3ALibraryName = atts[1];
+    } else if (strcmp(name, "yuvColorRangeMode") == 0) {
+        if (strcmp(atts[1],"full") == 0) {
+            pCurrentCam->mYuvColorRangeMode = CAMERA_FULL_MODE_YUV_COLOR_RANGE;
+        } else if (strcmp(atts[1],"reduced") == 0) {
+            pCurrentCam->mYuvColorRangeMode = CAMERA_REDUCED_MODE_YUV_COLOR_RANGE;
+        }
+    } else if (strcmp(name, "initialSkipFrame") == 0) {
+        pCurrentCam->mInitialSkipFrame = atoi(atts[1]);
+    } else if (strcmp(name, "maxRawDataNum") == 0) {
+        pCurrentCam->mMaxRawDataNum = atoi(atts[1]);
+    }  else if (strcmp(name, "topBottomReverse") == 0) {
+        pCurrentCam->mTopBottomReverse = strcmp(atts[1], "true") == 0;
+    } else if (strcmp(name, "maxRequestsInflight") == 0) {
+        pCurrentCam->mMaxRequestsInflight = atoi(atts[1]);
+    } else if (strcmp(name, "psysContinueStats") == 0) {
+        pCurrentCam->mPsysContinueStats = strcmp(atts[1], "true") == 0;
+    } else if (strcmp(name, "preferredBufQSize") == 0) {
+        pCurrentCam->mPreferredBufQSize = atoi(atts[1]);
+    } else if (strcmp(name, "pipeSwitchDelayFrame") == 0) {
+        pCurrentCam->mPipeSwitchDelayFrame = atoi(atts[1]);
+    } else if (strcmp(name, "supportedTuningConfig") == 0) {
+        parseSupportedTuningConfig(atts[1], pCurrentCam->mSupportedTuningConfig);
+    } else if (strcmp(name, "enableAiqd") == 0) {
+        pCurrentCam->mEnableAiqd = strcmp(atts[1], "true") == 0;
+    } else if (strcmp(name, "testPatternMap") == 0) {
+        int size = strlen(atts[1]);
+        char src[size + 1];
+        MEMCPY_S(src, size, atts[1], size);
+        src[size] = '\0';
+        int32_t mode = TEST_PATTERN_OFF;
+        char* savePtr = nullptr;
+
+        char* tablePtr = strtok_r(src, ",", &savePtr);
+        while (tablePtr) {
+            if (strcmp(tablePtr, "Off") == 0) {
+                mode = TEST_PATTERN_OFF;
+            } else if (strcmp(tablePtr, "ColorBars") == 0) {
+                mode = COLOR_BARS;
+            } else if (strcmp(tablePtr, "SolidColor") == 0) {
+                mode = SOLID_COLOR;
+            } else if (strcmp(tablePtr, "ColorBarsFadeToGray") == 0) {
+                mode = COLOR_BARS_FADE_TO_GRAY;
+            } else if (strcmp(tablePtr, "PN9") == 0) {
+                mode = PN9;
+            } else if (strcmp(tablePtr, "CUSTOM1") == 0) {
+                mode = TEST_PATTERN_CUSTOM1;
+            } else {
+                LOGE("Test pattern string %s is unknown, please check", tablePtr);
+                return;
+            }
+
+            tablePtr = strtok_r(nullptr, ",", &savePtr);
+            CheckError(tablePtr == nullptr, VOID_VALUE, "Driver test pattern is nullptr");
+
+            pCurrentCam->mTestPatternMap[mode] = atoi(tablePtr);
+
+            tablePtr = strtok_r(nullptr, ",", &savePtr);
+        }
+    } else if (strcmp(name, "lardTags") == 0) {
+        parseLardTags(atts[1], pCurrentCam->mLardTagsConfig);
+    } else if (strcmp(name, "availableConfigModeForAuto") == 0) {
+        parseXmlConvertStrings(atts[1], pCurrentCam->mConfigModesForAuto, CameraUtils::getConfigModeByName);
+    } else if (strcmp(name, "supportedAeMultiExpRange") == 0) {
+        parseMultiExpRange(atts[1]);
+    } else if (strcmp(name, "dvsType") == 0) {
+        if (strcmp(atts[1], "MORPH_TABLE") == 0) {
+            pCurrentCam->mDVSType = MORPH_TABLE;
+        } else if (strcmp(atts[1], "IMG_TRANS") == 0) {
+            pCurrentCam->mDVSType = IMG_TRANS;
+        }
+    } else if (strcmp(name, "pslOutputMapForRotation") == 0) {
+        parseOutputMap(atts[1], pCurrentCam->mOutputMap);
+    } else if (strcmp(name, "maxNvmDataSize") == 0) {
+        pCurrentCam->mMaxNvmDataSize = atoi(atts[1]);
+    } else if (strcmp(name, "nvmDirectory") == 0) {
+        pCurrentCam->mNvmDirectory = atts[1];
+    } else if (strcmp(name, "isISYSCompression") == 0) {
+        pCurrentCam->mISYSCompression = strcmp(atts[1], "true") == 0;
+    } else if (strcmp(name, "isPSACompression") == 0) {
+        pCurrentCam->mPSACompression = strcmp(atts[1], "true") == 0;
+    } else if (strcmp(name, "isOFSCompression") == 0) {
+        pCurrentCam->mOFSCompression = strcmp(atts[1], "true") == 0;
+    } else if (strcmp(name, "faceAeEnabled") == 0) {
+        pCurrentCam->mFaceAeEnabled = strcmp(atts[1], "true") == 0;
+    } else if (strcmp(name, "psysAlignWithSof") == 0) {
+        pCurrentCam->mPsysAlignWithSof = strcmp(atts[1], "true") == 0;
+    } else if (strcmp(name, "swProcessingAlignWithIsp") == 0) {
+        pCurrentCam->mSwProcessingAlignWithIsp = strcmp(atts[1], "true") == 0;
+    } else if (strcmp(name, "faceEngineRunningInterval") == 0) {
+        int val = atoi(atts[1]);
+        pCurrentCam->mFaceEngineRunningInterval =
+            val > 0 ? val : FACE_ENGINE_DEFAULT_RUNNING_INTERVAL;
+    } else if (strcmp(name, "faceEngineRunningIntervalNoFace") == 0) {
+        int val = atoi(atts[1]);
+        pCurrentCam->mFaceEngineRunningIntervalNoFace =
+            val > 0 ? val : FACE_ENGINE_DEFAULT_RUNNING_INTERVAL;
+    }  else if (strcmp(name, "faceEngineRunningSync") == 0) {
+        pCurrentCam->mFaceEngineRunningSync = strcmp(atts[1], "true") == 0;
+    }
+}
+
+int CameraParser::parseSupportedTuningConfig(const char *str, vector <TuningConfig> &config)
+{
+    CheckError(str == nullptr, -1, "@%s, str is nullptr", __func__);
+    LOGXML("@%s, str = %s", __func__, str);
+
+    int sz = strlen(str);
+    char src[sz + 1];
+    MEMCPY_S(src, sz, str, sz);
+    src[sz] = '\0';
+    char *savePtr;
+    char *configMode = strtok_r(src, ",", &savePtr);
+    TuningConfig cfg;
+    while (configMode) {
+        char* tuningMode = strtok_r(nullptr, ",", &savePtr);
+        char* aiqb = strtok_r(nullptr, ",", &savePtr);
+        CheckError(configMode == nullptr || tuningMode == nullptr
+              || aiqb == nullptr, -1, "@%s, wrong str %s", __func__, str);
+
+        LOGXML("@%s, configMode %s, tuningMode %s, aiqb name %s",
+                __func__, configMode, tuningMode, aiqb);
+        cfg.configMode = CameraUtils::getConfigModeByName(configMode);
+        cfg.tuningMode = CameraUtils::string2TuningMode(tuningMode);
+        cfg.aiqbName = aiqb;
+        config.push_back(cfg);
+        if (savePtr != nullptr)
+            savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
+        configMode = strtok_r(nullptr, ",", &savePtr);
+    }
+    return 0;
+}
+
+int CameraParser::parseLardTags(const char *str, vector <LardTagConfig> &lardTags)
+{
+    CheckError(str == nullptr, -1, "@%s, str is nullptr", __func__);
+    LOGXML("@%s, str = %s", __func__, str);
+
+    int sz = strlen(str);
+    char src[sz + 1];
+    MEMCPY_S(src, sz, str, sz);
+    src[sz] = '\0';
+
+    char *savePtr;
+    char *tuningMode = strtok_r(src, ",", &savePtr);
+    LardTagConfig cfg;
+    while (tuningMode) {
+        char* cmcTag = strtok_r(nullptr, ",", &savePtr);
+        char* aiqTag = strtok_r(nullptr, ",", &savePtr);
+        char* ispTag = strtok_r(nullptr, ",", &savePtr);
+        char* othersTag = strtok_r(nullptr, ",", &savePtr);
+
+        cfg.tuningMode = CameraUtils::string2TuningMode(tuningMode);
+        cfg.cmcTag = CameraUtils::fourcc2UL(cmcTag);
+        cfg.aiqTag = CameraUtils::fourcc2UL(aiqTag);
+        cfg.ispTag = CameraUtils::fourcc2UL(ispTag);
+        cfg.othersTag = CameraUtils::fourcc2UL(othersTag);
+        CheckError(cfg.cmcTag == 0 || cfg.aiqTag == 0 || cfg.ispTag == 0
+              || cfg.othersTag == 0, -1, "@%s, wrong str %s", __func__, str);
+
+        lardTags.push_back(cfg);
+        LOGXML("@%s, tuningMode %s, cmc %s, aiq %s, isp %s, others %s",
+                __func__, tuningMode, cmcTag, aiqTag, ispTag, othersTag);
+
+        if (savePtr != nullptr)
+            savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
+        tuningMode = strtok_r(nullptr, ",", &savePtr);
+    }
+
+    return 0;
+}
+
+void CameraParser::parseMediaCtlConfigElement(CameraParser *profiles, const char *name, const char **atts)
+{
+    MediaCtlConf mc;
+    int idx = 0;
+
+    while (atts[idx]) {
+        const char *key = atts[idx];
+        LOGXML("%s: name: %s, value: %s", __func__, atts[idx], atts[idx + 1]);
+        if (strcmp(key, "id") == 0) {
+            mc.mcId = strtol(atts[idx + 1], nullptr, 10);
+        } else if (strcmp(key, "ConfigMode") == 0) {
+            parseXmlConvertStrings(atts[idx + 1], mc.configMode, CameraUtils::getConfigModeByName);
+        } else if (strcmp(key, "outputWidth") == 0) {
+            mc.outputWidth = strtoul(atts[idx + 1], nullptr, 10);
+        } else if (strcmp(key, "outputHeight") == 0) {
+            mc.outputHeight = strtoul(atts[idx + 1], nullptr, 10);
+        } else if (strcmp(key, "format") == 0) {
+            mc.format = CameraUtils::string2PixelCode(atts[idx + 1]);
+        }
+        idx += 2;
+    }
+
+    LOGXML("@%s, name:%s, atts[0]:%s, id: %d", __func__, name, atts[0], mc.mcId);
+    //Add a new empty MediaControl Configuration
+    profiles->pCurrentCam->mMediaCtlConfs.push_back(mc);
+}
+
+#define V4L2_CID_WATERMARK  0x00982901
+#define V4L2_CID_WATERMARK2 0x00982902
+void CameraParser::parseControlElement(CameraParser *profiles, const char *name, const char **atts)
+{
+    McCtl ctl;
+    MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
+    LOGXML("@%s, name:%s", __func__, name);
+
+    int idx = 0;
+    while (atts[idx]) {
+        const char* key = atts[idx];
+        const char* val = atts[idx + 1];
+        LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx + 1, val);
+        if (strcmp(key, "name") == 0) {
+            ctl.entityName = replaceStringInXml(profiles, val);
+            ctl.entity = profiles->mMC->getEntityIdByName(ctl.entityName.c_str());
+        } else if (strcmp(key, "ctrlId") == 0) {
+            if (!strcmp(val, "V4L2_CID_LINK_FREQ")) {
+                ctl.ctlCmd = V4L2_CID_LINK_FREQ;
+            } else if (!strcmp(val, "V4L2_CID_VBLANK")) {
+                ctl.ctlCmd = V4L2_CID_VBLANK;
+            } else if (!strcmp(val, "V4L2_CID_HBLANK")) {
+                ctl.ctlCmd = V4L2_CID_HBLANK;
+            } else if (!strcmp(val, "V4L2_CID_EXPOSURE")) {
+                ctl.ctlCmd = V4L2_CID_EXPOSURE;
+            } else if (!strcmp(val, "V4L2_CID_ANALOGUE_GAIN")) {
+                ctl.ctlCmd = V4L2_CID_ANALOGUE_GAIN;
+            } else if (!strcmp(val, "V4L2_CID_HFLIP")) {
+                ctl.ctlCmd = V4L2_CID_HFLIP;
+            } else if (!strcmp(val, "V4L2_CID_VFLIP")) {
+                ctl.ctlCmd = V4L2_CID_VFLIP;
+            } else if (!strcmp(val, "V4L2_CID_WATERMARK")) {
+                ctl.ctlCmd = V4L2_CID_WATERMARK;
+            } else if (!strcmp(val, "V4L2_CID_WATERMARK2")) {
+                ctl.ctlCmd = V4L2_CID_WATERMARK2;
+            } else if (!strcmp(val, "V4L2_CID_TEST_PATTERN")) {
+                ctl.ctlCmd = V4L2_CID_TEST_PATTERN;
+            } else {
+                LOGE("Unknow ioctl command %s", val);
+                ctl.ctlCmd = -1;
+            }
+        } else if (strcmp(key, "value") == 0) {
+            ctl.ctlValue = strtoul(val, nullptr, 10);
+        } else if (strcmp(key, "ctrlName") == 0) {
+            ctl.ctlName = val;
+        }
+        idx += 2;
+    }
+
+    mc.ctls.push_back(ctl);
+}
+
+void CameraParser::parseSelectionElement(CameraParser *profiles, const char *name, const char **atts)
+{
+    McFormat sel;
+    MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
+    LOGXML("@%s, name:%s", __func__, name);
+
+    sel.top = -1; //top is not specified, need to be calc later.
+    sel.left = -1; //left is not specified, need to be calc later.
+    sel.width = 0; //width is not specified, need to be calc later.
+    sel.height = 0; //height is not specified, need to be calc later.
+    sel.formatType = FC_SELECTION;
+
+    int idx = 0;
+    while (atts[idx]) {
+        const char* key = atts[idx];
+        const char* val = atts[idx + 1];
+        LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
+        if (strcmp(key, "name") == 0) {
+            sel.entityName = replaceStringInXml(profiles, val);
+            sel.entity = profiles->mMC->getEntityIdByName(sel.entityName.c_str());
+        } else if (strcmp(key, "pad") == 0) {
+            sel.pad = strtoul(val, nullptr, 10);
+        } else if (strcmp(key, "target") == 0) {
+            if (!strcmp(val, "V4L2_SEL_TGT_COMPOSE")) {
+                sel.selCmd = V4L2_SEL_TGT_COMPOSE;
+            } else if (!strcmp(val, "V4L2_SEL_TGT_CROP")) {
+                sel.selCmd = V4L2_SEL_TGT_CROP;
+            }
+        } else if (strcmp(key, "top") == 0) {
+            sel.top = strtoul(val, nullptr, 10);
+        } else if (strcmp(key, "left") == 0) {
+            sel.left = strtoul(val, nullptr, 10);
+        } else if (strcmp(key, "width") == 0) {
+            sel.width = strtoul(val, nullptr, 10);
+        } else if (strcmp(key, "height") == 0) {
+            sel.height = strtoul(val, nullptr, 10);
+        }
+        idx += 2;
+    }
+
+    mc.formats.push_back(sel);
+}
+
+/**
+ * Store the MediaCtlConf mapping table for supportedStreamConfig by id.
+ * Then we can select the MediaCtlConf through this table and configured stream.
+ */
+void CameraParser::storeMcMappForConfig(int mcId, supported_stream_config_t streamCfg)
+{
+    //We need to insert new one if mcId isn't in mStreamToMcMap.
+    if (pCurrentCam->mStreamToMcMap.find(mcId) == pCurrentCam->mStreamToMcMap.end()) {
+        pCurrentCam->mStreamToMcMap.insert(std::pair<int, supported_stream_config_array_t>(mcId, supported_stream_config_array_t()));
+    }
+
+    supported_stream_config_array_t &streamVector = pCurrentCam->mStreamToMcMap[mcId];
+    streamVector.push_back(streamCfg);
+}
+
+/**
+ * \brief Parses the string with the supported stream configurations
+ * a stream configuration is made of 4 necessary elements
+ * - Format
+ * - Resolution
+ * - Field (Interlaced field)
+ * - Media config ID
+ * we parse the string in 4 steps
+ * example of valid stream configuration is: V4L2_PIX_FMT_NV12,1920x1080,0,0
+
+ * the following elements are optional:
+ * - Max fps, for continuous streaming and high quality capture. (optional)
+ * example: V4L2_PIX_FMT_NV12,1920x1080,0,0,(30/15)
+ *
+ * \param src: string to be parsed
+ * \param configs: Stream config array needs to be filled in
+ *
+ */
+void CameraParser::parseStreamConfig(const char* src, supported_stream_config_array_t& configs)
+{
+    HAL_TRACE_CALL(1);
+
+    int mcId = -1;
+    char* endPtr = nullptr;
+    char* separatorPtr = nullptr;
+    int parseStep = 0;
+    supported_stream_config_t config;
+    CLEAR(config);
+
+#define NUM_ELEMENTS_NECESSARY 4
+// Has optional element
+#define NUM_ELEMENTS (NUM_ELEMENTS_NECESSARY + 1)
+
+    bool lastElement = false; // the last one?
+    do {
+        parseStep++;
+
+        bool fetchElement = false;
+        // Get the next segement for necessary element
+        // Get the next segement for optional element if it exist
+        if (parseStep <= NUM_ELEMENTS_NECESSARY
+            || (!lastElement && (*src == '('))) {
+            fetchElement = true;
+
+            separatorPtr = (char *)strchr(src, ',');
+            if (separatorPtr) {
+                *separatorPtr = 0;
+            } else {
+                lastElement = true;
+            }
+        }
+
+        switch (parseStep) {
+            case 1: // Step 1: Parse format
+                LOGXML("stream format is %s", src);
+                config.format = CameraUtils::string2PixelCode(src);
+                CheckError(config.format == -1, VOID_VALUE, "@%s, format fails", __func__);
+                break;
+            case 2: // Step 2: Parse the resolution
+                config.width = strtol(src, &endPtr, 10);
+                CheckError(!endPtr || *endPtr != 'x', VOID_VALUE, "@%s, width fails", __func__);
+                src = endPtr + 1;
+                config.height = strtol(src, &endPtr, 10);
+                LOGXML("(%dx%d)", config.width, config.height);
+                break;
+            case 3: // Step 3: Parse field
+                config.field = strtol(src, &endPtr, 10);
+                LOGXML("stream field is %d", config.field);
+                break;
+            case 4: // Step 4: Parse MediaCtlConf id.
+                mcId = strtol(src, &endPtr, 10);
+                CheckError(mcId < 0, VOID_VALUE, "@%s, mcId fails", __func__);
+                LOGXML("the mcId for supported stream config is %d", mcId);
+                break;
+            case 5: // Step 5: Parse optional
+                if (fetchElement) {
+                    src++; // skip '('
+                    config.maxVideoFps = strtol(src, &endPtr, 10);
+                    CheckError(!endPtr || *endPtr != '/', VOID_VALUE, "@%s, maxVideoFps fails", __func__);
+                    src = endPtr + 1; // skip '/'
+                    config.maxCaptureFps = strtol(src, &endPtr, 10);
+                    CheckError(!endPtr || *endPtr != '/', VOID_VALUE, "@%s, maxCaptureFps fails", __func__);
+                    src = endPtr + 1; // skip '/'
+                    config.streamType = strtol(src, &endPtr, 10);
+                    CheckError(config.streamType < CAMERA_STREAM_OUTPUT ||
+                               config.streamType > CAMERA_STREAM_BIDIRECTIONAL, VOID_VALUE,
+                               "@%s, streamType:%d fails", __func__, config.streamType);
+                    LOGXML("@%s, maxVideoFps:%d, maxCaptureFps:%d, streamType:%d", __func__,
+                           config.maxVideoFps, config.maxCaptureFps, config.streamType);
+                } else {
+                    LOGXML("no max fps for supported stream config, use default");
+                    config.maxVideoFps = 30;
+                    config.maxCaptureFps = 30;
+                    config.streamType = 0;
+                }
+                break;
+        }
+
+        if (!lastElement) {
+            // Move to the next element
+            src = separatorPtr + 1;
+            src = skipWhiteSpace(src);
+        } else if (parseStep < NUM_ELEMENTS_NECESSARY ){
+            LOGE("Malformed stream configuration, only finish step %d", parseStep);
+            return;
+        }
+
+        // Finish all elements for one config
+        if (parseStep >= NUM_ELEMENTS) {
+            configs.push_back(config);
+            storeMcMappForConfig(mcId, config);
+            CLEAR(config);
+            mcId = -1;
+            parseStep = 0;
+            LOGXML("Stream Configuration found");
+            if (lastElement) {
+                break;
+            }
+        }
+    } while (true);
+}
+
+void CameraParser::parseSupportedFeatures(const char* src, camera_features_list_t& features)
+{
+    HAL_TRACE_CALL(1);
+
+    char * endPtr = nullptr;
+    camera_features feature = INVALID_FEATURE;
+    do {
+        endPtr = (char *)strchr(src, ',');
+        if (endPtr) {
+            *endPtr = 0;
+        }
+        if (strcmp(src, "MANUAL_EXPOSURE") == 0) {
+            feature = MANUAL_EXPOSURE;
+        } else if (strcmp(src, "MANUAL_WHITE_BALANCE") == 0) {
+            feature = MANUAL_WHITE_BALANCE;
+        } else if (strcmp(src, "IMAGE_ENHANCEMENT") == 0) {
+            feature = IMAGE_ENHANCEMENT;
+        } else if (strcmp(src, "NOISE_REDUCTION") == 0) {
+            feature = NOISE_REDUCTION;
+        } else if (strcmp(src, "SCENE_MODE") == 0) {
+            feature = SCENE_MODE;
+        } else if (strcmp(src, "WEIGHT_GRID_MODE") == 0) {
+            feature = WEIGHT_GRID_MODE;
+        } else if (strcmp(src, "PER_FRAME_CONTROL") == 0) {
+            feature = PER_FRAME_CONTROL;
+        } else if (strcmp(src, "ISP_CONTROL") == 0) {
+            feature = ISP_CONTROL;
+        } else {
+            feature = INVALID_FEATURE;
+        }
+
+        if (feature != INVALID_FEATURE) {
+            features.push_back(feature);
+        }
+
+        if (endPtr) {
+            src = endPtr + 1;
+            src = skipWhiteSpace(src);
+        }
+    } while (endPtr);
+}
+
+int CameraParser::parseSupportedVideoStabilizationMode(const char* str, camera_video_stabilization_list_t &supportedModes)
+{
+    HAL_TRACE_CALL(1);
+    CheckError(str == nullptr, -1, "@%s, str is nullptr", __func__);
+
+    char *savePtr, *tablePtr;
+    int sz = strlen(str);
+    char src[sz + 1];
+    MEMCPY_S(src, sz, str, sz);
+    src[sz] = '\0';
+    camera_video_stabilization_mode_t mode = VIDEO_STABILIZATION_MODE_OFF;
+
+    tablePtr = strtok_r(src, ",", &savePtr);
+    while (tablePtr) {
+        if (strcmp(tablePtr, "ON") == 0) {
+            mode = VIDEO_STABILIZATION_MODE_ON;
+        } else if (strcmp(tablePtr, "OFF") == 0) {
+            mode = VIDEO_STABILIZATION_MODE_OFF;
+        }
+        supportedModes.push_back(mode);
+
+        if (savePtr != nullptr)
+            savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
+        tablePtr = strtok_r(nullptr, ",", &savePtr);
+    }
+
+    return OK;
+}
+
+int CameraParser::parseSupportedAeMode(const char* str, vector <camera_ae_mode_t> &supportedModes)
+{
+    HAL_TRACE_CALL(1);
+    CheckError(str == nullptr, -1, "@%s, str is nullptr", __func__);
+
+    char *savePtr, *tablePtr;
+    int sz = strlen(str);
+    char src[sz + 1];
+    MEMCPY_S(src, sz, str, sz);
+    src[sz] = '\0';
+    camera_ae_mode_t aeMode = AE_MODE_AUTO;
+
+    tablePtr = strtok_r(src, ",", &savePtr);
+    while (tablePtr) {
+        if (strcmp(tablePtr, "AUTO") == 0) {
+            aeMode = AE_MODE_AUTO;
+        } else if (strcmp(tablePtr, "MANUAL") == 0) {
+            aeMode = AE_MODE_MANUAL;
+        }
+        supportedModes.push_back(aeMode);
+        if (savePtr != nullptr)
+            savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
+        tablePtr = strtok_r(nullptr, ",", &savePtr);
+    }
+
+    return OK;
+}
+
+int CameraParser::parseSupportedAfMode(const char* str, vector <camera_af_mode_t> &supportedModes)
+{
+    HAL_TRACE_CALL(1);
+    CheckError(str == NULL, -1, "@%s, str is NULL", __func__);
+
+    char *savePtr, *tablePtr;
+    int sz = strlen(str);
+    char src[sz + 1];
+    MEMCPY_S(src, sz, str, sz);
+    src[sz] = '\0';
+    camera_af_mode_t afMode = AF_MODE_AUTO;
+
+    tablePtr = strtok_r(src, ",", &savePtr);
+    while (tablePtr) {
+        if (strcmp(tablePtr, "AUTO") == 0) {
+            afMode = AF_MODE_AUTO;
+        } else if (strcmp(tablePtr, "MACRO") == 0) {
+            afMode = AF_MODE_MACRO;
+        } else if (strcmp(tablePtr, "CONTINUOUS_VIDEO") == 0) {
+            afMode = AF_MODE_CONTINUOUS_VIDEO;
+        } else if (strcmp(tablePtr, "CONTINUOUS_PICTURE") == 0) {
+            afMode = AF_MODE_CONTINUOUS_PICTURE;
+        } else if (strcmp(tablePtr, "OFF") == 0) {
+            afMode = AF_MODE_OFF;
+        }
+        supportedModes.push_back(afMode);
+        if (savePtr != NULL)
+            savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
+        tablePtr = strtok_r(NULL, ",", &savePtr);
+    }
+
+    return OK;
+}
+
+int CameraParser::parseSupportedAntibandingMode(const char* str, vector <camera_antibanding_mode_t> &supportedModes)
+{
+    HAL_TRACE_CALL(1);
+    CheckError(str == nullptr, -1, "@%s, str is nullptr", __func__);
+
+    char *savePtr, *tablePtr;
+    int sz = strlen(str);
+    char src[sz + 1];
+    MEMCPY_S(src, sz, str, sz);
+    src[sz] = '\0';
+    camera_antibanding_mode_t antibandingMode = ANTIBANDING_MODE_OFF;
+
+    tablePtr = strtok_r(src, ",", &savePtr);
+    while (tablePtr) {
+        if (strcmp(tablePtr, "AUTO") == 0) {
+            antibandingMode = ANTIBANDING_MODE_AUTO;
+        } else if (strcmp(tablePtr, "50Hz") == 0) {
+            antibandingMode = ANTIBANDING_MODE_50HZ;
+        } else if (strcmp(tablePtr, "60Hz") == 0) {
+            antibandingMode = ANTIBANDING_MODE_60HZ;
+        } else if (strcmp(tablePtr, "OFF") == 0) {
+            antibandingMode = ANTIBANDING_MODE_OFF;
+        }
+        supportedModes.push_back(antibandingMode);
+        if (savePtr != nullptr)
+            savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
+        tablePtr = strtok_r(nullptr, ",", &savePtr);
+    }
+
+    return OK;
+}
+
+int CameraParser::parseSupportedAeParamRange(const char* src, vector<int>& scenes,
+        vector<float>& minValues, vector<float>& maxValues)
+{
+    HAL_TRACE_CALL(1);
+    char* srcDup = strdup(src);
+    CheckError((srcDup == nullptr), NO_MEMORY, "Create a copy of source string failed.");
+
+    char* srcTmp = srcDup;
+    char* endPtr = nullptr;
+    while ((endPtr = (char *)strchr(srcTmp, ','))) {
+        if (endPtr) *endPtr = 0;
+
+        camera_scene_mode_t scene = CameraUtils::getSceneModeByName(srcTmp);
+        scenes.push_back(scene);
+        if (endPtr) {
+            srcTmp = endPtr + 1;
+            srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
+        }
+
+        float min = strtof(srcTmp, &endPtr);
+        minValues.push_back(min);
+        if (endPtr == nullptr || *endPtr != ',') {
+            LOGE("Malformed ET range in exposure time range configuration");
+            free(srcDup);
+            return UNKNOWN_ERROR;
+        }
+        srcTmp = endPtr + 1;
+        float max = strtof(srcTmp, &endPtr);
+        maxValues.push_back(max);
+
+        if (endPtr) {
+            srcTmp = endPtr + 1;
+            srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
+        }
+    }
+    free(srcDup);
+    return OK;
+}
+
+void CameraParser::parseFormatElement(CameraParser *profiles, const char *name, const char **atts)
+{
+    LOGXML("@%s, name:%s", __func__, name);
+
+    McFormat fmt;
+    fmt.type = RESOLUTION_TARGET;
+
+    int idx = 0;
+    while (atts[idx]) {
+        const char* key = atts[idx];
+        const char* val = atts[idx + 1];
+        LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
+        if (strcmp(key, "name") == 0) {
+            fmt.entityName = replaceStringInXml(profiles, val);
+            fmt.entity = profiles->mMC->getEntityIdByName(fmt.entityName.c_str());
+        } else if (strcmp(key, "pad") == 0) {
+            fmt.pad = strtoul(val, nullptr, 10);
+        } else if (strcmp(key, "stream") == 0) {
+            fmt.stream = strtoul(val, nullptr, 10);
+        } else if (strcmp(key, "type") == 0) {
+            if (strcmp(val, "RESOLUTION_MAX") == 0) {
+                fmt.type = RESOLUTION_MAX;
+            } else if (strcmp(val, "RESOLUTION_COMPOSE") == 0) {
+                fmt.type = RESOLUTION_COMPOSE;
+            } else if (strcmp(val, "RESOLUTION_CROP") == 0) {
+                fmt.type = RESOLUTION_CROP;
+            } else if (strcmp(val, "RESOLUTION_TARGET") == 0) {
+                fmt.type = RESOLUTION_TARGET;
+            } else {
+                LOGE("Parse format type failed. type = %s", val);
+                return;
+            }
+        } else if (strcmp(key, "width") == 0) {
+            fmt.width = strtoul(val, nullptr, 10);
+        } else if (strcmp(key, "height") == 0) {
+            fmt.height = strtoul(val, nullptr, 10);
+        } else if (strcmp(key, "format") == 0) {
+            fmt.pixelCode = CameraUtils::string2PixelCode(val);
+        }
+        idx += 2;
+    }
+
+    fmt.formatType = FC_FORMAT;
+    MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
+    mc.formats.push_back(fmt);
+}
+
+void CameraParser::parseLinkElement(CameraParser *profiles, const char *name, const char **atts)
+{
+    McLink link;
+    MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
+    LOGXML("@%s, name:%s", __func__, name);
+
+    int idx = 0;
+    while (atts[idx]) {
+        const char* key = atts[idx];
+        const char* val = atts[idx + 1];
+        LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
+        if (strcmp(key, "srcName") == 0) {
+            link.srcEntityName = replaceStringInXml(profiles, val);
+            link.srcEntity = profiles->mMC->getEntityIdByName(link.srcEntityName.c_str());
+        } else if (strcmp(key, "srcPad") == 0) {
+            link.srcPad = strtoul(val, nullptr, 10);
+        } else if (strcmp(key, "sinkName") == 0) {
+            link.sinkEntityName = replaceStringInXml(profiles, val);
+            link.sinkEntity = profiles->mMC->getEntityIdByName(link.sinkEntityName.c_str());
+        } else if (strcmp(key, "sinkPad") == 0) {
+            link.sinkPad = strtoul(val, nullptr, 10);
+        } else if (strcmp(key, "enable") == 0) {
+            link.enable = strcmp(val, "true") == 0;
+        }
+
+        idx += 2;
+    }
+
+    mc.links.push_back(link);
+}
+
+void CameraParser::parseRouteElement(CameraParser *profiles, const char *name, const char **atts)
+{
+    McRoute route;
+    MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
+    LOGXML("@%s, name:%s", __func__, name);
+    route.flag = MEDIA_LNK_FL_ENABLED;
+
+    int idx = 0;
+    while (atts[idx]) {
+        const char* key = atts[idx];
+        const char* val = atts[idx + 1];
+        LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
+        if (strcmp(key, "name") == 0) {
+            route.entityName = replaceStringInXml(profiles, val);
+            route.entity = profiles->mMC->getEntityIdByName(route.entityName.c_str());
+        } else if (strcmp(key, "srcPad") == 0) {
+            route.srcPad = strtoul(val, nullptr, 10);
+        } else if (strcmp(key, "sinkPad") == 0) {
+            route.sinkPad = strtoul(val, nullptr, 10);
+        } else if (strcmp(key, "srcStream") == 0) {
+            route.srcStream = strtoul(val, nullptr, 10);
+        } else if (strcmp(key, "sinkStream") == 0) {
+            route.sinkStream = strtoul(val, nullptr, 10);
+        } else if (strcmp(key, "flag") == 0) {
+            route.flag = strtoul(val, nullptr, 10);
+        }
+        idx += 2;
+    }
+
+    mc.routes.push_back(route);
+}
+
+void CameraParser::parseVideoElement(CameraParser *profiles, const char * /*name*/, const char **atts)
+{
+   McVideoNode videoNode;
+   MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
+
+   videoNode.name = replaceStringInXml(profiles, atts[1]);
+   videoNode.videoNodeType = GetNodeType(atts[3]);
+   LOGXML("@%s, name:%s, videoNodeType:%d", __func__, videoNode.name.c_str(), videoNode.videoNodeType);
+
+   mc.videoNodes.push_back(videoNode);
+}
+
+// MediaCtl output tag xml parsing code for the field like:
+// <output port="main" width="1920" height="1088" format="V4L2_PIX_FMT_YUYV420_V32"/>
+// <output port="second" width="3264" height="2448" format="V4L2_PIX_FMT_SGRBG12V32"/>
+void CameraParser::parseOutputElement(CameraParser *profiles, const char *name, const char **atts)
+{
+    LOGXML("@%s, name:%s", __func__, name);
+
+    McOutput output;
+
+    int idx = 0;
+    while (atts[idx]) {
+        const char* key = atts[idx];
+        const char* val = atts[idx + 1];
+        LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
+        if (strcmp(key, "port") == 0) {
+            if (strcmp(val, "main") ==  0)
+                output.port = MAIN_PORT;
+            else if (strcmp(val, "second") ==  0)
+                output.port = SECOND_PORT;
+            else if (strcmp(val, "third") ==  0)
+                output.port = THIRD_PORT;
+            else if (strcmp(val, "forth") ==  0)
+                output.port = FORTH_PORT;
+            else
+                output.port = INVALID_PORT;
+        } else if (strcmp(key, "width") == 0) {
+            output.width = strtoul(val, nullptr, 10);
+        } else if (strcmp(key, "height") == 0) {
+            output.height = strtoul(val, nullptr, 10);
+        } else if (strcmp(key, "format") == 0) {
+            output.v4l2Format = CameraUtils::string2PixelCode(val);
+        }
+        idx += 2;
+    }
+
+    LOGXML("@%s, port:%d, output size:%dx%d, v4l2Format:%x", __func__, output.port,
+            output.width, output.height, output.v4l2Format);
+
+    MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
+    mc.outputs.push_back(output);
+}
+
+void CameraParser::parseMultiExpRange(const char* src)
+{
+    ExpRange* range = nullptr;
+    MultiExpRange multiRange;
+    MultiExpRange* pCurrRange = nullptr;
+    pCurrentCam->mMultiExpRanges.clear();
+    static const int MULTI_EXPOSURE_TAG_SHS1 = 0;
+    static const int MULTI_EXPOSURE_TAG_RHS1 = 1;
+    static const int MULTI_EXPOSURE_TAG_SHS2 = 2;
+    static const int MULTI_EXPOSURE_TAG_RHS2 = 3;
+    static const int MULTI_EXPOSURE_TAG_SHS3 = 4;
+
+    string srcDup = src;
+    CheckError((srcDup.c_str() == nullptr), VOID_VALUE, "Create a copy of source string failed.");
+
+    const char* srcTmp = srcDup.c_str();
+    char* endPtr = nullptr;
+    int tag = -1;
+    while ((endPtr = (char *)strchr(srcTmp, ','))) {
+        *endPtr = 0;
+        if (strcmp(srcTmp, "SHS1") == 0) {
+            tag = MULTI_EXPOSURE_TAG_SHS1;
+        } else if (strcmp(srcTmp, "RHS1") == 0) {
+            tag = MULTI_EXPOSURE_TAG_RHS1;
+        } else if (strcmp(srcTmp, "SHS2") == 0) {
+            tag = MULTI_EXPOSURE_TAG_SHS2;
+        } else if (strcmp(srcTmp, "RHS2") == 0) {
+            tag = MULTI_EXPOSURE_TAG_RHS2;
+        } else if (strcmp(srcTmp, "SHS3") == 0) {
+            tag = MULTI_EXPOSURE_TAG_SHS3;
+        } else {
+            LOGE("Malformed tag for multi-exposure range configuration");
+            return;
+        }
+
+        if (endPtr) {
+            srcTmp = endPtr + 1;
+            srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
+        }
+
+        CLEAR(multiRange);
+        multiRange.Resolution.width = strtol(srcTmp, &endPtr, 10);
+        CheckError((endPtr == nullptr || *endPtr != ','), VOID_VALUE, "Malformed resolution for multi-exposure range configuration");
+
+        srcTmp = endPtr + 1;
+        srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
+        multiRange.Resolution.height = strtol(srcTmp, &endPtr, 10);
+        CheckError((endPtr == nullptr || *endPtr != ','), VOID_VALUE, "Malformed resolution for multi-exposure range configuration");
+
+        pCurrRange = nullptr;
+        for (unsigned int i = 0; i < pCurrentCam->mMultiExpRanges.size(); i++) {
+            if (pCurrentCam->mMultiExpRanges[i].Resolution.width == multiRange.Resolution.width &&
+                pCurrentCam->mMultiExpRanges[i].Resolution.height == multiRange.Resolution.height) {
+                pCurrRange = &(pCurrentCam->mMultiExpRanges[i]);
+                break;
+            }
+        }
+        if (pCurrRange) {
+            switch (tag) {
+                case MULTI_EXPOSURE_TAG_SHS1:
+                    range = &pCurrRange->SHS1;
+                    break;
+                case MULTI_EXPOSURE_TAG_RHS1:
+                    range = &pCurrRange->RHS1;
+                    break;
+                case MULTI_EXPOSURE_TAG_SHS2:
+                    range = &pCurrRange->SHS2;
+                    break;
+                case MULTI_EXPOSURE_TAG_RHS2:
+                    range = &pCurrRange->RHS2;
+                    break;
+                case MULTI_EXPOSURE_TAG_SHS3:
+                    range = &pCurrRange->SHS3;
+                    break;
+                default:
+                    LOGE("Wrong tag for multi-exposure range configuration");
+                    return;
+            }
+        } else {
+            switch (tag) {
+                case MULTI_EXPOSURE_TAG_SHS1:
+                    range = &multiRange.SHS1;
+                    break;
+                case MULTI_EXPOSURE_TAG_RHS1:
+                    range = &multiRange.RHS1;
+                    break;
+                case MULTI_EXPOSURE_TAG_SHS2:
+                    range = &multiRange.SHS2;
+                    break;
+                case MULTI_EXPOSURE_TAG_RHS2:
+                    range = &multiRange.RHS2;
+                    break;
+                case MULTI_EXPOSURE_TAG_SHS3:
+                    range = &multiRange.SHS3;
+                    break;
+                default:
+                    LOGE("Wrong tag for multi-exposure range configuration");
+                    return;
+            }
+        }
+
+        srcTmp = endPtr + 1;
+        srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
+        range->min = strtol(srcTmp, &endPtr, 10);
+        CheckError((endPtr == nullptr || *endPtr != ','), VOID_VALUE, "Malformed range for multi-exposure range configuration");
+
+        srcTmp = endPtr + 1;
+        srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
+        range->max = strtol(srcTmp, &endPtr, 10);
+        CheckError((endPtr == nullptr || *endPtr != ','), VOID_VALUE, "Malformed range for multi-exposure range configuration");
+
+        srcTmp = endPtr + 1;
+        srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
+        range->step = strtol(srcTmp, &endPtr, 10);
+        CheckError((endPtr == nullptr || *endPtr != ','), VOID_VALUE, "Malformed range for multi-exposure range configuration");
+
+        srcTmp = endPtr + 1;
+        srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
+        range->lowerBound = strtol(srcTmp, &endPtr, 10);
+        CheckError((endPtr == nullptr || *endPtr != ','), VOID_VALUE, "Malformed range for multi-exposure range configuration");
+
+        srcTmp = endPtr + 1;
+        srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
+        range->upperBound = strtol(srcTmp, &endPtr, 10);
+
+        if (endPtr) {
+            srcTmp = endPtr + 1;
+            srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
+        }
+
+        if (!pCurrRange) {
+            pCurrentCam->mMultiExpRanges.push_back(multiRange);
+        }
+    }
+}
+
+int CameraParser::parsePair(const char *str, int *first, int *second, char delim, char **endptr)
+{
+    // Find the first integer.
+    char *end;
+    int w = (int)strtol(str, &end, 10);
+    // If a delimeter does not immediately follow, give up.
+    if (*end != delim) {
+        LOGE("Cannot find delimeter (%c) in str=%s", delim, str);
+        return -1;
+    }
+
+    // Find the second integer, immediately after the delimeter.
+    int h = (int)strtol(end+1, &end, 10);
+
+    *first = w;
+    *second = h;
+
+    if (endptr) {
+        *endptr = end;
+    }
+
+    return 0;
+}
+
+void CameraParser::parseSizesList(const char *sizesStr, vector <camera_resolution_t> &sizes)
+{
+    if (sizesStr == 0) {
+        return;
+    }
+
+    char *sizeStartPtr = (char *)sizesStr;
+
+    while (true) {
+        camera_resolution_t r;
+        int success = parsePair(sizeStartPtr, &r.width, &r.height, 'x',
+                                 &sizeStartPtr);
+        if (success == -1 || (*sizeStartPtr != ',' && *sizeStartPtr != '\0')) {
+            LOGE("Picture sizes string \"%s\" contains invalid character.", sizesStr);
+            return;
+        }
+        if (r.width > 0 && r.height > 0)
+            sizes.push_back(r);
+
+        if (*sizeStartPtr == '\0') {
+            return;
+        }
+        sizeStartPtr++;
+    }
+}
+
+/*
+ * The pls output to user requirement mapping table
+ *
+ * first: user requirement, second: psl output
+ * eg: <pslOutputForRotation value="3264x2448@1200x1600"/>
+ */
+void CameraParser::parseOutputMap(const char *str, vector<UserToPslOutputMap> &outputMap)
+{
+    char *srcDup = strdup(str);
+    CheckError((srcDup == nullptr), VOID_VALUE, "Create a copy of source string failed.");
+
+    char *srcTmp = srcDup;
+    char *endPtr = nullptr;
+    do {
+        endPtr = (char *)strchr(srcTmp, ',');
+        if (endPtr) {
+            *endPtr = 0;
+        }
+        char *tmpPtr = (char *)strchr(srcTmp, '@');
+        if (tmpPtr) {
+            *tmpPtr = 0;
+        }
+
+        UserToPslOutputMap map;
+        parsePair(srcTmp, &(map.User).width, &(map.User).height, 'x');
+        if (tmpPtr) {
+            srcTmp = tmpPtr + 1;
+            srcTmp = (char*)skipWhiteSpace(srcTmp);
+        }
+        parsePair(srcTmp, &(map.Psl).width, &(map.Psl).height, 'x');
+        outputMap.push_back(map);
+
+        if (endPtr) {
+            srcTmp = endPtr + 1;
+            srcTmp = (char*)skipWhiteSpace(srcTmp);
+        }
+    } while (endPtr);
+
+    free(srcDup);
+}
+
+int CameraParser::getSupportedFormat(const char* str, vector <int>& supportedFormat)
+{
+    if (str == nullptr) {
+        LOGE("the str is nullptr");
+        return -1;
+    }
+
+    LOGXML("@%s, str:%s", __func__, str);
+    int sz = strlen(str);
+    char src[sz + 1];
+    MEMCPY_S(src, sz, str, sz);
+    src[sz] = '\0';
+    char* savePtr;
+    char* fmt = strtok_r(src, ",", &savePtr);
+    while (fmt) {
+        int actual = CameraUtils::string2PixelCode(fmt);
+        if (actual != -1) {
+            supportedFormat.push_back(actual);
+            LOGXML("@%s, add format:%d", __func__, actual);
+        }
+        fmt = strtok_r(nullptr, ",", &savePtr);
+    }
+
+    return 0;
+}
+
+/**
+ * This function will handle all the MediaCtlCfg related elements.
+ *
+ * It will be called in the function startElement
+ *
+ * \param profiles: the pointer of the CameraParser.
+ * \param name: the element's name.
+ * \param atts: the element's attribute.
+ */
+void CameraParser::handleMediaCtlCfg(CameraParser *profiles, const char *name, const char **atts)
+{
+    LOGXML("@%s, name:%s, atts[0]:%s, profiles->mCurrentSensor:%d", __func__, name, atts[0], profiles->mCurrentSensor);
+    if (strcmp(name, "MediaCtlConfig") == 0) {
+        parseMediaCtlConfigElement(profiles, name, atts);
+    } else if (strcmp(name, "link") == 0) {
+        parseLinkElement(profiles, name, atts);
+    } else if (strcmp(name, "route") == 0) {
+        parseRouteElement(profiles, name, atts);
+    } else if (strcmp(name, "control") == 0) {
+        parseControlElement(profiles, name, atts);
+    } else if (strcmp(name, "selection") == 0) {
+        parseSelectionElement(profiles, name, atts);
+    } else if (strcmp(name, "format") == 0) {
+        parseFormatElement(profiles, name, atts);
+    } else if (strcmp(name, "videonode") == 0) {
+        parseVideoElement(profiles, name, atts);
+    } else if (strcmp(name, "output") == 0) {
+        parseOutputElement(profiles, name, atts);
+    }
+}
+
+/**
+ * This function will handle all the StaticMetadata related elements.
+ *
+ * It will be called in the function startElement
+ *
+ * \param profiles: the pointer of the CameraParser.
+ * \param name: the element's name.
+ * \param atts: the element's attribute.
+ */
+void CameraParser::handleStaticMetaData(CameraParser *profiles, const char *name, const char **atts)
+{
+    LOGXML("@%s, name:%s, atts[0]:%s, profiles->mCurrentSensor:%d", __func__, name, atts[0], profiles->mCurrentSensor);
+    if (strcmp(name, "supportedStreamConfig") == 0) {
+        supported_stream_config_array_t configsArray;
+        parseStreamConfig(atts[1], configsArray);
+        const int STREAM_MEMBER_NUM = sizeof(supported_stream_config_t) / sizeof(int);
+        int dataSize = configsArray.size() * STREAM_MEMBER_NUM;
+        int configs[dataSize];
+        CLEAR(configs);
+        for (size_t i = 0; i < configsArray.size(); i++) {
+            LOGXML("@%s, stream config info: format=%s (%dx%d) field=%d type=%d", __func__,
+                    CameraUtils::format2string(configsArray[i].format).c_str(),
+                    configsArray[i].width, configsArray[i].height,
+                    configsArray[i].field, configsArray[i].streamType);
+            MEMCPY_S(&configs[i * STREAM_MEMBER_NUM], sizeof(supported_stream_config_t),
+                     &configsArray[i], sizeof(supported_stream_config_t));
+        }
+        mMetadata.update(CAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, configs, dataSize);
+    } else if (strcmp(name, "fpsRange") == 0) {
+        vector<double> rangeArray;
+        parseXmlConvertStrings(atts[1], rangeArray, atof);
+        float fpsRange[rangeArray.size()];
+        CLEAR(fpsRange);
+        for (size_t i = 0; i < rangeArray.size(); i++){
+            fpsRange[i] = static_cast<float>(rangeArray[i]);
+        }
+        LOGXML("@%s, supported fps range size: %zu", __func__, rangeArray.size());
+        mMetadata.update(CAMERA_AE_AVAILABLE_TARGET_FPS_RANGES, fpsRange, ARRAY_SIZE(fpsRange));
+    } else if (strcmp(name, "evRange") == 0) {
+        vector<int> rangeArray;
+        parseXmlConvertStrings(atts[1], rangeArray, atoi);
+
+        int evRange[rangeArray.size()];
+        CLEAR(evRange);
+        for (size_t i = 0; i < rangeArray.size(); i++) {
+            evRange[i] = rangeArray[i];
+        }
+        LOGXML("@%s, supported ev range size: %zu", __func__, rangeArray.size());
+        mMetadata.update(CAMERA_AE_COMPENSATION_RANGE, evRange, ARRAY_SIZE(evRange));
+    } else if (strcmp(name, "evStep") == 0) {
+        vector<int> rationalType;
+        int ret = parseXmlConvertStrings(atts[1], rationalType, atoi);
+        CheckError((ret != OK), VOID_VALUE, "Parse evStep failed");
+
+        icamera_metadata_rational_t evStep = {rationalType[0], rationalType[1]};
+        LOGXML("@%s, the numerator: %d, denominator: %d", __func__, evStep.numerator, evStep.denominator);
+        mMetadata.update(CAMERA_AE_COMPENSATION_STEP, &evStep, 1);
+    } else if (strcmp(name, "supportedFeatures") == 0) {
+        camera_features_list_t supportedFeatures;
+        parseSupportedFeatures(atts[1], supportedFeatures);
+        int numberOfFeatures = supportedFeatures.size();
+        uint8_t features[numberOfFeatures];
+        CLEAR(features);
+        for (int i = 0; i < numberOfFeatures; i++) {
+            features[i] = supportedFeatures[i];
+        }
+        mMetadata.update(INTEL_INFO_AVAILABLE_FEATURES, features, numberOfFeatures);
+    } else if (strcmp(name, "supportedAeExposureTimeRange") == 0) {
+        vector<int> scenes;
+        vector<float> minValues, maxValues;
+        int ret = parseSupportedAeParamRange(atts[1], scenes, minValues, maxValues);
+        CheckError((ret != OK), VOID_VALUE, "Parse AE eExposure time range failed");
+
+        const int MEMBER_COUNT = 3;
+        const int dataSize = scenes.size() * MEMBER_COUNT;
+        int rangeData[dataSize];
+        CLEAR(rangeData);
+
+        for (size_t i = 0; i < scenes.size(); i++) {
+            LOGXML("@%s, scene mode:%d supported exposure time range (%f-%f)", __func__,
+                    scenes[i], minValues[i], maxValues[i]);
+            rangeData[i * MEMBER_COUNT] = scenes[i];
+            rangeData[i * MEMBER_COUNT + 1] = (int)minValues[i];
+            rangeData[i * MEMBER_COUNT + 2] = (int)maxValues[i];
+        }
+        mMetadata.update(INTEL_INFO_AE_EXPOSURE_TIME_RANGE, rangeData, dataSize);
+    } else if (strcmp(name, "supportedAeGainRange") == 0) {
+        vector<int> scenes;
+        vector<float> minValues, maxValues;
+        int ret = parseSupportedAeParamRange(atts[1], scenes, minValues, maxValues);
+        CheckError((ret != OK), VOID_VALUE, "Parse AE gain range failed");
+
+        const int MEMBER_COUNT = 3;
+        const int dataSize = scenes.size() * MEMBER_COUNT;
+        int rangeData[dataSize];
+        CLEAR(rangeData);
+
+        for (size_t i = 0; i < scenes.size(); i++) {
+            LOGXML("@%s, scene mode:%d supported gain range (%f-%f)", __func__,
+                    scenes[i], minValues[i], maxValues[i]);
+            rangeData[i * MEMBER_COUNT] = scenes[i];
+            // Since we use int to store float, before storing it we multiply min and max by 100.
+            rangeData[i * MEMBER_COUNT + 1] = (int)(minValues[i] * 100);
+            rangeData[i * MEMBER_COUNT + 2] = (int)(maxValues[i] * 100);
+        }
+        mMetadata.update(INTEL_INFO_AE_GAIN_RANGE, rangeData, dataSize);
+    } else if (strcmp(name, "supportedVideoStabilizationModes") == 0) {
+        camera_video_stabilization_list_t supportedMode;
+        parseSupportedVideoStabilizationMode(atts[1], supportedMode);
+        uint8_t modes[supportedMode.size()];
+        CLEAR(modes);
+        for(size_t i = 0; i < supportedMode.size(); i++) {
+            modes[i] = supportedMode[i];
+        }
+        mMetadata.update(CAMERA_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, modes, supportedMode.size());
+    } else if (strcmp(name, "supportedAeMode") == 0) {
+        vector <camera_ae_mode_t> supportedAeMode;
+        parseSupportedAeMode(atts[1], supportedAeMode);
+        uint8_t aeModes[supportedAeMode.size()];
+        CLEAR(aeModes);
+        for (size_t i = 0; i < supportedAeMode.size(); i++) {
+            aeModes[i] = supportedAeMode[i];
+        }
+        mMetadata.update(CAMERA_AE_AVAILABLE_MODES, aeModes, supportedAeMode.size());
+    } else if (strcmp(name, "supportedAwbMode") == 0) {
+        vector <camera_awb_mode_t> supportedAwbMode;
+        parseXmlConvertStrings(atts[1], supportedAwbMode, CameraUtils::getAwbModeByName);
+        uint8_t awbModes[supportedAwbMode.size()];
+        CLEAR(awbModes);
+        for (size_t i = 0; i < supportedAwbMode.size(); i++) {
+            awbModes[i] = supportedAwbMode[i];
+        }
+        mMetadata.update(CAMERA_AWB_AVAILABLE_MODES, awbModes, supportedAwbMode.size());
+    } else if (strcmp(name, "supportedSceneMode") == 0) {
+        vector <camera_scene_mode_t> supportedSceneMode;
+        parseXmlConvertStrings(atts[1], supportedSceneMode, CameraUtils::getSceneModeByName);
+        uint8_t sceneModes[supportedSceneMode.size()];
+        CLEAR(sceneModes);
+        for (size_t i = 0; i < supportedSceneMode.size(); i++) {
+            sceneModes[i] = supportedSceneMode[i];
+        }
+        mMetadata.update(CAMERA_CONTROL_AVAILABLE_SCENE_MODES, sceneModes, supportedSceneMode.size());
+    } else if (strcmp(name, "supportedAfMode") == 0) {
+        vector <camera_af_mode_t> supportedAfMode;
+        parseSupportedAfMode(atts[1], supportedAfMode);
+        uint8_t afModes[supportedAfMode.size()];
+        CLEAR(afModes);
+        for (size_t i = 0; i < supportedAfMode.size(); i++) {
+            afModes[i] = supportedAfMode[i];
+        }
+        mMetadata.update(CAMERA_AF_AVAILABLE_MODES, afModes, supportedAfMode.size());
+    } else if (strcmp(name, "supportedAntibandingMode") == 0) {
+        vector <camera_antibanding_mode_t> supportedAntibandingMode;
+        parseSupportedAntibandingMode(atts[1], supportedAntibandingMode);
+        uint8_t antibandingModes[supportedAntibandingMode.size()];
+        CLEAR(antibandingModes);
+        for (size_t i = 0; i < supportedAntibandingMode.size(); i++) {
+            antibandingModes[i] = supportedAntibandingMode[i];
+        }
+        mMetadata.update(CAMERA_AE_AVAILABLE_ANTIBANDING_MODES, antibandingModes, supportedAntibandingMode.size());
+    } else if (strcmp(name, "sensorMountType") == 0) {
+        uint8_t mountType = WALL_MOUNTED;
+
+        if (strcmp(atts[1], "CEILING_MOUNTED") == 0)
+            mountType = CEILING_MOUNTED;
+
+        mMetadata.update(INTEL_INFO_SENSOR_MOUNT_TYPE, &mountType, 1);
+        LOGXML("@%s, sensor mount type: %d", __func__, mountType);
+    } else if (strcmp(name, "StaticMetadata") != 0) { // Make sure it doesn't reach the end of StaticMetadata.
+        handleGenericStaticMetaData(name, atts[1]);
+    }
+}
+
+/**
+ * \brief Parses string for generic static metadata and save them.
+ *
+ * \param name: the element's name.
+ * \param src: the element's value, only include data and separator 'x' or ','.
+ */
+void CameraParser::handleGenericStaticMetaData(const char *name, const char *src)
+{
+    uint32_t tag =
+            (strcmp(name, "ae.lockAvailable") == 0)              ? CAMERA_AE_LOCK_AVAILABLE
+          : (strcmp(name, "awb.lockAvailable") == 0)             ? CAMERA_AWB_LOCK_AVAILABLE
+          : (strcmp(name, "control.availableModes") == 0)        ? CAMERA_CONTROL_AVAILABLE_MODES
+          : (strcmp(name, "control.availableSceneModes") == 0)    ? CAMERA_CONTROL_AVAILABLE_SCENE_MODES
+          : (strcmp(name, "statistics.info.availableFaceDetectModes") == 0) ? CAMERA_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES
+          : (strcmp(name, "statistics.info.maxFaceCount") == 0)    ? CAMERA_STATISTICS_INFO_MAX_FACE_COUNT
+          : (strcmp(name, "sensor.info.activeArraySize") == 0)   ? CAMERA_SENSOR_INFO_ACTIVE_ARRAY_SIZE
+          : (strcmp(name, "sensor.info.pixelArraySize") == 0)    ? CAMERA_SENSOR_INFO_PIXEL_ARRAY_SIZE
+          : (strcmp(name, "sensor.info.physicalSize") == 0)      ? CAMERA_SENSOR_INFO_PHYSICAL_SIZE
+          : (strcmp(name, "sensor.info.sensitivityRange") == 0)  ? CAMERA_SENSOR_INFO_SENSITIVITY_RANGE
+          : (strcmp(name, "sensor.info.exposureTimeRange") == 0) ? CAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE
+          : (strcmp(name, "sensor.info.colorFilterArrangement") == 0) ? CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT
+          : (strcmp(name, "sensor.availableTestPatternModes") == 0) ? CAMERA_SENSOR_AVAILABLE_TEST_PATTERN_MODES
+          : (strcmp(name, "sensor.orientation") == 0)            ? CAMERA_SENSOR_ORIENTATION
+          : (strcmp(name, "sensor.opaqueRawSize") == 0)          ? CAMERA_SENSOR_OPAQUE_RAW_SIZE
+          : (strcmp(name, "lens.facing") == 0)                   ? CAMERA_LENS_FACING
+          : (strcmp(name, "lens.info.availableApertures") == 0)  ? CAMERA_LENS_INFO_AVAILABLE_APERTURES
+          : (strcmp(name, "lens.info.availableFilterDensities") == 0) ? CAMERA_LENS_INFO_AVAILABLE_FILTER_DENSITIES
+          : (strcmp(name, "lens.info.availableFocalLengths") == 0) ? CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS
+          : (strcmp(name, "lens.info.availableOpticalStabilization") == 0) ? CAMERA_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION
+          : (strcmp(name, "lens.info.hyperfocalDistance") == 0)  ? CAMERA_LENS_INFO_HYPERFOCAL_DISTANCE
+          : (strcmp(name, "lens.info.minimumFocusDistance") == 0) ? CAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE
+          : (strcmp(name, "lens.info.shadingMapSize") == 0)      ? CAMERA_LENS_INFO_SHADING_MAP_SIZE
+          : (strcmp(name, "lens.info.focusDistanceCalibration") == 0) ? CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION
+          : (strcmp(name, "request.maxNumOutputStreams") == 0)   ? CAMERA_REQUEST_MAX_NUM_OUTPUT_STREAMS
+          : (strcmp(name, "request.maxNumInputStreams") == 0)    ? CAMERA_REQUEST_MAX_NUM_INPUT_STREAMS
+          : (strcmp(name, "request.pipelineMaxDepth") == 0)      ? CAMERA_REQUEST_PIPELINE_MAX_DEPTH
+          : (strcmp(name, "request.availableCapabilities") == 0) ? CAMERA_REQUEST_AVAILABLE_CAPABILITIES
+          : (strcmp(name, "scaler.availableInputOutputFormatsMap") == 0) ? CAMERA_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP
+          : (strcmp(name, "reprocess.maxCaptureStall") == 0)     ? CAMERA_REPROCESS_MAX_CAPTURE_STALL
+          : (strcmp(name, "jpeg.maxSize") == 0)                  ? CAMERA_JPEG_MAX_SIZE
+          : (strcmp(name, "jpeg.availableThumbnailSizes") == 0)  ? CAMERA_JPEG_AVAILABLE_THUMBNAIL_SIZES
+          : (strcmp(name, "edge.availableEdgeModes") == 0)       ? CAMERA_EDGE_AVAILABLE_EDGE_MODES
+          : (strcmp(name, "hotPixel.availableHotPixelModes") == 0) ? CAMERA_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES
+          : (strcmp(name, "noiseReduction.availableNoiseReductionModes") == 0) ? CAMERA_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES
+          : (strcmp(name, "tonemap.maxCurvePoints") == 0)        ? CAMERA_TONEMAP_MAX_CURVE_POINTS
+          : (strcmp(name, "tonemap.availableToneMapModes") == 0) ? CAMERA_TONEMAP_AVAILABLE_TONE_MAP_MODES
+          : (strcmp(name, "info.supportedHardwareLevel") == 0)   ? CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL
+          : (strcmp(name, "sync.maxLatency") == 0)               ? CAMERA_SYNC_MAX_LATENCY
+          : -1;
+    int tagType = get_icamera_metadata_tag_type(tag);
+    if (tagType == -1) {
+        LOGW("Unsupported metadata %s", name);
+        return;
+    }
+
+    union {
+        uint8_t* u8;
+        int32_t* i32;
+        int64_t* i64;
+        float*   f;
+        double*  d;
+        icamera_metadata_rational_t* r;
+    } data;
+    data.u8 = (unsigned char *)mMetadataCache;
+
+    int index = 0;
+    int maxIndex = mMetadataCacheSize / sizeof(double); // worst case
+    char * endPtr = nullptr;
+    do {
+        switch (tagType) {
+        case ICAMERA_TYPE_BYTE:
+            data.u8[index]= (char)strtol(src, &endPtr, 10);
+            LOGXML(" - %d -", data.u8[index]);
+            break;
+        case ICAMERA_TYPE_INT32:
+        case ICAMERA_TYPE_RATIONAL:
+            data.i32[index]= strtol(src, &endPtr, 10);
+            LOGXML(" - %d -", data.i32[index]);
+            break;
+        case ICAMERA_TYPE_INT64:
+            data.i64[index]= strtol(src, &endPtr, 10);
+            LOGXML(" - %ld -", data.i64[index]);
+            break;
+        case ICAMERA_TYPE_FLOAT:
+            data.f[index]= strtof(src, &endPtr);
+            LOGXML(" - %8.3f -", data.f[index]);
+            break;
+        case ICAMERA_TYPE_DOUBLE:
+            data.d[index]= strtof(src, &endPtr);
+            LOGXML(" - %8.3f -", data.d[index]);
+            break;
+        }
+        index++;
+
+        if (endPtr != nullptr && (*endPtr == 'x' || *endPtr == ',')) {
+            src = endPtr + 1;
+        } else {
+            break;
+        }
+    } while (index < maxIndex);
+
+    switch (tagType) {
+    case ICAMERA_TYPE_BYTE:
+        mMetadata.update(tag, data.u8, index);
+        break;
+    case ICAMERA_TYPE_INT32:
+        mMetadata.update(tag, data.i32, index);
+        break;
+    case ICAMERA_TYPE_INT64:
+        mMetadata.update(tag, data.i64, index);
+        break;
+    case ICAMERA_TYPE_FLOAT:
+        mMetadata.update(tag, data.f, index);
+        break;
+    case ICAMERA_TYPE_DOUBLE:
+        mMetadata.update(tag, data.d, index);
+        break;
+    case ICAMERA_TYPE_RATIONAL:
+        mMetadata.update(tag, data.r, index / 2);
+        break;
+    }
+}
+
+/**
+ * the callback function of the libexpat for handling of one element start
+ *
+ * When it comes to the start of one element. This function will be called.
+ *
+ * \param userData: the pointer we set by the function XML_SetUserData.
+ * \param name: the element's name.
+ */
+void CameraParser::startParseElement(void *userData, const char *name, const char **atts)
+{
+    CameraParser *profiles = reinterpret_cast<CameraParser*>(userData);
+
+    if (profiles->mCurrentDataField == FIELD_INVALID) {
+        profiles->checkField(profiles, name, atts);
+        return;
+    }
+
+    switch (profiles->mCurrentDataField) {
+        case FIELD_SENSOR:
+            if (strcmp(name, "MediaCtlConfig") == 0) {
+                profiles->mInMediaCtlCfg = true;
+                LOGXML("@%s %s, mInMediaCtlCfg is set to true", __func__, name);
+            } else if (strcmp(name, "StaticMetadata") == 0) {
+                profiles->mInStaticMetadata = true;
+                LOGXML("@%s %s, mInStaticMetadata is set to true", __func__, name);
+            }
+
+            if (profiles->mInMediaCtlCfg) {
+                // The MediaCtlCfg belongs to the sensor segments
+                profiles->handleMediaCtlCfg(profiles, name, atts);
+            } else if (profiles->mInStaticMetadata) {
+                // The StaticMetadata belongs to the sensor segments
+                profiles->handleStaticMetaData(profiles, name, atts);
+            } else {
+                profiles->handleSensor(profiles, name, atts);
+            }
+            break;
+        case FIELD_COMMON:
+            profiles->handleCommon(profiles, name, atts);
+            break;
+        default:
+            LOGE("@%s, line:%d, go to default handling", __func__, __LINE__);
+            break;
+    }
+}
+
+/**
+ * the callback function of the libexpat for handling of one element end
+ *
+ * When it comes to the end of one element. This function will be called.
+ *
+ * \param userData: the pointer we set by the function XML_SetUserData.
+ * \param name: the element's name.
+ */
+void CameraParser::endParseElement(void *userData, const char *name)
+{
+    LOGXML("@%s %s", __func__, name);
+
+    CameraParser *profiles = reinterpret_cast<CameraParser*>(userData);
+
+    if (strcmp(name, "Sensor") == 0) {
+        profiles->mCurrentDataField = FIELD_INVALID;
+        if (profiles->pCurrentCam) {
+            LOGXML("@%s: Add camera id %d (%s)", __func__, profiles->mCurrentSensor,
+                   profiles->pCurrentCam->sensorName.c_str());
+            if (profiles->pCurrentCam->mLensName.empty() &&
+                profiles->pCurrentCam->sensorName.find("-wf") != string::npos) {
+                int ret = profiles->mMC->getLensName(&profiles->pCurrentCam->mLensName);
+                if (ret != OK) {
+                    LOGXML("@%s, Failed to getLensName", __func__);
+                }
+            }
+            // Merge the content of mMetadata into mCapability.
+            ParameterHelper::merge(profiles->mMetadata, &profiles->pCurrentCam->mCapability);
+            profiles->mMetadata.clear();
+
+            // For non-extended camera, it should be in order by mCurrentSensor
+            profiles->mStaticCfg->mCameras.insert(profiles->mStaticCfg->mCameras.begin() +
+                                               profiles->mCurrentSensor, *(profiles->pCurrentCam));
+
+            delete profiles->pCurrentCam;
+            profiles->pCurrentCam = nullptr;
+        }
+    }
+
+    if (strcmp(name, "MediaCtlConfig") == 0) {
+        LOGXML("@%s %s, mInMediaCtlCfg is set to false", __func__, name);
+        profiles->mInMediaCtlCfg = false;
+    }
+
+    if (strcmp(name, "StaticMetadata") == 0) {
+        LOGXML("@%s %s, mInStaticMetadata is set to false", __func__, name);
+        profiles->mInStaticMetadata = false;
+    }
+
+    if (strcmp(name, "Common") == 0)
+        profiles->mCurrentDataField = FIELD_INVALID;
+}
+
+/**
+* Get available sensors.
+*
+* The function will read libcamhal_profile.xml, and parse out all of sensors.
+* Then those sensors will be checked if it exists in mediaEntity, if it exists,
+* we put it in availableSensors.
+* In libcamhal_profile.xml it should have the following requirements:
+* 1. <availableSensors value="ov8856-wf-2,ov2740-uf-0,ov2740-wf-2"/>
+*     The value is "'camera name'-wf/uf-'CSI port number'".
+*     For example: camera name is "ov8856". Sensor's sink entity name is
+*      "Intel IPU6 CSI-2 2" and it is word facing. The value is ov8856-wf-2.
+* 2. <platform value="IPU6"/> the platform value must be uppercase letter.
+*
+*/
+std::vector<std::string> CameraParser::getAvailableSensors(const std::string &ipuName,
+                                                        const std::vector<std::string> &sensorsList)
+{
+    LOGXML("@%s, ipuName:%s", __func__, ipuName.c_str());
+
+    /* if the string doesn't contain -wf- or -uf-, it needn't be parsed */
+    if ((sensorsList[0].find("-wf-") == string::npos) &&
+        (sensorsList[0].find("-uf-") == string::npos)) {
+        return sensorsList;
+    }
+
+    // sensor's sink entity name prefix:Intel IPU6 CSI-2 2
+    std::string sensorSinkName = "Intel ";
+    sensorSinkName.append(ipuName);
+    sensorSinkName.append(" CSI-2 ");
+
+    std::vector<string> availableSensors;
+    for (auto& sensor : sensorsList) {
+        std::string srcSensor = sensor;
+        std::string portNum = srcSensor.substr(srcSensor.find_last_of('-') + 1);
+        std::string sensorSinkNameTmp = sensorSinkName;
+        sensorSinkNameTmp.append(portNum);
+        std::string sensorName = srcSensor.substr(0, srcSensor.find_first_of('-'));
+
+        bool ret = mMC->checkAvailableSensor(sensorName, sensorSinkNameTmp);
+        if (ret) {
+            std::string sensorNameTmp = srcSensor.substr(0, srcSensor.find_last_of('-'));
+            availableSensors.push_back(sensorNameTmp);
+            mAvailableSensor[sensorNameTmp] = sensorSinkNameTmp;
+            LOGXML("@%s, The availabel sensor name:%s, sensorSinkNameTmp:%s",
+                   __func__, sensorNameTmp.c_str(), sensorSinkNameTmp.c_str());
+        }
+    }
+
+    return availableSensors;
+}
+
+/**
+ * Get camera configuration from xml file
+ *
+ * The function will read the xml configuration file firstly.
+ * Then it will parse out the camera settings.
+ * The camera setting is stored inside this CameraParser class.
+ *
+ */
+void CameraParser::getProfileDataFromXmlFile(void)
+{
+    LOGXML("@%s", __func__);
+
+    // Get common data from libcamhal_profile.xml
+    int ret = getDataFromXmlFile(LIBCAMHAL_PROFILE_NAME);
+    CheckError(ret != OK, VOID_VALUE, "Failed to get libcamhal profile data frome %s", LIBCAMHAL_PROFILE_NAME);
+
+    // According to sensor name to get sensor data
+    LOGXML("The kinds of sensor is %zu", mStaticCfg->mCommonConfig.availableSensors.size());
+    vector<string> allSensors = getAvailableSensors(mStaticCfg->mCommonConfig.ipuName,
+                                                    mStaticCfg->mCommonConfig.availableSensors);
+
+    if (allSensors.size() == 0) {
+        LOGW("The style of libcamhal_profile is too old, please switch it as soon as possible !!!");
+        return;
+    }
+
+    for (auto sensor : allSensors) {
+        string sensorName = "sensors/";
+        sensorName.append(sensor);
+        sensorName.append(".xml");
+        int ret = getDataFromXmlFile(sensorName);
+        CheckError(ret != OK, VOID_VALUE, "Failed to get sensor profile data frome %s", sensorName.c_str());
+    }
+}
+
+/**
+ * Read graph descriptor and settings from configuration files.
+ *
+ * The resulting graphs represend all possible graphs for given sensor, and
+ * they are stored in capinfo structure.
+ */
+void CameraParser::getGraphConfigFromXmlFile(void)
+{
+    std::shared_ptr<GraphConfig> graphConfig = std::make_shared<GraphConfig>();
+
+    // Assuming that PSL section from profiles is already parsed, and number
+    // of cameras is known.
+    graphConfig->addCustomKeyMap();
+    for (size_t i = 0; i < getSensorNum(); ++i) {
+        const string &fileName = mStaticCfg->mCameras[i].mGraphSettingsFile;
+        if (fileName.empty()) {
+            continue;
+        }
+
+        LOGXML("Using graph setting file:%s for camera:%zu", fileName.c_str(), i);
+        int ret  = graphConfig->parse(i, fileName.c_str());
+        CheckError(ret != OK, VOID_VALUE, "Could not read graph config file for camera %zu", i);
+    }
+}
+
+void CameraParser::dumpSensorInfo(void)
+{
+    LOGXML("@%s, line%d, for sensors settings==================", __func__, __LINE__);
+    LOGXML("@%s, line%d, sensor number:%d", __func__, __LINE__, getSensorNum());
+    for (unsigned i = 0; i < getSensorNum(); i++) {
+        LOGXML("@%s, line%d, i:%d", __func__, __LINE__, i);
+        LOGXML("@%s, line%d, mCameras[%d].sensorName:%s", __func__, __LINE__, i, mStaticCfg->mCameras[i].sensorName.c_str());
+        LOGXML("@%s, line%d, mCameras[%d].mISysFourcc:%d", __func__, __LINE__, i, mStaticCfg->mCameras[i].mISysFourcc);
+
+        supported_stream_config_array_t supportedConfigs;
+        mStaticCfg->mCameras[i].mCapability.getSupportedStreamConfig(supportedConfigs);
+        for (size_t j = 0; j < supportedConfigs.size(); j++) {
+            LOGXML("@%s, line%d, mCameras[%d]: format:%d size(%dx%d) field:%d", __func__, __LINE__,
+                i, supportedConfigs[j].format, supportedConfigs[j].width,
+                supportedConfigs[j].height, supportedConfigs[j].field);
+        }
+
+        for (unsigned j = 0; j < mStaticCfg->mCameras[i].mSupportedISysFormat.size(); j++) {
+            LOGXML("@%s, line%d, mCameras[%d].mSupportedISysFormat:%d", __func__, __LINE__, i, mStaticCfg->mCameras[i].mSupportedISysFormat[j]);
+        }
+
+        // dump the media controller mapping table for supportedStreamConfig
+        LOGXML("The media controller mapping table size: %zu", mStaticCfg->mCameras[i].mStreamToMcMap.size());
+        for (auto& pool : mStaticCfg->mCameras[i].mStreamToMcMap) {
+            int mcId = pool.first;
+            supported_stream_config_array_t &mcMapVector = pool.second;
+            LOGXML("mcId: %d, the supportedStreamConfig vector size: %zu", mcId, mcMapVector.size());
+        }
+
+        // dump the media controller information
+        LOGXML("============Format Configuration==================");
+        for (unsigned j = 0; j < mStaticCfg->mCameras[i].mMediaCtlConfs.size(); j++) {
+            const MediaCtlConf* mc = &mStaticCfg->mCameras[i].mMediaCtlConfs[j];
+            for (unsigned k = 0; k < mc->links.size(); k++) {
+                const McLink* link = &mc->links[k];
+                LOGXML("       link src %s [%d:%d] ==> %s [%d:%d] enable %d", link->srcEntityName.c_str(), link->srcEntity, link->srcPad, link->sinkEntityName.c_str(), link->sinkEntity, link->sinkPad, link->enable);
+            }
+            for (unsigned k = 0; k < mc->ctls.size(); k++) {
+                const McCtl* ctl = &mc->ctls[k];
+                LOGXML("       Ctl %s [%d] cmd %s [0x%08x] value %d", ctl->entityName.c_str(), ctl->entity, ctl->ctlName.c_str(), ctl->ctlCmd, ctl->ctlValue);
+            }
+            for (unsigned k = 0; k < mc->formats.size(); k++) {
+                const McFormat* format = &mc->formats[k];
+                if (format->formatType == FC_FORMAT)
+                    LOGXML("       format %s [%d:%d] [%dx%d] %s", format->entityName.c_str(), format->entity, format->pad, format->width, format->height, CameraUtils::pixelCode2String(format->pixelCode));
+                else if (format->formatType == FC_SELECTION)
+                    LOGXML("       select %s [%d:%d] selCmd: %d [%d, %d] [%dx%d]", format->entityName.c_str(), format->entity, format->pad, format->selCmd, format->top, format->left, format->width, format->height);
+            }
+        }
+        LOGXML("============End of Format Configuration===========");
+    }
+
+    LOGXML("@%s, line%d, for common settings==================", __func__, __LINE__);
+}
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/platformdata/CameraParser.h b/camera/hal/intel/ipu6/src/platformdata/CameraParser.h
new file mode 100644
index 000000000000..33cf70641079
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/CameraParser.h
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ *\file CameraParser.h
+ *
+ * parser for the camera xml configuration file
+ *
+ * This file calls the libexpat ditectly. The libexpat is one xml parser.
+ * It will parse the camera configuration out firstly.
+ * Then other module can call the methods of it to get the real configuration.
+ *
+ */
+
+#pragma once
+
+#include <unordered_map>
+#include "PlatformData.h"
+#include "ParserBase.h"
+#include "CameraMetadata.h"
+
+namespace icamera {
+
+/**
+ * \class CameraParser
+ *
+ * This class is used to parse the camera configuration file.
+ * The configuration file is xml format.
+ * This class will use the expat lib to do the xml parser.
+ */
+class CameraParser : public ParserBase {
+public:
+    CameraParser(MediaControl *mc, PlatformData::StaticCfg *cfg);
+    ~CameraParser();
+
+    unsigned getSensorNum(void) {return mSensorNum;};
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(CameraParser);
+
+private:
+    PlatformData::StaticCfg *mStaticCfg;
+
+    enum DataField {
+        FIELD_INVALID = 0,
+        FIELD_SENSOR,
+        FIELD_COMMON
+    } mCurrentDataField;
+    int mSensorNum;
+    int mCurrentSensor;
+    std::string mI2CBus;
+    std::string mCsiPort;
+    std::unordered_map<std::string, std::string> mAvailableSensor;
+    PlatformData::StaticCfg::CameraInfo *pCurrentCam;
+    bool mInMediaCtlCfg;
+    bool mInStaticMetadata;
+    MediaControl* mMC;
+    CameraMetadata mMetadata;
+
+    long* mMetadataCache;
+    static const int mMetadataCacheSize = 4096;
+
+    void startParseElement(void *userData, const char *name, const char **atts);
+    void endParseElement(void *userData, const char *name);
+
+    static void parseSizesList(const char *sizesStr, std::vector <camera_resolution_t> &sizes);
+    static int getSupportedFormat(const char* str, std::vector <int>& supportedFormat);
+    static int parsePair(const char *str, int *first, int *second, char delim, char **endptr = nullptr);
+
+    std::vector<std::string> getAvailableSensors(const std::string &ipuName,
+                                                 const std::vector<std::string> &sensorsList);
+    void getProfileDataFromXmlFile(void);
+    void getSensorDataFromXmlFile(void);
+    void getGraphConfigFromXmlFile(void);
+    void checkField(CameraParser *profiles, const char *name, const char **atts);
+
+    void handleSensor(CameraParser *profiles, const char *name, const char **atts);
+    void handleCommon(CameraParser *profiles, const char *name, const char **atts);
+
+    void parseStreamConfig(const char* src, supported_stream_config_array_t& configs);
+    void parseSupportedFeatures(const char* src, camera_features_list_t& features);
+    void parseSupportedIspControls(const char* src, std::vector<uint32_t>& features);
+    int parseSupportedVideoStabilizationMode(const char* str, camera_video_stabilization_list_t &supportedModes);
+    int parseSupportedAeMode(const char* str, std::vector <camera_ae_mode_t> &supportedModes);
+    int parseSupportedAfMode(const char* str, std::vector <camera_af_mode_t> &supportedModes);
+    int parseSupportedAntibandingMode(const char* str, std::vector <camera_antibanding_mode_t> &supportedModes);
+    int parseSupportedAeParamRange(const char* src, std::vector<int>& scenes,
+                                   std::vector<float>& minValues, std::vector<float>& maxValues);
+
+// parse the media controller configuration in xml, the MediaControl MUST be run before the parser to run.
+    void handleMediaCtlCfg(CameraParser *profiles, const char *name, const char **atts);
+    void handleStaticMetaData(CameraParser *profiles, const char *name, const char **atts);
+    void handleGenericStaticMetaData(const char *name, const char *src);
+    void parseMediaCtlConfigElement(CameraParser *profiles, const char *name, const char **atts);
+    void storeMcMappForConfig(int mcId, supported_stream_config_t streamCfg);
+    void parseLinkElement(CameraParser *profiles, const char *name, const char **atts);
+    void parseRouteElement(CameraParser *profiles, const char *name, const char **atts);
+    void parseControlElement(CameraParser *profiles, const char *name, const char **atts);
+    void parseSelectionElement(CameraParser *profiles, const char *name, const char **atts);
+    void parseFormatElement(CameraParser *profiles, const char *name, const char **atts);
+    void parseVideoElement(CameraParser *profiles, const char *name, const char **atts);
+    void parseOutputElement(CameraParser *profiles, const char *name, const char **atts);
+    void parseMultiExpRange(const char* src);
+
+    int parseSupportedTuningConfig(const char *str, std::vector <TuningConfig> &config);
+    int parseLardTags(const char *str, std::vector <LardTagConfig> &lardTags);
+
+    void dumpSensorInfo(void);
+
+    void parseOutputMap(const char *str, std::vector<UserToPslOutputMap> &outputMap);
+
+    std::string replaceStringInXml(CameraParser *profiles, const char *value);
+};
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/platformdata/CameraTypes.h b/camera/hal/intel/ipu6/src/platformdata/CameraTypes.h
new file mode 100644
index 000000000000..a219478151a6
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/CameraTypes.h
@@ -0,0 +1,226 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <string>
+#include <vector>
+#include <map>
+#include "Parameters.h"
+
+namespace icamera {
+
+/**
+ * Use to link buffer producers and consumers
+ */
+enum Port {
+    MAIN_PORT = 0,
+    SECOND_PORT,
+    THIRD_PORT,
+    FORTH_PORT,
+    INVALID_PORT
+};
+
+enum {
+    FACING_BACK = 0,
+    FACING_FRONT = 1,
+};
+
+enum {
+    ORIENTATION_0 = 0,
+    ORIENTATION_90 = 90,
+    ORIENTATION_180 = 180,
+    ORIENTATION_270 = 270,
+};
+
+enum {
+    LENS_VCM_HW = 0,
+    LENS_NONE_HW
+};
+
+enum {
+    AUTO_SWITCH_FULL = 0,
+    AUTO_SWITCH_PSYS
+};
+
+enum {
+    SENSOR_EXPOSURE_SINGLE = 0,        /* sensor is single exposure */
+    SENSOR_FIX_EXPOSURE_RATIO,         /* Fix exposure ratio between long and short exposure */
+    SENSOR_RELATIVE_MULTI_EXPOSURES,   /* AE output exposures are converted to Shutter and
+                                          Readout time, then set to sensor driver */
+    SENSOR_MULTI_EXPOSURES,            /* Multi-exposures are set to sensor driver directly */
+    SENSOR_DUAL_EXPOSURES_DCG_AND_VS   /* Dual-exposure and multiple gains, i.e. DCG + VS */
+};
+
+enum {
+    SENSOR_GAIN_NONE = 0,
+    SENSOR_MULTI_DG_AND_CONVERTION_AG,  /* Multi-DigitalGain and convertion AnalogGain are set
+                                           to sensor driver */
+    ISP_DG_AND_SENSOR_DIRECT_AG,        /* All digital gain is passed to ISP */
+    SENSOR_MULTI_DG_AND_DIRECT_AG       /* Multi analog and digital gains, i.e. DCG */
+};
+
+/**
+ * This definition is used to distinguish different camera running mode, like video or still.
+ */
+typedef enum {
+    TUNING_MODE_VIDEO,
+    TUNING_MODE_VIDEO_ULL,
+    TUNING_MODE_VIDEO_CUSTOM_AIC,
+    TUNING_MODE_VIDEO_LL,
+    TUNING_MODE_VIDEO_REAR_VIEW,
+    TUNING_MODE_VIDEO_HITCH_VIEW,
+    TUNING_MODE_STILL_CAPTURE,
+    TUNING_MODE_MAX
+} TuningMode;
+
+/*
+ * The mapping algorithm for sensor digital gain
+ */
+typedef enum {
+    SENSOR_DG_TYPE_NONE,
+    SENSOR_DG_TYPE_X,           //linear relationship, gain = n*value (value: register value, n: ratio)
+    SENSOR_DG_TYPE_2_X,         //exponential relationship, gain = 2 ^ value (value: register value)
+} SensorDgType;
+
+typedef enum {
+    MORPH_TABLE = 0,
+    IMG_TRANS
+} DvsType;
+
+// Note AUTO is not real config mode in the HAL.
+typedef camera_stream_configuration_mode_t ConfigMode;
+
+typedef struct TuningConfig {
+    ConfigMode configMode;                 /*!< configMode is internal usage to select AIQ and
+                                                Pipeline. AUTO is not real config mode. */
+    TuningMode tuningMode;                 /*!< tuningMode is used to define user cases,
+                                                like video or still. */
+    std::string aiqbName;                       /*!< special aiqb name corresponding with TuningMode */
+} TuningConfig;
+
+typedef struct {
+    /*!< tuningMode is used to define user cases, like video or still. */
+    TuningMode tuningMode;
+    unsigned int cmcTag;
+    unsigned int aiqTag;
+    unsigned int ispTag;
+    unsigned int othersTag;
+} LardTagConfig;
+
+typedef struct {
+    uint32_t horizontal_crop_offset;
+    uint32_t vertical_crop_offset;
+    uint32_t cropped_image_width;
+    uint32_t cropped_image_height;
+    uint32_t horizontal_scaling_numerator;
+    uint32_t horizontal_scaling_denominator;
+    uint32_t vertical_scaling_numerator;
+    uint32_t vertical_scaling_denominator;
+} SensorFrameParams;
+
+enum ExecutorNotifyPolicy {
+    POLICY_FRAME_FIRST = 0,
+    POLICY_STATS_FIRST,
+    POLICY_INVALID,
+};
+
+struct ExecutorPolicy {
+    std::string exeName;
+    ExecutorNotifyPolicy notifyPolicy;
+    std::vector<std::string> pgList;
+    std::vector<int> opModeList;
+    std::vector<int> cyclicFeedbackRoutineList;
+    std::vector<int> cyclicFeedbackDelayList;
+    ExecutorPolicy() : notifyPolicy(POLICY_FRAME_FIRST) {}
+};
+
+struct ExecutorDepth {
+    std::vector<std::string> bundledExecutors;
+    std::vector<int> depths;
+};
+
+struct PolicyConfig {
+    int graphId;
+    std::string policyDescription;
+    std::vector<ExecutorPolicy> pipeExecutorVec;
+    std::vector<std::string> exclusivePgs;
+    std::vector<ExecutorDepth> bundledExecutorDepths;
+    bool enableBundleInSdv;
+
+    PolicyConfig() { graphId = -1; enableBundleInSdv = true; }
+};
+
+struct CommonConfig {
+    float xmlVersion;
+    std::string ipuName;
+    std::vector<std::string> availableSensors;
+
+    CommonConfig() { xmlVersion = 1.0; }
+};
+
+struct OBSetting {
+    ConfigMode configMode;
+    int top;
+    int left;
+    int sectionHeight;
+    int interleaveStep;
+};
+
+struct ExpRange {
+    int min;
+    int max;
+    int step;
+    int lowerBound;
+    int upperBound;
+};
+
+/**
+ * Multi exposure range information
+*/
+struct MultiExpRange {
+    camera_resolution_t Resolution;
+    ExpRange SHS1;
+    ExpRange RHS1;
+    ExpRange SHS2;
+    ExpRange RHS2;
+    ExpRange SHS3;
+};
+
+struct UserToPslOutputMap {
+    camera_resolution_t User;
+    camera_resolution_t Psl;
+};
+
+struct FrameInfo {
+    FrameInfo() {}
+    int mWidth = 0;
+    int mHeight = 0;
+    int mFormat = 0;
+    int mStride = 0;
+    int mBpp = 0;
+};
+typedef std::map<Port, FrameInfo> FrameInfoPortMap;
+
+/**
+ * Indicate if the graph setting for video and still is coupled or dispersed
+ */
+typedef enum {
+    COUPLED,
+    DISPERSED,
+} GraphSettingType;
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/platformdata/ParserBase.cpp b/camera/hal/intel/ipu6/src/platformdata/ParserBase.cpp
new file mode 100644
index 000000000000..92c3f76ed0d8
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/ParserBase.cpp
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define LOG_TAG "ParserBase"
+
+#include <memory>
+#include <expat.h>
+#include <string.h>
+
+#include "ParserBase.h"
+#include "iutils/CameraLog.h"
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+
+ParserBase::ParserBase()
+{
+    LOGXML("@%s", __func__);
+}
+
+const char *ParserBase::skipWhiteSpace(const char *src)
+{
+    while (*src == '\n' || *src == '\t' || *src == ' ' || *src == '\v' || *src == '\r' || *src == '\f') {
+        src++;
+    }
+    return src;
+}
+
+int ParserBase::parseXmlParameterToChar(const char *str, unsigned char *table)
+{
+    CheckError(str == nullptr, -1, "@%s, str is nullptr", __func__);
+
+    int index = 0;
+    char *savePtr, *tablePtr;
+    int sz = strlen(str);
+    char src[sz + 1];
+    MEMCPY_S(src, sz, str, sz);
+    src[sz] = '\0';
+
+    tablePtr = strtok_r(src, ",", &savePtr);
+    while (tablePtr) {
+        table[index] = atoi(tablePtr);
+        if (savePtr != nullptr)
+            savePtr = const_cast<char *>(skipWhiteSpace(savePtr));
+        index++;
+        tablePtr = strtok_r(nullptr, ",", &savePtr);
+    }
+    return 0;
+}
+
+/* template function need the function ptr */
+std::string ParserBase::convertCharToString(const char *str)
+{
+    return str;
+}
+
+void ParserBase::startElement(void *userData, const char *name, const char **atts)
+{
+    ParserBaseCallBack *profiles = reinterpret_cast<ParserBaseCallBack*>(userData);
+    profiles->startParseElement(userData, name, atts);
+}
+
+void ParserBase::endElement(void *userData, const char *name)
+{
+    ParserBaseCallBack *profiles = reinterpret_cast<ParserBaseCallBack*>(userData);
+    profiles->endParseElement(userData, name);
+}
+
+int ParserBase::parseXmlFile(const std::string &xmlFile)
+{
+    int ret = UNKNOWN_ERROR;
+    int done;
+    FILE *fp = nullptr;
+    int bufSize = 4 * 1024;  // parse 4k data every time
+
+    CheckError(xmlFile.empty(), UNKNOWN_ERROR, "xmlFile is empty");
+
+    LOGXML("@%s, parsing profile: %s", __func__, xmlFile.c_str());
+
+    fp = ::fopen(xmlFile.c_str(), "r");
+    CheckError(nullptr == fp, UNKNOWN_ERROR, "@%s, line:%d, Can not open profile file %s in read mode, fp is nullptr",
+          __func__, __LINE__, xmlFile.c_str());
+
+    std::unique_ptr<char[]>pBuf(new char[bufSize]);
+    XML_Parser parser = ::XML_ParserCreate(nullptr);
+    if (nullptr == parser) {
+        LOGE("@%s, line:%d, parser is nullptr", __func__, __LINE__);
+        goto exit;
+    }
+
+    ::XML_SetUserData(parser, this);
+    ::XML_SetElementHandler(parser, startElement, endElement);
+
+    do {
+        int len = (int)::fread(pBuf.get(), 1, bufSize, fp);
+        if (!len) {
+            if (ferror(fp)) {
+                clearerr(fp);
+                goto exit;
+            }
+        }
+        done = len < bufSize;
+        if (XML_Parse(parser, (const char *)pBuf.get(), len, done) == XML_STATUS_ERROR) {
+            LOGE("@%s, line:%d, XML_Parse error", __func__, __LINE__);
+            goto exit;
+        }
+    } while (!done);
+    ret = OK;
+
+exit:
+    if (parser)
+        ::XML_ParserFree(parser);
+    if (fp)
+    ::fclose(fp);
+
+    return ret;
+}
+
+void ParserBase::getAvaliableXmlFile(const std::vector<const char *> &avaliableXmlFiles,
+                                     std::string &xmlFile)
+{
+    struct stat st;
+    for (auto xml : avaliableXmlFiles) {
+        int ret = stat(xml, &st);
+        if (ret == 0) {
+            xmlFile = xml;
+            return;
+        }
+    }
+}
+
+int ParserBase::getDataFromXmlFile(std::string fileName)
+{
+    LOGXML("@%s", __func__);
+    CheckError(fileName.size() == 0, UNKNOWN_ERROR, "file name is null");
+
+    std::string curFolderFileName = std::string("./") + fileName;
+    std::string sysFolderFileName = PlatformData::getCameraCfgPath() + fileName;
+    const std::vector <const char *> profiles = {
+        curFolderFileName.c_str(),
+        sysFolderFileName.c_str()
+    };
+
+    std::string chosenXmlFile;
+    getAvaliableXmlFile(profiles, chosenXmlFile);
+    CheckError(chosenXmlFile.empty(), UNKNOWN_ERROR, "%s is not found in: %s or %s",
+          fileName.c_str(), curFolderFileName.c_str(), sysFolderFileName.c_str());
+
+    return parseXmlFile(chosenXmlFile);
+}
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/platformdata/ParserBase.h b/camera/hal/intel/ipu6/src/platformdata/ParserBase.h
new file mode 100644
index 000000000000..c6ccaff7dd38
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/ParserBase.h
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2019-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ *\file ParserBase.h
+ *
+ * parser for the camera xml configuration file, this is a basic class.
+ *
+ * This file calls the libexpat ditectly. The libexpat is one xml parser.
+ * It will parse the camera configuration out firstly.
+ * Then other module can call the methods of it to get the real configuration.
+ *
+ */
+
+#pragma once
+
+#include "PlatformData.h"
+
+namespace icamera {
+
+class ParserBaseCallBack {
+public:
+    virtual ~ParserBaseCallBack() {}
+    virtual void startParseElement(void *userData, const char *name, const char **atts){};
+    virtual void endParseElement(void *userData, const char *name){};
+};
+
+class ParserBase : public ParserBaseCallBack {
+public:
+    ParserBase();
+    virtual ~ParserBase() {}
+
+private:
+    // prevent copy constructor and assignment operator
+    DISALLOW_COPY_AND_ASSIGN(ParserBase);
+
+protected:
+    /**
+     * Get an avaliable xml file
+     *
+     * Find the first avaliable xml file.
+     *
+     * \param[in] const vector<char *>& allAvaliableXmlFiles: all avaliable xml files list.
+     * \param[out] string& xmlFile: to store a avaliable xml file
+     */
+    void getAvaliableXmlFile(const std::vector<const char *> &avaliableXmlFiles,
+                             std::string &xmlFile);
+
+    /**
+     * Get camera configuration from xml file
+     *
+     * The function will read the xml configuration file firstly.
+     * Then it will parse out the camera settings.
+     * The camera setting is stored inside this CameraProfiles class.
+     */
+    int getDataFromXmlFile(std::string fileName);
+
+    int parseXmlFile(const std::string &xmlFile);
+    const char* skipWhiteSpace(const char *src);
+    int parseXmlParameterToChar(const char *str, unsigned char *table);
+
+    static void startElement(void *userData, const char *name, const char **atts);
+    static void endElement(void *userData, const char *name);
+    static std::string convertCharToString(const char *str);
+
+    template<typename T>
+    int parseXmlConvertStrings(const char *str, std::vector<T> &vectorT,
+                               T (*parseXmlString)(const char *)) {
+        CheckError(str == nullptr || parseXmlString == nullptr, -1, "@%s, input parameter is nullptr", __func__);
+
+        int sz = strlen(str);
+        char src[sz + 1];
+        MEMCPY_S(src, sz, str, sz);
+        src[sz] = '\0';
+
+        char *savePtr = nullptr;
+        char *cfgName = strtok_r(src, ",", &savePtr);
+        while(cfgName) {
+            vectorT.push_back(parseXmlString(cfgName));
+            if (savePtr != nullptr)
+                savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
+            cfgName = strtok_r(nullptr, ",", &savePtr);
+        }
+
+        return 0;
+    }
+};
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/platformdata/PlatformData.cpp b/camera/hal/intel/ipu6/src/platformdata/PlatformData.cpp
new file mode 100644
index 000000000000..643002ae6531
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/PlatformData.cpp
@@ -0,0 +1,1296 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "PlatformData"
+
+#include <sys/sysinfo.h>
+#include <math.h>
+#include <memory>
+
+#include "iutils/CameraLog.h"
+
+#include "PlatformData.h"
+#include "CameraParser.h"
+#include "PolicyParser.h"
+
+#include "gc/GraphConfigManager.h"
+
+using std::string;
+using std::vector;
+
+namespace icamera {
+PlatformData *PlatformData::sInstance = nullptr;
+Mutex  PlatformData::sLock;
+
+#ifdef ENABLE_SANDBOXING
+IntelAlgoClient* PlatformData::mIntelAlgoClient = nullptr;
+#endif
+
+PlatformData* PlatformData::getInstance()
+{
+    AutoMutex lock(sLock);
+    if (sInstance == nullptr) {
+        sInstance = new PlatformData();
+    }
+
+    return sInstance;
+}
+
+void PlatformData::releaseInstance()
+{
+    AutoMutex lock(sLock);
+    LOG1("@%s", __func__);
+
+    if (sInstance) {
+        delete sInstance;
+        sInstance = nullptr;
+    }
+}
+
+PlatformData::PlatformData()
+{
+    LOG1("@%s", __func__);
+    MediaControl *mc = MediaControl::getInstance();
+    mc->initEntities();
+
+#ifdef ENABLE_SANDBOXING
+    mIntelAlgoClient = new IntelAlgoClient;
+    bool ret = mIntelAlgoClient->isInitialized();
+    CheckError(ret == false, VOID_VALUE, "@%s, mIntelAlgoClient->isInitialized() fails", __func__);
+#endif
+
+    for (int i = 0; i < MAX_CAMERA_NUMBER; i++) {
+        mAiqInitDatas[i] = new AiqInitData;
+    }
+
+    CameraParser CameraParser(mc, &mStaticCfg);
+    PolicyParser PolicyParser(&mStaticCfg);
+}
+
+PlatformData::~PlatformData() {
+    LOG1("@%s", __func__);
+
+    releaseGraphConfigNodes();
+    MediaControl::releaseInstance();
+
+    for (int i = 0; i < MAX_CAMERA_NUMBER; i++) {
+        delete mAiqInitDatas[i];
+        mAiqInitDatas[i] = nullptr;
+    }
+
+#ifdef ENABLE_SANDBOXING
+    delete mIntelAlgoClient;
+    mIntelAlgoClient = nullptr;
+#endif
+}
+
+void PlatformData::releaseGraphConfigNodes()
+{
+    std::shared_ptr<GraphConfig> graphConfig = std::make_shared<GraphConfig>();
+    graphConfig->releaseGraphNodes();
+    for (uint8_t cameraId = 0; cameraId < mStaticCfg.mCameras.size(); cameraId++) {
+        IGraphConfigManager::releaseInstance(cameraId);
+    }
+}
+
+const char* PlatformData::getSensorName(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].sensorName.c_str();
+}
+
+const char* PlatformData::getSensorDescription(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].sensorDescription.c_str();
+}
+
+const char* PlatformData::getLensName(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mLensName.c_str();
+}
+
+int PlatformData::getLensHwType(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mLensHwType;
+}
+
+int PlatformData::getDVSType(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mDVSType;
+}
+
+bool PlatformData::getISYSCompression(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mISYSCompression;
+}
+
+bool PlatformData::getPSACompression(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mPSACompression;
+}
+
+bool PlatformData::getOFSCompression(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mOFSCompression;
+}
+
+int PlatformData::getCITMaxMargin(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mCITMaxMargin;
+}
+
+bool PlatformData::isEnableAIQ(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mEnableAIQ;
+}
+
+bool PlatformData::isEnableLtmThread(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mEnableLtmThread;
+}
+
+bool PlatformData::isFaceAeEnabled(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mFaceAeEnabled;
+}
+
+int PlatformData::faceEngineRunningInterval(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mFaceEngineRunningInterval;
+}
+
+int PlatformData::faceEngineRunningIntervalNoFace(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mFaceEngineRunningIntervalNoFace;
+}
+
+bool PlatformData::isFaceEngineSyncRunning(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mFaceEngineRunningSync;
+}
+
+bool PlatformData::isDvsSupported(int cameraId)
+{
+    camera_video_stabilization_list_t videoStabilizationList;
+    Parameters* param = &getInstance()->mStaticCfg.mCameras[cameraId].mCapability;
+    param->getSupportedVideoStabilizationMode(videoStabilizationList);
+
+    bool supported = false;
+    for (auto it : videoStabilizationList) {
+        if (it == VIDEO_STABILIZATION_MODE_ON) {
+            supported = true;
+        }
+    }
+
+    LOG2("@%s, dvs supported:%d", __func__, supported);
+    return supported;
+}
+
+bool PlatformData::psysAlignWithSof(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mPsysAlignWithSof;
+}
+
+bool PlatformData::swProcessingAlignWithIsp(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mSwProcessingAlignWithIsp;
+}
+
+bool PlatformData::isUsingSensorDigitalGain(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mUseSensorDigitalGain;
+}
+
+bool PlatformData::isUsingIspDigitalGain(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mUseIspDigitalGain;
+}
+
+bool PlatformData::isNeedToPreRegisterBuffer(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mNeedPreRegisterBuffers;
+}
+
+int PlatformData::getAutoSwitchType(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mAutoSwitchType;
+}
+
+bool PlatformData::isEnableFrameSyncCheck(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mFrameSyncCheckEnabled;
+}
+
+bool PlatformData::isEnableDefog(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mEnableLtmDefog;
+}
+
+int PlatformData::getExposureNum(int cameraId, bool multiExposure)
+{
+    if (multiExposure) {
+        return getInstance()->mStaticCfg.mCameras[cameraId].mSensorExposureNum;
+    }
+
+    int exposureNum = 1;
+
+    return exposureNum;
+}
+
+bool PlatformData::isLtmEnabled(int cameraId)
+{
+
+    return getInstance()->mStaticCfg.mCameras[cameraId].mLtmEnabled;
+}
+
+int PlatformData::getSensorExposureType(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mSensorExposureType;
+}
+
+int PlatformData::getSensorGainType(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mSensorGainType;
+}
+
+bool PlatformData::isSkipFrameOnSTR2MMIOErr(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mSkipFrameV4L2Error;
+}
+
+unsigned int PlatformData::getInitialSkipFrame(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mInitialSkipFrame;
+}
+
+unsigned int PlatformData::getMaxRawDataNum(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mMaxRawDataNum;
+}
+
+bool PlatformData::getTopBottomReverse(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mTopBottomReverse;
+}
+
+bool PlatformData::isPsysContinueStats(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mPsysContinueStats;
+}
+
+unsigned int PlatformData::getPreferredBufQSize(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mPreferredBufQSize;
+}
+
+unsigned int PlatformData::getPipeSwitchDelayFrame(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mPipeSwitchDelayFrame;
+}
+
+int PlatformData::getLtmGainLag(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mLtmGainLag;
+}
+
+int PlatformData::getMaxSensorDigitalGain(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mMaxSensorDigitalGain;
+}
+
+SensorDgType PlatformData::sensorDigitalGainType(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mSensorDgType;
+}
+
+int PlatformData::getExposureLag(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mExposureLag;
+}
+
+int PlatformData::getGainLag(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mGainLag;
+}
+
+PolicyConfig* PlatformData::getExecutorPolicyConfig(int graphId)
+{
+    size_t i = 0;
+    PlatformData::StaticCfg *cfg = &getInstance()->mStaticCfg;
+
+    for (i = 0; i < cfg->mPolicyConfig.size(); i++) {
+        if (graphId == cfg->mPolicyConfig[i].graphId) {
+            return &(cfg->mPolicyConfig[i]);
+        }
+    }
+
+    LOGW("Couldn't find the executor policy for graphId(%d), please check xml file", graphId);
+    return nullptr;
+}
+
+int PlatformData::numberOfCameras()
+{
+    return getInstance()->mStaticCfg.mCameras.size();
+}
+
+MediaCtlConf *PlatformData::getMediaCtlConf(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mCurrentMcConf;
+}
+
+int PlatformData::getCameraInfo(int cameraId, camera_info_t& info)
+{
+    // TODO correct the version info
+    info.device_version = 1;
+    info.facing = getInstance()->mStaticCfg.mCameras[cameraId].mFacing;
+    info.orientation= getInstance()->mStaticCfg.mCameras[cameraId].mOrientation;
+    info.name = getSensorName(cameraId);
+    info.description = getSensorDescription(cameraId);
+    info.capability = &getInstance()->mStaticCfg.mCameras[cameraId].mCapability;
+    return OK;
+}
+
+bool PlatformData::isFeatureSupported(int cameraId, camera_features feature)
+{
+    camera_features_list_t features;
+    getInstance()->mStaticCfg.mCameras[cameraId].mCapability.getSupportedFeatures(features);
+
+    if (features.empty()) {
+        return false;
+    }
+    for (auto& item : features) {
+        if (item == feature) {
+            return true;
+        }
+    }
+    return false;
+}
+
+bool PlatformData::isSupportedStream(int cameraId, const stream_t& conf)
+{
+    int width = conf.width;
+    int height = conf.height;
+    int format = conf.format;
+    int field = conf.field;
+
+    supported_stream_config_array_t availableConfigs;
+    getInstance()->mStaticCfg.mCameras[cameraId].mCapability.getSupportedStreamConfig(availableConfigs);
+    bool sameConfigFound = false;
+    for (auto const& config : availableConfigs) {
+        if (config.format == format && config.field == field
+                && config.width == width && config.height == height) {
+            sameConfigFound = true;
+            break;
+        }
+    }
+
+    return sameConfigFound;
+}
+
+void PlatformData::getSupportedISysSizes(int cameraId, vector <camera_resolution_t>& resolutions)
+{
+    resolutions = getInstance()->mStaticCfg.mCameras[cameraId].mSupportedISysSizes;
+}
+
+bool PlatformData::getSupportedISysFormats(int cameraId, vector <int>& formats)
+{
+    formats = getInstance()->mStaticCfg.mCameras[cameraId].mSupportedISysFormat;
+
+    return true;
+}
+
+int PlatformData::getISysFormat(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mISysFourcc;
+}
+
+/**
+ * The ISYS format is determined by the steps below:
+ * 1. Try to use the specified format in media control config if it exists.
+ * 2. If the given format is supported by ISYS, then use it.
+ * 3. Use the first supported format if still could not find an appropriate one.
+ */
+void PlatformData::selectISysFormat(int cameraId, int format)
+{
+    MediaCtlConf *mc = getMediaCtlConf(cameraId);
+    if (mc != nullptr && mc->format != -1) {
+        getInstance()->mStaticCfg.mCameras[cameraId].mISysFourcc = mc->format;
+    } else if (isISysSupportedFormat(cameraId, format)) {
+        getInstance()->mStaticCfg.mCameras[cameraId].mISysFourcc = format;
+    } else {
+        // Set the first one in support list to default Isys output.
+        vector <int> supportedFormat =
+            getInstance()->mStaticCfg.mCameras[cameraId].mSupportedISysFormat;
+        getInstance()->mStaticCfg.mCameras[cameraId].mISysFourcc = supportedFormat[0];
+    }
+}
+
+/**
+ * The media control config is determined by the steps below:
+ * 1. Check if can get one from the given MC ID.
+ * 2. And then, try to use ConfigMode to find matched one.
+ * 3. Use stream config to get a corresponding mc id, and then get the config by id.
+ * 4. Return nullptr if still could not find an appropriate one.
+ */
+void PlatformData::selectMcConf(int cameraId, stream_t stream, ConfigMode mode, int mcId)
+{
+    if (!isIsysEnabled(cameraId)) return;
+
+    const StaticCfg::CameraInfo& pCam = getInstance()->mStaticCfg.mCameras[cameraId];
+
+    MediaCtlConf* mcConfig = getMcConfByMcId(pCam, mcId);
+    if (!mcConfig) {
+        mcConfig = getMcConfByConfigMode(pCam, stream, mode);
+    }
+
+    if (!mcConfig) {
+        mcConfig = getMcConfByStream(pCam, stream);
+    }
+
+    getInstance()->mStaticCfg.mCameras[cameraId].mCurrentMcConf = mcConfig;
+
+    if (!mcConfig) {
+        LOGE("No matching McConf: cameraId %d, configMode %d, mcId %d", cameraId, mode, mcId);
+    }
+}
+
+/*
+ * Find the MediaCtlConf based on the given MC id.
+ */
+MediaCtlConf* PlatformData::getMcConfByMcId(const StaticCfg::CameraInfo& cameraInfo, int mcId)
+{
+    if (mcId == -1) {
+        return nullptr;
+    }
+
+    for (auto& mc : cameraInfo.mMediaCtlConfs) {
+        if (mcId == mc.mcId) {
+            return (MediaCtlConf*)&mc;
+        }
+    }
+
+    return nullptr;
+}
+
+/*
+ * Find the MediaCtlConf based on MC id in mStreamToMcMap.
+ */
+MediaCtlConf* PlatformData::getMcConfByStream(const StaticCfg::CameraInfo& cameraInfo,
+                                              const stream_t& stream)
+{
+    int mcId = -1;
+    for (auto& table : cameraInfo.mStreamToMcMap) {
+        for(auto& config : table.second) {
+            if (config.format == stream.format && config.field == stream.field
+                    && config.width == stream.width && config.height == stream.height) {
+                mcId = table.first;
+                break;
+            }
+        }
+        if (mcId != -1) {
+            break;
+        }
+    }
+
+    return getMcConfByMcId(cameraInfo, mcId);
+}
+
+/*
+ * Find the MediaCtlConf based on operation mode and stream info.
+ */
+MediaCtlConf* PlatformData::getMcConfByConfigMode(const StaticCfg::CameraInfo& cameraInfo,
+                                                  const stream_t& stream, ConfigMode mode)
+{
+    for (auto& mc : cameraInfo.mMediaCtlConfs) {
+        for (auto& cfgMode : mc.configMode) {
+            if (mode != cfgMode) continue;
+
+            int outputWidth = mc.outputWidth;
+            int outputHeight = mc.outputHeight;
+            int stride = CameraUtils::getStride(mc.format, mc.outputWidth);
+            bool sameStride = (stride == CameraUtils::getStride(mc.format, stream.width));
+            /*
+             * outputWidth and outputHeight is 0 means the ISYS output size
+             * is dynamic, we don't need to check if it matches with stream config.
+             */
+            if ((outputWidth == 0 && outputHeight == 0 ) ||
+                ((stream.width == outputWidth || sameStride)
+                && stream.height == outputHeight)) {
+                return (MediaCtlConf*)&mc;
+            }
+        }
+    }
+
+    return nullptr;
+}
+
+/*
+ * Check if video node is enabled via camera Id and video node type.
+ */
+bool PlatformData::isVideoNodeEnabled(int cameraId, VideoNodeType type) {
+    MediaCtlConf *mc = getMediaCtlConf(cameraId);
+    if (!mc) return false;
+
+    for(auto const& nd : mc->videoNodes) {
+        if (type == nd.videoNodeType) {
+            return true;
+        }
+    }
+    return false;
+}
+
+bool PlatformData::isISysSupportedFormat(int cameraId, int format)
+{
+    vector <int> supportedFormat;
+    getSupportedISysFormats(cameraId, supportedFormat);
+
+    for (auto const fmt : supportedFormat) {
+        if (format == fmt)
+            return true;
+    }
+    return false;
+}
+
+bool PlatformData::isISysSupportedResolution(int cameraId, camera_resolution_t resolution)
+{
+    vector <camera_resolution_t> res;
+    getSupportedISysSizes(cameraId, res);
+
+    for (auto const& size : res) {
+        if (resolution.width == size.width && resolution.height== size.height)
+            return true;
+    }
+
+    return false;
+}
+
+int PlatformData::getISysRawFormat(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mISysRawFormat;
+}
+
+stream_t PlatformData::getISysOutputByPort(int cameraId, Port port)
+{
+    stream_t config;
+    CLEAR(config);
+
+    MediaCtlConf *mc = PlatformData::getMediaCtlConf(cameraId);
+    CheckError(!mc, config, "Invalid media control config.");
+
+    for (const auto& output : mc->outputs) {
+        if (output.port == port) {
+            config.format  = output.v4l2Format;
+            config.width   = output.width;
+            config.height  = output.height;
+            break;
+        }
+    }
+
+    return config;
+}
+
+bool PlatformData::isAiqdEnabled(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mEnableAiqd;
+}
+
+int PlatformData::getFormatByDevName(int cameraId, const string& devName, McFormat& format)
+{
+    MediaCtlConf *mc = getMediaCtlConf(cameraId);
+    CheckError(!mc, BAD_VALUE, "getMediaCtlConf returns nullptr, cameraId:%d", cameraId);
+
+    for (auto &fmt : mc->formats) {
+        if (fmt.formatType == FC_FORMAT && devName == fmt.entityName) {
+            format = fmt;
+            return OK;
+        }
+    }
+
+    LOGE("Failed to find DevName for cameraId: %d, devname: %s", cameraId, devName.c_str());
+    return BAD_VALUE;
+}
+
+int PlatformData::getVideoNodeNameByType(int cameraId, VideoNodeType videoNodeType, string& videoNodeName)
+{
+    MediaCtlConf *mc = getMediaCtlConf(cameraId);
+    CheckError(!mc, BAD_VALUE, "getMediaCtlConf returns nullptr, cameraId:%d", cameraId);
+
+    for(auto const& nd : mc->videoNodes) {
+        if (videoNodeType == nd.videoNodeType) {
+            videoNodeName = nd.name;
+            return OK;
+        }
+    }
+
+    LOGE("failed to find video note name for cameraId: %d", cameraId);
+    return BAD_VALUE;
+}
+
+int PlatformData::getDevNameByType(int cameraId, VideoNodeType videoNodeType, string& devName)
+{
+    if (!isIsysEnabled(cameraId)) return OK;
+
+    MediaCtlConf *mc = getMediaCtlConf(cameraId);
+    bool isSubDev = false;
+
+    switch (videoNodeType) {
+        case VIDEO_PIXEL_ARRAY:
+        case VIDEO_PIXEL_BINNER:
+        case VIDEO_PIXEL_SCALER:
+        {
+            isSubDev = true;
+            // For sensor subdevices are fixed and sensor HW may be initialized before configure,
+            // the first MediaCtlConf is used to find sensor subdevice name.
+            PlatformData::StaticCfg::CameraInfo *pCam = &getInstance()->mStaticCfg.mCameras[cameraId];
+            mc = &pCam->mMediaCtlConfs[0];
+            break;
+        }
+        case VIDEO_ISYS_RECEIVER_BACKEND:
+        case VIDEO_ISYS_RECEIVER:
+        {
+            isSubDev = true;
+            break;
+        }
+        default:
+            break;
+    }
+
+    CheckError(!mc, NAME_NOT_FOUND, "failed to get MediaCtlConf, videoNodeType %d", videoNodeType);
+
+    for(auto& nd : mc->videoNodes) {
+        if (videoNodeType == nd.videoNodeType) {
+            string tmpDevName;
+            CameraUtils::getDeviceName(nd.name.c_str(), tmpDevName, isSubDev);
+            if (!tmpDevName.empty()) {
+                devName = tmpDevName;
+                LOG2("@%s, Found DevName. cameraId: %d, get video node: %s, devname: %s",
+                      __func__, cameraId, nd.name.c_str(), devName.c_str());
+                return OK;
+            } else {
+                // Use default device name if cannot find it
+                if (isSubDev)
+                    devName = "/dev/v4l-subdev1";
+                else
+                    devName = "/dev/video5";
+                LOGE("Failed to find DevName for cameraId: %d, get video node: %s, devname: %s",
+                      cameraId, nd.name.c_str(), devName.c_str());
+                return NAME_NOT_FOUND;
+            }
+        }
+    }
+
+    LOG1("Failed to find devname for cameraId: %d, use default setting instead", cameraId);
+    return NAME_NOT_FOUND;
+}
+
+/**
+ * The ISYS best resolution is determined by the steps below:
+ * 1. If the resolution is specified in MediaCtlConf, then use it.
+ * 2. Try to find the exact matched one in ISYS supported resolutions.
+ * 3. Try to find the same ratio resolution.
+ * 4. If still couldn't get one, then use the biggest one.
+ */
+camera_resolution_t PlatformData::getISysBestResolution(int cameraId, int width,
+                                                        int height, int field)
+{
+    LOG1("@%s, width:%d, height:%d", __func__, width, height);
+
+    // Skip for interlace, we only support by-pass in interlaced mode
+    if (field == V4L2_FIELD_ALTERNATE) {
+        return {width, height};
+    }
+
+    MediaCtlConf *mc = getMediaCtlConf(cameraId);
+    // The isys output size is fixed if outputWidth/outputHeight != 0
+    // So we use it to as the ISYS resolution.
+    if (mc != nullptr && mc->outputWidth != 0 && mc->outputHeight != 0) {
+        return {mc->outputWidth, mc->outputHeight};
+    }
+
+    const float RATIO_TOLERANCE = 0.05f; // Supported aspect ratios that are within RATIO_TOLERANCE
+    const float kTargetRatio = (float)width / height;
+
+    vector <camera_resolution_t> res;
+    // The supported resolutions are saved in res with ascending order(small -> bigger)
+    getSupportedISysSizes(cameraId, res);
+
+    // Try to find out the same resolution in the supported isys resolution list
+    // if it couldn't find out the same one, then use the bigger one which is the same ratio
+    for (auto const& size : res) {
+        if (width <= size.width && height <= size.height &&
+            fabs((float)size.width/size.height - kTargetRatio) < RATIO_TOLERANCE) {
+            LOG1("@%s: Found the best ISYS resoltoution (%d)x(%d)", __func__,
+                 size.width, size.height);
+            return {size.width, size.height};
+        }
+    }
+
+    // If it still couldn't find one, then use the biggest one in the supported list.
+    LOG1("@%s: ISYS resolution not found, used the biggest one: (%d)x(%d)",
+         __func__, res.back().width, res.back().height);
+    return {res.back().width, res.back().height};
+}
+
+bool PlatformData::isIsysEnabled(int cameraId)
+{
+    if (getInstance()->mStaticCfg.mCameras[cameraId].mMediaCtlConfs.empty()) {
+        return false;
+    }
+    return true;
+}
+
+int PlatformData::calculateFrameParams(int cameraId, SensorFrameParams& sensorFrameParams)
+{
+    if (!isIsysEnabled(cameraId)) {
+        LOG2("%s, no mc, just use default from xml", __func__);
+        vector <camera_resolution_t> res;
+        getSupportedISysSizes(cameraId, res);
+
+        CheckError(res.empty(), BAD_VALUE, "Supported ISYS resolutions are not configured.");
+        sensorFrameParams = {0, 0, static_cast<uint32_t>(res[0].width),
+                             static_cast<uint32_t>(res[0].height), 1, 1, 1, 1};
+
+        return OK;
+    }
+
+    CLEAR(sensorFrameParams);
+
+    uint32_t width = 0;
+    uint32_t horizontalOffset = 0;
+    uint32_t horizontalBinNum = 1;
+    uint32_t horizontalBinDenom = 1;
+    uint32_t horizontalBin = 1;
+
+    uint32_t height = 0;
+    uint32_t verticalOffset = 0;
+    uint32_t verticalBinNum = 1;
+    uint32_t verticalBinDenom = 1;
+    uint32_t verticalBin = 1;
+
+    /**
+     * For this function, it may be called without configuring stream
+     * in some UT cases, the mc is nullptr at this moment. So we need to
+     * get one default mc to calculate frame params.
+     */
+    MediaCtlConf *mc = PlatformData::getMediaCtlConf(cameraId);
+    if (mc == nullptr) {
+        PlatformData::StaticCfg::CameraInfo *pCam = &getInstance()->mStaticCfg.mCameras[cameraId];
+        mc = &pCam->mMediaCtlConfs[0];
+    }
+
+    bool pixArraySizeFound = false;
+    for (auto const& current : mc->formats) {
+        if (!pixArraySizeFound && current.width > 0 && current.height > 0) {
+            width = current.width;
+            height = current.height;
+            pixArraySizeFound = true;
+            LOG2("%s: active pixel array H=%d, W=%d", __func__, height, width);
+            //Setup initial sensor frame params.
+            sensorFrameParams.horizontal_crop_offset += horizontalOffset;
+            sensorFrameParams.vertical_crop_offset += verticalOffset;
+            sensorFrameParams.cropped_image_width = width;
+            sensorFrameParams.cropped_image_height = height;
+            sensorFrameParams.horizontal_scaling_numerator = horizontalBinNum;
+            sensorFrameParams.horizontal_scaling_denominator = horizontalBinDenom;
+            sensorFrameParams.vertical_scaling_numerator = verticalBinNum;
+            sensorFrameParams.vertical_scaling_denominator = verticalBinDenom;
+        }
+
+        if (current.formatType != FC_SELECTION) {
+            continue;
+        }
+
+        if (current.selCmd == V4L2_SEL_TGT_CROP) {
+
+            width = current.width * horizontalBin;
+            horizontalOffset = current.left * horizontalBin;
+            height = current.height * verticalBin;
+            verticalOffset = current.top * verticalBin;
+
+            LOG2("%s: crop (binning factor: hor/vert:%d,%d)"
+                  , __func__, horizontalBin, verticalBin);
+
+            LOG2("%s: crop left = %d, top = %d, width = %d height = %d",
+                  __func__, horizontalOffset, verticalOffset, width, height);
+
+        } else if (current.selCmd == V4L2_SEL_TGT_COMPOSE) {
+            if (width == 0 || height == 0) {
+                LOGE("Invalid XML configuration, no pixel array width/height when handling compose, skip.");
+                return BAD_VALUE;
+            }
+            if (current.width == 0 || current.height == 0) {
+                LOGW("%s: Invalid XML configuration for TGT_COMPOSE,"
+                     "0 value detected in width or height", __func__);
+                return BAD_VALUE;
+            } else {
+                LOG2("%s: Compose width %d/%d, height %d/%d", __func__, width, current.width,
+                    height, current.height);
+                // the scale factor should be float, so multiple numerator and denominator
+                // with coefficient to indicate float factor
+                const int SCALE_FACTOR_COEF = 10;
+                horizontalBin = width / current.width;
+                horizontalBinNum = width * SCALE_FACTOR_COEF / current.width;
+                horizontalBinDenom = SCALE_FACTOR_COEF;
+                verticalBin = height / current.height;
+                verticalBinNum = height * SCALE_FACTOR_COEF / current.height;
+                verticalBinDenom = SCALE_FACTOR_COEF;
+            }
+
+            LOG2("%s: COMPOSE horizontal bin factor=%d, (%d/%d)",
+                  __func__, horizontalBin, horizontalBinNum, horizontalBinDenom);
+            LOG2("%s: COMPOSE vertical bin factor=%d, (%d/%d)",
+                  __func__, verticalBin, verticalBinNum, verticalBinDenom);
+        } else {
+            LOGW("%s: Target for selection is not CROP neither COMPOSE!", __func__);
+            continue;
+        }
+
+        sensorFrameParams.horizontal_crop_offset += horizontalOffset;
+        sensorFrameParams.vertical_crop_offset += verticalOffset;
+        sensorFrameParams.cropped_image_width = width;
+        sensorFrameParams.cropped_image_height = height;
+        sensorFrameParams.horizontal_scaling_numerator = horizontalBinNum;
+        sensorFrameParams.horizontal_scaling_denominator = horizontalBinDenom;
+        sensorFrameParams.vertical_scaling_numerator = verticalBinNum;
+        sensorFrameParams.vertical_scaling_denominator = verticalBinDenom;
+    }
+
+    return OK;
+
+}
+
+void PlatformData::getSupportedTuningConfig(int cameraId, vector <TuningConfig> &configs)
+{
+    configs = getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig;
+}
+
+bool PlatformData::usePsys(int cameraId, int format)
+{
+    if (getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig.empty()) {
+        LOG1("@%s, the tuning config in xml does not exist", __func__);
+        return false;
+    }
+
+    if (getInstance()->mStaticCfg.mCameras[cameraId].mPSysFormat.empty()) {
+        LOG1("@%s, the psys supported format does not exist", __func__);
+        return false;
+    }
+
+    for (auto &psys_fmt : getInstance()->mStaticCfg.mCameras[cameraId].mPSysFormat) {
+        if (format == psys_fmt)
+            return true;
+    }
+
+    LOGW("%s, No matched format found, but expected format:%s", __func__,
+        CameraUtils::pixelCode2String(format));
+
+    return false;
+}
+
+int PlatformData::getConfigModesByOperationMode(int cameraId, uint32_t operationMode, vector <ConfigMode> &configModes)
+{
+    if (operationMode == CAMERA_STREAM_CONFIGURATION_MODE_END) {
+        LOG2("%s: operationMode was invalid operation mode", __func__);
+        return INVALID_OPERATION;
+    }
+
+    CheckError(getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig.empty(), INVALID_OPERATION,
+          "@%s, the tuning config in xml does not exist", __func__);
+
+    if (operationMode == CAMERA_STREAM_CONFIGURATION_MODE_AUTO) {
+        if (getInstance()->mStaticCfg.mCameras[cameraId].mConfigModesForAuto.empty()) {
+            // Use the first config mode as default for auto
+            configModes.push_back(getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig[0].configMode);
+            LOG2("%s: add config mode %d for operation mode %d", __func__, configModes[0], operationMode);
+        } else {
+            configModes = getInstance()->mStaticCfg.mCameras[cameraId].mConfigModesForAuto;
+        }
+    } else {
+        for (auto &cfg : getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig) {
+            if (operationMode == (uint32_t)cfg.configMode) {
+                configModes.push_back(cfg.configMode);
+                LOG2("%s: add config mode %d for operation mode %d", __func__, cfg.configMode, operationMode);
+            }
+        }
+    }
+
+    if (configModes.size() > 0) return OK;
+    LOGW("%s, configure number %zu, operationMode %x, cameraId %d", __func__,
+            configModes.size(), operationMode, cameraId);
+    return INVALID_OPERATION;
+}
+
+int PlatformData::getTuningModeByConfigMode(int cameraId, ConfigMode configMode,
+                                            TuningMode& tuningMode)
+{
+    CheckError(getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig.empty(),
+          INVALID_OPERATION, "the tuning config in xml does not exist");
+
+    for (auto &cfg : getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig) {
+        LOG2("%s, tuningMode %d, configMode %x", __func__, cfg.tuningMode, cfg.configMode);
+        if (cfg.configMode == configMode) {
+            tuningMode = cfg.tuningMode;
+            return OK;
+        }
+    }
+
+    LOGW("%s, configMode %x, cameraId %d, no tuningModes", __func__, configMode, cameraId);
+    return INVALID_OPERATION;
+}
+
+int PlatformData::getTuningConfigByConfigMode(int cameraId, ConfigMode mode, TuningConfig &config)
+{
+    CheckError(getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig.empty(), INVALID_OPERATION,
+          "@%s, the tuning config in xml does not exist.", __func__);
+
+    for (auto &cfg : getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig) {
+        if (cfg.configMode == mode) {
+            config = cfg;
+            return OK;
+        }
+    }
+
+    LOGW("%s, configMode %x, cameraId %d, no TuningConfig", __func__, mode, cameraId);
+    return INVALID_OPERATION;
+}
+
+int PlatformData::getLardTagsByTuningMode(int cameraId, TuningMode mode, LardTagConfig &lardTags)
+{
+    if (getInstance()->mStaticCfg.mCameras[cameraId].mLardTagsConfig.empty()) {
+        LOG1("@%s, the lardTags config does not exist", __func__);
+        return NAME_NOT_FOUND;
+    }
+
+    for (auto &cfg : getInstance()->mStaticCfg.mCameras[cameraId].mLardTagsConfig) {
+        if (cfg.tuningMode == mode) {
+            lardTags = cfg;
+            return OK;
+        }
+    }
+
+    LOG1("@%s, the lard tag config does not exist for mode %d", __func__, mode);
+    return NAME_NOT_FOUND;
+}
+
+int PlatformData::getStreamIdByConfigMode(int cameraId, ConfigMode configMode)
+{
+    std::map<int, int> modeMap = getInstance()->mStaticCfg.mCameras[cameraId].mConfigModeToStreamId;
+    return modeMap.find(configMode) == modeMap.end() ? -1 : modeMap[configMode];
+}
+
+int PlatformData::getMaxRequestsInflight(int cameraId)
+{
+    int inflight = getInstance()->mStaticCfg.mCameras[cameraId].mMaxRequestsInflight;
+    if (inflight <= 0) {
+        inflight = isEnableAIQ(cameraId) ? 4 : MAX_BUFFER_COUNT;
+    }
+
+    return inflight;
+}
+
+bool PlatformData::getGraphConfigNodes(int cameraId)
+{
+    return !(getInstance()->mStaticCfg.mCameras[cameraId].mGraphSettingsFile.empty());
+}
+
+GraphSettingType PlatformData::getGraphSettingsType(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mGraphSettingsType;
+}
+
+camera_yuv_color_range_mode_t PlatformData::getYuvColorRangeMode(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mYuvColorRangeMode;
+}
+
+AiqdData* PlatformData::getAiqdData(int cameraId, TuningMode tuningMode)
+{
+    CheckError(cameraId >= MAX_CAMERA_NUMBER, nullptr,
+               "@%s, wrong cameraId:%d", __func__, cameraId);
+
+    AiqInitData* aiqInitData = getInstance()->mAiqInitDatas[cameraId];
+    std::string& sensorName = getInstance()->mStaticCfg.mCameras[cameraId].sensorName;
+    return aiqInitData->getAiqdData(tuningMode, sensorName);
+}
+
+// load cpf when tuning file (.aiqb) is available
+CpfStore* PlatformData::getCpfStore(int cameraId)
+{
+    CheckError(cameraId >= MAX_CAMERA_NUMBER, nullptr,
+               "@%s, wrong cameraId:%d", __func__, cameraId);
+
+    // Aiqb tuning file is configured in mSupportedTuningConfig
+    if (!getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig.empty()) {
+        AiqInitData* aiqInitData = getInstance()->mAiqInitDatas[cameraId];
+        std::string& sensorName = getInstance()->mStaticCfg.mCameras[cameraId].sensorName;
+        return aiqInitData->getCpfStore(cameraId, sensorName);
+    }
+    return nullptr;
+}
+
+bool PlatformData::isCSIBackEndCapture(int cameraId)
+{
+    bool isCsiBECapture = false;
+    MediaCtlConf *mc = getMediaCtlConf(cameraId);
+    CheckError(!mc, false, "getMediaCtlConf returns nullptr, cameraId:%d", cameraId);
+
+    for(const auto& node : mc->videoNodes) {
+        if (node.videoNodeType == VIDEO_GENERIC &&
+                (node.name.find("BE capture") != string::npos ||
+                 node.name.find("BE SOC capture") != string::npos)) {
+            isCsiBECapture = true;
+            break;
+        }
+    }
+
+    return isCsiBECapture;
+}
+
+bool PlatformData::isCSIFrontEndCapture(int cameraId)
+{
+    bool isCsiFeCapture = false;
+    MediaCtlConf *mc = getMediaCtlConf(cameraId);
+    CheckError(!mc, false, "getMediaCtlConf returns nullptr, cameraId:%d", cameraId);
+
+    for(const auto& node : mc->videoNodes) {
+        if (node.videoNodeType == VIDEO_GENERIC &&
+                (node.name.find("CSI-2") != string::npos ||
+                 node.name.find("TPG") != string::npos)) {
+            isCsiFeCapture = true;
+            break;
+        }
+    }
+    return isCsiFeCapture;
+}
+
+bool PlatformData::isTPGReceiver(int cameraId)
+{
+    bool isTPGCapture = false;
+    MediaCtlConf *mc = getMediaCtlConf(cameraId);
+    CheckError(!mc, false, "getMediaCtlConf returns nullptr, cameraId:%d", cameraId);
+
+    for(const auto& node : mc->videoNodes) {
+        if (node.videoNodeType == VIDEO_ISYS_RECEIVER &&
+                (node.name.find("TPG") != string::npos)) {
+            isTPGCapture = true;
+            break;
+        }
+    }
+    return isTPGCapture;
+}
+
+int PlatformData::getSupportAeExposureTimeRange(int cameraId, camera_scene_mode_t sceneMode,
+                                                camera_range_t& etRange)
+{
+    vector<camera_ae_exposure_time_range_t> ranges;
+    getInstance()->mStaticCfg.mCameras[cameraId].mCapability.getSupportedAeExposureTimeRange(ranges);
+
+    if (ranges.empty())
+        return NAME_NOT_FOUND;
+
+    for (auto& item : ranges) {
+        if (item.scene_mode == sceneMode) {
+            etRange = item.et_range;
+            return OK;
+        }
+    }
+    return NAME_NOT_FOUND;
+}
+
+int PlatformData::getSupportAeGainRange(int cameraId, camera_scene_mode_t sceneMode,
+                                        camera_range_t& gainRange)
+{
+    vector<camera_ae_gain_range_t> ranges;
+    getInstance()->mStaticCfg.mCameras[cameraId].mCapability.getSupportedAeGainRange(ranges);
+
+    if(ranges.empty()) {
+        return NAME_NOT_FOUND;
+    }
+
+    for (auto& item : ranges) {
+        if (item.scene_mode == sceneMode) {
+            gainRange = item.gain_range;
+            return OK;
+        }
+    }
+    return NAME_NOT_FOUND;
+}
+
+bool PlatformData::isUsingCrlModule(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mUseCrlModule;
+}
+
+vector<MultiExpRange> PlatformData::getMultiExpRanges(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mMultiExpRanges;
+}
+
+camera_resolution_t *PlatformData::getPslOutputForRotation(int width, int height, int cameraId)
+{
+    CheckError(getInstance()->mStaticCfg.mCameras[cameraId].mOutputMap.empty(), nullptr,
+          "@%s, cameraId: %d, there isn't pslOutputMapForRotation field in xml.", __func__, cameraId);
+
+    vector<UserToPslOutputMap> outputMap = getInstance()->mStaticCfg.mCameras[cameraId].mOutputMap;
+    for (auto & map : outputMap) {
+        if (width == map.User.width && height == map.User.height) {
+            LOG2("cameraId: %d, find the psl output resoltion(%d, %d) for %dx%d",
+                  cameraId, map.Psl.width, map.Psl.height, map.User.width, map.User.height);
+            return &map.Psl;
+        }
+    }
+
+    return nullptr;
+}
+
+bool PlatformData::isTestPatternSupported(int cameraId)
+{
+    return !getInstance()->mStaticCfg.mCameras[cameraId].mTestPatternMap.empty();
+}
+
+int32_t PlatformData::getSensorTestPattern(int cameraId, int32_t mode)
+{
+    CheckError(getInstance()->mStaticCfg.mCameras[cameraId].mTestPatternMap.empty(), -1,
+          "@%s, cameraId: %d, mTestPatternMap is empty!", __func__, cameraId);
+    auto testPatternMap = getInstance()->mStaticCfg.mCameras[cameraId].mTestPatternMap;
+
+    if (testPatternMap.find(mode) == testPatternMap.end()) {
+        LOGW("Test pattern %d wasn't found in configuration file, return -1", mode);
+        return -1;
+    }
+    return testPatternMap[mode];
+}
+
+int PlatformData::getMaxNvmDataSize(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mMaxNvmDataSize;
+}
+
+const char *PlatformData::getNvmDirectory(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mNvmDirectory.c_str();
+}
+
+void *PlatformData::getNvmData(int cameraId)
+{
+    CheckError(cameraId >= MAX_CAMERA_NUMBER, nullptr,
+               "@%s, wrong cameraId:%d", __func__, cameraId);
+
+    return getInstance()->mAiqInitDatas[cameraId]->getNvmData(cameraId);
+}
+
+camera_coordinate_system_t PlatformData::getActivePixelArray(int cameraId)
+{
+    camera_coordinate_system_t arraySize;
+    CLEAR(arraySize);
+
+    getInstance()->mStaticCfg.mCameras[cameraId].mCapability.getSensorActiveArraySize(arraySize);
+
+    return {arraySize.left, arraySize.top, arraySize.right, arraySize.bottom};
+}
+
+string PlatformData::getCameraCfgPath()
+{
+    char* p = getenv("CAMERA_CFG_PATH");
+
+    return p? string(p) : string(CAMERA_DEFAULT_CFG_PATH);
+}
+
+string PlatformData::getGraphDescFilePath()
+{
+    return PlatformData::getCameraCfgPath() + string(CAMERA_GRAPH_DESCRIPTOR_FILE);
+}
+
+string PlatformData::getGraphSettingFilePath()
+{
+    return PlatformData::getCameraCfgPath() + string(CAMERA_GRAPH_SETTINGS_DIR);
+}
+
+int PlatformData::getSensorDigitalGain(int cameraId, float realDigitalGain)
+{
+    int sensorDg = 0;
+    int maxSensorDg = PlatformData::getMaxSensorDigitalGain(cameraId);
+
+    if (PlatformData::sensorDigitalGainType(cameraId) == SENSOR_DG_TYPE_2_X) {
+        int index = 0;
+        while (pow(2, index) <= realDigitalGain) {
+            sensorDg = index;
+            index++;
+        }
+        sensorDg = CLIP(sensorDg, maxSensorDg, 0);
+    } else {
+        LOGE("%s, don't support the sensor digital gain type: %d",
+                __func__, PlatformData::sensorDigitalGainType(cameraId));
+    }
+
+    return sensorDg;
+}
+
+float PlatformData::getIspDigitalGain(int cameraId, float realDigitalGain)
+{
+    float ispDg = 1.0f;
+    int sensorDg = getSensorDigitalGain(cameraId, realDigitalGain);
+
+    if (PlatformData::sensorDigitalGainType(cameraId) == SENSOR_DG_TYPE_2_X) {
+        ispDg = realDigitalGain / pow(2, sensorDg);
+        ispDg = CLIP(ispDg, ispDg, 1.0);
+    } else {
+        LOGE("%s, don't support the sensor digital gain type: %d",
+                __func__, PlatformData::sensorDigitalGainType(cameraId));
+    }
+
+    return ispDg;
+}
+
+int PlatformData::getScalerInfo(int cameraId, int32_t streamId,
+                                float *scalerWidth, float *scalerHeight)
+{
+    if (getInstance()->mStaticCfg.mCameras[cameraId].mScalerInfo.empty()) {
+        *scalerWidth = 1.0;
+        *scalerHeight = 1.0;
+        return OK;
+    }
+
+    for (auto &scalerInfo : getInstance()->mStaticCfg.mCameras[cameraId].mScalerInfo) {
+        LOG2("%s, streamId %d, scalerWidth %f, scalerHeight %f", __func__, scalerInfo.streamId,
+             scalerInfo.scalerWidth, scalerInfo.scalerHeight);
+        if (scalerInfo.streamId == streamId) {
+            *scalerWidth = scalerInfo.scalerWidth;
+            *scalerHeight = scalerInfo.scalerHeight;
+            break;
+        }
+    }
+
+    return OK;
+}
+
+void  PlatformData::setScalerInfo(int cameraId, std::vector<IGraphType::ScalerInfo> scalerInfo)
+{
+    for (auto &scalerInfoInput : scalerInfo) {
+        bool flag = false;
+        for (auto &scalerInfoTmp : getInstance()->mStaticCfg.mCameras[cameraId].mScalerInfo) {
+            if (scalerInfoInput.streamId == scalerInfoTmp.streamId) {
+                scalerInfoTmp.scalerWidth = scalerInfoInput.scalerWidth;
+                scalerInfoTmp.scalerHeight = scalerInfoInput.scalerHeight;
+                flag = true;
+                break;
+            }
+        }
+        if (!flag) {
+            getInstance()->mStaticCfg.mCameras[cameraId].mScalerInfo.push_back(scalerInfoInput);
+        }
+    }
+}
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/platformdata/PlatformData.h b/camera/hal/intel/ipu6/src/platformdata/PlatformData.h
new file mode 100644
index 000000000000..16aff41031a4
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/PlatformData.h
@@ -0,0 +1,1094 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <limits.h>
+#include <v4l2_device.h>
+
+#include <vector>
+#include <string>
+#include <map>
+#include <unordered_map>
+
+#include "ICamera.h"
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+#include "CameraTypes.h"
+#include "Parameters.h"
+#include "AiqInitData.h"
+#include "MediaControl.h"
+#include "IGraphConfig.h"
+
+#ifdef ENABLE_SANDBOXING
+#include "modules/sandboxing/client/IntelAlgoClient.h"
+#endif
+
+namespace icamera {
+
+#define RESOLUTION_1_3MP_WIDTH  1280
+#define RESOLUTION_1_3MP_HEIGHT 960
+#define RESOLUTION_1080P_WIDTH  1920
+#define RESOLUTION_1080P_HEIGHT 1080
+#define RESOLUTION_720P_WIDTH   1280
+#define RESOLUTION_720P_HEIGHT  720
+#define RESOLUTION_VGA_WIDTH    640
+#define RESOLUTION_VGA_HEIGHT   480
+
+#define MAX_BUFFER_COUNT (10)
+#define MAX_STREAM_NUMBER   5
+#define MAX_WEIGHT_GRID_SIDE_LEN 1024
+
+#define FACE_ENGINE_DEFAULT_RUNNING_INTERVAL 1
+
+#define MAX_SETTING_COUNT 32
+#define CAMERA_PORT_NAME "CSI-2"
+
+#ifdef CAL_BUILD
+#define MAX_CAMERA_NUMBER 2
+#define CAMERA_CACHE_DIR "/var/cache/camera/"
+#define CAMERA_DEFAULT_CFG_PATH "/etc/camera/"
+#define CAMERA_GRAPH_DESCRIPTOR_FILE "gcss/graph_descriptor.xml"
+#define CAMERA_GRAPH_SETTINGS_DIR "gcss/"
+#elif __ANDROID__
+#define MAX_CAMERA_NUMBER 2
+#define CAMERA_CACHE_DIR "./"
+#define CAMERA_DEFAULT_CFG_PATH "/vendor/etc/"
+#define CAMERA_GRAPH_DESCRIPTOR_FILE "graph_descriptor.xml"
+#define CAMERA_GRAPH_SETTINGS_DIR ""
+#else
+#define MAX_CAMERA_NUMBER   100
+// Temporarily using current path to save aiqd file for none CAL platforms.
+#define CAMERA_CACHE_DIR "./"
+#define CAMERA_DEFAULT_CFG_PATH "/usr/share/defaults/etc/camera/"
+#define CAMERA_GRAPH_DESCRIPTOR_FILE "gcss/graph_descriptor.xml"
+#define CAMERA_GRAPH_SETTINGS_DIR "gcss/"
+#endif
+
+class GraphConfigNodes;
+class PlatformData {
+private:
+    //Prevent to create multiple instances
+    PlatformData();
+    ~PlatformData();
+
+public:
+    class StaticCfg {
+    public:
+        StaticCfg() {
+            mCameras.clear();
+        };
+        ~StaticCfg() {}; // not release resource by design
+
+        /**
+         * Camera feature info that is specific to camera id
+         */
+        class CameraInfo {
+        public:
+            CameraInfo() :
+                sensorName(""),
+                sensorDescription("unset"),
+                mLensName(""),
+                mLensHwType(LENS_NONE_HW),
+                mAutoSwitchType(AUTO_SWITCH_PSYS),
+                mLtmEnabled(false),
+                mSensorExposureNum(2),
+                mSensorExposureType(SENSOR_EXPOSURE_SINGLE),
+                mSensorGainType(SENSOR_GAIN_NONE),
+                mLensCloseCode(0),
+                mEnableAIQ(false),
+                mSkipFrameV4L2Error(false),
+                mCITMaxMargin(0),
+                mYuvColorRangeMode(CAMERA_FULL_MODE_YUV_COLOR_RANGE),
+                mInitialSkipFrame(0),
+                mMaxRawDataNum(MAX_BUFFER_COUNT),
+                mTopBottomReverse(false),
+                mPsysContinueStats(false),
+                mMaxRequestsInflight(0),
+                mPreferredBufQSize(MAX_BUFFER_COUNT),
+                mPipeSwitchDelayFrame(0),
+                mExposureLag(MAX_BUFFER_COUNT),
+                mGainLag(0),
+                mLtmGainLag(0),
+                mEnableLtmThread(false),
+                mEnableLtmDefog(false),
+                mMaxSensorDigitalGain(0),
+                mSensorDgType(SENSOR_DG_TYPE_NONE),
+                mISysFourcc(V4L2_PIX_FMT_SGRBG8),
+                mISysRawFormat(V4L2_PIX_FMT_SGRBG10),
+                mUseCrlModule(true),
+                mFacing(FACING_BACK),
+                mOrientation(ORIENTATION_0),
+                mUseSensorDigitalGain(false),
+                mUseIspDigitalGain(false),
+                mNeedPreRegisterBuffers(false),
+                mFrameSyncCheckEnabled(false),
+                mEnableAiqd(false),
+                mCurrentMcConf(nullptr),
+                mGraphSettingsType(COUPLED),
+                mDVSType(MORPH_TABLE),
+                mISYSCompression(false),
+                mPSACompression(false),
+                mOFSCompression(false),
+                mFaceAeEnabled(false),
+                mFaceEngineRunningInterval(FACE_ENGINE_DEFAULT_RUNNING_INTERVAL),
+                mFaceEngineRunningIntervalNoFace(FACE_ENGINE_DEFAULT_RUNNING_INTERVAL),
+                mFaceEngineRunningSync(false),
+                mPsysAlignWithSof(false),
+                mSwProcessingAlignWithIsp(false),
+                mMaxNvmDataSize(0)
+            {
+            }
+
+            std::vector <MediaCtlConf> mMediaCtlConfs;
+
+            std::string sensorName;
+            std::string sensorDescription;
+            std::string mLensName;
+            int mLensHwType;
+            int mAutoSwitchType;
+            bool mLtmEnabled;
+            int mSensorExposureNum;
+            int mSensorExposureType;
+            int mSensorGainType;
+            int mLensCloseCode;
+            bool mEnableAIQ;
+            bool mSkipFrameV4L2Error;
+            int mCITMaxMargin;
+            camera_yuv_color_range_mode_t mYuvColorRangeMode;
+            unsigned int mInitialSkipFrame;
+            unsigned int mMaxRawDataNum;
+            bool mTopBottomReverse;
+            bool mPsysContinueStats;
+            int mMaxRequestsInflight;
+            unsigned int mPreferredBufQSize;
+            unsigned int mPipeSwitchDelayFrame;
+            int mExposureLag;
+            int mGainLag;
+            int mLtmGainLag;
+            bool mEnableLtmThread;
+            bool mEnableLtmDefog;
+            int mMaxSensorDigitalGain;
+            SensorDgType mSensorDgType;
+            std::string mCustomAicLibraryName;
+            std::string mCustom3ALibraryName;
+            std::vector <camera_resolution_t> mSupportedISysSizes; // ascending order request
+            std::vector <int> mSupportedISysFormat;
+            int mISysFourcc; // the isys output format
+            int mISysRawFormat; // the isys raw format if scale enabled
+
+            std::vector <int> mPSysFormat; // the psys output format
+            std::vector <TuningConfig> mSupportedTuningConfig;
+            std::vector <LardTagConfig> mLardTagsConfig;
+            std::vector <ConfigMode> mConfigModesForAuto;
+
+            bool mUseCrlModule;
+            int mFacing;
+            int mOrientation;
+            bool mUseSensorDigitalGain;
+            bool mUseIspDigitalGain;
+            bool mNeedPreRegisterBuffers;
+            bool mFrameSyncCheckEnabled;
+            bool mEnableAiqd;
+            MediaCtlConf *mCurrentMcConf;
+            std::map<int, supported_stream_config_array_t> mStreamToMcMap;
+            Parameters mCapability;
+
+            std::string mGraphSettingsFile;
+            GraphSettingType mGraphSettingsType;
+            std::vector <MultiExpRange> mMultiExpRanges;
+            std::vector <uint32_t> mSupportedIspControlFeatures;
+            int mDVSType;
+            bool mISYSCompression;
+            bool mPSACompression;
+            bool mOFSCompression;
+            bool mFaceAeEnabled;
+            int mFaceEngineRunningInterval;
+            int mFaceEngineRunningIntervalNoFace;
+            int mFaceEngineRunningSync;
+            bool mPsysAlignWithSof;
+            bool mSwProcessingAlignWithIsp;
+
+            /* key: camera_test_pattern_mode_t, value: sensor test pattern mode */
+            std::unordered_map<int32_t, int32_t> mTestPatternMap;
+
+            // This is for binding stream id to ConfigMode, since the stream id from kernel list of
+            // a PG might be incorrect. To be removed after stream id mismatch issue fixed.
+            std::map<int, int> mConfigModeToStreamId;
+            std::vector<UserToPslOutputMap> mOutputMap;
+            int mMaxNvmDataSize;
+            std::string mNvmDirectory;
+            std::vector<IGraphType::ScalerInfo> mScalerInfo;
+        };
+
+        std::vector<CameraInfo> mCameras;
+        std::vector<PolicyConfig> mPolicyConfig;
+        CommonConfig mCommonConfig;
+    };
+private:
+    StaticCfg mStaticCfg;
+
+    AiqInitData* mAiqInitDatas[MAX_CAMERA_NUMBER];
+private:
+    /**
+     * Get access to the platform singleton.
+     *
+     * Note: this is implemented in PlatformFactory.cpp
+     */
+    static PlatformData* sInstance;
+    static Mutex sLock;
+    static PlatformData* getInstance();
+
+#ifdef ENABLE_SANDBOXING
+    static IntelAlgoClient* mIntelAlgoClient;
+#endif
+
+    /**
+     * Release GraphConfigNodes in StaticCfg::CameraInfo
+     */
+    void releaseGraphConfigNodes();
+
+    /**
+     * Get MediaCtlConf via MC ID.
+     */
+    static MediaCtlConf* getMcConfByMcId(const StaticCfg::CameraInfo& cameraInfo, int mcId);
+
+    /**
+     * Get MediaCtlConf via stream config.
+     */
+    static MediaCtlConf* getMcConfByStream(const StaticCfg::CameraInfo& cameraInfo,
+                                           const stream_t& stream);
+
+    /**
+     * Get MediaCtlConf via ConfigMode.
+     */
+    static MediaCtlConf* getMcConfByConfigMode(const StaticCfg::CameraInfo& cameraInfo,
+                                               const stream_t& stream, ConfigMode mode);
+
+    /**
+     * Check if video node is enabled via camera Id and video node type.
+     */
+    static bool isVideoNodeEnabled(int cameraId, VideoNodeType type);
+
+public:
+#ifdef ENABLE_SANDBOXING
+    /**
+     * Get the Intel Algo Client.
+     */
+    static IntelAlgoClient* getIntelAlgoClient() { return mIntelAlgoClient; }
+#endif
+
+     /**
+      * releaseInstance
+      * This function must be called when the hal is destroyed.
+      */
+    static void releaseInstance();
+
+    /**
+     * get the camera numbers
+     *
+     * \return int: the camera numbers
+     */
+    static int numberOfCameras();
+
+    /**
+     * get the sensor name
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return char*: the sensor name string.
+     */
+    static const char* getSensorName(int cameraId);
+
+    /**
+     * get the sensor description
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return const char*: the sensor descrition string.
+     */
+    static const char* getSensorDescription(int cameraId);
+
+    /**
+     * get the Lens name
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return char*: the lens name string.
+     */
+    static const char* getLensName(int cameraId);
+
+    /**
+     * get the Lens HW type
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return int: the Lens HW type
+     */
+    static int getLensHwType(int cameraId);
+
+    /**
+     * get the DVS type
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return int: the DVS type
+     */
+    static int getDVSType(int cameraId);
+
+    /**
+     * get the ISYS compression flag
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return if ISYS compression is enabled
+     */
+    static bool getISYSCompression(int cameraId);
+
+    /**
+     * get the PSA compression flag
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return if PSA compression is enabled
+     */
+    static bool getPSACompression(int cameraId);
+
+    /**
+     * get the OFS compression flag
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return if OFS compression is enabled
+     */
+    static bool getOFSCompression(int cameraId);
+
+    /**
+     * get the max coarse integration time margin
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return int: the value of max coarse integration time margin.
+     */
+    static int getCITMaxMargin(int cameraId);
+
+    /**
+     * Check AIQ is enabled or not
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return if AIQ is enabled or not.
+     */
+    static bool isEnableAIQ(int cameraId);
+
+    /**
+     * Check if sensor digital gain is used or not
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return if sensor gain is used or not.
+     */
+    static bool isUsingSensorDigitalGain(int cameraId);
+
+    /**
+     * Check if using isp digital gain or not
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return if using isp gain or not.
+     */
+    static bool isUsingIspDigitalGain(int cameraId);
+
+    /**
+     * Check if need to pre-register buffers or not
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return if pre-register buffers or not.
+     */
+    static bool isNeedToPreRegisterBuffer(int cameraId);
+
+    /**
+     * Get auto switch type
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the value of auto switch type
+     */
+    static int getAutoSwitchType(int cameraId);
+
+    /**
+     * Check Defog(LTM) is enabled or not
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return if Defog is enabled or not.
+     */
+    static bool isEnableDefog(int cameraId);
+
+    /**
+     * Check Frame Sync is enabled or not
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return if Frame Sync is enabled or not.
+     */
+    static bool isEnableFrameSyncCheck(int cameraId);
+
+    /**
+     * Get exposure number
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param multiExposure: true or false
+     * \return the value of exposure number according to different cases
+     */
+    static int getExposureNum(int cameraId, bool multiExposure);
+
+    /**
+     * Check LTM is enabled or not
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return if LTM is enabled or not.
+     */
+    static bool isLtmEnabled(int cameraId);
+
+    /**
+     * Get sensor exposure type
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the value of sensor exposure type
+     */
+    static int getSensorExposureType(int cameraId);
+
+    /**
+     * Get sensor gain type
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the value of sensor gain type
+     */
+    static int getSensorGainType(int cameraId);
+
+    /**
+     * Get sensor's initial skip frame number
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the value of initial skip frame number
+     */
+    static unsigned int getInitialSkipFrame(int cameraId);
+
+    /**
+     * Get max raw data number
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the value of max raw data number
+     */
+    static unsigned int getMaxRawDataNum(int cameraId);
+
+     /**
+     * Get sensor's top bottom filed reverse option
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the value of top bottom filed reverse value
+     */
+    static bool getTopBottomReverse(int cameraId);
+
+    /*
+     * Check if Psys continuous stats is needed or not.
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return if it is needed
+     */
+    static bool isPsysContinueStats(int cameraId);
+
+    /**
+     * Get preferred buffer queue size
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the value of preferred buffer queue size
+     */
+    static unsigned int getPreferredBufQSize(int cameraId);
+
+    /**
+     * Get pipe switch delay frame
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the value of delay frame
+     */
+    static unsigned int getPipeSwitchDelayFrame(int cameraId);
+
+    /**
+     * Get Ltm Gain lag
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the value of LTM gain lag
+     */
+    static int getLtmGainLag(int cameraId);
+
+    /**
+     * Check ltm thread is enabled or not
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return if ltm thread is enabled or not.
+     */
+    static bool isEnableLtmThread(int cameraId);
+
+    /**
+     * Check face detection is enabled or not
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return if face detection is enabled or not.
+     */
+    static bool isFaceAeEnabled(int cameraId);
+
+    /**
+     * get face engine's running interval
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the face engine running interval value.
+     */
+    static int faceEngineRunningInterval(int cameraId);
+
+    /**
+     * get face engine's running interval when face is not found
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the face engine running interval value when face is not found.
+     */
+    static int faceEngineRunningIntervalNoFace(int cameraId);
+
+    /**
+     * Check face detection runs  synchronously or not
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return if face detection runs synchronously or not.
+     */
+    static bool isFaceEngineSyncRunning(int cameraId);
+
+    /**
+     * get dvs supported status
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return true: dvs supported; false: dvs not supported.
+     */
+    static bool isDvsSupported(int cameraId);
+
+    /**
+     * Check psys align with sof is enabled or not
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return if psys align with sof is enabled or not.
+     */
+    static bool psysAlignWithSof(int cameraId);
+
+    /**
+     * Check software processing align with isp is enabled or not
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return if software processing align with isp is enabled or not.
+     */
+    static bool swProcessingAlignWithIsp(int cameraId);
+
+    /**
+     * Get the max digital gain of sensor
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the value of max digital gain
+     */
+    static int getMaxSensorDigitalGain(int cameraId);
+
+    /**
+     * Get sensor digital gain type
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the sensor digital gain type
+     */
+    static SensorDgType sensorDigitalGainType(int cameraId);
+
+    /**
+     * Get sensor's exposure lag
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the value of exposure lag
+     */
+    static int getExposureLag(int cameraId);
+
+    /**
+     * Get sensor's gain lag
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the value of gain lag
+     */
+    static int getGainLag(int cameraId);
+
+    /**
+     * Get the executor policy config.
+     *
+     * \param[in] graphId: the graph id
+     *
+     * \return PolicyConfig* object if found, otherwise return nullptr.
+     */
+    static PolicyConfig* getExecutorPolicyConfig(int graphId);
+
+    /**
+     * According to stream info to select MC
+     * this function will compare the format/resolutions/interlace to find the MediaCtlConf
+     * and then store it into cameraInfo.
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param stream: the stream info
+     * \param mode: the stream operation mode
+     */
+    static void selectMcConf(int cameraId, stream_t stream, ConfigMode mode, int mcId);
+
+    /**
+     * to get the current MediaCtlConf
+     * after the media controller has been analyzed, the media controller information will be stored in the mMediaCtlConfs.
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return MediaCtlConf*, if it doens't find one, this function will return nullptr.
+     */
+    static MediaCtlConf *getMediaCtlConf(int cameraId);
+
+    /**
+     * \brief Fill camera info and capability according to given camera id
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param[out] camera_info_t info
+     *
+     * \return 0 if succeed, other value indicates failed.
+     */
+    static int getCameraInfo(int cameraId, camera_info_t& info);
+
+    /**
+     * \brief Check if the camera_features feature is supported
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param[in] camera_features feature
+     *
+     * \return true if supported, otherwise return false.
+     */
+    static bool isFeatureSupported(int cameraId, camera_features feature);
+
+    /**
+     * \brief Check if the given stream config is supported
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param[in] stream_t conf
+     *
+     * \return true if supported, otherwise return false.
+     */
+    static bool isSupportedStream(int cameraId, const stream_t& conf);
+
+    /**
+     * get the isys supported size list
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param sizes: the function will fill the isys supported size list to the sizes
+     */
+    static void getSupportedISysSizes(int cameraId, std::vector <camera_resolution_t>& resolutions);
+
+    /**
+     * get the isys supported format list
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param formats: the function will fill the isys supported format list to the formats
+     * \return true if success, return false if it fails.
+     */
+    static bool getSupportedISysFormats(int cameraId, std::vector <int>& formats);
+
+    /**
+     * Format for the ISYS output
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the format for the isys output
+     */
+    static int getISysFormat(int cameraId);
+
+    /**
+     * Set ISYS output format
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param format: the isys output format
+     */
+    static void selectISysFormat(int cameraId, int format);
+
+    /**
+     * If ISYS supported format.
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     */
+    static bool isISysSupportedFormat(int cameraId, int format);
+
+    /**
+     * if the resolution is supported by Isys
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param resolution: the requested resolution
+     * \return true if the resolution is supported by isys, otherwise false
+     */
+    static bool isISysSupportedResolution(int cameraId, camera_resolution_t resolution);
+
+    /**
+     * Check if the frame needs to be skipped when STR2MMIO error occurs
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return if corrupted frame needs to be skipped or not.
+     */
+    static bool isSkipFrameOnSTR2MMIOErr(int cameraId);
+
+    /**
+     * Format for the ISYS RAW output
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the RAW format if isys scale enabled
+     */
+    static int getISysRawFormat(int cameraId);
+
+    /**
+     * Get the config of the ISYS output per port
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the config of the ISYS output for the given port.
+     */
+    static stream_t getISysOutputByPort(int cameraId, Port port);
+
+    /**
+     * get the format by device name
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param devName: device name
+     * \format: return param for format
+     * \return the status
+     */
+    static int getFormatByDevName(int cameraId, const std::string& devName, McFormat& format);
+
+    /**
+     * get the video node name
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param videoNodeType: value of enum VideoNodeType
+     * \param videoNodeName: return param for the video node name
+     * \return the status
+     */
+    static int getVideoNodeNameByType(int cameraId, VideoNodeType videoNodeType,
+                                      std::string& videoNodeName);
+
+    /**
+     * get the hardware device name
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param videoNodeType: value of enum VideoNodeType
+     * \param devName: return param for the device name
+     * \return the status
+     */
+    static int getDevNameByType(int cameraId, VideoNodeType videoNodeType, std::string& devName);
+
+    /**
+     * Check if ISYS is enabled or not
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return true if ISYS is enabled, otherwise return false
+     */
+    static bool isIsysEnabled(int cameraId);
+
+    static int calculateFrameParams(int cameraId, SensorFrameParams& sensorFrameParams);
+
+    /**
+     * Get the optmized resolutions that supported by input system
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param width:    The width of the request frame
+     * \param height:   The height of the request frame
+     * \param field:    The field of the request frame
+     *
+     * \return camera_resolution_t: The optimized resolution that used to configure the ISYS.
+     */
+    static camera_resolution_t getISysBestResolution(int cameraId, int width, int height, int field);
+
+    /**
+     * to get if it support the format
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param format:the format will be checked if the psys supports.
+     * \return true or false for the psys could be used or not.
+     */
+    static bool usePsys(int cameraId, int format);
+
+    /**
+     * to get supported psys dag config
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param configs: the function will fill supported psys dag config list to the configs
+     */
+    static void getSupportedTuningConfig(int cameraId, std::vector <TuningConfig> &configs);
+
+    /**
+     * to get the ConfigMode by operation Mode
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param operationMode: the operation mode
+     * \param configModes: the function will fill available ConfigMode for this operation mode
+     * \return OK if get ConfigMode, otherwise return INVALID_OPERATION
+     */
+    static int getConfigModesByOperationMode(int cameraId, uint32_t operationMode,
+                                             std::vector <ConfigMode> &configModes);
+
+    /**
+     * to get the TuningMode by Config Mode
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param configMode: type of ConfigMode (except auto)
+     * \param tuningMode: return related TuningMode
+     * \return OK if get TuningMode, otherwise return INVALID_OPERATION
+     */
+    static int getTuningModeByConfigMode(int cameraId, ConfigMode configMode, TuningMode& tuningMode);
+
+    /**
+     * to get tuning config by ConfigMode
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param mode: ConfigMode
+     * \param config: return related TuningConfig
+     * \return OK if get TuningConfig, otherwise return INVALID_OPERATION
+     */
+    static int getTuningConfigByConfigMode(int cameraId, ConfigMode mode, TuningConfig &config);
+
+    /**
+     * to get lard tags config by TuningMode
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param mode: TuningMode
+     * \param config: return related LardTagConfig
+     * \return OK if get TuningConfig, otherwise return NAME_NOT_FOUND
+     */
+    static int getLardTagsByTuningMode(int cameraId, TuningMode mode, LardTagConfig &lardTags);
+
+    /*
+     * Get stream id by the given configMode
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param configMode: ConfigMode
+     * \return the stream id if succeeds, otherwise return -1.
+     */
+    static int getStreamIdByConfigMode(int cameraId, ConfigMode configMode);
+
+    /*
+     * Get the max requests number in flight
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the max requests number in flight
+     */
+    static int getMaxRequestsInflight(int cameraId);
+
+    /**
+     * get yuv color range mode
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the correponding camera_yuv_color_range_mode_t.
+     */
+    static camera_yuv_color_range_mode_t getYuvColorRangeMode(int cameraId);
+
+    /**
+     * Get AiqdData object
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param tuningMode: TuningMode
+     * \return AiqdData object
+     */
+    static AiqdData* getAiqdData(int cameraId, TuningMode tuningMode);
+
+    /**
+     * Create CpfStore object, initialize mAiqInitDatas[cameraId]
+     * and return CpfStore object.
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return CpfStore object if tuning file is available; otherwise return nullptr.
+     */
+    static CpfStore* getCpfStore(int cameraId);
+
+    /**
+     * If dynamic graph config enabled
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return true if use graphConfig file.
+     */
+    static bool getGraphConfigNodes(int cameraId);
+
+    /**
+     * to get the type of graph settings
+     *
+     * \param cameraId: 0 ~ (MAX_CAMERA_NUMBER - 1)
+     * \return the graph settings type: COUPLED or DISPERSED.
+     */
+    static GraphSettingType getGraphSettingsType(int cameraId);
+
+    /**
+     * if ISYS CSI Back End capture enabled
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return true if the current sensor is CSI Back End capture or not
+     */
+    static bool isCSIBackEndCapture(int cameraId);
+
+    /**
+     * if ISYS CSI Front End capture enabled
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return true if the current sensor is CSI Front End capture or not
+     */
+    static bool isCSIFrontEndCapture(int cameraId);
+
+    /**
+     * if AIQD enabled
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return true if AIQD is enabled or not
+     */
+    static bool isAiqdEnabled(int cameraId);
+
+    /**
+     * if image from tpg
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return true if frame is from tpg or not
+     */
+    static bool isTPGReceiver(int cameraId);
+
+    static int getSupportAeExposureTimeRange(int cameraId, camera_scene_mode_t sceneMode,
+                                             camera_range_t& etRange);
+    static int getSupportAeGainRange(int cameraId, camera_scene_mode_t sceneMode,
+                                     camera_range_t& gainRange);
+
+    /**
+     * if CrlModule is used
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return true if CrlModule driver is used, otherwise return false
+     */
+    static bool isUsingCrlModule(int cameraId);
+
+    /**
+     * to get the MultiExpRange of CameraInfo
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the MultiExpRange for current camera id.
+     */
+    static std::vector<MultiExpRange> getMultiExpRanges(int cameraId);
+
+    /**
+     * Get the psl output resolution
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param width:    The width of user requirement
+     * \param height:   The height of user requirement
+     * \return the psl output resolution if provides it in xml file, otherwise return nullptr.
+     */
+    static camera_resolution_t *getPslOutputForRotation(int width, int height, int cameraId);
+
+    /**
+     * Check if test pattern is supported or not
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return true if mTestPatternMap is defined, otherwise return false.
+     */
+    static bool isTestPatternSupported(int cameraId);
+
+    /**
+     * get sensor test pattern
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param mode: camera_test_pattern_mode_t
+     * \return corresponding sensor test pattern if provided in xml file, otherwise return -1.
+     */
+    static int32_t getSensorTestPattern(int cameraId, int32_t mode);
+
+    /**
+     * Get the max nvm data size
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the value of max nvm data size
+     */
+    static int getMaxNvmDataSize(int cameraId);
+
+    /**
+     * Get the nvm data direcotry
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the string of nvm data direcotry
+     */
+    static const char *getNvmDirectory(int cameraId);
+
+    /**
+     * Get the nvm data
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \return the nvm data pointer
+     */
+    static void *getNvmData(int cameraId);
+
+    /**
+    * Get sensor active array size
+    *
+    * \param cameraId: [0, MAX_CAMERA_NUMBER)
+    * \return the value of camera_coordinate_system_t.
+    */
+    static camera_coordinate_system_t getActivePixelArray(int cameraId);
+
+    /**
+    * Get camera cfg path from environment variable
+    *
+    * \param void
+    * \return the value of camera cfg path.
+    */
+    static std::string getCameraCfgPath();
+
+    /**
+    * Get camera graph descriptor file path
+    *
+    * \param void
+    * \return the value of camera graph descriptor file path.
+    */
+    static std::string getGraphDescFilePath();
+
+    /**
+    * Get camera graph setting file path.
+    *
+    * \param void
+    * \return the value of camera graph setting file path.
+    */
+    static std::string getGraphSettingFilePath();
+
+    /*
+     * Get sensor value for the digital gain.
+     *
+     * Since the calculation formula may be different between sensors,
+     * so we need to get this value based on sensor digital gain type.
+     * For imx274, the magnification = 2^x (x is the register value).
+     *
+     * Need to specify the sensorDgType, maxSensorDg and useIspDigitalGain in xml.
+     */
+    static int getSensorDigitalGain(int cameraId, float realDigitalGain);
+
+    /*
+     * Get the isp gain
+     *
+     * Separate real digital to sensorDg and ispDg, and the ispDg >= 1
+     */
+    static float getIspDigitalGain(int cameraId, float realDigitalGain);
+
+    /*
+     * Get the scaler info
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param streamId: hal stream id
+     * \param sclscalerWidth and scalerHeight : return related scaler info
+     * \return OK.
+     */
+    static int getScalerInfo(int cameraId, int32_t streamId,
+                             float *scalerWidth, float *scalerHeight);
+
+    /*
+     * Set the scaler info
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
+     * \param scalerInfo related IGraphType::ScalerInfo
+     */
+    static void setScalerInfo(int cameraId, std::vector<IGraphType::ScalerInfo> scalerInfo);
+};
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/platformdata/PolicyParser.cpp b/camera/hal/intel/ipu6/src/platformdata/PolicyParser.cpp
new file mode 100644
index 000000000000..f799f21a8ec8
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/PolicyParser.cpp
@@ -0,0 +1,226 @@
+/*
+ * Copyright (C) 2017-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define LOG_TAG "PolicyParser"
+
+#include <string.h>
+#include <expat.h>
+
+#include "iutils/CameraLog.h"
+
+#include "PolicyParser.h"
+
+namespace icamera {
+#define PSYS_POLICY_FILE_NAME "psys_policy_profiles.xml"
+PolicyParser::PolicyParser(PlatformData::StaticCfg *cfg) :
+    mStaticCfg(cfg),
+    mCurrentDataField(FIELD_INVALID),
+    pCurrentConf(nullptr) {
+    LOGXML("@%s", __func__);
+    CheckError(!mStaticCfg, VOID_VALUE, "@%s, cfg parameter is wrong", __func__);
+    mStaticCfg->mPolicyConfig.clear();
+
+    int ret = getDataFromXmlFile(PSYS_POLICY_FILE_NAME);
+    CheckError(ret != OK, VOID_VALUE,
+               "Failed to get policy profiles data frome %s", PSYS_POLICY_FILE_NAME);
+}
+
+/**
+ * This function will check which field that the parser parses to.
+ *
+ * The field is set to 2 types.
+ * FIELD_INVALID FIELD_GRAPH
+ *
+ * \param profiles: the pointer of the PolicyParser.
+ * \param name: the element's name.
+ * \param atts: the element's attribute.
+ */
+void PolicyParser::checkField(PolicyParser *profiles, const char *name, const char **atts)
+{
+    LOGXML("@%s, name:%s", __func__, name);
+    if (strcmp(name, "PsysPolicyConfig") == 0) {
+        profiles->mCurrentDataField = FIELD_INVALID;
+        return;
+    } else if (strcmp(name, "graph") == 0) {
+        profiles->pCurrentConf = new PolicyConfig;
+
+        int idx = 0;
+        while (atts[idx]) {
+            const char* key = atts[idx];
+            const char* val = atts[idx + 1];
+            LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
+            if (strcmp(key, "id") == 0) {
+                profiles->pCurrentConf->graphId = atoi(val);
+            } else if (strcmp(key, "description") == 0) {
+                profiles->pCurrentConf->policyDescription = val;
+            }
+            idx += 2;
+        }
+        profiles->mCurrentDataField = FIELD_GRAPH;
+        return;
+    }
+
+    LOGE("@%s, name:%s, atts[0]:%s, xml format wrong", __func__, name, atts[0]);
+    return;
+}
+
+void PolicyParser::handlePipeExecutor(PolicyParser *profiles, const char *name, const char **atts)
+{
+    int idx = 0;
+    ExecutorPolicy policy;
+
+    while (atts[idx]) {
+        const char *key = atts[idx];
+        LOGXML("%s: name: %s, value: %s", __func__, atts[idx], atts[idx + 1]);
+        if (strcmp(key, "name") == 0) {
+            policy.exeName = atts[idx + 1];
+        } else if (strcmp(key, "pgs") == 0) {
+            parseXmlConvertStrings(atts[idx + 1], policy.pgList, convertCharToString);
+        } else if (strcmp(key, "op_modes") == 0) {
+            parseXmlConvertStrings(atts[idx + 1], policy.opModeList, atoi);
+        } else if (strcmp(key, "notify_policy") == 0) {
+            int notifyPolicy = std::stoi(atts[idx + 1]);
+            if (notifyPolicy >= 0 && notifyPolicy < POLICY_INVALID) {
+                policy.notifyPolicy = (ExecutorNotifyPolicy)notifyPolicy;
+            } else {
+                LOGW("Invalid notify policy value: %d", notifyPolicy);
+            }
+        } else if (strcmp(key, "cyclic_feedback_routine") == 0) {
+            parseXmlConvertStrings(atts[idx + 1], policy.cyclicFeedbackRoutineList, atoi);
+        } else if (strcmp(key, "cyclic_feedback_delay") == 0) {
+            parseXmlConvertStrings(atts[idx + 1], policy.cyclicFeedbackDelayList, atoi);
+        } else {
+            LOGW("Invalid policy attribute: %s", key);
+        }
+        idx += 2;
+    }
+
+    LOGXML("@%s, name:%s, atts[0]:%s", __func__, name, atts[0]);
+    profiles->pCurrentConf->pipeExecutorVec.push_back(policy);
+}
+
+void PolicyParser::handleExclusivePGs(PolicyParser *profiles, const char *name, const char **atts)
+{
+    int idx = 0;
+    LOGXML("%s: name: %s, value: %s", __func__, atts[idx], atts[idx + 1]);
+    const char *key = atts[idx];
+    if (strcmp(key, "pgs") == 0) {
+        parseXmlConvertStrings(atts[idx + 1], profiles->pCurrentConf->exclusivePgs, convertCharToString);
+    } else {
+        LOGE("Invalid policy attribute %s in exclusive label.", key);
+    }
+}
+
+void PolicyParser::handleBundles(PolicyParser *profiles, const char *name, const char **atts)
+{
+    int idx = 0;
+    LOGXML("%s: name: %s, value: %s", __func__, atts[idx], atts[idx + 1]);
+    const char *key = atts[idx];
+
+    CheckError(strcmp(key, "executors") != 0, VOID_VALUE, "Invalid policy attribute %s in bundle label.", key);
+
+    // The structure of a bundle looks like: "proc:0,post:1" which uses ',' to split
+    // different executors' names, and uses ':' to specify the executor's depth.
+    std::vector<std::string> bundledExecutors;
+    std::vector<int> depths;
+    std::vector<std::string> executors = CameraUtils::splitString(atts[idx + 1], ',');
+
+    for (const auto & item : executors) {
+        std::vector<std::string> executorDepth = CameraUtils::splitString(item.c_str(), ':');
+        CheckError(executorDepth.size() != 2, VOID_VALUE, "Invalid executor-depth mapping.");
+
+        bundledExecutors.push_back(executorDepth[0]);
+        depths.push_back(std::stoi(executorDepth[1]));
+    }
+
+    ExecutorDepth executorDepth = {bundledExecutors, depths};
+    profiles->pCurrentConf->bundledExecutorDepths.push_back(executorDepth);
+}
+
+/**
+ * This function will handle all the sensor related elements.
+ *
+ * It will be called in the function startElement
+ *
+ * \param profiles: the pointer of the CameraParser.
+ * \param name: the element's name.
+ * \param atts: the element's attribute.
+ */
+void PolicyParser::handlePolicyConfig(PolicyParser *profiles, const char *name, const char **atts)
+{
+    LOGXML("@%s, name:%s, atts[0]:%s", __func__, name, atts[0]);
+    if (strcmp(name, "pipe_executor") == 0) {
+        handlePipeExecutor(profiles, name, atts);
+    } else if (strcmp(name, "exclusive") == 0) {
+        handleExclusivePGs(profiles, name, atts);
+    } else if (strcmp(name, "bundle") == 0) {
+        handleBundles(profiles, name, atts);
+    } else if (strcmp(name, "enableBundleInSdv") == 0) {
+        profiles->pCurrentConf->enableBundleInSdv = (strcmp(atts[1], "true") == 0) ? true : false;
+        LOGXML("%s: enableBundleInSdv: %s", __func__, atts[1]);
+    }
+}
+
+/**
+ * the callback function of the libexpat for handling of one element start
+ *
+ * When it comes to the start of one element. This function will be called.
+ *
+ * \param userData: the pointer we set by the function XML_SetUserData.
+ * \param name: the element's name.
+ */
+void PolicyParser::startParseElement(void *userData, const char *name, const char **atts)
+{
+    PolicyParser *profiles = reinterpret_cast<PolicyParser*>(userData);
+
+    if (profiles->mCurrentDataField == FIELD_INVALID) {
+        profiles->checkField(profiles, name, atts);
+        return;
+    }
+
+    switch (profiles->mCurrentDataField) {
+        case FIELD_GRAPH:
+            profiles->handlePolicyConfig(profiles, name, atts);
+            break;
+        default:
+            LOGE("@%s, line:%d, go to default handling", __func__, __LINE__);
+            break;
+    }
+}
+
+/**
+ * the callback function of the libexpat for handling of one element end
+ *
+ * When it comes to the end of one element. This function will be called.
+ *
+ * \param userData: the pointer we set by the function XML_SetUserData.
+ * \param name: the element's name.
+ */
+void PolicyParser::endParseElement(void *userData, const char *name)
+{
+    LOGXML("@%s %s", __func__, name);
+
+    PolicyParser *profiles = reinterpret_cast<PolicyParser*>(userData);
+
+    if (strcmp(name, "graph") == 0) {
+        LOGXML("@%s, add policyConf, graphId: %d", __func__, profiles->pCurrentConf->graphId);
+        profiles->mStaticCfg->mPolicyConfig.push_back(*(profiles->pCurrentConf));
+        delete profiles->pCurrentConf;
+        profiles->pCurrentConf = nullptr;
+        profiles->mCurrentDataField = FIELD_INVALID;
+    }
+}
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/platformdata/PolicyParser.h b/camera/hal/intel/ipu6/src/platformdata/PolicyParser.h
new file mode 100644
index 000000000000..ca5b13e26a83
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/PolicyParser.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2018-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ *\File PolicyParser.h
+ *
+ * parser for the policy xml configuration file
+ *
+ * This file calls the libexpat ditectly. The libexpat is one xml parser.
+ * It will parse the camera configuration out firstly.
+ * Then other module can call the methods of it to get the real configuration.
+ */
+
+#pragma once
+
+#include "iutils/Utils.h"
+
+#include "CameraTypes.h"
+#include "PlatformData.h"
+#include "ParserBase.h"
+
+namespace icamera {
+
+/**
+ * \class PolicyParser
+ *
+ * This class is used to parse the policy configuration file.
+ * The configuration file is xml format.
+ * This class will use the expat lib to do the xml parser.
+ */
+class PolicyParser : public ParserBase {
+public:
+    PolicyParser(PlatformData::StaticCfg *cfg);
+    ~PolicyParser(){}
+
+    void startParseElement(void *userData, const char *name, const char **atts);
+    void endParseElement(void *userData, const char *name);
+
+private:
+    // prevent copy constructor and assignment operator
+    DISALLOW_COPY_AND_ASSIGN(PolicyParser);
+
+private:
+    void checkField(PolicyParser *profiles, const char *name, const char **atts);
+    void handlePolicyConfig(PolicyParser *profiles, const char *name, const char **atts);
+    void handlePipeExecutor(PolicyParser *profiles, const char *name, const char **atts);
+    void handleExclusivePGs(PolicyParser *profiles, const char *name, const char **atts);
+    void handleBundles(PolicyParser *profiles, const char *name, const char **atts);
+
+private:
+    PlatformData::StaticCfg *mStaticCfg;
+
+    enum DataField {
+        FIELD_INVALID = 0,
+        FIELD_GRAPH,
+    } mCurrentDataField;
+    PolicyConfig *pCurrentConf;
+};
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.cpp b/camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.cpp
new file mode 100644
index 000000000000..cbf94dc3b4ca
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.cpp
@@ -0,0 +1,338 @@
+/*
+ * Copyright (C) 2016-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "FormatUtils"
+
+#include <stdint.h>
+#include <math.h>
+#include <linux/v4l2-mediabus.h>
+#include <linux/ipu-isys.h>
+#include "ia_cipf/ia_cipf_types.h"
+#include "FormatUtils.h"
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+
+using std::string;
+using namespace icamera;
+
+/**
+ * Utilities to query information about V4L2 types in graph config
+ */
+
+namespace graphconfig {
+namespace utils {
+
+enum FormatType {
+    FORMAT_RAW,
+    FORMAT_RAW_VEC,
+    FORMAT_YUV,
+    FORMAT_YUV_VEC,
+    FORMAT_RGB,
+    FORMAT_MBUS_BAYER,
+    FORMAT_MBUS_YUV,
+    FORMAT_JPEG,
+    FORMAT_FOURCC
+};
+
+struct FormatInfo {
+    int32_t pixelCode;  // OS specific pixel code, in this case V4L2 or Media bus
+    int32_t commonPixelCode;  // Common pixel code used by CIPF and GCSS in settings
+    string fullName;
+    string shortName;
+    int32_t bpp;
+    FormatType type;
+};
+
+/**
+ * gFormatMapping
+ *
+ * Table for mapping OS agnostic formats defined in CIPF and OS specific ones
+ * (in this case V4L2, or media bus).
+ * The table also helps provide textual representation and bits per pixel.
+ * CIPF does not define most of the formats, only the ones it needs, that is why
+ * most of the entries have 0 on the common pixel format.
+ * Conversely there are some new formats introduce by CIPF that do not have
+ * V4L2 representation.
+ */
+static const FormatInfo gFormatMapping[] = {
+    { V4L2_PIX_FMT_SBGGR8, 0, "V4L2_PIX_FMT_SBGGR8", "BGGR8", 8, FORMAT_RAW },
+    { V4L2_PIX_FMT_SGBRG8, 0, "V4L2_PIX_FMT_SGBRG8", "GBRG8", 8, FORMAT_RAW },
+    { V4L2_PIX_FMT_SRGGB8, 0, "V4L2_PIX_FMT_SRGGB8", "RGGB8", 8, FORMAT_RAW },
+
+    { V4L2_PIX_FMT_SGRBG8, ia_cipf_frame_fourcc_grbg, "V4L2_PIX_FMT_SGRBG8", "GRBG8", 8, FORMAT_RAW },
+    { V4L2_PIX_FMT_SBGGR10, ia_cipf_frame_fourcc_bg10, "V4L2_PIX_FMT_SBGGR10", "BGGR10", 16, FORMAT_RAW },
+    { V4L2_PIX_FMT_SGBRG10, ia_cipf_frame_fourcc_gb10, "V4L2_PIX_FMT_SGBRG10", "GBRG10", 16, FORMAT_RAW },
+    { V4L2_PIX_FMT_SGRBG10, ia_cipf_frame_fourcc_ba10, "V4L2_PIX_FMT_SGRBG10", "GRBG10", 16, FORMAT_RAW },
+    { V4L2_PIX_FMT_SRGGB10, ia_cipf_frame_fourcc_rg10, "V4L2_PIX_FMT_SRGGB10", "RGGB10", 16, FORMAT_RAW },
+    // align to xos definition and css format: IA_CSS_DATA_FORMAT_BAYER_GRBG
+    // it's different with ia_cipf_frame_fourcc_ba10 which align to css format:
+    // IA_CSS_DATA_FORMAT_RAW
+    { V4L2_PIX_FMT_SGRBG10, ia_cipf_frame_fourcc_gr10, "V4L2_PIX_FMT_SGRBG10", "GRBG10", 16, FORMAT_RAW },
+    { 0, css_fourcc_grbg_12_li, "css_fourcc_grbg_12_li", "CSL6", 15, FORMAT_RAW},
+    { V4L2_PIX_FMT_SGRBG12, ia_cipf_frame_fourcc_ba12, "V4L2_PIX_FMT_SGRBG12", "GRBG12", 16, FORMAT_RAW },
+
+    { V4L2_PIX_FMT_NV12, ia_cipf_frame_fourcc_nv12, "V4L2_PIX_FMT_NV12", "NV12", 12, FORMAT_YUV },
+    { V4L2_PIX_FMT_NV21, ia_cipf_frame_fourcc_nv21, "V4L2_PIX_FMT_NV21", "NV21", 12, FORMAT_YUV },
+    { V4L2_PIX_FMT_UYVY, ia_cipf_frame_fourcc_uyvy, "V4L2_PIX_FMT_UYVY", "UYVY", 16, FORMAT_YUV },
+
+    { V4L2_PIX_FMT_YUV420, ia_cipf_frame_fourcc_iyuv, "V4L2_PIX_FMT_YUV420", "YUV420", 12, FORMAT_YUV },
+    // Packed formats No V4L2 equivalent exists
+    // Normal YUV420 planar but with each sample of 12bits stored in 16bits
+    { 0, ia_cipf_frame_fourcc_i420, "YUV420-12-16p", "YUV420", 24, FORMAT_YUV },
+    // Normal YUV420 planar but with each sample of 12-bit DMA-packed
+    // (42 pixels and 8 bits of padding in a 64-byte DMA word)
+    { 0, css_fourcc_yuv420_12_p64, "YUV420-12-64p", "YUV420", 18, FORMAT_YUV },
+    //  Normal YUV420 planar but with each sample of 10-bit DMA-packed
+    // (51 pixels and 2 bits of padding in a 64-byte DMA word)
+    { 0, css_fourcc_yuv420_10_p64, "YUV420-10-64p", "YUV420", 15, FORMAT_YUV },
+
+    { V4L2_MBUS_FMT_SBGGR10_1X10, ia_cipf_frame_fourcc_bg10, "V4L2_MBUS_FMT_SBGGR10_1X10", "SBGGR10_1X10", 10, FORMAT_MBUS_BAYER },
+    { V4L2_MBUS_FMT_SGBRG10_1X10, ia_cipf_frame_fourcc_gb10, "V4L2_MBUS_FMT_SGBRG10_1X10", "SGBRG10_1X10", 10, FORMAT_MBUS_BAYER },
+    { V4L2_MBUS_FMT_SGRBG10_1X10, ia_cipf_frame_fourcc_ba10, "V4L2_MBUS_FMT_SGRBG10_1X10", "SGRBG10_1X10", 10, FORMAT_MBUS_BAYER },
+    { V4L2_MBUS_FMT_SRGGB10_1X10, ia_cipf_frame_fourcc_rg10, "V4L2_MBUS_FMT_SRGGB10_1X10", "SRGGB10_1X10", 10, FORMAT_MBUS_BAYER },
+    { V4L2_MBUS_FMT_UYVY8_1X16, ia_cipf_frame_fourcc_uyvy, "V4L2_MBUS_FMT_UYVY8_1X16", "UYVY8_1X16", 16, FORMAT_MBUS_YUV },
+    { V4L2_PIX_FMT_SBGGR12, 0, "V4L2_PIX_FMT_SBGGR12", "BGGR12", 16, FORMAT_RAW },
+    { V4L2_PIX_FMT_SGBRG12, 0, "V4L2_PIX_FMT_SGBRG12", "GBRG12", 16, FORMAT_RAW },
+    { V4L2_PIX_FMT_SRGGB12, 0, "V4L2_PIX_FMT_SRGGB12", "RGGB12", 16, FORMAT_RAW },
+
+    { V4L2_PIX_FMT_SBGGR10P, 0, "V4L2_PIX_FMT_SBGGR10P", "BGGR10P", 10, FORMAT_RAW },
+    { V4L2_PIX_FMT_SGBRG10P, 0, "V4L2_PIX_FMT_SGBRG10P", "GBRG10P", 10, FORMAT_RAW },
+    { V4L2_PIX_FMT_SGRBG10P, 0, "V4L2_PIX_FMT_SGRBG10P", "GRBG10P", 10, FORMAT_RAW },
+    { V4L2_PIX_FMT_SRGGB10P, 0, "V4L2_PIX_FMT_SRGGB10P", "RGGB10P", 10, FORMAT_RAW },
+
+    { V4L2_PIX_FMT_NV16, 0, "V4L2_PIX_FMT_NV16", "NV16", 16, FORMAT_YUV },
+    { V4L2_PIX_FMT_YUYV, 0, "V4L2_PIX_FMT_YUYV", "YUYV", 16, FORMAT_YUV },
+    { V4L2_PIX_FMT_YVU420, 0, "V4L2_PIX_FMT_YVU420", "YVU420", 12, FORMAT_YUV },
+    { V4L2_PIX_FMT_YUV422P, 0, "V4L2_PIX_FMT_YUV422P", "YUV422P", 16, FORMAT_YUV },
+
+    { V4L2_PIX_FMT_BGR24, 0, "V4L2_PIX_FMT_BGR24", "BGR24", 24, FORMAT_RGB },
+    { V4L2_PIX_FMT_BGR32, 0, "V4L2_PIX_FMT_BGR32", "BGR32", 32, FORMAT_RGB },
+    { V4L2_PIX_FMT_XBGR32, 0, "V4L2_PIX_FMT_XBGR32", "XBGR32", 32, FORMAT_RGB },
+    { V4L2_PIX_FMT_XRGB32, 0, "V4L2_PIX_FMT_XRGB32", "XRGB32", 32, FORMAT_RGB },
+    { V4L2_PIX_FMT_RGB565, 0, "V4L2_PIX_FMT_RGB565", "RGB565", 16, FORMAT_RGB },
+
+    { V4L2_PIX_FMT_JPEG, 0, "V4L2_PIX_FMT_JPEG", "JPEG", 0, FORMAT_JPEG },
+
+    { V4L2_MBUS_FMT_SBGGR12_1X12, 0, "V4L2_MBUS_FMT_SBGGR12_1X12", "SBGGR12_1X12", 12, FORMAT_MBUS_BAYER },
+    { V4L2_MBUS_FMT_SGBRG12_1X12, 0, "V4L2_MBUS_FMT_SGBRG12_1X12", "SGBRG12_1X12", 12, FORMAT_MBUS_BAYER },
+    { V4L2_MBUS_FMT_SGRBG12_1X12, 0, "V4L2_MBUS_FMT_SGRBG12_1X12", "SGRBG12_1X12", 12, FORMAT_MBUS_BAYER },
+    { V4L2_MBUS_FMT_SRGGB12_1X12, 0, "V4L2_MBUS_FMT_SRGGB12_1X12", "SRGGB12_1X12", 12, FORMAT_MBUS_BAYER },
+
+    { V4L2_MBUS_FMT_SBGGR8_1X8, 0, "V4L2_MBUS_FMT_SBGGR8_1X8", "SBGGR8_1X8", 8, FORMAT_MBUS_BAYER },
+    { V4L2_MBUS_FMT_SGBRG8_1X8, 0, "V4L2_MBUS_FMT_SGBRG8_1X8", "SGBRG8_1X8", 8, FORMAT_MBUS_BAYER },
+    { V4L2_MBUS_FMT_SGRBG8_1X8, 0, "V4L2_MBUS_FMT_SGRBG8_1X8", "SGRBG8_1X8", 8, FORMAT_MBUS_BAYER },
+    { V4L2_MBUS_FMT_SRGGB8_1X8, 0, "V4L2_MBUS_FMT_SRGGB8_1X8", "SRGGB8_1X8", 8, FORMAT_MBUS_BAYER },
+
+    { V4L2_MBUS_FMT_YUYV8_1X16, 0, "V4L2_MBUS_FMT_YUYV8_1X16", "YUYV8_1X16", 16, FORMAT_MBUS_YUV },
+    { V4L2_MBUS_FMT_UYVY8_2X8, 0, "V4L2_MBUS_FMT_UYVY8_2X8","UYVY8_2X8", 8, FORMAT_MBUS_YUV},
+
+};
+
+const string pixelCode2String(int32_t code)
+{
+
+    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
+        if (gFormatMapping[i].pixelCode == code) {
+            return gFormatMapping[i].fullName;
+        }
+    }
+    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
+        if (gFormatMapping[i].commonPixelCode == code) {
+            return gFormatMapping[i].fullName;
+        }
+    }
+
+    LOGE("Invalid Pixel Format: 0x%x", code);
+    return "INVALID FORMAT";
+}
+
+int32_t string2PixelCode(const string &code)
+{
+    if (code.empty()) {
+        LOGE("Invalid Pixel Format: %s", code.c_str());
+        return -1;
+    }
+
+    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
+        if (gFormatMapping[i].fullName == code) {
+            return gFormatMapping[i].pixelCode;
+        }
+    }
+
+    LOGE("Invalid Pixel Format: %s", code.c_str());
+    return -1;
+}
+
+const string format2string(int32_t format)
+{
+    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
+        if (gFormatMapping[i].pixelCode == format) {
+            return gFormatMapping[i].shortName;
+        }
+    }
+
+    LOGW("Not in our format list :%x", format);
+    return "INVALID-FORMAT";
+}
+
+bool isPlanarFormat(int32_t format)
+{
+    return (format == V4L2_PIX_FMT_NV12 ||
+            format == V4L2_PIX_FMT_NV21 ||
+            format == V4L2_PIX_FMT_YUV420 ||
+            format == V4L2_PIX_FMT_YVU420 ||
+            format == V4L2_PIX_FMT_YUV422P);
+}
+
+bool isRaw(int32_t format)
+{
+    int32_t size = ARRAY_SIZE(gFormatMapping);
+    for (int32_t i = 0; i < size; i++) {
+        if (gFormatMapping[i].pixelCode == format) {
+            // Both normal raw and vector raw treated as raw here.
+            return gFormatMapping[i].type == FORMAT_RAW_VEC || gFormatMapping[i].type == FORMAT_RAW;
+        }
+    }
+
+    return false;
+}
+
+bool isVectorizedRaw(int32_t format)
+{
+    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
+        if (gFormatMapping[i].pixelCode == format) {
+            return gFormatMapping[i].type == FORMAT_RAW_VEC;
+        }
+    }
+
+    return false;
+}
+
+/**
+ * Calculate bytes per line(bpl) based on fourcc format.
+ *
+ * \param[in] format 4CC code in OS specific format
+ * \return bpl bytes per line
+ */
+int32_t getBpl(int32_t format, int32_t width)
+{
+    int32_t bpl = 0;
+    switch (format) {
+        case css_fourcc_yuv420_12_p64:      // YUV
+            /*
+             * Align based on UV planes, which have half the strides compared to y plane.
+             * 42 whole pixels in each 64 byte word, rest 8 bits per word is padding.
+             * The total bpl is double the UV-plane strides.
+             */
+            bpl = ceil(((double)width / 2) / 42) * 64 * 2;
+            break;
+        case css_fourcc_yyuv420_v32:        // Y032
+            bpl = width * 6;
+            break;
+        case css_fourcc_grbg_12_li:            // CSL6
+            bpl = width * 4;
+            break;
+        case css_fourcc_grbg_10_v32:        // BV0G
+        case ia_cipf_frame_fourcc_i420:     // V420
+        case css_fourcc_raw_interleaved:    // BV0K
+        case ia_cipf_frame_fourcc_ba10:     // BA10
+        case ia_cipf_frame_fourcc_gr10:     // GR10
+        case ia_cipf_frame_fourcc_ba12:
+        case css_fourcc_p010:               //YUV 10bit serial
+        case css_fourcc_p010_lsb:
+        case css_fourcc_p010_msb_tile_y:
+        case css_fourcc_p010_msb_cile_y:
+            bpl = width * 2;
+            break;
+        case ia_cipf_frame_fourcc_nv12:     // NV12
+        case ia_cipf_frame_fourcc_grbg:     // GRBG
+            bpl = width;
+            break;
+        default:
+            bpl = width;
+            LOGW("bpl defaulting to width for format:%s", CameraUtils::format2string(format).c_str());
+            break;
+    }
+    return bpl;
+}
+
+/**
+ *  Retrieve the bits per pixel  from the OS specific pixel code.
+ *  This is ususally used for buffer allocation calculations
+ *
+ *  \param [in] format 4CC code in OS specific format
+ *  \return bits per pixel
+ */
+int32_t getBpp(int32_t format)
+{
+    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
+        if (gFormatMapping[i].pixelCode == format) {
+            return gFormatMapping[i].bpp;
+        }
+    }
+
+    LOGE("There is no bpp supplied for format %s",
+            pixelCode2String(format).c_str());
+    return -1;
+}
+
+/**
+ *  Retrieve the bits per pixel from the common pixel code format (CIPF)
+ *  This is usually used for buffer allocation calculations
+ *
+ *  \param [in] format 4CC code in Common format
+ *  \return bits per pixel
+ */
+int32_t getBppFromCommon(int32_t format)
+{
+    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
+        if (gFormatMapping[i].commonPixelCode == format) {
+            return gFormatMapping[i].bpp;
+        }
+    }
+
+    LOGE("There is no bpp supplied for format %s",
+            pixelCode2String(format).c_str());
+    return -1;
+}
+
+int32_t getNumOfPlanes(int32_t format)
+{
+    switch(format) {
+        case V4L2_PIX_FMT_NV12:
+        case V4L2_PIX_FMT_SGRBG8:
+        case V4L2_FMT_IPU_ISYS_META:
+            return 1;
+        //Add more when needed...
+        default:
+            return 1;
+    }
+}
+
+int32_t getV4L2Format(const int32_t commonPixelFormat)
+{
+    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
+        if (gFormatMapping[i].commonPixelCode == commonPixelFormat)
+            return gFormatMapping[i].pixelCode;
+    }
+
+    LOGE("Failed to find any V4L2 format with format %s",
+            pixelCode2String(commonPixelFormat).c_str());
+    return -1;
+}
+
+} // namespace utils
+} // namespace graphconfig
diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.h b/camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.h
new file mode 100644
index 000000000000..d6f3a03ad9dd
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2016-2019 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <string>
+
+namespace graphconfig {
+namespace utils {
+
+int32_t getV4L2Format(const int32_t commonPixelFormat);
+const std::string format2string(int32_t format);
+bool isPlanarFormat(int32_t v4l2Format);
+bool isRaw(int32_t format);
+bool isVectorizedRaw(int32_t format);
+int32_t getBpl(int32_t format, int32_t width);
+int32_t getBpp(int32_t format);
+int32_t getBppFromCommon(int32_t format);
+
+}  // namespace utils
+}  // namespace graphconfig
diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.cpp b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.cpp
new file mode 100644
index 000000000000..c7249b41ffb6
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.cpp
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "GraphConfig"
+
+#include "src/platformdata/gc/GraphConfig.h"
+
+#include "PlatformData.h"
+#include "iutils/CameraLog.h"
+
+using std::vector;
+using std::map;
+using std::string;
+
+namespace icamera {
+
+GraphConfig::GraphConfig(int32_t camId, ConfigMode mode) :
+        mCameraId(camId) {
+    mGraphConfigImpl = std::unique_ptr<GraphConfigImpl>(new GraphConfigImpl(camId, mode,
+                                                        PlatformData::getGraphSettingsType(camId)));
+}
+
+GraphConfig::GraphConfig() {
+    mGraphConfigImpl = std::unique_ptr<GraphConfigImpl>(new GraphConfigImpl());
+}
+
+GraphConfig::~GraphConfig() {
+}
+
+void GraphConfig::addCustomKeyMap() {
+    mGraphConfigImpl->addCustomKeyMap();
+}
+
+status_t GraphConfig::parse(int cameraId, const char *settingsXmlFile) {
+    string graphDescFile = PlatformData::getGraphDescFilePath();
+    string settingsFile = PlatformData::getGraphSettingFilePath() + settingsXmlFile;
+    return mGraphConfigImpl->parse(cameraId, graphDescFile.c_str(), settingsFile.c_str());
+}
+
+void GraphConfig::releaseGraphNodes() {
+    mGraphConfigImpl->releaseGraphNodes();
+}
+
+status_t GraphConfig::configStreams(const vector<HalStream*> &activeStreams) {
+    LOG1("@%s", __func__);
+
+    int ret = mGraphConfigImpl->configStreams(activeStreams);
+    CheckError(ret != OK, UNKNOWN_ERROR, "%s, Failed to config streams", __func__);
+
+    ret = mGraphConfigImpl->getGraphConfigData(&mGraphData);
+    CheckError(ret != OK, UNKNOWN_ERROR, "%s, Failed to get the static graph config data", __func__);
+
+    return OK;
+}
+
+status_t GraphConfig::getGdcKernelSetting(uint32_t& kernelId, camera_resolution_t& resolution) {
+    LOG1("@%s", __func__);
+    if ((mGraphData.gdcReso.width == 0) || (mGraphData.gdcReso.height == 0)) {
+        LOGW("%s, Failed to get gdc resolutione: width: %d, height: %d ", __func__,
+            mGraphData.gdcReso.width, mGraphData.gdcReso.height);
+        return NO_ENTRY;
+    }
+
+    kernelId = mGraphData.gdcKernelId;
+    resolution = mGraphData.gdcReso;
+
+    return OK;
+}
+
+status_t GraphConfig::graphGetStreamIds(vector<int32_t> &streamIds) {
+    LOG1("@%s", __func__);
+    CheckError(mGraphData.streamIds.empty(), UNKNOWN_ERROR, "%s, The streamIds vector is empty", __func__);
+
+    streamIds = mGraphData.streamIds;
+    return OK;
+}
+
+int GraphConfig::getStreamIdByPgName(string pgName) {
+    LOG1("@%s", __func__);
+    CheckError(mGraphData.pgInfo.empty(), -1, "%s, The pgInfo vector is empty", __func__);
+
+    for (auto &info : mGraphData.pgInfo) {
+        if (info.pgName == pgName) {
+            return info.streamId;
+        }
+    }
+
+    LOGE("%s, Failed to get stream id for pgName: %s", __func__, pgName.c_str());
+    return -1;
+}
+
+int GraphConfig::getPgIdByPgName(string pgName) {
+    LOG1("@%s", __func__);
+    CheckError(mGraphData.pgInfo.empty(), -1, "%s, The pgInfo vector is empty", __func__);
+
+    for (auto &info : mGraphData.pgInfo) {
+        if (info.pgName == pgName) {
+            return info.pgId;
+        }
+    }
+
+    LOGE("%s, Failed to get pg id for pgName: %s", __func__, pgName.c_str());
+    return -1;
+}
+
+ia_isp_bxt_program_group* GraphConfig::getProgramGroup(int32_t streamId) {
+    LOG1("@%s", __func__);
+    CheckError(mGraphData.programGroup.empty(), nullptr, "%s, The programGroup vector is empty", __func__);
+
+    for (auto &info : mGraphData.programGroup) {
+        if (info.streamId == streamId && info.pgPtr != nullptr) {
+            return info.pgPtr;
+        }
+    }
+
+    LOGE("%s, Failed to get programGroup for streamId", __func__, streamId);
+    return nullptr;
+}
+
+status_t GraphConfig::getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits *data) {
+    LOG1("@%s", __func__);
+    for (auto &info : mGraphData.mbrInfo) {
+        if (streamId == info.streamId) {
+            data = &info.data;
+            return OK;
+        }
+    }
+
+    return BAD_VALUE;
+}
+
+status_t GraphConfig::getPgNames(vector<string>* pgNames) {
+    LOG1("@%s", __func__);
+    CheckError(mGraphData.pgNames.empty(), UNKNOWN_ERROR, "%s, The pgNames vector is empty", __func__);
+
+    *pgNames = mGraphData.pgNames;
+    return OK;
+}
+
+status_t GraphConfig::getPgRbmValue(string pgName, IGraphType::StageAttr *stageAttr) {
+    LOG1("@%s", __func__);
+    CheckError(mGraphData.pgInfo.empty(), UNKNOWN_ERROR, "%s, The pgInfo vector is empty", __func__);
+
+    for (auto &info : mGraphData.pgInfo) {
+        if (info.pgName == pgName && info.rbmValue.rbm != nullptr) {
+            *stageAttr = info.rbmValue;
+            return OK;
+        }
+    }
+
+    return BAD_VALUE;
+}
+
+int GraphConfig::getProgramGroup(string pgName, ia_isp_bxt_program_group* programGroupForPG) {
+    LOG1("@%s", __func__);
+    return mGraphConfigImpl->getProgramGroup(pgName, programGroupForPG);
+}
+
+status_t GraphConfig::pipelineGetConnections(const vector<string>& pgList,
+                                             vector<IGraphType::PipelineConnection> *confVector) {
+    LOG1("@%s", __func__);
+    CheckError(!confVector, UNKNOWN_ERROR, "%s, The confVector is nullptr", __func__);
+
+    status_t ret;
+    std::vector<IGraphType::ScalerInfo> scalerInfo;
+
+    ret = mGraphConfigImpl->pipelineGetConnections(pgList, &scalerInfo, confVector);
+    CheckError(ret != OK, ret, "%s, Failed to pipelineGetConnections", __func__);
+
+    PlatformData::setScalerInfo(mCameraId, scalerInfo);
+    return OK;
+}
+
+status_t GraphConfig::getPgIdForKernel(const uint32_t streamId, const int32_t kernelId, int32_t *pgId) {
+    LOG1("@%s", __func__);
+    CheckError(!pgId, UNKNOWN_ERROR, "%s, the pgId is nullptr", __func__);
+    return mGraphConfigImpl->getPgIdForKernel(streamId, kernelId, pgId);
+}
+}  // icamera
diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.h b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.h
new file mode 100644
index 000000000000..03fd276a30a2
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <memory>
+#include <utility>
+#include <vector>
+#include "HalStream.h"
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+
+#ifdef ENABLE_SANDBOXING
+#include "modules/sandboxing/client/GraphConfigImpl.h"
+#else
+#include "modules/algowrapper/graph/GraphConfigImpl.h"
+#endif
+
+namespace icamera {
+
+/**
+ * \class GraphConfig
+ *
+ * \brief This is a wrapper of GraphConfigImpl class and it provides the
+ * public APIs to get the graph config data.
+ *
+ * It maintains one static area and GraphConfigImpl object, user get graph
+ * config data from the local structure or GraphConfigImpl object through
+ * the public APIs
+ */
+class GraphConfig : public IGraphConfig {
+public:
+    GraphConfig();
+    GraphConfig(int32_t camId, ConfigMode mode);
+    virtual ~GraphConfig();
+
+    void addCustomKeyMap();
+    status_t parse(int cameraId, const char *settingsXmlFile);
+    void releaseGraphNodes();
+
+    // These public methods called by GraphConfigManager
+    status_t configStreams(const std::vector<HalStream*> &activeStreams);
+    int getSelectedMcId() { return mGraphData.mcId; }
+    virtual int getGraphId(void) { return mGraphData.graphId; }
+    virtual void getCSIOutputResolution(camera_resolution_t &reso) { reso = mGraphData.csiReso; }
+
+    virtual status_t getGdcKernelSetting(uint32_t& kernelId, camera_resolution_t& resolution);
+    virtual status_t graphGetStreamIds(std::vector<int32_t> &streamIds);
+    virtual int getStreamIdByPgName(std::string pgName);
+    virtual int getPgIdByPgName(std::string pgName);
+    virtual ia_isp_bxt_program_group *getProgramGroup(int32_t streamId);
+    virtual status_t getPgRbmValue(std::string pgName, IGraphType::StageAttr *stageAttr);
+    virtual status_t getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits *data);
+    virtual status_t getPgNames(std::vector<std::string>* pgNames);
+
+    virtual int getProgramGroup(std::string pgName,
+                                ia_isp_bxt_program_group* programGroupForPG);
+    virtual status_t getPgIdForKernel(const uint32_t streamId,
+                                      const int32_t kernelId, int32_t *pgId);
+
+    virtual status_t pipelineGetConnections(
+                         const std::vector<std::string> &pgList,
+                         std::vector<IGraphType::PipelineConnection> *confVector);
+private:
+    // Disable copy constructor and assignment operator
+    DISALLOW_COPY_AND_ASSIGN(GraphConfig);
+
+private:
+    int32_t mCameraId;
+    IGraphType::GraphConfigData mGraphData;
+    std::unique_ptr<GraphConfigImpl> mGraphConfigImpl;
+};
+
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.cpp b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.cpp
new file mode 100644
index 000000000000..3b792e0f8600
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.cpp
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "GraphConfigManager"
+
+#include "src/platformdata/gc/GraphConfigManager.h"
+
+#include "iutils/Utils.h"
+#include "iutils/CameraLog.h"
+#include "PlatformData.h"
+
+using std::vector;
+using std::map;
+
+namespace icamera {
+GraphConfigManager::GraphConfigManager(int32_t cameraId) :
+    mGcConfigured(false),
+    mCameraId(cameraId),
+    mMcId(-1)
+{
+}
+
+GraphConfigManager::~GraphConfigManager()
+{
+    mGraphConfigMap.clear();
+    mGcConfigured = false;
+    releaseHalStream();
+}
+
+void GraphConfigManager::releaseHalStream()
+{
+    for(auto &halStream : mHalStreamVec) {
+        delete halStream;
+    }
+    mHalStreamVec.clear();
+}
+
+/*
+ * Get the useCase from the stream and operationMode.
+ */
+StreamUseCase GraphConfigManager::getUseCaseFromStream(ConfigMode configMode, const stream_t &stream)
+{
+    if (configMode == CAMERA_STREAM_CONFIGURATION_MODE_STILL_CAPTURE ||
+            stream.usage == CAMERA_STREAM_STILL_CAPTURE)
+        return USE_CASE_STILL_CAPTURE;
+
+    return USE_CASE_PREVIEW;
+}
+
+/**
+ * Initialize the state of the GraphConfigManager after parsing the stream
+ * configuration.
+ * Perform the first level query to find a subset of settings that fulfill the
+ * constrains from the stream configuration.
+ *
+ * \param[in] streamList: all the streams info.
+ */
+status_t GraphConfigManager::configStreams(const stream_config_t *streamList)
+{
+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
+    CheckError(!streamList, BAD_VALUE, "%s: Null streamList configured", __func__);
+
+    vector <ConfigMode> configModes;
+    int ret = PlatformData::getConfigModesByOperationMode(mCameraId, streamList->operation_mode, configModes);
+    CheckError(ret != OK, ret, "%s, get ConfigMode failed %d", __func__, ret);
+
+    // Convert the stream_t to HalStream
+    // Use the stream list with descending order to find graph settings.
+    releaseHalStream();
+    for (int i = 0; i < streamList->num_streams; i++) {
+        // Don't handle input stream or opaque RAW stream when configure graph configuration.
+        if (streamList->streams[i].streamType == CAMERA_STREAM_INPUT ||
+            streamList->streams[i].usage == CAMERA_STREAM_OPAQUE_RAW) continue;
+
+        bool stored = false;
+        StreamUseCase useCase = getUseCaseFromStream(configModes[0], streamList->streams[i]);
+        streamProps props = {
+            static_cast<uint32_t>(streamList->streams[i].width),
+            static_cast<uint32_t>(streamList->streams[i].height),
+            streamList->streams[i].format,
+            streamList->streams[i].id,
+            useCase,
+        };
+        HalStream* halStream = new HalStream(props, static_cast<void*>(&streamList->streams[i]));
+        CheckError(!halStream, UNKNOWN_ERROR, "Failed to create hal stream");
+
+        for (size_t j = 0; j < mHalStreamVec.size(); j++) {
+            if (halStream->width() * halStream->height() > mHalStreamVec[j]->width() * mHalStreamVec[j]->height()) {
+                stored = true;
+                mHalStreamVec.insert((mHalStreamVec.begin() + j), halStream);
+                break;
+            }
+        }
+        if (!stored)
+            mHalStreamVec.push_back(halStream);
+    }
+
+    //debug
+    dumpStreamConfig();
+    mGraphConfigMap.clear();
+    mMcId = -1;
+
+    for (auto mode : configModes) {
+        LOG1("Mapping the operationMode %d to ConfigMode %d", streamList->operation_mode, mode);
+
+        std::shared_ptr<GraphConfig> graphConfig = std::make_shared<GraphConfig>(mCameraId, mode);
+        ret = graphConfig->configStreams(mHalStreamVec);
+        CheckWarning(ret != OK, ret, "%s, Failed to configure graph: real ConfigMode %x", __func__, mode);
+
+        int id = graphConfig->getSelectedMcId();
+        CheckError((id != -1 && mMcId != -1 && mMcId != id), UNKNOWN_ERROR,
+                    "Not support two different MC ID at same time:(%d/%d)", mMcId, id);
+        mMcId = id;
+        LOGG("%s: Add graph setting for op_mode %d", __func__, mode);
+        mGraphConfigMap[mode] = graphConfig;
+    }
+
+    mGcConfigured = true;
+    return OK;
+}
+
+std::shared_ptr<IGraphConfig> GraphConfigManager::getGraphConfig(ConfigMode configMode)
+{
+    for (auto& gc : mGraphConfigMap) {
+        if (gc.first == configMode) {
+            LOGG("%s: found graph config for mode %d", __func__, configMode);
+            return gc.second;
+        }
+    }
+
+    return nullptr;
+}
+
+void GraphConfigManager::dumpStreamConfig()
+{
+    for (size_t i = 0; i < mHalStreamVec.size(); i++) {
+        LOG1("stream[%zu] %dx%d, fmt %s", i,
+             mHalStreamVec[i]->width(), mHalStreamVec[i]->height(),
+             CameraUtils::pixelCode2String(mHalStreamVec[i]->format()));
+    }
+}
+
+map<int, IGraphConfigManager*> IGraphConfigManager::sInstances;
+Mutex IGraphConfigManager::sLock;
+
+IGraphConfigManager* IGraphConfigManager::getInstance(int cameraId)
+{
+    AutoMutex lock(sLock);
+    if (sInstances.find(cameraId) != sInstances.end()) {
+        return sInstances[cameraId];
+    }
+
+    sInstances[cameraId] = new GraphConfigManager(cameraId);
+    return sInstances[cameraId];
+}
+
+void IGraphConfigManager::releaseInstance(int cameraId)
+{
+    AutoMutex lock(sLock);
+    if (sInstances.find(cameraId) != sInstances.end()) {
+        IGraphConfigManager* gcManager = sInstances[cameraId];
+        sInstances.erase(cameraId);
+        delete gcManager;
+    }
+}
+}  // icamera
diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.h b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.h
new file mode 100644
index 000000000000..68b5066ed200
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.h
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <gcss.h>
+
+#include <memory>
+#include <utility>
+#include <vector>
+
+#include "iutils/Errors.h"
+#include "iutils/Thread.h"
+#include "GraphConfig.h"
+#include "IGraphConfigManager.h"
+
+namespace icamera {
+
+/**
+ * \class GraphConfigManager
+ *
+ * Class to wrap over parsing and executing queries on graph settings.
+ * GraphConfigManager owns the interface towards GCSS and provides convenience
+ * for HAL to execute queries and it generates GraphConfig objects as results.
+ *
+ * GraphConfigManager also provides static method for parsing graph descriptor
+ * and graph settings from XML files and filtering that data based on sensor.
+ * The \class GraphConfigmanager::Nodes object is stored in CameraCapInfo and
+ * is used when instantiating GCM.
+ *
+ * At camera open, GraphConfigManager object is created.
+ * At stream config time the state of GraphConfig manager changes with the
+ * result of the first query. This is the possible subset of graph settings that
+ * can fulfill the requirements of requested streams.
+ * At this point, there may be more than one options, but
+ * GCM can always return some default settings.
+ *
+ * Per each request, GraphConfigManager creates GraphConfig objects based
+ * on request content. These objects are owned by GCM in a pool, and passed
+ * around HAL via shared pointers.
+ */
+class GraphConfigManager: public IGraphConfigManager
+{
+public:
+    explicit GraphConfigManager(int32_t cameraId);
+    virtual ~GraphConfigManager();
+
+    // Public APIs in IGraphConfigManager
+    virtual status_t configStreams(const stream_config_t *streamList);
+    virtual std::shared_ptr<IGraphConfig> getGraphConfig(ConfigMode configMode);
+    virtual int getSelectedMcId() { LOGG("%s: %d", __func__, mMcId); return mMcId; }
+    virtual bool isGcConfigured(void) { LOGG("%s: %d", __func__, mGcConfigured); return mGcConfigured; }
+
+private:
+    // Disable copy constructor and assignment operator
+    DISALLOW_COPY_AND_ASSIGN(GraphConfigManager);
+
+    StreamUseCase getUseCaseFromStream(ConfigMode configMode, const stream_t &stream);
+    void releaseHalStream();
+
+    // Debuging helpers
+    void dumpStreamConfig();
+private:
+
+    bool mGcConfigured;
+    int32_t mCameraId;
+    std::map<ConfigMode, std::shared_ptr<GraphConfig> > mGraphConfigMap;
+    std::vector<HalStream*> mHalStreamVec;
+    int mMcId;
+};
+
+} // icamera
diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.cpp b/camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.cpp
new file mode 100644
index 000000000000..7f822e6b20c6
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.cpp
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2018-2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define LOG_TAG "GraphUtils"
+
+#include "GraphUtils.h"
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+
+#define psys_2600_pg_uid(id) ia_fourcc(((id & 0xFF00) >> 8),id,'G','0')
+#define psys_2600_pg_id_from_uid(uid) ((uid & 0xFFFF0000) >> 16)
+#define psys_2600_term_idx_from_uid(uid) ((uid & 0x0000FFFF) - 1)
+
+using namespace std;
+
+namespace icamera {
+
+void GraphUtils::dumpConnections(const std::vector<IGraphType::PipelineConnection>& connections)
+{
+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_GRAPH)) {
+        return;
+    }
+
+    LOGG("Graph connections:");
+    for (auto& conn : connections) {
+
+        LOGG("Format settings: enabled === %d ===, terminalIdx %d, width %d, height %d, fourcc %s, bpl %d, bpp %d",
+                    conn.portFormatSettings.enabled,
+                    conn.portFormatSettings.terminalId,
+                    conn.portFormatSettings.width, conn.portFormatSettings.height,
+                    CameraUtils::fourcc2String(conn.portFormatSettings.fourcc).c_str(),
+                    conn.portFormatSettings.bpl, conn.portFormatSettings.bpp);
+
+        LOGG("Connection config: sourceStage %d(%d), sourceTerminal %d(%d), sourceIteration %d, " \
+                    "sinkStage %d(%d), sinkTerminal %d(%d), sinkIteration %d, connectionType %d",
+                    psys_2600_pg_id_from_uid(conn.connectionConfig.mSourceStage),
+                    conn.connectionConfig.mSourceStage,
+                    conn.connectionConfig.mSourceTerminal - conn.connectionConfig.mSourceStage -1,
+                    conn.connectionConfig.mSourceTerminal,
+                    conn.connectionConfig.mSourceIteration,
+                    psys_2600_pg_id_from_uid(conn.connectionConfig.mSinkStage),
+                    conn.connectionConfig.mSinkStage,
+                    conn.connectionConfig.mSinkTerminal - conn.connectionConfig.mSinkStage -1,
+                    conn.connectionConfig.mSinkTerminal,
+                    conn.connectionConfig.mSinkIteration,
+                    conn.connectionConfig.mConnectionType);
+
+        LOGG("Edge port: %d", conn.hasEdgePort);
+    }
+
+    return;
+}
+
+void GraphUtils::dumpKernelInfo(const ia_isp_bxt_program_group& programGroup)
+{
+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_GRAPH)) {
+        return;
+    }
+
+    LOGG("Kernel info: count %d, opMode %d", programGroup.kernel_count, programGroup.operation_mode);
+
+    for(unsigned int i = 0; i< programGroup.kernel_count; i++) {
+
+        const ia_isp_bxt_run_kernels_t& curRunKernel = programGroup.run_kernels[i];
+
+        LOGG("uid %d, streamId: %d, enabled %d", curRunKernel.kernel_uuid, curRunKernel.stream_id,
+                    curRunKernel.enable);
+
+        if (programGroup.run_kernels[i].resolution_info) {
+            LOGG("Resolution: inputWidth %d, inputHeight %d, inputCrop %d %d %d %d," \
+                       "outputWidth %d, outputHeight %d, outputCrop %d %d %d %d,",
+                       curRunKernel.resolution_info->input_width, curRunKernel.resolution_info->input_height,
+                       curRunKernel.resolution_info->input_crop.left, curRunKernel.resolution_info->input_crop.top,
+                       curRunKernel.resolution_info->input_crop.right, curRunKernel.resolution_info->input_crop.bottom,
+                       curRunKernel.resolution_info->output_width, curRunKernel.resolution_info->output_height,
+                       curRunKernel.resolution_info->output_crop.left, curRunKernel.resolution_info->output_crop.top,
+                       curRunKernel.resolution_info->output_crop.right, curRunKernel.resolution_info->output_crop.bottom);
+        }
+
+        if (programGroup.run_kernels[i].resolution_history) {
+            LOGG("Resolution history: inputWidth %d, inputHeight %d, inputCrop %d %d %d %d," \
+                       "outputWidth %d, outputHeight %d, outputCrop %d %d %d %d,",
+                       curRunKernel.resolution_history->input_width, curRunKernel.resolution_history->input_height,
+                       curRunKernel.resolution_history->input_crop.left, curRunKernel.resolution_history->input_crop.top,
+                       curRunKernel.resolution_history->input_crop.right, curRunKernel.resolution_history->input_crop.bottom,
+                       curRunKernel.resolution_history->output_width, curRunKernel.resolution_history->output_height,
+                       curRunKernel.resolution_history->output_crop.left, curRunKernel.resolution_history->output_crop.top,
+                       curRunKernel.resolution_history->output_crop.right, curRunKernel.resolution_history->output_crop.bottom);
+
+        }
+
+        LOGG("metadata %d %d %d %d, bppInfo: %d %d, outputCount %d",
+                   curRunKernel.metadata[0], curRunKernel.metadata[1], curRunKernel.metadata[2], curRunKernel.metadata[3],
+                   curRunKernel.bpp_info.input_bpp, curRunKernel.bpp_info.output_bpp,
+                   curRunKernel.output_count);
+    }
+
+    return;
+}
+}
diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.h b/camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.h
new file mode 100644
index 000000000000..86686c576e1c
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2018-2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include "IGraphConfig.h"
+#include "IGraphConfigManager.h"
+#include "ia_isp_bxt_types.h"
+
+namespace icamera {
+namespace GraphUtils {
+    void dumpConnections(const std::vector<IGraphType::PipelineConnection>& connections);
+    void dumpKernelInfo(const ia_isp_bxt_program_group& programGroup);
+};
+}
diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/HalStream.h b/camera/hal/intel/ipu6/src/platformdata/gc/HalStream.h
new file mode 100644
index 000000000000..139125a46552
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/gc/HalStream.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2016-2019 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+namespace icamera {
+
+// Temporary solution
+enum StreamUseCase {
+    USE_CASE_COMMON = 0,
+    USE_CASE_PREVIEW = 1 << 0,        // For HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED
+    USE_CASE_VIDEO = 1 << 1,          // For HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED
+    USE_CASE_STILL_CAPTURE = 1 << 2,  // For HAL_PIXEL_FORMAT_BLOB/HAL_PIXEL_FORMAT_YCbCr_420_888
+    USE_CASE_RAW = 1 << 3,            // For HAL_PIXEL_FORMAT_RAW16/HAL_PIXEL_FORMAT_RAW_OPAQUE
+    USE_CASE_ZSL = 1 << 4,            // For ZSL stream
+    USE_CASE_INPUT = 1 << 5,           // For input stream
+};
+
+struct streamProps {
+    uint32_t width;
+    uint32_t height;
+    int format;
+    int streamId;
+    StreamUseCase useCase;
+};
+
+class HalStream
+{
+ public:
+    HalStream(struct streamProps &props, void *priv):
+        mWidth(props.width),
+        mHeight(props.height),
+        mFormat(props.format),
+        mStreamId(props.streamId),
+        mUseCase(props.useCase)
+    {
+        maxBuffers = 0;
+        mPrivate = priv;
+    }
+
+    ~HalStream() { }
+
+    uint32_t width() const { return mWidth; }
+    uint32_t height() const { return mHeight; }
+    int format() const { return mFormat; }
+    int streamId() const { return mStreamId; }
+    StreamUseCase useCase() const { return mUseCase; }
+    void *priv() { return mPrivate; }
+
+ public:
+    uint32_t mWidth;
+    uint32_t mHeight;
+    int mFormat;  // TODO: use v4l2 definition
+    int mStreamId;
+    StreamUseCase mUseCase;
+
+    int maxBuffers;
+    void *mPrivate;
+};
+
+} /* namespace icamera */
diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfig.h b/camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfig.h
new file mode 100644
index 000000000000..e28d039b8af6
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfig.h
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2018-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <string>
+#include "HalStream.h"
+#include "Parameters.h"
+#include "iutils/CameraLog.h"
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+
+#include <gcss.h>
+#include <gcss_aic_utils.h>
+#include "ia_isp_bxt_types.h"
+#include "ia_view_types.h"
+
+typedef uint32_t ia_uid;
+
+namespace GCSS {
+    class GraphConfigNode;
+    class GraphQueryManager;
+    class ItemUID;
+}
+
+typedef GCSS::GraphConfigNode Node;
+typedef std::vector<Node*> NodesPtrVector;
+
+namespace icamera {
+
+/**
+ * Stream id associated with still capture.
+ */
+static const int32_t STILL_STREAM_ID = 60000;
+/**
+ * Stream id associated with video stream.
+ */
+static const int32_t VIDEO_STREAM_ID = 60001;
+
+namespace IGraphType {
+class ConnectionConfig {
+ public:
+    ConnectionConfig(): mSourceStage(0),
+                        mSourceTerminal(0),
+                        mSourceIteration(0),
+                        mSinkStage(0),
+                        mSinkTerminal(0),
+                        mSinkIteration(0),
+                        mConnectionType(0) {}
+
+    ConnectionConfig(ia_uid sourceStage,
+                     ia_uid sourceTerminal,
+                     ia_uid sourceIteration,
+                     ia_uid sinkStage,
+                     ia_uid sinkTerminal,
+                     ia_uid sinkIteration,
+                     int connectionType):
+                         mSourceStage(sourceStage),
+                         mSourceTerminal(sourceTerminal),
+                         mSourceIteration(sourceIteration),
+                         mSinkStage(sinkStage),
+                         mSinkTerminal(sinkTerminal),
+                         mSinkIteration(sinkIteration),
+                         mConnectionType(connectionType) {}
+    void dump() {
+        LOG1("connection src 0x%x (0x%x) sink 0x%x(0x%x)",
+             mSourceStage, mSourceTerminal, mSinkStage, mSinkTerminal);
+    }
+
+    ia_uid mSourceStage;
+    ia_uid mSourceTerminal;
+    ia_uid mSourceIteration;
+    ia_uid mSinkStage;
+    ia_uid mSinkTerminal;
+    ia_uid mSinkIteration;
+    int mConnectionType;
+};
+
+/**
+* \struct PortFormatSettings
+* Format settings for a port in the graph
+*/
+struct PortFormatSettings {
+    int32_t      enabled;
+    uint32_t     terminalId; /**< Unique terminal id (is a fourcc code) */
+    int32_t      width;    /**< Width of the frame in pixels */
+    int32_t      height;   /**< Height of the frame in lines */
+    int32_t      fourcc;   /**< Frame format */
+    int32_t      bpl;      /**< Bytes per line*/
+    int32_t      bpp;      /**< Bits per pixel */
+};
+
+/**
+ * \struct PipelineConnection
+ * Group port format, connection, stream, edge port for
+ * pipeline configuration
+ */
+struct PipelineConnection {
+    PipelineConnection() : stream(nullptr), hasEdgePort(false) { CLEAR(portFormatSettings); }
+    PortFormatSettings portFormatSettings;
+    ConnectionConfig connectionConfig;
+    HalStream *stream;
+    bool hasEdgePort;
+};
+
+struct StageAttr{
+    void *rbm;
+    uint32_t rbm_bytes;
+    StageAttr() : rbm(nullptr), rbm_bytes(0) {}
+};
+
+enum terminal_connection_type {
+    connection_type_push, /* data is pushed by source stage execute */
+    connection_type_pull  /* data is pulled by sink stage execute */
+};
+
+struct PgInfo {
+    PgInfo() : pgId(-1), streamId(-1) {}
+    std::string pgName;
+    int pgId;
+    int streamId;
+    StageAttr rbmValue;
+};
+
+struct MbrInfo {
+    MbrInfo() { streamId = -1; CLEAR(data); }
+    int streamId;
+    ia_isp_bxt_gdc_limits data;
+};
+
+struct ProgramGroupInfo {
+    ProgramGroupInfo() { streamId = -1; pgPtr = nullptr; }
+    int streamId;
+    ia_isp_bxt_program_group *pgPtr;
+};
+
+struct GraphConfigData {
+    int mcId;
+    int graphId;
+    uint32_t gdcKernelId;
+    camera_resolution_t csiReso;
+    camera_resolution_t gdcReso;
+    std::vector<int32_t> streamIds;
+    std::vector<PgInfo> pgInfo;
+    std::vector<MbrInfo> mbrInfo;
+    std::vector<std::string> pgNames;
+    std::vector<ProgramGroupInfo> programGroup;
+    GraphConfigData() : mcId(-1),
+                        graphId(-1),
+                        gdcKernelId(-1) {
+        CLEAR(csiReso);
+        CLEAR(gdcReso);
+    }
+};
+
+struct ScalerInfo {
+    int32_t streamId;
+    float scalerWidth;
+    float scalerHeight;
+};
+}  // namespace IGraphType
+
+class IGraphConfig {
+public:
+    virtual ~IGraphConfig() = default;
+
+    virtual void getCSIOutputResolution(camera_resolution_t &reso) = 0;
+    virtual status_t getGdcKernelSetting(uint32_t& kernelId,
+                                         camera_resolution_t& resolution) = 0;
+    virtual status_t graphGetStreamIds(std::vector<int32_t> &streamIds) = 0;
+    virtual int getGraphId(void) = 0;
+    virtual int getStreamIdByPgName(std::string pgName) = 0;
+    virtual int getPgIdByPgName(std::string pgName) = 0;
+    virtual ia_isp_bxt_program_group *getProgramGroup(int32_t streamId) = 0;
+    virtual int getProgramGroup(std::string pgName,
+                                ia_isp_bxt_program_group* programGroupForPG) {return OK;}
+    virtual status_t getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits *data) = 0;
+    virtual status_t getPgRbmValue(std::string pgName,
+                                   IGraphType::StageAttr *stageAttr) {return OK;}
+    virtual status_t getPgIdForKernel(const uint32_t streamIds,
+                                      const int32_t kernelId, int32_t *pgId) {return OK;}
+    virtual status_t getPgNames(std::vector<std::string>* pgNames) = 0;
+    virtual status_t pipelineGetConnections(
+                         const std::vector<std::string> &pgList,
+                         std::vector<IGraphType::PipelineConnection> *confVector) = 0;
+};
+}
diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfigManager.h b/camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfigManager.h
new file mode 100644
index 000000000000..fa55c57ab2d1
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfigManager.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2018-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <memory>
+#include <map>
+
+#include "CameraTypes.h"
+#include "IGraphConfig.h"
+#include "Parameters.h"
+#include "iutils/Thread.h"
+
+namespace icamera {
+class IGraphConfigManager {
+public:
+    virtual ~IGraphConfigManager() = default;
+
+    virtual int configStreams(const stream_config_t* streams) = 0;
+    virtual int getSelectedMcId() = 0;
+    virtual std::shared_ptr<IGraphConfig> getGraphConfig(ConfigMode configMode) = 0;
+    virtual bool isGcConfigured(void) = 0;
+    static void releaseInstance(int cameraId);
+    static IGraphConfigManager* getInstance(int cameraId);
+
+private:
+    // Guard for singleton instance creation.
+    static Mutex sLock;
+    static std::map<int, IGraphConfigManager*> sInstances;
+};
+}
diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/custom_gcss_keys.h b/camera/hal/intel/ipu6/src/platformdata/gc/custom_gcss_keys.h
new file mode 100644
index 000000000000..624d750c868d
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/gc/custom_gcss_keys.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2016-2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+GCSS_KEY (BAYER_ORDER, bayer_order)
+GCSS_KEY (GAIN, analogue_gain)
+GCSS_KEY (CSI_BE, csi_be)
+GCSS_KEY (CSI_BE_SOC, csi_be_soc)
+GCSS_KEY (CSI_PORT, csi_port)
+GCSS_KEY (EXPOSURE, exposure)
+GCSS_KEY (FLL, min_fll)
+GCSS_KEY (INTERLACED, interlaced)
+GCSS_KEY (HFLIP, hflip)
+GCSS_KEY (LINK_FREQ, link_freq)
+GCSS_KEY (LLP, min_llp)
+GCSS_KEY (SENSOR_MODE, sensor_mode)
+GCSS_KEY (PIXEL_ARRAY, pixel_array)
+GCSS_KEY (BINNER, binner)
+GCSS_KEY (SCALER, scaler)
+GCSS_KEY (BINNING_H_FACTOR, h_factor)
+GCSS_KEY (BINNING_V_FACTOR, v_factor)
+GCSS_KEY (SCALING_FACTOR_NUM, num_factor)
+GCSS_KEY (SCALING_FACTOR_DENOM, denom_factor)
+GCSS_KEY (PORT_0, port_0)
+GCSS_KEY (SCALER_PAD, scaler_pad)
+GCSS_KEY (TARGET, target)
+GCSS_KEY (SENSOR_NAME, sensor_name)
+GCSS_KEY (TPG, tpg)
+GCSS_KEY (STILL_POST_GDC, still_post_gdc)
+GCSS_KEY (VFLIP, vflip)
+GCSS_KEY (VIDEO0, video0)
+GCSS_KEY (VIDEO1, video1)
+GCSS_KEY (VIDEO2, video2)
+GCSS_KEY (STILL0, still0)
+GCSS_KEY (STILL1, still1)
+GCSS_KEY (STILL2, still2)
+GCSS_KEY (RAW, raw)
+GCSS_KEY (OP_MODE, op_mode)
+GCSS_KEY (MC_ID, mc_id)
diff --git a/camera/hal/intel/ipu6/src/v4l2/MediaControl.cpp b/camera/hal/intel/ipu6/src/v4l2/MediaControl.cpp
new file mode 100644
index 000000000000..0b530c394e90
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/v4l2/MediaControl.cpp
@@ -0,0 +1,1116 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2015-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "MediaControl"
+
+#include <stack>
+#include <linux/v4l2-mediabus.h>
+#include <linux/videodev2.h>
+
+#include "iutils/CameraLog.h"
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+#include "V4l2DeviceFactory.h"
+#include "MediaControl.h"
+#include "Parameters.h"
+#include "SysCall.h"
+#include "PlatformData.h"
+
+using std::string;
+using std::vector;
+
+namespace icamera {
+
+struct MediaLink {
+    MediaPad *source;
+    MediaPad *sink;
+    MediaLink *twin;
+    uint32_t flags;
+    uint32_t padding[3];
+};
+
+struct MediaPad {
+    MediaEntity *entity;
+    uint32_t index;
+    uint32_t flags;
+    uint32_t padding[3];
+};
+
+struct MediaEntity {
+    media_entity_desc info;
+    MediaPad *pads;
+    MediaLink *links;
+    unsigned int maxLinks;
+    unsigned int numLinks;
+
+    char devname[32];
+};
+
+MediaControl *MediaControl::sInstance = nullptr;
+Mutex MediaControl::sLock;
+
+/*static*/ MediaControl*
+MediaControl::getInstance()
+{
+    LOG1("%s", __func__);
+    AutoMutex lock(sLock);
+    if (!sInstance) {
+        sInstance = new MediaControl(MEDIACTLDEVNAME);
+    }
+    return sInstance;
+}
+
+void MediaControl::releaseInstance()
+{
+    LOG1("%s", __func__);
+    AutoMutex lock(sLock);
+    delete sInstance;
+    sInstance = nullptr;
+}
+
+MediaControl::MediaControl(const char *devName) :
+    mDevName(devName)
+{
+    LOG1("@%s device: %s", __func__, devName);
+}
+
+MediaControl::~MediaControl()
+{
+    LOG1("@%s", __func__);
+}
+
+int MediaControl::initEntities()
+{
+    LOG1("@%s", __func__);
+
+    mEntities.reserve(100);
+
+    int ret = enumInfo();
+    if (ret != 0) {
+        LOGE("Enum Info failed.");
+        return -1;
+    }
+
+    return 0;
+}
+
+void MediaControl::clearEntities()
+{
+    LOG1("@%s", __func__);
+
+    auto entity = mEntities.begin();
+    while (entity != mEntities.end()) {
+        delete [] entity->pads;
+        entity->pads = nullptr;
+        delete [] entity->links;
+        entity->links = nullptr;
+        entity = mEntities.erase(entity);
+    }
+}
+
+MediaEntity *MediaControl::getEntityByName(const char *name)
+{
+    CheckError(!name, nullptr, "Invalid Entity name");
+
+    for (auto &entity : mEntities) {
+        if (strcmp(name, entity.info.name) == 0) {
+            return &entity;
+        }
+    }
+
+    return nullptr;
+}
+
+int MediaControl::getEntityIdByName(const char *name)
+{
+    MediaEntity *entity = getEntityByName(name);
+    if (!entity) {
+        return -1;
+    }
+
+    return entity->info.id;
+}
+
+int MediaControl::resetAllLinks()
+{
+    int ret;
+
+    LOG1("@%s", __func__);
+
+    for (auto &entity : mEntities) {
+
+        for (uint32_t j = 0; j < entity.numLinks; j++) {
+            MediaLink *link = &entity.links[j];
+
+            if (link->flags & MEDIA_LNK_FL_IMMUTABLE ||
+                    link->source->entity->info.id != entity.info.id) {
+                continue;
+            }
+            ret = setupLink(link->source, link->sink,
+                    link->flags & ~MEDIA_LNK_FL_ENABLED);
+
+            if (ret < 0)
+                return ret;
+        }
+    }
+
+    return 0;
+}
+
+int MediaControl::setupLink(MediaPad *source, MediaPad *sink, uint32_t flags)
+{
+    MediaLink *link = nullptr;
+    media_link_desc ulink;
+    uint32_t i;
+    int ret = 0;
+    LOG1("@%s", __func__);
+
+    SysCall *sc = SysCall::getInstance();
+
+    int fd = openDevice();
+    if (fd < 0)
+        goto done;
+
+    for (i = 0; i < source->entity->numLinks; i++) {
+        link = &source->entity->links[i];
+
+        if (link->source->entity == source->entity &&
+                link->source->index == source->index &&
+                link->sink->entity == sink->entity &&
+                link->sink->index == sink->index)
+            break;
+    }
+
+    if (i == source->entity->numLinks) {
+        LOGE("%s: Link not found", __func__);
+        ret = -ENOENT;
+        goto done;
+    }
+
+    /* source pad */
+    memset(&ulink, 0, sizeof(media_link_desc));
+    ulink.source.entity = source->entity->info.id;
+    ulink.source.index = source->index;
+    ulink.source.flags = MEDIA_PAD_FL_SOURCE;
+
+    /* sink pad */
+    ulink.sink.entity = sink->entity->info.id;
+    ulink.sink.index = sink->index;
+    ulink.sink.flags = MEDIA_PAD_FL_SINK;
+
+    if (link)
+        ulink.flags = flags | (link->flags & MEDIA_LNK_FL_IMMUTABLE);
+
+    if (Log::isDumpMediaInfo())
+        dumpLinkDesc(&ulink, 1);
+
+    ret = sc->ioctl(fd, MEDIA_IOC_SETUP_LINK, &ulink);
+    if (ret == -1) {
+        ret = -errno;
+        LOGE( "%s: Unable to setup link (%s)",
+                __func__, strerror(errno));
+        goto done;
+    }
+
+    if (link) {
+        link->flags = ulink.flags;
+        link->twin->flags = ulink.flags;
+    }
+
+    ret = 0;
+
+done:
+    closeDevice(fd);
+    return ret;
+}
+
+int MediaControl::setupLink(uint32_t srcEntity, uint32_t srcPad,
+                            uint32_t sinkEntity, uint32_t sinkPad, bool enable)
+{
+    LOG1("@%s srcEntity %d srcPad %d sinkEntity %d sinkPad %d enable %d",
+            __func__, srcEntity, srcPad, sinkEntity, sinkPad, enable);
+
+    for (auto &entity : mEntities) {
+        for (uint32_t j = 0; j < entity.numLinks; j++) {
+            MediaLink *link = &entity.links[j];
+
+            if ((link->source->entity->info.id == srcEntity)
+                && (link->source->index == srcPad)
+                && (link->sink->entity->info.id == sinkEntity)
+                && (link->sink->index == sinkPad)) {
+
+                if (enable)
+                    link->flags |= MEDIA_LNK_FL_ENABLED;
+                else
+                    link->flags &= ~MEDIA_LNK_FL_ENABLED;
+
+                return setupLink(link->source, link->sink, link->flags);
+            }
+        }
+    }
+
+    return -1;
+}
+
+int MediaControl::openDevice()
+{
+    int fd;
+    LOG1("@%s %s", __func__, mDevName.c_str());
+
+    SysCall *sc = SysCall::getInstance();
+
+    fd = sc->open(mDevName.c_str(), O_RDWR);
+    if (fd < 0) {
+        LOGE("%s: Error open media device %s: %s", __func__,
+             mDevName.c_str(), strerror(errno));
+        return UNKNOWN_ERROR;
+    }
+
+    return fd;
+}
+
+void MediaControl::closeDevice(int fd)
+{
+    LOG1("@%s", __func__);
+
+    if (fd < 0)
+        return ;
+
+    SysCall *sc = SysCall::getInstance();
+
+    if (sc->close(fd) < 0) {
+        LOGE("%s: Error close media device %s: %s", __func__,
+             mDevName.c_str(), strerror(errno));
+    }
+}
+
+void MediaControl::dumpInfo(media_device_info& devInfo)
+{
+    LOGD("Media controller API version %u.%u.%u\n\n",
+         (devInfo.media_version << 16) & 0xff,
+         (devInfo.media_version << 8) & 0xff,
+         (devInfo.media_version << 0) & 0xff);
+
+    LOGD("Media device information\n"
+         "------------------------\n"
+         "driver          %s\n"
+         "model           %s\n"
+         "serial          %s\n"
+         "bus info        %s\n"
+         "hw revision     0x%x\n"
+         "driver version  %u.%u.%u\n\n",
+         devInfo.driver, devInfo.model,
+         devInfo.serial, devInfo.bus_info,
+         devInfo.hw_revision,
+         (devInfo.driver_version << 16) & 0xff,
+         (devInfo.driver_version << 8) & 0xff,
+         (devInfo.driver_version << 0) & 0xff);
+
+    for (uint32_t i = 0; i < sizeof(devInfo.reserved)/sizeof(uint32_t); i++)
+         LOG2("reserved[%u] %d", i, devInfo.reserved[i]);
+}
+
+int MediaControl::enumInfo()
+{
+    int ret;
+    int fd = -1;
+    media_device_info info;
+    LOG1("@%s", __func__);
+
+    SysCall *sc = SysCall::getInstance();
+
+    if (mEntities.size() > 0)
+        return 0;
+
+    fd = openDevice();
+    if (fd < 0) {
+        LOGE("Open device failed.");
+        return fd;
+    }
+
+    ret = sc->ioctl(fd, MEDIA_IOC_DEVICE_INFO, &info);
+    if (ret < 0) {
+        LOGE("%s: Unable to retrieve media device information for device %s (%s)",__func__, mDevName.c_str(), strerror(errno));
+        goto done;
+    }
+
+    if (Log::isDumpMediaInfo())
+        dumpInfo(info);
+
+    ret = enumEntities(fd, info);
+    if (ret < 0) {
+        LOGE("%s: Unable to enumerate entities for device %s", __func__, mDevName.c_str());
+        goto done;
+    }
+
+    LOG2("Found %lu entities", mEntities.size());
+    LOG2("Enumerating pads and links");
+
+    ret = enumLinks(fd);
+    if (ret < 0) {
+        LOGE("%s: Unable to enumerate pads and linksfor device %s", __func__, mDevName.c_str());
+        goto done;
+    }
+
+    ret = 0;
+
+done:
+    closeDevice(fd);
+    return ret;
+}
+
+void MediaControl::dumpEntityDesc(media_entity_desc& desc, media_device_info& devInfo)
+{
+    LOGD("id %d", desc.id);
+    LOGD("name %s", desc.name);
+    LOGD("type 0x%x", desc.type);
+    LOGD("revision %d", desc.revision);
+    LOGD("flags %d", desc.flags);
+    LOGD("group_id %d", desc.group_id);
+    LOGD("pads %d", desc.pads);
+    LOGD("links %u", desc.links);
+
+    for (uint32_t i = 0; i < sizeof(desc.reserved)/sizeof(uint32_t); i++)
+        LOGD("reserved[%u] %d", i, devInfo.reserved[i]);
+}
+
+int MediaControl::enumEntities(int fd, media_device_info& devInfo)
+{
+    MediaEntity entity;
+    uint32_t id;
+    int ret;
+    LOG1("@%s", __func__);
+    SysCall *sc = SysCall::getInstance();
+
+    for (id = 0, ret = 0; ; id = entity.info.id) {
+        memset(&entity, 0, sizeof(MediaEntity));
+        entity.info.id = id | MEDIA_ENT_ID_FLAG_NEXT;
+
+        ret = sc->ioctl(fd, MEDIA_IOC_ENUM_ENTITIES, &entity.info);
+        if (ret < 0) {
+            ret = errno != EINVAL ? -errno : 0;
+            break;
+        }
+
+        if (Log::isDumpMediaInfo())
+            dumpEntityDesc(entity.info, devInfo);
+
+        /* Number of links (for outbound links) plus number of pads (for
+         * inbound links) is a good safe initial estimate of the total
+         * number of links.
+         */
+        entity.maxLinks = entity.info.pads + entity.info.links;
+
+        entity.pads = new MediaPad[entity.info.pads];
+        entity.links = new MediaLink[entity.maxLinks];
+        getDevnameFromSysfs(&entity);
+        mEntities.push_back(entity);
+
+        /* Note: carefully to move the follow setting. It must be behind of
+         * push_back to mEntities:
+         * 1. if entity is not pushed back to mEntities, getEntityById will
+         * return NULL.
+         * 2. we can't set entity.pads[i].entity to &entity direct. Because,
+         * entity is stack variable, its scope is just this function.
+         */
+        for (uint32_t i = 0; i < entity.info.pads; ++i) {
+            entity.pads[i].entity = getEntityById(entity.info.id);
+        }
+    }
+
+    return ret;
+}
+
+int MediaControl::getDevnameFromSysfs(MediaEntity *entity)
+{
+    char sysName[MAX_SYS_NAME] = {'\0'};
+    char target[MAX_TARGET_NAME] = {'\0'};
+    int ret;
+
+    if (!entity) {
+        LOGE("entity is null.");
+        return -EINVAL;
+    }
+
+    ret = snprintf(sysName, MAX_SYS_NAME, "/sys/dev/char/%u:%u",
+                   entity->info.v4l.major, entity->info.v4l.minor);
+    if (ret <= 0) {
+        LOGE("create sysName failed ret %d.", ret);
+        return -EINVAL;
+    }
+
+    ret = readlink(sysName, target, MAX_TARGET_NAME);
+    if (ret <= 0) {
+        LOGE("readlink sysName %s failed ret %d.", sysName, ret);
+        return -EINVAL;
+    }
+
+    char *d = strrchr(target, '/');
+    if (!d) {
+        LOGE("target is invalid %s.", target);
+        return -EINVAL;
+    }
+    d++; /* skip '/' */
+
+    char *t = strstr(d, "dvb");
+    if (t && t == d) {
+        t = strchr(t, '.');
+        if (!t) {
+            LOGE("target is invalid %s.", target);
+            return -EINVAL;
+        }
+        *t = '/';
+        d +=3; /* skip "dvb" */
+        snprintf(entity->devname, sizeof(entity->devname), "/dev/dvb/adapter%s", d);
+    } else {
+        snprintf(entity->devname, sizeof(entity->devname), "/dev/%s", d);
+    }
+
+    return 0;
+}
+
+void MediaControl::dumpPadDesc(media_pad_desc *pads, const int padsCount, const char *name)
+{
+    for (int i = 0; i < padsCount; i++) {
+        LOGD("Dump %s Pad desc %d", name == nullptr? "": name, i);
+        LOGD("entity: %d", pads[i].entity);
+        LOGD("index: %d", pads[i].index);
+        LOGD("flags: %d", pads[i].flags);
+        LOGD("reserved[0]: %d", pads[i].reserved[0]);
+        LOGD("reserved[1]: %d", pads[i].reserved[1]);
+    }
+}
+
+void MediaControl::dumpLinkDesc(media_link_desc *links, const int linksCount)
+{
+    for (int i = 0; i < linksCount; i++) {
+        LOG2("Dump Link desc %d", i);
+        MediaEntity *sourceEntity = getEntityById(links[i].source.entity);
+        MediaEntity *sinkEntity = getEntityById(links[i].sink.entity);
+
+        dumpPadDesc(&links[i].source, 1, sourceEntity->info.name);
+        dumpPadDesc(&links[i].sink, 1, sinkEntity->info.name);
+        LOGD("flags: %d", links[i].flags);
+        LOGD("reserved[0]: %d", links[i].reserved[0]);
+        LOGD("reserved[1]: %d", links[i].reserved[1]);
+    }
+}
+
+int MediaControl::enumLinks(int fd)
+{
+    int ret = 0;
+    LOG1("@%s", __func__);
+
+    SysCall *sc = SysCall::getInstance();
+
+    for (auto &entity : mEntities) {
+        media_links_enum links;
+        uint32_t i;
+
+        links.entity = entity.info.id;
+        links.pads = new media_pad_desc[entity.info.pads];
+        links.links = new media_link_desc[entity.info.links];
+
+        if (sc->ioctl(fd, MEDIA_IOC_ENUM_LINKS, &links) < 0) {
+            ret = -errno;
+            LOG2("%s: Unable to enumerate pads and links (%s).", __func__, strerror(errno));
+            delete [] links.pads;
+            delete [] links.links;
+            return ret;
+        }
+
+        if (Log::isDumpMediaInfo()) {
+            LOG2("entity %d", links.entity);
+            dumpPadDesc(links.pads, entity.info.pads);
+            dumpLinkDesc(links.links, entity.info.links);
+        }
+
+        for (i = 0; i < entity.info.pads; ++i) {
+            entity.pads[i].entity = getEntityById(entity.info.id);
+            entity.pads[i].index = links.pads[i].index;
+            entity.pads[i].flags = links.pads[i].flags;
+        }
+
+        for (i = 0; i < entity.info.links; ++i) {
+            media_link_desc *link = &links.links[i];
+            MediaLink *fwdlink;
+            MediaLink *backlink;
+            MediaEntity *source;
+            MediaEntity *sink;
+
+            source = getEntityById(link->source.entity);
+            sink = getEntityById(link->sink.entity);
+
+            if (source == nullptr || sink == nullptr) {
+                LOG2("WARNING entity %u link %u src %u/%u to %u/%u is invalid!",
+                        entity.info.id, i, link->source.entity,
+                        link->source.index,
+                        link->sink.entity,
+                        link->sink.index);
+                ret = -EINVAL;
+            } else {
+                fwdlink = entityAddLink(source);
+                if (fwdlink) {
+                    fwdlink->source = &source->pads[link->source.index];
+                    fwdlink->sink = &sink->pads[link->sink.index];
+                    fwdlink->flags = link->flags;
+                }
+
+                backlink = entityAddLink(sink);
+                if (backlink) {
+                    backlink->source = &source->pads[link->source.index];
+                    backlink->sink = &sink->pads[link->sink.index];
+                    backlink->flags = link->flags;
+                }
+
+                if (fwdlink)
+                    fwdlink->twin = backlink;
+                if (backlink)
+                    backlink->twin = fwdlink;
+            }
+        }
+
+        delete [] links.pads;
+        delete [] links.links;
+    }
+
+    return ret;
+}
+
+MediaLink *MediaControl::entityAddLink(MediaEntity *entity)
+{
+    if (entity->numLinks >= entity->maxLinks) {
+        uint32_t maxLinks = entity->maxLinks * 2;
+        MediaLink* links = new MediaLink[maxLinks];
+
+        MEMCPY_S(links, sizeof(MediaLink) * maxLinks, entity->links,
+                 sizeof(MediaLink) * entity->maxLinks);
+        delete [] entity->links;
+
+        for (uint32_t i = 0; i < entity->numLinks; ++i) {
+            links[i].twin->twin = &links[i];
+        }
+
+        entity->maxLinks = maxLinks;
+        entity->links = links;
+    }
+
+    return &entity->links[entity->numLinks++];
+}
+
+MediaEntity *MediaControl::getEntityById(uint32_t id)
+{
+    bool next = id & MEDIA_ENT_ID_FLAG_NEXT;
+
+    id &= ~MEDIA_ENT_ID_FLAG_NEXT;
+
+    for (uint32_t i = 0; i < mEntities.size(); i++) {
+        if ((mEntities[i].info.id == id && !next) ||
+                (mEntities[0].info.id > id && next)) {
+            return &mEntities[i];
+        }
+
+    }
+
+    return nullptr;
+}
+
+const char *MediaControl::entitySubtype2String(unsigned type)
+{
+    static const char *nodeTypes[] = {
+        "Unknown",
+        "V4L",
+        "FB",
+        "ALSA",
+        "DVB",
+    };
+    static const char *subdevTypes[] = {
+        "Unknown",
+        "Sensor",
+        "Flash",
+        "Lens",
+    };
+
+    uint32_t subtype = type & MEDIA_ENT_SUBTYPE_MASK;
+
+    switch (type & MEDIA_ENT_TYPE_MASK) {
+    case MEDIA_ENT_T_DEVNODE:
+        if (subtype >= ARRAY_SIZE(nodeTypes))
+            subtype = 0;
+        return nodeTypes[subtype];
+
+    case MEDIA_ENT_T_V4L2_SUBDEV:
+        if (subtype >= ARRAY_SIZE(subdevTypes))
+            subtype = 0;
+        return subdevTypes[subtype];
+    default:
+        return nodeTypes[0];
+    }
+}
+
+const char *MediaControl::padType2String(unsigned flag)
+{
+    static const struct {
+        __u32 flag;
+        const char *name;
+    } flags[] = {
+        { MEDIA_PAD_FL_SINK, "Sink" },
+        { MEDIA_PAD_FL_SOURCE, "Source" },
+    };
+
+    uint32_t i;
+
+    for (i = 0; i < ARRAY_SIZE(flags); i++) {
+        if (flags[i].flag & flag)
+            return flags[i].name;
+    }
+
+    return "Unknown";
+}
+
+int MediaControl::setMediaMcCtl(int cameraId, vector <McCtl> ctls)
+{
+    for (auto &ctl : ctls) {
+        MediaEntity *entity = getEntityById(ctl.entity);
+        V4L2Subdevice* subDev = V4l2DeviceFactory::getSubDev(cameraId, entity->devname);
+        int ret = subDev->SetControl(ctl.ctlCmd, ctl.ctlValue);
+        LOG2("set Ctl %s [%d] cmd %s [0x%08x] value %d", ctl.entityName.c_str(), ctl.entity,
+                ctl.ctlName.c_str(), ctl.ctlCmd, ctl.ctlValue);
+        CheckError(ret != OK, ret, "set Ctl %s [%d] cmd %s [0x%08x] value %d failed.",
+                ctl.entityName.c_str(), ctl.entity, ctl.ctlName.c_str(), ctl.ctlCmd, ctl.ctlValue);
+    }
+    return 0;
+}
+
+int MediaControl::setMediaMcLink(vector <McLink> links)
+{
+    for (auto &link : links) {
+        LOG2("setup Link %s [%d:%d] ==> %s [%dx%d] enable %d.",
+              link.srcEntityName.c_str(), link.srcEntity, link.srcPad, link.sinkEntityName.c_str(),
+              link.sinkEntity, link.sinkPad, link.enable);
+        int ret = setupLink(link.srcEntity, link.srcPad, link.sinkEntity, link.sinkPad, link.enable);
+        if (ret < 0) {
+            LOGE("setup Link %s [%d:%d] ==> %s [%dx%d] enable %d failed.",
+                link.srcEntityName.c_str(), link.srcEntity, link.srcPad, link.sinkEntityName.c_str(),
+                link.sinkEntity, link.sinkPad, link.enable);
+            return ret;
+        }
+    }
+    return 0;
+}
+
+int MediaControl::setFormat(int cameraId, const McFormat *format, int targetWidth, int targetHeight, int field)
+{
+    PERF_CAMERA_ATRACE();
+    int ret;
+    v4l2_mbus_framefmt mbusfmt;
+    MediaEntity *entity = getEntityById(format->entity);
+    if (entity == nullptr) {
+        LOGE("@%s, get entity fail for calling getEntityById", __func__);
+        return BAD_VALUE;
+    }
+
+    MediaPad *pad = &entity->pads[format->pad];
+    V4L2Subdevice* subDev = V4l2DeviceFactory::getSubDev(cameraId, entity->devname);
+    LOG1("@%s, targetWidth:%d, targetHeight:%d", __func__, targetWidth, targetHeight);
+    LOG2("SENSORCTRLINFO: width=%d", targetWidth);
+    LOG2("SENSORCTRLINFO: height=%d", targetHeight);
+    LOG2("SENSORCTRLINFO: code=0x%x", format->pixelCode);
+
+    CLEAR(mbusfmt);
+    if (format->width != 0 && format->height != 0) {
+        mbusfmt.width  = format->width;
+        mbusfmt.height = format->height;
+    } else if (format->type == RESOLUTION_TARGET) {
+        mbusfmt.width  = targetWidth;
+        mbusfmt.height = targetHeight;
+    }
+    mbusfmt.field = field;
+
+    if (format->pixelCode) {
+        mbusfmt.code = format->pixelCode;
+    } else {
+        mbusfmt.code = CameraUtils::getMBusFormat(cameraId, PlatformData::getISysFormat(cameraId));
+    }
+    LOG2("set format %s [%d:%d] [%dx%d] [%dx%d] %s ", format->entityName.c_str(),
+            format->entity, format->pad, mbusfmt.width, mbusfmt.height,
+            targetWidth, targetHeight, CameraUtils::pixelCode2String(mbusfmt.code));
+
+    struct v4l2_subdev_format fmt = {};
+    fmt.pad = format->pad;
+    fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
+    fmt.format = mbusfmt;
+    ret = subDev->SetFormat(fmt);
+    CheckError(ret < 0, BAD_VALUE, "set format %s [%d:%d] [%dx%d] %s failed.",
+            format->entityName.c_str(), format->entity, format->pad, format->width, format->height,
+            CameraUtils::pixelCode2String(format->pixelCode));
+
+    mbusfmt = fmt.format;
+
+    /* If the pad is an output pad, automatically set the same format on
+     * the remote subdev input pads, if any.
+     */
+    if (pad->flags & MEDIA_PAD_FL_SOURCE) {
+        for (unsigned int i = 0; i < pad->entity->numLinks; ++i) {
+            MediaLink *link = &pad->entity->links[i];
+
+            if (!(link->flags & MEDIA_LNK_FL_ENABLED))
+                continue;
+
+            if (link->source == pad && link->sink->entity->info.type == MEDIA_ENT_T_V4L2_SUBDEV) {
+                auto subDev = V4l2DeviceFactory::getSubDev(cameraId, link->sink->entity->devname);
+
+                struct v4l2_subdev_format tmt = {};
+                tmt.format = mbusfmt;
+                tmt.pad = link->sink->index;
+                tmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
+                subDev->SetFormat(tmt);
+            }
+        }
+    }
+
+    return 0;
+}
+
+int MediaControl::setSelection(int cameraId,
+        const McFormat *format, int targetWidth, int targetHeight)
+{
+    PERF_CAMERA_ATRACE();
+    int ret = OK;
+
+    MediaEntity *entity = getEntityById(format->entity);
+    V4L2Subdevice* subDev = V4l2DeviceFactory::getSubDev(cameraId, entity->devname);
+    LOG1("@%s, cameraId:%d, targetWidth:%d, targetHeight:%d", __func__, cameraId, targetWidth, targetHeight);
+
+    if (format->top != -1 && format->left != -1 && format->width != 0 && format->height != 0) {
+        struct v4l2_subdev_selection selection = {};
+        selection.pad = format->pad;
+        selection.which = V4L2_SUBDEV_FORMAT_ACTIVE;
+        selection.target = format->selCmd;
+        selection.flags = 0;
+        selection.r.top = format->top;
+        selection.r.left = format->left;
+        selection.r.width = format->width;
+        selection.r.height = format->height;
+
+        ret = subDev->SetSelection(selection);
+    } else if (format->selCmd == V4L2_SEL_TGT_CROP || format->selCmd == V4L2_SEL_TGT_COMPOSE) {
+        LOG2("@%s, line:%d, targetWidth:%d, targetHeight:%d", __func__, __LINE__, targetWidth, targetHeight);
+
+        struct v4l2_subdev_selection selection = {};
+        selection.pad = format->pad;
+        selection.which = V4L2_SUBDEV_FORMAT_ACTIVE;
+        selection.target = format->selCmd;
+        selection.flags = 0;
+        selection.r.top = 0;
+        selection.r.left = 0;
+        selection.r.width = targetWidth;
+        selection.r.height = targetHeight;
+
+        ret = subDev->SetSelection(selection);
+    } else {
+        ret = BAD_VALUE;
+    }
+
+    CheckError(ret < 0, BAD_VALUE, "set selection %s [%d:%d] selCmd: %d [%d, %d] [%dx%d] failed",
+            format->entityName.c_str(), format->entity, format->pad, format->selCmd,
+            format->top, format->left, format->width, format->height);
+
+    return OK;
+}
+
+int MediaControl::mediaCtlSetup(int cameraId, MediaCtlConf *mc, int width, int height, int field)
+{
+    LOG1("%s, cameraId:%d", __func__, cameraId);
+    /* Setup controls in format Configuration */
+    int ret = setMediaMcCtl(cameraId, mc->ctls);
+    CheckError(ret != OK, ret, "set MediaCtlConf McCtl failed: ret=%d", ret);
+
+    /* Set format & selection in format Configuration */
+    for (auto &fmt : mc->formats) {
+        if (fmt.formatType == FC_FORMAT) {
+            setFormat(cameraId, &fmt, width, height, field);
+        } else if (fmt.formatType == FC_SELECTION) {
+            setSelection(cameraId, &fmt, width, height);
+        }
+    }
+
+    /* Set link in format Configuration */
+    ret = setMediaMcLink(mc->links);
+    CheckError(ret != OK, ret, "set MediaCtlConf McLink failed: ret = %d", ret);
+
+    dumpEntityTopology();
+
+    return OK;
+}
+
+int MediaControl::getVCMI2CAddr(const char* vcmName, string* vcmI2CAddr) {
+    CheckError(!vcmI2CAddr, BAD_VALUE, "vcmI2CAddr is nullptr");
+    CheckError(!vcmName, BAD_VALUE, "vcmName is nullptr");
+
+    for (auto &entity : mEntities) {
+        if (strncmp(entity.info.name, vcmName, strlen(vcmName)) == 0) {
+            *vcmI2CAddr = entity.info.name;
+            LOG2("%s, vcm addr name %s", __func__, entity.info.name);
+            return OK;
+        }
+    }
+
+    return NAME_NOT_FOUND;
+}
+
+void MediaControl::mediaCtlClear(int cameraId, MediaCtlConf *mc)
+{
+    LOG1("%s, cameraId:%d", __func__, cameraId);
+
+}
+
+// This function must be called after enumEntities().
+int MediaControl::getLensName(string *lensName)
+{
+    LOG1("@%s", __func__);
+    CheckError(!lensName, UNKNOWN_ERROR, "lensName is nullptr");
+
+    for (auto &entity : mEntities) {
+        if (entity.info.type == MEDIA_ENT_T_V4L2_SUBDEV_LENS) {
+           *lensName = entity.info.name;
+           return OK;
+        }
+    }
+
+    return UNKNOWN_ERROR;
+}
+
+// This function must be called after enumEntities().
+bool MediaControl::checkAvailableSensor(const std::string &sensorEntityName,
+                                        const std::string &sinkEntityName)
+{
+    LOG1("@%s, sensorEntityName:%s, sinkEntityName:%s", __func__,
+         sensorEntityName.c_str(), sinkEntityName.c_str());
+
+    std::string sensorEntityNameTmp = sensorEntityName;
+    sensorEntityNameTmp.append(" ");
+    size_t nameLen = sensorEntityNameTmp.length();
+    for (auto &entity : mEntities) {
+        int linksCount = entity.info.links;
+        MediaLink *links = entity.links;
+        for (int i = 0; i < linksCount; i++) {
+            if (strcmp(links[i].sink->entity->info.name, sinkEntityName.c_str()) == 0) {
+                char *entityName = entity.info.name;
+                if (strncmp(entityName, sensorEntityNameTmp.c_str(), nameLen) == 0) {
+                    return true;
+                }
+            }
+        }
+    }
+
+    return false;
+}
+
+// This function must be called after enumEntities().
+int MediaControl::getI2CBusAddress(const string &sensorEntityName, const string &sinkEntityName, string *i2cBus)
+{
+    LOG1("@%s, sensorEntityName:%s, sinkEntityName:%s", __func__, sensorEntityName.c_str(), sinkEntityName.c_str());
+    CheckError(!i2cBus, UNKNOWN_ERROR, "i2cBus is nullptr");
+
+    for (auto &entity : mEntities) {
+        int linksCount = entity.info.links;
+        MediaLink *links = entity.links;
+        char *entityName = nullptr;
+        size_t sensorEntityNameLen = sensorEntityName.length();
+        for (int i = 0; i < linksCount; i++) {
+            if (strcmp(links[i].sink->entity->info.name, sinkEntityName.c_str()) == 0) {
+                entityName = entity.info.name;
+                break;
+            }
+        }
+
+        // entityName example: "imx319 10-0010", sensorEntityName example: "imx319"
+        if (entityName && (strlen(entityName) > (sensorEntityNameLen + 1))) {
+            *i2cBus = entityName + sensorEntityNameLen + 1;
+            LOG2("i2cBus is %s", i2cBus->c_str());
+            return OK;
+        }
+    }
+
+    return UNKNOWN_ERROR;
+}
+
+void MediaControl::dumpTopologyDot()
+{
+    printf("digraph board {\n");
+    printf("\trankdir=TB\n");
+
+    for (auto &entity : mEntities) {
+        const media_entity_desc *info = &entity.info;
+        const char *devname = (entity.devname[0] ? entity.devname : nullptr);
+        uint32_t numLinks = entity.numLinks;
+        uint32_t npads;
+        UNUSED(npads);
+
+        switch (info->type & MEDIA_ENT_TYPE_MASK) {
+        case MEDIA_ENT_T_DEVNODE:
+            // Although printf actually can print NULL pointer, but make check
+            // to make KW happy.
+            if (devname)
+                printf("\tn%08x [label=\"%s\\n%s\", shape=box, style=filled, "
+                    "fillcolor=yellow]\n",
+                    info->id, info->name, devname);
+            break;
+
+        case MEDIA_ENT_T_V4L2_SUBDEV:
+            printf("\tn%08x [label=\"{{", info->id);
+
+            for (int i = 0, npads = 0; i < info->pads; ++i) {
+                MediaPad *pad = entity.pads + i;
+
+                if (!(pad->flags & MEDIA_PAD_FL_SINK))
+                    continue;
+
+                printf("%s<port%d> %d", npads ? " | " : "", i, i);
+                npads++;
+            }
+
+            printf("} | %s", info->name);
+            if (devname)
+                printf("\\n%s", devname);
+            printf(" | {");
+
+            for (int i = 0, npads = 0; i < info->pads; ++i) {
+                MediaPad *pad = entity.pads + i;
+
+                if (!(pad->flags & MEDIA_PAD_FL_SOURCE))
+                    continue;
+
+                printf("%s<port%d> %d", npads ? " | " : "", i, i);
+                npads++;
+            }
+
+            printf("}}\", shape=Mrecord, style=filled, fillcolor=green]\n");
+            break;
+
+        default:
+            continue;
+        }
+
+        for (uint32_t i = 0; i < numLinks; i++) {
+             MediaLink *link = entity.links + i;
+             MediaPad *source = link->source;
+             MediaPad *sink = link->sink;
+
+            /*Only print the forward links of the entity*/
+            if (source->entity != &entity)
+                continue;
+
+            printf("\tn%08x", source->entity->info.id);
+            if ((source->entity->info.type & MEDIA_ENT_TYPE_MASK) == MEDIA_ENT_T_V4L2_SUBDEV)
+                printf(":port%u", source->index);
+            printf(" -> ");
+            printf("n%08x", sink->entity->info.id);
+            if ((sink->entity->info.type & MEDIA_ENT_TYPE_MASK) == MEDIA_ENT_T_V4L2_SUBDEV)
+                printf(":port%u", sink->index);
+
+            if (link->flags & MEDIA_LNK_FL_IMMUTABLE)
+                printf(" [style=bold]");
+            else if (!(link->flags & MEDIA_LNK_FL_ENABLED))
+                printf(" [style=dashed]");
+            printf("\n");
+        }
+    }
+
+    printf("}\n");
+}
+
+void MediaControl::dumpTopologyText()
+{
+    static const struct {
+        __u32 flag;
+        const char *name;
+    } link_flags[] = {
+        { MEDIA_LNK_FL_ENABLED, "ENABLED" },
+        { MEDIA_LNK_FL_IMMUTABLE, "IMMUTABLE" },
+        { MEDIA_LNK_FL_DYNAMIC, "DYNAMIC" },
+    };
+
+    printf("Device topology\n");
+
+    for (auto &entity : mEntities) {
+        const media_entity_desc *info = &entity.info;
+        const char *devname = (entity.devname[0] ? entity.devname : nullptr);
+        uint32_t numLinks = entity.numLinks;
+
+        uint32_t padding = printf("- entity %u: ", info->id);
+        printf("%s (%u pad%s, %u link%s)\n", info->name,
+            info->pads, info->pads > 1 ? "s" : "",
+            numLinks, numLinks > 1 ? "s" : "");
+        printf("%*ctype %s subtype %s flags %x\n", padding, ' ',
+            padType2String(info->type),
+            entitySubtype2String(info->type),
+            info->flags);
+        if (devname)
+            printf("%*cdevice node name %s\n", padding, ' ', devname);
+
+        for (int i = 0; i < info->pads; i++) {
+            MediaPad *pad = entity.pads + i;
+
+            printf("\tpad%d: %s\n", i, padType2String(pad->flags));
+
+            /*
+             *if ((info->type & MEDIA_ENT_TYPE_MASK) == MEDIA_ENT_T_V4L2_SUBDEV)
+             *v4l2_subdev_print_format(entity, i, V4L2_SUBDEV_FORMAT_ACTIVE);
+             */
+            for (uint32_t j = 0; j < numLinks; j++) {
+                MediaLink *link = entity.links + j;
+                MediaPad *source = link->source;
+                MediaPad *sink = link->sink;
+                bool first = true;
+
+                if (source->entity == &entity && source->index == j)
+                    printf("\t\t-> \"%s\":%u [", sink->entity->info.name,
+                       sink->index);
+                else if (sink->entity == &entity && sink->index == j)
+                    printf("\t\t<- \"%s\":%u [", source->entity->info.name,
+                       source->index);
+                else
+                    continue;
+
+                for (uint32_t k = 0; k < ARRAY_SIZE(link_flags); k++) {
+                    if (!(link->flags & link_flags[k].flag))
+                        continue;
+                    if (!first)
+                        printf(",");
+                    printf("%s", link_flags[k].name);
+                    first = false;
+                }
+
+                printf("]\n");
+            }
+        }
+        printf("\n");
+    }
+}
+
+void MediaControl::dumpEntityTopology(bool dot)
+{
+    if (Log::isDumpMediaTopo()) {
+        if (dot)
+            dumpTopologyDot();
+        else
+            dumpTopologyText();
+    }
+}
+} // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/v4l2/MediaControl.h b/camera/hal/intel/ipu6/src/v4l2/MediaControl.h
new file mode 100644
index 000000000000..bf2850731f08
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/v4l2/MediaControl.h
@@ -0,0 +1,302 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <vector>
+#include <string>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <linux/v4l2-subdev.h>
+#include <linux/media.h>
+#include <expat.h>
+
+#include <v4l2_device.h>
+
+#include "CameraTypes.h"
+#include "iutils/Thread.h"
+
+#include "NodeInfo.h"
+
+using namespace std;
+namespace icamera {
+
+struct MediaEntity;
+struct MediaPad;
+struct MediaLink;
+
+#define MEDIACTLDEVNAME "/dev/media0"
+
+enum {
+    FC_FORMAT = 0,
+    FC_SELECTION = 1,
+};
+
+enum ResolutionType {
+    RESOLUTION_MAX = 0,
+    RESOLUTION_COMPOSE,
+    RESOLUTION_CROP,
+    RESOLUTION_TARGET,
+
+};
+
+struct McFormat {
+    int entity;
+    int pad;
+    int stream;
+    int formatType;
+    int selCmd;
+    int top;
+    int left;
+    int width;
+    int height;
+    enum ResolutionType type;
+    std::string entityName;
+    unsigned int pixelCode;
+    McFormat() {
+        entity = 0;
+        pad = 0;
+        stream = 0;
+        formatType = 0;
+        selCmd = 0;
+        top = 0;
+        left = 0;
+        width = 0;
+        height = 0;
+        type = RESOLUTION_MAX;
+        pixelCode = 0;}
+};
+
+struct McOutput {
+    Port port;
+    unsigned int v4l2Format;
+    int width;
+    int height;
+    McOutput() { port = INVALID_PORT; v4l2Format = 0; width = 0; height = 0; }
+};
+
+struct McCtl {
+    int entity;
+    int ctlCmd;
+    int ctlValue;
+    std::string ctlName;
+    std::string entityName;
+    McCtl() { entity = 0; ctlCmd = 0; ctlValue= 0; }
+};
+
+struct McLink {
+    int srcEntity;
+    int srcPad;
+    int sinkEntity;
+    int sinkPad;
+    bool enable;
+    std::string srcEntityName;
+    std::string sinkEntityName;
+    McLink() { srcEntity = 0; srcPad = 0; sinkEntity = 0; sinkPad = 0; enable = false; }
+};
+
+struct McRoute {
+    int entity;
+    uint32_t sinkPad;
+    uint32_t sinkStream;
+    uint32_t srcPad;
+    uint32_t srcStream;
+    uint32_t flag;
+    std::string entityName;
+    McRoute() { entity = 0; sinkPad = 0; srcPad = 0; sinkStream = 0; srcStream = 0; flag = 0; entityName.clear(); }
+};
+
+struct McVideoNode {
+    std::string name;
+    VideoNodeType videoNodeType;
+    McVideoNode() { videoNodeType = VIDEO_GENERIC; }
+};
+
+struct MediaCtlConf {
+    std::vector <McCtl> ctls;
+    std::vector <McLink> links;
+    std::vector <McRoute> routes;
+    std::vector <McFormat> formats;
+    std::vector <McOutput> outputs;
+    std::vector <McVideoNode> videoNodes;
+    int mcId;
+    int outputWidth;
+    int outputHeight;
+    std::vector <ConfigMode> configMode;
+    int format;
+    /*
+     * The outputWidth or outputHeight is 0 if there isn't this setting
+     * in MediaCtlConf. It means the isys output size is dynamic, and
+     * we don't use stream size to select MC.
+     */
+    MediaCtlConf() {
+        mcId = -1;
+        outputWidth = 0;
+        outputHeight = 0;
+        format = -1;
+    }
+};
+
+/**
+ * \class MediaController
+ *
+ * This class is used for discovering and configuring the internal topology
+ * of a media device. Devices are modelled as an oriented graph of building
+ * blocks called media entities. The media entities are connected to each other
+ * through pads.
+ *
+ * Each media entity corresponds to a V4L2 subdevice. This class is also used
+ * for configuring the V4L2 subdevices.
+ */
+
+class MediaControl {
+public:
+    /**
+     * \brief Get the singleton instance of MediaControl
+     */
+    static MediaControl* getInstance();
+
+    /**
+     * \brief Release the singleton instance of MediaControl.
+     */
+    static void releaseInstance();
+
+    /**
+     * \brief Enum entities and link, and reset all links
+     *
+     * \return 0 if succeed, other value indicates failed
+     */
+    int initEntities();
+
+    /**
+     * \brief Free all entities and links memory
+     */
+    void clearEntities();
+
+    /**
+     * \brief Get the entity by name
+     *
+     * \return entity id if succeed or -1 if error
+     */
+    int getEntityIdByName(const char *name);
+
+    /**
+     * \brief Get VCM I2C bus address
+     *
+     * \return 0 if succeed, other value indicates failed
+     */
+    int getVCMI2CAddr(const char* vcmName, std::string* vcmI2CAddr);
+
+    /**
+     * \brief Set up media controller pipe
+     *
+     * \param cameraId: the current camera id
+     * \param mc: the MediaCtlConf got from platform data
+     * \param sensorName: the sensor name get from platform data
+     * \param width: The width of the request frame
+     * \param height: The height of the request frame
+     * \param format: The format of the request frame
+     * \param field: The field of the request frame
+     *
+     * \return OK if succeed, other value indicates failed
+     */
+    int mediaCtlSetup(int cameraId, MediaCtlConf *mc, int width, int height, int field);
+
+    /**
+     * \brief Clear media controller pipe
+     *
+     *
+     * \param cameraId: the current camera id
+     * \param mc: the MediaCtlConf got from platform data
+     */
+    void mediaCtlClear(int cameraId, MediaCtlConf *mc);
+
+    int resetAllLinks();
+
+    int getLensName(string *lensName);
+    bool checkAvailableSensor(const std::string &sensorEntityName,
+                              const std::string &sinkEntityName);
+    /**
+     * Getting I2C bus address by the name of sensor entity and the name of sensor's sink entity.
+     *
+     * \sensorEntityName: the name of sensor entity.
+     * \sinkEntityName: the name of sensor's sink entity.
+     * \i2cBus: I2C bus address.
+     * \return OK if succeed, other value indicates failed
+     */
+    int getI2CBusAddress(const std::string &sensorEntityName, const std::string &sinkEntityName,
+                         std::string *i2cBus);
+private:
+    MediaControl& operator=(const MediaControl&);
+    MediaControl(const char *devName);
+    ~MediaControl();
+
+    int openDevice();
+    void closeDevice(int fd);
+
+    //enum MediaControl info.
+    int enumInfo();
+    int enumLinks(int fd);
+    int enumEntities(int fd, media_device_info& devInfo);
+
+    //get entity info.
+    int getDevnameFromSysfs(MediaEntity *entity);
+    MediaEntity *getEntityById(uint32_t id);
+    MediaEntity *getEntityByName(const char *name);
+
+    //set up entity link.
+
+    MediaLink *entityAddLink(MediaEntity *entity);
+    int setupLink(uint32_t srcEntity, uint32_t srcPad, uint32_t sinkEntity, uint32_t sinkPad, bool enable);
+    int setupLink(MediaPad *source, MediaPad *sink, uint32_t flags);
+
+    //set up MediaCtlConf info.
+    int setMediaMcCtl(int cameraId, std::vector <McCtl> ctls);
+    int setMediaMcLink(std::vector <McLink> links);
+    int setFormat(int cameraId, const McFormat *format,
+            int targetWidth, int targetHeight, int field);
+    int setSelection(int cameraId, const McFormat *format,
+            int targetWidth, int targetHeight);
+
+    /* Dump functions */
+    void dumpInfo(media_device_info& devInfo);
+    void dumpEntityDesc(media_entity_desc& desc, media_device_info& devInfo);
+    void dumpPadDesc(media_pad_desc *pads, const int padsCount = 1, const char *name = nullptr);
+    void dumpLinkDesc(media_link_desc *links, const int linksCount = 1);
+    const char *entitySubtype2String(unsigned type);
+    const char *padType2String(unsigned flag);
+    void dumpEntityTopology(bool dot = true);
+    void dumpTopologyDot();
+    void dumpTopologyText();
+
+private:
+    std::string mDevName;
+    std::vector <MediaEntity> mEntities;
+
+private:
+    static MediaControl *sInstance;
+    static Mutex sLock;
+};
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/v4l2/NodeInfo.cpp b/camera/hal/intel/ipu6/src/v4l2/NodeInfo.cpp
new file mode 100644
index 000000000000..2709861a757d
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/v4l2/NodeInfo.cpp
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "src/v4l2/NodeInfo.h"
+
+const VideoNodeInfo gVideoNodeInfos[] = {
+    { VIDEO_GENERIC,             "VIDEO_GENERIC",              "Generic" },
+    { VIDEO_GENERIC_MEDIUM_EXPO, "VIDEO_GENERIC_MEDIUM_EXPO",  "GenericMediumExpo" },
+    { VIDEO_GENERIC_SHORT_EXPO,  "VIDEO_GENERIC_SHORT_EXPO",   "GenericShortExpo" },
+
+    { VIDEO_PIXEL_ARRAY,         "VIDEO_PIXEL_ARRAY",          "PixelArray" },
+    { VIDEO_PIXEL_BINNER,        "VIDEO_PIXEL_BINNER",         "PixelBinner" },
+    { VIDEO_PIXEL_SCALER,        "VIDEO_PIXEL_SCALER",         "PixelScaler" },
+
+    { VIDEO_ISYS_RECEIVER,       "VIDEO_ISYS_RECEIVER",        "ISysReceiver" },
+    { VIDEO_ISYS_RECEIVER_BACKEND,  "VIDEO_ISYS_RECEIVER_BACKEND",  "CsiBE"},
+};
+
+const char* GetNodeName(VideoNodeType nodeType)
+{
+    int size = ARRAY_SIZE(gVideoNodeInfos);
+    for (int i = 0; i < size; i++) {
+        if (gVideoNodeInfos[i].type == nodeType) {
+            return gVideoNodeInfos[i].shortName;
+        }
+    }
+    return "InvalidNode";
+}
+
+VideoNodeType GetNodeType(const char* nodeName)
+{
+    int size = ARRAY_SIZE(gVideoNodeInfos);
+    for (int i = 0; i < size; i++) {
+        if (strcmp(gVideoNodeInfos[i].fullName, nodeName) == 0) {
+            return gVideoNodeInfos[i].type;
+        }
+    }
+
+    return VIDEO_GENERIC;
+}
diff --git a/camera/hal/intel/ipu6/src/v4l2/NodeInfo.h b/camera/hal/intel/ipu6/src/v4l2/NodeInfo.h
new file mode 100644
index 000000000000..c5905603a4c5
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/v4l2/NodeInfo.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "iutils/Utils.h"
+
+enum VideoNodeType {
+    // video node device
+    VIDEO_GENERIC,
+    VIDEO_GENERIC_MEDIUM_EXPO,
+    VIDEO_GENERIC_SHORT_EXPO,
+
+    // sensor subdevice
+    VIDEO_PIXEL_ARRAY,
+    VIDEO_PIXEL_BINNER,
+    VIDEO_PIXEL_SCALER,
+
+    // ISP subdevice
+    VIDEO_ISYS_RECEIVER,
+    VIDEO_ISYS_RECEIVER_BACKEND,
+};
+
+struct VideoNodeInfo {
+    VideoNodeType type;
+    const char* fullName;
+    const char* shortName;
+};
+
+enum EncodeBufferType {
+    ENCODE_ISA_CONFIG  = 0,
+    ENCODE_STATS = 1,
+};
+
+extern const VideoNodeInfo gVideoNodeInfos[];
+extern const char* GetNodeName(VideoNodeType nodeType);
+extern VideoNodeType GetNodeType(const char* nodeName);
diff --git a/camera/hal/intel/ipu6/src/v4l2/SysCall.cpp b/camera/hal/intel/ipu6/src/v4l2/SysCall.cpp
new file mode 100644
index 000000000000..2f82704d143b
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/v4l2/SysCall.cpp
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "SysCall"
+
+#include "iutils/CameraLog.h"
+#include "SysCall.h"
+
+namespace icamera {
+
+static int sCreatedCount = 0;
+bool SysCall::sIsInitialized = false;
+SysCall *SysCall::sInstance = nullptr;
+//Guard for singleton instance creation
+Mutex SysCall::sLock;
+
+/*static*/ SysCall*
+SysCall::getInstance()
+{
+    AutoMutex lock(sLock);
+    if (!sIsInitialized) {
+        //Use real sys call as default
+        sInstance = new SysCall();
+        sIsInitialized = true;
+    }
+    return sInstance;
+}
+
+void SysCall::updateInstance(SysCall* newSysCall)
+{
+    LOG1("%s", __func__);
+    AutoMutex lock(sLock);
+    if (sIsInitialized) {
+        sIsInitialized = false;
+    }
+    sInstance = newSysCall;
+    if (newSysCall != nullptr)
+        sIsInitialized = true;
+}
+
+SysCall::SysCall()
+{
+    sCreatedCount++;
+    LOG1("Syscall was created %d time", sCreatedCount);
+}
+
+SysCall::~SysCall()
+{
+    sCreatedCount--;
+    LOG1("Syscall was destructed %d time", sCreatedCount);
+}
+
+int SysCall::open(const char *pathname, int flags)
+{
+    return ::open(pathname, flags);
+}
+
+int SysCall::close(int fd)
+{
+    return ::close(fd);
+}
+
+void *SysCall::mmap(void *addr, size_t len, int prot, int flag, int filedes, off_t off)
+{
+    return ::mmap(addr, len, prot, flag, filedes, off);
+}
+
+int SysCall::munmap(void *addr, size_t len)
+{
+    return ::munmap(addr, len);
+}
+
+int SysCall::ioctl(int fd, int request, struct media_device_info *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+int SysCall::ioctl(int fd, int request, struct media_link_desc *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+int SysCall::ioctl(int fd, int request, struct media_links_enum *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+int SysCall::ioctl(int fd, int request, struct media_links_desc *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+int SysCall::ioctl(int fd, int request, struct media_entity_desc *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+int SysCall::ioctl(int fd, int request, struct v4l2_capability *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+int SysCall::ioctl(int fd, int request, v4l2_fmtdesc *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+int SysCall::ioctl(int fd, int request, enum v4l2_buf_type *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+int SysCall::ioctl(int fd, int request, struct v4l2_format *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+int SysCall::ioctl(int fd, int request, struct v4l2_requestbuffers *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+int SysCall::ioctl(int fd, int request, struct v4l2_buffers *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+int SysCall::ioctl(int fd, int request, struct v4l2_buffer *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+int SysCall::ioctl(int fd, int request, struct v4l2_subdev_format *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+int SysCall::ioctl(int fd, int request, struct v4l2_subdev_stream *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+int SysCall::ioctl(int fd, int request, struct v4l2_streamon_info *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+
+int SysCall::ioctl(int fd, int request, struct v4l2_ext_controls *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+
+int SysCall::ioctl(int fd, int request, struct v4l2_control *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+
+int SysCall::ioctl(int fd, int request, struct v4l2_queryctrl *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+
+int SysCall::ioctl(int fd, int request, struct v4l2_subdev_selection *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+
+int SysCall::ioctl(int fd, int request, struct v4l2_subdev_routing *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+
+int SysCall::ioctl(int fd, int request, struct v4l2_querymenu *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+
+int SysCall::ioctl(int fd, int request, struct v4l2_event_subscription *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+
+int SysCall::ioctl(int fd, int request, struct v4l2_event *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+
+int SysCall::ioctl(int fd, int request, struct v4l2_exportbuffer *arg)
+{
+    return ioctl(fd, request, (void *)arg);
+}
+
+int SysCall::ioctl(int fd, int request, void *arg)
+{
+    int ret = 0;
+    do {
+        ret = ::ioctl(fd, request, arg);
+    } while (-1 == ret && EINTR == errno);
+
+    return ret;
+}
+
+int SysCall::poll(struct pollfd *pfd, nfds_t nfds, int timeout)
+{
+    int ret = 0;
+    do {
+        ret = ::poll(pfd, nfds, timeout);
+    } while (-1 == ret && EINTR == errno);
+
+    return ret;
+}
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/v4l2/SysCall.h b/camera/hal/intel/ipu6/src/v4l2/SysCall.h
new file mode 100644
index 000000000000..4ef9c058455d
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/v4l2/SysCall.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2015-2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <poll.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <linux/media.h>
+#include <linux/videodev2.h>
+#include <linux/v4l2-subdev.h>
+
+#include "iutils/Thread.h"
+
+namespace icamera {
+
+class SysCall {
+protected:
+    SysCall();
+    virtual ~SysCall();
+
+public:
+    virtual int open(const char *pathname, int flags);
+    virtual int close(int fd);
+    virtual void *mmap(void *addr, size_t len, int prot, int flag, int filedes, off_t off);
+    virtual int munmap(void *addr, size_t len);
+
+    virtual int ioctl(int fd, int request, struct media_device_info *arg);
+    virtual int ioctl(int fd, int request, struct media_link_desc *arg);
+    virtual int ioctl(int fd, int request, struct media_links_enum *arg);
+    virtual int ioctl(int fd, int request, struct media_links_desc *arg);
+    virtual int ioctl(int fd, int request, struct media_entity_desc *arg);
+    virtual int ioctl(int fd, int request, struct v4l2_capability *arg);
+    virtual int ioctl(int fd, int request, v4l2_fmtdesc *arg);
+    virtual int ioctl(int fd, int request, enum v4l2_buf_type *arg);
+    virtual int ioctl(int fd, int request, struct v4l2_format *arg);
+    virtual int ioctl(int fd, int request, struct v4l2_requestbuffers *arg);
+    virtual int ioctl(int fd, int request, struct v4l2_buffers *arg);
+    virtual int ioctl(int fd, int request, struct v4l2_buffer *arg);
+    virtual int ioctl(int fd, int request, struct v4l2_subdev_format *arg);
+    virtual int ioctl(int fd, int request, struct v4l2_subdev_stream *arg);
+    virtual int ioctl(int fd, int request, struct v4l2_streamon_info *arg);
+    virtual int ioctl(int fd, int request, struct v4l2_ext_controls *arg);
+    virtual int ioctl(int fd, int request, struct v4l2_control *arg);
+    virtual int ioctl(int fd, int request, struct v4l2_queryctrl *arg);
+    virtual int ioctl(int fd, int request, struct v4l2_subdev_selection *arg);
+    virtual int ioctl(int fd, int request, struct v4l2_subdev_routing *arg);
+    virtual int ioctl(int fd, int request, struct v4l2_querymenu *arg);
+    virtual int ioctl(int fd, int request, struct v4l2_event_subscription *arg);
+    virtual int ioctl(int fd, int request, struct v4l2_event *arg);
+    virtual int ioctl(int fd, int request, struct v4l2_exportbuffer *arg);
+
+    virtual int poll(struct pollfd *pfd, nfds_t nfds, int timeout);
+
+private:
+        int ioctl(int fd, int request, void *arg);
+
+public:
+    static SysCall* getInstance();
+    static void updateInstance(SysCall* newSysCall);
+private:
+    SysCall&   operator=(const SysCall&);         //Don't call me
+
+    static bool sIsInitialized;
+    static SysCall *sInstance;
+    static Mutex sLock;
+};
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.cpp b/camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.cpp
new file mode 100644
index 000000000000..90950d2d04c8
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.cpp
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2015-2020 Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "V4l2DeviceFactory"
+
+#include <fcntl.h>
+
+#include "iutils/CameraLog.h"
+
+#include "V4l2DeviceFactory.h"
+
+using namespace std;
+
+namespace icamera {
+
+map<int, V4l2DeviceFactory*> V4l2DeviceFactory::sInstances;
+Mutex V4l2DeviceFactory::sLock;
+
+V4l2DeviceFactory::V4l2DeviceFactory(int cameraId) : mCameraId(cameraId)
+{
+    LOG1("V4l2DeviceFactory created for id:%d", mCameraId);
+}
+
+V4l2DeviceFactory::~V4l2DeviceFactory()
+{
+    LOG1("V4l2DeviceFactory released for id:%d", mCameraId);
+}
+
+/**
+ * Create a static instance of V4l2DeviceFactory for cameraId.
+ * It should be called before any device is used.
+ */
+void V4l2DeviceFactory::createDeviceFactory(int cameraId)
+{
+    AutoMutex lock(sLock);
+    getInstance(cameraId);
+}
+
+/**
+ * Release the static instance of V4l2DeviceFactory for cameraId.
+ * All device related to the instance of of V4l2DeviceFactory will be release here as well
+ * After calling this function, all device could not be used anymore.
+ */
+void V4l2DeviceFactory::releaseDeviceFactory(int cameraId)
+{
+    AutoMutex lock(sLock);
+    V4l2DeviceFactory* factory = getInstance(cameraId);
+    sInstances.erase(cameraId);
+    factory->releaseSubDevices(cameraId);
+    delete factory;
+}
+
+/**
+ * Get an opened sub device
+ *
+ * The caller is supposed to get an opened sub device.
+ * If openSubDev failed, it just return non-opened instance,
+ * and using this instance to call its funtion will cause 'device not open' error,
+ *
+ * Return a not nullptr sub device pointer
+ */
+V4L2Subdevice* V4l2DeviceFactory::getSubDev(int cameraId, const string& devName)
+{
+    AutoMutex lock(sLock);
+    V4l2DeviceFactory* factory = getInstance(cameraId);
+    // If an existing sub device found, then just return it.
+
+    if (factory->mDevices.find(devName) != factory->mDevices.end()) {
+        return factory->mDevices[devName];
+    }
+    // Create a new sub device for devName, since it's not created before.
+    V4L2Subdevice* subdev = new V4L2Subdevice(devName);
+
+    // Make sure the caller always got an opened device.
+    subdev->Open(O_RDWR);
+    // Add the new allocated sub device into device map.
+    factory->mDevices[devName] = subdev;
+    return subdev;
+}
+
+/**
+ * Release all sub devices in device map
+ *
+ * It's a private function with no lock in it, must be called with lock protection.
+ *
+ * It MUST be called after all sub devices are not used anymore
+ */
+void V4l2DeviceFactory::releaseSubDevices(int  /*cameraId*/)
+{
+    for (auto it = mDevices.begin(); it != mDevices.end(); it++) {
+        V4L2Subdevice* subdev = it->second;
+        if (subdev) {
+            subdev->Close();
+            delete subdev;
+        }
+    }
+    mDevices.clear();
+}
+
+/**
+ * Private function with no lock in it, must be called with lock protection
+ */
+V4l2DeviceFactory* V4l2DeviceFactory::getInstance(int cameraId)
+{
+    if (sInstances.find(cameraId) != sInstances.end()) {
+        return sInstances[cameraId];
+    }
+
+    sInstances[cameraId] = new V4l2DeviceFactory(cameraId);
+    return sInstances[cameraId];
+}
+
+} //namespace icamera
diff --git a/camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.h b/camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.h
new file mode 100644
index 000000000000..115187d5fa37
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2015-2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <v4l2_device.h>
+
+#include <map>
+#include <string>
+
+#include "iutils/Utils.h"
+#include "iutils/Thread.h"
+
+namespace icamera {
+
+/**
+ * Create all v4l2 devices, and provide users an opened device pointer,
+ * the users should not release any instance got from this factory,
+ * all devices will be released together by releaseDeviceFactory.
+ *
+ * Currently only sub device is supported.
+ *
+ * TODO: Next step, all v4l2 devices should be managed by this class
+ */
+class V4l2DeviceFactory {
+public:
+    static void createDeviceFactory(int cameraId);
+    static void releaseDeviceFactory(int cameraId);
+
+    static V4L2Subdevice* getSubDev(int cameraId, const std::string& devName);
+
+private:
+    V4l2DeviceFactory(int cameraId);
+    ~V4l2DeviceFactory();
+
+    static V4l2DeviceFactory* getInstance(int cameraId);
+    void releaseSubDevices(int cameraId);
+
+private:
+    static std::map<int, V4l2DeviceFactory*> sInstances;
+    //Guard for V4l2DeviceFactory public API access
+    static Mutex sLock;
+
+    int mCameraId;
+    std::map<std::string, V4L2Subdevice*> mDevices;
+};
+
+} //namespace icamera
-- 
2.7.4

